@anker-in/lib 0.0.0-beta.1 → 0.0.0-beta.3

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.
Files changed (247) hide show
  1. package/.gitkeep +0 -0
  2. package/.turbo/turbo-build.log +22 -0
  3. package/.turbo/turbo-test.log +5 -0
  4. package/dist/cjs/context/HeadlessProvider.js +1 -1
  5. package/dist/cjs/context/HeadlessProvider.js.map +2 -2
  6. package/dist/context/HeadlessProvider.d.ts.map +1 -1
  7. package/dist/esm/cart/const.js +2 -0
  8. package/dist/esm/cart/const.js.map +7 -0
  9. package/dist/esm/cart/hooks/basic/useBuyNow.js +2 -0
  10. package/dist/esm/cart/hooks/basic/useBuyNow.js.map +7 -0
  11. package/dist/esm/cart/index.js +2 -0
  12. package/dist/esm/cart/index.js.map +7 -0
  13. package/dist/esm/cart/track/fbq.js +2 -0
  14. package/dist/esm/cart/track/fbq.js.map +7 -0
  15. package/dist/esm/cart/types/index.js +1 -0
  16. package/dist/esm/cart/types/index.js.map +7 -0
  17. package/dist/esm/cart/utils/index.js +2 -0
  18. package/dist/esm/cart/utils/index.js.map +7 -0
  19. package/dist/esm/context/HeadlessProvider.js +2 -0
  20. package/dist/esm/context/HeadlessProvider.js.map +7 -0
  21. package/dist/esm/context/config.js +1 -0
  22. package/dist/esm/context/config.js.map +7 -0
  23. package/dist/esm/context/index.js +2 -0
  24. package/dist/esm/context/index.js.map +7 -0
  25. package/dist/esm/index.js +2 -0
  26. package/dist/esm/index.js.map +7 -0
  27. package/dist/esm/package.json +3 -0
  28. package/dist/esm/shopify/fetchers/add-cart-lines.js +2 -0
  29. package/dist/esm/shopify/fetchers/add-cart-lines.js.map +7 -0
  30. package/dist/esm/shopify/fetchers/create-cart.js +2 -0
  31. package/dist/esm/shopify/fetchers/create-cart.js.map +7 -0
  32. package/dist/esm/shopify/fetchers/get-cart.js +2 -0
  33. package/dist/esm/shopify/fetchers/get-cart.js.map +7 -0
  34. package/dist/esm/shopify/fetchers/get-products-by-handles.js +2 -0
  35. package/dist/esm/shopify/fetchers/get-products-by-handles.js.map +7 -0
  36. package/dist/esm/shopify/fetchers/index.js +2 -0
  37. package/dist/esm/shopify/fetchers/index.js.map +7 -0
  38. package/dist/esm/shopify/fetchers/remove-cart-lines.js +2 -0
  39. package/dist/esm/shopify/fetchers/remove-cart-lines.js.map +7 -0
  40. package/dist/esm/shopify/fetchers/update-cart-attributes.js +2 -0
  41. package/dist/esm/shopify/fetchers/update-cart-attributes.js.map +7 -0
  42. package/dist/esm/shopify/fetchers/update-cart-buyer-identity.js +2 -0
  43. package/dist/esm/shopify/fetchers/update-cart-buyer-identity.js.map +7 -0
  44. package/dist/esm/shopify/fetchers/update-cart-codes.js +2 -0
  45. package/dist/esm/shopify/fetchers/update-cart-codes.js.map +7 -0
  46. package/dist/esm/shopify/fetchers/update-cart-lines.js +2 -0
  47. package/dist/esm/shopify/fetchers/update-cart-lines.js.map +7 -0
  48. package/dist/esm/shopify/fragments/article.js +50 -0
  49. package/dist/esm/shopify/fragments/article.js.map +7 -0
  50. package/dist/esm/shopify/fragments/blog.js +11 -0
  51. package/dist/esm/shopify/fragments/blog.js.map +7 -0
  52. package/dist/esm/shopify/fragments/cart.js +189 -0
  53. package/dist/esm/shopify/fragments/cart.js.map +7 -0
  54. package/dist/esm/shopify/fragments/collection.js +16 -0
  55. package/dist/esm/shopify/fragments/collection.js.map +7 -0
  56. package/dist/esm/shopify/fragments/image.js +9 -0
  57. package/dist/esm/shopify/fragments/image.js.map +7 -0
  58. package/dist/esm/shopify/fragments/index.js +2 -0
  59. package/dist/esm/shopify/fragments/index.js.map +7 -0
  60. package/dist/esm/shopify/fragments/metafields.js +16 -0
  61. package/dist/esm/shopify/fragments/metafields.js.map +7 -0
  62. package/dist/esm/shopify/fragments/page-info.js +9 -0
  63. package/dist/esm/shopify/fragments/page-info.js.map +7 -0
  64. package/dist/esm/shopify/fragments/page.js +13 -0
  65. package/dist/esm/shopify/fragments/page.js.map +7 -0
  66. package/dist/esm/shopify/fragments/product.js +72 -0
  67. package/dist/esm/shopify/fragments/product.js.map +7 -0
  68. package/dist/esm/shopify/fragments/seo.js +7 -0
  69. package/dist/esm/shopify/fragments/seo.js.map +7 -0
  70. package/dist/esm/shopify/fragments/variant.js +30 -0
  71. package/dist/esm/shopify/fragments/variant.js.map +7 -0
  72. package/dist/esm/shopify/gql/fragment-masking.js +2 -0
  73. package/dist/esm/shopify/gql/fragment-masking.js.map +7 -0
  74. package/dist/esm/shopify/gql/gql.js +2 -0
  75. package/dist/esm/shopify/gql/gql.js.map +7 -0
  76. package/dist/esm/shopify/gql/graphql.js +2 -0
  77. package/dist/esm/shopify/gql/graphql.js.map +7 -0
  78. package/dist/esm/shopify/gql/index.js +2 -0
  79. package/dist/esm/shopify/gql/index.js.map +7 -0
  80. package/dist/esm/shopify/hooks/index.js +2 -0
  81. package/dist/esm/shopify/hooks/index.js.map +7 -0
  82. package/dist/esm/shopify/hooks/useProductsByHandles.js +2 -0
  83. package/dist/esm/shopify/hooks/useProductsByHandles.js.map +7 -0
  84. package/dist/esm/shopify/index.js +2 -0
  85. package/dist/esm/shopify/index.js.map +7 -0
  86. package/dist/esm/shopify/mutations/add-cart-lines.js +15 -0
  87. package/dist/esm/shopify/mutations/add-cart-lines.js.map +7 -0
  88. package/dist/esm/shopify/mutations/create-cart.js +21 -0
  89. package/dist/esm/shopify/mutations/create-cart.js.map +7 -0
  90. package/dist/esm/shopify/mutations/remove-cart-items.js +15 -0
  91. package/dist/esm/shopify/mutations/remove-cart-items.js.map +7 -0
  92. package/dist/esm/shopify/mutations/update-cart-attributes.js +15 -0
  93. package/dist/esm/shopify/mutations/update-cart-attributes.js.map +7 -0
  94. package/dist/esm/shopify/mutations/update-cart-buyer-identity.js +15 -0
  95. package/dist/esm/shopify/mutations/update-cart-buyer-identity.js.map +7 -0
  96. package/dist/esm/shopify/mutations/update-cart-discount-code.js +15 -0
  97. package/dist/esm/shopify/mutations/update-cart-discount-code.js.map +7 -0
  98. package/dist/esm/shopify/mutations/update-cart-items.js +15 -0
  99. package/dist/esm/shopify/mutations/update-cart-items.js.map +7 -0
  100. package/dist/esm/shopify/queries/get-cart.js +13 -0
  101. package/dist/esm/shopify/queries/get-cart.js.map +7 -0
  102. package/dist/esm/shopify/queries/get-product-by-handles.js +29 -0
  103. package/dist/esm/shopify/queries/get-product-by-handles.js.map +7 -0
  104. package/dist/esm/shopify/queries/index.js +2 -0
  105. package/dist/esm/shopify/queries/index.js.map +7 -0
  106. package/dist/esm/shopify/types/article.js +1 -0
  107. package/dist/esm/shopify/types/article.js.map +7 -0
  108. package/dist/esm/shopify/types/cart.js +1 -0
  109. package/dist/esm/shopify/types/cart.js.map +7 -0
  110. package/dist/esm/shopify/types/checkout.js +1 -0
  111. package/dist/esm/shopify/types/checkout.js.map +7 -0
  112. package/dist/esm/shopify/types/collection.js +1 -0
  113. package/dist/esm/shopify/types/collection.js.map +7 -0
  114. package/dist/esm/shopify/types/common.js +1 -0
  115. package/dist/esm/shopify/types/common.js.map +7 -0
  116. package/dist/esm/shopify/types/config.js +1 -0
  117. package/dist/esm/shopify/types/config.js.map +7 -0
  118. package/dist/esm/shopify/types/customer.js +1 -0
  119. package/dist/esm/shopify/types/customer.js.map +7 -0
  120. package/dist/esm/shopify/types/fetcher.js +2 -0
  121. package/dist/esm/shopify/types/fetcher.js.map +7 -0
  122. package/dist/esm/shopify/types/index.js +2 -0
  123. package/dist/esm/shopify/types/index.js.map +7 -0
  124. package/dist/esm/shopify/types/page.js +1 -0
  125. package/dist/esm/shopify/types/page.js.map +7 -0
  126. package/dist/esm/shopify/types/product.js +1 -0
  127. package/dist/esm/shopify/types/product.js.map +7 -0
  128. package/dist/esm/shopify/types/search.js +1 -0
  129. package/dist/esm/shopify/types/search.js.map +7 -0
  130. package/dist/esm/shopify/types/site.js +1 -0
  131. package/dist/esm/shopify/types/site.js.map +7 -0
  132. package/dist/esm/shopify/types/type-helper.js +1 -0
  133. package/dist/esm/shopify/types/type-helper.js.map +7 -0
  134. package/dist/esm/shopify/utils/colors.js +2 -0
  135. package/dist/esm/shopify/utils/colors.js.map +7 -0
  136. package/dist/esm/shopify/utils/const.js +2 -0
  137. package/dist/esm/shopify/utils/const.js.map +7 -0
  138. package/dist/esm/shopify/utils/cookie.js +2 -0
  139. package/dist/esm/shopify/utils/cookie.js.map +7 -0
  140. package/dist/esm/shopify/utils/errors.js +3 -0
  141. package/dist/esm/shopify/utils/errors.js.map +7 -0
  142. package/dist/esm/shopify/utils/fetch-graphql-api.js +3 -0
  143. package/dist/esm/shopify/utils/fetch-graphql-api.js.map +7 -0
  144. package/dist/esm/shopify/utils/handle-fetch-response.js +2 -0
  145. package/dist/esm/shopify/utils/handle-fetch-response.js.map +7 -0
  146. package/dist/esm/shopify/utils/helper.js +2 -0
  147. package/dist/esm/shopify/utils/helper.js.map +7 -0
  148. package/dist/esm/shopify/utils/normalize/cart.js +2 -0
  149. package/dist/esm/shopify/utils/normalize/cart.js.map +7 -0
  150. package/dist/esm/shopify/utils/normalize/customer.js +2 -0
  151. package/dist/esm/shopify/utils/normalize/customer.js.map +7 -0
  152. package/dist/esm/shopify/utils/normalize/index.js +2 -0
  153. package/dist/esm/shopify/utils/normalize/index.js.map +7 -0
  154. package/dist/esm/shopify/utils/normalize/metafield.js +2 -0
  155. package/dist/esm/shopify/utils/normalize/metafield.js.map +7 -0
  156. package/dist/esm/shopify/utils/normalize/product.js +2 -0
  157. package/dist/esm/shopify/utils/normalize/product.js.map +7 -0
  158. package/dist/esm/shopify/utils/store.js +2 -0
  159. package/dist/esm/shopify/utils/store.js.map +7 -0
  160. package/dist/esm/shopify/utils/type-helper.js +1 -0
  161. package/dist/esm/shopify/utils/type-helper.js.map +7 -0
  162. package/esbuild-cjs.mjs +23 -0
  163. package/esbuild-esm.mjs +30 -0
  164. package/jest.config.ts +12 -0
  165. package/package.json +10 -15
  166. package/src/cart/const.ts +23 -0
  167. package/src/cart/hooks/basic/useBuyNow.ts +105 -0
  168. package/src/cart/index.ts +19 -0
  169. package/src/cart/track/fbq.ts +63 -0
  170. package/src/cart/types/index.ts +25 -0
  171. package/src/cart/utils/index.ts +22 -0
  172. package/src/context/HeadlessProvider.tsx +30 -0
  173. package/src/context/config.ts +10 -0
  174. package/src/context/index.ts +3 -0
  175. package/src/index.ts +22 -0
  176. package/src/shopify/fetchers/add-cart-lines.ts +53 -0
  177. package/src/shopify/fetchers/create-cart.ts +43 -0
  178. package/src/shopify/fetchers/get-cart.ts +48 -0
  179. package/src/shopify/fetchers/get-products-by-handles.ts +48 -0
  180. package/src/shopify/fetchers/index.ts +10 -0
  181. package/src/shopify/fetchers/remove-cart-lines.ts +31 -0
  182. package/src/shopify/fetchers/update-cart-attributes.ts +29 -0
  183. package/src/shopify/fetchers/update-cart-buyer-identity.ts +32 -0
  184. package/src/shopify/fetchers/update-cart-codes.ts +32 -0
  185. package/src/shopify/fetchers/update-cart-lines.ts +42 -0
  186. package/src/shopify/fragments/article.ts +51 -0
  187. package/src/shopify/fragments/blog.ts +10 -0
  188. package/src/shopify/fragments/cart.ts +193 -0
  189. package/src/shopify/fragments/collection.ts +15 -0
  190. package/src/shopify/fragments/image.ts +8 -0
  191. package/src/shopify/fragments/index.ts +11 -0
  192. package/src/shopify/fragments/metafields.ts +17 -0
  193. package/src/shopify/fragments/page-info.ts +8 -0
  194. package/src/shopify/fragments/page.ts +12 -0
  195. package/src/shopify/fragments/product.ts +71 -0
  196. package/src/shopify/fragments/seo.ts +6 -0
  197. package/src/shopify/fragments/variant.ts +29 -0
  198. package/src/shopify/gql/fragment-masking.ts +85 -0
  199. package/src/shopify/gql/gql.ts +110 -0
  200. package/src/shopify/gql/graphql.ts +11780 -0
  201. package/src/shopify/gql/index.ts +4 -0
  202. package/src/shopify/hooks/index.ts +1 -0
  203. package/src/shopify/hooks/useProductsByHandles.ts +24 -0
  204. package/src/shopify/index.ts +5 -0
  205. package/src/shopify/mutations/add-cart-lines.ts +16 -0
  206. package/src/shopify/mutations/create-cart.ts +22 -0
  207. package/src/shopify/mutations/remove-cart-items.ts +16 -0
  208. package/src/shopify/mutations/update-cart-attributes.ts +16 -0
  209. package/src/shopify/mutations/update-cart-buyer-identity.ts +16 -0
  210. package/src/shopify/mutations/update-cart-discount-code.ts +16 -0
  211. package/src/shopify/mutations/update-cart-items.ts +16 -0
  212. package/src/shopify/queries/get-cart.ts +14 -0
  213. package/src/shopify/queries/get-product-by-handles.ts +32 -0
  214. package/src/shopify/queries/index.ts +2 -0
  215. package/src/shopify/types/article.ts +46 -0
  216. package/src/shopify/types/cart.ts +204 -0
  217. package/src/shopify/types/checkout.ts +44 -0
  218. package/src/shopify/types/collection.ts +104 -0
  219. package/src/shopify/types/common.ts +53 -0
  220. package/src/shopify/types/config.ts +14 -0
  221. package/src/shopify/types/customer.ts +31 -0
  222. package/src/shopify/types/fetcher.ts +67 -0
  223. package/src/shopify/types/index.ts +11 -0
  224. package/src/shopify/types/page.ts +45 -0
  225. package/src/shopify/types/product.ts +176 -0
  226. package/src/shopify/types/search.ts +62 -0
  227. package/src/shopify/types/site.ts +38 -0
  228. package/src/shopify/types/type-helper.ts +5 -0
  229. package/src/shopify/utils/colors.ts +206 -0
  230. package/src/shopify/utils/const.ts +115 -0
  231. package/src/shopify/utils/cookie.ts +28 -0
  232. package/src/shopify/utils/errors.ts +65 -0
  233. package/src/shopify/utils/fetch-graphql-api.ts +67 -0
  234. package/src/shopify/utils/handle-fetch-response.ts +60 -0
  235. package/src/shopify/utils/helper.ts +89 -0
  236. package/src/shopify/utils/normalize/cart.ts +106 -0
  237. package/src/shopify/utils/normalize/customer.ts +18 -0
  238. package/src/shopify/utils/normalize/index.ts +2 -0
  239. package/src/shopify/utils/normalize/metafield.ts +69 -0
  240. package/src/shopify/utils/normalize/product.ts +193 -0
  241. package/src/shopify/utils/store.ts +5 -0
  242. package/src/shopify/utils/type-helper.ts +7 -0
  243. package/tsconfig.json +20 -0
  244. package/tsup.config.ts +17 -0
  245. package/dist/index.esm.js +0 -1669
  246. package/dist/index.js +0 -1679
  247. package/dist/index.mjs +0 -1669
