/**
* @typedef {object} ShopifyStoreTuple
* @property {string} name
* @property {number} id
*/
/**
* @typedef {object} ShopifyStoreNameMap
* @property {string} name
* @property {number} id
*/
/**
* @typedef {object} DatastoreQuerySettings
* @property {!string} kind - datastore kind
* @property {?(string[]|string)} [selector] - query selector
* @property {?(string[]|string)} [groupBy] - fields to group by
* @property {?(string[]|string)} [order] - result order
* //property {?[...string]} [filter]
* @property {?boolean} [useEmulator=process.env.USE_EMULATOR_DATASTORE] - use datastore emulator
*/
/**
* @typedef {object} ShopifyShop
* @property {number} id
* @property {string} name
* @property {string} email
* @property {string} domain
* @property {string} province
* @property {string} country
* @property {string} address1
* @property {string} zip:
* @property {string} city:
* @property {string} source
* @property {string} phone
* @property {number} latitude
* @property {number} longitude
* @property {string} primary_locale
* @property {string} address2
* @property {timestamp} created_at
* @property {timestamp} updated_at
* @property {string} country_code
* @property {string} country_name
* @property {string} currency
* @property {string} customer_email
* @property {string} timezone
* @property {string} iana_timezone
* @property {string} shop_owner
* @property {string} money_format
* @property {string} money_with_currency_format
* @property {string} weight_unit
* @property {string} province_code
* @property {boolean} taxes_included
* @property {boolean}auto_configure_tax_inclusivity
* @property {boolean}tax_shipping
* @property {boolean} county_taxes
* @property {string} plan_display_name
* @property {string} plan_name
* @property {boolean} has_discounts
* @property {boolean} has_gift_cards
* @property {string} myshopify_domain
* @property {?string} [google_apps_domain]
* @property {?string} [google_apps_login_enabled]
* @property {string} money_in_emails_format
* @property {string} money_with_currency_in_emails_format
* @property {boolean} eligible_for_payments
* @property {boolean} requires_extra_payments_agreement
* @property {boolean} password_enabled
* @property {boolean} has_storefront
* @property {boolean} eligible_for_card_reader_giveaway
* @property {boolean} finances
* @property {number} primary_location_id
* @property {string} cookie_consent_level
* @property {string} visitor_tracking_consent_preference
* @property {boolean} checkout_api_supported
* @property {boolean} multi_location_enabled
* @property {boolean} setup_required
* @property {boolean} pre_launch_enabled
* @property {string[]} enabled_presentment_currencies:
* @property {boolean} force_ssl
* @property {string} shopName
* @property {number} shopID
* @example
* {
* id: 55028482214,
* name: 'Zap Moto',
* email: 'sales@zapmoto.com.au',
* domain: 'zapmoto.com.au',
* province: 'Queensland',
* country: 'AU',
* address1: '40 Waterloo Street',
* zip: '4006',
* city: 'Newstead',
* source: 'buildify',
* phone: '0424977731',
* latitude: -27.4481248,
* longitude: 153.0444463,
* primary_locale: 'en',
* address2: '',
* created_at: '2021-03-02T20:16:39+10:00',
* updated_at: '2021-12-08T21:21:17+10:00',
* country_code: 'AU',
* country_name: 'Australia',
* currency: 'AUD',
* customer_email: 'Sales@zapmoto.com.au',
* timezone: '(GMT+10:00) Australia/Brisbane',
* iana_timezone: 'Australia/Brisbane',
* shop_owner: 'Paul Halhead',
* money_format: '${{amount}}',
* money_with_currency_format: '${{amount}} AUD',
* weight_unit: 'kg',
* province_code: 'QLD',
* taxes_included: true,
* auto_configure_tax_inclusivity: false,
* tax_shipping: false,
* county_taxes: true,
* plan_display_name: 'Basic Shopify',
* plan_name: 'basic',
* has_discounts: false,
* has_gift_cards: false,
* myshopify_domain: 'zap-moto.myshopify.com',
* google_apps_domain: null,
* google_apps_login_enabled: null,
* money_in_emails_format: '${{amount}}',
* money_with_currency_in_emails_format: '${{amount}} AUD',
* eligible_for_payments: true,
* requires_extra_payments_agreement: false,
* password_enabled: false,
* has_storefront: true,
* eligible_for_card_reader_giveaway: false,
* finances: true,
* primary_location_id: 61045997734,
* cookie_consent_level: 'implicit',
* visitor_tracking_consent_preference: 'allow_all',
* checkout_api_supported: true,
* multi_location_enabled: true,
* setup_required: false,
* pre_launch_enabled: false,
* enabled_presentment_currencies: [ 'AUD' ],
* force_ssl: true,
* shopName: 'zap-moto',
* shopID: 55028482214
* }
*/
/**
* //typedef {import('shopify-api-node/index.d.ts').exports} StoreConnectionInstance
*/
/**
* @typedef {object} BucketStorageStats - gce storage bucket/dir computed stats for the shopify shop
* @property {?number} [files] - number of files if the `request.query.files` is enabled
* @property {?number} [deletedFiles] - number of deleted files; absent if previous versions are not requested
* @property {number} products - number of products in the bucket directory
* @property {?number} [deletedProducts] - number of deleted products; absent if previous versions are not requested
* @property {number} size - total file size in bytes
* @property {?number} [deletedFilesSize] - size of deleted files in bytes; absent if previous versions are not
* requested
* @property {number} currentFileSize - current generation file size in bytes
* @property {?number} [previousFileVersionsSize] - size of the previous file versions in bytes; absent if versions are
* not requested
* @property {?number} previousFileVersionsCount - number of the previous file versions; absent if versions are
* not requested
*/
/**
* @typedef {object} Store - File Storage Shopify Store Object. Represents bucket directory contents
* @property {string|number} id - filestore id
* @property {number} shopifyStoreId - filestore id
* @property {string} dir - directory within the bucket
* @property {string} bucket - gce storage bucket
* @property {string[]} files - array of files belonging to the bucket
* @property {string[]} deletedFiles - array of deleted files belonging to the bucket
* @property {number[]} products -shopify custom product ids for the filestore
* @property {number[]} deletedProducts - deleted shopify custom product ids for the filestore (empty if the file versions
* are not requested when the `request.query.versions` is not set or evaluates to false )
* @property {BucketStorageStats} stats - filestore storage stats
*/
/**
* @typedef {Array} GroupedFiles
* @property {number[]} products
* @property {number[]} deletedProducts
* @property {ProductConfigEntry} productConfigs
*/
/**
* @typedef {object} FileVersion
* @property {string} id
* @property {string} url
* @property {number} generation
* @property {number} size
* @property {object} metadata
* @property {string} metadata.name
* @property {string} metadata.md5Hash
* @property {string} metadata.crc32c
* @property {timestamp} metadata.timeCreated
* @property {timestamp} metadata.updated
* @property {timestamp} metadata.timeDeleted
*
* @property {boolean} isDeleted
* @property {boolean} isCurrent
*/
/**
* @typedef ProductConfigEntry
* @property {string} name
* @property {string} path
* @property {FileVersion[]} versions
*/
/**
* @typedef {object} ShopifyCharge
* @property {string} activated_on
* @property {number} api_client_id
* @property {number} balance_remaining
* @property {number} balance_used
* @property {string} billing_on
* @property {?string} cancelled_on
* @property {string} capped_amount
* @property {DateTime} datastore_updated_at
* @property {string} decorated_return_url
* @property {number} id
* @property {string} name
* @property {string} price
* @property {string} return_url
* @property {number} risk_level
* @property {number} shopID
* @property {string} shopName
* @property {string} status
* @property {boolean} test
* @property {number} trial_days
* @property {string} trial_ends_on
* @property {string} updated_at
*
*/
/**
* @typedef {ShopifyCharge[]} ShopifyCharges
*/
/**
* @typedef ShopifyProductImage
* @property {string} admin_graphql_api_id
* @property {?string} alt
* @property {Timestamp} created_at
* @property {number} height
* @property {number} id
* @property {number} position
* @property {number} product_id
* @property {string} src
* @property {Timestamp} updated_at
* @property {number[]} variant_ids
* @property {number} width
*/
/**
* @typedef {ShopifyProductImage[]} ShopifyProductImages
*/
/**
* @typedef ShopifyProductVariant
* @property {string} admin_graphql_api_id
* @property {?string} barcode
* @property {?string} compare_at_price
* @property {Timestamp} created_at
* @property {string} fulfillment_service
* @property {number} grams
* @property {number} id
* @property {?string} image_id
* @property {number} inventory_item_id
* @property {?string} inventory_management
* @property {string} inventory_policy
* @property {number} inventory_quantity
* @property {number} old_inventory_quantity
* @property {?string} option1
* @property {?string} option2
* @property {?string} option3
* @property {number} position
* @property {string} price
* @property {number} product_id
* @property {boolean} requires_shipping
* @property {string} sku
* @property {boolean} taxable
* @property {string} title
* @property {Timestamp} updated_at
* @property {number} weight
* @property {string} weight_unit
*
*/
/**
* @typedef ShopifyProduct
* @property {string} admin_graphql_api_id
* @property {string} body_html
* @property {ProductConfigEntry} config
* @property {Timestamp} created_at
* @property {string} datastore_updated_at
* @property {string} handle
* @property {number} id
* @property {ShopifyProductImage} image
* @property {ShopifyProductImage[]} images
* @property {object[]} options
* @property {string} product_type
* @property {Timestamp} published_at
* @property {number} shopID
* @property {string} shopName
* @property {string} status
* @property {string} tags
* @property {string} title
* @property {Timestamp} updated_at
* @property {string} vendor
* @property {ShopifyProductVariant[]} variants
*
*/