@tailor-platform/shopify
Version: 
Shopify Admin API client with Tailor Platform integration
504 lines (502 loc) • 19.7 kB
JavaScript
// 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