UNPKG

@tailor-platform/shopify

Version:

Shopify Admin API client with Tailor Platform integration

504 lines (502 loc) 19.7 kB
// src/errors.ts var ShopifyApiError = class extends Error { errors; extensions; constructor(message, errors, extensions) { super(message); this.name = "ShopifyApiError"; this.errors = errors; this.extensions = extensions; } }; var NetworkError = class extends Error { statusCode; response; constructor(message, statusCode, response) { super(message); this.name = "NetworkError"; this.statusCode = statusCode; this.response = response; } }; var ConfigurationError = class extends Error { constructor(message) { super(message); this.name = "ConfigurationError"; } }; // src/client.ts var TAILOR_API_ENDPOINT = "https://shopify-g4l5uulnln.erp.dev/query"; function validateConfig(config) { if (!config.storeDomain) { throw new ConfigurationError("storeDomain is required"); } if (!config.apiVersion) { throw new ConfigurationError("apiVersion is required"); } if (!config.accessToken) { throw new ConfigurationError("accessToken (integration token) is required"); } if (!config.accessToken.startsWith("tst_")) { throw new ConfigurationError( 'Invalid integration token format. Expected token starting with "tst_"' ); } } function gql(strings, ...values) { const query = strings.reduce( (acc, str, i) => acc + str + (values[i] ?? ""), "" ); return { query }; } function createAdminApiClient(config) { validateConfig(config); return { request: async (operation, options) => { const query = typeof operation === "string" ? operation : operation.query; const input = { integrationToken: config.accessToken, shopDomain: config.storeDomain, apiVersion: config.apiVersion, query, variables: options?.variables ? JSON.stringify(options.variables) : void 0, headers: options?.headers ? JSON.stringify(options.headers) : void 0 }; const graphqlQuery = ` mutation GraphQLProxy($input: GraphQLProxyInput!) { graphqlProxy(input: $input) { success data errors extensions userErrors } } `; try { const response = await fetch(TAILOR_API_ENDPOINT, { method: "POST", headers: { "Content-Type": "application/json", Accept: "application/json" }, body: JSON.stringify({ query: graphqlQuery, variables: { input } }) }); if (!response.ok) { throw new NetworkError( `Network request failed with status ${response.status}`, response.status, response ); } const result = await response.json(); if (result.errors && result.errors.length > 0) { throw new NetworkError( "GraphQL proxy request failed", response.status, response ); } const proxyResponse = result.data?.graphqlProxy; if (!proxyResponse) { throw new NetworkError( "Invalid response from proxy", response.status, response ); } if (!proxyResponse.success) { let errors = []; let extensions; if (proxyResponse.errors) { try { errors = JSON.parse(proxyResponse.errors); } catch { errors = [{ message: proxyResponse.errors }]; } } if (proxyResponse.extensions) { try { extensions = JSON.parse(proxyResponse.extensions); } catch { } } if (errors.length > 0) { const firstError = errors[0]; throw new ShopifyApiError( firstError.message ?? "Request failed", errors, extensions ); } throw new ShopifyApiError("Request failed without specific error"); } let shopifyData; if (proxyResponse.data) { shopifyData = JSON.parse(proxyResponse.data); } const shopifyResponse = shopifyData !== void 0 ? { data: shopifyData } : {}; if (proxyResponse.errors) { try { shopifyResponse.errors = JSON.parse(proxyResponse.errors); } catch { shopifyResponse.errors = [{ message: proxyResponse.errors }]; } } if (proxyResponse.extensions) { try { shopifyResponse.extensions = JSON.parse(proxyResponse.extensions); } catch { } } return shopifyResponse; } catch (error) { if (error instanceof ShopifyApiError || error instanceof NetworkError) { throw error; } if (error instanceof Error) { throw new NetworkError(error.message); } throw new NetworkError("An unknown error occurred"); } } }; } // src/constants.ts var ApiVersion = { // Stable versions (as of 2025) October25: "2025-10", July25: "2025-07", April25: "2025-04", January25: "2025-01", October24: "2024-10", July24: "2024-07", April24: "2024-04", January24: "2024-01", October23: "2023-10", // Special versions Unstable: "unstable" }; var LATEST_API_VERSION = ApiVersion.October25; var API_VERSION_ALIASES = { latest: LATEST_API_VERSION, ...ApiVersion }; var API_VERSIONS = ApiVersion; var WebhookTopic = { // App APP_PURCHASES_ONE_TIME_UPDATE: "app_purchases_one_time/update", APP_SCOPES_UPDATE: "app/scopes_update", APP_SUBSCRIPTIONS_APPROACHING_CAPPED_AMOUNT: "app_subscriptions/approaching_capped_amount", APP_SUBSCRIPTIONS_UPDATE: "app_subscriptions/update", APP_UNINSTALLED: "app/uninstalled", // Audit Events AUDIT_EVENTS_ADMIN_API_ACTIVITY: "audit_events/admin_api_activity", // Bulk Operations BULK_OPERATIONS_FINISH: "bulk_operations/finish", // Carts CARTS_CREATE: "carts/create", CARTS_UPDATE: "carts/update", // Channels CHANNELS_DELETE: "channels/delete", // Checkouts CHECKOUTS_CREATE: "checkouts/create", CHECKOUTS_DELETE: "checkouts/delete", CHECKOUTS_UPDATE: "checkouts/update", // Collection Listings COLLECTION_LISTINGS_ADD: "collection_listings/add", COLLECTION_LISTINGS_REMOVE: "collection_listings/remove", COLLECTION_LISTINGS_UPDATE: "collection_listings/update", // Collection Publications COLLECTION_PUBLICATIONS_CREATE: "collection_publications/create", COLLECTION_PUBLICATIONS_DELETE: "collection_publications/delete", COLLECTION_PUBLICATIONS_UPDATE: "collection_publications/update", // Collections COLLECTIONS_CREATE: "collections/create", COLLECTIONS_DELETE: "collections/delete", COLLECTIONS_UPDATE: "collections/update", // Companies COMPANIES_CREATE: "companies/create", COMPANIES_DELETE: "companies/delete", COMPANIES_UPDATE: "companies/update", // Company Contact Roles COMPANY_CONTACT_ROLES_ASSIGN: "company_contact_roles/assign", COMPANY_CONTACT_ROLES_REVOKE: "company_contact_roles/revoke", // Company Contacts COMPANY_CONTACTS_CREATE: "company_contacts/create", COMPANY_CONTACTS_DELETE: "company_contacts/delete", COMPANY_CONTACTS_UPDATE: "company_contacts/update", // Company Locations COMPANY_LOCATIONS_CREATE: "company_locations/create", COMPANY_LOCATIONS_DELETE: "company_locations/delete", COMPANY_LOCATIONS_UPDATE: "company_locations/update", // Customer Account Settings CUSTOMER_ACCOUNT_SETTINGS_UPDATE: "customer_account_settings/update", // Customer Groups CUSTOMER_GROUPS_CREATE: "customer_groups/create", CUSTOMER_GROUPS_DELETE: "customer_groups/delete", CUSTOMER_GROUPS_UPDATE: "customer_groups/update", // Customer Payment Methods CUSTOMER_PAYMENT_METHODS_CREATE: "customer_payment_methods/create", CUSTOMER_PAYMENT_METHODS_REVOKE: "customer_payment_methods/revoke", CUSTOMER_PAYMENT_METHODS_UPDATE: "customer_payment_methods/update", // Customer Segments CUSTOMER_JOINED_SEGMENT: "customer.joined_segment", CUSTOMER_LEFT_SEGMENT: "customer.left_segment", // Customer Tags CUSTOMER_TAGS_ADDED: "customer.tags_added", CUSTOMER_TAGS_REMOVED: "customer.tags_removed", // Customers CUSTOMERS_CREATE: "customers/create", CUSTOMERS_DATA_REQUEST: "customers/data_request", CUSTOMERS_DELETE: "customers/delete", CUSTOMERS_DISABLE: "customers/disable", CUSTOMERS_EMAIL_MARKETING_CONSENT_UPDATE: "customers_email_marketing_consent/update", CUSTOMERS_ENABLE: "customers/enable", CUSTOMERS_MARKETING_CONSENT_UPDATE: "customers_marketing_consent/update", CUSTOMERS_MERGE: "customers/merge", CUSTOMERS_PURCHASING_SUMMARY: "customers/purchasing_summary", CUSTOMERS_REDACT: "customers/redact", CUSTOMERS_UPDATE: "customers/update", // Delivery Promise DELIVERY_PROMISE_SETTINGS_UPDATE: "delivery_promise_settings/update", // Discounts DISCOUNTS_CREATE: "discounts/create", DISCOUNTS_DELETE: "discounts/delete", DISCOUNTS_REDEEMCODE_ADDED: "discounts/redeemcode_added", DISCOUNTS_REDEEMCODE_REMOVED: "discounts/redeemcode_removed", DISCOUNTS_UPDATE: "discounts/update", // Disputes DISPUTES_CREATE: "disputes/create", DISPUTES_UPDATE: "disputes/update", // Domains DOMAINS_CREATE: "domains/create", DOMAINS_DESTROY: "domains/destroy", DOMAINS_UPDATE: "domains/update", // Draft Orders DRAFT_ORDERS_CREATE: "draft_orders/create", DRAFT_ORDERS_DELETE: "draft_orders/delete", DRAFT_ORDERS_UPDATE: "draft_orders/update", // Finance FINANCE_APP_STAFF_MEMBER_DELETE: "finance_app_staff_member/delete", FINANCE_APP_STAFF_MEMBER_GRANT: "finance_app_staff_member/grant", FINANCE_APP_STAFF_MEMBER_REVOKE: "finance_app_staff_member/revoke", FINANCE_APP_STAFF_MEMBER_UPDATE: "finance_app_staff_member/update", FINANCE_KYC_INFORMATION_UPDATE: "finance_kyc_information/update", // Fulfillment Events FULFILLMENT_EVENTS_CREATE: "fulfillment_events/create", FULFILLMENT_EVENTS_DELETE: "fulfillment_events/delete", // Fulfillment Holds FULFILLMENT_HOLDS_ADDED: "fulfillment_holds/added", FULFILLMENT_HOLDS_RELEASED: "fulfillment_holds/released", // Fulfillment Orders FULFILLMENT_ORDERS_CANCELLATION_REQUEST_ACCEPTED: "fulfillment_orders/cancellation_request_accepted", FULFILLMENT_ORDERS_CANCELLATION_REQUEST_REJECTED: "fulfillment_orders/cancellation_request_rejected", FULFILLMENT_ORDERS_CANCELLATION_REQUEST_SUBMITTED: "fulfillment_orders/cancellation_request_submitted", FULFILLMENT_ORDERS_CANCELLED: "fulfillment_orders/cancelled", FULFILLMENT_ORDERS_FULFILLMENT_REQUEST_ACCEPTED: "fulfillment_orders/fulfillment_request_accepted", FULFILLMENT_ORDERS_FULFILLMENT_REQUEST_REJECTED: "fulfillment_orders/fulfillment_request_rejected", FULFILLMENT_ORDERS_FULFILLMENT_REQUEST_SUBMITTED: "fulfillment_orders/fulfillment_request_submitted", FULFILLMENT_ORDERS_FULFILLMENT_SERVICE_FAILED_TO_COMPLETE: "fulfillment_orders/fulfillment_service_failed_to_complete", FULFILLMENT_ORDERS_HOLD_RELEASED: "fulfillment_orders/hold_released", FULFILLMENT_ORDERS_LINE_ITEMS_PREPARED_FOR_LOCAL_DELIVERY: "fulfillment_orders/line_items_prepared_for_local_delivery", FULFILLMENT_ORDERS_LINE_ITEMS_PREPARED_FOR_PICKUP: "fulfillment_orders/line_items_prepared_for_pickup", FULFILLMENT_ORDERS_MERGED: "fulfillment_orders/merged", FULFILLMENT_ORDERS_MOVED: "fulfillment_orders/moved", FULFILLMENT_ORDERS_ORDER_ROUTING_COMPLETE: "fulfillment_orders/order_routing_complete", FULFILLMENT_ORDERS_PLACED_ON_HOLD: "fulfillment_orders/placed_on_hold", FULFILLMENT_ORDERS_RESCHEDULED: "fulfillment_orders/rescheduled", FULFILLMENT_ORDERS_SCHEDULED_FULFILLMENT_ORDER_READY: "fulfillment_orders/scheduled_fulfillment_order_ready", FULFILLMENT_ORDERS_SPLIT: "fulfillment_orders/split", // Fulfillments FULFILLMENTS_CREATE: "fulfillments/create", FULFILLMENTS_UPDATE: "fulfillments/update", // Inventory Items INVENTORY_ITEMS_CREATE: "inventory_items/create", INVENTORY_ITEMS_DELETE: "inventory_items/delete", INVENTORY_ITEMS_UPDATE: "inventory_items/update", // Inventory Levels INVENTORY_LEVELS_CONNECT: "inventory_levels/connect", INVENTORY_LEVELS_DISCONNECT: "inventory_levels/disconnect", INVENTORY_LEVELS_UPDATE: "inventory_levels/update", // Inventory Shipments INVENTORY_SHIPMENTS_ADD_ITEMS: "inventory_shipments/add_items", INVENTORY_SHIPMENTS_CREATE: "inventory_shipments/create", INVENTORY_SHIPMENTS_DELETE: "inventory_shipments/delete", INVENTORY_SHIPMENTS_MARK_IN_TRANSIT: "inventory_shipments/mark_in_transit", INVENTORY_SHIPMENTS_RECEIVE_ITEMS: "inventory_shipments/receive_items", INVENTORY_SHIPMENTS_REMOVE_ITEMS: "inventory_shipments/remove_items", INVENTORY_SHIPMENTS_UPDATE_ITEM_QUANTITIES: "inventory_shipments/update_item_quantities", INVENTORY_SHIPMENTS_UPDATE_TRACKING: "inventory_shipments/update_tracking", // Inventory Transfers INVENTORY_TRANSFERS_ADD_ITEMS: "inventory_transfers/add_items", INVENTORY_TRANSFERS_CANCEL: "inventory_transfers/cancel", INVENTORY_TRANSFERS_COMPLETE: "inventory_transfers/complete", INVENTORY_TRANSFERS_READY_TO_SHIP: "inventory_transfers/ready_to_ship", INVENTORY_TRANSFERS_REMOVE_ITEMS: "inventory_transfers/remove_items", INVENTORY_TRANSFERS_UPDATE_ITEM_QUANTITIES: "inventory_transfers/update_item_quantities", // Locales LOCALES_CREATE: "locales/create", LOCALES_DESTROY: "locales/destroy", LOCALES_UPDATE: "locales/update", // Locations LOCATIONS_ACTIVATE: "locations/activate", LOCATIONS_CREATE: "locations/create", LOCATIONS_DEACTIVATE: "locations/deactivate", LOCATIONS_DELETE: "locations/delete", LOCATIONS_UPDATE: "locations/update", // Markets MARKETS_BACKUP_REGION_UPDATE: "markets_backup_region/update", MARKETS_CREATE: "markets/create", MARKETS_DELETE: "markets/delete", MARKETS_UPDATE: "markets/update", // Metafield Definitions METAFIELD_DEFINITIONS_CREATE: "metafield_definitions/create", METAFIELD_DEFINITIONS_DELETE: "metafield_definitions/delete", METAFIELD_DEFINITIONS_UPDATE: "metafield_definitions/update", // Metaobjects METAOBJECTS_CREATE: "metaobjects/create", METAOBJECTS_DELETE: "metaobjects/delete", METAOBJECTS_UPDATE: "metaobjects/update", // Order Transactions ORDER_TRANSACTIONS_CREATE: "order_transactions/create", // Orders ORDERS_CANCELLED: "orders/cancelled", ORDERS_CREATE: "orders/create", ORDERS_DELETE: "orders/delete", ORDERS_EDITED: "orders/edited", ORDERS_FULFILLED: "orders/fulfilled", ORDERS_PAID: "orders/paid", ORDERS_PARTIALLY_FULFILLED: "orders/partially_fulfilled", ORDERS_RISK_ASSESSMENT_CHANGED: "orders/risk_assessment_changed", ORDERS_SHOPIFY_PROTECT_ELIGIBILITY_CHANGED: "orders/shopify_protect_eligibility_changed", ORDERS_UPDATED: "orders/updated", // Payment Schedules PAYMENT_SCHEDULES_DUE: "payment_schedules/due", // Payment Terms PAYMENT_TERMS_CREATE: "payment_terms/create", PAYMENT_TERMS_DELETE: "payment_terms/delete", PAYMENT_TERMS_UPDATE: "payment_terms/update", // Product Feeds PRODUCT_FEEDS_CREATE: "product_feeds/create", PRODUCT_FEEDS_FULL_SYNC: "product_feeds/full_sync", PRODUCT_FEEDS_FULL_SYNC_FINISH: "product_feeds/full_sync_finish", PRODUCT_FEEDS_INCREMENTAL_SYNC: "product_feeds/incremental_sync", PRODUCT_FEEDS_UPDATE: "product_feeds/update", // Product Listings PRODUCT_LISTINGS_ADD: "product_listings/add", PRODUCT_LISTINGS_REMOVE: "product_listings/remove", PRODUCT_LISTINGS_UPDATE: "product_listings/update", // Product Publications PRODUCT_PUBLICATIONS_CREATE: "product_publications/create", PRODUCT_PUBLICATIONS_DELETE: "product_publications/delete", PRODUCT_PUBLICATIONS_UPDATE: "product_publications/update", // Products PRODUCTS_CREATE: "products/create", PRODUCTS_DELETE: "products/delete", PRODUCTS_UPDATE: "products/update", // Profiles PROFILES_CREATE: "profiles/create", PROFILES_DELETE: "profiles/delete", PROFILES_UPDATE: "profiles/update", // Refunds REFUNDS_CREATE: "refunds/create", // Returns RETURNS_APPROVE: "returns/approve", RETURNS_CANCEL: "returns/cancel", RETURNS_CLOSE: "returns/close", RETURNS_DECLINE: "returns/decline", RETURNS_PROCESS: "returns/process", RETURNS_REOPEN: "returns/reopen", RETURNS_REQUEST: "returns/request", RETURNS_UPDATE: "returns/update", // Reverse Deliveries REVERSE_DELIVERIES_ATTACH_DELIVERABLE: "reverse_deliveries/attach_deliverable", // Reverse Fulfillment Orders REVERSE_FULFILLMENT_ORDERS_DISPOSE: "reverse_fulfillment_orders/dispose", // Scheduled Product Listings SCHEDULED_PRODUCT_LISTINGS_ADD: "scheduled_product_listings/add", SCHEDULED_PRODUCT_LISTINGS_REMOVE: "scheduled_product_listings/remove", SCHEDULED_PRODUCT_LISTINGS_UPDATE: "scheduled_product_listings/update", // Segments SEGMENTS_CREATE: "segments/create", SEGMENTS_DELETE: "segments/delete", SEGMENTS_UPDATE: "segments/update", // Selling Plan Groups SELLING_PLAN_GROUPS_CREATE: "selling_plan_groups/create", SELLING_PLAN_GROUPS_DELETE: "selling_plan_groups/delete", SELLING_PLAN_GROUPS_UPDATE: "selling_plan_groups/update", // Shipping Addresses SHIPPING_ADDRESSES_CREATE: "shipping_addresses/create", SHIPPING_ADDRESSES_UPDATE: "shipping_addresses/update", // Shop SHOP_REDACT: "shop/redact", SHOP_UPDATE: "shop/update", // Subscription Billing Attempts SUBSCRIPTION_BILLING_ATTEMPTS_CHALLENGED: "subscription_billing_attempts/challenged", SUBSCRIPTION_BILLING_ATTEMPTS_FAILURE: "subscription_billing_attempts/failure", SUBSCRIPTION_BILLING_ATTEMPTS_SUCCESS: "subscription_billing_attempts/success", // Subscription Billing Cycle Edits SUBSCRIPTION_BILLING_CYCLE_EDITS_CREATE: "subscription_billing_cycle_edits/create", SUBSCRIPTION_BILLING_CYCLE_EDITS_DELETE: "subscription_billing_cycle_edits/delete", SUBSCRIPTION_BILLING_CYCLE_EDITS_UPDATE: "subscription_billing_cycle_edits/update", // Subscription Billing Cycles SUBSCRIPTION_BILLING_CYCLES_SKIP: "subscription_billing_cycles/skip", SUBSCRIPTION_BILLING_CYCLES_UNSKIP: "subscription_billing_cycles/unskip", // Subscription Contracts SUBSCRIPTION_CONTRACTS_ACTIVATE: "subscription_contracts/activate", SUBSCRIPTION_CONTRACTS_CANCEL: "subscription_contracts/cancel", SUBSCRIPTION_CONTRACTS_CREATE: "subscription_contracts/create", SUBSCRIPTION_CONTRACTS_EXPIRE: "subscription_contracts/expire", SUBSCRIPTION_CONTRACTS_FAIL: "subscription_contracts/fail", SUBSCRIPTION_CONTRACTS_PAUSE: "subscription_contracts/pause", SUBSCRIPTION_CONTRACTS_UPDATE: "subscription_contracts/update", // Tax Services TAX_SERVICES_CREATE: "tax_services/create", TAX_SERVICES_UPDATE: "tax_services/update", // Tender Transactions TENDER_TRANSACTIONS_CREATE: "tender_transactions/create", // Themes THEMES_CREATE: "themes/create", THEMES_DELETE: "themes/delete", THEMES_PUBLISH: "themes/publish", THEMES_UPDATE: "themes/update", // Variants VARIANTS_IN_STOCK: "variants/in_stock", VARIANTS_OUT_OF_STOCK: "variants/out_of_stock" }; var WebhookTopicReverse = Object.entries(WebhookTopic).reduce( (acc, [key, value]) => { acc[value] = key; return acc; }, {} ); function getWebhookEventName(topic) { return WebhookTopic[topic]; } function getWebhookTopicEnum(eventName) { return WebhookTopicReverse[eventName]; } export { API_VERSIONS, API_VERSION_ALIASES, ApiVersion, ConfigurationError, LATEST_API_VERSION, NetworkError, ShopifyApiError, WebhookTopic, WebhookTopicReverse, createAdminApiClient, getWebhookEventName, getWebhookTopicEnum, gql }; //# sourceMappingURL=index.js.map