@yoryoboy/bi-mcp 1.5.2 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +87 -87
- package/bin/bi-mcp.js +9 -9
- package/dist/.tsbuildinfo +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp-use.json +2 -2
- package/dist/public/icon.svg +6 -6
- package/dist/scripts/_helpers.js.map +1 -1
- package/dist/scripts/admin-profile-delete.js.map +1 -1
- package/dist/scripts/admin-profile-list.js.map +1 -1
- package/dist/scripts/admin-profile-upsert.js.map +1 -1
- package/dist/scripts/admin-vtex-list.js.map +1 -1
- package/dist/scripts/admin-vtex-upsert.js.map +1 -1
- package/dist/scripts/admin-vtex-validate.js.map +1 -1
- package/dist/scripts/decrypt-secret.js +36 -0
- package/dist/scripts/decrypt-secret.js.map +7 -0
- package/dist/scripts/run-migrations.js.map +1 -1
- package/dist/scripts/test-db-connection.js.map +1 -1
- package/dist/src/analytics/ga4-channel-groups.js.map +1 -1
- package/dist/src/analytics/ga4-report-utils.js.map +1 -1
- package/dist/src/config/benchmarks.js.map +1 -1
- package/dist/src/config/google-store.js.map +1 -1
- package/dist/src/config/google.js.map +1 -1
- package/dist/src/config/mercadolibre-profile-store.js.map +1 -1
- package/dist/src/config/mercadolibre.js.map +1 -1
- package/dist/src/config/meta.js.map +1 -1
- package/dist/src/config/profile-store.js.map +1 -1
- package/dist/src/config/vtex-crypto.js.map +1 -1
- package/dist/src/config/vtex-profile-store.js.map +1 -1
- package/dist/src/config/vtex.js.map +1 -1
- package/dist/src/db/client.js.map +1 -1
- package/dist/src/meta/meta-utils.js.map +1 -1
- package/dist/src/prompts/reporte-ventas.js.map +1 -1
- package/dist/src/services/analytics/ga4-client.js.map +1 -1
- package/dist/src/services/analytics/oauth.js.map +1 -1
- package/dist/src/services/google-ads/google-ads-client.js.map +1 -1
- package/dist/src/services/mercadolibre/mercadolibre-api.js.map +1 -1
- package/dist/src/services/mercadolibre/mercadolibre-items.js.map +1 -1
- package/dist/src/services/mercadolibre/mercadolibre-orders.js +19 -5
- package/dist/src/services/mercadolibre/mercadolibre-orders.js.map +2 -2
- package/dist/src/services/mercadolibre/mercadolibre-questions.js.map +1 -1
- package/dist/src/services/meta/meta-ads.js.map +1 -1
- package/dist/src/services/meta/meta-api.js.map +1 -1
- package/dist/src/services/search-console/search-console-client.js.map +1 -1
- package/dist/src/services/search-console/search-console-utils.js.map +1 -1
- package/dist/src/services/vtex/vtex-api.js.map +1 -1
- package/dist/src/services/vtex/vtex-catalog-write.js.map +1 -1
- package/dist/src/services/vtex/vtex-catalog.js.map +1 -1
- package/dist/src/services/vtex/vtex-logistics.js.map +1 -1
- package/dist/src/services/vtex/vtex-orders-write.js.map +1 -1
- package/dist/src/services/vtex/vtex-orders.js.map +1 -1
- package/dist/src/services/vtex/vtex-pricing-write.js.map +1 -1
- package/dist/src/services/vtex/vtex-pricing.js.map +1 -1
- package/dist/src/services/vtex/vtex-write.js.map +1 -1
- package/dist/src/tools/analytics/attribution-gaps.js.map +1 -1
- package/dist/src/tools/analytics/channel-mix.js.map +1 -1
- package/dist/src/tools/analytics/ecommerce-tracking-health.js.map +1 -1
- package/dist/src/tools/analytics/engagement-overview.js.map +1 -1
- package/dist/src/tools/analytics/index.js.map +1 -1
- package/dist/src/tools/analytics/list-accessible-properties.js.map +1 -1
- package/dist/src/tools/analytics/property-info.js.map +1 -1
- package/dist/src/tools/analytics/revenue-by-channel.js.map +1 -1
- package/dist/src/tools/analytics/revenue-overview.js.map +1 -1
- package/dist/src/tools/analytics/revenue-trend.js.map +1 -1
- package/dist/src/tools/analytics/source-medium-breakdown.js.map +1 -1
- package/dist/src/tools/analytics/top-landing-pages.js.map +1 -1
- package/dist/src/tools/config/check-database-connection.js.map +1 -1
- package/dist/src/tools/config/index.js.map +1 -1
- package/dist/src/tools/config/list-profiles.js.map +1 -1
- package/dist/src/tools/google-ads/account-overview.js.map +1 -1
- package/dist/src/tools/google-ads/account-risks.js.map +1 -1
- package/dist/src/tools/google-ads/break-even-analysis.js.map +1 -1
- package/dist/src/tools/google-ads/campaign-performance.js.map +1 -1
- package/dist/src/tools/google-ads/channel-mix.js.map +1 -1
- package/dist/src/tools/google-ads/compare-accounts.js.map +1 -1
- package/dist/src/tools/google-ads/customer-clients.js.map +1 -1
- package/dist/src/tools/google-ads/customer-info.js.map +1 -1
- package/dist/src/tools/google-ads/index.js.map +1 -1
- package/dist/src/tools/google-ads/scaling-health.js.map +1 -1
- package/dist/src/tools/google-ads/search-terms-summary.js.map +1 -1
- package/dist/src/tools/google-ads/time-series.js.map +1 -1
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/mercadolibre/answer-question.js.map +1 -1
- package/dist/src/tools/mercadolibre/create-item.js.map +1 -1
- package/dist/src/tools/mercadolibre/estimate-listing-fee.js.map +1 -1
- package/dist/src/tools/mercadolibre/get-account-context.js.map +1 -1
- package/dist/src/tools/mercadolibre/get-category-requirements.js.map +1 -1
- package/dist/src/tools/mercadolibre/get-item-details.js.map +1 -1
- package/dist/src/tools/mercadolibre/get-item-visits.js.map +1 -1
- package/dist/src/tools/mercadolibre/get-listing-quality.js.map +1 -1
- package/dist/src/tools/mercadolibre/get-order-details.js.map +1 -1
- package/dist/src/tools/mercadolibre/get-orders-summary.js +670 -38
- package/dist/src/tools/mercadolibre/get-orders-summary.js.map +2 -2
- package/dist/src/tools/mercadolibre/get-sales-by-item.js.map +1 -1
- package/dist/src/tools/mercadolibre/get-sales-trend.js.map +1 -1
- package/dist/src/tools/mercadolibre/get-shipping-summary.js.map +1 -1
- package/dist/src/tools/mercadolibre/get-store-performance.js.map +1 -1
- package/dist/src/tools/mercadolibre/helpers.js +13 -0
- package/dist/src/tools/mercadolibre/helpers.js.map +2 -2
- package/dist/src/tools/mercadolibre/index.js.map +1 -1
- package/dist/src/tools/mercadolibre/pause-or-reactivate-item.js.map +1 -1
- package/dist/src/tools/mercadolibre/predict-category.js.map +1 -1
- package/dist/src/tools/mercadolibre/profile-resolution.js.map +1 -1
- package/dist/src/tools/mercadolibre/search-items.js.map +1 -1
- package/dist/src/tools/mercadolibre/search-questions.js.map +1 -1
- package/dist/src/tools/mercadolibre/update-item-basic-fields.js.map +1 -1
- package/dist/src/tools/mercadolibre/update-item-description.js.map +1 -1
- package/dist/src/tools/mercadolibre/update-item-pictures.js.map +1 -1
- package/dist/src/tools/mercadolibre/validate-connection.js.map +1 -1
- package/dist/src/tools/mercadolibre/write-helpers.js.map +1 -1
- package/dist/src/tools/meta/account-overview.js.map +1 -1
- package/dist/src/tools/meta/ad-account-info.js.map +1 -1
- package/dist/src/tools/meta/ads-performance.js.map +1 -1
- package/dist/src/tools/meta/campaign-performance.js.map +1 -1
- package/dist/src/tools/meta/index.js.map +1 -1
- package/dist/src/tools/meta/list-accessible-ad-accounts.js.map +1 -1
- package/dist/src/tools/meta/list-accessible-businesses.js.map +1 -1
- package/dist/src/tools/meta/placement-mix.js.map +1 -1
- package/dist/src/tools/meta/time-series.js.map +1 -1
- package/dist/src/tools/search-console/country-breakdown.js.map +1 -1
- package/dist/src/tools/search-console/device-breakdown.js.map +1 -1
- package/dist/src/tools/search-console/high-impression-low-click-queries.js.map +1 -1
- package/dist/src/tools/search-console/index.js.map +1 -1
- package/dist/src/tools/search-console/list-accessible-sites.js.map +1 -1
- package/dist/src/tools/search-console/low-ctr-opportunities.js.map +1 -1
- package/dist/src/tools/search-console/page-performance.js.map +1 -1
- package/dist/src/tools/search-console/product-demand-low-capture-queries.js.map +1 -1
- package/dist/src/tools/search-console/query-page-matrix.js.map +1 -1
- package/dist/src/tools/search-console/query-performance.js.map +1 -1
- package/dist/src/tools/search-console/quick-win-opportunities.js.map +1 -1
- package/dist/src/tools/search-console/rising-non-brand-queries.js.map +1 -1
- package/dist/src/tools/search-console/search-performance.js.map +1 -1
- package/dist/src/tools/search-console/site-context.js.map +1 -1
- package/dist/src/tools/search-console/visibility-declines.js.map +1 -1
- package/dist/src/tools/vtex/activate-sku.js.map +1 -1
- package/dist/src/tools/vtex/add-order-tracking.js.map +1 -1
- package/dist/src/tools/vtex/associate-specification.js.map +1 -1
- package/dist/src/tools/vtex/attach-catalog-image.js.map +1 -1
- package/dist/src/tools/vtex/cancel-order.js.map +1 -1
- package/dist/src/tools/vtex/computed-price.js.map +1 -1
- package/dist/src/tools/vtex/create-brand.js.map +1 -1
- package/dist/src/tools/vtex/create-category.js.map +1 -1
- package/dist/src/tools/vtex/create-product-with-sku.js.map +1 -1
- package/dist/src/tools/vtex/create-product.js.map +1 -1
- package/dist/src/tools/vtex/create-sku.js.map +1 -1
- package/dist/src/tools/vtex/create-specification-value.js.map +1 -1
- package/dist/src/tools/vtex/create-specification.js.map +1 -1
- package/dist/src/tools/vtex/deactivate-sku.js.map +1 -1
- package/dist/src/tools/vtex/delete-fixed-price.js.map +1 -1
- package/dist/src/tools/vtex/index.js.map +1 -1
- package/dist/src/tools/vtex/inventory-check.js.map +1 -1
- package/dist/src/tools/vtex/invoice-order.js.map +1 -1
- package/dist/src/tools/vtex/order-details.js.map +1 -1
- package/dist/src/tools/vtex/orders-summary.js.map +1 -1
- package/dist/src/tools/vtex/product-offers.js.map +1 -1
- package/dist/src/tools/vtex/profile-resolution.js.map +1 -1
- package/dist/src/tools/vtex/sku-offers.js.map +1 -1
- package/dist/src/tools/vtex/sku-price.js.map +1 -1
- package/dist/src/tools/vtex/toggle-unlimited-quantity.js.map +1 -1
- package/dist/src/tools/vtex/update-inventory.js.map +1 -1
- package/dist/src/tools/vtex/update-lead-time.js.map +1 -1
- package/dist/src/tools/vtex/update-product-basic-fields.js.map +1 -1
- package/dist/src/tools/vtex/update-sku-basic-fields.js.map +1 -1
- package/dist/src/tools/vtex/update-sku-price.js.map +1 -1
- package/dist/src/tools/vtex/upsert-fixed-price.js.map +1 -1
- package/dist/src/tools/vtex/warehouse-inventory.js.map +1 -1
- package/dist/src/tools/vtex/write-helpers.js.map +1 -1
- package/dist/src/utils/case-conversion.js.map +1 -1
- package/dist/src/utils/currency.js.map +1 -1
- package/dist/src/utils/format-order-details.js.map +1 -1
- package/dist/src/utils/google-ads.js.map +1 -1
- package/dist/src/utils/money.js.map +1 -1
- package/dist/src/utils/order-status.js.map +1 -1
- package/dist/src/utils/pagination.js.map +1 -1
- package/dist/src/utils/strip-payload.js.map +1 -1
- package/dist/src/utils/type-guards.js.map +1 -1
- package/package.json +4 -3
- package/public/icon.svg +6 -6
- package/dist/src/google-ads/report-utils.js +0 -78
- package/dist/src/google-ads/report-utils.js.map +0 -7
- package/dist/src/search-console/search-console-utils.js +0 -275
- package/dist/src/search-console/search-console-utils.js.map +0 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/services/google-ads/google-ads-client.ts"],
|
|
4
|
-
"sourcesContent": ["import { refreshGoogleAccessToken } from \"../analytics/oauth.js\";\n\nexport interface GoogleAdsCustomer {\n id?: string;\n descriptiveName?: string;\n currencyCode?: string;\n timeZone?: string;\n manager?: boolean;\n testAccount?: boolean;\n}\n\nexport interface GoogleAdsCustomerClient {\n clientCustomer?: string;\n descriptiveName?: string;\n currencyCode?: string;\n timeZone?: string;\n manager?: boolean;\n testAccount?: boolean;\n status?: string;\n}\n\nexport interface GoogleAdsCampaign {\n id?: string;\n name?: string;\n status?: string;\n advertisingChannelType?: string;\n}\n\nexport interface GoogleAdsAdGroup {\n id?: string;\n name?: string;\n}\n\nexport interface GoogleAdsSearchTermView {\n searchTerm?: string;\n}\n\nexport interface GoogleAdsSegments {\n date?: string;\n week?: string;\n}\n\nexport interface GoogleAdsMetrics {\n impressions?: string;\n clicks?: string;\n costMicros?: string;\n conversions?: string;\n conversionsValue?: string;\n ctr?: number | string;\n averageCpc?: string;\n}\n\nexport interface GoogleAdsSearchRow {\n customer?: GoogleAdsCustomer;\n customerClient?: GoogleAdsCustomerClient;\n campaign?: GoogleAdsCampaign;\n adGroup?: GoogleAdsAdGroup;\n searchTermView?: GoogleAdsSearchTermView;\n segments?: GoogleAdsSegments;\n metrics?: GoogleAdsMetrics;\n}\n\nexport type GoogleAdsMetricValue = string | number | undefined;\n\ninterface GoogleAdsListAccessibleCustomersResponse {\n resourceNames?: string[];\n}\n\ninterface GoogleAdsSearchStreamBatch {\n results?: GoogleAdsSearchRow[];\n summaryRow?: GoogleAdsSearchRow;\n fieldMask?: string;\n requestId?: string;\n}\n\ninterface GoogleAdsErrorPayload {\n error?: {\n code?: number;\n message?: string;\n status?: string;\n details?: Array<{\n errors?: Array<{\n errorCode?: Record<string, string>;\n message?: string;\n }>;\n }>;\n };\n}\n\nexport interface GoogleAdsSearchResult {\n rows: GoogleAdsSearchRow[];\n summaryRow?: GoogleAdsSearchRow;\n requestId?: string;\n fieldMask?: string;\n}\n\ninterface GoogleAdsRequestOptions {\n customerId?: string;\n loginCustomerId?: string;\n body?: Record<string, unknown>;\n method?: \"GET\" | \"POST\";\n}\n\nconst GOOGLE_ADS_BASE_URL = \"https://googleads.googleapis.com/v22\";\n\nasync function googleAdsFetch<T>(\n path: string,\n developerToken: string,\n options: GoogleAdsRequestOptions = {}\n): Promise<T> {\n const accessToken = await refreshGoogleAccessToken();\n const response = await fetch(`${GOOGLE_ADS_BASE_URL}${path}`, {\n method: options.method ?? \"POST\",\n headers: {\n Authorization: `Bearer ${accessToken.accessToken}`,\n \"Content-Type\": \"application/json\",\n \"developer-token\": developerToken,\n ...(options.loginCustomerId\n ? { \"login-customer-id\": options.loginCustomerId }\n : {}),\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n if (!response.ok) {\n const payload = (await response.json().catch(() => ({}))) as GoogleAdsErrorPayload;\n const detailedMessage = payload.error?.details\n ?.flatMap((detail) => detail.errors ?? [])\n .map((error) => error.message)\n .filter(Boolean)\n .join(\"; \");\n const message =\n detailedMessage ||\n payload.error?.message ||\n payload.error?.status ||\n `Google Ads API request failed with status ${response.status}`;\n\n throw new Error(message);\n }\n\n return (await response.json()) as T;\n}\n\nexport async function listAccessibleCustomers(\n developerToken: string\n): Promise<string[]> {\n const payload = await googleAdsFetch<GoogleAdsListAccessibleCustomersResponse>(\n \"/customers:listAccessibleCustomers\",\n developerToken,\n { method: \"GET\" }\n );\n\n return payload.resourceNames?.map((value) => value.replace(\"customers/\", \"\")) ?? [];\n}\n\nexport async function searchGoogleAds(\n customerId: string,\n query: string,\n developerToken: string,\n loginCustomerId?: string\n): Promise<GoogleAdsSearchResult> {\n const batches = await googleAdsFetch<GoogleAdsSearchStreamBatch[]>(\n `/customers/${customerId}/googleAds:searchStream`,\n developerToken,\n {\n customerId,\n loginCustomerId,\n body: { query },\n }\n );\n\n const rows = batches.flatMap((batch) => batch.results ?? []);\n const lastBatch = batches.at(-1);\n\n return {\n rows,\n summaryRow: lastBatch?.summaryRow,\n requestId: lastBatch?.requestId,\n fieldMask: lastBatch?.fieldMask,\n };\n}\n"],
|
|
4
|
+
"sourcesContent": ["import { refreshGoogleAccessToken } from \"../analytics/oauth.js\";\r\n\r\nexport interface GoogleAdsCustomer {\r\n id?: string;\r\n descriptiveName?: string;\r\n currencyCode?: string;\r\n timeZone?: string;\r\n manager?: boolean;\r\n testAccount?: boolean;\r\n}\r\n\r\nexport interface GoogleAdsCustomerClient {\r\n clientCustomer?: string;\r\n descriptiveName?: string;\r\n currencyCode?: string;\r\n timeZone?: string;\r\n manager?: boolean;\r\n testAccount?: boolean;\r\n status?: string;\r\n}\r\n\r\nexport interface GoogleAdsCampaign {\r\n id?: string;\r\n name?: string;\r\n status?: string;\r\n advertisingChannelType?: string;\r\n}\r\n\r\nexport interface GoogleAdsAdGroup {\r\n id?: string;\r\n name?: string;\r\n}\r\n\r\nexport interface GoogleAdsSearchTermView {\r\n searchTerm?: string;\r\n}\r\n\r\nexport interface GoogleAdsSegments {\r\n date?: string;\r\n week?: string;\r\n}\r\n\r\nexport interface GoogleAdsMetrics {\r\n impressions?: string;\r\n clicks?: string;\r\n costMicros?: string;\r\n conversions?: string;\r\n conversionsValue?: string;\r\n ctr?: number | string;\r\n averageCpc?: string;\r\n}\r\n\r\nexport interface GoogleAdsSearchRow {\r\n customer?: GoogleAdsCustomer;\r\n customerClient?: GoogleAdsCustomerClient;\r\n campaign?: GoogleAdsCampaign;\r\n adGroup?: GoogleAdsAdGroup;\r\n searchTermView?: GoogleAdsSearchTermView;\r\n segments?: GoogleAdsSegments;\r\n metrics?: GoogleAdsMetrics;\r\n}\r\n\r\nexport type GoogleAdsMetricValue = string | number | undefined;\r\n\r\ninterface GoogleAdsListAccessibleCustomersResponse {\r\n resourceNames?: string[];\r\n}\r\n\r\ninterface GoogleAdsSearchStreamBatch {\r\n results?: GoogleAdsSearchRow[];\r\n summaryRow?: GoogleAdsSearchRow;\r\n fieldMask?: string;\r\n requestId?: string;\r\n}\r\n\r\ninterface GoogleAdsErrorPayload {\r\n error?: {\r\n code?: number;\r\n message?: string;\r\n status?: string;\r\n details?: Array<{\r\n errors?: Array<{\r\n errorCode?: Record<string, string>;\r\n message?: string;\r\n }>;\r\n }>;\r\n };\r\n}\r\n\r\nexport interface GoogleAdsSearchResult {\r\n rows: GoogleAdsSearchRow[];\r\n summaryRow?: GoogleAdsSearchRow;\r\n requestId?: string;\r\n fieldMask?: string;\r\n}\r\n\r\ninterface GoogleAdsRequestOptions {\r\n customerId?: string;\r\n loginCustomerId?: string;\r\n body?: Record<string, unknown>;\r\n method?: \"GET\" | \"POST\";\r\n}\r\n\r\nconst GOOGLE_ADS_BASE_URL = \"https://googleads.googleapis.com/v22\";\r\n\r\nasync function googleAdsFetch<T>(\r\n path: string,\r\n developerToken: string,\r\n options: GoogleAdsRequestOptions = {}\r\n): Promise<T> {\r\n const accessToken = await refreshGoogleAccessToken();\r\n const response = await fetch(`${GOOGLE_ADS_BASE_URL}${path}`, {\r\n method: options.method ?? \"POST\",\r\n headers: {\r\n Authorization: `Bearer ${accessToken.accessToken}`,\r\n \"Content-Type\": \"application/json\",\r\n \"developer-token\": developerToken,\r\n ...(options.loginCustomerId\r\n ? { \"login-customer-id\": options.loginCustomerId }\r\n : {}),\r\n },\r\n body: options.body ? JSON.stringify(options.body) : undefined,\r\n });\r\n\r\n if (!response.ok) {\r\n const payload = (await response.json().catch(() => ({}))) as GoogleAdsErrorPayload;\r\n const detailedMessage = payload.error?.details\r\n ?.flatMap((detail) => detail.errors ?? [])\r\n .map((error) => error.message)\r\n .filter(Boolean)\r\n .join(\"; \");\r\n const message =\r\n detailedMessage ||\r\n payload.error?.message ||\r\n payload.error?.status ||\r\n `Google Ads API request failed with status ${response.status}`;\r\n\r\n throw new Error(message);\r\n }\r\n\r\n return (await response.json()) as T;\r\n}\r\n\r\nexport async function listAccessibleCustomers(\r\n developerToken: string\r\n): Promise<string[]> {\r\n const payload = await googleAdsFetch<GoogleAdsListAccessibleCustomersResponse>(\r\n \"/customers:listAccessibleCustomers\",\r\n developerToken,\r\n { method: \"GET\" }\r\n );\r\n\r\n return payload.resourceNames?.map((value) => value.replace(\"customers/\", \"\")) ?? [];\r\n}\r\n\r\nexport async function searchGoogleAds(\r\n customerId: string,\r\n query: string,\r\n developerToken: string,\r\n loginCustomerId?: string\r\n): Promise<GoogleAdsSearchResult> {\r\n const batches = await googleAdsFetch<GoogleAdsSearchStreamBatch[]>(\r\n `/customers/${customerId}/googleAds:searchStream`,\r\n developerToken,\r\n {\r\n customerId,\r\n loginCustomerId,\r\n body: { query },\r\n }\r\n );\r\n\r\n const rows = batches.flatMap((batch) => batch.results ?? []);\r\n const lastBatch = batches.at(-1);\r\n\r\n return {\r\n rows,\r\n summaryRow: lastBatch?.summaryRow,\r\n requestId: lastBatch?.requestId,\r\n fieldMask: lastBatch?.fieldMask,\r\n };\r\n}\r\n"],
|
|
5
5
|
"mappings": "AAAA,SAAS,gCAAgC;AAuGzC,MAAM,sBAAsB;AAE5B,eAAe,eACb,MACA,gBACA,UAAmC,CAAC,GACxB;AACZ,QAAM,cAAc,MAAM,yBAAyB;AACnD,QAAM,WAAW,MAAM,MAAM,GAAG,mBAAmB,GAAG,IAAI,IAAI;AAAA,IAC5D,QAAQ,QAAQ,UAAU;AAAA,IAC1B,SAAS;AAAA,MACP,eAAe,UAAU,YAAY,WAAW;AAAA,MAChD,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,GAAI,QAAQ,kBACR,EAAE,qBAAqB,QAAQ,gBAAgB,IAC/C,CAAC;AAAA,IACP;AAAA,IACA,MAAM,QAAQ,OAAO,KAAK,UAAU,QAAQ,IAAI,IAAI;AAAA,EACtD,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,UAAW,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACvD,UAAM,kBAAkB,QAAQ,OAAO,SACnC,QAAQ,CAAC,WAAW,OAAO,UAAU,CAAC,CAAC,EACxC,IAAI,CAAC,UAAU,MAAM,OAAO,EAC5B,OAAO,OAAO,EACd,KAAK,IAAI;AACZ,UAAM,UACJ,mBACA,QAAQ,OAAO,WACf,QAAQ,OAAO,UACf,6CAA6C,SAAS,MAAM;AAE9D,UAAM,IAAI,MAAM,OAAO;AAAA,EACzB;AAEA,SAAQ,MAAM,SAAS,KAAK;AAC9B;AAEA,eAAsB,wBACpB,gBACmB;AACnB,QAAM,UAAU,MAAM;AAAA,IACpB;AAAA,IACA;AAAA,IACA,EAAE,QAAQ,MAAM;AAAA,EAClB;AAEA,SAAO,QAAQ,eAAe,IAAI,CAAC,UAAU,MAAM,QAAQ,cAAc,EAAE,CAAC,KAAK,CAAC;AACpF;AAEA,eAAsB,gBACpB,YACA,OACA,gBACA,iBACgC;AAChC,QAAM,UAAU,MAAM;AAAA,IACpB,cAAc,UAAU;AAAA,IACxB;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA,MAAM,EAAE,MAAM;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,OAAO,QAAQ,QAAQ,CAAC,UAAU,MAAM,WAAW,CAAC,CAAC;AAC3D,QAAM,YAAY,QAAQ,GAAG,EAAE;AAE/B,SAAO;AAAA,IACL;AAAA,IACA,YAAY,WAAW;AAAA,IACvB,WAAW,WAAW;AAAA,IACtB,WAAW,WAAW;AAAA,EACxB;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/services/mercadolibre/mercadolibre-api.ts"],
|
|
4
|
-
"sourcesContent": ["import axios from \"axios\";\nimport type { AxiosError, AxiosInstance, AxiosResponse } from \"axios\";\n\nimport { getMercadoLibreAccessForProfile } from \"../../config/mercadolibre.js\";\n\nconst BASE_URL = \"https://api.mercadolibre.com\";\nconst RETRYABLE_STATUS_CODES = new Set([408, 429, 500, 502, 503, 504]);\n\nexport class MercadoLibreApiError extends Error {\n constructor(\n message: string,\n public readonly status?: number,\n public readonly code?: string,\n public readonly retryAfterMs?: number\n ) {\n super(message);\n this.name = \"MercadoLibreApiError\";\n }\n}\n\nexport interface MercadoLibreBatchFetchOptions {\n maxConcurrency?: number;\n maxRetries?: number;\n baseRetryDelayMs?: number;\n}\n\nexport interface MercadoLibreDocumentSuccess<T> {\n id: string;\n document: T;\n}\n\nexport interface MercadoLibreDocumentFailure {\n id: string;\n message: string;\n statusCode?: number;\n attempts: number;\n retryable: boolean;\n}\n\nexport interface MercadoLibreDocumentsBatchResult<T> {\n successful: Array<MercadoLibreDocumentSuccess<T>>;\n failed: MercadoLibreDocumentFailure[];\n}\n\nexport function sanitizeMercadoLibreText(value: unknown): string {\n const raw = typeof value === \"string\" ? value : String(value ?? \"MercadoLibre request failed\");\n return raw\n .replace(/access_token[=:][^\\s&]+/gi, \"access_token=[redacted]\")\n .replace(/refresh_token[=:][^\\s&]+/gi, \"refresh_token=[redacted]\")\n .replace(/client_secret[=:][^\\s&]+/gi, \"client_secret=[redacted]\")\n .replace(/code[=:][^\\s&]+/gi, \"code=[redacted]\")\n .replace(/Bearer\\s+[A-Za-z0-9._-]+/gi, \"Bearer [redacted]\")\n .slice(0, 220);\n}\n\nfunction extractRetryAfterMs(error: AxiosError): number | undefined {\n const rawHeader = error.response?.headers?.[\"retry-after\"];\n const candidate = Array.isArray(rawHeader) ? rawHeader[0] : rawHeader;\n if (!candidate) {\n return undefined;\n }\n\n const seconds = Number(candidate);\n if (Number.isFinite(seconds) && seconds > 0) {\n return seconds * 1000;\n }\n\n const dateMs = new Date(candidate).getTime();\n if (Number.isFinite(dateMs)) {\n return Math.max(0, dateMs - Date.now());\n }\n\n return undefined;\n}\n\nfunction buildApiError(error: AxiosError): MercadoLibreApiError {\n const status = error.response?.status;\n const responseData = error.response?.data;\n let code: string | undefined;\n let message: string | undefined;\n\n if (responseData && typeof responseData === \"object\") {\n const candidate = responseData as {\n error?: unknown;\n message?: unknown;\n error_description?: unknown;\n cause?: Array<{ code?: unknown; message?: unknown }>;\n };\n code = typeof candidate.error === \"string\" ? candidate.error : undefined;\n message =\n (typeof candidate.message === \"string\" ? candidate.message : undefined) ??\n (typeof candidate.error_description === \"string\" ? candidate.error_description : undefined) ??\n (Array.isArray(candidate.cause)\n ? candidate.cause\n .map((entry) => (typeof entry.message === \"string\" ? entry.message : null))\n .filter(Boolean)\n .join(\"; \")\n : undefined);\n } else if (typeof responseData === \"string\") {\n message = responseData;\n }\n\n const safeMessage = sanitizeMercadoLibreText(message ?? error.message ?? \"MercadoLibre request failed\");\n return new MercadoLibreApiError(\n `MercadoLibre API request failed${status ? ` (${status})` : \"\"}: ${safeMessage}`,\n status,\n code,\n extractRetryAfterMs(error)\n );\n}\n\nexport function formatMercadoLibreError(\n error: unknown,\n fallback = \"Unexpected MercadoLibre API error\"\n): string {\n if (error instanceof MercadoLibreApiError) {\n return error.message;\n }\n\n if (axios.isAxiosError(error)) {\n return buildApiError(error).message;\n }\n\n if (error instanceof Error) {\n return sanitizeMercadoLibreText(error.message);\n }\n\n return sanitizeMercadoLibreText(fallback);\n}\n\nexport function createMercadoLibreClient(accessToken: string): AxiosInstance {\n const client = axios.create({\n baseURL: BASE_URL,\n timeout: 30000,\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n client.interceptors.response.use(\n (response) => response,\n (error: AxiosError) => {\n const method = error.config?.method?.toUpperCase() ?? \"UNKNOWN\";\n const url = error.config?.url ?? \"UNKNOWN_URL\";\n const status = error.response?.status ?? \"NO_STATUS\";\n console.error(`[MERCADOLIBRE API ERROR] ${method} ${url} -> ${status}`);\n return Promise.reject(buildApiError(error));\n }\n );\n\n return client;\n}\n\nexport async function getMercadoLibreApiContext(profileId: string) {\n const access = await getMercadoLibreAccessForProfile(profileId);\n\n return {\n ...access,\n api: createMercadoLibreClient(access.accessToken),\n };\n}\n\nexport async function getMercadoLibreUsersMe(profileId: string): Promise<Record<string, unknown>> {\n const { api } = await getMercadoLibreApiContext(profileId);\n const response = await api.get<Record<string, unknown>>(\"/users/me\");\n return response.data;\n}\n\nexport function isRetryableMercadoLibreError(error: unknown): boolean {\n if (error instanceof MercadoLibreApiError) {\n return error.status ? RETRYABLE_STATUS_CODES.has(error.status) : true;\n }\n\n return false;\n}\n\nfunction classifyMercadoLibreBatchFailure(\n id: string,\n error: unknown,\n attempts: number\n): MercadoLibreDocumentFailure {\n const statusCode = error instanceof MercadoLibreApiError ? error.status : undefined;\n return {\n id,\n message: formatMercadoLibreError(error, `Failed to fetch MercadoLibre resource ${id}`),\n statusCode,\n attempts,\n retryable: isRetryableMercadoLibreError(error),\n };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function withMercadoLibreRetry<T>(\n id: string,\n fetcher: (id: string) => Promise<T>,\n options: MercadoLibreBatchFetchOptions = {}\n): Promise<MercadoLibreDocumentSuccess<T>> {\n const maxRetries = Math.max(0, Math.floor(options.maxRetries ?? 2));\n const baseRetryDelayMs = Math.max(50, Math.floor(options.baseRetryDelayMs ?? 250));\n let attempts = 0;\n\n while (true) {\n attempts += 1;\n\n try {\n const document = await fetcher(id);\n return { id, document };\n } catch (error) {\n const retryable = isRetryableMercadoLibreError(error);\n if (!retryable || attempts > maxRetries + 1) {\n throw classifyMercadoLibreBatchFailure(id, error, attempts);\n }\n\n const retryAfterMs = error instanceof MercadoLibreApiError ? error.retryAfterMs : undefined;\n const jitterMs = Math.floor(Math.random() * 100);\n const delayMs = retryAfterMs ?? baseRetryDelayMs * 2 ** (attempts - 1) + jitterMs;\n await sleep(delayMs);\n }\n }\n}\n\nexport async function runMercadoLibreBatch<T>(\n ids: string[],\n fetcher: (id: string) => Promise<T>,\n options: MercadoLibreBatchFetchOptions = {}\n): Promise<MercadoLibreDocumentsBatchResult<T>> {\n const maxConcurrency = Math.max(1, Math.floor(options.maxConcurrency ?? 10));\n const successful: Array<MercadoLibreDocumentSuccess<T>> = [];\n const failed: MercadoLibreDocumentFailure[] = [];\n\n for (let start = 0; start < ids.length; start += maxConcurrency) {\n const chunk = ids.slice(start, start + maxConcurrency);\n const settled = await Promise.allSettled(\n chunk.map((id) => withMercadoLibreRetry(id, fetcher, options))\n );\n\n settled.forEach((result, index) => {\n const id = chunk[index];\n if (result.status === \"fulfilled\") {\n successful.push(result.value);\n return;\n }\n\n const reason = result.reason;\n if (\n reason &&\n typeof reason === \"object\" &&\n \"id\" in reason &&\n \"attempts\" in reason &&\n \"message\" in reason\n ) {\n failed.push(reason as MercadoLibreDocumentFailure);\n return;\n }\n\n failed.push(classifyMercadoLibreBatchFailure(id, reason, 1));\n });\n }\n\n return { successful, failed };\n}\n\nexport function normalizeMercadoLibrePaging(input: Record<string, unknown> | null | undefined) {\n const paging = input ?? {};\n const total = Number((paging.total as number | undefined) ?? 0);\n const limit = Number((paging.limit as number | undefined) ?? 0);\n const offset = Number((paging.offset as number | undefined) ?? 0);\n\n return {\n total: Number.isFinite(total) ? Math.max(0, total) : 0,\n limit: Number.isFinite(limit) ? Math.max(0, limit) : 0,\n offset: Number.isFinite(offset) ? Math.max(0, offset) : 0,\n };\n}\n\nexport function buildMercadoLibrePaginationMetadata(params: {\n total: number;\n limit: number;\n offset: number;\n returned: number;\n nextField: string;\n}) {\n const effectiveLimit = params.limit > 0 ? params.limit : params.returned;\n const hasMore = params.offset + params.returned < params.total;\n\n return {\n total: params.total,\n limit: effectiveLimit,\n offset: params.offset,\n returned: params.returned,\n has_more: hasMore,\n continuation:\n hasMore && effectiveLimit > 0\n ? `Reenviar la misma tool con ${params.nextField}=${params.offset + effectiveLimit} para continuar.`\n : \"No more pages for this query.\",\n };\n}\n\nexport async function parseMercadoLibreMultiget<T>(\n response: AxiosResponse<Array<{ code?: number; body?: T }>>\n): Promise<T[]> {\n return response.data\n .filter((entry) => Number(entry.code ?? 0) >= 200 && Number(entry.code ?? 0) < 300 && entry.body)\n .map((entry) => entry.body as T);\n}\n"],
|
|
4
|
+
"sourcesContent": ["import axios from \"axios\";\r\nimport type { AxiosError, AxiosInstance, AxiosResponse } from \"axios\";\r\n\r\nimport { getMercadoLibreAccessForProfile } from \"../../config/mercadolibre.js\";\r\n\r\nconst BASE_URL = \"https://api.mercadolibre.com\";\r\nconst RETRYABLE_STATUS_CODES = new Set([408, 429, 500, 502, 503, 504]);\r\n\r\nexport class MercadoLibreApiError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly status?: number,\r\n public readonly code?: string,\r\n public readonly retryAfterMs?: number\r\n ) {\r\n super(message);\r\n this.name = \"MercadoLibreApiError\";\r\n }\r\n}\r\n\r\nexport interface MercadoLibreBatchFetchOptions {\r\n maxConcurrency?: number;\r\n maxRetries?: number;\r\n baseRetryDelayMs?: number;\r\n}\r\n\r\nexport interface MercadoLibreDocumentSuccess<T> {\r\n id: string;\r\n document: T;\r\n}\r\n\r\nexport interface MercadoLibreDocumentFailure {\r\n id: string;\r\n message: string;\r\n statusCode?: number;\r\n attempts: number;\r\n retryable: boolean;\r\n}\r\n\r\nexport interface MercadoLibreDocumentsBatchResult<T> {\r\n successful: Array<MercadoLibreDocumentSuccess<T>>;\r\n failed: MercadoLibreDocumentFailure[];\r\n}\r\n\r\nexport function sanitizeMercadoLibreText(value: unknown): string {\r\n const raw = typeof value === \"string\" ? value : String(value ?? \"MercadoLibre request failed\");\r\n return raw\r\n .replace(/access_token[=:][^\\s&]+/gi, \"access_token=[redacted]\")\r\n .replace(/refresh_token[=:][^\\s&]+/gi, \"refresh_token=[redacted]\")\r\n .replace(/client_secret[=:][^\\s&]+/gi, \"client_secret=[redacted]\")\r\n .replace(/code[=:][^\\s&]+/gi, \"code=[redacted]\")\r\n .replace(/Bearer\\s+[A-Za-z0-9._-]+/gi, \"Bearer [redacted]\")\r\n .slice(0, 220);\r\n}\r\n\r\nfunction extractRetryAfterMs(error: AxiosError): number | undefined {\r\n const rawHeader = error.response?.headers?.[\"retry-after\"];\r\n const candidate = Array.isArray(rawHeader) ? rawHeader[0] : rawHeader;\r\n if (!candidate) {\r\n return undefined;\r\n }\r\n\r\n const seconds = Number(candidate);\r\n if (Number.isFinite(seconds) && seconds > 0) {\r\n return seconds * 1000;\r\n }\r\n\r\n const dateMs = new Date(candidate).getTime();\r\n if (Number.isFinite(dateMs)) {\r\n return Math.max(0, dateMs - Date.now());\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction buildApiError(error: AxiosError): MercadoLibreApiError {\r\n const status = error.response?.status;\r\n const responseData = error.response?.data;\r\n let code: string | undefined;\r\n let message: string | undefined;\r\n\r\n if (responseData && typeof responseData === \"object\") {\r\n const candidate = responseData as {\r\n error?: unknown;\r\n message?: unknown;\r\n error_description?: unknown;\r\n cause?: Array<{ code?: unknown; message?: unknown }>;\r\n };\r\n code = typeof candidate.error === \"string\" ? candidate.error : undefined;\r\n message =\r\n (typeof candidate.message === \"string\" ? candidate.message : undefined) ??\r\n (typeof candidate.error_description === \"string\" ? candidate.error_description : undefined) ??\r\n (Array.isArray(candidate.cause)\r\n ? candidate.cause\r\n .map((entry) => (typeof entry.message === \"string\" ? entry.message : null))\r\n .filter(Boolean)\r\n .join(\"; \")\r\n : undefined);\r\n } else if (typeof responseData === \"string\") {\r\n message = responseData;\r\n }\r\n\r\n const safeMessage = sanitizeMercadoLibreText(message ?? error.message ?? \"MercadoLibre request failed\");\r\n return new MercadoLibreApiError(\r\n `MercadoLibre API request failed${status ? ` (${status})` : \"\"}: ${safeMessage}`,\r\n status,\r\n code,\r\n extractRetryAfterMs(error)\r\n );\r\n}\r\n\r\nexport function formatMercadoLibreError(\r\n error: unknown,\r\n fallback = \"Unexpected MercadoLibre API error\"\r\n): string {\r\n if (error instanceof MercadoLibreApiError) {\r\n return error.message;\r\n }\r\n\r\n if (axios.isAxiosError(error)) {\r\n return buildApiError(error).message;\r\n }\r\n\r\n if (error instanceof Error) {\r\n return sanitizeMercadoLibreText(error.message);\r\n }\r\n\r\n return sanitizeMercadoLibreText(fallback);\r\n}\r\n\r\nexport function createMercadoLibreClient(accessToken: string): AxiosInstance {\r\n const client = axios.create({\r\n baseURL: BASE_URL,\r\n timeout: 30000,\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${accessToken}`,\r\n },\r\n });\r\n\r\n client.interceptors.response.use(\r\n (response) => response,\r\n (error: AxiosError) => {\r\n const method = error.config?.method?.toUpperCase() ?? \"UNKNOWN\";\r\n const url = error.config?.url ?? \"UNKNOWN_URL\";\r\n const status = error.response?.status ?? \"NO_STATUS\";\r\n console.error(`[MERCADOLIBRE API ERROR] ${method} ${url} -> ${status}`);\r\n return Promise.reject(buildApiError(error));\r\n }\r\n );\r\n\r\n return client;\r\n}\r\n\r\nexport async function getMercadoLibreApiContext(profileId: string) {\r\n const access = await getMercadoLibreAccessForProfile(profileId);\r\n\r\n return {\r\n ...access,\r\n api: createMercadoLibreClient(access.accessToken),\r\n };\r\n}\r\n\r\nexport async function getMercadoLibreUsersMe(profileId: string): Promise<Record<string, unknown>> {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n const response = await api.get<Record<string, unknown>>(\"/users/me\");\r\n return response.data;\r\n}\r\n\r\nexport function isRetryableMercadoLibreError(error: unknown): boolean {\r\n if (error instanceof MercadoLibreApiError) {\r\n return error.status ? RETRYABLE_STATUS_CODES.has(error.status) : true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction classifyMercadoLibreBatchFailure(\r\n id: string,\r\n error: unknown,\r\n attempts: number\r\n): MercadoLibreDocumentFailure {\r\n const statusCode = error instanceof MercadoLibreApiError ? error.status : undefined;\r\n return {\r\n id,\r\n message: formatMercadoLibreError(error, `Failed to fetch MercadoLibre resource ${id}`),\r\n statusCode,\r\n attempts,\r\n retryable: isRetryableMercadoLibreError(error),\r\n };\r\n}\r\n\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\nasync function withMercadoLibreRetry<T>(\r\n id: string,\r\n fetcher: (id: string) => Promise<T>,\r\n options: MercadoLibreBatchFetchOptions = {}\r\n): Promise<MercadoLibreDocumentSuccess<T>> {\r\n const maxRetries = Math.max(0, Math.floor(options.maxRetries ?? 2));\r\n const baseRetryDelayMs = Math.max(50, Math.floor(options.baseRetryDelayMs ?? 250));\r\n let attempts = 0;\r\n\r\n while (true) {\r\n attempts += 1;\r\n\r\n try {\r\n const document = await fetcher(id);\r\n return { id, document };\r\n } catch (error) {\r\n const retryable = isRetryableMercadoLibreError(error);\r\n if (!retryable || attempts > maxRetries + 1) {\r\n throw classifyMercadoLibreBatchFailure(id, error, attempts);\r\n }\r\n\r\n const retryAfterMs = error instanceof MercadoLibreApiError ? error.retryAfterMs : undefined;\r\n const jitterMs = Math.floor(Math.random() * 100);\r\n const delayMs = retryAfterMs ?? baseRetryDelayMs * 2 ** (attempts - 1) + jitterMs;\r\n await sleep(delayMs);\r\n }\r\n }\r\n}\r\n\r\nexport async function runMercadoLibreBatch<T>(\r\n ids: string[],\r\n fetcher: (id: string) => Promise<T>,\r\n options: MercadoLibreBatchFetchOptions = {}\r\n): Promise<MercadoLibreDocumentsBatchResult<T>> {\r\n const maxConcurrency = Math.max(1, Math.floor(options.maxConcurrency ?? 10));\r\n const successful: Array<MercadoLibreDocumentSuccess<T>> = [];\r\n const failed: MercadoLibreDocumentFailure[] = [];\r\n\r\n for (let start = 0; start < ids.length; start += maxConcurrency) {\r\n const chunk = ids.slice(start, start + maxConcurrency);\r\n const settled = await Promise.allSettled(\r\n chunk.map((id) => withMercadoLibreRetry(id, fetcher, options))\r\n );\r\n\r\n settled.forEach((result, index) => {\r\n const id = chunk[index];\r\n if (result.status === \"fulfilled\") {\r\n successful.push(result.value);\r\n return;\r\n }\r\n\r\n const reason = result.reason;\r\n if (\r\n reason &&\r\n typeof reason === \"object\" &&\r\n \"id\" in reason &&\r\n \"attempts\" in reason &&\r\n \"message\" in reason\r\n ) {\r\n failed.push(reason as MercadoLibreDocumentFailure);\r\n return;\r\n }\r\n\r\n failed.push(classifyMercadoLibreBatchFailure(id, reason, 1));\r\n });\r\n }\r\n\r\n return { successful, failed };\r\n}\r\n\r\nexport function normalizeMercadoLibrePaging(input: Record<string, unknown> | null | undefined) {\r\n const paging = input ?? {};\r\n const total = Number((paging.total as number | undefined) ?? 0);\r\n const limit = Number((paging.limit as number | undefined) ?? 0);\r\n const offset = Number((paging.offset as number | undefined) ?? 0);\r\n\r\n return {\r\n total: Number.isFinite(total) ? Math.max(0, total) : 0,\r\n limit: Number.isFinite(limit) ? Math.max(0, limit) : 0,\r\n offset: Number.isFinite(offset) ? Math.max(0, offset) : 0,\r\n };\r\n}\r\n\r\nexport function buildMercadoLibrePaginationMetadata(params: {\r\n total: number;\r\n limit: number;\r\n offset: number;\r\n returned: number;\r\n nextField: string;\r\n}) {\r\n const effectiveLimit = params.limit > 0 ? params.limit : params.returned;\r\n const hasMore = params.offset + params.returned < params.total;\r\n\r\n return {\r\n total: params.total,\r\n limit: effectiveLimit,\r\n offset: params.offset,\r\n returned: params.returned,\r\n has_more: hasMore,\r\n continuation:\r\n hasMore && effectiveLimit > 0\r\n ? `Reenviar la misma tool con ${params.nextField}=${params.offset + effectiveLimit} para continuar.`\r\n : \"No more pages for this query.\",\r\n };\r\n}\r\n\r\nexport async function parseMercadoLibreMultiget<T>(\r\n response: AxiosResponse<Array<{ code?: number; body?: T }>>\r\n): Promise<T[]> {\r\n return response.data\r\n .filter((entry) => Number(entry.code ?? 0) >= 200 && Number(entry.code ?? 0) < 300 && entry.body)\r\n .map((entry) => entry.body as T);\r\n}\r\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/services/mercadolibre/mercadolibre-items.ts"],
|
|
4
|
-
"sourcesContent": ["import type { AxiosInstance } from \"axios\";\n\nimport {\n getMercadoLibreApiContext,\n parseMercadoLibreMultiget,\n runMercadoLibreBatch,\n type MercadoLibreBatchFetchOptions,\n} from \"./mercadolibre-api.js\";\n\nexport async function searchMercadoLibreItems(\n profileId: string,\n params: {\n sellerId: string;\n status?: string;\n category?: string;\n listingTypeId?: string;\n orders?: string;\n limit?: number;\n offset?: number;\n }\n) {\n const { api } = await getMercadoLibreApiContext(profileId);\n const response = await api.get<Record<string, unknown>>(\n `/users/${params.sellerId}/items/search`,\n {\n params: {\n status: params.status,\n category: params.category,\n listing_type_id: params.listingTypeId,\n orders: params.orders,\n limit: params.limit ?? 20,\n offset: params.offset ?? 0,\n },\n }\n );\n return response.data;\n}\n\nexport async function getMercadoLibreItem(profileId: string, itemId: string) {\n const { api } = await getMercadoLibreApiContext(profileId);\n const response = await api.get<Record<string, unknown>>(`/items/${itemId}`);\n return response.data;\n}\n\nexport async function getMercadoLibreItemDetailsBatch(\n profileId: string,\n itemIds: string[],\n attributes?: string[]\n) {\n const { api } = await getMercadoLibreApiContext(profileId);\n const response = await api.get<Array<{ code?: number; body?: Record<string, unknown> }>>(\"/items\", {\n params: {\n ids: itemIds.join(\",\"),\n attributes: attributes?.join(\",\"),\n },\n });\n return parseMercadoLibreMultiget(response);\n}\n\nexport async function getMercadoLibreItemDetailsWithFallbackBatch(\n profileId: string,\n itemIds: string[],\n options: MercadoLibreBatchFetchOptions = {}\n) {\n const { api } = await getMercadoLibreApiContext(profileId);\n return runMercadoLibreBatch(itemIds, (itemId) => getItem(api, itemId), options);\n}\n\nasync function getItem(api: AxiosInstance, itemId: string): Promise<Record<string, unknown>> {\n const response = await api.get<Record<string, unknown>>(`/items/${itemId}`);\n return response.data;\n}\n\nexport async function createMercadoLibreItem(profileId: string, payload: Record<string, unknown>) {\n const { api } = await getMercadoLibreApiContext(profileId);\n const response = await api.post<Record<string, unknown>>(\"/items\", payload);\n return response.data;\n}\n\nexport async function updateMercadoLibreItem(\n profileId: string,\n itemId: string,\n payload: Record<string, unknown>\n) {\n const { api } = await getMercadoLibreApiContext(profileId);\n const response = await api.put<Record<string, unknown>>(`/items/${itemId}`, payload);\n return response.data;\n}\n\nexport async function getMercadoLibreItemDescription(profileId: string, itemId: string) {\n const { api } = await getMercadoLibreApiContext(profileId);\n const response = await api.get<Record<string, unknown>>(`/items/${itemId}/description`);\n return response.data;\n}\n\nexport async function createMercadoLibreItemDescription(\n profileId: string,\n itemId: string,\n plainText: string\n) {\n const { api } = await getMercadoLibreApiContext(profileId);\n const response = await api.post<Record<string, unknown>>(`/items/${itemId}/description`, {\n plain_text: plainText,\n });\n return response.data;\n}\n\nexport async function replaceMercadoLibreItemDescription(\n profileId: string,\n itemId: string,\n plainText: string\n) {\n const { api } = await getMercadoLibreApiContext(profileId);\n const response = await api.put<Record<string, unknown>>(\n `/items/${itemId}/description?api_version=2`,\n {\n plain_text: plainText,\n }\n );\n return response.data;\n}\n\nexport async function addMercadoLibreItemPicture(\n profileId: string,\n itemId: string,\n source: string\n) {\n const { api } = await getMercadoLibreApiContext(profileId);\n const response = await api.post<Record<string, unknown>>(`/items/${itemId}/pictures`, {\n source,\n });\n return response.data;\n}\n\nexport async function searchMercadoLibreDomainDiscovery(\n profileId: string,\n query: string,\n limit: number,\n siteId = \"MLA\"\n) {\n const { api } = await getMercadoLibreApiContext(profileId);\n const response = await api.get<Array<Record<string, unknown>>>(`/sites/${siteId}/domain_discovery/search`, {\n params: { q: query, limit },\n });\n return response.data;\n}\n\nexport async function getMercadoLibreCategoryAttributes(profileId: string, categoryId: string) {\n const { api } = await getMercadoLibreApiContext(profileId);\n const response = await api.get<Array<Record<string, unknown>>>(`/categories/${categoryId}/attributes`);\n return response.data;\n}\n\nexport async function getMercadoLibreCategoryShippingPreferences(\n profileId: string,\n categoryId: string\n) {\n const { api } = await getMercadoLibreApiContext(profileId);\n const response = await api.get<Record<string, unknown>>(\n `/categories/${categoryId}/shipping_preferences`\n );\n return response.data;\n}\n\nexport async function estimateMercadoLibreListingPrice(\n profileId: string,\n params: Record<string, string | number | boolean | undefined>\n) {\n const { api } = await getMercadoLibreApiContext(profileId);\n const response = await api.get<Array<Record<string, unknown>>>(\"/sites/MLA/listing_prices\", {\n params,\n });\n return response.data;\n}\n\nexport async function getMercadoLibreUserItemsVisits(\n profileId: string,\n sellerId: string,\n dateFrom: string,\n dateTo: string\n) {\n const { api } = await getMercadoLibreApiContext(profileId);\n const response = await api.get<Record<string, unknown>>(`/users/${sellerId}/items_visits`, {\n params: {\n date_from: dateFrom,\n date_to: dateTo,\n },\n });\n return response.data;\n}\n\nexport async function getMercadoLibreItemVisitsWindow(\n profileId: string,\n itemId: string,\n last: number,\n unit = \"day\",\n ending?: string\n) {\n const { api } = await getMercadoLibreApiContext(profileId);\n const response = await api.get<Record<string, unknown>>(`/items/${itemId}/visits/time_window`, {\n params: {\n last,\n unit,\n ending,\n },\n });\n return response.data;\n}\n\nexport async function getMercadoLibreItemPerformance(profileId: string, itemId: string) {\n const { api } = await getMercadoLibreApiContext(profileId);\n const response = await api.get<Record<string, unknown>>(`/item/${itemId}/performance`);\n return response.data;\n}\n"],
|
|
4
|
+
"sourcesContent": ["import type { AxiosInstance } from \"axios\";\r\n\r\nimport {\r\n getMercadoLibreApiContext,\r\n parseMercadoLibreMultiget,\r\n runMercadoLibreBatch,\r\n type MercadoLibreBatchFetchOptions,\r\n} from \"./mercadolibre-api.js\";\r\n\r\nexport async function searchMercadoLibreItems(\r\n profileId: string,\r\n params: {\r\n sellerId: string;\r\n status?: string;\r\n category?: string;\r\n listingTypeId?: string;\r\n orders?: string;\r\n limit?: number;\r\n offset?: number;\r\n }\r\n) {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n const response = await api.get<Record<string, unknown>>(\r\n `/users/${params.sellerId}/items/search`,\r\n {\r\n params: {\r\n status: params.status,\r\n category: params.category,\r\n listing_type_id: params.listingTypeId,\r\n orders: params.orders,\r\n limit: params.limit ?? 20,\r\n offset: params.offset ?? 0,\r\n },\r\n }\r\n );\r\n return response.data;\r\n}\r\n\r\nexport async function getMercadoLibreItem(profileId: string, itemId: string) {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n const response = await api.get<Record<string, unknown>>(`/items/${itemId}`);\r\n return response.data;\r\n}\r\n\r\nexport async function getMercadoLibreItemDetailsBatch(\r\n profileId: string,\r\n itemIds: string[],\r\n attributes?: string[]\r\n) {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n const response = await api.get<Array<{ code?: number; body?: Record<string, unknown> }>>(\"/items\", {\r\n params: {\r\n ids: itemIds.join(\",\"),\r\n attributes: attributes?.join(\",\"),\r\n },\r\n });\r\n return parseMercadoLibreMultiget(response);\r\n}\r\n\r\nexport async function getMercadoLibreItemDetailsWithFallbackBatch(\r\n profileId: string,\r\n itemIds: string[],\r\n options: MercadoLibreBatchFetchOptions = {}\r\n) {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n return runMercadoLibreBatch(itemIds, (itemId) => getItem(api, itemId), options);\r\n}\r\n\r\nasync function getItem(api: AxiosInstance, itemId: string): Promise<Record<string, unknown>> {\r\n const response = await api.get<Record<string, unknown>>(`/items/${itemId}`);\r\n return response.data;\r\n}\r\n\r\nexport async function createMercadoLibreItem(profileId: string, payload: Record<string, unknown>) {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n const response = await api.post<Record<string, unknown>>(\"/items\", payload);\r\n return response.data;\r\n}\r\n\r\nexport async function updateMercadoLibreItem(\r\n profileId: string,\r\n itemId: string,\r\n payload: Record<string, unknown>\r\n) {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n const response = await api.put<Record<string, unknown>>(`/items/${itemId}`, payload);\r\n return response.data;\r\n}\r\n\r\nexport async function getMercadoLibreItemDescription(profileId: string, itemId: string) {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n const response = await api.get<Record<string, unknown>>(`/items/${itemId}/description`);\r\n return response.data;\r\n}\r\n\r\nexport async function createMercadoLibreItemDescription(\r\n profileId: string,\r\n itemId: string,\r\n plainText: string\r\n) {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n const response = await api.post<Record<string, unknown>>(`/items/${itemId}/description`, {\r\n plain_text: plainText,\r\n });\r\n return response.data;\r\n}\r\n\r\nexport async function replaceMercadoLibreItemDescription(\r\n profileId: string,\r\n itemId: string,\r\n plainText: string\r\n) {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n const response = await api.put<Record<string, unknown>>(\r\n `/items/${itemId}/description?api_version=2`,\r\n {\r\n plain_text: plainText,\r\n }\r\n );\r\n return response.data;\r\n}\r\n\r\nexport async function addMercadoLibreItemPicture(\r\n profileId: string,\r\n itemId: string,\r\n source: string\r\n) {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n const response = await api.post<Record<string, unknown>>(`/items/${itemId}/pictures`, {\r\n source,\r\n });\r\n return response.data;\r\n}\r\n\r\nexport async function searchMercadoLibreDomainDiscovery(\r\n profileId: string,\r\n query: string,\r\n limit: number,\r\n siteId = \"MLA\"\r\n) {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n const response = await api.get<Array<Record<string, unknown>>>(`/sites/${siteId}/domain_discovery/search`, {\r\n params: { q: query, limit },\r\n });\r\n return response.data;\r\n}\r\n\r\nexport async function getMercadoLibreCategoryAttributes(profileId: string, categoryId: string) {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n const response = await api.get<Array<Record<string, unknown>>>(`/categories/${categoryId}/attributes`);\r\n return response.data;\r\n}\r\n\r\nexport async function getMercadoLibreCategoryShippingPreferences(\r\n profileId: string,\r\n categoryId: string\r\n) {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n const response = await api.get<Record<string, unknown>>(\r\n `/categories/${categoryId}/shipping_preferences`\r\n );\r\n return response.data;\r\n}\r\n\r\nexport async function estimateMercadoLibreListingPrice(\r\n profileId: string,\r\n params: Record<string, string | number | boolean | undefined>\r\n) {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n const response = await api.get<Array<Record<string, unknown>>>(\"/sites/MLA/listing_prices\", {\r\n params,\r\n });\r\n return response.data;\r\n}\r\n\r\nexport async function getMercadoLibreUserItemsVisits(\r\n profileId: string,\r\n sellerId: string,\r\n dateFrom: string,\r\n dateTo: string\r\n) {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n const response = await api.get<Record<string, unknown>>(`/users/${sellerId}/items_visits`, {\r\n params: {\r\n date_from: dateFrom,\r\n date_to: dateTo,\r\n },\r\n });\r\n return response.data;\r\n}\r\n\r\nexport async function getMercadoLibreItemVisitsWindow(\r\n profileId: string,\r\n itemId: string,\r\n last: number,\r\n unit = \"day\",\r\n ending?: string\r\n) {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n const response = await api.get<Record<string, unknown>>(`/items/${itemId}/visits/time_window`, {\r\n params: {\r\n last,\r\n unit,\r\n ending,\r\n },\r\n });\r\n return response.data;\r\n}\r\n\r\nexport async function getMercadoLibreItemPerformance(profileId: string, itemId: string) {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n const response = await api.get<Record<string, unknown>>(`/item/${itemId}/performance`);\r\n return response.data;\r\n}\r\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -7,7 +7,7 @@ function orderSearchParams(params) {
|
|
|
7
7
|
seller: params.seller,
|
|
8
8
|
"order.date_created.from": `${params.from}T00:00:00.000-00:00`,
|
|
9
9
|
"order.date_created.to": `${params.to}T23:59:59.999-00:00`,
|
|
10
|
-
|
|
10
|
+
"order.status": params.status,
|
|
11
11
|
q: params.q,
|
|
12
12
|
sort: params.sort,
|
|
13
13
|
offset: params.offset ?? 0,
|
|
@@ -18,13 +18,26 @@ async function fetchOrder(api, orderId) {
|
|
|
18
18
|
const response = await api.get(`/orders/${orderId}`);
|
|
19
19
|
return response.data;
|
|
20
20
|
}
|
|
21
|
-
async function
|
|
22
|
-
const { api, sellerId } = await getMercadoLibreApiContext(profileId);
|
|
21
|
+
async function fetchOrdersPage(api, params) {
|
|
23
22
|
const response = await api.get("/orders/search", {
|
|
24
|
-
params: orderSearchParams(
|
|
23
|
+
params: orderSearchParams(params)
|
|
25
24
|
});
|
|
26
25
|
return response.data;
|
|
27
26
|
}
|
|
27
|
+
async function searchMercadoLibreOrders(profileId, params) {
|
|
28
|
+
const { api, sellerId } = await getMercadoLibreApiContext(profileId);
|
|
29
|
+
return fetchOrdersPage(api, { ...params, seller: params.seller || sellerId });
|
|
30
|
+
}
|
|
31
|
+
async function searchMercadoLibreOrdersBatch(profileId, params, offsets, options = {}) {
|
|
32
|
+
const { api, sellerId } = await getMercadoLibreApiContext(profileId);
|
|
33
|
+
const seller = params.seller || sellerId;
|
|
34
|
+
const offsetIds = offsets.map((offset) => String(offset));
|
|
35
|
+
return runMercadoLibreBatch(
|
|
36
|
+
offsetIds,
|
|
37
|
+
(offsetId) => fetchOrdersPage(api, { ...params, seller, offset: Number(offsetId) }),
|
|
38
|
+
options
|
|
39
|
+
);
|
|
40
|
+
}
|
|
28
41
|
async function getMercadoLibreOrder(profileId, orderId) {
|
|
29
42
|
const { api } = await getMercadoLibreApiContext(profileId);
|
|
30
43
|
return fetchOrder(api, orderId);
|
|
@@ -60,6 +73,7 @@ export {
|
|
|
60
73
|
getMercadoLibreShipment,
|
|
61
74
|
getMercadoLibreShipmentCosts,
|
|
62
75
|
getMercadoLibreShipmentItems,
|
|
63
|
-
searchMercadoLibreOrders
|
|
76
|
+
searchMercadoLibreOrders,
|
|
77
|
+
searchMercadoLibreOrdersBatch
|
|
64
78
|
};
|
|
65
79
|
//# sourceMappingURL=mercadolibre-orders.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/services/mercadolibre/mercadolibre-orders.ts"],
|
|
4
|
-
"sourcesContent": ["import type { AxiosInstance } from \"axios\";\n\nimport {\n getMercadoLibreApiContext,\n runMercadoLibreBatch,\n type MercadoLibreBatchFetchOptions,\n} from \"./mercadolibre-api.js\";\n\nexport interface MercadoLibreOrdersSearchParams {\n seller: string;\n from: string;\n to: string;\n status?: string;\n q?: string;\n sort?: string;\n offset?: number;\n limit?: number;\n}\n\nfunction orderSearchParams(params: MercadoLibreOrdersSearchParams) {\n return {\n seller: params.seller,\n \"order.date_created.from\": `${params.from}T00:00:00.000-00:00`,\n \"order.date_created.to\": `${params.to}T23:59:59.999-00:00`,\n
|
|
5
|
-
"mappings": "AAEA;AAAA,EACE;AAAA,EACA;AAAA,
|
|
4
|
+
"sourcesContent": ["import type { AxiosInstance } from \"axios\";\r\n\r\nimport {\n getMercadoLibreApiContext,\n runMercadoLibreBatch,\n type MercadoLibreDocumentsBatchResult,\n type MercadoLibreBatchFetchOptions,\n} from \"./mercadolibre-api.js\";\n\r\nexport interface MercadoLibreOrdersSearchParams {\r\n seller: string;\r\n from: string;\r\n to: string;\r\n status?: string;\r\n q?: string;\r\n sort?: string;\r\n offset?: number;\r\n limit?: number;\r\n}\r\n\r\nfunction orderSearchParams(params: MercadoLibreOrdersSearchParams) {\n return {\n seller: params.seller,\n \"order.date_created.from\": `${params.from}T00:00:00.000-00:00`,\n \"order.date_created.to\": `${params.to}T23:59:59.999-00:00`,\n \"order.status\": params.status,\n q: params.q,\n sort: params.sort,\n offset: params.offset ?? 0,\n limit: params.limit ?? 50,\n };\n}\n\nasync function fetchOrder(api: AxiosInstance, orderId: string): Promise<Record<string, unknown>> {\n const response = await api.get<Record<string, unknown>>(`/orders/${orderId}`);\n return response.data;\n}\n\nasync function fetchOrdersPage(\n api: AxiosInstance,\n params: MercadoLibreOrdersSearchParams\n): Promise<Record<string, unknown>> {\n const response = await api.get<Record<string, unknown>>(\"/orders/search\", {\n params: orderSearchParams(params),\n });\n return response.data;\n}\n\r\nexport async function searchMercadoLibreOrders(\n profileId: string,\n params: MercadoLibreOrdersSearchParams\n) {\n const { api, sellerId } = await getMercadoLibreApiContext(profileId);\n return fetchOrdersPage(api, { ...params, seller: params.seller || sellerId });\n}\n\nexport async function searchMercadoLibreOrdersBatch(\n profileId: string,\n params: MercadoLibreOrdersSearchParams,\n offsets: number[],\n options: MercadoLibreBatchFetchOptions = {}\n): Promise<MercadoLibreDocumentsBatchResult<Record<string, unknown>>> {\n const { api, sellerId } = await getMercadoLibreApiContext(profileId);\n const seller = params.seller || sellerId;\n const offsetIds = offsets.map((offset) => String(offset));\n\n return runMercadoLibreBatch(\n offsetIds,\n (offsetId) => fetchOrdersPage(api, { ...params, seller, offset: Number(offsetId) }),\n options\n );\n}\n\r\nexport async function getMercadoLibreOrder(profileId: string, orderId: string) {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n return fetchOrder(api, orderId);\r\n}\r\n\r\nexport async function getMercadoLibreOrderDetailsBatch(\r\n profileId: string,\r\n orderIds: string[],\r\n options: MercadoLibreBatchFetchOptions = {}\r\n) {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n return runMercadoLibreBatch(orderIds, (orderId) => fetchOrder(api, orderId), options);\r\n}\r\n\r\nexport async function getMercadoLibreOrderShipments(profileId: string, orderId: string) {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n const response = await api.get<Record<string, unknown>>(`/orders/${orderId}/shipments`);\r\n return response.data;\r\n}\r\n\r\nexport async function getMercadoLibreShipment(profileId: string, shipmentId: string) {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n const response = await api.get<Record<string, unknown>>(`/shipments/${shipmentId}`);\r\n return response.data;\r\n}\r\n\r\nexport async function getMercadoLibreShipmentItems(profileId: string, shipmentId: string) {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n const response = await api.get<Record<string, unknown>>(`/shipments/${shipmentId}/items`);\r\n return response.data;\r\n}\r\n\r\nexport async function getMercadoLibreShipmentCosts(profileId: string, shipmentId: string) {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n const response = await api.get<Record<string, unknown>>(`/shipments/${shipmentId}/costs`);\r\n return response.data;\r\n}\r\n"],
|
|
5
|
+
"mappings": "AAEA;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AAaP,SAAS,kBAAkB,QAAwC;AACjE,SAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,2BAA2B,GAAG,OAAO,IAAI;AAAA,IACzC,yBAAyB,GAAG,OAAO,EAAE;AAAA,IACrC,gBAAgB,OAAO;AAAA,IACvB,GAAG,OAAO;AAAA,IACV,MAAM,OAAO;AAAA,IACb,QAAQ,OAAO,UAAU;AAAA,IACzB,OAAO,OAAO,SAAS;AAAA,EACzB;AACF;AAEA,eAAe,WAAW,KAAoB,SAAmD;AAC/F,QAAM,WAAW,MAAM,IAAI,IAA6B,WAAW,OAAO,EAAE;AAC5E,SAAO,SAAS;AAClB;AAEA,eAAe,gBACb,KACA,QACkC;AAClC,QAAM,WAAW,MAAM,IAAI,IAA6B,kBAAkB;AAAA,IACxE,QAAQ,kBAAkB,MAAM;AAAA,EAClC,CAAC;AACD,SAAO,SAAS;AAClB;AAEA,eAAsB,yBACpB,WACA,QACA;AACA,QAAM,EAAE,KAAK,SAAS,IAAI,MAAM,0BAA0B,SAAS;AACnE,SAAO,gBAAgB,KAAK,EAAE,GAAG,QAAQ,QAAQ,OAAO,UAAU,SAAS,CAAC;AAC9E;AAEA,eAAsB,8BACpB,WACA,QACA,SACA,UAAyC,CAAC,GAC0B;AACpE,QAAM,EAAE,KAAK,SAAS,IAAI,MAAM,0BAA0B,SAAS;AACnE,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,YAAY,QAAQ,IAAI,CAAC,WAAW,OAAO,MAAM,CAAC;AAExD,SAAO;AAAA,IACL;AAAA,IACA,CAAC,aAAa,gBAAgB,KAAK,EAAE,GAAG,QAAQ,QAAQ,QAAQ,OAAO,QAAQ,EAAE,CAAC;AAAA,IAClF;AAAA,EACF;AACF;AAEA,eAAsB,qBAAqB,WAAmB,SAAiB;AAC7E,QAAM,EAAE,IAAI,IAAI,MAAM,0BAA0B,SAAS;AACzD,SAAO,WAAW,KAAK,OAAO;AAChC;AAEA,eAAsB,iCACpB,WACA,UACA,UAAyC,CAAC,GAC1C;AACA,QAAM,EAAE,IAAI,IAAI,MAAM,0BAA0B,SAAS;AACzD,SAAO,qBAAqB,UAAU,CAAC,YAAY,WAAW,KAAK,OAAO,GAAG,OAAO;AACtF;AAEA,eAAsB,8BAA8B,WAAmB,SAAiB;AACtF,QAAM,EAAE,IAAI,IAAI,MAAM,0BAA0B,SAAS;AACzD,QAAM,WAAW,MAAM,IAAI,IAA6B,WAAW,OAAO,YAAY;AACtF,SAAO,SAAS;AAClB;AAEA,eAAsB,wBAAwB,WAAmB,YAAoB;AACnF,QAAM,EAAE,IAAI,IAAI,MAAM,0BAA0B,SAAS;AACzD,QAAM,WAAW,MAAM,IAAI,IAA6B,cAAc,UAAU,EAAE;AAClF,SAAO,SAAS;AAClB;AAEA,eAAsB,6BAA6B,WAAmB,YAAoB;AACxF,QAAM,EAAE,IAAI,IAAI,MAAM,0BAA0B,SAAS;AACzD,QAAM,WAAW,MAAM,IAAI,IAA6B,cAAc,UAAU,QAAQ;AACxF,SAAO,SAAS;AAClB;AAEA,eAAsB,6BAA6B,WAAmB,YAAoB;AACxF,QAAM,EAAE,IAAI,IAAI,MAAM,0BAA0B,SAAS;AACzD,QAAM,WAAW,MAAM,IAAI,IAA6B,cAAc,UAAU,QAAQ;AACxF,SAAO,SAAS;AAClB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/services/mercadolibre/mercadolibre-questions.ts"],
|
|
4
|
-
"sourcesContent": ["import { getMercadoLibreApiContext } from \"./mercadolibre-api.js\";\n\nexport async function searchMercadoLibreQuestions(\n profileId: string,\n params: {\n sellerId: string;\n itemId?: string;\n status?: string;\n limit?: number;\n offset?: number;\n }\n) {\n const { api } = await getMercadoLibreApiContext(profileId);\n const response = await api.get<Record<string, unknown>>(\"/questions/search\", {\n params: {\n seller_id: params.sellerId,\n api_version: 4,\n item_id: params.itemId,\n status: params.status,\n limit: params.limit ?? 20,\n offset: params.offset ?? 0,\n },\n });\n\n return response.data;\n}\n\nexport async function answerMercadoLibreQuestion(\n profileId: string,\n questionId: number,\n text: string\n) {\n const { api } = await getMercadoLibreApiContext(profileId);\n const response = await api.post<Record<string, unknown>>(\"/answers\", {\n question_id: questionId,\n text,\n });\n\n return response.data;\n}\n"],
|
|
4
|
+
"sourcesContent": ["import { getMercadoLibreApiContext } from \"./mercadolibre-api.js\";\r\n\r\nexport async function searchMercadoLibreQuestions(\r\n profileId: string,\r\n params: {\r\n sellerId: string;\r\n itemId?: string;\r\n status?: string;\r\n limit?: number;\r\n offset?: number;\r\n }\r\n) {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n const response = await api.get<Record<string, unknown>>(\"/questions/search\", {\r\n params: {\r\n seller_id: params.sellerId,\r\n api_version: 4,\r\n item_id: params.itemId,\r\n status: params.status,\r\n limit: params.limit ?? 20,\r\n offset: params.offset ?? 0,\r\n },\r\n });\r\n\r\n return response.data;\r\n}\r\n\r\nexport async function answerMercadoLibreQuestion(\r\n profileId: string,\r\n questionId: number,\r\n text: string\r\n) {\r\n const { api } = await getMercadoLibreApiContext(profileId);\r\n const response = await api.post<Record<string, unknown>>(\"/answers\", {\r\n question_id: questionId,\r\n text,\r\n });\r\n\r\n return response.data;\r\n}\r\n"],
|
|
5
5
|
"mappings": "AAAA,SAAS,iCAAiC;AAE1C,eAAsB,4BACpB,WACA,QAOA;AACA,QAAM,EAAE,IAAI,IAAI,MAAM,0BAA0B,SAAS;AACzD,QAAM,WAAW,MAAM,IAAI,IAA6B,qBAAqB;AAAA,IAC3E,QAAQ;AAAA,MACN,WAAW,OAAO;AAAA,MAClB,aAAa;AAAA,MACb,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAO;AAAA,MACf,OAAO,OAAO,SAAS;AAAA,MACvB,QAAQ,OAAO,UAAU;AAAA,IAC3B;AAAA,EACF,CAAC;AAED,SAAO,SAAS;AAClB;AAEA,eAAsB,2BACpB,WACA,YACA,MACA;AACA,QAAM,EAAE,IAAI,IAAI,MAAM,0BAA0B,SAAS;AACzD,QAAM,WAAW,MAAM,IAAI,KAA8B,YAAY;AAAA,IACnE,aAAa;AAAA,IACb;AAAA,EACF,CAAC;AAED,SAAO,SAAS;AAClB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/services/meta/meta-ads.ts"],
|
|
4
|
-
"sourcesContent": ["import { metaFetch, type MetaListResponse } from \"./meta-api.js\";\nimport { normalizeMetaAdAccountId, toActId } from \"../../meta/meta-utils.js\";\n\nexport interface MetaBusiness {\n id?: string;\n name?: string;\n verification_status?: string;\n}\n\nexport interface MetaBusinessRef {\n id?: string;\n name?: string;\n}\n\nexport interface MetaAdAccount {\n id?: string;\n account_id?: string;\n name?: string;\n currency?: string;\n account_status?: number;\n timezone_name?: string;\n timezone_offset_hours_utc?: number;\n business?: MetaBusinessRef;\n}\n\nexport interface MetaActionMetric {\n action_type?: string;\n value?: string;\n}\n\nexport interface MetaRoasMetric {\n action_type?: string;\n value?: string;\n}\n\nexport interface MetaAdInsight {\n date_start?: string;\n date_stop?: string;\n impressions?: string;\n reach?: string;\n clicks?: string;\n spend?: string;\n ctr?: string;\n cpc?: string;\n cpm?: string;\n actions?: MetaActionMetric[];\n action_values?: MetaActionMetric[];\n purchase_roas?: MetaRoasMetric[];\n}\n\nexport interface MetaCampaign {\n id?: string;\n name?: string;\n status?: string;\n effective_status?: string;\n objective?: string;\n}\n\nexport interface MetaAd {\n id?: string;\n name?: string;\n status?: string;\n effective_status?: string;\n creative?: {\n id?: string;\n };\n}\n\nexport interface MetaPlacementRow extends MetaAdInsight {\n publisher_platform?: string;\n platform_position?: string;\n impression_device?: string;\n}\n\nfunction decodePagingCursor(url: string | undefined): string | undefined {\n if (!url) {\n return undefined;\n }\n\n try {\n return new URL(url).searchParams.get(\"after\") || undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function listAccessibleMetaBusinesses(after?: string) {\n const response = await metaFetch<MetaListResponse<MetaBusiness>>(\"/me/businesses\", {\n fields: \"id,name,verification_status\",\n limit: 100,\n after,\n });\n\n return {\n businesses: response.data ?? [],\n paging: {\n after: response.paging?.cursors?.after || decodePagingCursor(response.paging?.next),\n before: response.paging?.cursors?.before,\n has_more: Boolean(response.paging?.next),\n },\n };\n}\n\nexport async function listAccessibleMetaAdAccounts(after?: string) {\n const response = await metaFetch<MetaListResponse<MetaAdAccount>>(\"/me/adaccounts\", {\n fields:\n \"id,account_id,name,currency,account_status,timezone_name,timezone_offset_hours_utc,business{id,name}\",\n limit: 100,\n after,\n });\n\n const accounts = (response.data ?? []).map((account) => ({\n ...account,\n account_id: account.account_id || normalizeMetaAdAccountId(account.id || \"\"),\n }));\n\n return {\n adAccounts: accounts,\n paging: {\n after: response.paging?.cursors?.after || decodePagingCursor(response.paging?.next),\n before: response.paging?.cursors?.before,\n has_more: Boolean(response.paging?.next),\n },\n };\n}\n\nexport async function getMetaAdAccountInfo(adAccountId: string): Promise<MetaAdAccount> {\n return metaFetch<MetaAdAccount>(`/${toActId(adAccountId)}`, {\n fields:\n \"id,account_id,name,currency,account_status,timezone_name,timezone_offset_hours_utc,business{id,name},amount_spent,balance,spend_cap\",\n });\n}\n\nexport async function getMetaInsights(\n objectId: string,\n params: Record<string, string | number | undefined>\n): Promise<MetaAdInsight[]> {\n const response = await metaFetch<MetaListResponse<MetaAdInsight>>(`/${objectId}/insights`, {\n fields:\n \"impressions,reach,clicks,spend,ctr,cpc,cpm,actions,action_values,purchase_roas,date_start,date_stop\",\n ...params,\n });\n\n return response.data ?? [];\n}\n\nexport async function getMetaCampaigns(adAccountId: string, limit = 50): Promise<MetaCampaign[]> {\n const response = await metaFetch<MetaListResponse<MetaCampaign>>(`/${toActId(adAccountId)}/campaigns`, {\n fields: \"id,name,status,effective_status,objective\",\n limit,\n });\n\n return response.data ?? [];\n}\n\nexport async function getMetaAds(adAccountId: string, limit = 50): Promise<MetaAd[]> {\n const response = await metaFetch<MetaListResponse<MetaAd>>(`/${toActId(adAccountId)}/ads`, {\n fields: \"id,name,status,effective_status,creative{id}\",\n limit,\n });\n\n return response.data ?? [];\n}\n\nexport async function getMetaPlacementInsights(\n adAccountId: string,\n params: Record<string, string | number | undefined>\n): Promise<MetaPlacementRow[]> {\n const response = await metaFetch<MetaListResponse<MetaPlacementRow>>(`/${toActId(adAccountId)}/insights`, {\n fields:\n \"impressions,reach,clicks,spend,ctr,cpc,cpm,actions,action_values,purchase_roas\",\n ...params,\n });\n\n return response.data ?? [];\n}\n"],
|
|
4
|
+
"sourcesContent": ["import { metaFetch, type MetaListResponse } from \"./meta-api.js\";\r\nimport { normalizeMetaAdAccountId, toActId } from \"../../meta/meta-utils.js\";\r\n\r\nexport interface MetaBusiness {\r\n id?: string;\r\n name?: string;\r\n verification_status?: string;\r\n}\r\n\r\nexport interface MetaBusinessRef {\r\n id?: string;\r\n name?: string;\r\n}\r\n\r\nexport interface MetaAdAccount {\r\n id?: string;\r\n account_id?: string;\r\n name?: string;\r\n currency?: string;\r\n account_status?: number;\r\n timezone_name?: string;\r\n timezone_offset_hours_utc?: number;\r\n business?: MetaBusinessRef;\r\n}\r\n\r\nexport interface MetaActionMetric {\r\n action_type?: string;\r\n value?: string;\r\n}\r\n\r\nexport interface MetaRoasMetric {\r\n action_type?: string;\r\n value?: string;\r\n}\r\n\r\nexport interface MetaAdInsight {\r\n date_start?: string;\r\n date_stop?: string;\r\n impressions?: string;\r\n reach?: string;\r\n clicks?: string;\r\n spend?: string;\r\n ctr?: string;\r\n cpc?: string;\r\n cpm?: string;\r\n actions?: MetaActionMetric[];\r\n action_values?: MetaActionMetric[];\r\n purchase_roas?: MetaRoasMetric[];\r\n}\r\n\r\nexport interface MetaCampaign {\r\n id?: string;\r\n name?: string;\r\n status?: string;\r\n effective_status?: string;\r\n objective?: string;\r\n}\r\n\r\nexport interface MetaAd {\r\n id?: string;\r\n name?: string;\r\n status?: string;\r\n effective_status?: string;\r\n creative?: {\r\n id?: string;\r\n };\r\n}\r\n\r\nexport interface MetaPlacementRow extends MetaAdInsight {\r\n publisher_platform?: string;\r\n platform_position?: string;\r\n impression_device?: string;\r\n}\r\n\r\nfunction decodePagingCursor(url: string | undefined): string | undefined {\r\n if (!url) {\r\n return undefined;\r\n }\r\n\r\n try {\r\n return new URL(url).searchParams.get(\"after\") || undefined;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nexport async function listAccessibleMetaBusinesses(after?: string) {\r\n const response = await metaFetch<MetaListResponse<MetaBusiness>>(\"/me/businesses\", {\r\n fields: \"id,name,verification_status\",\r\n limit: 100,\r\n after,\r\n });\r\n\r\n return {\r\n businesses: response.data ?? [],\r\n paging: {\r\n after: response.paging?.cursors?.after || decodePagingCursor(response.paging?.next),\r\n before: response.paging?.cursors?.before,\r\n has_more: Boolean(response.paging?.next),\r\n },\r\n };\r\n}\r\n\r\nexport async function listAccessibleMetaAdAccounts(after?: string) {\r\n const response = await metaFetch<MetaListResponse<MetaAdAccount>>(\"/me/adaccounts\", {\r\n fields:\r\n \"id,account_id,name,currency,account_status,timezone_name,timezone_offset_hours_utc,business{id,name}\",\r\n limit: 100,\r\n after,\r\n });\r\n\r\n const accounts = (response.data ?? []).map((account) => ({\r\n ...account,\r\n account_id: account.account_id || normalizeMetaAdAccountId(account.id || \"\"),\r\n }));\r\n\r\n return {\r\n adAccounts: accounts,\r\n paging: {\r\n after: response.paging?.cursors?.after || decodePagingCursor(response.paging?.next),\r\n before: response.paging?.cursors?.before,\r\n has_more: Boolean(response.paging?.next),\r\n },\r\n };\r\n}\r\n\r\nexport async function getMetaAdAccountInfo(adAccountId: string): Promise<MetaAdAccount> {\r\n return metaFetch<MetaAdAccount>(`/${toActId(adAccountId)}`, {\r\n fields:\r\n \"id,account_id,name,currency,account_status,timezone_name,timezone_offset_hours_utc,business{id,name},amount_spent,balance,spend_cap\",\r\n });\r\n}\r\n\r\nexport async function getMetaInsights(\r\n objectId: string,\r\n params: Record<string, string | number | undefined>\r\n): Promise<MetaAdInsight[]> {\r\n const response = await metaFetch<MetaListResponse<MetaAdInsight>>(`/${objectId}/insights`, {\r\n fields:\r\n \"impressions,reach,clicks,spend,ctr,cpc,cpm,actions,action_values,purchase_roas,date_start,date_stop\",\r\n ...params,\r\n });\r\n\r\n return response.data ?? [];\r\n}\r\n\r\nexport async function getMetaCampaigns(adAccountId: string, limit = 50): Promise<MetaCampaign[]> {\r\n const response = await metaFetch<MetaListResponse<MetaCampaign>>(`/${toActId(adAccountId)}/campaigns`, {\r\n fields: \"id,name,status,effective_status,objective\",\r\n limit,\r\n });\r\n\r\n return response.data ?? [];\r\n}\r\n\r\nexport async function getMetaAds(adAccountId: string, limit = 50): Promise<MetaAd[]> {\r\n const response = await metaFetch<MetaListResponse<MetaAd>>(`/${toActId(adAccountId)}/ads`, {\r\n fields: \"id,name,status,effective_status,creative{id}\",\r\n limit,\r\n });\r\n\r\n return response.data ?? [];\r\n}\r\n\r\nexport async function getMetaPlacementInsights(\r\n adAccountId: string,\r\n params: Record<string, string | number | undefined>\r\n): Promise<MetaPlacementRow[]> {\r\n const response = await metaFetch<MetaListResponse<MetaPlacementRow>>(`/${toActId(adAccountId)}/insights`, {\r\n fields:\r\n \"impressions,reach,clicks,spend,ctr,cpc,cpm,actions,action_values,purchase_roas\",\r\n ...params,\r\n });\r\n\r\n return response.data ?? [];\r\n}\r\n"],
|
|
5
5
|
"mappings": "AAAA,SAAS,iBAAwC;AACjD,SAAS,0BAA0B,eAAe;AAyElD,SAAS,mBAAmB,KAA6C;AACvE,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAO,IAAI,IAAI,GAAG,EAAE,aAAa,IAAI,OAAO,KAAK;AAAA,EACnD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,6BAA6B,OAAgB;AACjE,QAAM,WAAW,MAAM,UAA0C,kBAAkB;AAAA,IACjF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,YAAY,SAAS,QAAQ,CAAC;AAAA,IAC9B,QAAQ;AAAA,MACN,OAAO,SAAS,QAAQ,SAAS,SAAS,mBAAmB,SAAS,QAAQ,IAAI;AAAA,MAClF,QAAQ,SAAS,QAAQ,SAAS;AAAA,MAClC,UAAU,QAAQ,SAAS,QAAQ,IAAI;AAAA,IACzC;AAAA,EACF;AACF;AAEA,eAAsB,6BAA6B,OAAgB;AACjE,QAAM,WAAW,MAAM,UAA2C,kBAAkB;AAAA,IAClF,QACE;AAAA,IACF,OAAO;AAAA,IACP;AAAA,EACF,CAAC;AAED,QAAM,YAAY,SAAS,QAAQ,CAAC,GAAG,IAAI,CAAC,aAAa;AAAA,IACvD,GAAG;AAAA,IACH,YAAY,QAAQ,cAAc,yBAAyB,QAAQ,MAAM,EAAE;AAAA,EAC7E,EAAE;AAEF,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,OAAO,SAAS,QAAQ,SAAS,SAAS,mBAAmB,SAAS,QAAQ,IAAI;AAAA,MAClF,QAAQ,SAAS,QAAQ,SAAS;AAAA,MAClC,UAAU,QAAQ,SAAS,QAAQ,IAAI;AAAA,IACzC;AAAA,EACF;AACF;AAEA,eAAsB,qBAAqB,aAA6C;AACtF,SAAO,UAAyB,IAAI,QAAQ,WAAW,CAAC,IAAI;AAAA,IAC1D,QACE;AAAA,EACJ,CAAC;AACH;AAEA,eAAsB,gBACpB,UACA,QAC0B;AAC1B,QAAM,WAAW,MAAM,UAA2C,IAAI,QAAQ,aAAa;AAAA,IACzF,QACE;AAAA,IACF,GAAG;AAAA,EACL,CAAC;AAED,SAAO,SAAS,QAAQ,CAAC;AAC3B;AAEA,eAAsB,iBAAiB,aAAqB,QAAQ,IAA6B;AAC/F,QAAM,WAAW,MAAM,UAA0C,IAAI,QAAQ,WAAW,CAAC,cAAc;AAAA,IACrG,QAAQ;AAAA,IACR;AAAA,EACF,CAAC;AAED,SAAO,SAAS,QAAQ,CAAC;AAC3B;AAEA,eAAsB,WAAW,aAAqB,QAAQ,IAAuB;AACnF,QAAM,WAAW,MAAM,UAAoC,IAAI,QAAQ,WAAW,CAAC,QAAQ;AAAA,IACzF,QAAQ;AAAA,IACR;AAAA,EACF,CAAC;AAED,SAAO,SAAS,QAAQ,CAAC;AAC3B;AAEA,eAAsB,yBACpB,aACA,QAC6B;AAC7B,QAAM,WAAW,MAAM,UAA8C,IAAI,QAAQ,WAAW,CAAC,aAAa;AAAA,IACxG,QACE;AAAA,IACF,GAAG;AAAA,EACL,CAAC;AAED,SAAO,SAAS,QAAQ,CAAC;AAC3B;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/services/meta/meta-api.ts"],
|
|
4
|
-
"sourcesContent": ["import { createMetaAppSecretProof, getMetaConfig } from \"../../config/meta.js\";\n\ninterface MetaErrorPayload {\n error?: {\n message?: string;\n type?: string;\n code?: number;\n error_subcode?: number;\n error_user_title?: string;\n error_user_msg?: string;\n fbtrace_id?: string;\n };\n}\n\nexport interface MetaPagingCursor {\n before?: string;\n after?: string;\n}\n\nexport interface MetaPaging {\n cursors?: MetaPagingCursor;\n next?: string;\n previous?: string;\n}\n\nexport interface MetaListResponse<T> {\n data?: T[];\n paging?: MetaPaging;\n}\n\nfunction buildUrl(path: string, query: Record<string, string | number | undefined>): string {\n const config = getMetaConfig();\n const accessToken = config.accessToken;\n const appSecretProof = createMetaAppSecretProof(accessToken, config.appSecret);\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n const searchParams = new URLSearchParams();\n\n searchParams.set(\"access_token\", accessToken);\n searchParams.set(\"appsecret_proof\", appSecretProof);\n\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null || value === \"\") {\n continue;\n }\n\n searchParams.set(key, String(value));\n }\n\n return `${config.baseUrl}${normalizedPath}?${searchParams.toString()}`;\n}\n\nexport async function metaFetch<T>(\n path: string,\n query: Record<string, string | number | undefined> = {}\n): Promise<T> {\n const response = await fetch(buildUrl(path, query), {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n },\n });\n\n if (!response.ok) {\n const payload = (await response.json().catch(() => ({}))) as MetaErrorPayload;\n const message =\n payload.error?.error_user_msg ||\n payload.error?.error_user_title ||\n payload.error?.message ||\n `Meta API request failed with status ${response.status}`;\n\n throw new Error(message);\n }\n\n return (await response.json()) as T;\n}\n"],
|
|
4
|
+
"sourcesContent": ["import { createMetaAppSecretProof, getMetaConfig } from \"../../config/meta.js\";\r\n\r\ninterface MetaErrorPayload {\r\n error?: {\r\n message?: string;\r\n type?: string;\r\n code?: number;\r\n error_subcode?: number;\r\n error_user_title?: string;\r\n error_user_msg?: string;\r\n fbtrace_id?: string;\r\n };\r\n}\r\n\r\nexport interface MetaPagingCursor {\r\n before?: string;\r\n after?: string;\r\n}\r\n\r\nexport interface MetaPaging {\r\n cursors?: MetaPagingCursor;\r\n next?: string;\r\n previous?: string;\r\n}\r\n\r\nexport interface MetaListResponse<T> {\r\n data?: T[];\r\n paging?: MetaPaging;\r\n}\r\n\r\nfunction buildUrl(path: string, query: Record<string, string | number | undefined>): string {\r\n const config = getMetaConfig();\r\n const accessToken = config.accessToken;\r\n const appSecretProof = createMetaAppSecretProof(accessToken, config.appSecret);\r\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\r\n const searchParams = new URLSearchParams();\r\n\r\n searchParams.set(\"access_token\", accessToken);\r\n searchParams.set(\"appsecret_proof\", appSecretProof);\r\n\r\n for (const [key, value] of Object.entries(query)) {\r\n if (value === undefined || value === null || value === \"\") {\r\n continue;\r\n }\r\n\r\n searchParams.set(key, String(value));\r\n }\r\n\r\n return `${config.baseUrl}${normalizedPath}?${searchParams.toString()}`;\r\n}\r\n\r\nexport async function metaFetch<T>(\r\n path: string,\r\n query: Record<string, string | number | undefined> = {}\r\n): Promise<T> {\r\n const response = await fetch(buildUrl(path, query), {\r\n method: \"GET\",\r\n headers: {\r\n Accept: \"application/json\",\r\n },\r\n });\r\n\r\n if (!response.ok) {\r\n const payload = (await response.json().catch(() => ({}))) as MetaErrorPayload;\r\n const message =\r\n payload.error?.error_user_msg ||\r\n payload.error?.error_user_title ||\r\n payload.error?.message ||\r\n `Meta API request failed with status ${response.status}`;\r\n\r\n throw new Error(message);\r\n }\r\n\r\n return (await response.json()) as T;\r\n}\r\n"],
|
|
5
5
|
"mappings": "AAAA,SAAS,0BAA0B,qBAAqB;AA8BxD,SAAS,SAAS,MAAc,OAA4D;AAC1F,QAAM,SAAS,cAAc;AAC7B,QAAM,cAAc,OAAO;AAC3B,QAAM,iBAAiB,yBAAyB,aAAa,OAAO,SAAS;AAC7E,QAAM,iBAAiB,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI;AAC7D,QAAM,eAAe,IAAI,gBAAgB;AAEzC,eAAa,IAAI,gBAAgB,WAAW;AAC5C,eAAa,IAAI,mBAAmB,cAAc;AAElD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,IAAI;AACzD;AAAA,IACF;AAEA,iBAAa,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,EACrC;AAEA,SAAO,GAAG,OAAO,OAAO,GAAG,cAAc,IAAI,aAAa,SAAS,CAAC;AACtE;AAEA,eAAsB,UACpB,MACA,QAAqD,CAAC,GAC1C;AACZ,QAAM,WAAW,MAAM,MAAM,SAAS,MAAM,KAAK,GAAG;AAAA,IAClD,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,EACF,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,UAAW,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACvD,UAAM,UACJ,QAAQ,OAAO,kBACf,QAAQ,OAAO,oBACf,QAAQ,OAAO,WACf,uCAAuC,SAAS,MAAM;AAExD,UAAM,IAAI,MAAM,OAAO;AAAA,EACzB;AAEA,SAAQ,MAAM,SAAS,KAAK;AAC9B;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/services/search-console/search-console-client.ts"],
|
|
4
|
-
"sourcesContent": ["import { refreshGoogleAccessToken } from \"../analytics/oauth.js\";\n\nconst SEARCH_CONSOLE_BASE_URL = \"https://www.googleapis.com/webmasters/v3\";\n\nexport interface SearchConsoleSiteEntry {\n siteUrl: string;\n permissionLevel?: string;\n}\n\nexport interface SearchConsoleSitesListResponse {\n siteEntry?: SearchConsoleSiteEntry[];\n}\n\nexport interface SearchConsoleDimensionFilter {\n dimension: string;\n operator: string;\n expression: string;\n}\n\nexport interface SearchConsoleDimensionFilterGroup {\n groupType?: string;\n filters: SearchConsoleDimensionFilter[];\n}\n\nexport interface SearchConsoleSearchAnalyticsRequest {\n startDate: string;\n endDate: string;\n dimensions?: string[];\n type?: string;\n dimensionFilterGroups?: SearchConsoleDimensionFilterGroup[];\n aggregationType?: string;\n rowLimit?: number;\n startRow?: number;\n}\n\nexport interface SearchConsoleSearchAnalyticsRow {\n keys?: string[];\n clicks?: number;\n impressions?: number;\n ctr?: number;\n position?: number;\n}\n\nexport interface SearchConsoleSearchAnalyticsResponse {\n rows?: SearchConsoleSearchAnalyticsRow[];\n responseAggregationType?: string;\n}\n\ninterface GoogleApiErrorPayload {\n error?: {\n code?: number;\n message?: string;\n status?: string;\n };\n}\n\nasync function googleApiFetch<T>(url: string, init?: RequestInit): Promise<T> {\n const accessToken = await refreshGoogleAccessToken();\n\n const response = await fetch(url, {\n ...init,\n headers: {\n Authorization: `Bearer ${accessToken.accessToken}`,\n \"Content-Type\": \"application/json\",\n ...(init?.headers ?? {}),\n },\n });\n\n if (!response.ok) {\n const payload = (await response.json().catch(() => ({}))) as GoogleApiErrorPayload;\n const message =\n payload.error?.message ??\n payload.error?.status ??\n `Google Search Console API request failed with status ${response.status}`;\n\n const normalizedMessage = message.toLowerCase();\n if (\n response.status === 403 &&\n normalizedMessage.includes(\"insufficient authentication scopes\")\n ) {\n throw new Error(\n \"Request had insufficient authentication scopes. Reconnect the Google OAuth credentials with Search Console scope https://www.googleapis.com/auth/webmasters.readonly or https://www.googleapis.com/auth/webmasters.\"\n );\n }\n\n throw new Error(message);\n }\n\n return (await response.json()) as T;\n}\n\nexport async function listSearchConsoleSites(): Promise<SearchConsoleSiteEntry[]> {\n const payload = await googleApiFetch<SearchConsoleSitesListResponse>(\n `${SEARCH_CONSOLE_BASE_URL}/sites`\n );\n\n return payload.siteEntry ?? [];\n}\n\nexport async function querySearchConsolePerformance(\n siteUrl: string,\n body: SearchConsoleSearchAnalyticsRequest\n): Promise<SearchConsoleSearchAnalyticsResponse> {\n return googleApiFetch<SearchConsoleSearchAnalyticsResponse>(\n `${SEARCH_CONSOLE_BASE_URL}/sites/${encodeURIComponent(siteUrl)}/searchAnalytics/query`,\n {\n method: \"POST\",\n body: JSON.stringify(body),\n }\n );\n}\n"],
|
|
4
|
+
"sourcesContent": ["import { refreshGoogleAccessToken } from \"../analytics/oauth.js\";\r\n\r\nconst SEARCH_CONSOLE_BASE_URL = \"https://www.googleapis.com/webmasters/v3\";\r\n\r\nexport interface SearchConsoleSiteEntry {\r\n siteUrl: string;\r\n permissionLevel?: string;\r\n}\r\n\r\nexport interface SearchConsoleSitesListResponse {\r\n siteEntry?: SearchConsoleSiteEntry[];\r\n}\r\n\r\nexport interface SearchConsoleDimensionFilter {\r\n dimension: string;\r\n operator: string;\r\n expression: string;\r\n}\r\n\r\nexport interface SearchConsoleDimensionFilterGroup {\r\n groupType?: string;\r\n filters: SearchConsoleDimensionFilter[];\r\n}\r\n\r\nexport interface SearchConsoleSearchAnalyticsRequest {\r\n startDate: string;\r\n endDate: string;\r\n dimensions?: string[];\r\n type?: string;\r\n dimensionFilterGroups?: SearchConsoleDimensionFilterGroup[];\r\n aggregationType?: string;\r\n rowLimit?: number;\r\n startRow?: number;\r\n}\r\n\r\nexport interface SearchConsoleSearchAnalyticsRow {\r\n keys?: string[];\r\n clicks?: number;\r\n impressions?: number;\r\n ctr?: number;\r\n position?: number;\r\n}\r\n\r\nexport interface SearchConsoleSearchAnalyticsResponse {\r\n rows?: SearchConsoleSearchAnalyticsRow[];\r\n responseAggregationType?: string;\r\n}\r\n\r\ninterface GoogleApiErrorPayload {\r\n error?: {\r\n code?: number;\r\n message?: string;\r\n status?: string;\r\n };\r\n}\r\n\r\nasync function googleApiFetch<T>(url: string, init?: RequestInit): Promise<T> {\r\n const accessToken = await refreshGoogleAccessToken();\r\n\r\n const response = await fetch(url, {\r\n ...init,\r\n headers: {\r\n Authorization: `Bearer ${accessToken.accessToken}`,\r\n \"Content-Type\": \"application/json\",\r\n ...(init?.headers ?? {}),\r\n },\r\n });\r\n\r\n if (!response.ok) {\r\n const payload = (await response.json().catch(() => ({}))) as GoogleApiErrorPayload;\r\n const message =\r\n payload.error?.message ??\r\n payload.error?.status ??\r\n `Google Search Console API request failed with status ${response.status}`;\r\n\r\n const normalizedMessage = message.toLowerCase();\r\n if (\r\n response.status === 403 &&\r\n normalizedMessage.includes(\"insufficient authentication scopes\")\r\n ) {\r\n throw new Error(\r\n \"Request had insufficient authentication scopes. Reconnect the Google OAuth credentials with Search Console scope https://www.googleapis.com/auth/webmasters.readonly or https://www.googleapis.com/auth/webmasters.\"\r\n );\r\n }\r\n\r\n throw new Error(message);\r\n }\r\n\r\n return (await response.json()) as T;\r\n}\r\n\r\nexport async function listSearchConsoleSites(): Promise<SearchConsoleSiteEntry[]> {\r\n const payload = await googleApiFetch<SearchConsoleSitesListResponse>(\r\n `${SEARCH_CONSOLE_BASE_URL}/sites`\r\n );\r\n\r\n return payload.siteEntry ?? [];\r\n}\r\n\r\nexport async function querySearchConsolePerformance(\r\n siteUrl: string,\r\n body: SearchConsoleSearchAnalyticsRequest\r\n): Promise<SearchConsoleSearchAnalyticsResponse> {\r\n return googleApiFetch<SearchConsoleSearchAnalyticsResponse>(\r\n `${SEARCH_CONSOLE_BASE_URL}/sites/${encodeURIComponent(siteUrl)}/searchAnalytics/query`,\r\n {\r\n method: \"POST\",\r\n body: JSON.stringify(body),\r\n }\r\n );\r\n}\r\n"],
|
|
5
5
|
"mappings": "AAAA,SAAS,gCAAgC;AAEzC,MAAM,0BAA0B;AAsDhC,eAAe,eAAkB,KAAa,MAAgC;AAC5E,QAAM,cAAc,MAAM,yBAAyB;AAEnD,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,GAAG;AAAA,IACH,SAAS;AAAA,MACP,eAAe,UAAU,YAAY,WAAW;AAAA,MAChD,gBAAgB;AAAA,MAChB,GAAI,MAAM,WAAW,CAAC;AAAA,IACxB;AAAA,EACF,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,UAAW,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACvD,UAAM,UACJ,QAAQ,OAAO,WACf,QAAQ,OAAO,UACf,wDAAwD,SAAS,MAAM;AAEzE,UAAM,oBAAoB,QAAQ,YAAY;AAC9C,QACE,SAAS,WAAW,OACpB,kBAAkB,SAAS,oCAAoC,GAC/D;AACA,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,OAAO;AAAA,EACzB;AAEA,SAAQ,MAAM,SAAS,KAAK;AAC9B;AAEA,eAAsB,yBAA4D;AAChF,QAAM,UAAU,MAAM;AAAA,IACpB,GAAG,uBAAuB;AAAA,EAC5B;AAEA,SAAO,QAAQ,aAAa,CAAC;AAC/B;AAEA,eAAsB,8BACpB,SACA,MAC+C;AAC/C,SAAO;AAAA,IACL,GAAG,uBAAuB,UAAU,mBAAmB,OAAO,CAAC;AAAA,IAC/D;AAAA,MACE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B;AAAA,EACF;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/services/search-console/search-console-utils.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from 'zod';\nimport { getProfileGoogleServiceMapping } from '../../config/google-store.js';\nimport type { SearchConsoleDimensionFilter, SearchConsoleDimensionFilterGroup, SearchConsoleSearchAnalyticsRequest, SearchConsoleSearchAnalyticsRow, SearchConsoleSiteEntry } from './search-console-client.js';\n\nexport const searchConsoleDateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\nexport const searchConsoleSearchTypes = ['web', 'image', 'video', 'news', 'discover'] as const;\nexport const searchConsoleDimensions = ['query', 'page', 'country', 'device', 'date', 'searchAppearance'] as const;\nexport const searchConsoleFilterOperators = ['contains', 'equals', 'notContains', 'notEquals', 'includingRegex', 'excludingRegex'] as const;\nexport const searchConsoleAggregationTypes = ['auto', 'byPage', 'byProperty'] as const;\nexport const searchConsoleDimensionFilterSchema = z.object({ dimension: z.enum(searchConsoleDimensions).describe('Dimension to filter on in Search Console (query, page, country, device, date, or searchAppearance)'), operator: z.enum(searchConsoleFilterOperators).describe('Filter operator supported by Search Console.'), expression: z.string().min(1).describe('Filter value or regex expression.') });\nexport const siteUrlSchemaField = z.string().optional().describe('Search Console site URL or domain property identifier (for example https://www.example.com/ or sc-domain:example.com). If omitted, the tool tries profileId mapping first.');\nexport const profileIdSchemaField = z.string().optional().describe('Optional business profile identifier used to resolve Google service mappings.');\nexport const startDateSchemaField = z.string().regex(searchConsoleDateRegex).describe('Start date in YYYY-MM-DD format.');\nexport const endDateSchemaField = z.string().regex(searchConsoleDateRegex).describe('End date in YYYY-MM-DD format.');\nexport const currentStartDateSchemaField = z.string().regex(searchConsoleDateRegex).describe('Current comparison period start date in YYYY-MM-DD format.');\nexport const currentEndDateSchemaField = z.string().regex(searchConsoleDateRegex).describe('Current comparison period end date in YYYY-MM-DD format.');\nexport const previousStartDateSchemaField = z.string().regex(searchConsoleDateRegex).describe('Previous comparison period start date in YYYY-MM-DD format.');\nexport const previousEndDateSchemaField = z.string().regex(searchConsoleDateRegex).describe('Previous comparison period end date in YYYY-MM-DD format.');\nexport const rowLimitSchemaField = z.number().int().min(1).max(25000).optional().describe('Maximum number of rows to return. Search Console supports up to 25,000 rows per request.');\nexport const startRowSchemaField = z.number().int().min(0).optional().describe('Zero-based row offset for paginated Search Console requests.');\nexport const searchTypeSchemaField = z.enum(searchConsoleSearchTypes).optional().describe('Search type to query. Defaults to web.');\nexport const brandTermsSchemaField = z.array(z.string().min(1)).max(50).optional().describe('Brand tokens used to separate branded from non-branded queries.');\n\nexport async function resolveSearchConsoleSiteUrl(siteUrl?: string, profileId?: string): Promise<string> {\n const explicitSiteUrl = siteUrl?.trim();\n if (explicitSiteUrl) return explicitSiteUrl;\n const explicitProfileId = profileId?.trim();\n if (explicitProfileId) {\n const mapping = await getProfileGoogleServiceMapping(explicitProfileId);\n if (mapping?.searchConsoleSiteUrl) return mapping.searchConsoleSiteUrl;\n throw new Error(`Missing Search Console site URL. profileId \"${explicitProfileId}\" has no Search Console mapping configured.`);\n }\n throw new Error('Missing Search Console site URL. Pass siteUrl explicitly, provide profileId with a configured mapping, or call gsc_list_accessible_sites first.');\n}\n\nexport function inferSearchConsolePropertyType(siteUrl: string): 'domain' | 'url_prefix' | 'unknown' { if (siteUrl.startsWith('sc-domain:')) return 'domain'; if (/^https?:\\/\\//.test(siteUrl)) return 'url_prefix'; return 'unknown'; }\nexport function normalizePermissionLevel(permissionLevel?: string): string | undefined { return permissionLevel?.trim().toLowerCase() || undefined; }\nexport function normalizeSearchConsoleSiteEntry(siteEntry: SearchConsoleSiteEntry) { return { site_url: siteEntry.siteUrl, property_type: inferSearchConsolePropertyType(siteEntry.siteUrl), permission_level: normalizePermissionLevel(siteEntry.permissionLevel) }; }\nexport function toPercent(numerator: number, denominator: number): number { if (!Number.isFinite(numerator) || !Number.isFinite(denominator) || denominator <= 0) return 0; return (numerator / denominator) * 100; }\nexport function round(value: number, decimals = 2): number { if (!Number.isFinite(value)) return 0; const factor = 10 ** decimals; return Math.round(value * factor) / factor; }\nexport function normalizeSearchConsoleRow(row: SearchConsoleSearchAnalyticsRow, dimensions: readonly string[] = []) { const clicks = row.clicks ?? 0; const impressions = row.impressions ?? 0; const ctr = typeof row.ctr === 'number' ? row.ctr * 100 : toPercent(clicks, impressions); const keys = row.keys ?? []; return { keys, dimensions: dimensions.reduce<Record<string, string>>((accumulator, dimension, index) => { accumulator[dimension] = keys[index] ?? ''; return accumulator; }, {}), clicks: round(clicks, 2), impressions: round(impressions, 2), ctr_percent: round(ctr, 2), position: round(row.position ?? 0, 2) }; }\nexport function buildSearchConsoleQueryBody(input: { startDate: string; endDate: string; dimensions?: string[]; searchType?: string; dimensionFilters?: SearchConsoleDimensionFilter[]; aggregationType?: string; rowLimit?: number; startRow?: number; }): SearchConsoleSearchAnalyticsRequest { const dimensionFilterGroups: SearchConsoleDimensionFilterGroup[] | undefined = input.dimensionFilters && input.dimensionFilters.length > 0 ? [{ groupType: 'and', filters: input.dimensionFilters }] : undefined; return { startDate: input.startDate, endDate: input.endDate, dimensions: input.dimensions, type: input.searchType ?? 'web', dimensionFilterGroups, aggregationType: input.aggregationType, rowLimit: input.rowLimit, startRow: input.startRow }; }\nexport function buildPaginationMetadata(input: { startRow?: number; rowLimit?: number; returnedRows: number; }) { const startRow = input.startRow ?? 0; const rowLimit = input.rowLimit; const isPartial = Boolean(rowLimit) && input.returnedRows === rowLimit; const nextStartRow = isPartial ? startRow + input.returnedRows : undefined; return { is_partial: isPartial, start_row: startRow, row_limit: rowLimit, returned_rows: input.returnedRows, next_start_row: nextStartRow, continuation_instructions: nextStartRow ? 'This Search Console response may be truncated at row_limit. If you need additional rows, call the same tool again with startRow set to next_start_row.' : undefined }; }\nexport function parseBrandTerms(brandTerms?: string[]): string[] { return (brandTerms ?? []).map((term) => term.trim().toLowerCase()).filter(Boolean); }\nexport function isBrandedQuery(query: string, brandTerms?: string[]): boolean { const normalizedQuery = query.trim().toLowerCase(); const normalizedBrandTerms = parseBrandTerms(brandTerms); if (!normalizedQuery || normalizedBrandTerms.length === 0) return false; return normalizedBrandTerms.some((brandTerm) => normalizedQuery.includes(brandTerm)); }\nexport function classifyBrandLabel(query: string, brandTerms?: string[]) { if ((brandTerms ?? []).length === 0) return 'unknown'; return isBrandedQuery(query, brandTerms) ? 'brand' : 'non_brand'; }\nexport function sumSearchConsoleRows(rows: Array<{ clicks: number; impressions: number; ctr_percent: number; position: number }>) { const clicks = rows.reduce((total, row) => total + row.clicks, 0); const impressions = rows.reduce((total, row) => total + row.impressions, 0); const weightedCtr = impressions > 0 ? rows.reduce((total, row) => total + row.impressions * row.ctr_percent, 0) / impressions : 0; const weightedPosition = impressions > 0 ? rows.reduce((total, row) => total + row.impressions * row.position, 0) / impressions : 0; return { clicks: round(clicks), impressions: round(impressions), ctrPercent: round(weightedCtr), averagePosition: round(weightedPosition) }; }\nexport function scoreQuickWinOpportunity(input: { impressions: number; ctrPercent: number; position: number }) { return round(input.impressions * Math.max(0, 8 - input.ctrPercent) * Math.max(0.5, 20 - input.position) / 100); }\nexport function scoreHighImpressionLowClickOpportunity(input: { impressions: number; ctrPercent: number; position: number }) { return round(input.impressions * Math.max(0, 5 - input.ctrPercent) * Math.max(0.5, 15 - input.position) / 100); }\nexport function classifyQuickWinType(position: number, ctrPercent: number) { if (position > 0 && position <= 10 && ctrPercent < 4) return 'ctr'; if (position > 10 && position <= 20) return 'position'; return 'mixed'; }\nexport function looksLikeProductQuery(query: string, productTerms?: string[]) { if ((productTerms ?? []).some((term) => query.toLowerCase().includes(term.trim().toLowerCase()))) return true; return /\\b(comprar|precio|modelo|sku|talle|color|review|opiniones)\\b/i.test(query); }\nexport function buildComparisonMap<T>(rows: T[], getKey: (row: T) => string) { return new Map(rows.map((row) => [getKey(row), row])); }\nexport function computeChangePercent(current: number, previous: number) { if (previous === 0) return current > 0 ? 100 : 0; return round(((current - previous) / previous) * 100); }\n"],
|
|
4
|
+
"sourcesContent": ["import { z } from 'zod';\r\nimport { getProfileGoogleServiceMapping } from '../../config/google-store.js';\r\nimport type { SearchConsoleDimensionFilter, SearchConsoleDimensionFilterGroup, SearchConsoleSearchAnalyticsRequest, SearchConsoleSearchAnalyticsRow, SearchConsoleSiteEntry } from './search-console-client.js';\r\n\r\nexport const searchConsoleDateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\r\nexport const searchConsoleSearchTypes = ['web', 'image', 'video', 'news', 'discover'] as const;\r\nexport const searchConsoleDimensions = ['query', 'page', 'country', 'device', 'date', 'searchAppearance'] as const;\r\nexport const searchConsoleFilterOperators = ['contains', 'equals', 'notContains', 'notEquals', 'includingRegex', 'excludingRegex'] as const;\r\nexport const searchConsoleAggregationTypes = ['auto', 'byPage', 'byProperty'] as const;\r\nexport const searchConsoleDimensionFilterSchema = z.object({ dimension: z.enum(searchConsoleDimensions).describe('Dimension to filter on in Search Console (query, page, country, device, date, or searchAppearance)'), operator: z.enum(searchConsoleFilterOperators).describe('Filter operator supported by Search Console.'), expression: z.string().min(1).describe('Filter value or regex expression.') });\r\nexport const siteUrlSchemaField = z.string().optional().describe('Search Console site URL or domain property identifier (for example https://www.example.com/ or sc-domain:example.com). If omitted, the tool tries profileId mapping first.');\r\nexport const profileIdSchemaField = z.string().optional().describe('Optional business profile identifier used to resolve Google service mappings.');\r\nexport const startDateSchemaField = z.string().regex(searchConsoleDateRegex).describe('Start date in YYYY-MM-DD format.');\r\nexport const endDateSchemaField = z.string().regex(searchConsoleDateRegex).describe('End date in YYYY-MM-DD format.');\r\nexport const currentStartDateSchemaField = z.string().regex(searchConsoleDateRegex).describe('Current comparison period start date in YYYY-MM-DD format.');\r\nexport const currentEndDateSchemaField = z.string().regex(searchConsoleDateRegex).describe('Current comparison period end date in YYYY-MM-DD format.');\r\nexport const previousStartDateSchemaField = z.string().regex(searchConsoleDateRegex).describe('Previous comparison period start date in YYYY-MM-DD format.');\r\nexport const previousEndDateSchemaField = z.string().regex(searchConsoleDateRegex).describe('Previous comparison period end date in YYYY-MM-DD format.');\r\nexport const rowLimitSchemaField = z.number().int().min(1).max(25000).optional().describe('Maximum number of rows to return. Search Console supports up to 25,000 rows per request.');\r\nexport const startRowSchemaField = z.number().int().min(0).optional().describe('Zero-based row offset for paginated Search Console requests.');\r\nexport const searchTypeSchemaField = z.enum(searchConsoleSearchTypes).optional().describe('Search type to query. Defaults to web.');\r\nexport const brandTermsSchemaField = z.array(z.string().min(1)).max(50).optional().describe('Brand tokens used to separate branded from non-branded queries.');\r\n\r\nexport async function resolveSearchConsoleSiteUrl(siteUrl?: string, profileId?: string): Promise<string> {\r\n const explicitSiteUrl = siteUrl?.trim();\r\n if (explicitSiteUrl) return explicitSiteUrl;\r\n const explicitProfileId = profileId?.trim();\r\n if (explicitProfileId) {\r\n const mapping = await getProfileGoogleServiceMapping(explicitProfileId);\r\n if (mapping?.searchConsoleSiteUrl) return mapping.searchConsoleSiteUrl;\r\n throw new Error(`Missing Search Console site URL. profileId \"${explicitProfileId}\" has no Search Console mapping configured.`);\r\n }\r\n throw new Error('Missing Search Console site URL. Pass siteUrl explicitly, provide profileId with a configured mapping, or call gsc_list_accessible_sites first.');\r\n}\r\n\r\nexport function inferSearchConsolePropertyType(siteUrl: string): 'domain' | 'url_prefix' | 'unknown' { if (siteUrl.startsWith('sc-domain:')) return 'domain'; if (/^https?:\\/\\//.test(siteUrl)) return 'url_prefix'; return 'unknown'; }\r\nexport function normalizePermissionLevel(permissionLevel?: string): string | undefined { return permissionLevel?.trim().toLowerCase() || undefined; }\r\nexport function normalizeSearchConsoleSiteEntry(siteEntry: SearchConsoleSiteEntry) { return { site_url: siteEntry.siteUrl, property_type: inferSearchConsolePropertyType(siteEntry.siteUrl), permission_level: normalizePermissionLevel(siteEntry.permissionLevel) }; }\r\nexport function toPercent(numerator: number, denominator: number): number { if (!Number.isFinite(numerator) || !Number.isFinite(denominator) || denominator <= 0) return 0; return (numerator / denominator) * 100; }\r\nexport function round(value: number, decimals = 2): number { if (!Number.isFinite(value)) return 0; const factor = 10 ** decimals; return Math.round(value * factor) / factor; }\r\nexport function normalizeSearchConsoleRow(row: SearchConsoleSearchAnalyticsRow, dimensions: readonly string[] = []) { const clicks = row.clicks ?? 0; const impressions = row.impressions ?? 0; const ctr = typeof row.ctr === 'number' ? row.ctr * 100 : toPercent(clicks, impressions); const keys = row.keys ?? []; return { keys, dimensions: dimensions.reduce<Record<string, string>>((accumulator, dimension, index) => { accumulator[dimension] = keys[index] ?? ''; return accumulator; }, {}), clicks: round(clicks, 2), impressions: round(impressions, 2), ctr_percent: round(ctr, 2), position: round(row.position ?? 0, 2) }; }\r\nexport function buildSearchConsoleQueryBody(input: { startDate: string; endDate: string; dimensions?: string[]; searchType?: string; dimensionFilters?: SearchConsoleDimensionFilter[]; aggregationType?: string; rowLimit?: number; startRow?: number; }): SearchConsoleSearchAnalyticsRequest { const dimensionFilterGroups: SearchConsoleDimensionFilterGroup[] | undefined = input.dimensionFilters && input.dimensionFilters.length > 0 ? [{ groupType: 'and', filters: input.dimensionFilters }] : undefined; return { startDate: input.startDate, endDate: input.endDate, dimensions: input.dimensions, type: input.searchType ?? 'web', dimensionFilterGroups, aggregationType: input.aggregationType, rowLimit: input.rowLimit, startRow: input.startRow }; }\r\nexport function buildPaginationMetadata(input: { startRow?: number; rowLimit?: number; returnedRows: number; }) { const startRow = input.startRow ?? 0; const rowLimit = input.rowLimit; const isPartial = Boolean(rowLimit) && input.returnedRows === rowLimit; const nextStartRow = isPartial ? startRow + input.returnedRows : undefined; return { is_partial: isPartial, start_row: startRow, row_limit: rowLimit, returned_rows: input.returnedRows, next_start_row: nextStartRow, continuation_instructions: nextStartRow ? 'This Search Console response may be truncated at row_limit. If you need additional rows, call the same tool again with startRow set to next_start_row.' : undefined }; }\r\nexport function parseBrandTerms(brandTerms?: string[]): string[] { return (brandTerms ?? []).map((term) => term.trim().toLowerCase()).filter(Boolean); }\r\nexport function isBrandedQuery(query: string, brandTerms?: string[]): boolean { const normalizedQuery = query.trim().toLowerCase(); const normalizedBrandTerms = parseBrandTerms(brandTerms); if (!normalizedQuery || normalizedBrandTerms.length === 0) return false; return normalizedBrandTerms.some((brandTerm) => normalizedQuery.includes(brandTerm)); }\r\nexport function classifyBrandLabel(query: string, brandTerms?: string[]) { if ((brandTerms ?? []).length === 0) return 'unknown'; return isBrandedQuery(query, brandTerms) ? 'brand' : 'non_brand'; }\r\nexport function sumSearchConsoleRows(rows: Array<{ clicks: number; impressions: number; ctr_percent: number; position: number }>) { const clicks = rows.reduce((total, row) => total + row.clicks, 0); const impressions = rows.reduce((total, row) => total + row.impressions, 0); const weightedCtr = impressions > 0 ? rows.reduce((total, row) => total + row.impressions * row.ctr_percent, 0) / impressions : 0; const weightedPosition = impressions > 0 ? rows.reduce((total, row) => total + row.impressions * row.position, 0) / impressions : 0; return { clicks: round(clicks), impressions: round(impressions), ctrPercent: round(weightedCtr), averagePosition: round(weightedPosition) }; }\r\nexport function scoreQuickWinOpportunity(input: { impressions: number; ctrPercent: number; position: number }) { return round(input.impressions * Math.max(0, 8 - input.ctrPercent) * Math.max(0.5, 20 - input.position) / 100); }\r\nexport function scoreHighImpressionLowClickOpportunity(input: { impressions: number; ctrPercent: number; position: number }) { return round(input.impressions * Math.max(0, 5 - input.ctrPercent) * Math.max(0.5, 15 - input.position) / 100); }\r\nexport function classifyQuickWinType(position: number, ctrPercent: number) { if (position > 0 && position <= 10 && ctrPercent < 4) return 'ctr'; if (position > 10 && position <= 20) return 'position'; return 'mixed'; }\r\nexport function looksLikeProductQuery(query: string, productTerms?: string[]) { if ((productTerms ?? []).some((term) => query.toLowerCase().includes(term.trim().toLowerCase()))) return true; return /\\b(comprar|precio|modelo|sku|talle|color|review|opiniones)\\b/i.test(query); }\r\nexport function buildComparisonMap<T>(rows: T[], getKey: (row: T) => string) { return new Map(rows.map((row) => [getKey(row), row])); }\r\nexport function computeChangePercent(current: number, previous: number) { if (previous === 0) return current > 0 ? 100 : 0; return round(((current - previous) / previous) * 100); }\r\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/services/vtex/vtex-api.ts"],
|
|
4
|
-
"sourcesContent": ["import axios from \"axios\";\nimport type { AxiosError, AxiosInstance } from \"axios\";\n\nimport { getVtexConfigForProfile, type VtexConfig } from \"../../config/vtex.js\";\n\nexport function createVtexClient(config: VtexConfig, baseURL: string): AxiosInstance {\n const client = axios.create({\n baseURL,\n headers: {\n \"X-VTEX-API-AppKey\": config.apiKey,\n \"X-VTEX-API-AppToken\": config.apiToken,\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n timeout: 30000,\n });\n\n client.interceptors.response.use(\n (response) => response,\n (error: AxiosError) => {\n const method = error.config?.method?.toUpperCase() ?? \"UNKNOWN\";\n const url = error.config?.url ?? \"UNKNOWN_URL\";\n const status = error.response?.status ?? \"NO_STATUS\";\n\n console.error(`[VTEX API ERROR] ${method} ${url} -> ${status}`);\n\n if (error.response?.data) {\n console.error(\"[VTEX API ERROR BODY]\", error.response.data);\n }\n\n return Promise.reject(error);\n }\n );\n\n return client;\n}\n\nexport async function getVtexApiClients(profileId: string) {\n const config = await getVtexConfigForProfile(profileId);\n\n return {\n config,\n vtexApi: createVtexClient(config, config.baseUrl),\n vtexPricingApi: createVtexClient(config, config.pricingBaseUrl),\n };\n}\n\nexport async function validateVtexConfig(config: VtexConfig): Promise<void> {\n const client = createVtexClient(config, config.baseUrl);\n await client.get(\"/api/oms/pvt/orders\", {\n params: {\n page: 1,\n per_page: 1,\n },\n });\n}\n\nexport function formatVtexError(error: unknown, fallback = \"Unexpected VTEX API error\"): string {\n if (axios.isAxiosError(error)) {\n const status = error.response?.status;\n const responseData = error.response?.data;\n const responseMessage =\n typeof responseData === \"object\" && responseData !== null && \"message\" in responseData\n ? String((responseData as { message?: unknown }).message)\n : typeof responseData === \"string\"\n ? responseData\n : undefined;\n\n if (status) {\n return `VTEX API request failed (${status}): ${responseMessage ?? error.message}`;\n }\n\n return `VTEX API request failed: ${responseMessage ?? error.message}`;\n }\n\n if (error instanceof Error) {\n return error.message;\n }\n\n return fallback;\n}\n"],
|
|
4
|
+
"sourcesContent": ["import axios from \"axios\";\r\nimport type { AxiosError, AxiosInstance } from \"axios\";\r\n\r\nimport { getVtexConfigForProfile, type VtexConfig } from \"../../config/vtex.js\";\r\n\r\nexport function createVtexClient(config: VtexConfig, baseURL: string): AxiosInstance {\r\n const client = axios.create({\r\n baseURL,\r\n headers: {\r\n \"X-VTEX-API-AppKey\": config.apiKey,\r\n \"X-VTEX-API-AppToken\": config.apiToken,\r\n Accept: \"application/json\",\r\n \"Content-Type\": \"application/json\",\r\n },\r\n timeout: 30000,\r\n });\r\n\r\n client.interceptors.response.use(\r\n (response) => response,\r\n (error: AxiosError) => {\r\n const method = error.config?.method?.toUpperCase() ?? \"UNKNOWN\";\r\n const url = error.config?.url ?? \"UNKNOWN_URL\";\r\n const status = error.response?.status ?? \"NO_STATUS\";\r\n\r\n console.error(`[VTEX API ERROR] ${method} ${url} -> ${status}`);\r\n\r\n if (error.response?.data) {\r\n console.error(\"[VTEX API ERROR BODY]\", error.response.data);\r\n }\r\n\r\n return Promise.reject(error);\r\n }\r\n );\r\n\r\n return client;\r\n}\r\n\r\nexport async function getVtexApiClients(profileId: string) {\r\n const config = await getVtexConfigForProfile(profileId);\r\n\r\n return {\r\n config,\r\n vtexApi: createVtexClient(config, config.baseUrl),\r\n vtexPricingApi: createVtexClient(config, config.pricingBaseUrl),\r\n };\r\n}\r\n\r\nexport async function validateVtexConfig(config: VtexConfig): Promise<void> {\r\n const client = createVtexClient(config, config.baseUrl);\r\n await client.get(\"/api/oms/pvt/orders\", {\r\n params: {\r\n page: 1,\r\n per_page: 1,\r\n },\r\n });\r\n}\r\n\r\nexport function formatVtexError(error: unknown, fallback = \"Unexpected VTEX API error\"): string {\r\n if (axios.isAxiosError(error)) {\r\n const status = error.response?.status;\r\n const responseData = error.response?.data;\r\n const responseMessage =\r\n typeof responseData === \"object\" && responseData !== null && \"message\" in responseData\r\n ? String((responseData as { message?: unknown }).message)\r\n : typeof responseData === \"string\"\r\n ? responseData\r\n : undefined;\r\n\r\n if (status) {\r\n return `VTEX API request failed (${status}): ${responseMessage ?? error.message}`;\r\n }\r\n\r\n return `VTEX API request failed: ${responseMessage ?? error.message}`;\r\n }\r\n\r\n if (error instanceof Error) {\r\n return error.message;\r\n }\r\n\r\n return fallback;\r\n}\r\n"],
|
|
5
5
|
"mappings": "AAAA,OAAO,WAAW;AAGlB,SAAS,+BAAgD;AAElD,SAAS,iBAAiB,QAAoB,SAAgC;AACnF,QAAM,SAAS,MAAM,OAAO;AAAA,IAC1B;AAAA,IACA,SAAS;AAAA,MACP,qBAAqB,OAAO;AAAA,MAC5B,uBAAuB,OAAO;AAAA,MAC9B,QAAQ;AAAA,MACR,gBAAgB;AAAA,IAClB;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AAED,SAAO,aAAa,SAAS;AAAA,IAC3B,CAAC,aAAa;AAAA,IACd,CAAC,UAAsB;AACrB,YAAM,SAAS,MAAM,QAAQ,QAAQ,YAAY,KAAK;AACtD,YAAM,MAAM,MAAM,QAAQ,OAAO;AACjC,YAAM,SAAS,MAAM,UAAU,UAAU;AAEzC,cAAQ,MAAM,oBAAoB,MAAM,IAAI,GAAG,OAAO,MAAM,EAAE;AAE9D,UAAI,MAAM,UAAU,MAAM;AACxB,gBAAQ,MAAM,yBAAyB,MAAM,SAAS,IAAI;AAAA,MAC5D;AAEA,aAAO,QAAQ,OAAO,KAAK;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,kBAAkB,WAAmB;AACzD,QAAM,SAAS,MAAM,wBAAwB,SAAS;AAEtD,SAAO;AAAA,IACL;AAAA,IACA,SAAS,iBAAiB,QAAQ,OAAO,OAAO;AAAA,IAChD,gBAAgB,iBAAiB,QAAQ,OAAO,cAAc;AAAA,EAChE;AACF;AAEA,eAAsB,mBAAmB,QAAmC;AAC1E,QAAM,SAAS,iBAAiB,QAAQ,OAAO,OAAO;AACtD,QAAM,OAAO,IAAI,uBAAuB;AAAA,IACtC,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,EACF,CAAC;AACH;AAEO,SAAS,gBAAgB,OAAgB,WAAW,6BAAqC;AAC9F,MAAI,MAAM,aAAa,KAAK,GAAG;AAC7B,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,eAAe,MAAM,UAAU;AACrC,UAAM,kBACJ,OAAO,iBAAiB,YAAY,iBAAiB,QAAQ,aAAa,eACtE,OAAQ,aAAuC,OAAO,IACtD,OAAO,iBAAiB,WACtB,eACA;AAER,QAAI,QAAQ;AACV,aAAO,4BAA4B,MAAM,MAAM,mBAAmB,MAAM,OAAO;AAAA,IACjF;AAEA,WAAO,4BAA4B,mBAAmB,MAAM,OAAO;AAAA,EACrE;AAEA,MAAI,iBAAiB,OAAO;AAC1B,WAAO,MAAM;AAAA,EACf;AAEA,SAAO;AACT;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/services/vtex/vtex-catalog-write.ts"],
|
|
4
|
-
"sourcesContent": ["import { getVtexApiClients } from \"./vtex-api.js\";\n\nexport interface VtexProductBasicFieldsInput {\n name?: string;\n categoryId?: number;\n brandId?: number;\n description?: string;\n descriptionShort?: string;\n title?: string;\n linkId?: string;\n refId?: string;\n isVisible?: boolean;\n isActive?: boolean;\n keyWords?: string;\n releaseDate?: string;\n metaTagDescription?: string;\n showWithoutStock?: boolean;\n}\n\nexport interface VtexSkuBasicFieldsInput {\n name?: string;\n refId?: string;\n ean?: string;\n packagedHeight?: number;\n packagedLength?: number;\n packagedWidth?: number;\n packagedWeightKg?: number;\n height?: number;\n length?: number;\n width?: number;\n weightKg?: number;\n measurementUnit?: string;\n unitMultiplier?: number;\n manufacturerCode?: string;\n commercialConditionId?: number;\n isActive?: boolean;\n activateIfPossible?: boolean;\n}\n\nfunction pickRecord(source: Record<string, unknown>, keys: string[]): Record<string, unknown> {\n const picked: Record<string, unknown> = {};\n for (const key of keys) {\n if (key in source) {\n picked[key] = source[key];\n }\n }\n return picked;\n}\n\nexport async function getProduct(profileId: string, productId: string): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<Record<string, unknown>>(`/api/catalog/pvt/product/${productId}`);\n return response.data;\n}\n\nexport async function createProduct(\n profileId: string,\n payload: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.post<Record<string, unknown>>(\"/api/catalog/pvt/product\", payload);\n return response.data;\n}\n\nexport async function updateProduct(\n profileId: string,\n productId: string,\n payload: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.put<Record<string, unknown>>(`/api/catalog/pvt/product/${productId}`, payload);\n return response.data;\n}\n\nexport function buildProductUpdatePayload(\n current: Record<string, unknown>,\n updates: VtexProductBasicFieldsInput\n): Record<string, unknown> {\n const payload = pickRecord(current, [\n \"Name\",\n \"DepartmentId\",\n \"CategoryId\",\n \"BrandId\",\n \"LinkId\",\n \"RefId\",\n \"IsVisible\",\n \"Description\",\n \"DescriptionShort\",\n \"ReleaseDate\",\n \"KeyWords\",\n \"Title\",\n \"IsActive\",\n \"TaxCode\",\n \"MetaTagDescription\",\n \"SupplierId\",\n \"ShowWithoutStock\",\n \"AdWordsRemarketingCode\",\n \"LomadeeCampaignCode\",\n \"Score\",\n ]);\n\n if (updates.name !== undefined) payload.Name = updates.name;\n if (updates.categoryId !== undefined) payload.CategoryId = updates.categoryId;\n if (updates.brandId !== undefined) payload.BrandId = updates.brandId;\n if (updates.description !== undefined) payload.Description = updates.description;\n if (updates.descriptionShort !== undefined) payload.DescriptionShort = updates.descriptionShort;\n if (updates.title !== undefined) payload.Title = updates.title;\n if (updates.linkId !== undefined) payload.LinkId = updates.linkId;\n if (updates.refId !== undefined) payload.RefId = updates.refId;\n if (updates.isVisible !== undefined) payload.IsVisible = updates.isVisible;\n if (updates.isActive !== undefined) payload.IsActive = updates.isActive;\n if (updates.keyWords !== undefined) payload.KeyWords = updates.keyWords;\n if (updates.releaseDate !== undefined) payload.ReleaseDate = updates.releaseDate;\n if (updates.metaTagDescription !== undefined) {\n payload.MetaTagDescription = updates.metaTagDescription;\n }\n if (updates.showWithoutStock !== undefined) {\n payload.ShowWithoutStock = updates.showWithoutStock;\n }\n\n return payload;\n}\n\nexport async function getSku(profileId: string, skuId: string): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<Record<string, unknown>>(`/api/catalog/pvt/stockkeepingunit/${skuId}`);\n return response.data;\n}\n\nexport async function createSku(\n profileId: string,\n payload: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.post<Record<string, unknown>>(\"/api/catalog/pvt/stockkeepingunit\", payload);\n return response.data;\n}\n\nexport async function updateSku(\n profileId: string,\n skuId: string,\n payload: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.put<Record<string, unknown>>(`/api/catalog/pvt/stockkeepingunit/${skuId}`, payload);\n return response.data;\n}\n\nexport function buildSkuUpdatePayload(\n current: Record<string, unknown>,\n updates: VtexSkuBasicFieldsInput\n): Record<string, unknown> {\n const payload = pickRecord(current, [\n \"ProductId\",\n \"IsActive\",\n \"ActivateIfPossible\",\n \"Name\",\n \"RefId\",\n \"PackagedHeight\",\n \"PackagedLength\",\n \"PackagedWidth\",\n \"PackagedWeightKg\",\n \"Height\",\n \"Length\",\n \"Width\",\n \"WeightKg\",\n \"CubicWeight\",\n \"IsKit\",\n \"CreationDate\",\n \"RewardValue\",\n \"EstimatedDateArrival\",\n \"ManufacturerCode\",\n \"CommercialConditionId\",\n \"MeasurementUnit\",\n \"UnitMultiplier\",\n \"ModalType\",\n \"KitItensSellApart\",\n \"Videos\",\n ]);\n\n if (updates.name !== undefined) payload.Name = updates.name;\n if (updates.refId !== undefined) payload.RefId = updates.refId;\n if (updates.packagedHeight !== undefined) payload.PackagedHeight = updates.packagedHeight;\n if (updates.packagedLength !== undefined) payload.PackagedLength = updates.packagedLength;\n if (updates.packagedWidth !== undefined) payload.PackagedWidth = updates.packagedWidth;\n if (updates.packagedWeightKg !== undefined) payload.PackagedWeightKg = updates.packagedWeightKg;\n if (updates.height !== undefined) payload.Height = updates.height;\n if (updates.length !== undefined) payload.Length = updates.length;\n if (updates.width !== undefined) payload.Width = updates.width;\n if (updates.weightKg !== undefined) payload.WeightKg = updates.weightKg;\n if (updates.measurementUnit !== undefined) payload.MeasurementUnit = updates.measurementUnit;\n if (updates.unitMultiplier !== undefined) payload.UnitMultiplier = updates.unitMultiplier;\n if (updates.manufacturerCode !== undefined) payload.ManufacturerCode = updates.manufacturerCode;\n if (updates.commercialConditionId !== undefined) {\n payload.CommercialConditionId = updates.commercialConditionId;\n }\n if (updates.isActive !== undefined) payload.IsActive = updates.isActive;\n if (updates.activateIfPossible !== undefined) {\n payload.ActivateIfPossible = updates.activateIfPossible;\n }\n\n return payload;\n}\n\nexport async function getSkuEans(profileId: string, skuId: string): Promise<string[]> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(`/api/catalog/pvt/stockkeepingunit/${skuId}/ean`);\n const data = response.data;\n\n if (Array.isArray(data)) {\n return data.map((item) => String(item)).filter(Boolean);\n }\n\n if (data == null) {\n return [];\n }\n\n return [String(data)];\n}\n\nexport async function createSkuEan(\n profileId: string,\n skuId: string,\n ean: string\n): Promise<void> {\n const { vtexApi } = await getVtexApiClients(profileId);\n await vtexApi.post(`/api/catalog/pvt/stockkeepingunit/${skuId}/ean/${ean}`);\n}\n\nexport async function deleteAllSkuEans(profileId: string, skuId: string): Promise<void> {\n const { vtexApi } = await getVtexApiClients(profileId);\n await vtexApi.delete(`/api/catalog/pvt/stockkeepingunit/${skuId}/ean`);\n}\n\nexport async function createBrand(\n profileId: string,\n payload: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.post<Record<string, unknown>>(\"/api/catalog/pvt/brand\", payload);\n return response.data;\n}\n\nexport async function getBrand(profileId: string, brandId: string): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<Record<string, unknown>>(`/api/catalog/pvt/brand/${brandId}`);\n return response.data;\n}\n\nexport async function createCategory(\n profileId: string,\n payload: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.post<Record<string, unknown>>(\"/api/catalog/pvt/category\", payload);\n return response.data;\n}\n\nexport async function getCategory(\n profileId: string,\n categoryId: string\n): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<Record<string, unknown>>(`/api/catalog/pvt/category/${categoryId}`);\n return response.data;\n}\n\nexport async function createSpecification(\n profileId: string,\n payload: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.post<Record<string, unknown>>(\"/api/catalog/pvt/specification\", payload);\n return response.data;\n}\n\nexport async function createSpecificationValue(\n profileId: string,\n payload: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.post<Record<string, unknown>>(\n \"/api/catalog/pvt/specificationvalue\",\n payload\n );\n return response.data;\n}\n\nexport async function associateProductSpecification(\n profileId: string,\n productId: string,\n payload: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.post<Record<string, unknown>>(\n `/api/catalog/pvt/product/${productId}/specification`,\n payload\n );\n return response.data;\n}\n\nexport async function associateSkuSpecification(\n profileId: string,\n skuId: string,\n payload: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.post<Record<string, unknown>>(\n `/api/catalog/pvt/stockkeepingunit/${skuId}/specification`,\n payload\n );\n return response.data;\n}\n\nexport async function createSkuFile(\n profileId: string,\n skuId: string,\n payload: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.post<Record<string, unknown>>(\n `/api/catalog/pvt/stockkeepingunit/${skuId}/file`,\n payload\n );\n return response.data;\n}\n"],
|
|
4
|
+
"sourcesContent": ["import { getVtexApiClients } from \"./vtex-api.js\";\r\n\r\nexport interface VtexProductBasicFieldsInput {\r\n name?: string;\r\n categoryId?: number;\r\n brandId?: number;\r\n description?: string;\r\n descriptionShort?: string;\r\n title?: string;\r\n linkId?: string;\r\n refId?: string;\r\n isVisible?: boolean;\r\n isActive?: boolean;\r\n keyWords?: string;\r\n releaseDate?: string;\r\n metaTagDescription?: string;\r\n showWithoutStock?: boolean;\r\n}\r\n\r\nexport interface VtexSkuBasicFieldsInput {\r\n name?: string;\r\n refId?: string;\r\n ean?: string;\r\n packagedHeight?: number;\r\n packagedLength?: number;\r\n packagedWidth?: number;\r\n packagedWeightKg?: number;\r\n height?: number;\r\n length?: number;\r\n width?: number;\r\n weightKg?: number;\r\n measurementUnit?: string;\r\n unitMultiplier?: number;\r\n manufacturerCode?: string;\r\n commercialConditionId?: number;\r\n isActive?: boolean;\r\n activateIfPossible?: boolean;\r\n}\r\n\r\nfunction pickRecord(source: Record<string, unknown>, keys: string[]): Record<string, unknown> {\r\n const picked: Record<string, unknown> = {};\r\n for (const key of keys) {\r\n if (key in source) {\r\n picked[key] = source[key];\r\n }\r\n }\r\n return picked;\r\n}\r\n\r\nexport async function getProduct(profileId: string, productId: string): Promise<Record<string, unknown>> {\r\n const { vtexApi } = await getVtexApiClients(profileId);\r\n const response = await vtexApi.get<Record<string, unknown>>(`/api/catalog/pvt/product/${productId}`);\r\n return response.data;\r\n}\r\n\r\nexport async function createProduct(\r\n profileId: string,\r\n payload: Record<string, unknown>\r\n): Promise<Record<string, unknown>> {\r\n const { vtexApi } = await getVtexApiClients(profileId);\r\n const response = await vtexApi.post<Record<string, unknown>>(\"/api/catalog/pvt/product\", payload);\r\n return response.data;\r\n}\r\n\r\nexport async function updateProduct(\r\n profileId: string,\r\n productId: string,\r\n payload: Record<string, unknown>\r\n): Promise<Record<string, unknown>> {\r\n const { vtexApi } = await getVtexApiClients(profileId);\r\n const response = await vtexApi.put<Record<string, unknown>>(`/api/catalog/pvt/product/${productId}`, payload);\r\n return response.data;\r\n}\r\n\r\nexport function buildProductUpdatePayload(\r\n current: Record<string, unknown>,\r\n updates: VtexProductBasicFieldsInput\r\n): Record<string, unknown> {\r\n const payload = pickRecord(current, [\r\n \"Name\",\r\n \"DepartmentId\",\r\n \"CategoryId\",\r\n \"BrandId\",\r\n \"LinkId\",\r\n \"RefId\",\r\n \"IsVisible\",\r\n \"Description\",\r\n \"DescriptionShort\",\r\n \"ReleaseDate\",\r\n \"KeyWords\",\r\n \"Title\",\r\n \"IsActive\",\r\n \"TaxCode\",\r\n \"MetaTagDescription\",\r\n \"SupplierId\",\r\n \"ShowWithoutStock\",\r\n \"AdWordsRemarketingCode\",\r\n \"LomadeeCampaignCode\",\r\n \"Score\",\r\n ]);\r\n\r\n if (updates.name !== undefined) payload.Name = updates.name;\r\n if (updates.categoryId !== undefined) payload.CategoryId = updates.categoryId;\r\n if (updates.brandId !== undefined) payload.BrandId = updates.brandId;\r\n if (updates.description !== undefined) payload.Description = updates.description;\r\n if (updates.descriptionShort !== undefined) payload.DescriptionShort = updates.descriptionShort;\r\n if (updates.title !== undefined) payload.Title = updates.title;\r\n if (updates.linkId !== undefined) payload.LinkId = updates.linkId;\r\n if (updates.refId !== undefined) payload.RefId = updates.refId;\r\n if (updates.isVisible !== undefined) payload.IsVisible = updates.isVisible;\r\n if (updates.isActive !== undefined) payload.IsActive = updates.isActive;\r\n if (updates.keyWords !== undefined) payload.KeyWords = updates.keyWords;\r\n if (updates.releaseDate !== undefined) payload.ReleaseDate = updates.releaseDate;\r\n if (updates.metaTagDescription !== undefined) {\r\n payload.MetaTagDescription = updates.metaTagDescription;\r\n }\r\n if (updates.showWithoutStock !== undefined) {\r\n payload.ShowWithoutStock = updates.showWithoutStock;\r\n }\r\n\r\n return payload;\r\n}\r\n\r\nexport async function getSku(profileId: string, skuId: string): Promise<Record<string, unknown>> {\r\n const { vtexApi } = await getVtexApiClients(profileId);\r\n const response = await vtexApi.get<Record<string, unknown>>(`/api/catalog/pvt/stockkeepingunit/${skuId}`);\r\n return response.data;\r\n}\r\n\r\nexport async function createSku(\r\n profileId: string,\r\n payload: Record<string, unknown>\r\n): Promise<Record<string, unknown>> {\r\n const { vtexApi } = await getVtexApiClients(profileId);\r\n const response = await vtexApi.post<Record<string, unknown>>(\"/api/catalog/pvt/stockkeepingunit\", payload);\r\n return response.data;\r\n}\r\n\r\nexport async function updateSku(\r\n profileId: string,\r\n skuId: string,\r\n payload: Record<string, unknown>\r\n): Promise<Record<string, unknown>> {\r\n const { vtexApi } = await getVtexApiClients(profileId);\r\n const response = await vtexApi.put<Record<string, unknown>>(`/api/catalog/pvt/stockkeepingunit/${skuId}`, payload);\r\n return response.data;\r\n}\r\n\r\nexport function buildSkuUpdatePayload(\r\n current: Record<string, unknown>,\r\n updates: VtexSkuBasicFieldsInput\r\n): Record<string, unknown> {\r\n const payload = pickRecord(current, [\r\n \"ProductId\",\r\n \"IsActive\",\r\n \"ActivateIfPossible\",\r\n \"Name\",\r\n \"RefId\",\r\n \"PackagedHeight\",\r\n \"PackagedLength\",\r\n \"PackagedWidth\",\r\n \"PackagedWeightKg\",\r\n \"Height\",\r\n \"Length\",\r\n \"Width\",\r\n \"WeightKg\",\r\n \"CubicWeight\",\r\n \"IsKit\",\r\n \"CreationDate\",\r\n \"RewardValue\",\r\n \"EstimatedDateArrival\",\r\n \"ManufacturerCode\",\r\n \"CommercialConditionId\",\r\n \"MeasurementUnit\",\r\n \"UnitMultiplier\",\r\n \"ModalType\",\r\n \"KitItensSellApart\",\r\n \"Videos\",\r\n ]);\r\n\r\n if (updates.name !== undefined) payload.Name = updates.name;\r\n if (updates.refId !== undefined) payload.RefId = updates.refId;\r\n if (updates.packagedHeight !== undefined) payload.PackagedHeight = updates.packagedHeight;\r\n if (updates.packagedLength !== undefined) payload.PackagedLength = updates.packagedLength;\r\n if (updates.packagedWidth !== undefined) payload.PackagedWidth = updates.packagedWidth;\r\n if (updates.packagedWeightKg !== undefined) payload.PackagedWeightKg = updates.packagedWeightKg;\r\n if (updates.height !== undefined) payload.Height = updates.height;\r\n if (updates.length !== undefined) payload.Length = updates.length;\r\n if (updates.width !== undefined) payload.Width = updates.width;\r\n if (updates.weightKg !== undefined) payload.WeightKg = updates.weightKg;\r\n if (updates.measurementUnit !== undefined) payload.MeasurementUnit = updates.measurementUnit;\r\n if (updates.unitMultiplier !== undefined) payload.UnitMultiplier = updates.unitMultiplier;\r\n if (updates.manufacturerCode !== undefined) payload.ManufacturerCode = updates.manufacturerCode;\r\n if (updates.commercialConditionId !== undefined) {\r\n payload.CommercialConditionId = updates.commercialConditionId;\r\n }\r\n if (updates.isActive !== undefined) payload.IsActive = updates.isActive;\r\n if (updates.activateIfPossible !== undefined) {\r\n payload.ActivateIfPossible = updates.activateIfPossible;\r\n }\r\n\r\n return payload;\r\n}\r\n\r\nexport async function getSkuEans(profileId: string, skuId: string): Promise<string[]> {\r\n const { vtexApi } = await getVtexApiClients(profileId);\r\n const response = await vtexApi.get<unknown>(`/api/catalog/pvt/stockkeepingunit/${skuId}/ean`);\r\n const data = response.data;\r\n\r\n if (Array.isArray(data)) {\r\n return data.map((item) => String(item)).filter(Boolean);\r\n }\r\n\r\n if (data == null) {\r\n return [];\r\n }\r\n\r\n return [String(data)];\r\n}\r\n\r\nexport async function createSkuEan(\r\n profileId: string,\r\n skuId: string,\r\n ean: string\r\n): Promise<void> {\r\n const { vtexApi } = await getVtexApiClients(profileId);\r\n await vtexApi.post(`/api/catalog/pvt/stockkeepingunit/${skuId}/ean/${ean}`);\r\n}\r\n\r\nexport async function deleteAllSkuEans(profileId: string, skuId: string): Promise<void> {\r\n const { vtexApi } = await getVtexApiClients(profileId);\r\n await vtexApi.delete(`/api/catalog/pvt/stockkeepingunit/${skuId}/ean`);\r\n}\r\n\r\nexport async function createBrand(\r\n profileId: string,\r\n payload: Record<string, unknown>\r\n): Promise<Record<string, unknown>> {\r\n const { vtexApi } = await getVtexApiClients(profileId);\r\n const response = await vtexApi.post<Record<string, unknown>>(\"/api/catalog/pvt/brand\", payload);\r\n return response.data;\r\n}\r\n\r\nexport async function getBrand(profileId: string, brandId: string): Promise<Record<string, unknown>> {\r\n const { vtexApi } = await getVtexApiClients(profileId);\r\n const response = await vtexApi.get<Record<string, unknown>>(`/api/catalog/pvt/brand/${brandId}`);\r\n return response.data;\r\n}\r\n\r\nexport async function createCategory(\r\n profileId: string,\r\n payload: Record<string, unknown>\r\n): Promise<Record<string, unknown>> {\r\n const { vtexApi } = await getVtexApiClients(profileId);\r\n const response = await vtexApi.post<Record<string, unknown>>(\"/api/catalog/pvt/category\", payload);\r\n return response.data;\r\n}\r\n\r\nexport async function getCategory(\r\n profileId: string,\r\n categoryId: string\r\n): Promise<Record<string, unknown>> {\r\n const { vtexApi } = await getVtexApiClients(profileId);\r\n const response = await vtexApi.get<Record<string, unknown>>(`/api/catalog/pvt/category/${categoryId}`);\r\n return response.data;\r\n}\r\n\r\nexport async function createSpecification(\r\n profileId: string,\r\n payload: Record<string, unknown>\r\n): Promise<Record<string, unknown>> {\r\n const { vtexApi } = await getVtexApiClients(profileId);\r\n const response = await vtexApi.post<Record<string, unknown>>(\"/api/catalog/pvt/specification\", payload);\r\n return response.data;\r\n}\r\n\r\nexport async function createSpecificationValue(\r\n profileId: string,\r\n payload: Record<string, unknown>\r\n): Promise<Record<string, unknown>> {\r\n const { vtexApi } = await getVtexApiClients(profileId);\r\n const response = await vtexApi.post<Record<string, unknown>>(\r\n \"/api/catalog/pvt/specificationvalue\",\r\n payload\r\n );\r\n return response.data;\r\n}\r\n\r\nexport async function associateProductSpecification(\r\n profileId: string,\r\n productId: string,\r\n payload: Record<string, unknown>\r\n): Promise<Record<string, unknown>> {\r\n const { vtexApi } = await getVtexApiClients(profileId);\r\n const response = await vtexApi.post<Record<string, unknown>>(\r\n `/api/catalog/pvt/product/${productId}/specification`,\r\n payload\r\n );\r\n return response.data;\r\n}\r\n\r\nexport async function associateSkuSpecification(\r\n profileId: string,\r\n skuId: string,\r\n payload: Record<string, unknown>\r\n): Promise<Record<string, unknown>> {\r\n const { vtexApi } = await getVtexApiClients(profileId);\r\n const response = await vtexApi.post<Record<string, unknown>>(\r\n `/api/catalog/pvt/stockkeepingunit/${skuId}/specification`,\r\n payload\r\n );\r\n return response.data;\r\n}\r\n\r\nexport async function createSkuFile(\r\n profileId: string,\r\n skuId: string,\r\n payload: Record<string, unknown>\r\n): Promise<Record<string, unknown>> {\r\n const { vtexApi } = await getVtexApiClients(profileId);\r\n const response = await vtexApi.post<Record<string, unknown>>(\r\n `/api/catalog/pvt/stockkeepingunit/${skuId}/file`,\r\n payload\r\n );\r\n return response.data;\r\n}\r\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/services/vtex/vtex-catalog.ts"],
|
|
4
|
-
"sourcesContent": ["import { getVtexApiClients } from \"./vtex-api.js\";\n\nexport type ProductOffersResponse = Record<string, unknown>[];\n\nexport async function getProductOffers(\n profileId: string,\n productId: string\n): Promise<ProductOffersResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<ProductOffersResponse>(\n `/api/catalog_system/pub/products/offers/${productId}`\n );\n\n return response.data;\n}\n\nexport async function getSkuOffers(\n profileId: string,\n productId: string,\n skuId: string\n): Promise<ProductOffersResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<ProductOffersResponse>(\n `/api/catalog_system/pub/products/offers/${productId}/sku/${skuId}`\n );\n\n return response.data;\n}\n"],
|
|
4
|
+
"sourcesContent": ["import { getVtexApiClients } from \"./vtex-api.js\";\r\n\r\nexport type ProductOffersResponse = Record<string, unknown>[];\r\n\r\nexport async function getProductOffers(\r\n profileId: string,\r\n productId: string\r\n): Promise<ProductOffersResponse> {\r\n const { vtexApi } = await getVtexApiClients(profileId);\r\n const response = await vtexApi.get<ProductOffersResponse>(\r\n `/api/catalog_system/pub/products/offers/${productId}`\r\n );\r\n\r\n return response.data;\r\n}\r\n\r\nexport async function getSkuOffers(\r\n profileId: string,\r\n productId: string,\r\n skuId: string\r\n): Promise<ProductOffersResponse> {\r\n const { vtexApi } = await getVtexApiClients(profileId);\r\n const response = await vtexApi.get<ProductOffersResponse>(\r\n `/api/catalog_system/pub/products/offers/${productId}/sku/${skuId}`\r\n );\r\n\r\n return response.data;\r\n}\r\n"],
|
|
5
5
|
"mappings": "AAAA,SAAS,yBAAyB;AAIlC,eAAsB,iBACpB,WACA,WACgC;AAChC,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,2CAA2C,SAAS;AAAA,EACtD;AAEA,SAAO,SAAS;AAClB;AAEA,eAAsB,aACpB,WACA,WACA,OACgC;AAChC,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,2CAA2C,SAAS,QAAQ,KAAK;AAAA,EACnE;AAEA,SAAO,SAAS;AAClB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|