@@ -0,0 +1,30 @@
1
+ import { createContext, useContext, useMemo, ReactNode } from 'react'
2
+
3
+ import { HeadlessConfig } from './config'
4
+
5
+ const HeadlessContext = createContext<HeadlessConfig | null>(null)
6
+
7
+ interface HeadlessProviderProps {
8
+ children: ReactNode
9
+ headlessConfig: HeadlessConfig
10
+ }
11
+
12
+ export const HeadlessProvider = ({ children, headlessConfig }: HeadlessProviderProps): JSX.Element => {
13
+ const contextValue = useMemo((): HeadlessConfig => {
14
+ if (!headlessConfig) {
15
+ throw new Error(`No site configuration or headless configuration found`)
16
+ }
17
+
18
+ return headlessConfig
19
+ }, [headlessConfig])
20
+
21
+ return <HeadlessContext.Provider value={contextValue}>{children}</HeadlessContext.Provider>
22
+ }
23
+
24
+ export const useHeadlessContext = (): HeadlessConfig => {
25
+ const context = useContext(HeadlessContext)
26
+ if (!context) {
27
+ throw new Error('useHeadlessContext must be used within a HeadlessProvider')
28
+ }
29
+ return context || ({} as HeadlessConfig)
30
+ }
@@ -0,0 +1,10 @@
1
+ export type HeadlessConfig = {
2
+ storefrontToken: string
3
+ storeDomain: string
4
+ locale: string
5
+ comboMetafieldsNamespace: string
6
+ cartIdCookieName: string
7
+ brand: string
8
+ appName: string
9
+ passportUrl: string
10
+ }
@@ -0,0 +1,3 @@
1
+ export * from './HeadlessProvider'
2
+ export * from './config'
3
+
package/src/index.ts ADDED
@@ -0,0 +1,22 @@
1
+ // ========================================
2
+ // Context (from shared)
3
+ // ========================================
4
+ export * from './context'
5
+
6
+ // ========================================
7
+ // Shopify Integration
8
+ // ========================================
9
+ export * from './shopify/fetchers'
10
+ export * from './shopify/hooks'
11
+ export * from './shopify/queries'
12
+ export * from './shopify/fragments'
13
+ export * from './shopify/types'
14
+
15
+ // ========================================
16
+ // Cart Utilities
17
+ // ========================================
18
+ export * from './cart/hooks/basic/useBuyNow'
19
+ export * from './cart/types'
20
+ export * from './cart/utils'
21
+ export * from './cart/const'
22
+ export * from './cart/track/fbq'
@@ -0,0 +1,53 @@
1
+ import { CartLinesAddPayload, MutationCartLinesAddArgs } from '../gql'
2
+ import { addCartLinesMutation } from '../mutations/add-cart-lines'
3
+ import type { Cart } from '../types/cart'
4
+ import { ShopifyFetcher } from '../types/fetcher'
5
+ import { fetchGraphqlApi } from '../utils/fetch-graphql-api'
6
+ import { normalizeCart } from '../utils/normalize'
7
+ import { ShopifyConfig } from '../types/config'
8
+ import { Optional } from '../types/type-helper'
9
+ /**
10
+ * Adds cart lines to the Shopify cart.
11
+ *
12
+ * @param options - The options for adding cart lines.
13
+ * @param config - The store configuration.
14
+ * @returns The updated cart or undefined if the cart could not be updated.
15
+ */
16
+ export const addCartLines: ShopifyFetcher<Cart | undefined, MutationCartLinesAddArgs> = async function ({
17
+ options,
18
+ config,
19
+ }: {
20
+ options: MutationCartLinesAddArgs
21
+ config: ShopifyConfig
22
+ }) {
23
+ const { data } = await fetchGraphqlApi<
24
+ { cartLinesAdd: CartLinesAddPayload },
25
+ Optional<MutationCartLinesAddArgs, 'cartId'>
26
+ >({
27
+ query: addCartLinesMutation,
28
+ variables: {
29
+ cartId: options.cartId,
30
+ lines: options.lines,
31
+ },
32
+ config,
33
+ })
34
+
35
+ if (data?.cartLinesAdd?.userErrors?.length) {
36
+ const errors = data.cartLinesAdd.userErrors
37
+ const quantityError = errors.find(error => error.field?.includes('quantity'))
38
+ if (quantityError) {
39
+ // The quantity of the line item is invalid.
40
+ return Promise.reject(quantityError)
41
+ } else {
42
+ throw new Error(JSON.stringify(data?.cartLinesAdd?.userErrors))
43
+ }
44
+ }
45
+
46
+ const cart = data?.cartLinesAdd?.cart
47
+
48
+ if (cart) {
49
+ return normalizeCart(cart, '')
50
+ } else {
51
+ return undefined
52
+ }
53
+ }
@@ -0,0 +1,43 @@
1
+ import { CartCreatePayload, CartInput } from '../gql'
2
+ import { createCartMutation } from '../mutations/create-cart'
3
+ import type { Cart } from '../types/cart'
4
+ import { ShopifyFetcher } from '../types/fetcher'
5
+ import { fetchGraphqlApi } from '../utils/fetch-graphql-api'
6
+ import { normalizeCart } from '../utils/normalize'
7
+ import { GetCartMetafieldQueryRoot } from './get-cart'
8
+ import { constructMetafieldIdentifiersQueryParams } from '../utils/helper'
9
+
10
+ /**
11
+ * Creates a cart using the Shopify API.
12
+ *
13
+ * @param options - The options for the cart.
14
+ * @param config - The store configuration.
15
+ * @returns The created cart or undefined if the cart creation fails.
16
+ */
17
+ export const createCart: ShopifyFetcher<Cart | undefined, CartInput, GetCartMetafieldQueryRoot> = async function ({
18
+ options,
19
+ config,
20
+ }) {
21
+ const { comboMetafieldsNamespace, metafieldIdentifiers, ...rest } = options
22
+ if (!rest.lines?.length) {
23
+ throw new Error('Invalid input used for this operation: Miss lines')
24
+ }
25
+ const { data } = await fetchGraphqlApi<{ cartCreate: CartCreatePayload }, CartInput>({
26
+ query: createCartMutation,
27
+ variables: {
28
+ ...rest,
29
+ ...(metafieldIdentifiers && {
30
+ ...constructMetafieldIdentifiersQueryParams(metafieldIdentifiers, comboMetafieldsNamespace),
31
+ }),
32
+ },
33
+ config,
34
+ })
35
+
36
+ const cart = data?.cartCreate?.cart
37
+
38
+ if (cart) {
39
+ return normalizeCart(cart, comboMetafieldsNamespace)
40
+ } else {
41
+ return undefined
42
+ }
43
+ }
@@ -0,0 +1,48 @@
1
+ import { Cart, GetCartQueryVariables } from '../gql'
2
+ import type { Cart as ExportCart } from '../types/cart'
3
+ import {
4
+ HasMetafieldQueryRoot,
5
+ metafieldIdentifiersGroup,
6
+ ShopifyFetcher,
7
+ ShopifyFetcherVariables,
8
+ } from '../types/fetcher'
9
+ import { fetchGraphqlApi } from '../utils/fetch-graphql-api'
10
+ import { normalizeCart } from '../utils/normalize'
11
+ import { getCartQuery } from '../queries/get-cart'
12
+ import { constructMetafieldIdentifiersQueryParams } from '../utils/helper'
13
+
14
+ export type GetCartMetafieldQueryRoot = HasMetafieldQueryRoot.Product | HasMetafieldQueryRoot.Variant
15
+
16
+ export type GetCartReq = {
17
+ cartId: string
18
+ } & metafieldIdentifiersGroup<GetCartMetafieldQueryRoot>
19
+
20
+ /**
21
+ * Fetches the cart from Shopify.
22
+ *
23
+ * @param options - The options for fetching the cart.
24
+ * @param config - The store configuration.
25
+ * @returns The fetched cart or undefined if not found.
26
+ */
27
+ export const getCart: ShopifyFetcher<ExportCart | undefined, GetCartQueryVariables, GetCartMetafieldQueryRoot> =
28
+ async function ({ options, config }) {
29
+ const { comboMetafieldsNamespace: metafieldsNamespace, metafieldIdentifiers, cartId } = options
30
+
31
+ if (!cartId) {
32
+ throw new Error('Invalid input used for this operation: Miss cartId')
33
+ }
34
+
35
+ const { data } = await fetchGraphqlApi<
36
+ { cart: Cart },
37
+ ShopifyFetcherVariables<GetCartQueryVariables, GetCartMetafieldQueryRoot>
38
+ >({
39
+ query: getCartQuery,
40
+ variables: {
41
+ cartId,
42
+ ...constructMetafieldIdentifiersQueryParams(metafieldIdentifiers, metafieldsNamespace),
43
+ },
44
+ config,
45
+ })
46
+
47
+ return normalizeCart(data.cart, metafieldsNamespace)
48
+ }
@@ -0,0 +1,48 @@
1
+ import { getProductsByHandlesQuery } from '../queries/get-product-by-handles'
2
+ import { fetchGraphqlApi } from '../utils/fetch-graphql-api'
3
+ import { constructMetafieldIdentifiersQueryParams } from '../utils/helper'
4
+ import { normalizeProduct } from '../utils/normalize/product'
5
+ import { Product as ShopifyProduct } from '../gql'
6
+ import { HasMetafieldQueryRoot, ShopifyFetcher, ShopifyFetcherVariables } from '../types/fetcher'
7
+ import { Product } from '../types/product'
8
+
9
+ export type GetProductsMetafieldQueryRoot = HasMetafieldQueryRoot.Product | HasMetafieldQueryRoot.Variant
10
+
11
+ export type GetProductsByHandlesReq = {
12
+ handles: string[]
13
+ }
14
+
15
+ /**
16
+ * Gets products by their handles.
17
+ *
18
+ * @param options - The options for getting products.
19
+ * @param config - The store configuration.
20
+ * @returns An array of products.
21
+ */
22
+ export const getProductsByHandles: ShopifyFetcher<
23
+ Product[],
24
+ GetProductsByHandlesReq,
25
+ GetProductsMetafieldQueryRoot
26
+ > = async ({ options, config }) => {
27
+ const { handles, metafieldIdentifiers, comboMetafieldsNamespace } = options
28
+
29
+ if (!handles?.length) {
30
+ throw new Error('Handles are required')
31
+ }
32
+
33
+ const products = await fetchGraphqlApi<
34
+ Record<string, ShopifyProduct>,
35
+ ShopifyFetcherVariables<GetProductsByHandlesReq, GetProductsMetafieldQueryRoot>
36
+ >({
37
+ query: getProductsByHandlesQuery(handles),
38
+ variables: {
39
+ handles,
40
+ ...constructMetafieldIdentifiersQueryParams(metafieldIdentifiers, comboMetafieldsNamespace),
41
+ },
42
+ config,
43
+ })
44
+
45
+ return Object.values(products.data)
46
+ .filter(item => !!item)
47
+ .map(product => normalizeProduct(product, '')) as Product[]
48
+ }
@@ -0,0 +1,10 @@
1
+ export { getProductsByHandles } from './get-products-by-handles'
2
+ export { addCartLines } from './add-cart-lines'
3
+ export { createCart } from './create-cart'
4
+ export { removeCartLines } from './remove-cart-lines'
5
+ export { updateCartAttributes } from './update-cart-attributes'
6
+ export { updateCartLines } from './update-cart-lines'
7
+ export { getCart } from './get-cart'
8
+
9
+ export type { GetProductsByHandlesReq, GetProductsMetafieldQueryRoot } from './get-products-by-handles'
10
+ export type { GetCartReq, GetCartMetafieldQueryRoot } from './get-cart'
@@ -0,0 +1,31 @@
1
+ import { Cart, MutationCartLinesRemoveArgs } from '../gql'
2
+ import { removeCartItemsMutation } from '../mutations/remove-cart-items'
3
+ import type { Cart as ExportCart } from '../types/cart'
4
+ import { ShopifyFetcher } from '../types/fetcher'
5
+ import { fetchGraphqlApi } from '../utils/fetch-graphql-api'
6
+ import { normalizeCart } from '../utils/normalize'
7
+
8
+ /**
9
+ * Removes cart lines from the Shopify API.
10
+ *
11
+ * @param options - The options for removing cart lines.
12
+ * @param config - The store configuration.
13
+ * @returns The normalized cart after removing the cart lines, or undefined if the operation fails.
14
+ */
15
+ export const removeCartLines: ShopifyFetcher<ExportCart | undefined, MutationCartLinesRemoveArgs> = async function ({
16
+ options,
17
+ config,
18
+ }) {
19
+ const { data } = await fetchGraphqlApi<{ cartLinesRemove: { cart: Cart } }, MutationCartLinesRemoveArgs>({
20
+ query: removeCartItemsMutation,
21
+ variables: options,
22
+ config,
23
+ })
24
+
25
+ if (data?.cartLinesRemove?.cart) {
26
+ const normalizedCart = normalizeCart(data.cartLinesRemove.cart, '')
27
+ return normalizedCart
28
+ } else {
29
+ return undefined
30
+ }
31
+ }
@@ -0,0 +1,29 @@
1
+ import { Cart, MutationCartAttributesUpdateArgs } from '../gql'
2
+ import type { Cart as ExportCart } from '../types/cart'
3
+ import { ShopifyFetcher } from '../types/fetcher'
4
+ import { fetchGraphqlApi } from '../utils/fetch-graphql-api'
5
+ import { normalizeCart } from '../utils/normalize'
6
+ import { updateCartAttributesMutation } from '../mutations/update-cart-attributes'
7
+
8
+ /**
9
+ * Updates the attributes of a cart.
10
+ *
11
+ * @param options - The options for updating the cart attributes.
12
+ * @param config - The store configuration.
13
+ * @returns The updated cart or undefined if the update was unsuccessful.
14
+ */
15
+ export const updateCartAttributes: ShopifyFetcher<ExportCart | undefined, MutationCartAttributesUpdateArgs> =
16
+ async function ({ options, config }) {
17
+ const { data } = await fetchGraphqlApi<{ cartAttributesUpdate: { cart: Cart } }, MutationCartAttributesUpdateArgs>({
18
+ query: updateCartAttributesMutation,
19
+ variables: options,
20
+ config,
21
+ })
22
+
23
+ if (data?.cartAttributesUpdate?.cart) {
24
+ const normalizedCart = normalizeCart(data.cartAttributesUpdate.cart, '')
25
+ return normalizedCart
26
+ } else {
27
+ return undefined
28
+ }
29
+ }
@@ -0,0 +1,32 @@
1
+ import { Cart, MutationCartBuyerIdentityUpdateArgs } from '../gql'
2
+ import type { Cart as ExportCart } from '../types/cart'
3
+ import { ShopifyFetcher } from '../types/fetcher'
4
+ import { fetchGraphqlApi } from '../utils/fetch-graphql-api'
5
+ import { normalizeCart } from '../utils/normalize'
6
+ import { updateCartBuyerIdentityMutation } from '../mutations/update-cart-buyer-identity'
7
+
8
+ /**
9
+ * Updates the buyer identity of a cart.
10
+ *
11
+ * @param options - The options for updating the cart buyer identity.
12
+ * @param config - The store configuration.
13
+ * @returns The updated cart or undefined if the update was unsuccessful.
14
+ */
15
+ export const updateCartBuyerIdentity: ShopifyFetcher<ExportCart | undefined, MutationCartBuyerIdentityUpdateArgs> =
16
+ async function ({ options, config }) {
17
+ const { data } = await fetchGraphqlApi<
18
+ { cartBuyerIdentityUpdate: { cart: Cart } },
19
+ MutationCartBuyerIdentityUpdateArgs
20
+ >({
21
+ query: updateCartBuyerIdentityMutation,
22
+ variables: options,
23
+ config,
24
+ })
25
+
26
+ if (data?.cartBuyerIdentityUpdate?.cart) {
27
+ const normalizedCart = normalizeCart(data.cartBuyerIdentityUpdate.cart, '')
28
+ return normalizedCart
29
+ } else {
30
+ return undefined
31
+ }
32
+ }
@@ -0,0 +1,32 @@
1
+ import { Cart, MutationCartDiscountCodesUpdateArgs } from '../gql'
2
+ import type { Cart as ExportCart } from '../types/cart'
3
+ import { ShopifyFetcher } from '../types/fetcher'
4
+ import { fetchGraphqlApi } from '../utils/fetch-graphql-api'
5
+ import { normalizeCart } from '../utils/normalize'
6
+ import { updateCartDiscountCodeMutation } from '../mutations/update-cart-discount-code'
7
+
8
+ /**
9
+ * Updates the discount codes for a cart in the Shopify API.
10
+ *
11
+ * @param options - The options for updating the cart discount codes.
12
+ * @param config - The store configuration.
13
+ * @returns The updated cart or undefined if the update was unsuccessful.
14
+ */
15
+ export const updateCartCodes: ShopifyFetcher<ExportCart | undefined, MutationCartDiscountCodesUpdateArgs> =
16
+ async function ({ options, config }) {
17
+ const { data } = await fetchGraphqlApi<
18
+ {
19
+ cartDiscountCodesUpdate: { cart: Cart }
20
+ },
21
+ MutationCartDiscountCodesUpdateArgs
22
+ >({
23
+ query: updateCartDiscountCodeMutation,
24
+ variables: options,
25
+ config,
26
+ })
27
+ if (data.cartDiscountCodesUpdate.cart) {
28
+ return normalizeCart(data.cartDiscountCodesUpdate.cart, '')
29
+ } else {
30
+ return undefined
31
+ }
32
+ }
@@ -0,0 +1,42 @@
1
+ import { Cart, MutationCartLinesUpdateArgs } from '../gql'
2
+ import type { Cart as ExportCart } from '../types/cart'
3
+ import { ShopifyFetcher } from '../types/fetcher'
4
+ import { fetchGraphqlApi } from '../utils/fetch-graphql-api'
5
+ import { normalizeCart } from '../utils/normalize'
6
+ import { updateCartLinesMutation } from '../mutations/update-cart-items'
7
+
8
+ /**
9
+ * Updates the cart lines in the Shopify API.
10
+ *
11
+ * @param options - The options for updating the cart lines.
12
+ * @param config - The store configuration.
13
+ * @returns The updated cart or undefined if the update was unsuccessful.
14
+ */
15
+ export const updateCartLines: ShopifyFetcher<ExportCart | undefined, MutationCartLinesUpdateArgs> = async function ({
16
+ options,
17
+ config,
18
+ }) {
19
+ const { data } = await fetchGraphqlApi<
20
+ { cartLinesUpdate: { cart: Cart; userErrors?: any } },
21
+ MutationCartLinesUpdateArgs
22
+ >({
23
+ query: updateCartLinesMutation,
24
+ variables: options,
25
+ config,
26
+ })
27
+
28
+ if (data?.cartLinesUpdate?.userErrors?.length) {
29
+ const errors = data.cartLinesUpdate?.userErrors
30
+ const quantityError = errors.find((error: any) => error.field?.includes('quantity'))
31
+ if (quantityError) {
32
+ return Promise.reject(quantityError)
33
+ }
34
+ }
35
+
36
+ if (data?.cartLinesUpdate?.cart) {
37
+ const normalizedCart = normalizeCart(data.cartLinesUpdate.cart, '')
38
+ return normalizedCart
39
+ } else {
40
+ return undefined
41
+ }
42
+ }
@@ -0,0 +1,51 @@
1
+ export const articleFragment = /* GraphQL */ `
2
+ fragment article on Article {
3
+ id
4
+ handle
5
+ title
6
+ seo {
7
+ ...seo
8
+ }
9
+ image {
10
+ ...image
11
+ }
12
+ tags
13
+ publishedAt
14
+ content
15
+ contentHtml
16
+ excerpt
17
+ excerptHtml
18
+ authorV2 {
19
+ bio
20
+ email
21
+ firstName
22
+ lastName
23
+ name
24
+ }
25
+ }
26
+ `
27
+
28
+ export const articleWithoutContentFragment = /* GraphQL */ `
29
+ fragment article on Article {
30
+ id
31
+ handle
32
+ title
33
+ seo {
34
+ ...seo
35
+ }
36
+ image {
37
+ ...image
38
+ }
39
+ tags
40
+ publishedAt
41
+ excerpt
42
+ excerptHtml
43
+ authorV2 {
44
+ bio
45
+ email
46
+ firstName
47
+ lastName
48
+ name
49
+ }
50
+ }
51
+ `
@@ -0,0 +1,10 @@
1
+ export const blogFragment = /* GraphQL */ `
2
+ fragment blog on Blog {
3
+ id
4
+ handle
5
+ title
6
+ seo {
7
+ ...seo
8
+ }
9
+ }
10
+ `