@anker-in/shopify-sdk 1.2.0-beta.15 → 1.2.0-beta.16

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils.ts","../../src/client/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { HasMetafieldsIdentifier, Maybe, Metafield } from './shopify-types'\n\nexport type PartialRecord<K extends string | number | symbol, T> = Partial<Record<K, T>>\n\nexport type Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>\n\nexport type Replace<T, K extends keyof T, V> = Omit<T, K> & { [P in K]: V }\n\nexport enum HasMetafieldQueryRoot {\n Product = 'product',\n Variant = 'variant',\n Page = 'page',\n Article = 'article',\n Blog = 'blog',\n Collection = 'collection',\n Shop = 'shop',\n Cart = 'cart',\n Customer = 'customer',\n Location = 'location',\n Market = 'market',\n Order = 'order',\n}\n\n/**\n * 特殊的 metafield namespace,不使用 metafieldNamespacePrefix 进行转换\n */\nexport const SPECIAL_METAFIELD_NAMESPACES = ['__discountCodeApp', 'discounts_function'] as const\n\n/**\n * 生成 metafieldIdentifiers 查询参数\n * 如果不传入 metafieldIdentifiers,会返回带有空数组的默认值,防止 GraphQL 查询报错\n *\n * @example\n * // 输入:\n * constructMetafieldIdentifiersQueryParams(\n * {\n * product: [\n * { namespace: 'custom', key: 'field1' },\n * { namespace: 'custom', key: 'field2' }, // 重复的 namespace,会被去重\n * { namespace: '__discountCodeApp', key: 'discount1' },\n * { namespace: 'discounts_function', key: 'discount2' }\n * ]\n * },\n * 'my_prefix_'\n * )\n *\n * // 输出:\n * {\n * productMetafieldIdentifiers: [\n * { namespace: 'my_prefix_combo', key: 'custom' }, // 普通 namespace 转换并去重\n * { namespace: '__discountCodeApp', key: 'discount1' }, // 特殊 namespace 保持原样\n * { namespace: 'discounts_function', key: 'discount2' } // 特殊 namespace 保持原样\n * ]\n * }\n */\nexport function constructMetafieldIdentifiersQueryParams<T extends HasMetafieldQueryRoot>(\n metafieldIdentifiers?: PartialRecord<T, HasMetafieldsIdentifier[]>,\n metafieldNamespacePrefix?: string\n): PartialRecord<`${T}MetafieldIdentifiers`, HasMetafieldsIdentifier[]> {\n // 如果没有传入 metafieldIdentifiers,返回默认的空数组\n if (!metafieldIdentifiers || Object.keys(metafieldIdentifiers).length === 0) {\n return {\n productMetafieldIdentifiers: [],\n variantMetafieldIdentifiers: [],\n } as PartialRecord<`${T}MetafieldIdentifiers`, HasMetafieldsIdentifier[]>\n }\n\n const identifiers = Object.entries(metafieldIdentifiers).reduce(\n (queryInput, [key, value]) => {\n const metafieldIdentifiers = value as HasMetafieldsIdentifier[]\n const comboNamespace = `${metafieldNamespacePrefix}combo`\n const mappedIdentifiers = metafieldIdentifiers.map((item) => {\n // 特殊 namespace 不使用 metafieldNamespacePrefix,保持原样\n if (\n SPECIAL_METAFIELD_NAMESPACES.includes(item.namespace as any) ||\n item.namespace?.startsWith(comboNamespace)\n ) {\n return {\n namespace: item.namespace,\n key: item.key,\n }\n }\n return {\n namespace: comboNamespace,\n key: item.namespace,\n }\n })\n\n // 去重:基于 namespace 和 key 的组合\n const uniqueIdentifiers = mappedIdentifiers.filter(\n (item, index, self) =>\n index === self.findIndex((t) => t.namespace === item.namespace && t.key === item.key)\n )\n\n queryInput[`${key}MetafieldIdentifiers` as `${T}MetafieldIdentifiers`] =\n uniqueIdentifiers as HasMetafieldsIdentifier[]\n return queryInput\n },\n {} as PartialRecord<`${T}MetafieldIdentifiers`, HasMetafieldsIdentifier[]>\n )\n return identifiers\n}\n\nexport const parseMetafield = (item: Metafield, previewData?: any, resource_type?: string) => {\n const type = item?.type && item?.type.toLowerCase()\n if (\n item &&\n previewData &&\n previewData?.__preview_type === resource_type &&\n previewData[`${item?.namespace}${item?.key}`] !== undefined &&\n previewData[`${item?.namespace}${item?.key}`] !== null\n ) {\n return previewData[`${item.namespace}${item.key}`]\n }\n switch (type) {\n case 'json':\n case 'json_string':\n case 'rating':\n case 'volume':\n case 'weight':\n case 'dimension':\n return JSON.parse(item.value)\n default:\n return item?.value || item\n }\n}\n\n/**\n * 规范化 metafields 数据结构\n *\n * 对于特殊 namespace (__discountCodeApp, discounts_function):\n * - 使用 namespace 作为第一层 key\n * - 使用 key 作为第二层 key\n * - 直接存储解析后的值\n *\n * 对于普通 namespace:\n * - 使用 key 作为第一层 key(这里的 key 实际是转换后的 namespace)\n * - 解析 value 中的嵌套结构\n *\n * @example\n * // 输入 metafields:\n * [\n * { namespace: '__discountCodeApp', key: 'discount1', value: '{\"amount\": 10}', type: 'json' },\n * { namespace: 'my_prefix_combo', key: 'custom', value: '{\"field1\": {\"value\": \"data\"}}', type: 'json' }\n * ]\n *\n * // 输出:\n * {\n * __discountCodeApp: {\n * discount1: { amount: 10 }\n * },\n * custom: {\n * field1: \"data\"\n * }\n * }\n */\nexport const normalizeMetafields = (metafields: Array<Maybe<Metafield>>): Record<string, any> => {\n return metafields?.reduce(\n (prev, cur) => {\n if (cur) {\n // 检查是否是特殊的 namespace\n if (SPECIAL_METAFIELD_NAMESPACES.includes(cur.namespace as any)) {\n // 特殊 namespace 直接使用 namespace 作为第一层 key,key 作为第二层 key\n const namespace = cur.namespace\n prev[namespace] = prev[namespace] || {}\n prev[namespace][cur.key] = parseMetafield(cur)\n } else {\n // 普通 namespace 使用原来的逻辑(key 作为第一层)\n const namespace = cur.key\n prev[namespace] = prev[namespace] || {}\n const parsedMetafields: {\n [key: string]: Metafield\n } = parseMetafield(cur)\n if (parsedMetafields) {\n Object.entries(parsedMetafields).forEach(([key, innerMetafields]) => {\n prev[namespace][key] =\n prev[namespace][key] ?? (innerMetafields ? parseMetafield(innerMetafields) : null)\n })\n }\n }\n }\n return prev\n },\n {} as Record<string, any>\n )\n}\n\n/**\n * Add @inContext directive to GraphQL query for single shop multi-language/currency support\n *\n * @param query - GraphQL query string\n * @param country - Country code (e.g., 'PL', 'CA', 'US')\n * @param language - Language code (e.g., 'PL', 'FR', 'EN')\n * @returns Modified query with @inContext directive, or original query if country/language not provided\n *\n * @example\n * ```typescript\n * const query = `query getCart($cartId: ID!) { cart(id: $cartId) { id } }`\n * const modifiedQuery = addInContextDirective(query, 'PL', 'PL')\n * // Result: query getCart($cartId: ID!) @inContext(country: PL, language: PL) { cart(id: $cartId) { id } }\n * ```\n */\nexport function addInContextDirective(query: string, country?: string, language?: string): string {\n // If no country or language, return original query\n if (!country || !language) {\n return query\n }\n\n // Match query/mutation declaration with optional parameters\n // e.g., \"query getCart(...)\" or \"mutation createCart\"\n const operationRegex = /((?:query|mutation)\\s+\\w+)(\\s*\\([^)]*\\))?\\s*(\\{)/\n const match = query.match(operationRegex)\n\n if (!match) {\n // Fallback: try to find first { if no operation found\n const braceIndex = query.indexOf('{')\n if (braceIndex === -1) return query\n\n const beforeBrace = query.substring(0, braceIndex).trim()\n const afterBrace = query.substring(braceIndex)\n return `${beforeBrace} @inContext(country: ${country}, language: ${language}) ${afterBrace}`\n }\n\n // Insert @inContext after operation declaration (and parameters if exist), before {\n const beforeDirective = match[1] + (match[2] || '') // e.g., \"query getCart($id: ID!)\"\n const afterDirective = query.substring(match.index! + match[0].length - 1) // Everything starting from {\n\n return `${beforeDirective} @inContext(country: ${country}, language: ${language}) ${afterDirective}`\n}\n","import type { ShopifyConfig } from '@anker-in/shopify-core'\nimport type { GraphQLResponse, GraphQLRequest, FetchOptions } from './types'\nimport { addInContextDirective } from '../utils'\n\n/**\n * Shopify GraphQL Client\n * Handles all GraphQL communication with Shopify Storefront API\n */\nexport class ShopifyClient {\n private config: ShopifyConfig\n private locale: string\n\n constructor(config: ShopifyConfig, locale: string) {\n this.config = config\n this.locale = locale\n }\n\n /**\n * Execute a GraphQL request\n */\n async request<T = any>(\n request: GraphQLRequest,\n options: FetchOptions = {}\n ): Promise<GraphQLResponse<T>> {\n let { query, variables, operationName } = request\n const { tags = [], ...fetchOptions } = options\n\n // Add @inContext directive if needed for single shop multi-language/currency\n const country = this.config.getCountryCode(this.locale)\n const language = this.config.getLanguageCode(this.locale)\n query = addInContextDirective(query, country, language)\n\n const apiUrl = this.config.getApiUrl(this.locale)\n const token = this.config.getStorefrontToken(this.locale)\n\n const headers: HeadersInit = {\n 'Content-Type': 'application/json',\n 'X-Shopify-Storefront-Access-Token': token,\n ...(fetchOptions.headers || {}),\n }\n\n const body = JSON.stringify({\n query,\n variables,\n operationName,\n })\n\n try {\n const response = await fetch(apiUrl, {\n method: 'POST',\n headers,\n body,\n ...fetchOptions,\n ...(tags.length > 0 && { next: { tags } }),\n })\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n const json: GraphQLResponse<T> = await response.json()\n\n if (json.errors && json.errors.length > 0) {\n console.error('GraphQL Errors:', json.errors)\n }\n\n return json\n } catch (error) {\n console.error('Shopify API Request Failed:', error)\n throw error\n }\n }\n\n /**\n * Convenience method for simple queries\n */\n async query<T = any>(\n query: string,\n variables?: Record<string, any>,\n options?: FetchOptions\n ): Promise<T | undefined> {\n const response = await this.request<T>({ query, variables }, options)\n return response.data\n }\n\n /**\n * Get current locale\n */\n getLocale(): string {\n return this.locale\n }\n\n /**\n * Get config\n */\n getConfig(): ShopifyConfig {\n return this.config\n }\n\n /**\n * Get API URL\n */\n getApiUrl(): string {\n return this.config.getApiUrl(this.locale)\n }\n\n /**\n * Create a new client with different locale\n */\n withLocale(locale: string): ShopifyClient {\n return new ShopifyClient(this.config, locale)\n }\n}\n\n/**\n * Factory function to create a Shopify client\n */\nexport function createShopifyClient(config: ShopifyConfig, locale: string): ShopifyClient {\n return new ShopifyClient(config, locale)\n}\n"]}
1
+ {"version":3,"sources":["../../src/utils.ts","../../src/client/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { HasMetafieldsIdentifier, Maybe, Metafield } from './shopify-types'\n\nexport type PartialRecord<K extends string | number | symbol, T> = Partial<Record<K, T>>\n\nexport type Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>\n\nexport type Replace<T, K extends keyof T, V> = Omit<T, K> & { [P in K]: V }\n\nexport enum HasMetafieldQueryRoot {\n Product = 'product',\n Variant = 'variant',\n Page = 'page',\n Article = 'article',\n Blog = 'blog',\n Collection = 'collection',\n Shop = 'shop',\n Cart = 'cart',\n Customer = 'customer',\n Location = 'location',\n Market = 'market',\n Order = 'order',\n}\n\n/**\n * 特殊的 metafield namespace,不使用 metafieldNamespacePrefix 进行转换\n */\nexport const SPECIAL_METAFIELD_NAMESPACES = ['__discountCodeApp', 'discounts_function'] as const\n\n/**\n * 生成 metafieldIdentifiers 查询参数\n * 如果不传入 metafieldIdentifiers,会返回带有空数组的默认值,防止 GraphQL 查询报错\n *\n * @example\n * // 输入:\n * constructMetafieldIdentifiersQueryParams(\n * {\n * product: [\n * { namespace: 'custom', key: 'field1' },\n * { namespace: 'custom', key: 'field2' }, // 重复的 namespace,会被去重\n * { namespace: '__discountCodeApp', key: 'discount1' },\n * { namespace: 'discounts_function', key: 'discount2' }\n * ]\n * },\n * 'my_prefix_'\n * )\n *\n * // 输出:\n * {\n * productMetafieldIdentifiers: [\n * { namespace: 'my_prefix_combo', key: 'custom' }, // 普通 namespace 转换并去重\n * { namespace: '__discountCodeApp', key: 'discount1' }, // 特殊 namespace 保持原样\n * { namespace: 'discounts_function', key: 'discount2' } // 特殊 namespace 保持原样\n * ]\n * }\n */\nexport function constructMetafieldIdentifiersQueryParams<T extends HasMetafieldQueryRoot>(\n metafieldIdentifiers?: PartialRecord<T, HasMetafieldsIdentifier[]>,\n metafieldNamespacePrefix?: string\n): PartialRecord<`${T}MetafieldIdentifiers`, HasMetafieldsIdentifier[]> {\n // 如果没有传入 metafieldIdentifiers,返回默认的空数组\n if (!metafieldIdentifiers || Object.keys(metafieldIdentifiers).length === 0) {\n return {} as PartialRecord<`${T}MetafieldIdentifiers`, HasMetafieldsIdentifier[]>\n }\n\n const identifiers = Object.entries(metafieldIdentifiers).reduce(\n (queryInput, [key, value]) => {\n const metafieldIdentifiers = value as HasMetafieldsIdentifier[]\n const comboNamespace = `${metafieldNamespacePrefix}combo`\n const mappedIdentifiers = metafieldIdentifiers.map((item) => {\n // 特殊 namespace 不使用 metafieldNamespacePrefix,保持原样\n if (\n SPECIAL_METAFIELD_NAMESPACES.includes(item.namespace as any) ||\n item.namespace?.startsWith(comboNamespace)\n ) {\n return {\n namespace: item.namespace,\n key: item.key,\n }\n }\n return {\n namespace: comboNamespace,\n key: item.namespace,\n }\n })\n\n // 去重:基于 namespace 和 key 的组合\n const uniqueIdentifiers = mappedIdentifiers.filter(\n (item, index, self) =>\n index === self.findIndex((t) => t.namespace === item.namespace && t.key === item.key)\n )\n\n queryInput[`${key}MetafieldIdentifiers` as `${T}MetafieldIdentifiers`] =\n uniqueIdentifiers as HasMetafieldsIdentifier[]\n return queryInput\n },\n {} as PartialRecord<`${T}MetafieldIdentifiers`, HasMetafieldsIdentifier[]>\n )\n return identifiers\n}\n\nexport const parseMetafield = (item: Metafield, previewData?: any, resource_type?: string) => {\n const type = item?.type && item?.type.toLowerCase()\n if (\n item &&\n previewData &&\n previewData?.__preview_type === resource_type &&\n previewData[`${item?.namespace}${item?.key}`] !== undefined &&\n previewData[`${item?.namespace}${item?.key}`] !== null\n ) {\n return previewData[`${item.namespace}${item.key}`]\n }\n switch (type) {\n case 'json':\n case 'json_string':\n case 'rating':\n case 'volume':\n case 'weight':\n case 'dimension':\n return JSON.parse(item.value)\n default:\n return item?.value || item\n }\n}\n\n/**\n * 规范化 metafields 数据结构\n *\n * 对于特殊 namespace (__discountCodeApp, discounts_function):\n * - 使用 namespace 作为第一层 key\n * - 使用 key 作为第二层 key\n * - 直接存储解析后的值\n *\n * 对于普通 namespace:\n * - 使用 key 作为第一层 key(这里的 key 实际是转换后的 namespace)\n * - 解析 value 中的嵌套结构\n *\n * @example\n * // 输入 metafields:\n * [\n * { namespace: '__discountCodeApp', key: 'discount1', value: '{\"amount\": 10}', type: 'json' },\n * { namespace: 'my_prefix_combo', key: 'custom', value: '{\"field1\": {\"value\": \"data\"}}', type: 'json' }\n * ]\n *\n * // 输出:\n * {\n * __discountCodeApp: {\n * discount1: { amount: 10 }\n * },\n * custom: {\n * field1: \"data\"\n * }\n * }\n */\nexport const normalizeMetafields = (metafields: Array<Maybe<Metafield>>): Record<string, any> => {\n return metafields?.reduce(\n (prev, cur) => {\n if (cur) {\n // 检查是否是特殊的 namespace\n if (SPECIAL_METAFIELD_NAMESPACES.includes(cur.namespace as any)) {\n // 特殊 namespace 直接使用 namespace 作为第一层 key,key 作为第二层 key\n const namespace = cur.namespace\n prev[namespace] = prev[namespace] || {}\n prev[namespace][cur.key] = parseMetafield(cur)\n } else {\n // 普通 namespace 使用原来的逻辑(key 作为第一层)\n const namespace = cur.key\n prev[namespace] = prev[namespace] || {}\n const parsedMetafields: {\n [key: string]: Metafield\n } = parseMetafield(cur)\n if (parsedMetafields) {\n Object.entries(parsedMetafields).forEach(([key, innerMetafields]) => {\n prev[namespace][key] =\n prev[namespace][key] ?? (innerMetafields ? parseMetafield(innerMetafields) : null)\n })\n }\n }\n }\n return prev\n },\n {} as Record<string, any>\n )\n}\n\n/**\n * Add @inContext directive to GraphQL query for single shop multi-language/currency support\n *\n * @param query - GraphQL query string\n * @param country - Country code (e.g., 'PL', 'CA', 'US')\n * @param language - Language code (e.g., 'PL', 'FR', 'EN')\n * @returns Modified query with @inContext directive, or original query if country/language not provided\n *\n * @example\n * ```typescript\n * const query = `query getCart($cartId: ID!) { cart(id: $cartId) { id } }`\n * const modifiedQuery = addInContextDirective(query, 'PL', 'PL')\n * // Result: query getCart($cartId: ID!) @inContext(country: PL, language: PL) { cart(id: $cartId) { id } }\n * ```\n */\nexport function addInContextDirective(query: string, country?: string, language?: string): string {\n // If no country or language, return original query\n if (!country || !language) {\n return query\n }\n\n // Match query/mutation declaration with optional parameters\n // e.g., \"query getCart(...)\" or \"mutation createCart\"\n const operationRegex = /((?:query|mutation)\\s+\\w+)(\\s*\\([^)]*\\))?\\s*(\\{)/\n const match = query.match(operationRegex)\n\n if (!match) {\n // Fallback: try to find first { if no operation found\n const braceIndex = query.indexOf('{')\n if (braceIndex === -1) return query\n\n const beforeBrace = query.substring(0, braceIndex).trim()\n const afterBrace = query.substring(braceIndex)\n return `${beforeBrace} @inContext(country: ${country}, language: ${language}) ${afterBrace}`\n }\n\n // Insert @inContext after operation declaration (and parameters if exist), before {\n const beforeDirective = match[1] + (match[2] || '') // e.g., \"query getCart($id: ID!)\"\n const afterDirective = query.substring(match.index! + match[0].length - 1) // Everything starting from {\n\n return `${beforeDirective} @inContext(country: ${country}, language: ${language}) ${afterDirective}`\n}\n","import type { ShopifyConfig } from '@anker-in/shopify-core'\nimport type { GraphQLResponse, GraphQLRequest, FetchOptions } from './types'\nimport { addInContextDirective } from '../utils'\n\n/**\n * Shopify GraphQL Client\n * Handles all GraphQL communication with Shopify Storefront API\n */\nexport class ShopifyClient {\n private config: ShopifyConfig\n private locale: string\n\n constructor(config: ShopifyConfig, locale: string) {\n this.config = config\n this.locale = locale\n }\n\n /**\n * Execute a GraphQL request\n */\n async request<T = any>(\n request: GraphQLRequest,\n options: FetchOptions = {}\n ): Promise<GraphQLResponse<T>> {\n let { query, variables, operationName } = request\n const { tags = [], ...fetchOptions } = options\n\n // Add @inContext directive if needed for single shop multi-language/currency\n const country = this.config.getCountryCode(this.locale)\n const language = this.config.getLanguageCode(this.locale)\n query = addInContextDirective(query, country, language)\n\n const apiUrl = this.config.getApiUrl(this.locale)\n const token = this.config.getStorefrontToken(this.locale)\n\n const headers: HeadersInit = {\n 'Content-Type': 'application/json',\n 'X-Shopify-Storefront-Access-Token': token,\n ...(fetchOptions.headers || {}),\n }\n\n const body = JSON.stringify({\n query,\n variables,\n operationName,\n })\n\n try {\n const response = await fetch(apiUrl, {\n method: 'POST',\n headers,\n body,\n ...fetchOptions,\n ...(tags.length > 0 && { next: { tags } }),\n })\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n const json: GraphQLResponse<T> = await response.json()\n\n if (json.errors && json.errors.length > 0) {\n console.error('GraphQL Errors:', json.errors)\n }\n\n return json\n } catch (error) {\n console.error('Shopify API Request Failed:', error)\n throw error\n }\n }\n\n /**\n * Convenience method for simple queries\n */\n async query<T = any>(\n query: string,\n variables?: Record<string, any>,\n options?: FetchOptions\n ): Promise<T | undefined> {\n const response = await this.request<T>({ query, variables }, options)\n return response.data\n }\n\n /**\n * Get current locale\n */\n getLocale(): string {\n return this.locale\n }\n\n /**\n * Get config\n */\n getConfig(): ShopifyConfig {\n return this.config\n }\n\n /**\n * Get API URL\n */\n getApiUrl(): string {\n return this.config.getApiUrl(this.locale)\n }\n\n /**\n * Create a new client with different locale\n */\n withLocale(locale: string): ShopifyClient {\n return new ShopifyClient(this.config, locale)\n }\n}\n\n/**\n * Factory function to create a Shopify client\n */\nexport function createShopifyClient(config: ShopifyConfig, locale: string): ShopifyClient {\n return new ShopifyClient(config, locale)\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils.ts","../../src/client/client.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import { HasMetafieldsIdentifier, Maybe, Metafield } from './shopify-types'\n\nexport type PartialRecord<K extends string | number | symbol, T> = Partial<Record<K, T>>\n\nexport type Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>\n\nexport type Replace<T, K extends keyof T, V> = Omit<T, K> & { [P in K]: V }\n\nexport enum HasMetafieldQueryRoot {\n Product = 'product',\n Variant = 'variant',\n Page = 'page',\n Article = 'article',\n Blog = 'blog',\n Collection = 'collection',\n Shop = 'shop',\n Cart = 'cart',\n Customer = 'customer',\n Location = 'location',\n Market = 'market',\n Order = 'order',\n}\n\n/**\n * 特殊的 metafield namespace,不使用 metafieldNamespacePrefix 进行转换\n */\nexport const SPECIAL_METAFIELD_NAMESPACES = ['__discountCodeApp', 'discounts_function'] as const\n\n/**\n * 生成 metafieldIdentifiers 查询参数\n * 如果不传入 metafieldIdentifiers,会返回带有空数组的默认值,防止 GraphQL 查询报错\n *\n * @example\n * // 输入:\n * constructMetafieldIdentifiersQueryParams(\n * {\n * product: [\n * { namespace: 'custom', key: 'field1' },\n * { namespace: 'custom', key: 'field2' }, // 重复的 namespace,会被去重\n * { namespace: '__discountCodeApp', key: 'discount1' },\n * { namespace: 'discounts_function', key: 'discount2' }\n * ]\n * },\n * 'my_prefix_'\n * )\n *\n * // 输出:\n * {\n * productMetafieldIdentifiers: [\n * { namespace: 'my_prefix_combo', key: 'custom' }, // 普通 namespace 转换并去重\n * { namespace: '__discountCodeApp', key: 'discount1' }, // 特殊 namespace 保持原样\n * { namespace: 'discounts_function', key: 'discount2' } // 特殊 namespace 保持原样\n * ]\n * }\n */\nexport function constructMetafieldIdentifiersQueryParams<T extends HasMetafieldQueryRoot>(\n metafieldIdentifiers?: PartialRecord<T, HasMetafieldsIdentifier[]>,\n metafieldNamespacePrefix?: string\n): PartialRecord<`${T}MetafieldIdentifiers`, HasMetafieldsIdentifier[]> {\n // 如果没有传入 metafieldIdentifiers,返回默认的空数组\n if (!metafieldIdentifiers || Object.keys(metafieldIdentifiers).length === 0) {\n return {\n productMetafieldIdentifiers: [],\n variantMetafieldIdentifiers: [],\n } as PartialRecord<`${T}MetafieldIdentifiers`, HasMetafieldsIdentifier[]>\n }\n\n const identifiers = Object.entries(metafieldIdentifiers).reduce(\n (queryInput, [key, value]) => {\n const metafieldIdentifiers = value as HasMetafieldsIdentifier[]\n const comboNamespace = `${metafieldNamespacePrefix}combo`\n const mappedIdentifiers = metafieldIdentifiers.map((item) => {\n // 特殊 namespace 不使用 metafieldNamespacePrefix,保持原样\n if (\n SPECIAL_METAFIELD_NAMESPACES.includes(item.namespace as any) ||\n item.namespace?.startsWith(comboNamespace)\n ) {\n return {\n namespace: item.namespace,\n key: item.key,\n }\n }\n return {\n namespace: comboNamespace,\n key: item.namespace,\n }\n })\n\n // 去重:基于 namespace 和 key 的组合\n const uniqueIdentifiers = mappedIdentifiers.filter(\n (item, index, self) =>\n index === self.findIndex((t) => t.namespace === item.namespace && t.key === item.key)\n )\n\n queryInput[`${key}MetafieldIdentifiers` as `${T}MetafieldIdentifiers`] =\n uniqueIdentifiers as HasMetafieldsIdentifier[]\n return queryInput\n },\n {} as PartialRecord<`${T}MetafieldIdentifiers`, HasMetafieldsIdentifier[]>\n )\n return identifiers\n}\n\nexport const parseMetafield = (item: Metafield, previewData?: any, resource_type?: string) => {\n const type = item?.type && item?.type.toLowerCase()\n if (\n item &&\n previewData &&\n previewData?.__preview_type === resource_type &&\n previewData[`${item?.namespace}${item?.key}`] !== undefined &&\n previewData[`${item?.namespace}${item?.key}`] !== null\n ) {\n return previewData[`${item.namespace}${item.key}`]\n }\n switch (type) {\n case 'json':\n case 'json_string':\n case 'rating':\n case 'volume':\n case 'weight':\n case 'dimension':\n return JSON.parse(item.value)\n default:\n return item?.value || item\n }\n}\n\n/**\n * 规范化 metafields 数据结构\n *\n * 对于特殊 namespace (__discountCodeApp, discounts_function):\n * - 使用 namespace 作为第一层 key\n * - 使用 key 作为第二层 key\n * - 直接存储解析后的值\n *\n * 对于普通 namespace:\n * - 使用 key 作为第一层 key(这里的 key 实际是转换后的 namespace)\n * - 解析 value 中的嵌套结构\n *\n * @example\n * // 输入 metafields:\n * [\n * { namespace: '__discountCodeApp', key: 'discount1', value: '{\"amount\": 10}', type: 'json' },\n * { namespace: 'my_prefix_combo', key: 'custom', value: '{\"field1\": {\"value\": \"data\"}}', type: 'json' }\n * ]\n *\n * // 输出:\n * {\n * __discountCodeApp: {\n * discount1: { amount: 10 }\n * },\n * custom: {\n * field1: \"data\"\n * }\n * }\n */\nexport const normalizeMetafields = (metafields: Array<Maybe<Metafield>>): Record<string, any> => {\n return metafields?.reduce(\n (prev, cur) => {\n if (cur) {\n // 检查是否是特殊的 namespace\n if (SPECIAL_METAFIELD_NAMESPACES.includes(cur.namespace as any)) {\n // 特殊 namespace 直接使用 namespace 作为第一层 key,key 作为第二层 key\n const namespace = cur.namespace\n prev[namespace] = prev[namespace] || {}\n prev[namespace][cur.key] = parseMetafield(cur)\n } else {\n // 普通 namespace 使用原来的逻辑(key 作为第一层)\n const namespace = cur.key\n prev[namespace] = prev[namespace] || {}\n const parsedMetafields: {\n [key: string]: Metafield\n } = parseMetafield(cur)\n if (parsedMetafields) {\n Object.entries(parsedMetafields).forEach(([key, innerMetafields]) => {\n prev[namespace][key] =\n prev[namespace][key] ?? (innerMetafields ? parseMetafield(innerMetafields) : null)\n })\n }\n }\n }\n return prev\n },\n {} as Record<string, any>\n )\n}\n\n/**\n * Add @inContext directive to GraphQL query for single shop multi-language/currency support\n *\n * @param query - GraphQL query string\n * @param country - Country code (e.g., 'PL', 'CA', 'US')\n * @param language - Language code (e.g., 'PL', 'FR', 'EN')\n * @returns Modified query with @inContext directive, or original query if country/language not provided\n *\n * @example\n * ```typescript\n * const query = `query getCart($cartId: ID!) { cart(id: $cartId) { id } }`\n * const modifiedQuery = addInContextDirective(query, 'PL', 'PL')\n * // Result: query getCart($cartId: ID!) @inContext(country: PL, language: PL) { cart(id: $cartId) { id } }\n * ```\n */\nexport function addInContextDirective(query: string, country?: string, language?: string): string {\n // If no country or language, return original query\n if (!country || !language) {\n return query\n }\n\n // Match query/mutation declaration with optional parameters\n // e.g., \"query getCart(...)\" or \"mutation createCart\"\n const operationRegex = /((?:query|mutation)\\s+\\w+)(\\s*\\([^)]*\\))?\\s*(\\{)/\n const match = query.match(operationRegex)\n\n if (!match) {\n // Fallback: try to find first { if no operation found\n const braceIndex = query.indexOf('{')\n if (braceIndex === -1) return query\n\n const beforeBrace = query.substring(0, braceIndex).trim()\n const afterBrace = query.substring(braceIndex)\n return `${beforeBrace} @inContext(country: ${country}, language: ${language}) ${afterBrace}`\n }\n\n // Insert @inContext after operation declaration (and parameters if exist), before {\n const beforeDirective = match[1] + (match[2] || '') // e.g., \"query getCart($id: ID!)\"\n const afterDirective = query.substring(match.index! + match[0].length - 1) // Everything starting from {\n\n return `${beforeDirective} @inContext(country: ${country}, language: ${language}) ${afterDirective}`\n}\n","import type { ShopifyConfig } from '@anker-in/shopify-core'\nimport type { GraphQLResponse, GraphQLRequest, FetchOptions } from './types'\nimport { addInContextDirective } from '../utils'\n\n/**\n * Shopify GraphQL Client\n * Handles all GraphQL communication with Shopify Storefront API\n */\nexport class ShopifyClient {\n private config: ShopifyConfig\n private locale: string\n\n constructor(config: ShopifyConfig, locale: string) {\n this.config = config\n this.locale = locale\n }\n\n /**\n * Execute a GraphQL request\n */\n async request<T = any>(\n request: GraphQLRequest,\n options: FetchOptions = {}\n ): Promise<GraphQLResponse<T>> {\n let { query, variables, operationName } = request\n const { tags = [], ...fetchOptions } = options\n\n // Add @inContext directive if needed for single shop multi-language/currency\n const country = this.config.getCountryCode(this.locale)\n const language = this.config.getLanguageCode(this.locale)\n query = addInContextDirective(query, country, language)\n\n const apiUrl = this.config.getApiUrl(this.locale)\n const token = this.config.getStorefrontToken(this.locale)\n\n const headers: HeadersInit = {\n 'Content-Type': 'application/json',\n 'X-Shopify-Storefront-Access-Token': token,\n ...(fetchOptions.headers || {}),\n }\n\n const body = JSON.stringify({\n query,\n variables,\n operationName,\n })\n\n try {\n const response = await fetch(apiUrl, {\n method: 'POST',\n headers,\n body,\n ...fetchOptions,\n ...(tags.length > 0 && { next: { tags } }),\n })\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n const json: GraphQLResponse<T> = await response.json()\n\n if (json.errors && json.errors.length > 0) {\n console.error('GraphQL Errors:', json.errors)\n }\n\n return json\n } catch (error) {\n console.error('Shopify API Request Failed:', error)\n throw error\n }\n }\n\n /**\n * Convenience method for simple queries\n */\n async query<T = any>(\n query: string,\n variables?: Record<string, any>,\n options?: FetchOptions\n ): Promise<T | undefined> {\n const response = await this.request<T>({ query, variables }, options)\n return response.data\n }\n\n /**\n * Get current locale\n */\n getLocale(): string {\n return this.locale\n }\n\n /**\n * Get config\n */\n getConfig(): ShopifyConfig {\n return this.config\n }\n\n /**\n * Get API URL\n */\n getApiUrl(): string {\n return this.config.getApiUrl(this.locale)\n }\n\n /**\n * Create a new client with different locale\n */\n withLocale(locale: string): ShopifyClient {\n return new ShopifyClient(this.config, locale)\n }\n}\n\n/**\n * Factory function to create a Shopify client\n */\nexport function createShopifyClient(config: ShopifyConfig, locale: string): ShopifyClient {\n return new ShopifyClient(config, locale)\n}\n"]}
1
+ {"version":3,"sources":["../../src/utils.ts","../../src/client/client.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import { HasMetafieldsIdentifier, Maybe, Metafield } from './shopify-types'\n\nexport type PartialRecord<K extends string | number | symbol, T> = Partial<Record<K, T>>\n\nexport type Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>\n\nexport type Replace<T, K extends keyof T, V> = Omit<T, K> & { [P in K]: V }\n\nexport enum HasMetafieldQueryRoot {\n Product = 'product',\n Variant = 'variant',\n Page = 'page',\n Article = 'article',\n Blog = 'blog',\n Collection = 'collection',\n Shop = 'shop',\n Cart = 'cart',\n Customer = 'customer',\n Location = 'location',\n Market = 'market',\n Order = 'order',\n}\n\n/**\n * 特殊的 metafield namespace,不使用 metafieldNamespacePrefix 进行转换\n */\nexport const SPECIAL_METAFIELD_NAMESPACES = ['__discountCodeApp', 'discounts_function'] as const\n\n/**\n * 生成 metafieldIdentifiers 查询参数\n * 如果不传入 metafieldIdentifiers,会返回带有空数组的默认值,防止 GraphQL 查询报错\n *\n * @example\n * // 输入:\n * constructMetafieldIdentifiersQueryParams(\n * {\n * product: [\n * { namespace: 'custom', key: 'field1' },\n * { namespace: 'custom', key: 'field2' }, // 重复的 namespace,会被去重\n * { namespace: '__discountCodeApp', key: 'discount1' },\n * { namespace: 'discounts_function', key: 'discount2' }\n * ]\n * },\n * 'my_prefix_'\n * )\n *\n * // 输出:\n * {\n * productMetafieldIdentifiers: [\n * { namespace: 'my_prefix_combo', key: 'custom' }, // 普通 namespace 转换并去重\n * { namespace: '__discountCodeApp', key: 'discount1' }, // 特殊 namespace 保持原样\n * { namespace: 'discounts_function', key: 'discount2' } // 特殊 namespace 保持原样\n * ]\n * }\n */\nexport function constructMetafieldIdentifiersQueryParams<T extends HasMetafieldQueryRoot>(\n metafieldIdentifiers?: PartialRecord<T, HasMetafieldsIdentifier[]>,\n metafieldNamespacePrefix?: string\n): PartialRecord<`${T}MetafieldIdentifiers`, HasMetafieldsIdentifier[]> {\n // 如果没有传入 metafieldIdentifiers,返回默认的空数组\n if (!metafieldIdentifiers || Object.keys(metafieldIdentifiers).length === 0) {\n return {} as PartialRecord<`${T}MetafieldIdentifiers`, HasMetafieldsIdentifier[]>\n }\n\n const identifiers = Object.entries(metafieldIdentifiers).reduce(\n (queryInput, [key, value]) => {\n const metafieldIdentifiers = value as HasMetafieldsIdentifier[]\n const comboNamespace = `${metafieldNamespacePrefix}combo`\n const mappedIdentifiers = metafieldIdentifiers.map((item) => {\n // 特殊 namespace 不使用 metafieldNamespacePrefix,保持原样\n if (\n SPECIAL_METAFIELD_NAMESPACES.includes(item.namespace as any) ||\n item.namespace?.startsWith(comboNamespace)\n ) {\n return {\n namespace: item.namespace,\n key: item.key,\n }\n }\n return {\n namespace: comboNamespace,\n key: item.namespace,\n }\n })\n\n // 去重:基于 namespace 和 key 的组合\n const uniqueIdentifiers = mappedIdentifiers.filter(\n (item, index, self) =>\n index === self.findIndex((t) => t.namespace === item.namespace && t.key === item.key)\n )\n\n queryInput[`${key}MetafieldIdentifiers` as `${T}MetafieldIdentifiers`] =\n uniqueIdentifiers as HasMetafieldsIdentifier[]\n return queryInput\n },\n {} as PartialRecord<`${T}MetafieldIdentifiers`, HasMetafieldsIdentifier[]>\n )\n return identifiers\n}\n\nexport const parseMetafield = (item: Metafield, previewData?: any, resource_type?: string) => {\n const type = item?.type && item?.type.toLowerCase()\n if (\n item &&\n previewData &&\n previewData?.__preview_type === resource_type &&\n previewData[`${item?.namespace}${item?.key}`] !== undefined &&\n previewData[`${item?.namespace}${item?.key}`] !== null\n ) {\n return previewData[`${item.namespace}${item.key}`]\n }\n switch (type) {\n case 'json':\n case 'json_string':\n case 'rating':\n case 'volume':\n case 'weight':\n case 'dimension':\n return JSON.parse(item.value)\n default:\n return item?.value || item\n }\n}\n\n/**\n * 规范化 metafields 数据结构\n *\n * 对于特殊 namespace (__discountCodeApp, discounts_function):\n * - 使用 namespace 作为第一层 key\n * - 使用 key 作为第二层 key\n * - 直接存储解析后的值\n *\n * 对于普通 namespace:\n * - 使用 key 作为第一层 key(这里的 key 实际是转换后的 namespace)\n * - 解析 value 中的嵌套结构\n *\n * @example\n * // 输入 metafields:\n * [\n * { namespace: '__discountCodeApp', key: 'discount1', value: '{\"amount\": 10}', type: 'json' },\n * { namespace: 'my_prefix_combo', key: 'custom', value: '{\"field1\": {\"value\": \"data\"}}', type: 'json' }\n * ]\n *\n * // 输出:\n * {\n * __discountCodeApp: {\n * discount1: { amount: 10 }\n * },\n * custom: {\n * field1: \"data\"\n * }\n * }\n */\nexport const normalizeMetafields = (metafields: Array<Maybe<Metafield>>): Record<string, any> => {\n return metafields?.reduce(\n (prev, cur) => {\n if (cur) {\n // 检查是否是特殊的 namespace\n if (SPECIAL_METAFIELD_NAMESPACES.includes(cur.namespace as any)) {\n // 特殊 namespace 直接使用 namespace 作为第一层 key,key 作为第二层 key\n const namespace = cur.namespace\n prev[namespace] = prev[namespace] || {}\n prev[namespace][cur.key] = parseMetafield(cur)\n } else {\n // 普通 namespace 使用原来的逻辑(key 作为第一层)\n const namespace = cur.key\n prev[namespace] = prev[namespace] || {}\n const parsedMetafields: {\n [key: string]: Metafield\n } = parseMetafield(cur)\n if (parsedMetafields) {\n Object.entries(parsedMetafields).forEach(([key, innerMetafields]) => {\n prev[namespace][key] =\n prev[namespace][key] ?? (innerMetafields ? parseMetafield(innerMetafields) : null)\n })\n }\n }\n }\n return prev\n },\n {} as Record<string, any>\n )\n}\n\n/**\n * Add @inContext directive to GraphQL query for single shop multi-language/currency support\n *\n * @param query - GraphQL query string\n * @param country - Country code (e.g., 'PL', 'CA', 'US')\n * @param language - Language code (e.g., 'PL', 'FR', 'EN')\n * @returns Modified query with @inContext directive, or original query if country/language not provided\n *\n * @example\n * ```typescript\n * const query = `query getCart($cartId: ID!) { cart(id: $cartId) { id } }`\n * const modifiedQuery = addInContextDirective(query, 'PL', 'PL')\n * // Result: query getCart($cartId: ID!) @inContext(country: PL, language: PL) { cart(id: $cartId) { id } }\n * ```\n */\nexport function addInContextDirective(query: string, country?: string, language?: string): string {\n // If no country or language, return original query\n if (!country || !language) {\n return query\n }\n\n // Match query/mutation declaration with optional parameters\n // e.g., \"query getCart(...)\" or \"mutation createCart\"\n const operationRegex = /((?:query|mutation)\\s+\\w+)(\\s*\\([^)]*\\))?\\s*(\\{)/\n const match = query.match(operationRegex)\n\n if (!match) {\n // Fallback: try to find first { if no operation found\n const braceIndex = query.indexOf('{')\n if (braceIndex === -1) return query\n\n const beforeBrace = query.substring(0, braceIndex).trim()\n const afterBrace = query.substring(braceIndex)\n return `${beforeBrace} @inContext(country: ${country}, language: ${language}) ${afterBrace}`\n }\n\n // Insert @inContext after operation declaration (and parameters if exist), before {\n const beforeDirective = match[1] + (match[2] || '') // e.g., \"query getCart($id: ID!)\"\n const afterDirective = query.substring(match.index! + match[0].length - 1) // Everything starting from {\n\n return `${beforeDirective} @inContext(country: ${country}, language: ${language}) ${afterDirective}`\n}\n","import type { ShopifyConfig } from '@anker-in/shopify-core'\nimport type { GraphQLResponse, GraphQLRequest, FetchOptions } from './types'\nimport { addInContextDirective } from '../utils'\n\n/**\n * Shopify GraphQL Client\n * Handles all GraphQL communication with Shopify Storefront API\n */\nexport class ShopifyClient {\n private config: ShopifyConfig\n private locale: string\n\n constructor(config: ShopifyConfig, locale: string) {\n this.config = config\n this.locale = locale\n }\n\n /**\n * Execute a GraphQL request\n */\n async request<T = any>(\n request: GraphQLRequest,\n options: FetchOptions = {}\n ): Promise<GraphQLResponse<T>> {\n let { query, variables, operationName } = request\n const { tags = [], ...fetchOptions } = options\n\n // Add @inContext directive if needed for single shop multi-language/currency\n const country = this.config.getCountryCode(this.locale)\n const language = this.config.getLanguageCode(this.locale)\n query = addInContextDirective(query, country, language)\n\n const apiUrl = this.config.getApiUrl(this.locale)\n const token = this.config.getStorefrontToken(this.locale)\n\n const headers: HeadersInit = {\n 'Content-Type': 'application/json',\n 'X-Shopify-Storefront-Access-Token': token,\n ...(fetchOptions.headers || {}),\n }\n\n const body = JSON.stringify({\n query,\n variables,\n operationName,\n })\n\n try {\n const response = await fetch(apiUrl, {\n method: 'POST',\n headers,\n body,\n ...fetchOptions,\n ...(tags.length > 0 && { next: { tags } }),\n })\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n const json: GraphQLResponse<T> = await response.json()\n\n if (json.errors && json.errors.length > 0) {\n console.error('GraphQL Errors:', json.errors)\n }\n\n return json\n } catch (error) {\n console.error('Shopify API Request Failed:', error)\n throw error\n }\n }\n\n /**\n * Convenience method for simple queries\n */\n async query<T = any>(\n query: string,\n variables?: Record<string, any>,\n options?: FetchOptions\n ): Promise<T | undefined> {\n const response = await this.request<T>({ query, variables }, options)\n return response.data\n }\n\n /**\n * Get current locale\n */\n getLocale(): string {\n return this.locale\n }\n\n /**\n * Get config\n */\n getConfig(): ShopifyConfig {\n return this.config\n }\n\n /**\n * Get API URL\n */\n getApiUrl(): string {\n return this.config.getApiUrl(this.locale)\n }\n\n /**\n * Create a new client with different locale\n */\n withLocale(locale: string): ShopifyClient {\n return new ShopifyClient(this.config, locale)\n }\n}\n\n/**\n * Factory function to create a Shopify client\n */\nexport function createShopifyClient(config: ShopifyConfig, locale: string): ShopifyClient {\n return new ShopifyClient(config, locale)\n}\n"]}
@@ -24,10 +24,10 @@ declare const pageInfoFragment = "\n fragment pageInfo on PageInfo {\n hasNe
24
24
  /**
25
25
  * Blog GraphQL Fragments
26
26
  */
27
- declare const articleFragment = "\n fragment article on Article {\n id\n handle\n title\n content\n contentHtml\n excerpt\n excerptHtml\n publishedAt\n image {\n ...image\n }\n seo {\n ...seo\n }\n tags\n author {\n name\n }\n }\n \n fragment image on Image {\n url\n altText\n width\n height\n }\n\n \n fragment seo on SEO {\n description\n title\n }\n\n";
28
- declare const articleWithMetafieldsFragment = "\n fragment articleWithMetafields on Article {\n id\n handle\n title\n content\n contentHtml\n excerpt\n excerptHtml\n publishedAt\n image {\n ...image\n }\n seo {\n ...seo\n }\n tags\n author {\n name\n }\n metafields(identifiers: $articleMetafieldIdentifiers) {\n ...metafield\n }\n }\n \n fragment image on Image {\n url\n altText\n width\n height\n }\n\n \n fragment seo on SEO {\n description\n title\n }\n\n \n fragment metafield on Metafield {\n value\n type\n description\n namespace\n key\n }\n\n";
29
- declare const blogFragment = "\n fragment blog on Blog {\n id\n handle\n title\n seo {\n ...seo\n }\n }\n \n fragment seo on SEO {\n description\n title\n }\n\n";
30
- declare const blogWithMetafieldsFragment = "\n fragment blogWithMetafields on Blog {\n id\n handle\n title\n seo {\n ...seo\n }\n metafields(identifiers: $blogMetafieldIdentifiers) {\n ...metafield\n }\n }\n \n fragment seo on SEO {\n description\n title\n }\n\n \n fragment metafield on Metafield {\n value\n type\n description\n namespace\n key\n }\n\n";
27
+ declare const articleFragment = "\n fragment article on Article {\n id\n handle\n title\n content\n contentHtml\n excerpt\n excerptHtml\n publishedAt\n image {\n ...image\n }\n seo {\n ...seo\n }\n tags\n author {\n name\n }\n }\n";
28
+ declare const articleWithMetafieldsFragment = "\n fragment articleWithMetafields on Article {\n id\n handle\n title\n content\n contentHtml\n excerpt\n excerptHtml\n publishedAt\n image {\n ...image\n }\n seo {\n ...seo\n }\n tags\n author {\n name\n }\n metafields(identifiers: $articleMetafieldIdentifiers) {\n ...metafield\n }\n }\n";
29
+ declare const blogFragment = "\n fragment blog on Blog {\n id\n handle\n title\n seo {\n ...seo\n }\n }\n";
30
+ declare const blogWithMetafieldsFragment = "\n fragment blogWithMetafields on Blog {\n id\n handle\n title\n seo {\n ...seo\n }\n metafields(identifiers: $blogMetafieldIdentifiers) {\n ...metafield\n }\n }\n";
31
31
 
32
32
  /**
33
33
  * Page GraphQL Fragments
@@ -38,7 +38,7 @@ declare const pageWithMetafieldsFragment = "\n fragment pageWithMetafields on P
38
38
  /**
39
39
  * Shop GraphQL Fragments
40
40
  */
41
- declare const shopFragment = "\n fragment shop on Shop {\n name\n description\n primaryDomain {\n url\n host\n }\n brand {\n logo {\n image {\n url\n }\n }\n colors {\n primary {\n background\n }\n secondary {\n background\n }\n }\n }\n }\n";
42
- declare const shopWithMetafieldsFragment = "\n fragment shopWithMetafields on Shop {\n name\n description\n primaryDomain {\n url\n host\n }\n brand {\n logo {\n image {\n url\n }\n }\n colors {\n primary {\n background\n }\n secondary {\n background\n }\n }\n }\n metafields(identifiers: $shopMetafieldIdentifiers) {\n ...metafield\n }\n }\n \n fragment metafield on Metafield {\n value\n type\n description\n namespace\n key\n }\n\n";
41
+ declare const shopFragment = "\n fragment shop on Shop {\n name\n description\n moneyFormat\n primaryDomain {\n host\n url\n }\n paymentSettings {\n currencyCode\n enabledPresentmentCurrencies\n }\n brand {\n logo {\n image {\n url\n }\n }\n colors {\n primary {\n background\n }\n secondary {\n background\n }\n }\n }\n }\n";
42
+ declare const shopWithMetafieldsFragment = "\n fragment shopWithMetafields on Shop {\n name\n description\n moneyFormat\n primaryDomain {\n host\n url\n }\n paymentSettings {\n currencyCode\n enabledPresentmentCurrencies\n }\n brand {\n logo {\n image {\n url\n }\n }\n colors {\n primary {\n background\n }\n secondary {\n background\n }\n }\n }\n metafields(identifiers: $shopMetafieldIdentifiers) {\n ...metafield\n }\n }\n \n fragment metafield on Metafield {\n value\n type\n description\n namespace\n key\n }\n\n";
43
43
 
44
44
  export { articleFragment, articleWithMetafieldsFragment, blogFragment, blogWithMetafieldsFragment, cartFragment, collectionFragment, imageFragment, metafieldFragment, metafieldFragmentStr, pageFragment, pageInfoFragment, pageWithMetafieldsFragment, productFragment, seoFragment, shopFragment, shopWithMetafieldsFragment, variantFragment };
@@ -24,10 +24,10 @@ declare const pageInfoFragment = "\n fragment pageInfo on PageInfo {\n hasNe
24
24
  /**
25
25
  * Blog GraphQL Fragments
26
26
  */
27
- declare const articleFragment = "\n fragment article on Article {\n id\n handle\n title\n content\n contentHtml\n excerpt\n excerptHtml\n publishedAt\n image {\n ...image\n }\n seo {\n ...seo\n }\n tags\n author {\n name\n }\n }\n \n fragment image on Image {\n url\n altText\n width\n height\n }\n\n \n fragment seo on SEO {\n description\n title\n }\n\n";
28
- declare const articleWithMetafieldsFragment = "\n fragment articleWithMetafields on Article {\n id\n handle\n title\n content\n contentHtml\n excerpt\n excerptHtml\n publishedAt\n image {\n ...image\n }\n seo {\n ...seo\n }\n tags\n author {\n name\n }\n metafields(identifiers: $articleMetafieldIdentifiers) {\n ...metafield\n }\n }\n \n fragment image on Image {\n url\n altText\n width\n height\n }\n\n \n fragment seo on SEO {\n description\n title\n }\n\n \n fragment metafield on Metafield {\n value\n type\n description\n namespace\n key\n }\n\n";
29
- declare const blogFragment = "\n fragment blog on Blog {\n id\n handle\n title\n seo {\n ...seo\n }\n }\n \n fragment seo on SEO {\n description\n title\n }\n\n";
30
- declare const blogWithMetafieldsFragment = "\n fragment blogWithMetafields on Blog {\n id\n handle\n title\n seo {\n ...seo\n }\n metafields(identifiers: $blogMetafieldIdentifiers) {\n ...metafield\n }\n }\n \n fragment seo on SEO {\n description\n title\n }\n\n \n fragment metafield on Metafield {\n value\n type\n description\n namespace\n key\n }\n\n";
27
+ declare const articleFragment = "\n fragment article on Article {\n id\n handle\n title\n content\n contentHtml\n excerpt\n excerptHtml\n publishedAt\n image {\n ...image\n }\n seo {\n ...seo\n }\n tags\n author {\n name\n }\n }\n";
28
+ declare const articleWithMetafieldsFragment = "\n fragment articleWithMetafields on Article {\n id\n handle\n title\n content\n contentHtml\n excerpt\n excerptHtml\n publishedAt\n image {\n ...image\n }\n seo {\n ...seo\n }\n tags\n author {\n name\n }\n metafields(identifiers: $articleMetafieldIdentifiers) {\n ...metafield\n }\n }\n";
29
+ declare const blogFragment = "\n fragment blog on Blog {\n id\n handle\n title\n seo {\n ...seo\n }\n }\n";
30
+ declare const blogWithMetafieldsFragment = "\n fragment blogWithMetafields on Blog {\n id\n handle\n title\n seo {\n ...seo\n }\n metafields(identifiers: $blogMetafieldIdentifiers) {\n ...metafield\n }\n }\n";
31
31
 
32
32
  /**
33
33
  * Page GraphQL Fragments
@@ -38,7 +38,7 @@ declare const pageWithMetafieldsFragment = "\n fragment pageWithMetafields on P
38
38
  /**
39
39
  * Shop GraphQL Fragments
40
40
  */
41
- declare const shopFragment = "\n fragment shop on Shop {\n name\n description\n primaryDomain {\n url\n host\n }\n brand {\n logo {\n image {\n url\n }\n }\n colors {\n primary {\n background\n }\n secondary {\n background\n }\n }\n }\n }\n";
42
- declare const shopWithMetafieldsFragment = "\n fragment shopWithMetafields on Shop {\n name\n description\n primaryDomain {\n url\n host\n }\n brand {\n logo {\n image {\n url\n }\n }\n colors {\n primary {\n background\n }\n secondary {\n background\n }\n }\n }\n metafields(identifiers: $shopMetafieldIdentifiers) {\n ...metafield\n }\n }\n \n fragment metafield on Metafield {\n value\n type\n description\n namespace\n key\n }\n\n";
41
+ declare const shopFragment = "\n fragment shop on Shop {\n name\n description\n moneyFormat\n primaryDomain {\n host\n url\n }\n paymentSettings {\n currencyCode\n enabledPresentmentCurrencies\n }\n brand {\n logo {\n image {\n url\n }\n }\n colors {\n primary {\n background\n }\n secondary {\n background\n }\n }\n }\n }\n";
42
+ declare const shopWithMetafieldsFragment = "\n fragment shopWithMetafields on Shop {\n name\n description\n moneyFormat\n primaryDomain {\n host\n url\n }\n paymentSettings {\n currencyCode\n enabledPresentmentCurrencies\n }\n brand {\n logo {\n image {\n url\n }\n }\n colors {\n primary {\n background\n }\n secondary {\n background\n }\n }\n }\n metafields(identifiers: $shopMetafieldIdentifiers) {\n ...metafield\n }\n }\n \n fragment metafield on Metafield {\n value\n type\n description\n namespace\n key\n }\n\n";
43
43
 
44
44
  export { articleFragment, articleWithMetafieldsFragment, blogFragment, blogWithMetafieldsFragment, cartFragment, collectionFragment, imageFragment, metafieldFragment, metafieldFragmentStr, pageFragment, pageInfoFragment, pageWithMetafieldsFragment, productFragment, seoFragment, shopFragment, shopWithMetafieldsFragment, variantFragment };
@@ -518,8 +518,6 @@ var articleFragment = (
518
518
  name
519
519
  }
520
520
  }
