@shopify/shopify-api 13.1.0 → 14.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/lib/auth/oauth/create-session.js +1 -1
- package/dist/cjs/lib/auth/oauth/create-session.js.map +1 -1
- package/dist/cjs/lib/auth/oauth/oauth.js +4 -1
- package/dist/cjs/lib/auth/oauth/oauth.js.map +1 -1
- package/dist/cjs/lib/billing/types.js.map +1 -1
- package/dist/cjs/lib/clients/common.js +64 -8
- package/dist/cjs/lib/clients/common.js.map +1 -1
- package/dist/cjs/lib/config.js +2 -2
- package/dist/cjs/lib/config.js.map +1 -1
- package/dist/cjs/lib/types.js +1 -1
- package/dist/cjs/lib/types.js.map +1 -1
- package/dist/cjs/lib/utils/fetch-request.js +12 -1
- package/dist/cjs/lib/utils/fetch-request.js.map +1 -1
- package/dist/cjs/lib/utils/hmac-validator.js +53 -7
- package/dist/cjs/lib/utils/hmac-validator.js.map +1 -1
- package/dist/cjs/lib/utils/processed-query.js +1 -1
- package/dist/cjs/lib/utils/processed-query.js.map +1 -1
- package/dist/cjs/lib/version.js +1 -1
- package/dist/cjs/lib/version.js.map +1 -1
- package/dist/cjs/lib/webhooks/process.js +2 -2
- package/dist/cjs/lib/webhooks/process.js.map +1 -1
- package/dist/cjs/lib/webhooks/register.js +0 -4
- package/dist/cjs/lib/webhooks/register.js.map +1 -1
- package/dist/cjs/lib/webhooks/types.js +0 -1
- package/dist/cjs/lib/webhooks/types.js.map +1 -1
- package/dist/cjs/lib/webhooks/validate.js +0 -3
- package/dist/cjs/lib/webhooks/validate.js.map +1 -1
- package/dist/cjs/rest/admin/2026-07/abandoned_checkout.js +85 -0
- package/dist/cjs/rest/admin/2026-07/abandoned_checkout.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/access_scope.js +36 -0
- package/dist/cjs/rest/admin/2026-07/access_scope.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/apple_pay_certificate.js +62 -0
- package/dist/cjs/rest/admin/2026-07/apple_pay_certificate.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/application_charge.js +56 -0
- package/dist/cjs/rest/admin/2026-07/application_charge.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/application_credit.js +50 -0
- package/dist/cjs/rest/admin/2026-07/application_credit.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/article.js +114 -0
- package/dist/cjs/rest/admin/2026-07/article.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/asset.js +57 -0
- package/dist/cjs/rest/admin/2026-07/asset.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/assigned_fulfillment_order.js +41 -0
- package/dist/cjs/rest/admin/2026-07/assigned_fulfillment_order.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/balance.js +34 -0
- package/dist/cjs/rest/admin/2026-07/balance.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/blog.js +83 -0
- package/dist/cjs/rest/admin/2026-07/blog.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/cancellation_request.js +52 -0
- package/dist/cjs/rest/admin/2026-07/cancellation_request.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/carrier_service.js +63 -0
- package/dist/cjs/rest/admin/2026-07/carrier_service.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/checkout.js +103 -0
- package/dist/cjs/rest/admin/2026-07/checkout.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/collect.js +74 -0
- package/dist/cjs/rest/admin/2026-07/collect.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/collection.js +59 -0
- package/dist/cjs/rest/admin/2026-07/collection.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/collection_listing.js +80 -0
- package/dist/cjs/rest/admin/2026-07/collection_listing.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/comment.js +135 -0
- package/dist/cjs/rest/admin/2026-07/comment.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/country.js +76 -0
- package/dist/cjs/rest/admin/2026-07/country.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/currency.js +35 -0
- package/dist/cjs/rest/admin/2026-07/currency.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/custom_collection.js +79 -0
- package/dist/cjs/rest/admin/2026-07/custom_collection.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/customer.js +150 -0
- package/dist/cjs/rest/admin/2026-07/customer.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/deprecated_api_call.js +35 -0
- package/dist/cjs/rest/admin/2026-07/deprecated_api_call.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/discount_code.js +115 -0
- package/dist/cjs/rest/admin/2026-07/discount_code.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/dispute.js +53 -0
- package/dist/cjs/rest/admin/2026-07/dispute.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/dispute_evidence.js +57 -0
- package/dist/cjs/rest/admin/2026-07/dispute_evidence.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/dispute_file_upload.js +45 -0
- package/dist/cjs/rest/admin/2026-07/dispute_file_upload.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/draft_order.js +126 -0
- package/dist/cjs/rest/admin/2026-07/draft_order.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/event.js +67 -0
- package/dist/cjs/rest/admin/2026-07/event.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/fulfillment.js +102 -0
- package/dist/cjs/rest/admin/2026-07/fulfillment.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/fulfillment_event.js +79 -0
- package/dist/cjs/rest/admin/2026-07/fulfillment_event.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/fulfillment_order.js +164 -0
- package/dist/cjs/rest/admin/2026-07/fulfillment_order.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/fulfillment_request.js +61 -0
- package/dist/cjs/rest/admin/2026-07/fulfillment_request.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/fulfillment_service.js +66 -0
- package/dist/cjs/rest/admin/2026-07/fulfillment_service.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/gift_card.js +105 -0
- package/dist/cjs/rest/admin/2026-07/gift_card.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/gift_card_adjustment.js +58 -0
- package/dist/cjs/rest/admin/2026-07/gift_card_adjustment.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/image.js +77 -0
- package/dist/cjs/rest/admin/2026-07/image.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/index.js +155 -0
- package/dist/cjs/rest/admin/2026-07/index.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/inventory_item.js +54 -0
- package/dist/cjs/rest/admin/2026-07/inventory_item.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/inventory_level.js +87 -0
- package/dist/cjs/rest/admin/2026-07/inventory_level.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/location.js +85 -0
- package/dist/cjs/rest/admin/2026-07/location.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/locations_for_move.js +34 -0
- package/dist/cjs/rest/admin/2026-07/locations_for_move.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/marketing_event.js +98 -0
- package/dist/cjs/rest/admin/2026-07/marketing_event.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/metafield.js +154 -0
- package/dist/cjs/rest/admin/2026-07/metafield.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/mobile_platform_application.js +63 -0
- package/dist/cjs/rest/admin/2026-07/mobile_platform_application.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/order.js +202 -0
- package/dist/cjs/rest/admin/2026-07/order.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/order_risk.js +68 -0
- package/dist/cjs/rest/admin/2026-07/order_risk.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/page.js +83 -0
- package/dist/cjs/rest/admin/2026-07/page.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/payment.js +46 -0
- package/dist/cjs/rest/admin/2026-07/payment.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/payment_gateway.js +72 -0
- package/dist/cjs/rest/admin/2026-07/payment_gateway.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/payment_transaction.js +56 -0
- package/dist/cjs/rest/admin/2026-07/payment_transaction.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/payout.js +47 -0
- package/dist/cjs/rest/admin/2026-07/payout.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/policy.js +39 -0
- package/dist/cjs/rest/admin/2026-07/policy.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/price_rule.js +97 -0
- package/dist/cjs/rest/admin/2026-07/price_rule.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/product.js +89 -0
- package/dist/cjs/rest/admin/2026-07/product.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/product_listing.js +99 -0
- package/dist/cjs/rest/admin/2026-07/product_listing.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/product_resource_feedback.js +46 -0
- package/dist/cjs/rest/admin/2026-07/product_resource_feedback.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/province.js +65 -0
- package/dist/cjs/rest/admin/2026-07/province.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/recurring_application_charge.js +87 -0
- package/dist/cjs/rest/admin/2026-07/recurring_application_charge.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/redirect.js +71 -0
- package/dist/cjs/rest/admin/2026-07/redirect.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/refund.js +72 -0
- package/dist/cjs/rest/admin/2026-07/refund.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/resource_feedback.js +41 -0
- package/dist/cjs/rest/admin/2026-07/resource_feedback.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/script_tag.js +75 -0
- package/dist/cjs/rest/admin/2026-07/script_tag.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/shipping_zone.js +47 -0
- package/dist/cjs/rest/admin/2026-07/shipping_zone.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/shop.js +96 -0
- package/dist/cjs/rest/admin/2026-07/shop.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/smart_collection.js +93 -0
- package/dist/cjs/rest/admin/2026-07/smart_collection.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/storefront_access_token.js +50 -0
- package/dist/cjs/rest/admin/2026-07/storefront_access_token.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/tender_transaction.js +43 -0
- package/dist/cjs/rest/admin/2026-07/tender_transaction.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/theme.js +64 -0
- package/dist/cjs/rest/admin/2026-07/theme.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/transaction.js +83 -0
- package/dist/cjs/rest/admin/2026-07/transaction.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/usage_charge.js +53 -0
- package/dist/cjs/rest/admin/2026-07/usage_charge.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/user.js +69 -0
- package/dist/cjs/rest/admin/2026-07/user.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/variant.js +96 -0
- package/dist/cjs/rest/admin/2026-07/variant.js.map +1 -0
- package/dist/cjs/rest/admin/2026-07/webhook.js +78 -0
- package/dist/cjs/rest/admin/2026-07/webhook.js.map +1 -0
- package/dist/cjs/runtime/crypto/utils.js.map +1 -1
- package/dist/cjs/tsconfig.build.tsbuildinfo +1 -1
- package/dist/esm/lib/auth/oauth/create-session.mjs +1 -1
- package/dist/esm/lib/auth/oauth/create-session.mjs.map +1 -1
- package/dist/esm/lib/auth/oauth/oauth.mjs +4 -1
- package/dist/esm/lib/auth/oauth/oauth.mjs.map +1 -1
- package/dist/esm/lib/billing/types.mjs.map +1 -1
- package/dist/esm/lib/clients/common.mjs +64 -8
- package/dist/esm/lib/clients/common.mjs.map +1 -1
- package/dist/esm/lib/config.mjs +2 -2
- package/dist/esm/lib/config.mjs.map +1 -1
- package/dist/esm/lib/types.mjs +1 -1
- package/dist/esm/lib/types.mjs.map +1 -1
- package/dist/esm/lib/utils/fetch-request.mjs +12 -1
- package/dist/esm/lib/utils/fetch-request.mjs.map +1 -1
- package/dist/esm/lib/utils/hmac-validator.mjs +53 -7
- package/dist/esm/lib/utils/hmac-validator.mjs.map +1 -1
- package/dist/esm/lib/utils/processed-query.mjs +1 -1
- package/dist/esm/lib/utils/processed-query.mjs.map +1 -1
- package/dist/esm/lib/version.mjs +1 -1
- package/dist/esm/lib/version.mjs.map +1 -1
- package/dist/esm/lib/webhooks/process.mjs +2 -2
- package/dist/esm/lib/webhooks/process.mjs.map +1 -1
- package/dist/esm/lib/webhooks/register.mjs +0 -4
- package/dist/esm/lib/webhooks/register.mjs.map +1 -1
- package/dist/esm/lib/webhooks/types.mjs +0 -1
- package/dist/esm/lib/webhooks/types.mjs.map +1 -1
- package/dist/esm/lib/webhooks/validate.mjs +0 -3
- package/dist/esm/lib/webhooks/validate.mjs.map +1 -1
- package/dist/esm/rest/admin/2026-07/abandoned_checkout.mjs +83 -0
- package/dist/esm/rest/admin/2026-07/abandoned_checkout.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/access_scope.mjs +34 -0
- package/dist/esm/rest/admin/2026-07/access_scope.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/apple_pay_certificate.mjs +60 -0
- package/dist/esm/rest/admin/2026-07/apple_pay_certificate.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/application_charge.mjs +54 -0
- package/dist/esm/rest/admin/2026-07/application_charge.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/application_credit.mjs +48 -0
- package/dist/esm/rest/admin/2026-07/application_credit.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/article.mjs +112 -0
- package/dist/esm/rest/admin/2026-07/article.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/asset.mjs +55 -0
- package/dist/esm/rest/admin/2026-07/asset.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/assigned_fulfillment_order.mjs +39 -0
- package/dist/esm/rest/admin/2026-07/assigned_fulfillment_order.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/balance.mjs +32 -0
- package/dist/esm/rest/admin/2026-07/balance.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/blog.mjs +81 -0
- package/dist/esm/rest/admin/2026-07/blog.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/cancellation_request.mjs +50 -0
- package/dist/esm/rest/admin/2026-07/cancellation_request.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/carrier_service.mjs +61 -0
- package/dist/esm/rest/admin/2026-07/carrier_service.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/checkout.mjs +101 -0
- package/dist/esm/rest/admin/2026-07/checkout.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/collect.mjs +72 -0
- package/dist/esm/rest/admin/2026-07/collect.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/collection.mjs +57 -0
- package/dist/esm/rest/admin/2026-07/collection.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/collection_listing.mjs +78 -0
- package/dist/esm/rest/admin/2026-07/collection_listing.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/comment.mjs +133 -0
- package/dist/esm/rest/admin/2026-07/comment.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/country.mjs +74 -0
- package/dist/esm/rest/admin/2026-07/country.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/currency.mjs +33 -0
- package/dist/esm/rest/admin/2026-07/currency.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/custom_collection.mjs +77 -0
- package/dist/esm/rest/admin/2026-07/custom_collection.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/customer.mjs +148 -0
- package/dist/esm/rest/admin/2026-07/customer.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/deprecated_api_call.mjs +33 -0
- package/dist/esm/rest/admin/2026-07/deprecated_api_call.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/discount_code.mjs +113 -0
- package/dist/esm/rest/admin/2026-07/discount_code.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/dispute.mjs +51 -0
- package/dist/esm/rest/admin/2026-07/dispute.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/dispute_evidence.mjs +55 -0
- package/dist/esm/rest/admin/2026-07/dispute_evidence.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/dispute_file_upload.mjs +43 -0
- package/dist/esm/rest/admin/2026-07/dispute_file_upload.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/draft_order.mjs +124 -0
- package/dist/esm/rest/admin/2026-07/draft_order.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/event.mjs +65 -0
- package/dist/esm/rest/admin/2026-07/event.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/fulfillment.mjs +100 -0
- package/dist/esm/rest/admin/2026-07/fulfillment.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/fulfillment_event.mjs +77 -0
- package/dist/esm/rest/admin/2026-07/fulfillment_event.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/fulfillment_order.mjs +162 -0
- package/dist/esm/rest/admin/2026-07/fulfillment_order.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/fulfillment_request.mjs +59 -0
- package/dist/esm/rest/admin/2026-07/fulfillment_request.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/fulfillment_service.mjs +64 -0
- package/dist/esm/rest/admin/2026-07/fulfillment_service.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/gift_card.mjs +103 -0
- package/dist/esm/rest/admin/2026-07/gift_card.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/gift_card_adjustment.mjs +56 -0
- package/dist/esm/rest/admin/2026-07/gift_card_adjustment.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/image.mjs +75 -0
- package/dist/esm/rest/admin/2026-07/image.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/index.mjs +153 -0
- package/dist/esm/rest/admin/2026-07/index.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/inventory_item.mjs +52 -0
- package/dist/esm/rest/admin/2026-07/inventory_item.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/inventory_level.mjs +85 -0
- package/dist/esm/rest/admin/2026-07/inventory_level.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/location.mjs +83 -0
- package/dist/esm/rest/admin/2026-07/location.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/locations_for_move.mjs +32 -0
- package/dist/esm/rest/admin/2026-07/locations_for_move.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/marketing_event.mjs +96 -0
- package/dist/esm/rest/admin/2026-07/marketing_event.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/metafield.mjs +152 -0
- package/dist/esm/rest/admin/2026-07/metafield.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/mobile_platform_application.mjs +61 -0
- package/dist/esm/rest/admin/2026-07/mobile_platform_application.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/order.mjs +200 -0
- package/dist/esm/rest/admin/2026-07/order.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/order_risk.mjs +66 -0
- package/dist/esm/rest/admin/2026-07/order_risk.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/page.mjs +81 -0
- package/dist/esm/rest/admin/2026-07/page.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/payment.mjs +44 -0
- package/dist/esm/rest/admin/2026-07/payment.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/payment_gateway.mjs +70 -0
- package/dist/esm/rest/admin/2026-07/payment_gateway.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/payment_transaction.mjs +54 -0
- package/dist/esm/rest/admin/2026-07/payment_transaction.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/payout.mjs +45 -0
- package/dist/esm/rest/admin/2026-07/payout.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/policy.mjs +37 -0
- package/dist/esm/rest/admin/2026-07/policy.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/price_rule.mjs +95 -0
- package/dist/esm/rest/admin/2026-07/price_rule.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/product.mjs +87 -0
- package/dist/esm/rest/admin/2026-07/product.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/product_listing.mjs +97 -0
- package/dist/esm/rest/admin/2026-07/product_listing.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/product_resource_feedback.mjs +44 -0
- package/dist/esm/rest/admin/2026-07/product_resource_feedback.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/province.mjs +63 -0
- package/dist/esm/rest/admin/2026-07/province.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/recurring_application_charge.mjs +85 -0
- package/dist/esm/rest/admin/2026-07/recurring_application_charge.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/redirect.mjs +69 -0
- package/dist/esm/rest/admin/2026-07/redirect.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/refund.mjs +70 -0
- package/dist/esm/rest/admin/2026-07/refund.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/resource_feedback.mjs +39 -0
- package/dist/esm/rest/admin/2026-07/resource_feedback.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/script_tag.mjs +73 -0
- package/dist/esm/rest/admin/2026-07/script_tag.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/shipping_zone.mjs +45 -0
- package/dist/esm/rest/admin/2026-07/shipping_zone.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/shop.mjs +94 -0
- package/dist/esm/rest/admin/2026-07/shop.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/smart_collection.mjs +91 -0
- package/dist/esm/rest/admin/2026-07/smart_collection.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/storefront_access_token.mjs +48 -0
- package/dist/esm/rest/admin/2026-07/storefront_access_token.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/tender_transaction.mjs +41 -0
- package/dist/esm/rest/admin/2026-07/tender_transaction.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/theme.mjs +62 -0
- package/dist/esm/rest/admin/2026-07/theme.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/transaction.mjs +81 -0
- package/dist/esm/rest/admin/2026-07/transaction.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/usage_charge.mjs +51 -0
- package/dist/esm/rest/admin/2026-07/usage_charge.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/user.mjs +67 -0
- package/dist/esm/rest/admin/2026-07/user.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/variant.mjs +94 -0
- package/dist/esm/rest/admin/2026-07/variant.mjs.map +1 -0
- package/dist/esm/rest/admin/2026-07/webhook.mjs +76 -0
- package/dist/esm/rest/admin/2026-07/webhook.mjs.map +1 -0
- package/dist/esm/runtime/crypto/utils.mjs.map +1 -1
- package/dist/esm/tsconfig.build.tsbuildinfo +1 -1
- package/dist/ts/lib/auth/oauth/oauth.d.ts.map +1 -1
- package/dist/ts/lib/base-types.d.ts +28 -0
- package/dist/ts/lib/base-types.d.ts.map +1 -1
- package/dist/ts/lib/billing/types.d.ts.map +1 -1
- package/dist/ts/lib/clients/common.d.ts.map +1 -1
- package/dist/ts/lib/types.d.ts +1 -1
- package/dist/ts/lib/types.d.ts.map +1 -1
- package/dist/ts/lib/utils/fetch-request.d.ts.map +1 -1
- package/dist/ts/lib/utils/hmac-validator.d.ts +3 -1
- package/dist/ts/lib/utils/hmac-validator.d.ts.map +1 -1
- package/dist/ts/lib/utils/index.d.ts +1 -1
- package/dist/ts/lib/version.d.ts +1 -1
- package/dist/ts/lib/webhooks/register.d.ts.map +1 -1
- package/dist/ts/lib/webhooks/types.d.ts +1 -4
- package/dist/ts/lib/webhooks/types.d.ts.map +1 -1
- package/dist/ts/rest/admin/2026-07/abandoned_checkout.d.ts +90 -0
- package/dist/ts/rest/admin/2026-07/abandoned_checkout.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/access_scope.d.ts +30 -0
- package/dist/ts/rest/admin/2026-07/access_scope.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/apple_pay_certificate.d.ts +39 -0
- package/dist/ts/rest/admin/2026-07/apple_pay_certificate.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/application_charge.d.ts +46 -0
- package/dist/ts/rest/admin/2026-07/application_charge.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/application_credit.d.ts +40 -0
- package/dist/ts/rest/admin/2026-07/application_credit.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/article.d.ts +99 -0
- package/dist/ts/rest/admin/2026-07/article.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/asset.d.ts +49 -0
- package/dist/ts/rest/admin/2026-07/asset.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/assigned_fulfillment_order.d.ts +39 -0
- package/dist/ts/rest/admin/2026-07/assigned_fulfillment_order.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/balance.d.ts +28 -0
- package/dist/ts/rest/admin/2026-07/balance.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/blog.d.ts +60 -0
- package/dist/ts/rest/admin/2026-07/blog.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/cancellation_request.d.ts +36 -0
- package/dist/ts/rest/admin/2026-07/cancellation_request.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/carrier_service.d.ts +43 -0
- package/dist/ts/rest/admin/2026-07/carrier_service.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/checkout.d.ts +95 -0
- package/dist/ts/rest/admin/2026-07/checkout.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/collect.d.ts +51 -0
- package/dist/ts/rest/admin/2026-07/collect.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/collection.d.ts +46 -0
- package/dist/ts/rest/admin/2026-07/collection.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/collection_listing.d.ts +58 -0
- package/dist/ts/rest/admin/2026-07/collection_listing.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/comment.d.ts +103 -0
- package/dist/ts/rest/admin/2026-07/comment.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/country.d.ts +51 -0
- package/dist/ts/rest/admin/2026-07/country.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/currency.d.ts +27 -0
- package/dist/ts/rest/admin/2026-07/currency.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/custom_collection.d.ts +73 -0
- package/dist/ts/rest/admin/2026-07/custom_collection.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/customer.d.ts +121 -0
- package/dist/ts/rest/admin/2026-07/customer.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/deprecated_api_call.d.ts +29 -0
- package/dist/ts/rest/admin/2026-07/deprecated_api_call.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/discount_code.d.ts +76 -0
- package/dist/ts/rest/admin/2026-07/discount_code.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/dispute.d.ts +45 -0
- package/dist/ts/rest/admin/2026-07/dispute.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/dispute_evidence.d.ts +56 -0
- package/dist/ts/rest/admin/2026-07/dispute_evidence.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/dispute_file_upload.d.ts +35 -0
- package/dist/ts/rest/admin/2026-07/dispute_file_upload.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/draft_order.d.ts +116 -0
- package/dist/ts/rest/admin/2026-07/draft_order.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/event.d.ts +57 -0
- package/dist/ts/rest/admin/2026-07/event.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/fulfillment.d.ts +92 -0
- package/dist/ts/rest/admin/2026-07/fulfillment.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/fulfillment_event.d.ts +66 -0
- package/dist/ts/rest/admin/2026-07/fulfillment_event.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/fulfillment_order.d.ts +129 -0
- package/dist/ts/rest/admin/2026-07/fulfillment_order.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/fulfillment_request.d.ts +47 -0
- package/dist/ts/rest/admin/2026-07/fulfillment_request.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/fulfillment_service.d.ts +47 -0
- package/dist/ts/rest/admin/2026-07/fulfillment_service.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/gift_card.d.ts +83 -0
- package/dist/ts/rest/admin/2026-07/gift_card.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/gift_card_adjustment.d.ts +45 -0
- package/dist/ts/rest/admin/2026-07/gift_card_adjustment.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/image.d.ts +57 -0
- package/dist/ts/rest/admin/2026-07/image.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/index.d.ts +152 -0
- package/dist/ts/rest/admin/2026-07/index.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/inventory_item.d.ts +45 -0
- package/dist/ts/rest/admin/2026-07/inventory_item.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/inventory_level.d.ts +70 -0
- package/dist/ts/rest/admin/2026-07/inventory_level.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/location.d.ts +59 -0
- package/dist/ts/rest/admin/2026-07/location.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/locations_for_move.d.ts +29 -0
- package/dist/ts/rest/admin/2026-07/locations_for_move.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/marketing_event.d.ts +79 -0
- package/dist/ts/rest/admin/2026-07/marketing_event.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/metafield.d.ts +111 -0
- package/dist/ts/rest/admin/2026-07/metafield.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/mobile_platform_application.d.ts +43 -0
- package/dist/ts/rest/admin/2026-07/mobile_platform_application.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/order.d.ts +239 -0
- package/dist/ts/rest/admin/2026-07/order.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/order_risk.d.ts +49 -0
- package/dist/ts/rest/admin/2026-07/order_risk.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/page.d.ts +76 -0
- package/dist/ts/rest/admin/2026-07/page.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/payment.d.ts +43 -0
- package/dist/ts/rest/admin/2026-07/payment.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/payment_gateway.d.ts +52 -0
- package/dist/ts/rest/admin/2026-07/payment_gateway.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/payment_transaction.d.ts +51 -0
- package/dist/ts/rest/admin/2026-07/payment_transaction.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/payout.d.ts +41 -0
- package/dist/ts/rest/admin/2026-07/payout.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/policy.d.ts +31 -0
- package/dist/ts/rest/admin/2026-07/policy.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/price_rule.d.ts +90 -0
- package/dist/ts/rest/admin/2026-07/price_rule.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/product.d.ts +95 -0
- package/dist/ts/rest/admin/2026-07/product.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/product_listing.d.ts +73 -0
- package/dist/ts/rest/admin/2026-07/product_listing.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/product_resource_feedback.d.ts +36 -0
- package/dist/ts/rest/admin/2026-07/product_resource_feedback.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/province.d.ts +50 -0
- package/dist/ts/rest/admin/2026-07/province.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/recurring_application_charge.d.ts +65 -0
- package/dist/ts/rest/admin/2026-07/recurring_application_charge.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/redirect.d.ts +51 -0
- package/dist/ts/rest/admin/2026-07/redirect.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/refund.d.ts +73 -0
- package/dist/ts/rest/admin/2026-07/refund.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/resource_feedback.d.ts +32 -0
- package/dist/ts/rest/admin/2026-07/resource_feedback.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/script_tag.d.ts +57 -0
- package/dist/ts/rest/admin/2026-07/script_tag.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/shipping_zone.d.ts +45 -0
- package/dist/ts/rest/admin/2026-07/shipping_zone.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/shop.d.ts +82 -0
- package/dist/ts/rest/admin/2026-07/shop.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/smart_collection.d.ts +87 -0
- package/dist/ts/rest/admin/2026-07/smart_collection.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/storefront_access_token.d.ts +35 -0
- package/dist/ts/rest/admin/2026-07/storefront_access_token.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/tender_transaction.d.ts +43 -0
- package/dist/ts/rest/admin/2026-07/tender_transaction.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/theme.d.ts +46 -0
- package/dist/ts/rest/admin/2026-07/theme.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/transaction.d.ts +82 -0
- package/dist/ts/rest/admin/2026-07/transaction.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/usage_charge.d.ts +44 -0
- package/dist/ts/rest/admin/2026-07/usage_charge.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/user.d.ts +51 -0
- package/dist/ts/rest/admin/2026-07/user.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/variant.d.ts +78 -0
- package/dist/ts/rest/admin/2026-07/variant.d.ts.map +1 -0
- package/dist/ts/rest/admin/2026-07/webhook.d.ts +62 -0
- package/dist/ts/rest/admin/2026-07/webhook.d.ts.map +1 -0
- package/dist/ts/tsconfig.build.tsbuildinfo +1 -1
- package/lib/__test-helpers__/graphql-base-request.ts +1 -1
- package/lib/auth/oauth/create-session.ts +1 -1
- package/lib/auth/oauth/oauth.ts +5 -1
- package/lib/base-types.ts +28 -0
- package/lib/billing/types.ts +2 -4
- package/lib/clients/common.ts +91 -7
- package/lib/config.ts +2 -2
- package/lib/types.ts +1 -1
- package/lib/utils/fetch-request.ts +13 -1
- package/lib/utils/hmac-validator.ts +78 -8
- package/lib/utils/processed-query.ts +1 -1
- package/lib/version.ts +1 -1
- package/lib/webhooks/process.ts +1 -2
- package/lib/webhooks/register.ts +0 -5
- package/lib/webhooks/types.ts +1 -7
- package/lib/webhooks/validate.ts +0 -3
- package/package.json +10 -11
- package/rest/admin/2026-07/abandoned_checkout.ts +112 -0
- package/rest/admin/2026-07/access_scope.ts +48 -0
- package/rest/admin/2026-07/apple_pay_certificate.ts +97 -0
- package/rest/admin/2026-07/application_charge.ts +85 -0
- package/rest/admin/2026-07/application_credit.ts +77 -0
- package/rest/admin/2026-07/article.ts +237 -0
- package/rest/admin/2026-07/asset.ts +88 -0
- package/rest/admin/2026-07/assigned_fulfillment_order.ts +57 -0
- package/rest/admin/2026-07/balance.ts +46 -0
- package/rest/admin/2026-07/blog.ts +138 -0
- package/rest/admin/2026-07/cancellation_request.ts +78 -0
- package/rest/admin/2026-07/carrier_service.ts +96 -0
- package/rest/admin/2026-07/checkout.ts +139 -0
- package/rest/admin/2026-07/collect.ts +126 -0
- package/rest/admin/2026-07/collection.ts +88 -0
- package/rest/admin/2026-07/collection_listing.ts +131 -0
- package/rest/admin/2026-07/comment.ts +263 -0
- package/rest/admin/2026-07/country.ts +127 -0
- package/rest/admin/2026-07/currency.ts +47 -0
- package/rest/admin/2026-07/custom_collection.ts +163 -0
- package/rest/admin/2026-07/customer.ts +277 -0
- package/rest/admin/2026-07/deprecated_api_call.ts +47 -0
- package/rest/admin/2026-07/discount_code.ts +212 -0
- package/rest/admin/2026-07/dispute.ts +83 -0
- package/rest/admin/2026-07/dispute_evidence.ts +69 -0
- package/rest/admin/2026-07/dispute_file_upload.ts +59 -0
- package/rest/admin/2026-07/draft_order.ts +221 -0
- package/rest/admin/2026-07/event.ts +124 -0
- package/rest/admin/2026-07/fulfillment.ts +193 -0
- package/rest/admin/2026-07/fulfillment_event.ts +129 -0
- package/rest/admin/2026-07/fulfillment_order.ts +296 -0
- package/rest/admin/2026-07/fulfillment_request.ts +91 -0
- package/rest/admin/2026-07/fulfillment_service.ts +101 -0
- package/rest/admin/2026-07/gift_card.ts +187 -0
- package/rest/admin/2026-07/gift_card_adjustment.ts +86 -0
- package/rest/admin/2026-07/image.ts +137 -0
- package/rest/admin/2026-07/index.ts +228 -0
- package/rest/admin/2026-07/inventory_item.ts +80 -0
- package/rest/admin/2026-07/inventory_level.ts +173 -0
- package/rest/admin/2026-07/location.ts +133 -0
- package/rest/admin/2026-07/locations_for_move.ts +48 -0
- package/rest/admin/2026-07/marketing_event.ts +175 -0
- package/rest/admin/2026-07/metafield.ts +300 -0
- package/rest/admin/2026-07/mobile_platform_application.ts +96 -0
- package/rest/admin/2026-07/order.ts +338 -0
- package/rest/admin/2026-07/order_risk.ts +109 -0
- package/rest/admin/2026-07/page.ts +170 -0
- package/rest/admin/2026-07/payment.ts +60 -0
- package/rest/admin/2026-07/payment_gateway.ts +105 -0
- package/rest/admin/2026-07/payment_transaction.ts +79 -0
- package/rest/admin/2026-07/payout.ts +81 -0
- package/rest/admin/2026-07/policy.ts +51 -0
- package/rest/admin/2026-07/price_rule.ts +163 -0
- package/rest/admin/2026-07/product.ts +192 -0
- package/rest/admin/2026-07/product_listing.ts +167 -0
- package/rest/admin/2026-07/product_resource_feedback.ts +62 -0
- package/rest/admin/2026-07/province.ts +110 -0
- package/rest/admin/2026-07/recurring_application_charge.ts +138 -0
- package/rest/admin/2026-07/redirect.ts +131 -0
- package/rest/admin/2026-07/refund.ts +126 -0
- package/rest/admin/2026-07/resource_feedback.ts +53 -0
- package/rest/admin/2026-07/script_tag.ts +139 -0
- package/rest/admin/2026-07/shipping_zone.ts +62 -0
- package/rest/admin/2026-07/shop.ts +118 -0
- package/rest/admin/2026-07/smart_collection.ts +192 -0
- package/rest/admin/2026-07/storefront_access_token.ts +73 -0
- package/rest/admin/2026-07/tender_transaction.ts +67 -0
- package/rest/admin/2026-07/theme.ts +101 -0
- package/rest/admin/2026-07/transaction.ts +132 -0
- package/rest/admin/2026-07/usage_charge.ts +84 -0
- package/rest/admin/2026-07/user.ts +106 -0
- package/rest/admin/2026-07/variant.ts +156 -0
- package/rest/admin/2026-07/webhook.ts +146 -0
- package/runtime/crypto/utils.ts +1 -1
|
@@ -13,6 +13,12 @@ var types = require('./types.js');
|
|
|
13
13
|
var headers = require('../../runtime/http/headers.js');
|
|
14
14
|
|
|
15
15
|
const HMAC_TIMESTAMP_PERMITTED_CLOCK_TOLERANCE_SEC = 90;
|
|
16
|
+
const APP_PROXY_SINGLE_VALUE_PARAMS = new Set([
|
|
17
|
+
'hmac',
|
|
18
|
+
'shop',
|
|
19
|
+
'signature',
|
|
20
|
+
'timestamp',
|
|
21
|
+
]);
|
|
16
22
|
function stringifyQueryForAdmin(query) {
|
|
17
23
|
const processedQuery$1 = new processedQuery.default();
|
|
18
24
|
Object.keys(query)
|
|
@@ -29,7 +35,7 @@ function stringifyQueryForAppProxy(query) {
|
|
|
29
35
|
}
|
|
30
36
|
function generateLocalHmac(config) {
|
|
31
37
|
return async (params, signator = 'admin') => {
|
|
32
|
-
const { hmac, signature, ...query } = params;
|
|
38
|
+
const { hmac: _hmac, signature: _signature, ...query } = params;
|
|
33
39
|
const queryString = signator === 'admin'
|
|
34
40
|
? stringifyQueryForAdmin(query)
|
|
35
41
|
: stringifyQueryForAppProxy(query);
|
|
@@ -38,18 +44,48 @@ function generateLocalHmac(config) {
|
|
|
38
44
|
}
|
|
39
45
|
function validateHmac(config) {
|
|
40
46
|
return async (query, { signator } = { signator: 'admin' }) => {
|
|
41
|
-
|
|
47
|
+
const normalizedQuery = normalizeQuery(query, signator);
|
|
48
|
+
if (signator === 'admin' && !normalizedQuery.hmac) {
|
|
42
49
|
throw new error.InvalidHmacError('Query does not contain an HMAC value.');
|
|
43
50
|
}
|
|
44
|
-
if (signator === 'appProxy' && !
|
|
51
|
+
if (signator === 'appProxy' && !normalizedQuery.signature) {
|
|
45
52
|
throw new error.InvalidHmacError('Query does not contain a signature value.');
|
|
46
53
|
}
|
|
47
|
-
validateHmacTimestamp(
|
|
48
|
-
const hmac = signator === 'appProxy'
|
|
49
|
-
|
|
54
|
+
validateHmacTimestamp(normalizedQuery);
|
|
55
|
+
const hmac = signator === 'appProxy'
|
|
56
|
+
? normalizedQuery.signature
|
|
57
|
+
: normalizedQuery.hmac;
|
|
58
|
+
const localHmac = await generateLocalHmac(config)(normalizedQuery, signator);
|
|
50
59
|
return safeCompare.safeCompare(hmac, localHmac);
|
|
51
60
|
};
|
|
52
61
|
}
|
|
62
|
+
function normalizeQuery(query, signator) {
|
|
63
|
+
if (!(query instanceof URLSearchParams)) {
|
|
64
|
+
if (signator === 'appProxy') {
|
|
65
|
+
for (const key of APP_PROXY_SINGLE_VALUE_PARAMS) {
|
|
66
|
+
if (Array.isArray(query[key])) {
|
|
67
|
+
throw new error.InvalidHmacError(`Query parameter "${key}" must not appear more than once.`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return query;
|
|
72
|
+
}
|
|
73
|
+
const normalizedQuery = Object.create(null);
|
|
74
|
+
for (const [key, value] of query.entries()) {
|
|
75
|
+
const existingValue = normalizedQuery[key];
|
|
76
|
+
if (existingValue === undefined) {
|
|
77
|
+
normalizedQuery[key] = value;
|
|
78
|
+
}
|
|
79
|
+
else if (signator === 'appProxy' &&
|
|
80
|
+
APP_PROXY_SINGLE_VALUE_PARAMS.has(key)) {
|
|
81
|
+
throw new error.InvalidHmacError(`Query parameter "${key}" must not appear more than once.`);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
normalizedQuery[key] = `${existingValue},${value}`;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return normalizedQuery;
|
|
88
|
+
}
|
|
53
89
|
async function validateHmacString(config, data, hmac, format) {
|
|
54
90
|
const localHmac = await utils.createSHA256HMAC(config.apiSecretKey, data, format);
|
|
55
91
|
return safeCompare.safeCompare(hmac, localHmac);
|
|
@@ -79,7 +115,17 @@ function validateHmacFromRequestFactory(config) {
|
|
|
79
115
|
};
|
|
80
116
|
}
|
|
81
117
|
function validateHmacTimestamp(query) {
|
|
82
|
-
|
|
118
|
+
const { timestamp } = query;
|
|
119
|
+
if (timestamp === undefined ||
|
|
120
|
+
timestamp === null ||
|
|
121
|
+
Array.isArray(timestamp)) {
|
|
122
|
+
throw new error.InvalidHmacError('HMAC timestamp is missing or invalid');
|
|
123
|
+
}
|
|
124
|
+
const parsedTimestamp = Number(timestamp);
|
|
125
|
+
if (!Number.isInteger(parsedTimestamp)) {
|
|
126
|
+
throw new error.InvalidHmacError('HMAC timestamp is missing or invalid');
|
|
127
|
+
}
|
|
128
|
+
if (Math.abs(getCurrentTimeInSec() - parsedTimestamp) >
|
|
83
129
|
HMAC_TIMESTAMP_PERMITTED_CLOCK_TOLERANCE_SEC) {
|
|
84
130
|
throw new error.InvalidHmacError('HMAC timestamp is outside of the tolerance range');
|
|
85
131
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hmac-validator.js","sources":["../../../../../../lib/utils/hmac-validator.ts"],"sourcesContent":["import {logger} from '../logger';\nimport {ShopifyHeader} from '../types';\nimport {\n AdapterArgs,\n abstractConvertRequest,\n getHeader,\n} from '../../runtime/http';\nimport {ConfigInterface} from '../base-types';\nimport {createSHA256HMAC} from '../../runtime/crypto';\nimport {HashFormat} from '../../runtime/crypto/types';\nimport {AuthQuery} from '../auth/oauth/types';\nimport * as ShopifyErrors from '../error';\nimport {safeCompare} from '../auth/oauth/safe-compare';\nimport {WEBHOOK_HEADER_NAMES, WebhookTypeValue} from '../webhooks/types';\n\nimport ProcessedQuery from './processed-query';\nimport {\n ValidationErrorReason,\n ValidationInvalid,\n HmacValidationType,\n ValidationValid,\n ValidationErrorReasonType,\n} from './types';\n\nconst HMAC_TIMESTAMP_PERMITTED_CLOCK_TOLERANCE_SEC = 90;\n\nexport type HMACSignator = 'admin' | 'appProxy';\n\nexport interface ValidateParams extends AdapterArgs {\n /**\n * The type of validation to perform, either 'flow' or 'webhook'.\n */\n type: HmacValidationType;\n /**\n * The raw body of the request.\n */\n rawBody: string;\n /**\n * The webhook type for header selection (optional, only for webhooks).\n */\n webhookType?: WebhookTypeValue;\n}\n\nfunction stringifyQueryForAdmin(query: AuthQuery): string {\n const processedQuery = new ProcessedQuery();\n Object.keys(query)\n .sort((val1, val2) => val1.localeCompare(val2))\n .forEach((key: string) => processedQuery.put(key, query[key]));\n\n return processedQuery.stringify(true);\n}\n\nfunction stringifyQueryForAppProxy(query: AuthQuery): string {\n return Object.entries(query)\n .sort(([val1], [val2]) => val1.localeCompare(val2))\n .reduce((acc, [key, value]) => {\n return `${acc}${key}=${Array.isArray(value) ? value.join(',') : value}`;\n }, '');\n}\n\nexport function generateLocalHmac(config: ConfigInterface) {\n return async (\n params: AuthQuery,\n signator: HMACSignator = 'admin',\n ): Promise<string> => {\n const {hmac, signature, ...query} = params;\n\n const queryString =\n signator === 'admin'\n ? stringifyQueryForAdmin(query)\n : stringifyQueryForAppProxy(query);\n\n return createSHA256HMAC(config.apiSecretKey, queryString, HashFormat.Hex);\n };\n}\n\nexport function validateHmac(config: ConfigInterface) {\n return async (\n query: AuthQuery,\n {signator}: {signator: HMACSignator} = {signator: 'admin'},\n ): Promise<boolean> => {\n if (signator === 'admin' && !query.hmac) {\n throw new ShopifyErrors.InvalidHmacError(\n 'Query does not contain an HMAC value.',\n );\n }\n\n if (signator === 'appProxy' && !query.signature) {\n throw new ShopifyErrors.InvalidHmacError(\n 'Query does not contain a signature value.',\n );\n }\n\n validateHmacTimestamp(query);\n\n const hmac = signator === 'appProxy' ? query.signature : query.hmac;\n const localHmac = await generateLocalHmac(config)(query, signator);\n\n return safeCompare(hmac as string, localHmac);\n };\n}\n\nexport async function validateHmacString(\n config: ConfigInterface,\n data: string,\n hmac: string,\n format: HashFormat,\n) {\n const localHmac = await createSHA256HMAC(config.apiSecretKey, data, format);\n\n return safeCompare(hmac, localHmac);\n}\n\nexport function getCurrentTimeInSec() {\n return Math.trunc(Date.now() / 1000);\n}\n\nexport function validateHmacFromRequestFactory(config: ConfigInterface) {\n return async function validateHmacFromRequest({\n type,\n rawBody,\n webhookType,\n ...adapterArgs\n }: ValidateParams): Promise<ValidationInvalid | ValidationValid> {\n const request = await abstractConvertRequest(adapterArgs);\n if (!rawBody.length) {\n return fail(ValidationErrorReason.MissingBody, type, config);\n }\n\n // Use appropriate header based on webhook type\n const hmacHeaderName = webhookType\n ? WEBHOOK_HEADER_NAMES[webhookType].hmac\n : ShopifyHeader.Hmac;\n\n const hmac = getHeader(request.headers, hmacHeaderName);\n if (!hmac) {\n return fail(ValidationErrorReason.MissingHmac, type, config);\n }\n const validHmac = await validateHmacString(\n config,\n rawBody,\n hmac,\n HashFormat.Base64,\n );\n if (!validHmac) {\n return fail(ValidationErrorReason.InvalidHmac, type, config);\n }\n\n return succeed(type, config);\n };\n}\n\nfunction validateHmacTimestamp(query: AuthQuery) {\n if (\n Math.abs(getCurrentTimeInSec() - Number(query.timestamp)) >\n HMAC_TIMESTAMP_PERMITTED_CLOCK_TOLERANCE_SEC\n ) {\n throw new ShopifyErrors.InvalidHmacError(\n 'HMAC timestamp is outside of the tolerance range',\n );\n }\n}\n\nasync function fail(\n reason: ValidationErrorReasonType,\n type: HmacValidationType,\n config: ConfigInterface,\n): Promise<ValidationInvalid> {\n const log = logger(config);\n await log.debug(`${type} request is not valid`, {reason});\n\n return {\n valid: false,\n reason,\n };\n}\n\nasync function succeed(\n type: HmacValidationType,\n config: ConfigInterface,\n): Promise<ValidationValid> {\n const log = logger(config);\n await log.debug(`${type} request is valid`);\n\n return {\n valid: true,\n };\n}\n"],"names":["processedQuery","ProcessedQuery","createSHA256HMAC","HashFormat","ShopifyErrors.InvalidHmacError","safeCompare","abstractConvertRequest","ValidationErrorReason","WEBHOOK_HEADER_NAMES","ShopifyHeader","getHeader","logger"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hmac-validator.js","sources":["../../../../../../lib/utils/hmac-validator.ts"],"sourcesContent":["import {logger} from '../logger';\nimport {ShopifyHeader} from '../types';\nimport {\n AdapterArgs,\n abstractConvertRequest,\n getHeader,\n} from '../../runtime/http';\nimport {ConfigInterface} from '../base-types';\nimport {createSHA256HMAC} from '../../runtime/crypto';\nimport {HashFormat} from '../../runtime/crypto/types';\nimport {AuthQuery} from '../auth/oauth/types';\nimport * as ShopifyErrors from '../error';\nimport {safeCompare} from '../auth/oauth/safe-compare';\nimport {WEBHOOK_HEADER_NAMES, WebhookTypeValue} from '../webhooks/types';\n\nimport ProcessedQuery from './processed-query';\nimport {\n ValidationErrorReason,\n ValidationInvalid,\n HmacValidationType,\n ValidationValid,\n ValidationErrorReasonType,\n} from './types';\n\nconst HMAC_TIMESTAMP_PERMITTED_CLOCK_TOLERANCE_SEC = 90;\nconst APP_PROXY_SINGLE_VALUE_PARAMS = new Set([\n 'hmac',\n 'shop',\n 'signature',\n 'timestamp',\n]);\n\nexport type HMACSignator = 'admin' | 'appProxy';\ntype HmacQuery = AuthQuery | URLSearchParams;\n\nexport interface ValidateParams extends AdapterArgs {\n /**\n * The type of validation to perform, either 'flow' or 'webhook'.\n */\n type: HmacValidationType;\n /**\n * The raw body of the request.\n */\n rawBody: string;\n /**\n * The webhook type for header selection (optional, only for webhooks).\n */\n webhookType?: WebhookTypeValue;\n}\n\nfunction stringifyQueryForAdmin(query: AuthQuery): string {\n const processedQuery = new ProcessedQuery();\n Object.keys(query)\n .sort((val1, val2) => val1.localeCompare(val2))\n .forEach((key: string) => processedQuery.put(key, query[key]));\n\n return processedQuery.stringify(true);\n}\n\nfunction stringifyQueryForAppProxy(query: AuthQuery): string {\n return Object.entries(query)\n .sort(([val1], [val2]) => val1.localeCompare(val2))\n .reduce((acc, [key, value]) => {\n return `${acc}${key}=${Array.isArray(value) ? value.join(',') : value}`;\n }, '');\n}\n\nexport function generateLocalHmac(config: ConfigInterface) {\n return async (\n params: AuthQuery,\n signator: HMACSignator = 'admin',\n ): Promise<string> => {\n const {hmac: _hmac, signature: _signature, ...query} = params;\n\n const queryString =\n signator === 'admin'\n ? stringifyQueryForAdmin(query)\n : stringifyQueryForAppProxy(query);\n\n return createSHA256HMAC(config.apiSecretKey, queryString, HashFormat.Hex);\n };\n}\n\nexport function validateHmac(config: ConfigInterface) {\n return async (\n query: HmacQuery,\n {signator}: {signator: HMACSignator} = {signator: 'admin'},\n ): Promise<boolean> => {\n const normalizedQuery = normalizeQuery(query, signator);\n\n if (signator === 'admin' && !normalizedQuery.hmac) {\n throw new ShopifyErrors.InvalidHmacError(\n 'Query does not contain an HMAC value.',\n );\n }\n\n if (signator === 'appProxy' && !normalizedQuery.signature) {\n throw new ShopifyErrors.InvalidHmacError(\n 'Query does not contain a signature value.',\n );\n }\n\n validateHmacTimestamp(normalizedQuery);\n\n const hmac =\n signator === 'appProxy'\n ? normalizedQuery.signature\n : normalizedQuery.hmac;\n const localHmac = await generateLocalHmac(config)(\n normalizedQuery,\n signator,\n );\n\n return safeCompare(hmac as string, localHmac);\n };\n}\n\nfunction normalizeQuery(query: HmacQuery, signator: HMACSignator): AuthQuery {\n if (!(query instanceof URLSearchParams)) {\n if (signator === 'appProxy') {\n for (const key of APP_PROXY_SINGLE_VALUE_PARAMS) {\n if (Array.isArray(query[key])) {\n throw new ShopifyErrors.InvalidHmacError(\n `Query parameter \"${key}\" must not appear more than once.`,\n );\n }\n }\n }\n\n return query;\n }\n\n const normalizedQuery = Object.create(null) as AuthQuery;\n for (const [key, value] of query.entries()) {\n const existingValue = normalizedQuery[key];\n if (existingValue === undefined) {\n normalizedQuery[key] = value;\n } else if (\n signator === 'appProxy' &&\n APP_PROXY_SINGLE_VALUE_PARAMS.has(key)\n ) {\n throw new ShopifyErrors.InvalidHmacError(\n `Query parameter \"${key}\" must not appear more than once.`,\n );\n } else {\n normalizedQuery[key] = `${existingValue},${value}`;\n }\n }\n\n return normalizedQuery;\n}\n\nexport async function validateHmacString(\n config: ConfigInterface,\n data: string,\n hmac: string,\n format: HashFormat,\n) {\n const localHmac = await createSHA256HMAC(config.apiSecretKey, data, format);\n\n return safeCompare(hmac, localHmac);\n}\n\nexport function getCurrentTimeInSec() {\n return Math.trunc(Date.now() / 1000);\n}\n\nexport function validateHmacFromRequestFactory(config: ConfigInterface) {\n return async function validateHmacFromRequest({\n type,\n rawBody,\n webhookType,\n ...adapterArgs\n }: ValidateParams): Promise<ValidationInvalid | ValidationValid> {\n const request = await abstractConvertRequest(adapterArgs);\n if (!rawBody.length) {\n return fail(ValidationErrorReason.MissingBody, type, config);\n }\n\n // Use appropriate header based on webhook type\n const hmacHeaderName = webhookType\n ? WEBHOOK_HEADER_NAMES[webhookType].hmac\n : ShopifyHeader.Hmac;\n\n const hmac = getHeader(request.headers, hmacHeaderName);\n if (!hmac) {\n return fail(ValidationErrorReason.MissingHmac, type, config);\n }\n const validHmac = await validateHmacString(\n config,\n rawBody,\n hmac,\n HashFormat.Base64,\n );\n if (!validHmac) {\n return fail(ValidationErrorReason.InvalidHmac, type, config);\n }\n\n return succeed(type, config);\n };\n}\n\nfunction validateHmacTimestamp(query: AuthQuery) {\n const {timestamp} = query;\n\n if (\n timestamp === undefined ||\n timestamp === null ||\n Array.isArray(timestamp)\n ) {\n throw new ShopifyErrors.InvalidHmacError(\n 'HMAC timestamp is missing or invalid',\n );\n }\n\n const parsedTimestamp = Number(timestamp);\n\n if (!Number.isInteger(parsedTimestamp)) {\n throw new ShopifyErrors.InvalidHmacError(\n 'HMAC timestamp is missing or invalid',\n );\n }\n\n if (\n Math.abs(getCurrentTimeInSec() - parsedTimestamp) >\n HMAC_TIMESTAMP_PERMITTED_CLOCK_TOLERANCE_SEC\n ) {\n throw new ShopifyErrors.InvalidHmacError(\n 'HMAC timestamp is outside of the tolerance range',\n );\n }\n}\n\nasync function fail(\n reason: ValidationErrorReasonType,\n type: HmacValidationType,\n config: ConfigInterface,\n): Promise<ValidationInvalid> {\n const log = logger(config);\n await log.debug(`${type} request is not valid`, {reason});\n\n return {\n valid: false,\n reason,\n };\n}\n\nasync function succeed(\n type: HmacValidationType,\n config: ConfigInterface,\n): Promise<ValidationValid> {\n const log = logger(config);\n await log.debug(`${type} request is valid`);\n\n return {\n valid: true,\n };\n}\n"],"names":["processedQuery","ProcessedQuery","createSHA256HMAC","HashFormat","ShopifyErrors.InvalidHmacError","safeCompare","abstractConvertRequest","ValidationErrorReason","WEBHOOK_HEADER_NAMES","ShopifyHeader","getHeader","logger"],"mappings":";;;;;;;;;;;;;;AAwBA,MAAM,4CAA4C,GAAG,EAAE;AACvD,MAAM,6BAA6B,GAAG,IAAI,GAAG,CAAC;IAC5C,MAAM;IACN,MAAM;IACN,WAAW;IACX,WAAW;AACZ,CAAA,CAAC;AAoBF,SAAS,sBAAsB,CAAC,KAAgB,EAAA;AAC9C,IAAA,MAAMA,gBAAc,GAAG,IAAIC,sBAAc,EAAE;AAC3C,IAAA,MAAM,CAAC,IAAI,CAAC,KAAK;AACd,SAAA,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AAC7C,SAAA,OAAO,CAAC,CAAC,GAAW,KAAKD,gBAAc,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAEhE,IAAA,OAAOA,gBAAc,CAAC,SAAS,CAAC,IAAI,CAAC;AACvC;AAEA,SAAS,yBAAyB,CAAC,KAAgB,EAAA;AACjD,IAAA,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK;AACxB,SAAA,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;SACjD,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;QAC5B,OAAO,CAAA,EAAG,GAAG,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA,CAAE;IACzE,CAAC,EAAE,EAAE,CAAC;AACV;AAEM,SAAU,iBAAiB,CAAC,MAAuB,EAAA;AACvD,IAAA,OAAO,OACL,MAAiB,EACjB,QAAA,GAAyB,OAAO,KACb;AACnB,QAAA,MAAM,EAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,KAAK,EAAC,GAAG,MAAM;AAE7D,QAAA,MAAM,WAAW,GACf,QAAQ,KAAK;AACX,cAAE,sBAAsB,CAAC,KAAK;AAC9B,cAAE,yBAAyB,CAAC,KAAK,CAAC;AAEtC,QAAA,OAAOE,sBAAgB,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,EAAEC,kBAAU,CAAC,GAAG,CAAC;AAC3E,IAAA,CAAC;AACH;AAEM,SAAU,YAAY,CAAC,MAAuB,EAAA;AAClD,IAAA,OAAO,OACL,KAAgB,EAChB,EAAC,QAAQ,EAAA,GAA8B,EAAC,QAAQ,EAAE,OAAO,EAAC,KACtC;QACpB,MAAM,eAAe,GAAG,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC;QAEvD,IAAI,QAAQ,KAAK,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE;AACjD,YAAA,MAAM,IAAIC,sBAA8B,CACtC,uCAAuC,CACxC;QACH;QAEA,IAAI,QAAQ,KAAK,UAAU,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE;AACzD,YAAA,MAAM,IAAIA,sBAA8B,CACtC,2CAA2C,CAC5C;QACH;QAEA,qBAAqB,CAAC,eAAe,CAAC;AAEtC,QAAA,MAAM,IAAI,GACR,QAAQ,KAAK;cACT,eAAe,CAAC;AAClB,cAAE,eAAe,CAAC,IAAI;AAC1B,QAAA,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAC/C,eAAe,EACf,QAAQ,CACT;AAED,QAAA,OAAOC,uBAAW,CAAC,IAAc,EAAE,SAAS,CAAC;AAC/C,IAAA,CAAC;AACH;AAEA,SAAS,cAAc,CAAC,KAAgB,EAAE,QAAsB,EAAA;AAC9D,IAAA,IAAI,EAAE,KAAK,YAAY,eAAe,CAAC,EAAE;AACvC,QAAA,IAAI,QAAQ,KAAK,UAAU,EAAE;AAC3B,YAAA,KAAK,MAAM,GAAG,IAAI,6BAA6B,EAAE;gBAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE;oBAC7B,MAAM,IAAID,sBAA8B,CACtC,CAAA,iBAAA,EAAoB,GAAG,CAAA,iCAAA,CAAmC,CAC3D;gBACH;YACF;QACF;AAEA,QAAA,OAAO,KAAK;IACd;IAEA,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAc;AACxD,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE;AAC1C,QAAA,MAAM,aAAa,GAAG,eAAe,CAAC,GAAG,CAAC;AAC1C,QAAA,IAAI,aAAa,KAAK,SAAS,EAAE;AAC/B,YAAA,eAAe,CAAC,GAAG,CAAC,GAAG,KAAK;QAC9B;aAAO,IACL,QAAQ,KAAK,UAAU;AACvB,YAAA,6BAA6B,CAAC,GAAG,CAAC,GAAG,CAAC,EACtC;YACA,MAAM,IAAIA,sBAA8B,CACtC,CAAA,iBAAA,EAAoB,GAAG,CAAA,iCAAA,CAAmC,CAC3D;QACH;aAAO;YACL,eAAe,CAAC,GAAG,CAAC,GAAG,GAAG,aAAa,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE;QACpD;IACF;AAEA,IAAA,OAAO,eAAe;AACxB;AAEO,eAAe,kBAAkB,CACtC,MAAuB,EACvB,IAAY,EACZ,IAAY,EACZ,MAAkB,EAAA;AAElB,IAAA,MAAM,SAAS,GAAG,MAAMF,sBAAgB,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC;AAE3E,IAAA,OAAOG,uBAAW,CAAC,IAAI,EAAE,SAAS,CAAC;AACrC;SAEgB,mBAAmB,GAAA;IACjC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AACtC;AAEM,SAAU,8BAA8B,CAAC,MAAuB,EAAA;AACpE,IAAA,OAAO,eAAe,uBAAuB,CAAC,EAC5C,IAAI,EACJ,OAAO,EACP,WAAW,EACX,GAAG,WAAW,EACC,EAAA;AACf,QAAA,MAAM,OAAO,GAAG,MAAMC,4BAAsB,CAAC,WAAW,CAAC;AACzD,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YACnB,OAAO,IAAI,CAACC,2BAAqB,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC;QAC9D;;QAGA,MAAM,cAAc,GAAG;AACrB,cAAEC,4BAAoB,CAAC,WAAW,CAAC,CAAC;AACpC,cAAEC,qBAAa,CAAC,IAAI;QAEtB,MAAM,IAAI,GAAGC,iBAAS,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC;QACvD,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,IAAI,CAACH,2BAAqB,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC;QAC9D;AACA,QAAA,MAAM,SAAS,GAAG,MAAM,kBAAkB,CACxC,MAAM,EACN,OAAO,EACP,IAAI,EACJJ,kBAAU,CAAC,MAAM,CAClB;QACD,IAAI,CAAC,SAAS,EAAE;YACd,OAAO,IAAI,CAACI,2BAAqB,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC;QAC9D;AAEA,QAAA,OAAO,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;AAC9B,IAAA,CAAC;AACH;AAEA,SAAS,qBAAqB,CAAC,KAAgB,EAAA;AAC7C,IAAA,MAAM,EAAC,SAAS,EAAC,GAAG,KAAK;IAEzB,IACE,SAAS,KAAK,SAAS;AACvB,QAAA,SAAS,KAAK,IAAI;AAClB,QAAA,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EACxB;AACA,QAAA,MAAM,IAAIH,sBAA8B,CACtC,sCAAsC,CACvC;IACH;AAEA,IAAA,MAAM,eAAe,GAAG,MAAM,CAAC,SAAS,CAAC;IAEzC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE;AACtC,QAAA,MAAM,IAAIA,sBAA8B,CACtC,sCAAsC,CACvC;IACH;IAEA,IACE,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,GAAG,eAAe,CAAC;AACjD,QAAA,4CAA4C,EAC5C;AACA,QAAA,MAAM,IAAIA,sBAA8B,CACtC,kDAAkD,CACnD;IACH;AACF;AAEA,eAAe,IAAI,CACjB,MAAiC,EACjC,IAAwB,EACxB,MAAuB,EAAA;AAEvB,IAAA,MAAM,GAAG,GAAGO,cAAM,CAAC,MAAM,CAAC;AAC1B,IAAA,MAAM,GAAG,CAAC,KAAK,CAAC,CAAA,EAAG,IAAI,CAAA,qBAAA,CAAuB,EAAE,EAAC,MAAM,EAAC,CAAC;IAEzD,OAAO;AACL,QAAA,KAAK,EAAE,KAAK;QACZ,MAAM;KACP;AACH;AAEA,eAAe,OAAO,CACpB,IAAwB,EACxB,MAAuB,EAAA;AAEvB,IAAA,MAAM,GAAG,GAAGA,cAAM,CAAC,MAAM,CAAC;IAC1B,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAA,iBAAA,CAAmB,CAAC;IAE3C,OAAO;AACL,QAAA,KAAK,EAAE,IAAI;KACZ;AACH;;;;;;;;"}
|
|
@@ -39,7 +39,7 @@ class ProcessedQuery {
|
|
|
39
39
|
this.processedQuery.append(key, `${value}`);
|
|
40
40
|
}
|
|
41
41
|
stringify(omitQuestionMark = false) {
|
|
42
|
-
const queryString = this.processedQuery.toString();
|
|
42
|
+
const queryString = this.processedQuery.toString().replace(/\+/g, '%20');
|
|
43
43
|
return omitQuestionMark ? queryString : `?${queryString}`;
|
|
44
44
|
}
|
|
45
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processed-query.js","sources":["../../../../../../lib/utils/processed-query.ts"],"sourcesContent":["export default class ProcessedQuery {\n static stringify(keyValuePairs?: Record<string, any>): string {\n if (!keyValuePairs || Object.keys(keyValuePairs).length === 0) return '';\n\n return new ProcessedQuery().putAll(keyValuePairs).stringify();\n }\n\n processedQuery: URLSearchParams;\n\n constructor() {\n this.processedQuery = new URLSearchParams();\n }\n\n putAll(keyValuePairs: Record<string, any>): ProcessedQuery {\n Object.entries(keyValuePairs).forEach(([key, value]: [string, any]) =>\n this.put(key, value),\n );\n return this;\n }\n\n put(key: string, value: any): void {\n if (Array.isArray(value)) {\n this.putArray(key, value);\n } else if (value?.constructor === Object) {\n this.putObject(key, value);\n } else {\n this.putSimple(key, value);\n }\n }\n\n putArray(key: string, value: (string | number)[]): void {\n value.forEach((arrayValue) =>\n this.processedQuery.append(`${key}[]`, `${arrayValue}`),\n );\n }\n\n putObject(key: string, value: object): void {\n Object.entries(value).forEach(\n ([entry, entryValue]: [string, string | number]) => {\n this.processedQuery.append(`${key}[${entry}]`, `${entryValue}`);\n },\n );\n }\n\n putSimple(key: string, value: string | number): void {\n this.processedQuery.append(key, `${value}`);\n }\n\n stringify(omitQuestionMark = false): string {\n const queryString = this.processedQuery.toString();\n return omitQuestionMark ? queryString : `?${queryString}`;\n }\n}\n"],"names":[],"mappings":";;;;AAAc,MAAO,cAAc,CAAA;IACjC,OAAO,SAAS,CAAC,aAAmC,EAAA;AAClD,QAAA,IAAI,CAAC,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE;QAExE,OAAO,IAAI,cAAc,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,SAAS,EAAE;IAC/D;AAEA,IAAA,cAAc;AAEd,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,eAAe,EAAE;IAC7C;AAEA,IAAA,MAAM,CAAC,aAAkC,EAAA;QACvC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAgB,KAChE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CACrB;AACD,QAAA,OAAO,IAAI;IACb;IAEA,GAAG,CAAC,GAAW,EAAE,KAAU,EAAA;AACzB,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC;QAC3B;AAAO,aAAA,IAAI,KAAK,EAAE,WAAW,KAAK,MAAM,EAAE;AACxC,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC;QAC5B;aAAO;AACL,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC;QAC5B;IACF;IAEA,QAAQ,CAAC,GAAW,EAAE,KAA0B,EAAA;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU,KACvB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA,EAAG,GAAG,CAAA,EAAA,CAAI,EAAE,GAAG,UAAU,CAAA,CAAE,CAAC,CACxD;IACH;IAEA,SAAS,CAAC,GAAW,EAAE,KAAa,EAAA;AAClC,QAAA,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAC3B,CAAC,CAAC,KAAK,EAAE,UAAU,CAA4B,KAAI;AACjD,YAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,KAAK,GAAG,EAAE,CAAA,EAAG,UAAU,CAAA,CAAE,CAAC;AACjE,QAAA,CAAC,CACF;IACH;IAEA,SAAS,CAAC,GAAW,EAAE,KAAsB,EAAA;QAC3C,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,EAAE,CAAA,EAAG,KAAK,CAAA,CAAE,CAAC;IAC7C;IAEA,SAAS,CAAC,gBAAgB,GAAG,KAAK,EAAA;
|
|
1
|
+
{"version":3,"file":"processed-query.js","sources":["../../../../../../lib/utils/processed-query.ts"],"sourcesContent":["export default class ProcessedQuery {\n static stringify(keyValuePairs?: Record<string, any>): string {\n if (!keyValuePairs || Object.keys(keyValuePairs).length === 0) return '';\n\n return new ProcessedQuery().putAll(keyValuePairs).stringify();\n }\n\n processedQuery: URLSearchParams;\n\n constructor() {\n this.processedQuery = new URLSearchParams();\n }\n\n putAll(keyValuePairs: Record<string, any>): ProcessedQuery {\n Object.entries(keyValuePairs).forEach(([key, value]: [string, any]) =>\n this.put(key, value),\n );\n return this;\n }\n\n put(key: string, value: any): void {\n if (Array.isArray(value)) {\n this.putArray(key, value);\n } else if (value?.constructor === Object) {\n this.putObject(key, value);\n } else {\n this.putSimple(key, value);\n }\n }\n\n putArray(key: string, value: (string | number)[]): void {\n value.forEach((arrayValue) =>\n this.processedQuery.append(`${key}[]`, `${arrayValue}`),\n );\n }\n\n putObject(key: string, value: object): void {\n Object.entries(value).forEach(\n ([entry, entryValue]: [string, string | number]) => {\n this.processedQuery.append(`${key}[${entry}]`, `${entryValue}`);\n },\n );\n }\n\n putSimple(key: string, value: string | number): void {\n this.processedQuery.append(key, `${value}`);\n }\n\n stringify(omitQuestionMark = false): string {\n const queryString = this.processedQuery.toString().replace(/\\+/g, '%20');\n return omitQuestionMark ? queryString : `?${queryString}`;\n }\n}\n"],"names":[],"mappings":";;;;AAAc,MAAO,cAAc,CAAA;IACjC,OAAO,SAAS,CAAC,aAAmC,EAAA;AAClD,QAAA,IAAI,CAAC,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE;QAExE,OAAO,IAAI,cAAc,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,SAAS,EAAE;IAC/D;AAEA,IAAA,cAAc;AAEd,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,eAAe,EAAE;IAC7C;AAEA,IAAA,MAAM,CAAC,aAAkC,EAAA;QACvC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAgB,KAChE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CACrB;AACD,QAAA,OAAO,IAAI;IACb;IAEA,GAAG,CAAC,GAAW,EAAE,KAAU,EAAA;AACzB,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC;QAC3B;AAAO,aAAA,IAAI,KAAK,EAAE,WAAW,KAAK,MAAM,EAAE;AACxC,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC;QAC5B;aAAO;AACL,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC;QAC5B;IACF;IAEA,QAAQ,CAAC,GAAW,EAAE,KAA0B,EAAA;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU,KACvB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA,EAAG,GAAG,CAAA,EAAA,CAAI,EAAE,GAAG,UAAU,CAAA,CAAE,CAAC,CACxD;IACH;IAEA,SAAS,CAAC,GAAW,EAAE,KAAa,EAAA;AAClC,QAAA,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAC3B,CAAC,CAAC,KAAK,EAAE,UAAU,CAA4B,KAAI;AACjD,YAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,KAAK,GAAG,EAAE,CAAA,EAAG,UAAU,CAAA,CAAE,CAAC;AACjE,QAAA,CAAC,CACF;IACH;IAEA,SAAS,CAAC,GAAW,EAAE,KAAsB,EAAA;QAC3C,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,EAAE,CAAA,EAAG,KAAK,CAAA,CAAE,CAAC;IAC7C;IAEA,SAAS,CAAC,gBAAgB,GAAG,KAAK,EAAA;AAChC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;QACxE,OAAO,gBAAgB,GAAG,WAAW,GAAG,CAAA,CAAA,EAAI,WAAW,CAAA,CAAE;IAC3D;AACD;;;;"}
|
package/dist/cjs/lib/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sources":["../../../../../lib/version.ts"],"sourcesContent":["export const SHOPIFY_API_LIBRARY_VERSION = '
|
|
1
|
+
{"version":3,"file":"version.js","sources":["../../../../../lib/version.ts"],"sourcesContent":["export const SHOPIFY_API_LIBRARY_VERSION = '14.0.1';\n"],"names":[],"mappings":";;AAAO,MAAM,2BAA2B,GAAG;;;;"}
|
|
@@ -80,9 +80,9 @@ async function callWebhookHandlers(config, webhookRegistry, webhookCheck, rawBod
|
|
|
80
80
|
response,
|
|
81
81
|
});
|
|
82
82
|
}
|
|
83
|
-
const { webhookId
|
|
83
|
+
const { webhookId } = webhookCheck;
|
|
84
84
|
try {
|
|
85
|
-
await handler.callback(webhookCheck.topic, webhookCheck.domain, rawBody, webhookId, webhookCheck.apiVersion,
|
|
85
|
+
await handler.callback(webhookCheck.topic, webhookCheck.domain, rawBody, webhookId, webhookCheck.apiVersion, context);
|
|
86
86
|
}
|
|
87
87
|
catch (error) {
|
|
88
88
|
response.statusCode = types.StatusCode.InternalServerError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process.js","sources":["../../../../../../lib/webhooks/process.ts"],"sourcesContent":["import {StatusCode} from '../types';\nimport {\n abstractConvertResponse,\n AdapterResponse,\n isOK,\n NormalizedResponse,\n} from '../../runtime/http';\nimport {ConfigInterface} from '../base-types';\nimport * as ShopifyErrors from '../error';\nimport {logger} from '../logger';\n\nimport {\n DeliveryMethod,\n HttpWebhookHandlerWithCallback,\n WebhookProcessParams,\n WebhookRegistry,\n WebhookType,\n WebhookValidationErrorReason,\n WebhookValidationInvalid,\n WebhookValidationMissingHeaders,\n WebhookValidationValid,\n} from './types';\nimport {validateFactory} from './validate';\n\ninterface HandlerCallResult {\n statusCode: StatusCode;\n errorMessage?: string;\n}\n\ninterface ErrorCallResult {\n statusCode: StatusCode;\n errorMessage: string;\n}\n\nconst STATUS_TEXT_LOOKUP: Record<string, string> = {\n [StatusCode.Ok]: 'OK',\n [StatusCode.BadRequest]: 'Bad Request',\n [StatusCode.Unauthorized]: 'Unauthorized',\n [StatusCode.NotFound]: 'Not Found',\n [StatusCode.InternalServerError]: 'Internal Server Error',\n};\n\nexport function process(\n config: ConfigInterface,\n webhookRegistry: WebhookRegistry<HttpWebhookHandlerWithCallback>,\n) {\n return async function process({\n context,\n rawBody,\n ...adapterArgs\n }: WebhookProcessParams): Promise<AdapterResponse> {\n const response: NormalizedResponse = {\n statusCode: StatusCode.Ok,\n statusText: STATUS_TEXT_LOOKUP[StatusCode.Ok],\n headers: {},\n };\n\n await logger(config).info('Receiving webhook request');\n\n const webhookCheck = await validateFactory(config)({\n rawBody,\n ...adapterArgs,\n });\n\n let errorMessage = 'Unknown error while handling webhook';\n if (webhookCheck.valid) {\n const handlerResult = await callWebhookHandlers(\n config,\n webhookRegistry,\n webhookCheck,\n rawBody,\n context,\n );\n\n response.statusCode = handlerResult.statusCode;\n if (!isOK(response)) {\n errorMessage = handlerResult.errorMessage || errorMessage;\n }\n } else {\n const errorResult = await handleInvalidWebhook(config, webhookCheck);\n\n response.statusCode = errorResult.statusCode;\n response.statusText = STATUS_TEXT_LOOKUP[response.statusCode];\n errorMessage = errorResult.errorMessage;\n }\n\n const returnResponse = await abstractConvertResponse(response, adapterArgs);\n if (!isOK(response)) {\n throw new ShopifyErrors.InvalidWebhookError({\n message: errorMessage,\n response: returnResponse,\n });\n }\n\n return Promise.resolve(returnResponse);\n };\n}\n\nasync function callWebhookHandlers(\n config: ConfigInterface,\n webhookRegistry: WebhookRegistry<HttpWebhookHandlerWithCallback>,\n webhookCheck: WebhookValidationValid,\n rawBody: string,\n context: any,\n): Promise<HandlerCallResult> {\n const log = logger(config);\n const {hmac: _hmac, valid: _valid, ...loggingContext} = webhookCheck;\n\n await log.debug(\n 'Webhook request is valid, looking for HTTP handlers to call',\n loggingContext,\n );\n\n const handlers = webhookRegistry[webhookCheck.topic] || [];\n\n const response: HandlerCallResult = {statusCode: StatusCode.Ok};\n\n let found = false;\n for (const handler of handlers) {\n if (handler.deliveryMethod !== DeliveryMethod.Http) {\n continue;\n }\n if (!handler.callback) {\n response.statusCode = StatusCode.InternalServerError;\n response.errorMessage =\n \"Cannot call webhooks.process with a webhook handler that doesn't have a callback\";\n\n throw new ShopifyErrors.MissingWebhookCallbackError({\n message: response.errorMessage,\n response,\n });\n }\n\n found = true;\n\n await log.debug('Found HTTP handler, triggering it', loggingContext);\n\n // process() only handles programmatically-registered HTTP webhooks;\n // events are registered via app TOML and don't use this code path.\n if (webhookCheck.webhookType !== WebhookType.Webhooks) {\n throw new ShopifyErrors.InvalidWebhookError({\n message: 'process() only supports traditional webhooks, not events',\n response,\n });\n }\n const {webhookId, subTopic} = webhookCheck;\n\n try {\n await handler.callback(\n webhookCheck.topic,\n webhookCheck.domain,\n rawBody,\n webhookId,\n webhookCheck.apiVersion,\n ...(subTopic ? subTopic : ''),\n context,\n );\n } catch (error) {\n response.statusCode = StatusCode.InternalServerError;\n response.errorMessage = error.message;\n }\n }\n\n if (!found) {\n await log.debug('No HTTP handlers found', loggingContext);\n\n response.statusCode = StatusCode.NotFound;\n response.errorMessage = `No HTTP webhooks registered for topic ${webhookCheck.topic}`;\n }\n\n return response;\n}\n\nasync function handleInvalidWebhook(\n config: ConfigInterface,\n webhookCheck: WebhookValidationInvalid,\n): Promise<ErrorCallResult> {\n const response: ErrorCallResult = {\n statusCode: StatusCode.InternalServerError,\n errorMessage: 'Unknown error while handling webhook',\n };\n\n switch (webhookCheck.reason) {\n case WebhookValidationErrorReason.MissingHeaders:\n response.statusCode = StatusCode.BadRequest;\n response.errorMessage = `Missing one or more of the required HTTP headers to process webhooks: [${(\n webhookCheck as WebhookValidationMissingHeaders\n ).missingHeaders.join(', ')}]`;\n break;\n case WebhookValidationErrorReason.MissingBody:\n response.statusCode = StatusCode.BadRequest;\n response.errorMessage = 'No body was received when processing webhook';\n break;\n case WebhookValidationErrorReason.MissingHmac:\n response.statusCode = StatusCode.BadRequest;\n response.errorMessage = `Missing HMAC header in request`;\n break;\n case WebhookValidationErrorReason.InvalidHmac:\n response.statusCode = StatusCode.Unauthorized;\n response.errorMessage = `Could not validate request HMAC`;\n break;\n }\n\n await logger(config).debug(\n `Webhook request is invalid, returning ${response.statusCode}: ${response.errorMessage}`,\n );\n\n return response;\n}\n"],"names":["StatusCode","logger","validateFactory","isOK","abstractConvertResponse","ShopifyErrors.InvalidWebhookError","DeliveryMethod","ShopifyErrors.MissingWebhookCallbackError","WebhookType","WebhookValidationErrorReason"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"process.js","sources":["../../../../../../lib/webhooks/process.ts"],"sourcesContent":["import {StatusCode} from '../types';\nimport {\n abstractConvertResponse,\n AdapterResponse,\n isOK,\n NormalizedResponse,\n} from '../../runtime/http';\nimport {ConfigInterface} from '../base-types';\nimport * as ShopifyErrors from '../error';\nimport {logger} from '../logger';\n\nimport {\n DeliveryMethod,\n HttpWebhookHandlerWithCallback,\n WebhookProcessParams,\n WebhookRegistry,\n WebhookType,\n WebhookValidationErrorReason,\n WebhookValidationInvalid,\n WebhookValidationMissingHeaders,\n WebhookValidationValid,\n} from './types';\nimport {validateFactory} from './validate';\n\ninterface HandlerCallResult {\n statusCode: StatusCode;\n errorMessage?: string;\n}\n\ninterface ErrorCallResult {\n statusCode: StatusCode;\n errorMessage: string;\n}\n\nconst STATUS_TEXT_LOOKUP: Record<string, string> = {\n [StatusCode.Ok]: 'OK',\n [StatusCode.BadRequest]: 'Bad Request',\n [StatusCode.Unauthorized]: 'Unauthorized',\n [StatusCode.NotFound]: 'Not Found',\n [StatusCode.InternalServerError]: 'Internal Server Error',\n};\n\nexport function process(\n config: ConfigInterface,\n webhookRegistry: WebhookRegistry<HttpWebhookHandlerWithCallback>,\n) {\n return async function process({\n context,\n rawBody,\n ...adapterArgs\n }: WebhookProcessParams): Promise<AdapterResponse> {\n const response: NormalizedResponse = {\n statusCode: StatusCode.Ok,\n statusText: STATUS_TEXT_LOOKUP[StatusCode.Ok],\n headers: {},\n };\n\n await logger(config).info('Receiving webhook request');\n\n const webhookCheck = await validateFactory(config)({\n rawBody,\n ...adapterArgs,\n });\n\n let errorMessage = 'Unknown error while handling webhook';\n if (webhookCheck.valid) {\n const handlerResult = await callWebhookHandlers(\n config,\n webhookRegistry,\n webhookCheck,\n rawBody,\n context,\n );\n\n response.statusCode = handlerResult.statusCode;\n if (!isOK(response)) {\n errorMessage = handlerResult.errorMessage || errorMessage;\n }\n } else {\n const errorResult = await handleInvalidWebhook(config, webhookCheck);\n\n response.statusCode = errorResult.statusCode;\n response.statusText = STATUS_TEXT_LOOKUP[response.statusCode];\n errorMessage = errorResult.errorMessage;\n }\n\n const returnResponse = await abstractConvertResponse(response, adapterArgs);\n if (!isOK(response)) {\n throw new ShopifyErrors.InvalidWebhookError({\n message: errorMessage,\n response: returnResponse,\n });\n }\n\n return Promise.resolve(returnResponse);\n };\n}\n\nasync function callWebhookHandlers(\n config: ConfigInterface,\n webhookRegistry: WebhookRegistry<HttpWebhookHandlerWithCallback>,\n webhookCheck: WebhookValidationValid,\n rawBody: string,\n context: any,\n): Promise<HandlerCallResult> {\n const log = logger(config);\n const {hmac: _hmac, valid: _valid, ...loggingContext} = webhookCheck;\n\n await log.debug(\n 'Webhook request is valid, looking for HTTP handlers to call',\n loggingContext,\n );\n\n const handlers = webhookRegistry[webhookCheck.topic] || [];\n\n const response: HandlerCallResult = {statusCode: StatusCode.Ok};\n\n let found = false;\n for (const handler of handlers) {\n if (handler.deliveryMethod !== DeliveryMethod.Http) {\n continue;\n }\n if (!handler.callback) {\n response.statusCode = StatusCode.InternalServerError;\n response.errorMessage =\n \"Cannot call webhooks.process with a webhook handler that doesn't have a callback\";\n\n throw new ShopifyErrors.MissingWebhookCallbackError({\n message: response.errorMessage,\n response,\n });\n }\n\n found = true;\n\n await log.debug('Found HTTP handler, triggering it', loggingContext);\n\n // process() only handles programmatically-registered HTTP webhooks;\n // events are registered via app TOML and don't use this code path.\n if (webhookCheck.webhookType !== WebhookType.Webhooks) {\n throw new ShopifyErrors.InvalidWebhookError({\n message: 'process() only supports traditional webhooks, not events',\n response,\n });\n }\n const {webhookId} = webhookCheck;\n\n try {\n await handler.callback(\n webhookCheck.topic,\n webhookCheck.domain,\n rawBody,\n webhookId,\n webhookCheck.apiVersion,\n context,\n );\n } catch (error) {\n response.statusCode = StatusCode.InternalServerError;\n response.errorMessage = error.message;\n }\n }\n\n if (!found) {\n await log.debug('No HTTP handlers found', loggingContext);\n\n response.statusCode = StatusCode.NotFound;\n response.errorMessage = `No HTTP webhooks registered for topic ${webhookCheck.topic}`;\n }\n\n return response;\n}\n\nasync function handleInvalidWebhook(\n config: ConfigInterface,\n webhookCheck: WebhookValidationInvalid,\n): Promise<ErrorCallResult> {\n const response: ErrorCallResult = {\n statusCode: StatusCode.InternalServerError,\n errorMessage: 'Unknown error while handling webhook',\n };\n\n switch (webhookCheck.reason) {\n case WebhookValidationErrorReason.MissingHeaders:\n response.statusCode = StatusCode.BadRequest;\n response.errorMessage = `Missing one or more of the required HTTP headers to process webhooks: [${(\n webhookCheck as WebhookValidationMissingHeaders\n ).missingHeaders.join(', ')}]`;\n break;\n case WebhookValidationErrorReason.MissingBody:\n response.statusCode = StatusCode.BadRequest;\n response.errorMessage = 'No body was received when processing webhook';\n break;\n case WebhookValidationErrorReason.MissingHmac:\n response.statusCode = StatusCode.BadRequest;\n response.errorMessage = `Missing HMAC header in request`;\n break;\n case WebhookValidationErrorReason.InvalidHmac:\n response.statusCode = StatusCode.Unauthorized;\n response.errorMessage = `Could not validate request HMAC`;\n break;\n }\n\n await logger(config).debug(\n `Webhook request is invalid, returning ${response.statusCode}: ${response.errorMessage}`,\n );\n\n return response;\n}\n"],"names":["StatusCode","logger","validateFactory","isOK","abstractConvertResponse","ShopifyErrors.InvalidWebhookError","DeliveryMethod","ShopifyErrors.MissingWebhookCallbackError","WebhookType","WebhookValidationErrorReason"],"mappings":"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"}
|
|
@@ -250,10 +250,6 @@ function buildMutation(config, topic, handler, operation) {
|
|
|
250
250
|
if (handler.metafieldNamespaces) {
|
|
251
251
|
params.metafieldNamespaces = JSON.stringify(handler.metafieldNamespaces);
|
|
252
252
|
}
|
|
253
|
-
if (handler.subTopic) {
|
|
254
|
-
const subTopicString = `subTopic: "${handler.subTopic}",`;
|
|
255
|
-
mutationArguments.MUTATION_PARAMS = subTopicString;
|
|
256
|
-
}
|
|
257
253
|
const paramsString = Object.entries(params)
|
|
258
254
|
.map(([key, value]) => `${key}: ${value}`)
|
|
259
255
|
.join(', ');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sources":["../../../../../../lib/webhooks/register.ts"],"sourcesContent":["import {graphqlClientClass, GraphqlClient} from '../clients/admin';\nimport {InvalidDeliveryMethodError, ShopifyError} from '../error';\nimport {logger} from '../logger';\nimport {privacyTopics} from '../types';\nimport {ConfigInterface} from '../base-types';\nimport {Session} from '../session/session';\n\nimport {addHostToCallbackUrl, getHandlers, handlerIdentifier} from './registry';\nimport {queryTemplate} from './query-template';\nimport {\n WebhookRegistry,\n RegisterReturn,\n WebhookHandler,\n WebhookCheckResponse,\n DeliveryMethod,\n WebhookCheckResponseNode,\n WebhookOperation,\n RegisterResult,\n RegisterParams,\n} from './types';\n\ninterface RegisterTopicParams {\n config: ConfigInterface;\n session: Session;\n topic: string;\n existingHandlers: WebhookHandler[];\n handlers: WebhookHandler[];\n}\n\ninterface RunMutationsParams {\n config: ConfigInterface;\n client: GraphqlClient;\n topic: string;\n handlers: WebhookHandler[];\n operation: WebhookOperation;\n}\n\ninterface RunMutationParams {\n config: ConfigInterface;\n client: GraphqlClient;\n topic: string;\n handler: WebhookHandler;\n operation: WebhookOperation;\n}\n\nexport function register(\n config: ConfigInterface,\n webhookRegistry: WebhookRegistry,\n) {\n return async function register({\n session,\n }: RegisterParams): Promise<RegisterReturn> {\n const log = logger(config);\n log.info('Registering webhooks', {shop: session.shop});\n\n const registerReturn: RegisterReturn = Object.keys(webhookRegistry).reduce(\n (acc: RegisterReturn, topic) => {\n acc[topic] = [];\n return acc;\n },\n {},\n );\n\n const existingHandlers = await getExistingHandlers(config, session);\n\n log.debug(\n `Existing topics: [${Object.keys(existingHandlers).join(', ')}]`,\n {shop: session.shop},\n );\n\n for (const topic in webhookRegistry) {\n if (!Object.prototype.hasOwnProperty.call(webhookRegistry, topic)) {\n continue;\n }\n\n if (privacyTopics.includes(topic)) {\n continue;\n }\n\n registerReturn[topic] = await registerTopic({\n config,\n session,\n topic,\n existingHandlers: existingHandlers[topic] || [],\n handlers: getHandlers(webhookRegistry)(topic),\n });\n\n // Remove this topic from the list of existing handlers so we have a list of leftovers\n delete existingHandlers[topic];\n }\n\n // Delete any leftover handlers\n for (const topic in existingHandlers) {\n if (!Object.prototype.hasOwnProperty.call(existingHandlers, topic)) {\n continue;\n }\n\n const GraphqlClient = graphqlClientClass({config});\n const client = new GraphqlClient({session});\n\n registerReturn[topic] = await runMutations({\n config,\n client,\n topic,\n handlers: existingHandlers[topic],\n operation: WebhookOperation.Delete,\n });\n }\n\n return registerReturn;\n };\n}\n\nasync function getExistingHandlers(\n config: ConfigInterface,\n session: Session,\n): Promise<WebhookRegistry> {\n const GraphqlClient = graphqlClientClass({config});\n const client = new GraphqlClient({session});\n\n const existingHandlers: WebhookRegistry = {};\n\n let hasNextPage: boolean;\n let endCursor: string | null = null;\n do {\n const query = buildCheckQuery(endCursor);\n\n const response = await client.request<WebhookCheckResponse>(query);\n\n response.data?.webhookSubscriptions?.edges.forEach(\n (edge: WebhookCheckResponseNode) => {\n const handler = buildHandlerFromNode(edge);\n\n if (!existingHandlers[edge.node.topic]) {\n existingHandlers[edge.node.topic] = [];\n }\n\n existingHandlers[edge.node.topic].push(handler);\n },\n );\n\n endCursor = response.data?.webhookSubscriptions?.pageInfo.endCursor!;\n hasNextPage = response.data?.webhookSubscriptions?.pageInfo.hasNextPage!;\n } while (hasNextPage);\n\n return existingHandlers;\n}\n\nfunction buildCheckQuery(endCursor: string | null) {\n return queryTemplate(TEMPLATE_GET_HANDLERS, {\n END_CURSOR: JSON.stringify(endCursor),\n });\n}\n\nfunction buildHandlerFromNode(edge: WebhookCheckResponseNode): WebhookHandler {\n const endpoint = edge.node.endpoint;\n\n let handler: WebhookHandler;\n\n switch (endpoint.__typename) {\n case 'WebhookHttpEndpoint':\n handler = {\n deliveryMethod: DeliveryMethod.Http,\n callbackUrl: endpoint.callbackUrl,\n // This is a dummy for now because we don't really care about it\n callback: async () => {},\n };\n break;\n case 'WebhookEventBridgeEndpoint':\n handler = {\n deliveryMethod: DeliveryMethod.EventBridge,\n arn: endpoint.arn,\n };\n break;\n case 'WebhookPubSubEndpoint':\n handler = {\n deliveryMethod: DeliveryMethod.PubSub,\n pubSubProject: endpoint.pubSubProject,\n pubSubTopic: endpoint.pubSubTopic,\n };\n break;\n }\n\n // Set common fields\n handler.id = edge.node.id;\n handler.includeFields = edge.node.includeFields;\n handler.metafieldNamespaces = edge.node.metafieldNamespaces;\n\n // Sort the array fields to make them cheaper to compare later on\n handler.includeFields?.sort();\n handler.metafieldNamespaces?.sort();\n\n return handler;\n}\n\nasync function registerTopic({\n config,\n session,\n topic,\n existingHandlers,\n handlers,\n}: RegisterTopicParams): Promise<RegisterResult[]> {\n let registerResults: RegisterResult[] = [];\n\n const {toCreate, toUpdate, toDelete} = categorizeHandlers(\n config,\n existingHandlers,\n handlers,\n );\n\n const GraphqlClient = graphqlClientClass({config});\n const client = new GraphqlClient({session});\n\n let operation = WebhookOperation.Create;\n registerResults = registerResults.concat(\n await runMutations({config, client, topic, operation, handlers: toCreate}),\n );\n\n operation = WebhookOperation.Update;\n registerResults = registerResults.concat(\n await runMutations({config, client, topic, operation, handlers: toUpdate}),\n );\n\n operation = WebhookOperation.Delete;\n registerResults = registerResults.concat(\n await runMutations({config, client, topic, operation, handlers: toDelete}),\n );\n\n return registerResults;\n}\n\ntype HandlersByKey = Record<string, WebhookHandler>;\n\nfunction categorizeHandlers(\n config: ConfigInterface,\n existingHandlers: WebhookHandler[],\n handlers: WebhookHandler[],\n) {\n const handlersByKey = handlers.reduce((acc: HandlersByKey, value) => {\n acc[handlerIdentifier(config, value)] = value;\n return acc;\n }, {});\n const existingHandlersByKey = existingHandlers.reduce(\n (acc: HandlersByKey, value) => {\n acc[handlerIdentifier(config, value)] = value;\n return acc;\n },\n {},\n );\n\n const toCreate: HandlersByKey = {...handlersByKey};\n const toUpdate: HandlersByKey = {};\n const toDelete: HandlersByKey = {};\n for (const existingKey in existingHandlersByKey) {\n if (\n !Object.prototype.hasOwnProperty.call(existingHandlersByKey, existingKey)\n ) {\n continue;\n }\n\n const existingHandler = existingHandlersByKey[existingKey];\n const handler = handlersByKey[existingKey];\n\n if (existingKey in handlersByKey) {\n delete toCreate[existingKey];\n\n if (!areHandlerFieldsEqual(existingHandler, handler)) {\n toUpdate[existingKey] = handler;\n toUpdate[existingKey].id = existingHandler.id;\n }\n } else {\n toDelete[existingKey] = existingHandler;\n }\n }\n\n return {\n toCreate: Object.values(toCreate),\n toUpdate: Object.values(toUpdate),\n toDelete: Object.values(toDelete),\n };\n}\nfunction areHandlerFieldsEqual(\n arr1: WebhookHandler,\n arr2: WebhookHandler,\n): boolean {\n const includeFieldsEqual = arraysEqual(\n arr1.includeFields || [],\n arr2.includeFields || [],\n );\n const metafieldNamespacesEqual = arraysEqual(\n arr1.metafieldNamespaces || [],\n arr2.metafieldNamespaces || [],\n );\n\n return includeFieldsEqual && metafieldNamespacesEqual;\n}\n\nfunction arraysEqual(arr1: any[], arr2: any[]): boolean {\n if (arr1.length !== arr2.length) {\n return false;\n }\n\n for (let i = 0; i < arr1.length; i++) {\n if (arr1[i] !== arr2[i]) {\n return false;\n }\n }\n\n return true;\n}\n\nasync function runMutations({\n config,\n client,\n topic,\n handlers,\n operation,\n}: RunMutationsParams): Promise<RegisterResult[]> {\n const registerResults: RegisterResult[] = [];\n\n for (const handler of handlers) {\n registerResults.push(\n await runMutation({config, client, topic, handler, operation}),\n );\n }\n\n return registerResults;\n}\n\nasync function runMutation({\n config,\n client,\n topic,\n handler,\n operation,\n}: RunMutationParams): Promise<RegisterResult> {\n let registerResult: RegisterResult;\n\n logger(config).debug(`Running webhook mutation`, {topic, operation});\n\n try {\n const query = buildMutation(config, topic, handler, operation);\n\n const result = await client.request(query);\n\n registerResult = {\n deliveryMethod: handler.deliveryMethod,\n success: isSuccess(result, handler, operation),\n result,\n operation,\n };\n } catch (error) {\n if (error instanceof InvalidDeliveryMethodError) {\n registerResult = {\n deliveryMethod: handler.deliveryMethod,\n success: false,\n result: {message: error.message},\n operation,\n };\n } else {\n throw error;\n }\n }\n\n return registerResult;\n}\n\nfunction buildMutation(\n config: ConfigInterface,\n topic: string,\n handler: WebhookHandler,\n operation: WebhookOperation,\n): string {\n const params: Record<string, string> = {};\n\n let identifier: string;\n if (handler.id) {\n identifier = `id: \"${handler.id}\"`;\n } else {\n identifier = `topic: ${topic}`;\n }\n\n const mutationArguments = {\n MUTATION_NAME: getMutationName(handler, operation),\n IDENTIFIER: identifier,\n MUTATION_PARAMS: '',\n };\n\n if (operation !== WebhookOperation.Delete) {\n switch (handler.deliveryMethod) {\n case DeliveryMethod.Http:\n params.callbackUrl = `\"${addHostToCallbackUrl(\n config,\n handler.callbackUrl,\n )}\"`;\n break;\n case DeliveryMethod.EventBridge:\n params.arn = `\"${handler.arn}\"`;\n break;\n case DeliveryMethod.PubSub:\n params.pubSubProject = `\"${handler.pubSubProject}\"`;\n params.pubSubTopic = `\"${handler.pubSubTopic}\"`;\n break;\n default:\n throw new InvalidDeliveryMethodError(\n `Unrecognized delivery method '${(handler as any).deliveryMethod}'`,\n );\n }\n\n if (handler.includeFields) {\n params.includeFields = JSON.stringify(handler.includeFields);\n }\n if (handler.metafieldNamespaces) {\n params.metafieldNamespaces = JSON.stringify(handler.metafieldNamespaces);\n }\n\n if (handler.subTopic) {\n const subTopicString = `subTopic: \"${handler.subTopic}\",`;\n mutationArguments.MUTATION_PARAMS = subTopicString;\n }\n\n const paramsString = Object.entries(params)\n .map(([key, value]) => `${key}: ${value}`)\n .join(', ');\n\n mutationArguments.MUTATION_PARAMS += `webhookSubscription: {${paramsString}}`;\n }\n\n return queryTemplate(TEMPLATE_MUTATION, mutationArguments);\n}\n\nfunction getMutationName(\n handler: WebhookHandler,\n operation: WebhookOperation,\n): string {\n switch (operation) {\n case WebhookOperation.Create:\n return `${getEndpoint(handler)}Create`;\n case WebhookOperation.Update:\n return `${getEndpoint(handler)}Update`;\n case WebhookOperation.Delete:\n return 'webhookSubscriptionDelete';\n default:\n throw new ShopifyError(`Unrecognized operation '${operation}'`);\n }\n}\n\nfunction getEndpoint(handler: WebhookHandler): string {\n switch (handler.deliveryMethod) {\n case DeliveryMethod.Http:\n return 'webhookSubscription';\n case DeliveryMethod.EventBridge:\n return 'eventBridgeWebhookSubscription';\n case DeliveryMethod.PubSub:\n return 'pubSubWebhookSubscription';\n default:\n throw new ShopifyError(\n `Unrecognized delivery method '${(handler as any).deliveryMethod}'`,\n );\n }\n}\n\nfunction isSuccess(\n result: any,\n handler: WebhookHandler,\n operation: WebhookOperation,\n): boolean {\n const mutationName = getMutationName(handler, operation);\n\n return Boolean(\n result.data &&\n result.data[mutationName] &&\n result.data[mutationName].userErrors.length === 0,\n );\n}\n\nexport const TEMPLATE_GET_HANDLERS = `query shopifyApiReadWebhookSubscriptions {\n webhookSubscriptions(\n first: 250,\n after: {{END_CURSOR}},\n ) {\n edges {\n node {\n id\n topic\n includeFields\n metafieldNamespaces\n endpoint {\n __typename\n ... on WebhookHttpEndpoint {\n callbackUrl\n }\n ... on WebhookEventBridgeEndpoint {\n arn\n }\n ... on WebhookPubSubEndpoint {\n pubSubProject\n pubSubTopic\n }\n }\n }\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n}`;\n\nexport const TEMPLATE_MUTATION = `\n mutation shopifyApiCreateWebhookSubscription {\n {{MUTATION_NAME}}(\n {{IDENTIFIER}},\n {{MUTATION_PARAMS}}\n ) {\n userErrors {\n field\n message\n }\n }\n }\n`;\n"],"names":["logger","privacyTopics","getHandlers","graphqlClientClass","client","WebhookOperation","queryTemplate","DeliveryMethod","handlerIdentifier","error","InvalidDeliveryMethodError","addHostToCallbackUrl","ShopifyError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"register.js","sources":["../../../../../../lib/webhooks/register.ts"],"sourcesContent":["import {graphqlClientClass, GraphqlClient} from '../clients/admin';\nimport {InvalidDeliveryMethodError, ShopifyError} from '../error';\nimport {logger} from '../logger';\nimport {privacyTopics} from '../types';\nimport {ConfigInterface} from '../base-types';\nimport {Session} from '../session/session';\n\nimport {addHostToCallbackUrl, getHandlers, handlerIdentifier} from './registry';\nimport {queryTemplate} from './query-template';\nimport {\n WebhookRegistry,\n RegisterReturn,\n WebhookHandler,\n WebhookCheckResponse,\n DeliveryMethod,\n WebhookCheckResponseNode,\n WebhookOperation,\n RegisterResult,\n RegisterParams,\n} from './types';\n\ninterface RegisterTopicParams {\n config: ConfigInterface;\n session: Session;\n topic: string;\n existingHandlers: WebhookHandler[];\n handlers: WebhookHandler[];\n}\n\ninterface RunMutationsParams {\n config: ConfigInterface;\n client: GraphqlClient;\n topic: string;\n handlers: WebhookHandler[];\n operation: WebhookOperation;\n}\n\ninterface RunMutationParams {\n config: ConfigInterface;\n client: GraphqlClient;\n topic: string;\n handler: WebhookHandler;\n operation: WebhookOperation;\n}\n\nexport function register(\n config: ConfigInterface,\n webhookRegistry: WebhookRegistry,\n) {\n return async function register({\n session,\n }: RegisterParams): Promise<RegisterReturn> {\n const log = logger(config);\n log.info('Registering webhooks', {shop: session.shop});\n\n const registerReturn: RegisterReturn = Object.keys(webhookRegistry).reduce(\n (acc: RegisterReturn, topic) => {\n acc[topic] = [];\n return acc;\n },\n {},\n );\n\n const existingHandlers = await getExistingHandlers(config, session);\n\n log.debug(\n `Existing topics: [${Object.keys(existingHandlers).join(', ')}]`,\n {shop: session.shop},\n );\n\n for (const topic in webhookRegistry) {\n if (!Object.prototype.hasOwnProperty.call(webhookRegistry, topic)) {\n continue;\n }\n\n if (privacyTopics.includes(topic)) {\n continue;\n }\n\n registerReturn[topic] = await registerTopic({\n config,\n session,\n topic,\n existingHandlers: existingHandlers[topic] || [],\n handlers: getHandlers(webhookRegistry)(topic),\n });\n\n // Remove this topic from the list of existing handlers so we have a list of leftovers\n delete existingHandlers[topic];\n }\n\n // Delete any leftover handlers\n for (const topic in existingHandlers) {\n if (!Object.prototype.hasOwnProperty.call(existingHandlers, topic)) {\n continue;\n }\n\n const GraphqlClient = graphqlClientClass({config});\n const client = new GraphqlClient({session});\n\n registerReturn[topic] = await runMutations({\n config,\n client,\n topic,\n handlers: existingHandlers[topic],\n operation: WebhookOperation.Delete,\n });\n }\n\n return registerReturn;\n };\n}\n\nasync function getExistingHandlers(\n config: ConfigInterface,\n session: Session,\n): Promise<WebhookRegistry> {\n const GraphqlClient = graphqlClientClass({config});\n const client = new GraphqlClient({session});\n\n const existingHandlers: WebhookRegistry = {};\n\n let hasNextPage: boolean;\n let endCursor: string | null = null;\n do {\n const query = buildCheckQuery(endCursor);\n\n const response = await client.request<WebhookCheckResponse>(query);\n\n response.data?.webhookSubscriptions?.edges.forEach(\n (edge: WebhookCheckResponseNode) => {\n const handler = buildHandlerFromNode(edge);\n\n if (!existingHandlers[edge.node.topic]) {\n existingHandlers[edge.node.topic] = [];\n }\n\n existingHandlers[edge.node.topic].push(handler);\n },\n );\n\n endCursor = response.data?.webhookSubscriptions?.pageInfo.endCursor!;\n hasNextPage = response.data?.webhookSubscriptions?.pageInfo.hasNextPage!;\n } while (hasNextPage);\n\n return existingHandlers;\n}\n\nfunction buildCheckQuery(endCursor: string | null) {\n return queryTemplate(TEMPLATE_GET_HANDLERS, {\n END_CURSOR: JSON.stringify(endCursor),\n });\n}\n\nfunction buildHandlerFromNode(edge: WebhookCheckResponseNode): WebhookHandler {\n const endpoint = edge.node.endpoint;\n\n let handler: WebhookHandler;\n\n switch (endpoint.__typename) {\n case 'WebhookHttpEndpoint':\n handler = {\n deliveryMethod: DeliveryMethod.Http,\n callbackUrl: endpoint.callbackUrl,\n // This is a dummy for now because we don't really care about it\n callback: async () => {},\n };\n break;\n case 'WebhookEventBridgeEndpoint':\n handler = {\n deliveryMethod: DeliveryMethod.EventBridge,\n arn: endpoint.arn,\n };\n break;\n case 'WebhookPubSubEndpoint':\n handler = {\n deliveryMethod: DeliveryMethod.PubSub,\n pubSubProject: endpoint.pubSubProject,\n pubSubTopic: endpoint.pubSubTopic,\n };\n break;\n }\n\n // Set common fields\n handler.id = edge.node.id;\n handler.includeFields = edge.node.includeFields;\n handler.metafieldNamespaces = edge.node.metafieldNamespaces;\n\n // Sort the array fields to make them cheaper to compare later on\n handler.includeFields?.sort();\n handler.metafieldNamespaces?.sort();\n\n return handler;\n}\n\nasync function registerTopic({\n config,\n session,\n topic,\n existingHandlers,\n handlers,\n}: RegisterTopicParams): Promise<RegisterResult[]> {\n let registerResults: RegisterResult[] = [];\n\n const {toCreate, toUpdate, toDelete} = categorizeHandlers(\n config,\n existingHandlers,\n handlers,\n );\n\n const GraphqlClient = graphqlClientClass({config});\n const client = new GraphqlClient({session});\n\n let operation = WebhookOperation.Create;\n registerResults = registerResults.concat(\n await runMutations({config, client, topic, operation, handlers: toCreate}),\n );\n\n operation = WebhookOperation.Update;\n registerResults = registerResults.concat(\n await runMutations({config, client, topic, operation, handlers: toUpdate}),\n );\n\n operation = WebhookOperation.Delete;\n registerResults = registerResults.concat(\n await runMutations({config, client, topic, operation, handlers: toDelete}),\n );\n\n return registerResults;\n}\n\ntype HandlersByKey = Record<string, WebhookHandler>;\n\nfunction categorizeHandlers(\n config: ConfigInterface,\n existingHandlers: WebhookHandler[],\n handlers: WebhookHandler[],\n) {\n const handlersByKey = handlers.reduce((acc: HandlersByKey, value) => {\n acc[handlerIdentifier(config, value)] = value;\n return acc;\n }, {});\n const existingHandlersByKey = existingHandlers.reduce(\n (acc: HandlersByKey, value) => {\n acc[handlerIdentifier(config, value)] = value;\n return acc;\n },\n {},\n );\n\n const toCreate: HandlersByKey = {...handlersByKey};\n const toUpdate: HandlersByKey = {};\n const toDelete: HandlersByKey = {};\n for (const existingKey in existingHandlersByKey) {\n if (\n !Object.prototype.hasOwnProperty.call(existingHandlersByKey, existingKey)\n ) {\n continue;\n }\n\n const existingHandler = existingHandlersByKey[existingKey];\n const handler = handlersByKey[existingKey];\n\n if (existingKey in handlersByKey) {\n delete toCreate[existingKey];\n\n if (!areHandlerFieldsEqual(existingHandler, handler)) {\n toUpdate[existingKey] = handler;\n toUpdate[existingKey].id = existingHandler.id;\n }\n } else {\n toDelete[existingKey] = existingHandler;\n }\n }\n\n return {\n toCreate: Object.values(toCreate),\n toUpdate: Object.values(toUpdate),\n toDelete: Object.values(toDelete),\n };\n}\nfunction areHandlerFieldsEqual(\n arr1: WebhookHandler,\n arr2: WebhookHandler,\n): boolean {\n const includeFieldsEqual = arraysEqual(\n arr1.includeFields || [],\n arr2.includeFields || [],\n );\n const metafieldNamespacesEqual = arraysEqual(\n arr1.metafieldNamespaces || [],\n arr2.metafieldNamespaces || [],\n );\n\n return includeFieldsEqual && metafieldNamespacesEqual;\n}\n\nfunction arraysEqual(arr1: any[], arr2: any[]): boolean {\n if (arr1.length !== arr2.length) {\n return false;\n }\n\n for (let i = 0; i < arr1.length; i++) {\n if (arr1[i] !== arr2[i]) {\n return false;\n }\n }\n\n return true;\n}\n\nasync function runMutations({\n config,\n client,\n topic,\n handlers,\n operation,\n}: RunMutationsParams): Promise<RegisterResult[]> {\n const registerResults: RegisterResult[] = [];\n\n for (const handler of handlers) {\n registerResults.push(\n await runMutation({config, client, topic, handler, operation}),\n );\n }\n\n return registerResults;\n}\n\nasync function runMutation({\n config,\n client,\n topic,\n handler,\n operation,\n}: RunMutationParams): Promise<RegisterResult> {\n let registerResult: RegisterResult;\n\n logger(config).debug(`Running webhook mutation`, {topic, operation});\n\n try {\n const query = buildMutation(config, topic, handler, operation);\n\n const result = await client.request(query);\n\n registerResult = {\n deliveryMethod: handler.deliveryMethod,\n success: isSuccess(result, handler, operation),\n result,\n operation,\n };\n } catch (error) {\n if (error instanceof InvalidDeliveryMethodError) {\n registerResult = {\n deliveryMethod: handler.deliveryMethod,\n success: false,\n result: {message: error.message},\n operation,\n };\n } else {\n throw error;\n }\n }\n\n return registerResult;\n}\n\nfunction buildMutation(\n config: ConfigInterface,\n topic: string,\n handler: WebhookHandler,\n operation: WebhookOperation,\n): string {\n const params: Record<string, string> = {};\n\n let identifier: string;\n if (handler.id) {\n identifier = `id: \"${handler.id}\"`;\n } else {\n identifier = `topic: ${topic}`;\n }\n\n const mutationArguments = {\n MUTATION_NAME: getMutationName(handler, operation),\n IDENTIFIER: identifier,\n MUTATION_PARAMS: '',\n };\n\n if (operation !== WebhookOperation.Delete) {\n switch (handler.deliveryMethod) {\n case DeliveryMethod.Http:\n params.callbackUrl = `\"${addHostToCallbackUrl(\n config,\n handler.callbackUrl,\n )}\"`;\n break;\n case DeliveryMethod.EventBridge:\n params.arn = `\"${handler.arn}\"`;\n break;\n case DeliveryMethod.PubSub:\n params.pubSubProject = `\"${handler.pubSubProject}\"`;\n params.pubSubTopic = `\"${handler.pubSubTopic}\"`;\n break;\n default:\n throw new InvalidDeliveryMethodError(\n `Unrecognized delivery method '${(handler as any).deliveryMethod}'`,\n );\n }\n\n if (handler.includeFields) {\n params.includeFields = JSON.stringify(handler.includeFields);\n }\n if (handler.metafieldNamespaces) {\n params.metafieldNamespaces = JSON.stringify(handler.metafieldNamespaces);\n }\n\n const paramsString = Object.entries(params)\n .map(([key, value]) => `${key}: ${value}`)\n .join(', ');\n\n mutationArguments.MUTATION_PARAMS += `webhookSubscription: {${paramsString}}`;\n }\n\n return queryTemplate(TEMPLATE_MUTATION, mutationArguments);\n}\n\nfunction getMutationName(\n handler: WebhookHandler,\n operation: WebhookOperation,\n): string {\n switch (operation) {\n case WebhookOperation.Create:\n return `${getEndpoint(handler)}Create`;\n case WebhookOperation.Update:\n return `${getEndpoint(handler)}Update`;\n case WebhookOperation.Delete:\n return 'webhookSubscriptionDelete';\n default:\n throw new ShopifyError(`Unrecognized operation '${operation}'`);\n }\n}\n\nfunction getEndpoint(handler: WebhookHandler): string {\n switch (handler.deliveryMethod) {\n case DeliveryMethod.Http:\n return 'webhookSubscription';\n case DeliveryMethod.EventBridge:\n return 'eventBridgeWebhookSubscription';\n case DeliveryMethod.PubSub:\n return 'pubSubWebhookSubscription';\n default:\n throw new ShopifyError(\n `Unrecognized delivery method '${(handler as any).deliveryMethod}'`,\n );\n }\n}\n\nfunction isSuccess(\n result: any,\n handler: WebhookHandler,\n operation: WebhookOperation,\n): boolean {\n const mutationName = getMutationName(handler, operation);\n\n return Boolean(\n result.data &&\n result.data[mutationName] &&\n result.data[mutationName].userErrors.length === 0,\n );\n}\n\nexport const TEMPLATE_GET_HANDLERS = `query shopifyApiReadWebhookSubscriptions {\n webhookSubscriptions(\n first: 250,\n after: {{END_CURSOR}},\n ) {\n edges {\n node {\n id\n topic\n includeFields\n metafieldNamespaces\n endpoint {\n __typename\n ... on WebhookHttpEndpoint {\n callbackUrl\n }\n ... on WebhookEventBridgeEndpoint {\n arn\n }\n ... on WebhookPubSubEndpoint {\n pubSubProject\n pubSubTopic\n }\n }\n }\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n}`;\n\nexport const TEMPLATE_MUTATION = `\n mutation shopifyApiCreateWebhookSubscription {\n {{MUTATION_NAME}}(\n {{IDENTIFIER}},\n {{MUTATION_PARAMS}}\n ) {\n userErrors {\n field\n message\n }\n }\n }\n`;\n"],"names":["logger","privacyTopics","getHandlers","graphqlClientClass","client","WebhookOperation","queryTemplate","DeliveryMethod","handlerIdentifier","error","InvalidDeliveryMethodError","addHostToCallbackUrl","ShopifyError"],"mappings":"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"}
|
|
@@ -14,7 +14,6 @@ const WEBHOOK_HEADER_NAMES = {
|
|
|
14
14
|
domain: types.ShopifyHeader.Domain,
|
|
15
15
|
apiVersion: types.ShopifyHeader.ApiVersion,
|
|
16
16
|
webhookId: types.ShopifyHeader.WebhookId,
|
|
17
|
-
subTopic: types.ShopifyHeader.SubTopic,
|
|
18
17
|
name: types.ShopifyHeader.Name,
|
|
19
18
|
triggeredAt: types.ShopifyHeader.TriggeredAt,
|
|
20
19
|
eventId: types.ShopifyHeader.EventId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sources":["../../../../../../lib/webhooks/types.ts"],"sourcesContent":["import {ValidationErrorReason, ValidationInvalid} from '../utils/types';\nimport {AdapterArgs} from '../../runtime/types';\nimport {Session} from '../session/session';\nimport {ShopifyEventsHeader, ShopifyHeader} from '../types';\n\nexport const WebhookType = {\n Webhooks: 'webhooks',\n Events: 'events',\n} as const;\n\nexport type WebhookTypeValue = (typeof WebhookType)[keyof typeof WebhookType];\n\nexport const WEBHOOK_HEADER_NAMES = {\n [WebhookType.Webhooks]: {\n hmac: ShopifyHeader.Hmac,\n topic: ShopifyHeader.Topic,\n domain: ShopifyHeader.Domain,\n apiVersion: ShopifyHeader.ApiVersion,\n webhookId: ShopifyHeader.WebhookId,\n
|
|
1
|
+
{"version":3,"file":"types.js","sources":["../../../../../../lib/webhooks/types.ts"],"sourcesContent":["import {ValidationErrorReason, ValidationInvalid} from '../utils/types';\nimport {AdapterArgs} from '../../runtime/types';\nimport {Session} from '../session/session';\nimport {ShopifyEventsHeader, ShopifyHeader} from '../types';\n\nexport const WebhookType = {\n Webhooks: 'webhooks',\n Events: 'events',\n} as const;\n\nexport type WebhookTypeValue = (typeof WebhookType)[keyof typeof WebhookType];\n\nexport const WEBHOOK_HEADER_NAMES = {\n [WebhookType.Webhooks]: {\n hmac: ShopifyHeader.Hmac,\n topic: ShopifyHeader.Topic,\n domain: ShopifyHeader.Domain,\n apiVersion: ShopifyHeader.ApiVersion,\n webhookId: ShopifyHeader.WebhookId,\n name: ShopifyHeader.Name,\n triggeredAt: ShopifyHeader.TriggeredAt,\n eventId: ShopifyHeader.EventId,\n },\n [WebhookType.Events]: {\n hmac: ShopifyEventsHeader.Hmac,\n topic: ShopifyEventsHeader.Topic,\n domain: ShopifyEventsHeader.Domain,\n apiVersion: ShopifyEventsHeader.ApiVersion,\n webhookId: ShopifyEventsHeader.WebhookId,\n eventId: ShopifyEventsHeader.EventId,\n handle: ShopifyEventsHeader.Handle,\n action: ShopifyEventsHeader.Action,\n resourceId: ShopifyEventsHeader.ResourceId,\n triggeredAt: ShopifyEventsHeader.TriggeredAt,\n },\n} as const;\n\nexport enum DeliveryMethod {\n Http = 'http',\n EventBridge = 'eventbridge',\n PubSub = 'pubsub',\n}\n\nexport type WebhookHandlerFunction = (\n topic: string,\n shop_domain: string,\n body: string,\n webhookId: string,\n apiVersion?: string,\n context?: any,\n) => Promise<void>;\n\ninterface BaseWebhookHandler {\n id?: string;\n includeFields?: string[];\n metafieldNamespaces?: string[];\n context?: any;\n}\n\nexport interface HttpWebhookHandler extends BaseWebhookHandler {\n deliveryMethod: DeliveryMethod.Http;\n callbackUrl: string;\n}\n\nexport interface HttpWebhookHandlerWithCallback extends HttpWebhookHandler {\n callback: WebhookHandlerFunction;\n}\n\nexport interface EventBridgeWebhookHandler extends BaseWebhookHandler {\n deliveryMethod: DeliveryMethod.EventBridge;\n arn: string;\n}\n\nexport interface PubSubWebhookHandler extends BaseWebhookHandler {\n deliveryMethod: DeliveryMethod.PubSub;\n pubSubProject: string;\n pubSubTopic: string;\n}\n\nexport type WebhookHandler =\n | HttpWebhookHandler\n | HttpWebhookHandlerWithCallback\n | EventBridgeWebhookHandler\n | PubSubWebhookHandler;\n\n// See https://shopify.dev/docs/api/admin-graphql/latest/enums/webhooksubscriptiontopic for available topics\nexport type WebhookRegistry<Handler extends WebhookHandler = WebhookHandler> =\n Record<string, Handler[]>;\n\n// eslint-disable-next-line no-warning-comments\n// TODO Rethink the wording for this enum - the operations we're doing are actually \"subscribing\" and \"unsubscribing\"\n// Consider changing the values when releasing v12.0.0 when it can be safely deprecated\nexport enum WebhookOperation {\n Create = 'create',\n Update = 'update',\n Delete = 'delete',\n}\n\nexport interface RegisterParams {\n session: Session;\n}\n\nexport interface RegisterResult {\n success: boolean;\n deliveryMethod: DeliveryMethod;\n result: unknown;\n operation: WebhookOperation;\n}\n\nexport type RegisterReturn = Record<string, RegisterResult[]>;\n\ninterface WebhookHttpEndpoint {\n __typename: 'WebhookHttpEndpoint';\n callbackUrl: string;\n}\ninterface WebhookEventBridgeEndpoint {\n __typename: 'WebhookEventBridgeEndpoint';\n arn: string;\n}\ninterface WebhookPubSubEndpoint {\n __typename: 'WebhookPubSubEndpoint';\n pubSubProject: string;\n pubSubTopic: string;\n}\n\ntype WebhookEndpoint =\n WebhookHttpEndpoint | WebhookEventBridgeEndpoint | WebhookPubSubEndpoint;\n\nexport interface WebhookCheckResponseNode<\n T = {\n endpoint: WebhookEndpoint;\n },\n> {\n node: {\n id: string;\n topic: string;\n includeFields: string[];\n metafieldNamespaces: string[];\n } & T;\n}\n\nexport interface WebhookCheckResponse<T = WebhookCheckResponseNode> {\n webhookSubscriptions: {\n edges: T[];\n pageInfo: {\n endCursor: string;\n hasNextPage: boolean;\n };\n };\n}\n\nexport type AddHandlersParams = Record<\n string,\n WebhookHandler | WebhookHandler[]\n>;\n\nexport interface WebhookProcessParams extends AdapterArgs {\n rawBody: string;\n context?: any;\n}\n\nexport interface WebhookValidateParams extends WebhookProcessParams {}\n\nexport const WebhookValidationErrorReason = {\n ...ValidationErrorReason,\n MissingHeaders: 'missing_headers',\n} as const;\n\nexport type WebhookValidationErrorReasonType =\n (typeof WebhookValidationErrorReason)[keyof typeof WebhookValidationErrorReason];\n\ninterface BaseWebhookFields {\n apiVersion: string;\n domain: string;\n hmac: string;\n topic: string;\n triggeredAt?: string;\n}\n\nexport interface WebhooksWebhookFields extends BaseWebhookFields {\n webhookType: typeof WebhookType.Webhooks;\n webhookId: string;\n name?: string;\n eventId?: string;\n}\n\nexport interface EventsWebhookFields extends BaseWebhookFields {\n webhookType: typeof WebhookType.Events;\n webhookId: string;\n eventId: string;\n handle?: string;\n action?: string;\n resourceId?: string;\n}\n\nexport type WebhookFields = WebhooksWebhookFields | EventsWebhookFields;\n\nexport interface WebhookValidationInvalid extends Omit<\n ValidationInvalid,\n 'reason'\n> {\n valid: false;\n reason: WebhookValidationErrorReasonType;\n}\n\nexport interface WebhookValidationMissingHeaders extends WebhookValidationInvalid {\n reason: typeof WebhookValidationErrorReason.MissingHeaders;\n missingHeaders: string[];\n}\n\nexport type WebhookValidationValid = WebhookFields & {valid: true};\n\nexport type WebhookValidation =\n | WebhookValidationValid\n | WebhookValidationInvalid\n | WebhookValidationMissingHeaders;\n"],"names":["ShopifyHeader","ShopifyEventsHeader","DeliveryMethod","WebhookOperation","ValidationErrorReason"],"mappings":";;;;;AAKO,MAAM,WAAW,GAAG;AACzB,IAAA,QAAQ,EAAE,UAAU;AACpB,IAAA,MAAM,EAAE,QAAQ;;AAKX,MAAM,oBAAoB,GAAG;AAClC,IAAA,CAAC,WAAW,CAAC,QAAQ,GAAG;QACtB,IAAI,EAAEA,mBAAa,CAAC,IAAI;QACxB,KAAK,EAAEA,mBAAa,CAAC,KAAK;QAC1B,MAAM,EAAEA,mBAAa,CAAC,MAAM;QAC5B,UAAU,EAAEA,mBAAa,CAAC,UAAU;QACpC,SAAS,EAAEA,mBAAa,CAAC,SAAS;QAClC,IAAI,EAAEA,mBAAa,CAAC,IAAI;QACxB,WAAW,EAAEA,mBAAa,CAAC,WAAW;QACtC,OAAO,EAAEA,mBAAa,CAAC,OAAO;AAC/B,KAAA;AACD,IAAA,CAAC,WAAW,CAAC,MAAM,GAAG;QACpB,IAAI,EAAEC,yBAAmB,CAAC,IAAI;QAC9B,KAAK,EAAEA,yBAAmB,CAAC,KAAK;QAChC,MAAM,EAAEA,yBAAmB,CAAC,MAAM;QAClC,UAAU,EAAEA,yBAAmB,CAAC,UAAU;QAC1C,SAAS,EAAEA,yBAAmB,CAAC,SAAS;QACxC,OAAO,EAAEA,yBAAmB,CAAC,OAAO;QACpC,MAAM,EAAEA,yBAAmB,CAAC,MAAM;QAClC,MAAM,EAAEA,yBAAmB,CAAC,MAAM;QAClC,UAAU,EAAEA,yBAAmB,CAAC,UAAU;QAC1C,WAAW,EAAEA,yBAAmB,CAAC,WAAW;AAC7C,KAAA;;AAGSC;AAAZ,CAAA,UAAY,cAAc,EAAA;AACxB,IAAA,cAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,cAAA,CAAA,aAAA,CAAA,GAAA,aAA2B;AAC3B,IAAA,cAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACnB,CAAC,EAJWA,sBAAc,KAAdA,sBAAc,GAAA,EAAA,CAAA,CAAA;AAoD1B;AACA;AACA;AACYC;AAAZ,CAAA,UAAY,gBAAgB,EAAA;AAC1B,IAAA,gBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,gBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,gBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACnB,CAAC,EAJWA,wBAAgB,KAAhBA,wBAAgB,GAAA,EAAA,CAAA,CAAA;AAuErB,MAAM,4BAA4B,GAAG;AAC1C,IAAA,GAAGC,6BAAqB;AACxB,IAAA,cAAc,EAAE,iBAAiB;;;;;;;"}
|
|
@@ -75,9 +75,6 @@ function checkWebhooksHeaders(headers$1) {
|
|
|
75
75
|
apiVersion: apiVersion,
|
|
76
76
|
webhookId: webhookId,
|
|
77
77
|
};
|
|
78
|
-
const subTopic = headers.getHeader(headers$1, headerNames.subTopic);
|
|
79
|
-
if (subTopic)
|
|
80
|
-
fields.subTopic = subTopic;
|
|
81
78
|
const name = headers.getHeader(headers$1, headerNames.name);
|
|
82
79
|
if (name)
|
|
83
80
|
fields.name = name;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sources":["../../../../../../lib/webhooks/validate.ts"],"sourcesContent":["import {logger} from '../logger';\nimport {validateHmacFromRequestFactory} from '../utils/hmac-validator';\nimport {HmacValidationType, ValidationErrorReason} from '../utils/types';\nimport {\n abstractConvertRequest,\n getHeader,\n Headers,\n NormalizedRequest,\n} from '../../runtime/http';\nimport {ConfigInterface} from '../base-types';\n\nimport {\n EventsWebhookFields,\n WEBHOOK_HEADER_NAMES,\n WebhooksWebhookFields,\n WebhookType,\n WebhookTypeValue,\n WebhookValidateParams,\n WebhookValidation,\n WebhookValidationErrorReason,\n WebhookValidationMissingHeaders,\n WebhookValidationValid,\n} from './types';\nimport {topicForStorage} from './registry';\n\nfunction detectWebhookType(headers: Headers): WebhookTypeValue {\n const eventsHmac = getHeader(\n headers,\n WEBHOOK_HEADER_NAMES[WebhookType.Events].hmac,\n );\n if (eventsHmac) {\n return WebhookType.Events;\n }\n\n const webhooksHmac = getHeader(\n headers,\n WEBHOOK_HEADER_NAMES[WebhookType.Webhooks].hmac,\n );\n if (webhooksHmac) {\n return WebhookType.Webhooks;\n }\n\n return WebhookType.Webhooks;\n}\n\nexport function validateFactory(config: ConfigInterface) {\n return async function validate({\n rawBody,\n ...adapterArgs\n }: WebhookValidateParams): Promise<WebhookValidation> {\n const request: NormalizedRequest =\n await abstractConvertRequest(adapterArgs);\n\n const webhookType = detectWebhookType(request.headers);\n\n const validHmacResult = await validateHmacFromRequestFactory(config)({\n type: HmacValidationType.Webhook,\n rawBody,\n webhookType,\n ...adapterArgs,\n });\n\n if (!validHmacResult.valid) {\n if (validHmacResult.reason === ValidationErrorReason.InvalidHmac) {\n const log = logger(config);\n await log.debug(\n \"Webhook HMAC validation failed. Please note that events manually triggered from a store's Notifications settings will fail this validation. To test this, please use the CLI or trigger the actual event in a development store.\",\n );\n }\n return validHmacResult;\n }\n\n return checkWebhookHeaders(request.headers, webhookType);\n };\n}\n\nfunction getRequiredHeader(\n headers: Headers,\n headerName: string,\n missingHeaders: string[],\n): string | undefined {\n const value = getHeader(headers, headerName);\n if (!value) {\n missingHeaders.push(headerName);\n }\n return value;\n}\n\nfunction checkWebhookHeaders(\n headers: Headers,\n webhookType: WebhookTypeValue,\n): WebhookValidationMissingHeaders | WebhookValidationValid {\n if (webhookType === WebhookType.Webhooks) {\n return checkWebhooksHeaders(headers);\n }\n return checkEventsHeaders(headers);\n}\n\nfunction checkWebhooksHeaders(\n headers: Headers,\n): WebhookValidationMissingHeaders | WebhookValidationValid {\n const headerNames = WEBHOOK_HEADER_NAMES[WebhookType.Webhooks];\n const missingHeaders: string[] = [];\n\n const hmac = getRequiredHeader(headers, headerNames.hmac, missingHeaders);\n const topic = getRequiredHeader(headers, headerNames.topic, missingHeaders);\n const domain = getRequiredHeader(headers, headerNames.domain, missingHeaders);\n const apiVersion = getRequiredHeader(\n headers,\n headerNames.apiVersion,\n missingHeaders,\n );\n const webhookId = getRequiredHeader(\n headers,\n headerNames.webhookId,\n missingHeaders,\n );\n\n if (missingHeaders.length) {\n return {\n valid: false,\n reason: WebhookValidationErrorReason.MissingHeaders,\n missingHeaders,\n };\n }\n\n const fields: WebhooksWebhookFields = {\n webhookType: WebhookType.Webhooks,\n hmac: hmac!,\n topic: topicForStorage(topic!),\n domain: domain!,\n apiVersion: apiVersion!,\n webhookId: webhookId!,\n };\n\n const subTopic = getHeader(headers, headerNames.subTopic);\n if (subTopic) fields.subTopic = subTopic;\n\n const name = getHeader(headers, headerNames.name);\n if (name) fields.name = name;\n\n const triggeredAt = getHeader(headers, headerNames.triggeredAt);\n if (triggeredAt) fields.triggeredAt = triggeredAt;\n\n const eventId = getHeader(headers, headerNames.eventId);\n if (eventId) fields.eventId = eventId;\n\n return {valid: true, ...fields};\n}\n\nfunction checkEventsHeaders(\n headers: Headers,\n): WebhookValidationMissingHeaders | WebhookValidationValid {\n const headerNames = WEBHOOK_HEADER_NAMES[WebhookType.Events];\n const missingHeaders: string[] = [];\n\n const hmac = getRequiredHeader(headers, headerNames.hmac, missingHeaders);\n const topic = getRequiredHeader(headers, headerNames.topic, missingHeaders);\n const domain = getRequiredHeader(headers, headerNames.domain, missingHeaders);\n const apiVersion = getRequiredHeader(\n headers,\n headerNames.apiVersion,\n missingHeaders,\n );\n const webhookId = getRequiredHeader(\n headers,\n headerNames.webhookId,\n missingHeaders,\n );\n const eventId = getRequiredHeader(\n headers,\n headerNames.eventId,\n missingHeaders,\n );\n\n if (missingHeaders.length) {\n return {\n valid: false,\n reason: WebhookValidationErrorReason.MissingHeaders,\n missingHeaders,\n };\n }\n\n const fields: EventsWebhookFields = {\n webhookType: WebhookType.Events,\n hmac: hmac!,\n topic: topicForStorage(topic!),\n domain: domain!,\n apiVersion: apiVersion!,\n webhookId: webhookId!,\n eventId: eventId!,\n };\n\n const handle = getHeader(headers, headerNames.handle);\n if (handle) fields.handle = handle;\n\n const action = getHeader(headers, headerNames.action);\n if (action) fields.action = action;\n\n const resourceId = getHeader(headers, headerNames.resourceId);\n if (resourceId) fields.resourceId = resourceId;\n\n const triggeredAt = getHeader(headers, headerNames.triggeredAt);\n if (triggeredAt) fields.triggeredAt = triggeredAt;\n\n return {valid: true, ...fields};\n}\n"],"names":["headers","getHeader","WEBHOOK_HEADER_NAMES","WebhookType","abstractConvertRequest","validateHmacFromRequestFactory","HmacValidationType","ValidationErrorReason","logger","WebhookValidationErrorReason","topicForStorage"],"mappings":";;;;;;;;;;AAyBA,SAAS,iBAAiB,CAACA,SAAgB,EAAA;AACzC,IAAA,MAAM,UAAU,GAAGC,iBAAS,CAC1BD,SAAO,EACPE,4BAAoB,CAACC,mBAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAC9C;IACD,IAAI,UAAU,EAAE;QACd,OAAOA,mBAAW,CAAC,MAAM;IAC3B;AAEA,IAAA,MAAM,YAAY,GAAGF,iBAAS,CAC5BD,SAAO,EACPE,4BAAoB,CAACC,mBAAW,CAAC,QAAQ,CAAC,CAAC,IAAI,CAChD;IACD,IAAI,YAAY,EAAE;QAChB,OAAOA,mBAAW,CAAC,QAAQ;IAC7B;IAEA,OAAOA,mBAAW,CAAC,QAAQ;AAC7B;AAEM,SAAU,eAAe,CAAC,MAAuB,EAAA;IACrD,OAAO,eAAe,QAAQ,CAAC,EAC7B,OAAO,EACP,GAAG,WAAW,EACQ,EAAA;AACtB,QAAA,MAAM,OAAO,GACX,MAAMC,4BAAsB,CAAC,WAAW,CAAC;QAE3C,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC;AAEtD,QAAA,MAAM,eAAe,GAAG,MAAMC,4CAA8B,CAAC,MAAM,CAAC,CAAC;YACnE,IAAI,EAAEC,wBAAkB,CAAC,OAAO;YAChC,OAAO;YACP,WAAW;AACX,YAAA,GAAG,WAAW;AACf,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;YAC1B,IAAI,eAAe,CAAC,MAAM,KAAKC,2BAAqB,CAAC,WAAW,EAAE;AAChE,gBAAA,MAAM,GAAG,GAAGC,cAAM,CAAC,MAAM,CAAC;AAC1B,gBAAA,MAAM,GAAG,CAAC,KAAK,CACb,kOAAkO,CACnO;YACH;AACA,YAAA,OAAO,eAAe;QACxB;QAEA,OAAO,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC;AAC1D,IAAA,CAAC;AACH;AAEA,SAAS,iBAAiB,CACxBR,SAAgB,EAChB,UAAkB,EAClB,cAAwB,EAAA;IAExB,MAAM,KAAK,GAAGC,iBAAS,CAACD,SAAO,EAAE,UAAU,CAAC;IAC5C,IAAI,CAAC,KAAK,EAAE;AACV,QAAA,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC;IACjC;AACA,IAAA,OAAO,KAAK;AACd;AAEA,SAAS,mBAAmB,CAC1B,OAAgB,EAChB,WAA6B,EAAA;AAE7B,IAAA,IAAI,WAAW,KAAKG,mBAAW,CAAC,QAAQ,EAAE;AACxC,QAAA,OAAO,oBAAoB,CAAC,OAAO,CAAC;IACtC;AACA,IAAA,OAAO,kBAAkB,CAAC,OAAO,CAAC;AACpC;AAEA,SAAS,oBAAoB,CAC3BH,SAAgB,EAAA;IAEhB,MAAM,WAAW,GAAGE,4BAAoB,CAACC,mBAAW,CAAC,QAAQ,CAAC;IAC9D,MAAM,cAAc,GAAa,EAAE;AAEnC,IAAA,MAAM,IAAI,GAAG,iBAAiB,CAACH,SAAO,EAAE,WAAW,CAAC,IAAI,EAAE,cAAc,CAAC;AACzE,IAAA,MAAM,KAAK,GAAG,iBAAiB,CAACA,SAAO,EAAE,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC;AAC3E,IAAA,MAAM,MAAM,GAAG,iBAAiB,CAACA,SAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC;AAC7E,IAAA,MAAM,UAAU,GAAG,iBAAiB,CAClCA,SAAO,EACP,WAAW,CAAC,UAAU,EACtB,cAAc,CACf;AACD,IAAA,MAAM,SAAS,GAAG,iBAAiB,CACjCA,SAAO,EACP,WAAW,CAAC,SAAS,EACrB,cAAc,CACf;AAED,IAAA,IAAI,cAAc,CAAC,MAAM,EAAE;QACzB,OAAO;AACL,YAAA,KAAK,EAAE,KAAK;YACZ,MAAM,EAAES,oCAA4B,CAAC,cAAc;YACnD,cAAc;SACf;IACH;AAEA,IAAA,MAAM,MAAM,GAA0B;QACpC,WAAW,EAAEN,mBAAW,CAAC,QAAQ;AACjC,QAAA,IAAI,EAAE,IAAK;AACX,QAAA,KAAK,EAAEO,wBAAe,CAAC,KAAM,CAAC;AAC9B,QAAA,MAAM,EAAE,MAAO;AACf,QAAA,UAAU,EAAE,UAAW;AACvB,QAAA,SAAS,EAAE,SAAU;KACtB;IAED,MAAM,QAAQ,GAAGT,iBAAS,CAACD,SAAO,EAAE,WAAW,CAAC,QAAQ,CAAC;AACzD,IAAA,IAAI,QAAQ;AAAE,QAAA,MAAM,CAAC,QAAQ,GAAG,QAAQ;IAExC,MAAM,IAAI,GAAGC,iBAAS,CAACD,SAAO,EAAE,WAAW,CAAC,IAAI,CAAC;AACjD,IAAA,IAAI,IAAI;AAAE,QAAA,MAAM,CAAC,IAAI,GAAG,IAAI;IAE5B,MAAM,WAAW,GAAGC,iBAAS,CAACD,SAAO,EAAE,WAAW,CAAC,WAAW,CAAC;AAC/D,IAAA,IAAI,WAAW;AAAE,QAAA,MAAM,CAAC,WAAW,GAAG,WAAW;IAEjD,MAAM,OAAO,GAAGC,iBAAS,CAACD,SAAO,EAAE,WAAW,CAAC,OAAO,CAAC;AACvD,IAAA,IAAI,OAAO;AAAE,QAAA,MAAM,CAAC,OAAO,GAAG,OAAO;IAErC,OAAO,EAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,EAAC;AACjC;AAEA,SAAS,kBAAkB,CACzBA,SAAgB,EAAA;IAEhB,MAAM,WAAW,GAAGE,4BAAoB,CAACC,mBAAW,CAAC,MAAM,CAAC;IAC5D,MAAM,cAAc,GAAa,EAAE;AAEnC,IAAA,MAAM,IAAI,GAAG,iBAAiB,CAACH,SAAO,EAAE,WAAW,CAAC,IAAI,EAAE,cAAc,CAAC;AACzE,IAAA,MAAM,KAAK,GAAG,iBAAiB,CAACA,SAAO,EAAE,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC;AAC3E,IAAA,MAAM,MAAM,GAAG,iBAAiB,CAACA,SAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC;AAC7E,IAAA,MAAM,UAAU,GAAG,iBAAiB,CAClCA,SAAO,EACP,WAAW,CAAC,UAAU,EACtB,cAAc,CACf;AACD,IAAA,MAAM,SAAS,GAAG,iBAAiB,CACjCA,SAAO,EACP,WAAW,CAAC,SAAS,EACrB,cAAc,CACf;AACD,IAAA,MAAM,OAAO,GAAG,iBAAiB,CAC/BA,SAAO,EACP,WAAW,CAAC,OAAO,EACnB,cAAc,CACf;AAED,IAAA,IAAI,cAAc,CAAC,MAAM,EAAE;QACzB,OAAO;AACL,YAAA,KAAK,EAAE,KAAK;YACZ,MAAM,EAAES,oCAA4B,CAAC,cAAc;YACnD,cAAc;SACf;IACH;AAEA,IAAA,MAAM,MAAM,GAAwB;QAClC,WAAW,EAAEN,mBAAW,CAAC,MAAM;AAC/B,QAAA,IAAI,EAAE,IAAK;AACX,QAAA,KAAK,EAAEO,wBAAe,CAAC,KAAM,CAAC;AAC9B,QAAA,MAAM,EAAE,MAAO;AACf,QAAA,UAAU,EAAE,UAAW;AACvB,QAAA,SAAS,EAAE,SAAU;AACrB,QAAA,OAAO,EAAE,OAAQ;KAClB;IAED,MAAM,MAAM,GAAGT,iBAAS,CAACD,SAAO,EAAE,WAAW,CAAC,MAAM,CAAC;AACrD,IAAA,IAAI,MAAM;AAAE,QAAA,MAAM,CAAC,MAAM,GAAG,MAAM;IAElC,MAAM,MAAM,GAAGC,iBAAS,CAACD,SAAO,EAAE,WAAW,CAAC,MAAM,CAAC;AACrD,IAAA,IAAI,MAAM;AAAE,QAAA,MAAM,CAAC,MAAM,GAAG,MAAM;IAElC,MAAM,UAAU,GAAGC,iBAAS,CAACD,SAAO,EAAE,WAAW,CAAC,UAAU,CAAC;AAC7D,IAAA,IAAI,UAAU;AAAE,QAAA,MAAM,CAAC,UAAU,GAAG,UAAU;IAE9C,MAAM,WAAW,GAAGC,iBAAS,CAACD,SAAO,EAAE,WAAW,CAAC,WAAW,CAAC;AAC/D,IAAA,IAAI,WAAW;AAAE,QAAA,MAAM,CAAC,WAAW,GAAG,WAAW;IAEjD,OAAO,EAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,EAAC;AACjC;;;;"}
|
|
1
|
+
{"version":3,"file":"validate.js","sources":["../../../../../../lib/webhooks/validate.ts"],"sourcesContent":["import {logger} from '../logger';\nimport {validateHmacFromRequestFactory} from '../utils/hmac-validator';\nimport {HmacValidationType, ValidationErrorReason} from '../utils/types';\nimport {\n abstractConvertRequest,\n getHeader,\n Headers,\n NormalizedRequest,\n} from '../../runtime/http';\nimport {ConfigInterface} from '../base-types';\n\nimport {\n EventsWebhookFields,\n WEBHOOK_HEADER_NAMES,\n WebhooksWebhookFields,\n WebhookType,\n WebhookTypeValue,\n WebhookValidateParams,\n WebhookValidation,\n WebhookValidationErrorReason,\n WebhookValidationMissingHeaders,\n WebhookValidationValid,\n} from './types';\nimport {topicForStorage} from './registry';\n\nfunction detectWebhookType(headers: Headers): WebhookTypeValue {\n const eventsHmac = getHeader(\n headers,\n WEBHOOK_HEADER_NAMES[WebhookType.Events].hmac,\n );\n if (eventsHmac) {\n return WebhookType.Events;\n }\n\n const webhooksHmac = getHeader(\n headers,\n WEBHOOK_HEADER_NAMES[WebhookType.Webhooks].hmac,\n );\n if (webhooksHmac) {\n return WebhookType.Webhooks;\n }\n\n return WebhookType.Webhooks;\n}\n\nexport function validateFactory(config: ConfigInterface) {\n return async function validate({\n rawBody,\n ...adapterArgs\n }: WebhookValidateParams): Promise<WebhookValidation> {\n const request: NormalizedRequest =\n await abstractConvertRequest(adapterArgs);\n\n const webhookType = detectWebhookType(request.headers);\n\n const validHmacResult = await validateHmacFromRequestFactory(config)({\n type: HmacValidationType.Webhook,\n rawBody,\n webhookType,\n ...adapterArgs,\n });\n\n if (!validHmacResult.valid) {\n if (validHmacResult.reason === ValidationErrorReason.InvalidHmac) {\n const log = logger(config);\n await log.debug(\n \"Webhook HMAC validation failed. Please note that events manually triggered from a store's Notifications settings will fail this validation. To test this, please use the CLI or trigger the actual event in a development store.\",\n );\n }\n return validHmacResult;\n }\n\n return checkWebhookHeaders(request.headers, webhookType);\n };\n}\n\nfunction getRequiredHeader(\n headers: Headers,\n headerName: string,\n missingHeaders: string[],\n): string | undefined {\n const value = getHeader(headers, headerName);\n if (!value) {\n missingHeaders.push(headerName);\n }\n return value;\n}\n\nfunction checkWebhookHeaders(\n headers: Headers,\n webhookType: WebhookTypeValue,\n): WebhookValidationMissingHeaders | WebhookValidationValid {\n if (webhookType === WebhookType.Webhooks) {\n return checkWebhooksHeaders(headers);\n }\n return checkEventsHeaders(headers);\n}\n\nfunction checkWebhooksHeaders(\n headers: Headers,\n): WebhookValidationMissingHeaders | WebhookValidationValid {\n const headerNames = WEBHOOK_HEADER_NAMES[WebhookType.Webhooks];\n const missingHeaders: string[] = [];\n\n const hmac = getRequiredHeader(headers, headerNames.hmac, missingHeaders);\n const topic = getRequiredHeader(headers, headerNames.topic, missingHeaders);\n const domain = getRequiredHeader(headers, headerNames.domain, missingHeaders);\n const apiVersion = getRequiredHeader(\n headers,\n headerNames.apiVersion,\n missingHeaders,\n );\n const webhookId = getRequiredHeader(\n headers,\n headerNames.webhookId,\n missingHeaders,\n );\n\n if (missingHeaders.length) {\n return {\n valid: false,\n reason: WebhookValidationErrorReason.MissingHeaders,\n missingHeaders,\n };\n }\n\n const fields: WebhooksWebhookFields = {\n webhookType: WebhookType.Webhooks,\n hmac: hmac!,\n topic: topicForStorage(topic!),\n domain: domain!,\n apiVersion: apiVersion!,\n webhookId: webhookId!,\n };\n\n const name = getHeader(headers, headerNames.name);\n if (name) fields.name = name;\n\n const triggeredAt = getHeader(headers, headerNames.triggeredAt);\n if (triggeredAt) fields.triggeredAt = triggeredAt;\n\n const eventId = getHeader(headers, headerNames.eventId);\n if (eventId) fields.eventId = eventId;\n\n return {valid: true, ...fields};\n}\n\nfunction checkEventsHeaders(\n headers: Headers,\n): WebhookValidationMissingHeaders | WebhookValidationValid {\n const headerNames = WEBHOOK_HEADER_NAMES[WebhookType.Events];\n const missingHeaders: string[] = [];\n\n const hmac = getRequiredHeader(headers, headerNames.hmac, missingHeaders);\n const topic = getRequiredHeader(headers, headerNames.topic, missingHeaders);\n const domain = getRequiredHeader(headers, headerNames.domain, missingHeaders);\n const apiVersion = getRequiredHeader(\n headers,\n headerNames.apiVersion,\n missingHeaders,\n );\n const webhookId = getRequiredHeader(\n headers,\n headerNames.webhookId,\n missingHeaders,\n );\n const eventId = getRequiredHeader(\n headers,\n headerNames.eventId,\n missingHeaders,\n );\n\n if (missingHeaders.length) {\n return {\n valid: false,\n reason: WebhookValidationErrorReason.MissingHeaders,\n missingHeaders,\n };\n }\n\n const fields: EventsWebhookFields = {\n webhookType: WebhookType.Events,\n hmac: hmac!,\n topic: topicForStorage(topic!),\n domain: domain!,\n apiVersion: apiVersion!,\n webhookId: webhookId!,\n eventId: eventId!,\n };\n\n const handle = getHeader(headers, headerNames.handle);\n if (handle) fields.handle = handle;\n\n const action = getHeader(headers, headerNames.action);\n if (action) fields.action = action;\n\n const resourceId = getHeader(headers, headerNames.resourceId);\n if (resourceId) fields.resourceId = resourceId;\n\n const triggeredAt = getHeader(headers, headerNames.triggeredAt);\n if (triggeredAt) fields.triggeredAt = triggeredAt;\n\n return {valid: true, ...fields};\n}\n"],"names":["headers","getHeader","WEBHOOK_HEADER_NAMES","WebhookType","abstractConvertRequest","validateHmacFromRequestFactory","HmacValidationType","ValidationErrorReason","logger","WebhookValidationErrorReason","topicForStorage"],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var base = require('../../base.js');
|
|
4
|
+
var types = require('../../../lib/types.js');
|
|
5
|
+
var currency = require('./currency.js');
|
|
6
|
+
var customer = require('./customer.js');
|
|
7
|
+
var discount_code = require('./discount_code.js');
|
|
8
|
+
|
|
9
|
+
/***********************************************************************************************************************
|
|
10
|
+
* This file is auto-generated. If you have an issue, please create a GitHub issue. *
|
|
11
|
+
***********************************************************************************************************************/
|
|
12
|
+
class AbandonedCheckout extends base.Base {
|
|
13
|
+
static apiVersion = types.ApiVersion.July26;
|
|
14
|
+
static hasOne = {
|
|
15
|
+
"currency": currency.Currency,
|
|
16
|
+
"customer": customer.Customer
|
|
17
|
+
};
|
|
18
|
+
static hasMany = {
|
|
19
|
+
"discount_codes": discount_code.DiscountCode
|
|
20
|
+
};
|
|
21
|
+
static paths = [
|
|
22
|
+
{ "http_method": "get", "operation": "checkouts", "ids": [], "path": "checkouts.json" },
|
|
23
|
+
{ "http_method": "get", "operation": "checkouts", "ids": [], "path": "checkouts.json" }
|
|
24
|
+
];
|
|
25
|
+
static resourceNames = [
|
|
26
|
+
{
|
|
27
|
+
"singular": "abandoned_checkout",
|
|
28
|
+
"plural": "abandoned_checkouts"
|
|
29
|
+
}
|
|
30
|
+
];
|
|
31
|
+
static async checkouts({ session, since_id = null, created_at_min = null, created_at_max = null, updated_at_min = null, updated_at_max = null, status = null, limit = null, ...otherArgs }) {
|
|
32
|
+
const response = await this.request({
|
|
33
|
+
http_method: "get",
|
|
34
|
+
operation: "checkouts",
|
|
35
|
+
session: session,
|
|
36
|
+
urlIds: {},
|
|
37
|
+
params: { "since_id": since_id, "created_at_min": created_at_min, "created_at_max": created_at_max, "updated_at_min": updated_at_min, "updated_at_max": updated_at_max, "status": status, "limit": limit, ...otherArgs },
|
|
38
|
+
body: {},
|
|
39
|
+
entity: null,
|
|
40
|
+
});
|
|
41
|
+
return response ? response.body : null;
|
|
42
|
+
}
|
|
43
|
+
abandoned_checkout_url;
|
|
44
|
+
billing_address;
|
|
45
|
+
buyer_accepts_marketing;
|
|
46
|
+
buyer_accepts_sms_marketing;
|
|
47
|
+
cart_token;
|
|
48
|
+
closed_at;
|
|
49
|
+
completed_at;
|
|
50
|
+
created_at;
|
|
51
|
+
currency;
|
|
52
|
+
customer;
|
|
53
|
+
customer_locale;
|
|
54
|
+
device_id;
|
|
55
|
+
discount_codes;
|
|
56
|
+
email;
|
|
57
|
+
gateway;
|
|
58
|
+
id;
|
|
59
|
+
landing_site;
|
|
60
|
+
line_items;
|
|
61
|
+
location_id;
|
|
62
|
+
note;
|
|
63
|
+
phone;
|
|
64
|
+
presentment_currency;
|
|
65
|
+
referring_site;
|
|
66
|
+
shipping_address;
|
|
67
|
+
shipping_lines;
|
|
68
|
+
sms_marketing_phone;
|
|
69
|
+
source_name;
|
|
70
|
+
subtotal_price;
|
|
71
|
+
tax_lines;
|
|
72
|
+
taxes_included;
|
|
73
|
+
token;
|
|
74
|
+
total_discounts;
|
|
75
|
+
total_duties;
|
|
76
|
+
total_line_items_price;
|
|
77
|
+
total_price;
|
|
78
|
+
total_tax;
|
|
79
|
+
total_weight;
|
|
80
|
+
updated_at;
|
|
81
|
+
user_id;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
exports.AbandonedCheckout = AbandonedCheckout;
|
|
85
|
+
//# sourceMappingURL=abandoned_checkout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abandoned_checkout.js","sources":["../../../../../../../rest/admin/2026-07/abandoned_checkout.ts"],"sourcesContent":["/***********************************************************************************************************************\n* This file is auto-generated. If you have an issue, please create a GitHub issue. *\n***********************************************************************************************************************/\n\nimport {Base} from '../../base';\nimport {ResourcePath, ResourceNames} from '../../types';\nimport {Session} from '../../../lib/session/session';\nimport {ApiVersion} from '../../../lib/types';\n\nimport {Currency} from './currency';\nimport {Customer} from './customer';\nimport {DiscountCode} from './discount_code';\n\ninterface CheckoutsArgs {\n [key: string]: unknown;\n session: Session;\n since_id?: unknown;\n created_at_min?: unknown;\n created_at_max?: unknown;\n updated_at_min?: unknown;\n updated_at_max?: unknown;\n status?: unknown;\n limit?: unknown;\n}\n\nexport class AbandonedCheckout extends Base {\n public static apiVersion = ApiVersion.July26;\n\n protected static hasOne: {[key: string]: typeof Base} = {\n \"currency\": Currency,\n \"customer\": Customer\n };\n protected static hasMany: {[key: string]: typeof Base} = {\n \"discount_codes\": DiscountCode\n };\n protected static paths: ResourcePath[] = [\n {\"http_method\": \"get\", \"operation\": \"checkouts\", \"ids\": [], \"path\": \"checkouts.json\"},\n {\"http_method\": \"get\", \"operation\": \"checkouts\", \"ids\": [], \"path\": \"checkouts.json\"}\n ];\n protected static resourceNames: ResourceNames[] = [\n {\n \"singular\": \"abandoned_checkout\",\n \"plural\": \"abandoned_checkouts\"\n }\n ];\n\n public static async checkouts(\n {\n session,\n since_id = null,\n created_at_min = null,\n created_at_max = null,\n updated_at_min = null,\n updated_at_max = null,\n status = null,\n limit = null,\n ...otherArgs\n }: CheckoutsArgs\n ): Promise<unknown> {\n const response = await this.request<AbandonedCheckout>({\n http_method: \"get\",\n operation: \"checkouts\",\n session: session,\n urlIds: {},\n params: {\"since_id\": since_id, \"created_at_min\": created_at_min, \"created_at_max\": created_at_max, \"updated_at_min\": updated_at_min, \"updated_at_max\": updated_at_max, \"status\": status, \"limit\": limit, ...otherArgs},\n body: {},\n entity: null,\n });\n\n return response ? response.body : null;\n }\n\n public abandoned_checkout_url: string | null;\n public billing_address: {[key: string]: unknown} | null;\n public buyer_accepts_marketing: boolean | null;\n public buyer_accepts_sms_marketing: boolean | null;\n public cart_token: string | null;\n public closed_at: string | null;\n public completed_at: string | null;\n public created_at: string | null;\n public currency: Currency | null | {[key: string]: any};\n public customer: Customer | null | {[key: string]: any};\n public customer_locale: string | null;\n public device_id: string | null;\n public discount_codes: DiscountCode[] | null | {[key: string]: any};\n public email: string | null;\n public gateway: string | null;\n public id: string | null;\n public landing_site: string | null;\n public line_items: {[key: string]: unknown} | null;\n public location_id: string | null;\n public note: string | null;\n public phone: string | null;\n public presentment_currency: string | null;\n public referring_site: string | null;\n public shipping_address: {[key: string]: unknown} | null;\n public shipping_lines: {[key: string]: unknown} | null;\n public sms_marketing_phone: string | null;\n public source_name: string | null;\n public subtotal_price: string | null;\n public tax_lines: {[key: string]: unknown} | null;\n public taxes_included: boolean | null;\n public token: string | null;\n public total_discounts: string | null;\n public total_duties: string | null;\n public total_line_items_price: string | null;\n public total_price: string | null;\n public total_tax: string | null;\n public total_weight: number | null;\n public updated_at: string | null;\n public user_id: string | null;\n}\n"],"names":["Base","ApiVersion","Currency","Customer","DiscountCode"],"mappings":";;;;;;;;AAAA;;AAEwH;AAuBlH,MAAO,iBAAkB,SAAQA,SAAI,CAAA;AAClC,IAAA,OAAO,UAAU,GAAGC,gBAAU,CAAC,MAAM;IAElC,OAAO,MAAM,GAAiC;AACtD,QAAA,UAAU,EAAEC,iBAAQ;AACpB,QAAA,UAAU,EAAEC;KACb;IACS,OAAO,OAAO,GAAiC;AACvD,QAAA,gBAAgB,EAAEC;KACnB;IACS,OAAO,KAAK,GAAmB;AACvC,QAAA,EAAC,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAC;AACrF,QAAA,EAAC,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,gBAAgB;KACrF;IACS,OAAO,aAAa,GAAoB;AAChD,QAAA;AACE,YAAA,UAAU,EAAE,oBAAoB;AAChC,YAAA,QAAQ,EAAE;AACX;KACF;AAEM,IAAA,aAAa,SAAS,CAC3B,EACE,OAAO,EACP,QAAQ,GAAG,IAAI,EACf,cAAc,GAAG,IAAI,EACrB,cAAc,GAAG,IAAI,EACrB,cAAc,GAAG,IAAI,EACrB,cAAc,GAAG,IAAI,EACrB,MAAM,GAAG,IAAI,EACb,KAAK,GAAG,IAAI,EACZ,GAAG,SAAS,EACE,EAAA;AAEhB,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAoB;AACrD,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,SAAS,EAAE,WAAW;AACtB,YAAA,OAAO,EAAE,OAAO;AAChB,YAAA,MAAM,EAAE,EAAE;AACV,YAAA,MAAM,EAAE,EAAC,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,SAAS,EAAC;AACtN,YAAA,IAAI,EAAE,EAAE;AACR,YAAA,MAAM,EAAE,IAAI;AACb,SAAA,CAAC;QAEF,OAAO,QAAQ,GAAG,QAAQ,CAAC,IAAI,GAAG,IAAI;IACxC;AAEO,IAAA,sBAAsB;AACtB,IAAA,eAAe;AACf,IAAA,uBAAuB;AACvB,IAAA,2BAA2B;AAC3B,IAAA,UAAU;AACV,IAAA,SAAS;AACT,IAAA,YAAY;AACZ,IAAA,UAAU;AACV,IAAA,QAAQ;AACR,IAAA,QAAQ;AACR,IAAA,eAAe;AACf,IAAA,SAAS;AACT,IAAA,cAAc;AACd,IAAA,KAAK;AACL,IAAA,OAAO;AACP,IAAA,EAAE;AACF,IAAA,YAAY;AACZ,IAAA,UAAU;AACV,IAAA,WAAW;AACX,IAAA,IAAI;AACJ,IAAA,KAAK;AACL,IAAA,oBAAoB;AACpB,IAAA,cAAc;AACd,IAAA,gBAAgB;AAChB,IAAA,cAAc;AACd,IAAA,mBAAmB;AACnB,IAAA,WAAW;AACX,IAAA,cAAc;AACd,IAAA,SAAS;AACT,IAAA,cAAc;AACd,IAAA,KAAK;AACL,IAAA,eAAe;AACf,IAAA,YAAY;AACZ,IAAA,sBAAsB;AACtB,IAAA,WAAW;AACX,IAAA,SAAS;AACT,IAAA,YAAY;AACZ,IAAA,UAAU;AACV,IAAA,OAAO;;;;;"}
|