@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.
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs.map +1 -1
- package/dist/fragments/index.d.mts +6 -6
- package/dist/fragments/index.d.ts +6 -6
- package/dist/fragments/index.js +12 -10
- package/dist/fragments/index.js.map +1 -1
- package/dist/fragments/index.mjs +12 -10
- package/dist/fragments/index.mjs.map +1 -1
- package/dist/index.d.mts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +37 -17
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +37 -17
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/client/index.js.map
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
42
|
-
declare const shopWithMetafieldsFragment = "\n fragment shopWithMetafields on Shop {\n name\n description\n primaryDomain {\n url\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
|
|
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
|
|
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
|
|
42
|
-
declare const shopWithMetafieldsFragment = "\n fragment shopWithMetafields on Shop {\n name\n description\n primaryDomain {\n url\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 };
|
package/dist/fragments/index.js
CHANGED
|
@@ -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":";;;AAAO,IAAM,aAAA;AAAA;AAAA,EAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACApC,IAAM,WAAA;AAAA;AAAA,EAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAlC,IAAM,iBAAA;AAAA;AAAA,EAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUxC,IAAM,oBAAA,GAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACV7B,IAAM,eAAA;AAAA;AAAA,EAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGtC,IAAM,eAAA;AAAA;AAAA,EAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEtC,IAAM,YAAA;AAAA;AAAA,EAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,EAwNtC,eAAe;AAAA,EAAA,EACf,aAAa;AAAA,EAAA,EACb,WAAW;AAAA,EAAA,EACX,iBAAiB;AAAA;AAAA;;;ACzNd,IAAM,kBAAA;AAAA;AAAA,EAAmC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACPzC,IAAM,gBAAA;AAAA;AAAA,EAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACQvC,IAAM,eAAA;AAAA;AAAA,EAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,EAqBzC,aAAa;AAAA,EAAA,EACb,WAAW;AAAA;AAAA;AAGR,IAAM,6BAAA;AAAA;AAAA,EAA8C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,EAwBvD,aAAa;AAAA,EAAA,EACb,WAAW;AAAA,EAAA,EACX,iBAAiB;AAAA;AAAA;AAGd,IAAM,YAAA;AAAA;AAAA,EAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,EAStC,WAAW;AAAA;AAAA;AAGR,IAAM,0BAAA;AAAA;AAAA,EAA2C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,EAYpD,WAAW;AAAA,EAAA,EACX,iBAAiB;AAAA;AAAA;;;AChFd,IAAM,YAAA;AAAA;AAAA,EAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,EAatC,WAAW;AAAA;AAAA;AAGR,IAAM,0BAAA;AAAA;AAAA,EAA2C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,EAgBpD,WAAW;AAAA,EAAA,EACX,iBAAiB;AAAA;AAAA;;;AClCd,IAAM,YAAA;AAAA;AAAA,EAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BnC,IAAM,0BAAA;AAAA;AAAA,EAA2C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,EA2BpD,iBAAiB;AAAA;AAAA","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"]}
|
package/dist/fragments/index.mjs
CHANGED
|
@@ -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":";AAAO,IAAM,aAAA;AAAA;AAAA,EAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACApC,IAAM,WAAA;AAAA;AAAA,EAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAlC,IAAM,iBAAA;AAAA;AAAA,EAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUxC,IAAM,oBAAA,GAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACV7B,IAAM,eAAA;AAAA;AAAA,EAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGtC,IAAM,eAAA;AAAA;AAAA,EAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEtC,IAAM,YAAA;AAAA;AAAA,EAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,EAwNtC,eAAe;AAAA,EAAA,EACf,aAAa;AAAA,EAAA,EACb,WAAW;AAAA,EAAA,EACX,iBAAiB;AAAA;AAAA;;;ACzNd,IAAM,kBAAA;AAAA;AAAA,EAAmC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACPzC,IAAM,gBAAA;AAAA;AAAA,EAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACQvC,IAAM,eAAA;AAAA;AAAA,EAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,EAqBzC,aAAa;AAAA,EAAA,EACb,WAAW;AAAA;AAAA;AAGR,IAAM,6BAAA;AAAA;AAAA,EAA8C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,EAwBvD,aAAa;AAAA,EAAA,EACb,WAAW;AAAA,EAAA,EACX,iBAAiB;AAAA;AAAA;AAGd,IAAM,YAAA;AAAA;AAAA,EAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,EAStC,WAAW;AAAA;AAAA;AAGR,IAAM,0BAAA;AAAA;AAAA,EAA2C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,EAYpD,WAAW;AAAA,EAAA,EACX,iBAAiB;AAAA;AAAA;;;AChFd,IAAM,YAAA;AAAA;AAAA,EAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,EAatC,WAAW;AAAA;AAAA;AAGR,IAAM,0BAAA;AAAA;AAAA,EAA2C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,EAgBpD,WAAW;AAAA,EAAA,EACX,iBAAiB;AAAA;AAAA;;;AClCd,IAAM,YAAA;AAAA;AAAA,EAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BnC,IAAM,0BAAA;AAAA;AAAA,EAA2C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,EA2BpD,iBAAiB;AAAA;AAAA","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 {
|