521
- ${imageFragment}
522
- ${seoFragment}
523
521
  `
524
522
  );
525
523
  var articleWithMetafieldsFragment = (
@@ -548,9 +546,6 @@ var articleWithMetafieldsFragment = (
548
546
  ...metafield
549
547
  }
550
548
  }
551
- ${imageFragment}
552
- ${seoFragment}
553
- ${metafieldFragment}
554
549
  `
555
550
  );
556
551
  var blogFragment = (
@@ -564,7 +559,6 @@ var blogFragment = (
564
559
  ...seo
565
560
  }
566
561
  }
567
- ${seoFragment}
568
562
  `
569
563
  );
570
564
  var blogWithMetafieldsFragment = (
@@ -581,8 +575,6 @@ var blogWithMetafieldsFragment = (
581
575
  ...metafield
582
576
  }
583
577
  }
584
- ${seoFragment}
585
- ${metafieldFragment}
586
578
  `
587
579
  );
588
580
 
@@ -635,9 +627,14 @@ var shopFragment = (
635
627
  fragment shop on Shop {
636
628
  name
637
629
  description
630
+ moneyFormat
638
631
  primaryDomain {
639
- url
640
632
  host
633
+ url
634
+ }
635
+ paymentSettings {
636
+ currencyCode
637
+ enabledPresentmentCurrencies
641
638
  }
642
639
  brand {
643
640
  logo {
@@ -663,9 +660,14 @@ var shopWithMetafieldsFragment = (
663
660
  fragment shopWithMetafields on Shop {
664
661
  name
665
662
  description
663
+ moneyFormat
666
664
  primaryDomain {
667
- url
668
665
  host
666
+ url
667
+ }
668
+ paymentSettings {
669
+ currencyCode
670
+ enabledPresentmentCurrencies
669
671
  }
670
672
  brand {
671
673
  logo {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/fragments/image.ts","../../src/fragments/seo.ts","../../src/fragments/metafield.ts","../../src/fragments/variant.ts","../../src/fragments/product.ts","../../src/fragments/cart.ts","../../src/fragments/collection.ts","../../src/fragments/page-info.ts","../../src/fragments/blog.ts","../../src/fragments/page.ts","../../src/fragments/shop.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export const imageFragment = /* GraphQL */ `\n fragment image on Image {\n url\n altText\n width\n height\n }\n`\n","export const seoFragment = /* GraphQL */ `\n fragment seo on SEO {\n description\n title\n }\n`\n","export const metafieldFragment = /* GraphQL */ `\n fragment metafield on Metafield {\n value\n type\n description\n namespace\n key\n }\n`\n\nexport const metafieldFragmentStr = `\n value\n type\n description\n namespace\n key\n`\n","export const variantFragment = /* GraphQL */ `\n fragment variant on ProductVariant {\n id\n sku\n title\n requiresShipping\n quantityAvailable\n currentlyNotInStock\n availableForSale\n barcode\n weight\n selectedOptions {\n name\n value\n }\n image {\n ...image\n }\n price {\n amount\n currencyCode\n }\n compareAtPrice {\n amount\n currencyCode\n }\n metafields(identifiers: $variantMetafieldIdentifiers) {\n ...metafield\n }\n sellingPlanAllocations(first: 10) {\n edges {\n node {\n sellingPlan {\n id\n name\n options {\n name\n value\n }\n }\n priceAdjustments {\n compareAtPrice {\n amount\n currencyCode\n }\n perDeliveryPrice {\n amount\n currencyCode\n }\n price {\n amount\n currencyCode\n }\n }\n }\n }\n }\n }\n`\n","/**\n * Product GraphQL Fragment\n */\nexport const productFragment = /* GraphQL */ `\n fragment product on Product {\n id\n handle\n availableForSale\n title\n description\n descriptionHtml\n options {\n id\n name\n values\n }\n productType\n vendor\n priceRange {\n maxVariantPrice {\n amount\n currencyCode\n }\n minVariantPrice {\n amount\n currencyCode\n }\n }\n compareAtPriceRange {\n minVariantPrice {\n amount\n currencyCode\n }\n }\n featuredImage {\n ...image\n }\n images(first: 250) {\n edges {\n node {\n ...image\n }\n }\n }\n metafields(identifiers: $productMetafieldIdentifiers) {\n ...metafield\n }\n media(first: 250) {\n edges {\n node {\n id\n mediaContentType\n ... on Video {\n id\n sources {\n format\n height\n mimeType\n url\n width\n }\n }\n ... on MediaImage {\n id\n image {\n altText\n url\n }\n }\n }\n }\n }\n seo {\n ...seo\n }\n tags\n createdAt\n updatedAt\n publishedAt\n requiresSellingPlan\n sellingPlanGroups(first: 250) {\n edges {\n node {\n name\n sellingPlans(first: 250) {\n edges {\n node {\n id\n name\n priceAdjustments {\n adjustmentValue {\n ... on SellingPlanFixedAmountPriceAdjustment {\n __typename\n adjustmentAmount {\n amount\n currencyCode\n }\n }\n ... on SellingPlanFixedPriceAdjustment {\n __typename\n price {\n amount\n currencyCode\n }\n }\n ... on SellingPlanPercentagePriceAdjustment {\n __typename\n adjustmentPercentage\n }\n }\n }\n options {\n name\n value\n }\n }\n }\n }\n }\n }\n }\n }\n`\n","import { imageFragment } from './image'\nimport { metafieldFragment } from './metafield'\nimport { productFragment } from './product'\nimport { seoFragment } from './seo'\n\nexport const cartFragment = /* GraphQL */ `\n fragment cart on Cart {\n id\n totalQuantity\n updatedAt\n createdAt\n checkoutUrl\n note\n attributes {\n key\n value\n }\n cost {\n checkoutChargeAmount {\n amount\n currencyCode\n }\n subtotalAmount {\n amount\n currencyCode\n }\n totalAmount {\n amount\n currencyCode\n }\n totalTaxAmount {\n amount\n currencyCode\n }\n totalDutyAmount {\n amount\n currencyCode\n }\n totalAmountEstimated\n totalTaxAmountEstimated\n totalDutyAmountEstimated\n subtotalAmountEstimated\n }\n buyerIdentity {\n email\n phone\n countryCode\n customer {\n email\n id\n }\n deliveryAddressPreferences {\n ... on MailingAddress {\n address1\n address2\n city\n province\n country\n zip\n firstName\n lastName\n }\n }\n }\n discountCodes {\n applicable\n code\n }\n discountAllocations {\n ... on CartCodeDiscountAllocation {\n code\n discountedAmount {\n amount\n currencyCode\n }\n }\n ... on CartAutomaticDiscountAllocation {\n title\n discountedAmount {\n amount\n currencyCode\n }\n }\n ... on CartCustomDiscountAllocation {\n title\n discountedAmount {\n amount\n currencyCode\n }\n }\n }\n deliveryGroups(first: 10) {\n nodes {\n ... on CartDeliveryGroup {\n id\n deliveryOptions {\n ... on CartDeliveryOption {\n code\n description\n deliveryMethodType\n handle\n title\n estimatedCost {\n amount\n currencyCode\n }\n }\n }\n deliveryAddress {\n ... on MailingAddress {\n address1\n address2\n city\n country\n zip\n }\n }\n selectedDeliveryOption {\n ... on CartDeliveryOption {\n code\n description\n deliveryMethodType\n handle\n title\n estimatedCost {\n amount\n currencyCode\n }\n }\n }\n }\n }\n }\n lines(first: 100) {\n edges {\n node {\n id\n quantity\n discountAllocations {\n ... on CartCodeDiscountAllocation {\n code\n discountedAmount {\n amount\n currencyCode\n }\n }\n ... on CartAutomaticDiscountAllocation {\n title\n discountedAmount {\n amount\n currencyCode\n }\n }\n ... on CartCustomDiscountAllocation {\n title\n discountedAmount {\n amount\n currencyCode\n }\n }\n }\n attributes {\n key\n value\n }\n cost {\n amountPerQuantity {\n amount\n currencyCode\n }\n compareAtAmountPerQuantity {\n amount\n currencyCode\n }\n subtotalAmount {\n amount\n currencyCode\n }\n totalAmount {\n amount\n currencyCode\n }\n }\n merchandise {\n ... on ProductVariant {\n id\n sku\n title\n quantityAvailable\n currentlyNotInStock\n availableForSale\n barcode\n weight\n selectedOptions {\n name\n value\n }\n image {\n ...image\n }\n price {\n amount\n currencyCode\n }\n compareAtPrice {\n amount\n currencyCode\n }\n metafields(identifiers: $variantMetafieldIdentifiers) {\n ...metafield\n }\n product {\n ...product\n }\n }\n }\n }\n }\n }\n totalQuantity\n }\n ${productFragment}\n ${imageFragment}\n ${seoFragment}\n ${metafieldFragment}\n`\n","/**\n * Collection GraphQL Fragment\n */\n\nimport { imageFragment } from './image'\nimport { seoFragment } from './seo'\n\nexport const collectionFragment = /* GraphQL */ `\n fragment collection on Collection {\n id\n handle\n title\n description\n descriptionHtml\n image {\n ...image\n }\n seo {\n ...seo\n }\n updatedAt\n }\n`\n","export const pageInfoFragment = /* GraphQL */ `\n fragment pageInfo on PageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n`\n","/**\n * Blog GraphQL Fragments\n */\n\nimport { imageFragment } from './image'\nimport { seoFragment } from './seo'\nimport { metafieldFragment } from './metafield'\n\nexport const articleFragment = /* GraphQL */ `\n fragment article on Article {\n id\n handle\n title\n content\n contentHtml\n excerpt\n excerptHtml\n publishedAt\n image {\n ...image\n }\n seo {\n ...seo\n }\n tags\n author {\n name\n }\n }\n ${imageFragment}\n ${seoFragment}\n`\n\nexport const articleWithMetafieldsFragment = /* GraphQL */ `\n fragment articleWithMetafields on Article {\n id\n handle\n title\n content\n contentHtml\n excerpt\n excerptHtml\n publishedAt\n image {\n ...image\n }\n seo {\n ...seo\n }\n tags\n author {\n name\n }\n metafields(identifiers: $articleMetafieldIdentifiers) {\n ...metafield\n }\n }\n ${imageFragment}\n ${seoFragment}\n ${metafieldFragment}\n`\n\nexport const blogFragment = /* GraphQL */ `\n fragment blog on Blog {\n id\n handle\n title\n seo {\n ...seo\n }\n }\n ${seoFragment}\n`\n\nexport const blogWithMetafieldsFragment = /* GraphQL */ `\n fragment blogWithMetafields on Blog {\n id\n handle\n title\n seo {\n ...seo\n }\n metafields(identifiers: $blogMetafieldIdentifiers) {\n ...metafield\n }\n }\n ${seoFragment}\n ${metafieldFragment}\n`\n","/**\n * Page GraphQL Fragments\n */\n\nimport { seoFragment } from './seo'\nimport { metafieldFragment } from './metafield'\n\nexport const pageFragment = /* GraphQL */ `\n fragment page on Page {\n id\n handle\n title\n body\n bodySummary\n createdAt\n updatedAt\n seo {\n ...seo\n }\n }\n ${seoFragment}\n`\n\nexport const pageWithMetafieldsFragment = /* GraphQL */ `\n fragment pageWithMetafields on Page {\n id\n handle\n title\n body\n bodySummary\n createdAt\n updatedAt\n seo {\n ...seo\n }\n metafields(identifiers: $pageMetafieldIdentifiers) {\n ...metafield\n }\n }\n ${seoFragment}\n ${metafieldFragment}\n`\n","/**\n * Shop GraphQL Fragments\n */\n\nimport { metafieldFragment } from './metafield'\n\nexport const shopFragment = /* GraphQL */ `\n fragment shop on Shop {\n name\n description\n primaryDomain {\n url\n host\n }\n brand {\n logo {\n image {\n url\n }\n }\n colors {\n primary {\n background\n }\n secondary {\n background\n }\n }\n }\n }\n`\n\nexport const shopWithMetafieldsFragment = /* GraphQL */ `\n fragment shopWithMetafields on Shop {\n name\n description\n primaryDomain {\n url\n host\n }\n brand {\n logo {\n image {\n url\n }\n }\n colors {\n primary {\n background\n }\n secondary {\n background\n }\n }\n }\n metafields(identifiers: $shopMetafieldIdentifiers) {\n ...metafield\n }\n }\n ${metafieldFragment}\n`\n"]}
1
+ {"version":3,"sources":["../../src/fragments/image.ts","../../src/fragments/seo.ts","../../src/fragments/metafield.ts","../../src/fragments/variant.ts","../../src/fragments/product.ts","../../src/fragments/cart.ts","../../src/fragments/collection.ts","../../src/fragments/page-info.ts","../../src/fragments/blog.ts","../../src/fragments/page.ts","../../src/fragments/shop.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export const imageFragment = /* GraphQL */ `\n fragment image on Image {\n url\n altText\n width\n height\n }\n`\n","export const seoFragment = /* GraphQL */ `\n fragment seo on SEO {\n description\n title\n }\n`\n","export const metafieldFragment = /* GraphQL */ `\n fragment metafield on Metafield {\n value\n type\n description\n namespace\n key\n }\n`\n\nexport const metafieldFragmentStr = `\n value\n type\n description\n namespace\n key\n`\n","export const variantFragment = /* GraphQL */ `\n fragment variant on ProductVariant {\n id\n sku\n title\n requiresShipping\n quantityAvailable\n currentlyNotInStock\n availableForSale\n barcode\n weight\n selectedOptions {\n name\n value\n }\n image {\n ...image\n }\n price {\n amount\n currencyCode\n }\n compareAtPrice {\n amount\n currencyCode\n }\n metafields(identifiers: $variantMetafieldIdentifiers) {\n ...metafield\n }\n sellingPlanAllocations(first: 10) {\n edges {\n node {\n sellingPlan {\n id\n name\n options {\n name\n value\n }\n }\n priceAdjustments {\n compareAtPrice {\n amount\n currencyCode\n }\n perDeliveryPrice {\n amount\n currencyCode\n }\n price {\n amount\n currencyCode\n }\n }\n }\n }\n }\n }\n`\n","/**\n * Product GraphQL Fragment\n */\nexport const productFragment = /* GraphQL */ `\n fragment product on Product {\n id\n handle\n availableForSale\n title\n description\n descriptionHtml\n options {\n id\n name\n values\n }\n productType\n vendor\n priceRange {\n maxVariantPrice {\n amount\n currencyCode\n }\n minVariantPrice {\n amount\n currencyCode\n }\n }\n compareAtPriceRange {\n minVariantPrice {\n amount\n currencyCode\n }\n }\n featuredImage {\n ...image\n }\n images(first: 250) {\n edges {\n node {\n ...image\n }\n }\n }\n metafields(identifiers: $productMetafieldIdentifiers) {\n ...metafield\n }\n media(first: 250) {\n edges {\n node {\n id\n mediaContentType\n ... on Video {\n id\n sources {\n format\n height\n mimeType\n url\n width\n }\n }\n ... on MediaImage {\n id\n image {\n altText\n url\n }\n }\n }\n }\n }\n seo {\n ...seo\n }\n tags\n createdAt\n updatedAt\n publishedAt\n requiresSellingPlan\n sellingPlanGroups(first: 250) {\n edges {\n node {\n name\n sellingPlans(first: 250) {\n edges {\n node {\n id\n name\n priceAdjustments {\n adjustmentValue {\n ... on SellingPlanFixedAmountPriceAdjustment {\n __typename\n adjustmentAmount {\n amount\n currencyCode\n }\n }\n ... on SellingPlanFixedPriceAdjustment {\n __typename\n price {\n amount\n currencyCode\n }\n }\n ... on SellingPlanPercentagePriceAdjustment {\n __typename\n adjustmentPercentage\n }\n }\n }\n options {\n name\n value\n }\n }\n }\n }\n }\n }\n }\n }\n`\n","import { imageFragment } from './image'\nimport { metafieldFragment } from './metafield'\nimport { productFragment } from './product'\nimport { seoFragment } from './seo'\n\nexport const cartFragment = /* GraphQL */ `\n fragment cart on Cart {\n id\n totalQuantity\n updatedAt\n createdAt\n checkoutUrl\n note\n attributes {\n key\n value\n }\n cost {\n checkoutChargeAmount {\n amount\n currencyCode\n }\n subtotalAmount {\n amount\n currencyCode\n }\n totalAmount {\n amount\n currencyCode\n }\n totalTaxAmount {\n amount\n currencyCode\n }\n totalDutyAmount {\n amount\n currencyCode\n }\n totalAmountEstimated\n totalTaxAmountEstimated\n totalDutyAmountEstimated\n subtotalAmountEstimated\n }\n buyerIdentity {\n email\n phone\n countryCode\n customer {\n email\n id\n }\n deliveryAddressPreferences {\n ... on MailingAddress {\n address1\n address2\n city\n province\n country\n zip\n firstName\n lastName\n }\n }\n }\n discountCodes {\n applicable\n code\n }\n discountAllocations {\n ... on CartCodeDiscountAllocation {\n code\n discountedAmount {\n amount\n currencyCode\n }\n }\n ... on CartAutomaticDiscountAllocation {\n title\n discountedAmount {\n amount\n currencyCode\n }\n }\n ... on CartCustomDiscountAllocation {\n title\n discountedAmount {\n amount\n currencyCode\n }\n }\n }\n deliveryGroups(first: 10) {\n nodes {\n ... on CartDeliveryGroup {\n id\n deliveryOptions {\n ... on CartDeliveryOption {\n code\n description\n deliveryMethodType\n handle\n title\n estimatedCost {\n amount\n currencyCode\n }\n }\n }\n deliveryAddress {\n ... on MailingAddress {\n address1\n address2\n city\n country\n zip\n }\n }\n selectedDeliveryOption {\n ... on CartDeliveryOption {\n code\n description\n deliveryMethodType\n handle\n title\n estimatedCost {\n amount\n currencyCode\n }\n }\n }\n }\n }\n }\n lines(first: 100) {\n edges {\n node {\n id\n quantity\n discountAllocations {\n ... on CartCodeDiscountAllocation {\n code\n discountedAmount {\n amount\n currencyCode\n }\n }\n ... on CartAutomaticDiscountAllocation {\n title\n discountedAmount {\n amount\n currencyCode\n }\n }\n ... on CartCustomDiscountAllocation {\n title\n discountedAmount {\n amount\n currencyCode\n }\n }\n }\n attributes {\n key\n value\n }\n cost {\n amountPerQuantity {\n amount\n currencyCode\n }\n compareAtAmountPerQuantity {\n amount\n currencyCode\n }\n subtotalAmount {\n amount\n currencyCode\n }\n totalAmount {\n amount\n currencyCode\n }\n }\n merchandise {\n ... on ProductVariant {\n id\n sku\n title\n quantityAvailable\n currentlyNotInStock\n availableForSale\n barcode\n weight\n selectedOptions {\n name\n value\n }\n image {\n ...image\n }\n price {\n amount\n currencyCode\n }\n compareAtPrice {\n amount\n currencyCode\n }\n metafields(identifiers: $variantMetafieldIdentifiers) {\n ...metafield\n }\n product {\n ...product\n }\n }\n }\n }\n }\n }\n totalQuantity\n }\n ${productFragment}\n ${imageFragment}\n ${seoFragment}\n ${metafieldFragment}\n`\n","/**\n * Collection GraphQL Fragment\n */\n\nimport { imageFragment } from './image'\nimport { seoFragment } from './seo'\n\nexport const collectionFragment = /* GraphQL */ `\n fragment collection on Collection {\n id\n handle\n title\n description\n descriptionHtml\n image {\n ...image\n }\n seo {\n ...seo\n }\n updatedAt\n }\n`\n","export const pageInfoFragment = /* GraphQL */ `\n fragment pageInfo on PageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n`\n","/**\n * Blog GraphQL Fragments\n */\n\nexport const articleFragment = /* GraphQL */ `\n fragment article on Article {\n id\n handle\n title\n content\n contentHtml\n excerpt\n excerptHtml\n publishedAt\n image {\n ...image\n }\n seo {\n ...seo\n }\n tags\n author {\n name\n }\n }\n`\n\nexport const articleWithMetafieldsFragment = /* GraphQL */ `\n fragment articleWithMetafields on Article {\n id\n handle\n title\n content\n contentHtml\n excerpt\n excerptHtml\n publishedAt\n image {\n ...image\n }\n seo {\n ...seo\n }\n tags\n author {\n name\n }\n metafields(identifiers: $articleMetafieldIdentifiers) {\n ...metafield\n }\n }\n`\n\nexport const blogFragment = /* GraphQL */ `\n fragment blog on Blog {\n id\n handle\n title\n seo {\n ...seo\n }\n }\n`\n\nexport const blogWithMetafieldsFragment = /* GraphQL */ `\n fragment blogWithMetafields on Blog {\n id\n handle\n title\n seo {\n ...seo\n }\n metafields(identifiers: $blogMetafieldIdentifiers) {\n ...metafield\n }\n }\n`\n","/**\n * Page GraphQL Fragments\n */\n\nimport { seoFragment } from './seo'\nimport { metafieldFragment } from './metafield'\n\nexport const pageFragment = /* GraphQL */ `\n fragment page on Page {\n id\n handle\n title\n body\n bodySummary\n createdAt\n updatedAt\n seo {\n ...seo\n }\n }\n ${seoFragment}\n`\n\nexport const pageWithMetafieldsFragment = /* GraphQL */ `\n fragment pageWithMetafields on Page {\n id\n handle\n title\n body\n bodySummary\n createdAt\n updatedAt\n seo {\n ...seo\n }\n metafields(identifiers: $pageMetafieldIdentifiers) {\n ...metafield\n }\n }\n ${seoFragment}\n ${metafieldFragment}\n`\n","/**\n * Shop GraphQL Fragments\n */\n\nimport { metafieldFragment } from './metafield'\n\nexport const shopFragment = /* GraphQL */ `\n fragment shop on Shop {\n name\n description\n moneyFormat\n primaryDomain {\n host\n url\n }\n paymentSettings {\n currencyCode\n enabledPresentmentCurrencies\n }\n brand {\n logo {\n image {\n url\n }\n }\n colors {\n primary {\n background\n }\n secondary {\n background\n }\n }\n }\n }\n`\n\nexport const shopWithMetafieldsFragment = /* GraphQL */ `\n fragment shopWithMetafields on Shop {\n name\n description\n moneyFormat\n primaryDomain {\n host\n url\n }\n paymentSettings {\n currencyCode\n enabledPresentmentCurrencies\n }\n brand {\n logo {\n image {\n url\n }\n }\n colors {\n primary {\n background\n }\n secondary {\n background\n }\n }\n }\n metafields(identifiers: $shopMetafieldIdentifiers) {\n ...metafield\n }\n }\n ${metafieldFragment}\n`\n"]}
@@ -516,8 +516,6 @@ var articleFragment = (
516
516
  name
517
517
  }
518
518
  }
519
- ${imageFragment}
520
- ${seoFragment}
521
519
  `
522
520
  );
523
521
  var articleWithMetafieldsFragment = (
@@ -546,9 +544,6 @@ var articleWithMetafieldsFragment = (
546
544
  ...metafield
547
545
  }
548
546
  }
549
- ${imageFragment}
550
- ${seoFragment}
551
- ${metafieldFragment}
552
547
  `
553
548
  );
554
549
  var blogFragment = (
@@ -562,7 +557,6 @@ var blogFragment = (
562
557
  ...seo
563
558
  }
564
559
  }
565
- ${seoFragment}
566
560
  `
567
561
  );
568
562
  var blogWithMetafieldsFragment = (
@@ -579,8 +573,6 @@ var blogWithMetafieldsFragment = (
579
573
  ...metafield
580
574
  }
581
575
  }
582
- ${seoFragment}
583
- ${metafieldFragment}
584
576
  `
585
577
  );
586
578
 
@@ -633,9 +625,14 @@ var shopFragment = (
633
625
  fragment shop on Shop {
634
626
  name
635
627
  description
628
+ moneyFormat
636
629
  primaryDomain {
637
- url
638
630
  host
631
+ url
632
+ }
633
+ paymentSettings {
634
+ currencyCode
635
+ enabledPresentmentCurrencies
639
636
  }
640
637
  brand {
641
638
  logo {
@@ -661,9 +658,14 @@ var shopWithMetafieldsFragment = (
661
658
  fragment shopWithMetafields on Shop {
662
659
  name
663
660
  description
661
+ moneyFormat
664
662
  primaryDomain {
665
- url
666
663
  host
664
+ url
665
+ }
666
+ paymentSettings {
667
+ currencyCode
668
+ enabledPresentmentCurrencies
667
669
  }
668
670
  brand {
669
671
  logo {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/fragments/image.ts","../../src/fragments/seo.ts","../../src/fragments/metafield.ts","../../src/fragments/variant.ts","../../src/fragments/product.ts","../../src/fragments/cart.ts","../../src/fragments/collection.ts","../../src/fragments/page-info.ts","../../src/fragments/blog.ts","../../src/fragments/page.ts","../../src/fragments/shop.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export const imageFragment = /* GraphQL */ `\n fragment image on Image {\n url\n altText\n width\n height\n }\n`\n","export const seoFragment = /* GraphQL */ `\n fragment seo on SEO {\n description\n title\n }\n`\n","export const metafieldFragment = /* GraphQL */ `\n fragment metafield on Metafield {\n value\n type\n description\n namespace\n key\n }\n`\n\nexport const metafieldFragmentStr = `\n value\n type\n description\n namespace\n key\n`\n","export const variantFragment = /* GraphQL */ `\n fragment variant on ProductVariant {\n id\n sku\n title\n requiresShipping\n quantityAvailable\n currentlyNotInStock\n availableForSale\n barcode\n weight\n selectedOptions {\n name\n value\n }\n image {\n ...image\n }\n price {\n amount\n currencyCode\n }\n compareAtPrice {\n amount\n currencyCode\n }\n metafields(identifiers: $variantMetafieldIdentifiers) {\n ...metafield\n }\n sellingPlanAllocations(first: 10) {\n edges {\n node {\n sellingPlan {\n id\n name\n options {\n name\n value\n }\n }\n priceAdjustments {\n compareAtPrice {\n amount\n currencyCode\n }\n perDeliveryPrice {\n amount\n currencyCode\n }\n price {\n amount\n currencyCode\n }\n }\n }\n }\n }\n }\n`\n","/**\n * Product GraphQL Fragment\n */\nexport const productFragment = /* GraphQL */ `\n fragment product on Product {\n id\n handle\n availableForSale\n title\n description\n descriptionHtml\n options {\n id\n name\n values\n }\n productType\n vendor\n priceRange {\n maxVariantPrice {\n amount\n currencyCode\n }\n minVariantPrice {\n amount\n currencyCode\n }\n }\n compareAtPriceRange {\n minVariantPrice {\n amount\n currencyCode\n }\n }\n featuredImage {\n ...image\n }\n images(first: 250) {\n edges {\n node {\n ...image\n }\n }\n }\n metafields(identifiers: $productMetafieldIdentifiers) {\n ...metafield\n }\n media(first: 250) {\n edges {\n node {\n id\n mediaContentType\n ... on Video {\n id\n sources {\n format\n height\n mimeType\n url\n width\n }\n }\n ... on MediaImage {\n id\n image {\n altText\n url\n }\n }\n }\n }\n }\n seo {\n ...seo\n }\n tags\n createdAt\n updatedAt\n publishedAt\n requiresSellingPlan\n sellingPlanGroups(first: 250) {\n edges {\n node {\n name\n sellingPlans(first: 250) {\n edges {\n node {\n id\n name\n priceAdjustments {\n adjustmentValue {\n ... on SellingPlanFixedAmountPriceAdjustment {\n __typename\n adjustmentAmount {\n amount\n currencyCode\n }\n }\n ... on SellingPlanFixedPriceAdjustment {\n __typename\n price {\n amount\n currencyCode\n }\n }\n ... on SellingPlanPercentagePriceAdjustment {\n __typename\n adjustmentPercentage\n }\n }\n }\n options {\n name\n value\n }\n }\n }\n }\n }\n }\n }\n }\n`\n","import { imageFragment } from './image'\nimport { metafieldFragment } from './metafield'\nimport { productFragment } from './product'\nimport { seoFragment } from './seo'\n\nexport const cartFragment = /* GraphQL */ `\n fragment cart on Cart {\n id\n totalQuantity\n updatedAt\n createdAt\n checkoutUrl\n note\n attributes {\n key\n value\n }\n cost {\n checkoutChargeAmount {\n amount\n currencyCode\n }\n subtotalAmount {\n amount\n currencyCode\n }\n totalAmount {\n amount\n currencyCode\n }\n totalTaxAmount {\n amount\n currencyCode\n }\n totalDutyAmount {\n amount\n currencyCode\n }\n totalAmountEstimated\n totalTaxAmountEstimated\n totalDutyAmountEstimated\n subtotalAmountEstimated\n }\n buyerIdentity {\n email\n phone\n countryCode\n customer {\n email\n id\n }\n deliveryAddressPreferences {\n ... on MailingAddress {\n address1\n address2\n city\n province\n country\n zip\n firstName\n lastName\n }\n }\n }\n discountCodes {\n applicable\n code\n }\n discountAllocations {\n ... on CartCodeDiscountAllocation {\n code\n discountedAmount {\n amount\n currencyCode\n }\n }\n ... on CartAutomaticDiscountAllocation {\n title\n discountedAmount {\n amount\n currencyCode\n }\n }\n ... on CartCustomDiscountAllocation {\n title\n discountedAmount {\n amount\n currencyCode\n }\n }\n }\n deliveryGroups(first: 10) {\n nodes {\n ... on CartDeliveryGroup {\n id\n deliveryOptions {\n ... on CartDeliveryOption {\n code\n description\n deliveryMethodType\n handle\n title\n estimatedCost {\n amount\n currencyCode\n }\n }\n }\n deliveryAddress {\n ... on MailingAddress {\n address1\n address2\n city\n country\n zip\n }\n }\n selectedDeliveryOption {\n ... on CartDeliveryOption {\n code\n description\n deliveryMethodType\n handle\n title\n estimatedCost {\n amount\n currencyCode\n }\n }\n }\n }\n }\n }\n lines(first: 100) {\n edges {\n node {\n id\n quantity\n discountAllocations {\n ... on CartCodeDiscountAllocation {\n code\n discountedAmount {\n amount\n currencyCode\n }\n }\n ... on CartAutomaticDiscountAllocation {\n title\n discountedAmount {\n amount\n currencyCode\n }\n }\n ... on CartCustomDiscountAllocation {\n title\n discountedAmount {\n amount\n currencyCode\n }\n }\n }\n attributes {\n key\n value\n }\n cost {\n amountPerQuantity {\n amount\n currencyCode\n }\n compareAtAmountPerQuantity {\n amount\n currencyCode\n }\n subtotalAmount {\n amount\n currencyCode\n }\n totalAmount {\n amount\n currencyCode\n }\n }\n merchandise {\n ... on ProductVariant {\n id\n sku\n title\n quantityAvailable\n currentlyNotInStock\n availableForSale\n barcode\n weight\n selectedOptions {\n name\n value\n }\n image {\n ...image\n }\n price {\n amount\n currencyCode\n }\n compareAtPrice {\n amount\n currencyCode\n }\n metafields(identifiers: $variantMetafieldIdentifiers) {\n ...metafield\n }\n product {\n ...product\n }\n }\n }\n }\n }\n }\n totalQuantity\n }\n ${productFragment}\n ${imageFragment}\n ${seoFragment}\n ${metafieldFragment}\n`\n","/**\n * Collection GraphQL Fragment\n */\n\nimport { imageFragment } from './image'\nimport { seoFragment } from './seo'\n\nexport const collectionFragment = /* GraphQL */ `\n fragment collection on Collection {\n id\n handle\n title\n description\n descriptionHtml\n image {\n ...image\n }\n seo {\n ...seo\n }\n updatedAt\n }\n`\n","export const pageInfoFragment = /* GraphQL */ `\n fragment pageInfo on PageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n`\n","/**\n * Blog GraphQL Fragments\n */\n\nimport { imageFragment } from './image'\nimport { seoFragment } from './seo'\nimport { metafieldFragment } from './metafield'\n\nexport const articleFragment = /* GraphQL */ `\n fragment article on Article {\n id\n handle\n title\n content\n contentHtml\n excerpt\n excerptHtml\n publishedAt\n image {\n ...image\n }\n seo {\n ...seo\n }\n tags\n author {\n name\n }\n }\n ${imageFragment}\n ${seoFragment}\n`\n\nexport const articleWithMetafieldsFragment = /* GraphQL */ `\n fragment articleWithMetafields on Article {\n id\n handle\n title\n content\n contentHtml\n excerpt\n excerptHtml\n publishedAt\n image {\n ...image\n }\n seo {\n ...seo\n }\n tags\n author {\n name\n }\n metafields(identifiers: $articleMetafieldIdentifiers) {\n ...metafield\n }\n }\n ${imageFragment}\n ${seoFragment}\n ${metafieldFragment}\n`\n\nexport const blogFragment = /* GraphQL */ `\n fragment blog on Blog {\n id\n handle\n title\n seo {\n ...seo\n }\n }\n ${seoFragment}\n`\n\nexport const blogWithMetafieldsFragment = /* GraphQL */ `\n fragment blogWithMetafields on Blog {\n id\n handle\n title\n seo {\n ...seo\n }\n metafields(identifiers: $blogMetafieldIdentifiers) {\n ...metafield\n }\n }\n ${seoFragment}\n ${metafieldFragment}\n`\n","/**\n * Page GraphQL Fragments\n */\n\nimport { seoFragment } from './seo'\nimport { metafieldFragment } from './metafield'\n\nexport const pageFragment = /* GraphQL */ `\n fragment page on Page {\n id\n handle\n title\n body\n bodySummary\n createdAt\n updatedAt\n seo {\n ...seo\n }\n }\n ${seoFragment}\n`\n\nexport const pageWithMetafieldsFragment = /* GraphQL */ `\n fragment pageWithMetafields on Page {\n id\n handle\n title\n body\n bodySummary\n createdAt\n updatedAt\n seo {\n ...seo\n }\n metafields(identifiers: $pageMetafieldIdentifiers) {\n ...metafield\n }\n }\n ${seoFragment}\n ${metafieldFragment}\n`\n","/**\n * Shop GraphQL Fragments\n */\n\nimport { metafieldFragment } from './metafield'\n\nexport const shopFragment = /* GraphQL */ `\n fragment shop on Shop {\n name\n description\n primaryDomain {\n url\n host\n }\n brand {\n logo {\n image {\n url\n }\n }\n colors {\n primary {\n background\n }\n secondary {\n background\n }\n }\n }\n }\n`\n\nexport const shopWithMetafieldsFragment = /* GraphQL */ `\n fragment shopWithMetafields on Shop {\n name\n description\n primaryDomain {\n url\n host\n }\n brand {\n logo {\n image {\n url\n }\n }\n colors {\n primary {\n background\n }\n secondary {\n background\n }\n }\n }\n metafields(identifiers: $shopMetafieldIdentifiers) {\n ...metafield\n }\n }\n ${metafieldFragment}\n`\n"]}
1
+ {"version":3,"sources":["../../src/fragments/image.ts","../../src/fragments/seo.ts","../../src/fragments/metafield.ts","../../src/fragments/variant.ts","../../src/fragments/product.ts","../../src/fragments/cart.ts","../../src/fragments/collection.ts","../../src/fragments/page-info.ts","../../src/fragments/blog.ts","../../src/fragments/page.ts","../../src/fragments/shop.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export const imageFragment = /* GraphQL */ `\n fragment image on Image {\n url\n altText\n width\n height\n }\n`\n","export const seoFragment = /* GraphQL */ `\n fragment seo on SEO {\n description\n title\n }\n`\n","export const metafieldFragment = /* GraphQL */ `\n fragment metafield on Metafield {\n value\n type\n description\n namespace\n key\n }\n`\n\nexport const metafieldFragmentStr = `\n value\n type\n description\n namespace\n key\n`\n","export const variantFragment = /* GraphQL */ `\n fragment variant on ProductVariant {\n id\n sku\n title\n requiresShipping\n quantityAvailable\n currentlyNotInStock\n availableForSale\n barcode\n weight\n selectedOptions {\n name\n value\n }\n image {\n ...image\n }\n price {\n amount\n currencyCode\n }\n compareAtPrice {\n amount\n currencyCode\n }\n metafields(identifiers: $variantMetafieldIdentifiers) {\n ...metafield\n }\n sellingPlanAllocations(first: 10) {\n edges {\n node {\n sellingPlan {\n id\n name\n options {\n name\n value\n }\n }\n priceAdjustments {\n compareAtPrice {\n amount\n currencyCode\n }\n perDeliveryPrice {\n amount\n currencyCode\n }\n price {\n amount\n currencyCode\n }\n }\n }\n }\n }\n }\n`\n","/**\n * Product GraphQL Fragment\n */\nexport const productFragment = /* GraphQL */ `\n fragment product on Product {\n id\n handle\n availableForSale\n title\n description\n descriptionHtml\n options {\n id\n name\n values\n }\n productType\n vendor\n priceRange {\n maxVariantPrice {\n amount\n currencyCode\n }\n minVariantPrice {\n amount\n currencyCode\n }\n }\n compareAtPriceRange {\n minVariantPrice {\n amount\n currencyCode\n }\n }\n featuredImage {\n ...image\n }\n images(first: 250) {\n edges {\n node {\n ...image\n }\n }\n }\n metafields(identifiers: $productMetafieldIdentifiers) {\n ...metafield\n }\n media(first: 250) {\n edges {\n node {\n id\n mediaContentType\n ... on Video {\n id\n sources {\n format\n height\n mimeType\n url\n width\n }\n }\n ... on MediaImage {\n id\n image {\n altText\n url\n }\n }\n }\n }\n }\n seo {\n ...seo\n }\n tags\n createdAt\n updatedAt\n publishedAt\n requiresSellingPlan\n sellingPlanGroups(first: 250) {\n edges {\n node {\n name\n sellingPlans(first: 250) {\n edges {\n node {\n id\n name\n priceAdjustments {\n adjustmentValue {\n ... on SellingPlanFixedAmountPriceAdjustment {\n __typename\n adjustmentAmount {\n amount\n currencyCode\n }\n }\n ... on SellingPlanFixedPriceAdjustment {\n __typename\n price {\n amount\n currencyCode\n }\n }\n ... on SellingPlanPercentagePriceAdjustment {\n __typename\n adjustmentPercentage\n }\n }\n }\n options {\n name\n value\n }\n }\n }\n }\n }\n }\n }\n }\n`\n","import { imageFragment } from './image'\nimport { metafieldFragment } from './metafield'\nimport { productFragment } from './product'\nimport { seoFragment } from './seo'\n\nexport const cartFragment = /* GraphQL */ `\n fragment cart on Cart {\n id\n totalQuantity\n updatedAt\n createdAt\n checkoutUrl\n note\n attributes {\n key\n value\n }\n cost {\n checkoutChargeAmount {\n amount\n currencyCode\n }\n subtotalAmount {\n amount\n currencyCode\n }\n totalAmount {\n amount\n currencyCode\n }\n totalTaxAmount {\n amount\n currencyCode\n }\n totalDutyAmount {\n amount\n currencyCode\n }\n totalAmountEstimated\n totalTaxAmountEstimated\n totalDutyAmountEstimated\n subtotalAmountEstimated\n }\n buyerIdentity {\n email\n phone\n countryCode\n customer {\n email\n id\n }\n deliveryAddressPreferences {\n ... on MailingAddress {\n address1\n address2\n city\n province\n country\n zip\n firstName\n lastName\n }\n }\n }\n discountCodes {\n applicable\n code\n }\n discountAllocations {\n ... on CartCodeDiscountAllocation {\n code\n discountedAmount {\n amount\n currencyCode\n }\n }\n ... on CartAutomaticDiscountAllocation {\n title\n discountedAmount {\n amount\n currencyCode\n }\n }\n ... on CartCustomDiscountAllocation {\n title\n discountedAmount {\n amount\n currencyCode\n }\n }\n }\n deliveryGroups(first: 10) {\n nodes {\n ... on CartDeliveryGroup {\n id\n deliveryOptions {\n ... on CartDeliveryOption {\n code\n description\n deliveryMethodType\n handle\n title\n estimatedCost {\n amount\n currencyCode\n }\n }\n }\n deliveryAddress {\n ... on MailingAddress {\n address1\n address2\n city\n country\n zip\n }\n }\n selectedDeliveryOption {\n ... on CartDeliveryOption {\n code\n description\n deliveryMethodType\n handle\n title\n estimatedCost {\n amount\n currencyCode\n }\n }\n }\n }\n }\n }\n lines(first: 100) {\n edges {\n node {\n id\n quantity\n discountAllocations {\n ... on CartCodeDiscountAllocation {\n code\n discountedAmount {\n amount\n currencyCode\n }\n }\n ... on CartAutomaticDiscountAllocation {\n title\n discountedAmount {\n amount\n currencyCode\n }\n }\n ... on CartCustomDiscountAllocation {\n title\n discountedAmount {\n amount\n currencyCode\n }\n }\n }\n attributes {\n key\n value\n }\n cost {\n amountPerQuantity {\n amount\n currencyCode\n }\n compareAtAmountPerQuantity {\n amount\n currencyCode\n }\n subtotalAmount {\n amount\n currencyCode\n }\n totalAmount {\n amount\n currencyCode\n }\n }\n merchandise {\n ... on ProductVariant {\n id\n sku\n title\n quantityAvailable\n currentlyNotInStock\n availableForSale\n barcode\n weight\n selectedOptions {\n name\n value\n }\n image {\n ...image\n }\n price {\n amount\n currencyCode\n }\n compareAtPrice {\n amount\n currencyCode\n }\n metafields(identifiers: $variantMetafieldIdentifiers) {\n ...metafield\n }\n product {\n ...product\n }\n }\n }\n }\n }\n }\n totalQuantity\n }\n ${productFragment}\n ${imageFragment}\n ${seoFragment}\n ${metafieldFragment}\n`\n","/**\n * Collection GraphQL Fragment\n */\n\nimport { imageFragment } from './image'\nimport { seoFragment } from './seo'\n\nexport const collectionFragment = /* GraphQL */ `\n fragment collection on Collection {\n id\n handle\n title\n description\n descriptionHtml\n image {\n ...image\n }\n seo {\n ...seo\n }\n updatedAt\n }\n`\n","export const pageInfoFragment = /* GraphQL */ `\n fragment pageInfo on PageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n`\n","/**\n * Blog GraphQL Fragments\n */\n\nexport const articleFragment = /* GraphQL */ `\n fragment article on Article {\n id\n handle\n title\n content\n contentHtml\n excerpt\n excerptHtml\n publishedAt\n image {\n ...image\n }\n seo {\n ...seo\n }\n tags\n author {\n name\n }\n }\n`\n\nexport const articleWithMetafieldsFragment = /* GraphQL */ `\n fragment articleWithMetafields on Article {\n id\n handle\n title\n content\n contentHtml\n excerpt\n excerptHtml\n publishedAt\n image {\n ...image\n }\n seo {\n ...seo\n }\n tags\n author {\n name\n }\n metafields(identifiers: $articleMetafieldIdentifiers) {\n ...metafield\n }\n }\n`\n\nexport const blogFragment = /* GraphQL */ `\n fragment blog on Blog {\n id\n handle\n title\n seo {\n ...seo\n }\n }\n`\n\nexport const blogWithMetafieldsFragment = /* GraphQL */ `\n fragment blogWithMetafields on Blog {\n id\n handle\n title\n seo {\n ...seo\n }\n metafields(identifiers: $blogMetafieldIdentifiers) {\n ...metafield\n }\n }\n`\n","/**\n * Page GraphQL Fragments\n */\n\nimport { seoFragment } from './seo'\nimport { metafieldFragment } from './metafield'\n\nexport const pageFragment = /* GraphQL */ `\n fragment page on Page {\n id\n handle\n title\n body\n bodySummary\n createdAt\n updatedAt\n seo {\n ...seo\n }\n }\n ${seoFragment}\n`\n\nexport const pageWithMetafieldsFragment = /* GraphQL */ `\n fragment pageWithMetafields on Page {\n id\n handle\n title\n body\n bodySummary\n createdAt\n updatedAt\n seo {\n ...seo\n }\n metafields(identifiers: $pageMetafieldIdentifiers) {\n ...metafield\n }\n }\n ${seoFragment}\n ${metafieldFragment}\n`\n","/**\n * Shop GraphQL Fragments\n */\n\nimport { metafieldFragment } from './metafield'\n\nexport const shopFragment = /* GraphQL */ `\n fragment shop on Shop {\n name\n description\n moneyFormat\n primaryDomain {\n host\n url\n }\n paymentSettings {\n currencyCode\n enabledPresentmentCurrencies\n }\n brand {\n logo {\n image {\n url\n }\n }\n colors {\n primary {\n background\n }\n secondary {\n background\n }\n }\n }\n }\n`\n\nexport const shopWithMetafieldsFragment = /* GraphQL */ `\n fragment shopWithMetafields on Shop {\n name\n description\n moneyFormat\n primaryDomain {\n host\n url\n }\n paymentSettings {\n currencyCode\n enabledPresentmentCurrencies\n }\n brand {\n logo {\n image {\n url\n }\n }\n colors {\n primary {\n background\n }\n secondary {\n background\n }\n }\n }\n metafields(identifiers: $shopMetafieldIdentifiers) {\n ...metafield\n }\n }\n ${metafieldFragment}\n`\n"]}
package/dist/index.d.mts CHANGED
@@ -11223,6 +11223,8 @@ interface NormalizedShop {
11223
11223
  host: string;
11224
11224
  };
11225
11225
  brand?: Brand;
11226
+ moneyFormat?: string;
11227
+ paymentSettings?: PaymentSettings;
11226
11228
  metafields?: Record<string, any>;
11227
11229
  }
11228
11230
  interface GetShopOptions {
package/dist/index.d.ts CHANGED
@@ -11223,6 +11223,8 @@ interface NormalizedShop {
11223
11223
  host: string;
11224
11224
  };
11225
11225
  brand?: Brand;
11226
+ moneyFormat?: string;
11227
+ paymentSettings?: PaymentSettings;
11226
11228
  metafields?: Record<string, any>;
11227
11229
  }
11228
11230
  interface GetShopOptions {