# Shopify

vendor/Shopify.js

## Shopify()

Interact with the Shopify Admin API.

**Returns**

* `Void`

## request()

Make a request to a Shopify site.

This is just a wrapper to Mesa.shopify.request.

**Returns**

* `Void`

## Shopify.get(path\[, options, connectionInfo])

Make a GET request to a Shopify site.

**Parameters**

| Name           | Type                                     | Description                                                                                                                                          |            |
| -------------- | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
| path           | `string`                                 |                                                                                                                                                      |            |
| options        | [Options](#object-options)               | Additional configuration for Shopify calls                                                                                                           | *Optional* |
| connectionInfo | [ConnectionInfo](#object-connectioninfo) | If you would like to connect to a separate Shopify website that Mesa is not installed on, create a Custom App and include a `connectionInfo` object. | *Optional* |

**Returns**

* `object`

## handleImageList(path, options, connectionInfo)

Handles listing of images with pagination.

**Parameters**

| Name           | Type     | Description                                   |   |
| -------------- | -------- | --------------------------------------------- | - |
| path           | `string` | - Shopify REST endpoint path.                 |   |
| options        | `Object` | - Query options.                              |   |
| connectionInfo | `Object` | - Connection info for external Shopify sites. |   |

**Returns**

* `Array` Array of images in REST format.

## handleImage(originalPath, options, connectionInfo)

Handles retrieval of a single image by its ID for a specific product.

**Parameters**

| Name           | Type                                     | Description                                        |   |
| -------------- | ---------------------------------------- | -------------------------------------------------- | - |
| originalPath   | `string`                                 | - Original API endpoint path.                      |   |
| options        | [Options](#object-options)               | - Query options (not used in this implementation). |   |
| connectionInfo | [ConnectionInfo](#object-connectioninfo) | - Connection information for Shopify.              |   |

**Returns**

* `Object` Processed image data in REST format.

## handleProductCount(options, connectionInfo)

Handles the product count query.

**Parameters**

| Name           | Type | Description |   |
| -------------- | ---- | ----------- | - |
| options        |      |             |   |
| connectionInfo |      |             |   |

**Returns**

*

## handlePaginatedGraphQLQuery(queryFunction, options, transformFunction, connectionInfo)

Handles paginated GraphQL queries for products or variants.

**Parameters**

| Name              | Type       | Description                                                             |   |
| ----------------- | ---------- | ----------------------------------------------------------------------- | - |
| queryFunction     | `Function` | - Function that generates a GraphQL query.                              |   |
| options           | `Object`   | - Query options, including filters and limits.                          |   |
| transformFunction | `Function` | - Function to transform the returned data into the desired REST format. |   |
| connectionInfo    | `Object`   | - Optional connection info for external Shopify sites.                  |   |

**Returns**

* `Array` Array of transformed paginated results.

## handleProductList(path, options, connectionInfo)

Handles listing of products with pagination.

**Parameters**

| Name           | Type     | Description                                   |   |
| -------------- | -------- | --------------------------------------------- | - |
| path           | `string` | - Shopify REST endpoint path.                 |   |
| options        | `Object` | - Query options.                              |   |
| connectionInfo | `Object` | - Connection info for external Shopify sites. |   |

**Returns**

* `Array` Array of products in REST format.

## Shopify.handleProduct(originalPath, options, connectionInfo)

Retrieve a single product by ID using GraphQL and convert it to REST format.

**Parameters**

| Name           | Type                                     | Description                                            |   |
| -------------- | ---------------------------------------- | ------------------------------------------------------ | - |
| originalPath   | `string`                                 | - Original API endpoint path.                          |   |
| options        | [Options](#object-options)               | - Options containing query parameters.                 |   |
| connectionInfo | [ConnectionInfo](#object-connectioninfo) | - Connection information for a separate Shopify store. |   |

**Returns**

* `object` Product data in REST format.

## Shopify.handleProductPost(data\[, connectionInfo])

Handles the creation of a product and its variants, if provided. Converts the REST payload into the appropriate GraphQL format.

**Parameters**

| Name           | Type                                     | Description                            |            |
| -------------- | ---------------------------------------- | -------------------------------------- | ---------- |
| data           | `Object`                                 | - The product data in REST API format. |            |
| connectionInfo | [ConnectionInfo](#object-connectioninfo) | - Connection information for Shopify.  | *Optional* |

**Returns**

* `Object` - The product payload in REST API format.

## handleVariantList(path, options, connectionInfo)

Handles listing of variants with pagination.

**Parameters**

| Name           | Type     | Description                                   |   |
| -------------- | -------- | --------------------------------------------- | - |
| path           | `string` | - Shopify REST endpoint path.                 |   |
| options        | `Object` | - Query options.                              |   |
| connectionInfo | `Object` | - Connection info for external Shopify sites. |   |

**Returns**

* `Array` Array of variants in REST format.

## Shopify.handleVariant(originalPath, options, connectionInfo)

Retrieve a specific variant by product ID and variant ID using GraphQL and convert it to REST format.

**Parameters**

| Name           | Type                                     | Description                                            |   |
| -------------- | ---------------------------------------- | ------------------------------------------------------ | - |
| originalPath   | `string`                                 | - Original API endpoint path.                          |   |
| options        | [Options](#object-options)               | - Options containing query parameters.                 |   |
| connectionInfo | [ConnectionInfo](#object-connectioninfo) | - Connection information for a separate Shopify store. |   |

**Returns**

* `object` Variant data in REST format.

## handleImagePost(data, connectionInfo)

Handles the creation of a product image. Converts the REST payload to GraphQL format and returns the response in REST format.

**Parameters**

| Name           | Type                                     | Description                |   |
| -------------- | ---------------------------------------- | -------------------------- | - |
| data           | `Object`                                 | - The REST image payload.  |   |
| connectionInfo | [ConnectionInfo](#object-connectioninfo) | - Shopify connection info. |   |

**Returns**

* `Object` - The image payload in REST format.

## send(query, variables, connectionInfo, endpoint)

Send a GraphQL query to Shopify.

**Parameters**

| Name           | Type | Description |   |
| -------------- | ---- | ----------- | - |
| query          |      |             |   |
| variables      |      |             |   |
| connectionInfo |      |             |   |
| endpoint       |      |             |   |

**Returns**

* `object`

## Shopify.post(path, data\[, options, connectionInfo])

Make a POST request to a Shopify site.

By default Shopify calls will auto-wrap any outgoing JSON data, eg. Shopify.post('/admin/products.json', data) will result in { "product": { data } } use options.skipJsonWrap=true to override this behavior

**Parameters**

| Name           | Type                                     | Description                                                                                                                                          |            |
| -------------- | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
| path           | `string`                                 |                                                                                                                                                      |            |
| data           | `object`                                 |                                                                                                                                                      |            |
| options        | [Options](#object-options)               | Additional configuration for Shopify calls                                                                                                           | *Optional* |
| connectionInfo | [ConnectionInfo](#object-connectioninfo) | If you would like to connect to a separate Shopify website that Mesa is not installed on, create a Custom App and include a `connectionInfo` object. | *Optional* |

**Returns**

* `object`

## handleVariantPut(productId, variantId, data, connectionInfo)

Handles updating a single variant for a specific product.

**Parameters**

| Name           | Type                                     | Description                   |   |
| -------------- | ---------------------------------------- | ----------------------------- | - |
| productId      | `string`                                 | - The ID of the product.      |   |
| variantId      | `string`                                 | - The ID of the variant.      |   |
| data           | `Object`                                 | - The variant data to update. |   |
| connectionInfo | [ConnectionInfo](#object-connectioninfo) | - Shopify connection details. |   |

**Returns**

* `Object` - The updated variant in REST format.

## handleProductPut(productId, data, connectionInfo)

Handles the updating of a product and its related entities (variants, images, etc.).

**Parameters**

| Name           | Type                                     | Description                        |   |
| -------------- | ---------------------------------------- | ---------------------------------- | - |
| productId      | `string`                                 | - The ID of the product to update. |   |
| data           | `Object`                                 | - The product data to update.      |   |
| connectionInfo | [ConnectionInfo](#object-connectioninfo) | - Shopify connection details.      |   |

**Returns**

* `Object` - The updated product in REST format.

## Shopify.put(path, data\[, options, connectionInfo])

Make a PUT request to a Shopify site.

By default Shopify calls will auto-wrap any outgoing JSON data, eg. Shopify.put('/admin/products.json', data) will result in { "product": { data } } use options.skipJsonWrap=true to override this behavior

**Parameters**

| Name           | Type                                     | Description                                                                                                                                          |            |
| -------------- | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
| path           | `string`                                 |                                                                                                                                                      |            |
| data           | `object`                                 |                                                                                                                                                      |            |
| options        | [Options](#object-options)               | Additional configuration for Shopify calls                                                                                                           | *Optional* |
| connectionInfo | [ConnectionInfo](#object-connectioninfo) | If you would like to connect to a separate Shopify website that Mesa is not installed on, create a Custom App and include a `connectionInfo` object. | *Optional* |

**Returns**

* `object`

## Shopify.patch(path, data\[, options, connectionInfo])

Make a PATCH request to a Shopify site.

By default Shopify calls will auto-wrap any outgoing JSON data, eg. Shopify.patch('/admin/products.json', data) will result in { "product": { data } } use options.skipJsonWrap=true to override this behavior

**Parameters**

| Name           | Type                                     | Description                                                                                                                                          |            |
| -------------- | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
| path           | `string`                                 |                                                                                                                                                      |            |
| data           | `object`                                 |                                                                                                                                                      |            |
| options        | [Options](#object-options)               | Additional configuration for Shopify calls                                                                                                           | *Optional* |
| connectionInfo | [ConnectionInfo](#object-connectioninfo) | If you would like to connect to a separate Shopify website that Mesa is not installed on, create a Custom App and include a `connectionInfo` object. | *Optional* |

**Returns**

* `object`

## Shopify.delete(path\[, options, connectionInfo])

Make a DELETE request to a Shopify site.

By default Shopify calls will auto-wrap any outgoing JSON data, eg. Shopify.post('/admin/products.json', data) will result in { "product": { data } } use options.skipJsonWrap=true to override this behavior

**Parameters**

| Name           | Type                                     | Description                                                                                                                                          |            |
| -------------- | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
| path           | `string`                                 |                                                                                                                                                      |            |
| options        | [Options](#object-options)               | Additional configuration for Shopify calls                                                                                                           | *Optional* |
| connectionInfo | [ConnectionInfo](#object-connectioninfo) | If you would like to connect to a separate Shopify website that Mesa is not installed on, create a Custom App and include a `connectionInfo` object. | *Optional* |

**Returns**

* `object`

## getMyshopifyDomain(context)

Returns myshopify domain from the connection.

**Parameters**

| Name    | Type | Description |   |
| ------- | ---- | ----------- | - |
| context |      |             |   |

**Returns**

* `string` The myshopify domain. Ex: mystore.myshopify.com

## getShopifyAdminUrl(context)

Returns myshopify domain from the connection.

**Parameters**

| Name    | Type | Description |   |
| ------- | ---- | ----------- | - |
| context |      |             |   |

**Returns**

* `string` The Shopify admin url, including https\://. Ex: <https://admin.shopify.com/store/mystore>

## getShopifyUuid(context)

Returns the subdomain part of the myshopify domain from the connection.

**Parameters**

| Name    | Type | Description |   |
| ------- | ---- | ----------- | - |
| context |      |             |   |

**Returns**

* `string` The subdomain part of the myshopify domain. Ex: mystore

## deleteProduct(path, options, connectionInfo)

Delete a product by ID.

**Parameters**

| Name           | Type     | Description                                   |   |
| -------------- | -------- | --------------------------------------------- | - |
| path           | `string` | - Shopify REST endpoint path.                 |   |
| options        | `Object` | - Query options.                              |   |
| connectionInfo | `Object` | - Connection info for external Shopify sites. |   |

**Returns**

* `Void`

## deleteVariant(path, options, connectionInfo)

Delete a variant by ID.

**Parameters**

| Name           | Type     | Description                                   |   |
| -------------- | -------- | --------------------------------------------- | - |
| path           | `string` | - Shopify REST endpoint path.                 |   |
| options        | `Object` | - Query options.                              |   |
| connectionInfo | `Object` | - Connection info for external Shopify sites. |   |

**Returns**

* `Void`

## deleteImage(path, options, connectionInfo)

Delete a product image by ID.

**Parameters**

| Name           | Type     | Description                                   |   |
| -------------- | -------- | --------------------------------------------- | - |
| path           | `string` | - Shopify REST endpoint path.                 |   |
| options        | `Object` | - Query options.                              |   |
| connectionInfo | `Object` | - Connection info for external Shopify sites. |   |

**Returns**

* `Void`

## getAllProducts(\[query={}, limit=250])

Make consecutive calls to Shopify in order to retrieve all products. <https://help.shopify.com/en/api/reference/products/product>

**Parameters**

| Name      | Type     | Description                                      |            |
| --------- | -------- | ------------------------------------------------ | ---------- |
| query={}  | `object` | Parameters to append to the Shopify querystring. | *Optional* |
| limit=250 | `number` | Result count for Shopify query.                  | *Optional* |

**Examples**

```javascript
// returns array of all products
const Shopify = require('vendor/Shopify.js');
Shopify.getAllProducts();
```

**Returns**

* `array`

## appendToArray(\[data], The)

Update a value if it already exists, or append it to the array if it does not exist. The example routine below should be every time we are updating `tags` or `note_attributes` to ensure that multiple Automations will work nicely with each other and not overwrite values set in other Automations.

**Parameters**

| Name | Type              | Description                                                                                                         |            |
| ---- | ----------------- | ------------------------------------------------------------------------------------------------------------------- | ---------- |
| data | `array`           | An array of values that you would like to append a value to                                                         | *Optional* |
| The  | `string` `object` | value to append to the array. For `tags`, this would be a `string`. For `note_attributes`, this would be an object. |            |

**Examples**

```javascript
Mesa.log.debug('Calling shopify to get the latest order note_attributes');
const order = Shopify.get(`admin/orders/${payload.id}.json`);
let noteAttributes = order.order.note_attributes;
noteAttributes = Shopify.appendToArray(noteAttributes, {
  name: 'dob',
  value: 'Jan 1 2000',
});
```

**Returns**

* `array`

## getVariantInventoryData(variantId)

Get inventory location information for a Shopify variant. <https://help.shopify.com/en/api/reference/inventory/inventorylevel>

**Parameters**

| Name      | Type     | Description         |   |
| --------- | -------- | ------------------- | - |
| variantId | `number` | Shopify variant id. |   |

**Examples**

```javascript
// returns { inventory_item_id: {number}, [ { inventory_levels: { inventory_item_id: {number}, location_id: {number}, available: {number}, updated_at: {string} } ] }
const Shopify = require('vendor/Shopify.js');
Shopify.getVariantInventoryData(123456);
```

**Returns**

* `&lt;a href&#x3D;&quot;#object-inventorydata&quot;&gt;InventoryData&lt;/a&gt;`

## buildVariantInventoryUpdate(variantId, inventoryCount\[, adjust=true, fulfillableAlter])

Build InventoryLevel update information for a Shopify variant. <https://help.shopify.com/en/api/reference/inventory/inventorylevel>

**Parameters**

| Name             | Type                                  | Description                                                  |            |
| ---------------- | ------------------------------------- | ------------------------------------------------------------ | ---------- |
| variantId        | `number`                              | Shopify variant id.                                          |            |
| inventoryCount   | `number`                              | Value to set as inventory.                                   |            |
| adjust=true      | `bool`                                | Switch for available\_adjustment vs available.               | *Optional* |
| fulfillableAlter | [fulfillableAlter](#fulfillablealter) | Callback function allows fulfillment location to be altered. | *Optional* |

**Examples**

```javascript
// note string for location_id, as it is required by Shopify API post
// returns { inventory_item_id: {number}, location_id: {string}, available|available_adjustment: {number} } ] }
const Shopify = require('vendor/Shopify.js');
Shopify.buildVariantInventoryUpdate(123456, 10, true | false);
```

**Returns**

* `&lt;a href&#x3D;&quot;#object-inventoryupdatedata&quot;&gt;InventoryUpdateData&lt;/a&gt;`

## {Object} Options()

options parameter for Shopify calls

By default Shopify calls will auto-wrap any outgoing JSON data, eg. Shopify.post('/admin/products.json', data) will result in { "product": { data } } use skipJsonWrap=true to override this behavior

**Properties**

**Returns**

* `Void`

## {Object} ConnectionInfo()

connectionInfo parameter for Shopify calls

**Properties**

**Returns**

* `Void`

## {Object} FulfillableLocation()

Fulfillable location shape returned by fulfillableAlter <https://help.shopify.com/en/api/reference/inventory/location>

**Parameters**

| Name         | Type     | Description                                                 |   |
| ------------ | -------- | ----------------------------------------------------------- | - |
| location\_id | `number` | The ID of the location that the inventory level belongs to. |   |

**Returns**

* `Void`

## {Function} fulfillableAlter(inventoryLevels)

Callback allows buildVariantInventoryUpdate fulfillment location to be altered. <https://help.shopify.com/en/api/reference/inventory/inventorylevel>

**Parameters**

| Name                                | Type                     | Description                                              |   |
| ----------------------------------- | ------------------------ | -------------------------------------------------------- | - |
| inventoryLevels                     | `Array.&#60;Object&#62;` | Inventory levels for the variant at different locations. |   |
| inventoryLevels.inventory\_item\_id | `number`                 | Inventory item id for variant                            |   |
| inventoryLevels.location\_id        | `number`                 | Location id                                              |   |
| inventoryLevels.available           | `number`                 | Inventory count                                          |   |
| inventoryLevels.updated\_at         | `string`                 | Last updated                                             |   |

**Returns**

* `&lt;a href&#x3D;&quot;#object-fulfillablelocation&quot;&gt;FulfillableLocation&lt;/a&gt;` fulfillableLocation

## {Object} InventoryData()

Return from getVariantInventoryData.

**Properties**

**Returns**

* `Void`

## {Object} InventoryUpdateData()

Return from buildVariantInventoryUpdate. Will either have available or available\_adjustment depending on adjust param. <https://help.shopify.com/en/api/reference/inventory/inventorylevel>

**Properties**

**Returns**

* `Void`


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.getmesa.com/tools/custom-code/libraries/shopify.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
