@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
package/dist/index.esm.js DELETED
@@ -1,1669 +0,0 @@
1
- var __create = Object.create;
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __getProtoOf = Object.getPrototypeOf;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __commonJS = (cb, mod) => function __require() {
8
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
19
- // If the importer is in node compatibility mode or this is not an ESM
20
- // file that has been converted to a CommonJS file using a Babel-
21
- // compatible transform (i.e. "__esModule" has not been set), then set
22
- // "default" to the CommonJS "module.exports" for node compatibility.
23
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
24
- mod
25
- ));
26
-
27
- // ../../node_modules/.pnpm/lodash.random@3.2.0/node_modules/lodash.random/index.js
28
- var require_lodash = __commonJS({
29
- "../../node_modules/.pnpm/lodash.random@3.2.0/node_modules/lodash.random/index.js"(exports, module) {
30
- var INFINITY = 1 / 0;
31
- var MAX_SAFE_INTEGER = 9007199254740991;
32
- var MAX_INTEGER = 17976931348623157e292;
33
- var NAN = 0 / 0;
34
- var funcTag = "[object Function]";
35
- var genTag = "[object GeneratorFunction]";
36
- var symbolTag = "[object Symbol]";
37
- var reTrim = /^\s+|\s+$/g;
38
- var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
39
- var reIsBinary = /^0b[01]+$/i;
40
- var reIsOctal = /^0o[0-7]+$/i;
41
- var reIsUint = /^(?:0|[1-9]\d*)$/;
42
- var freeParseFloat = parseFloat;
43
- var freeParseInt = parseInt;
44
- var objectProto = Object.prototype;
45
- var objectToString = objectProto.toString;
46
- var nativeFloor = Math.floor;
47
- var nativeMin = Math.min;
48
- var nativeRandom = Math.random;
49
- function baseRandom(lower, upper) {
50
- return lower + nativeFloor(nativeRandom() * (upper - lower + 1));
51
- }
52
- function isIndex(value, length) {
53
- length = length == null ? MAX_SAFE_INTEGER : length;
54
- return !!length && (typeof value == "number" || reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length);
55
- }
56
- function isIterateeCall(value, index, object) {
57
- if (!isObject(object)) {
58
- return false;
59
- }
60
- var type = typeof index;
61
- if (type == "number" ? isArrayLike(object) && isIndex(index, object.length) : type == "string" && index in object) {
62
- return eq(object[index], value);
63
- }
64
- return false;
65
- }
66
- function eq(value, other) {
67
- return value === other || value !== value && other !== other;
68
- }
69
- function isArrayLike(value) {
70
- return value != null && isLength(value.length) && !isFunction(value);
71
- }
72
- function isFunction(value) {
73
- var tag = isObject(value) ? objectToString.call(value) : "";
74
- return tag == funcTag || tag == genTag;
75
- }
76
- function isLength(value) {
77
- return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
78
- }
79
- function isObject(value) {
80
- var type = typeof value;
81
- return !!value && (type == "object" || type == "function");
82
- }
83
- function isObjectLike(value) {
84
- return !!value && typeof value == "object";
85
- }
86
- function isSymbol(value) {
87
- return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag;
88
- }
89
- function toFinite(value) {
90
- if (!value) {
91
- return value === 0 ? value : 0;
92
- }
93
- value = toNumber(value);
94
- if (value === INFINITY || value === -INFINITY) {
95
- var sign = value < 0 ? -1 : 1;
96
- return sign * MAX_INTEGER;
97
- }
98
- return value === value ? value : 0;
99
- }
100
- function toNumber(value) {
101
- if (typeof value == "number") {
102
- return value;
103
- }
104
- if (isSymbol(value)) {
105
- return NAN;
106
- }
107
- if (isObject(value)) {
108
- var other = typeof value.valueOf == "function" ? value.valueOf() : value;
109
- value = isObject(other) ? other + "" : other;
110
- }
111
- if (typeof value != "string") {
112
- return value === 0 ? value : +value;
113
- }
114
- value = value.replace(reTrim, "");
115
- var isBinary = reIsBinary.test(value);
116
- return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
117
- }
118
- function random2(lower, upper, floating) {
119
- if (floating && typeof floating != "boolean" && isIterateeCall(lower, upper, floating)) {
120
- upper = floating = void 0;
121
- }
122
- if (floating === void 0) {
123
- if (typeof upper == "boolean") {
124
- floating = upper;
125
- upper = void 0;
126
- } else if (typeof lower == "boolean") {
127
- floating = lower;
128
- lower = void 0;
129
- }
130
- }
131
- if (lower === void 0 && upper === void 0) {
132
- lower = 0;
133
- upper = 1;
134
- } else {
135
- lower = toFinite(lower);
136
- if (upper === void 0) {
137
- upper = lower;
138
- lower = 0;
139
- } else {
140
- upper = toFinite(upper);
141
- }
142
- }
143
- if (lower > upper) {
144
- var temp = lower;
145
- lower = upper;
146
- upper = temp;
147
- }
148
- if (floating || lower % 1 || upper % 1) {
149
- var rand = nativeRandom();
150
- return nativeMin(lower + rand * (upper - lower + freeParseFloat("1e-" + ((rand + "").length - 1))), upper);
151
- }
152
- return baseRandom(lower, upper);
153
- }
154
- module.exports = random2;
155
- }
156
- });
157
-
158
- // src/context/HeadlessProvider.tsx
159
- import { createContext, useContext, useMemo } from "react";
160
- import { jsx } from "react/jsx-runtime";
161
- var HeadlessContext = createContext(null);
162
- var HeadlessProvider = ({ children, headlessConfig }) => {
163
- console.log("headlessConfig", headlessConfig);
164
- const contextValue = useMemo(() => {
165
- return headlessConfig;
166
- }, [headlessConfig]);
167
- return /* @__PURE__ */ jsx(HeadlessContext.Provider, { value: contextValue, children });
168
- };
169
- var useHeadlessContext = () => {
170
- const context = useContext(HeadlessContext);
171
- console.log("context", context);
172
- return context || {};
173
- };
174
-
175
- // src/shopify/fragments/article.ts
176
- var articleFragment = (
177
- /* GraphQL */
178
- `
179
- fragment article on Article {
180
- id
181
- handle
182
- title
183
- seo {
184
- ...seo
185
- }
186
- image {
187
- ...image
188
- }
189
- tags
190
- publishedAt
191
- content
192
- contentHtml
193
- excerpt
194
- excerptHtml
195
- authorV2 {
196
- bio
197
- email
198
- firstName
199
- lastName
200
- name
201
- }
202
- }
203
- `
204
- );
205
- var articleWithoutContentFragment = (
206
- /* GraphQL */
207
- `
208
- fragment article on Article {
209
- id
210
- handle
211
- title
212
- seo {
213
- ...seo
214
- }
215
- image {
216
- ...image
217
- }
218
- tags
219
- publishedAt
220
- excerpt
221
- excerptHtml
222
- authorV2 {
223
- bio
224
- email
225
- firstName
226
- lastName
227
- name
228
- }
229
- }
230
- `
231
- );
232
-
233
- // src/shopify/fragments/blog.ts
234
- var blogFragment = (
235
- /* GraphQL */
236
- `
237
- fragment blog on Blog {
238
- id
239
- handle
240
- title
241
- seo {
242
- ...seo
243
- }
244
- }
245
- `
246
- );
247
-
248
- // src/shopify/fragments/collection.ts
249
- var collectionFragment = (
250
- /* GraphQL */
251
- `
252
- fragment collection on Collection {
253
- id
254
- handle
255
- title
256
- description
257
- descriptionHtml
258
- seo {
259
- ...seo
260
- }
261
- image {
262
- ...image
263
- }
264
- }
265
- `
266
- );
267
-
268
- // src/shopify/fragments/image.ts
269
- var imageFragment = (
270
- /* GraphQL */
271
- `
272
- fragment image on Image {
273
- url
274
- altText
275
- width
276
- height
277
- }
278
- `
279
- );
280
-
281
- // src/shopify/fragments/metafields.ts
282
- var metafieldFragment = (
283
- /* GraphQL */
284
- `
285
- fragment metafield on Metafield {
286
- value
287
- type
288
- description
289
- namespace
290
- key
291
- }
292
- `
293
- );
294
- var metafieldFragmentStr = `
295
- value
296
- type
297
- description
298
- namespace
299
- key
300
- `;
301
-
302
- // src/shopify/fragments/product.ts
303
- var productFragment = (
304
- /* GraphQL */
305
- `
306
- fragment product on Product {
307
- id
308
- handle
309
- availableForSale
310
- title
311
- description
312
- descriptionHtml
313
- options {
314
- id
315
- name
316
- values
317
- }
318
- productType
319
- priceRange {
320
- maxVariantPrice {
321
- amount
322
- currencyCode
323
- }
324
- minVariantPrice {
325
- amount
326
- currencyCode
327
- }
328
- }
329
- compareAtPriceRange {
330
- minVariantPrice {
331
- amount
332
- currencyCode
333
- }
334
- }
335
- featuredImage {
336
- ...image
337
- }
338
- images(first: 250) {
339
- nodes {
340
- ...image
341
- }
342
- }
343
- media(first: 250) {
344
- nodes {
345
- id
346
- mediaContentType
347
- presentation {
348
- id
349
- }
350
- ... on Video {
351
- id
352
- sources {
353
- format
354
- height
355
- mimeType
356
- url
357
- width
358
- }
359
- }
360
- ... on MediaImage {
361
- id
362
- image {
363
- altText
364
- url
365
- }
366
- }
367
- }
368
- }
369
- seo {
370
- ...seo
371
- }
372
- tags
373
- updatedAt
374
- }
375
- `
376
- );
377
-
378
- // src/shopify/fragments/seo.ts
379
- var seoFragment = (
380
- /* GraphQL */
381
- `
382
- fragment seo on SEO {
383
- description
384
- title
385
- }
386
- `
387
- );
388
-
389
- // src/shopify/fragments/cart.ts
390
- var cartFragment = (
391
- /* GraphQL */
392
- `
393
- fragment cart on Cart {
394
- id
395
- totalQuantity
396
- updatedAt
397
- createdAt
398
- checkoutUrl
399
- note
400
- attributes {
401
- key
402
- value
403
- }
404
- cost {
405
- checkoutChargeAmount {
406
- amount
407
- currencyCode
408
- }
409
- subtotalAmount {
410
- amount
411
- currencyCode
412
- }
413
- totalAmount {
414
- amount
415
- currencyCode
416
- }
417
- totalTaxAmount {
418
- amount
419
- currencyCode
420
- }
421
- totalDutyAmount {
422
- amount
423
- currencyCode
424
- }
425
- totalAmountEstimated
426
- totalTaxAmountEstimated
427
- totalDutyAmountEstimated
428
- subtotalAmountEstimated
429
- }
430
- buyerIdentity {
431
- email
432
- customer {
433
- email
434
- id
435
- }
436
- deliveryAddressPreferences {
437
- ... on MailingAddress {
438
- address1
439
- address2
440
- city
441
- country
442
- zip
443
- }
444
- }
445
- }
446
- discountCodes {
447
- applicable
448
- code
449
- }
450
- discountAllocations {
451
- ... on CartCodeDiscountAllocation {
452
- code
453
- discountedAmount {
454
- amount
455
- currencyCode
456
- }
457
- }
458
- ... on CartAutomaticDiscountAllocation {
459
- title
460
- discountedAmount {
461
- amount
462
- currencyCode
463
- }
464
- }
465
- ... on CartCustomDiscountAllocation {
466
- title
467
- discountedAmount {
468
- amount
469
- currencyCode
470
- }
471
- }
472
- }
473
- deliveryGroups(first: 10) {
474
- nodes {
475
- deliveryAddress {
476
- address1
477
- address2
478
- city
479
- country
480
- zip
481
- }
482
- }
483
- }
484
- lines(first: 100) {
485
- edges {
486
- node {
487
- id
488
- quantity
489
- discountAllocations {
490
- ... on CartCodeDiscountAllocation {
491
- code
492
- discountedAmount {
493
- amount
494
- currencyCode
495
- }
496
- }
497
- ... on CartAutomaticDiscountAllocation {
498
- title
499
- discountedAmount {
500
- amount
501
- currencyCode
502
- }
503
- }
504
- ... on CartCustomDiscountAllocation {
505
- title
506
- discountedAmount {
507
- amount
508
- currencyCode
509
- }
510
- }
511
- }
512
- attributes {
513
- key
514
- value
515
- }
516
- cost {
517
- amountPerQuantity {
518
- amount
519
- currencyCode
520
- }
521
- compareAtAmountPerQuantity {
522
- amount
523
- currencyCode
524
- }
525
- subtotalAmount {
526
- amount
527
- currencyCode
528
- }
529
- totalAmount {
530
- amount
531
- currencyCode
532
- }
533
- }
534
- merchandise {
535
- ... on ProductVariant {
536
- id
537
- sku
538
- title
539
- quantityAvailable
540
- currentlyNotInStock
541
- availableForSale
542
- barcode
543
- weight
544
- selectedOptions {
545
- name
546
- value
547
- }
548
- image {
549
- ...image
550
- }
551
- price {
552
- amount
553
- currencyCode
554
- }
555
- compareAtPrice {
556
- amount
557
- currencyCode
558
- }
559
- metafields(identifiers: $variantMetafieldIdentifiers) {
560
- ...metafield
561
- }
562
- product {
563
- ...product
564
- metafields(identifiers: $productMetafieldIdentifiers) {
565
- ...metafield
566
- }
567
- }
568
- }
569
- }
570
- }
571
- }
572
- }
573
- totalQuantity
574
- }
575
- ${productFragment}
576
- ${seoFragment}
577
- ${imageFragment}
578
- ${metafieldFragment}
579
- `
580
- );
581
-
582
- // src/shopify/fragments/page-info.ts
583
- var pageInfoFragment = (
584
- /* GraphQL */
585
- `
586
- fragment pageInfo on PageInfo {
587
- hasNextPage
588
- hasPreviousPage
589
- startCursor
590
- endCursor
591
- }
592
- `
593
- );
594
-
595
- // src/shopify/fragments/variant.ts
596
- var variantFragment = (
597
- /* GraphQL */
598
- `
599
- fragment variant on ProductVariant {
600
- id
601
- sku
602
- title
603
- requiresShipping
604
- quantityAvailable
605
- currentlyNotInStock
606
- availableForSale
607
- barcode
608
- quantityAvailable
609
- weight
610
- selectedOptions {
611
- name
612
- value
613
- }
614
- image {
615
- ...image
616
- }
617
- price {
618
- amount
619
- currencyCode
620
- }
621
- compareAtPrice {
622
- amount
623
- currencyCode
624
- }
625
- }
626
- `
627
- );
628
-
629
- // src/shopify/fragments/page.ts
630
- var pageFragment = (
631
- /* GraphQL */
632
- `
633
- fragment page on Page {
634
- title
635
- handle
636
- body
637
- bodySummary
638
- seo {
639
- title
640
- description
641
- }
642
- }
643
- `
644
- );
645
-
646
- // src/shopify/queries/get-product-by-handles.ts
647
- var getProductsByHandlesQuery = (handles) => (
648
- /* GraphQL */
649
- `
650
- query GetProductByHandles(
651
- $productMetafieldIdentifiers: [HasMetafieldsIdentifier!] = []
652
- $variantMetafieldIdentifiers: [HasMetafieldsIdentifier!] = []
653
- ) {
654
- ${handles.map(
655
- (handle, index) => (
656
- /* GraphQL */
657
- `
658
- product${index}: product(handle: "${handle}") {
659
- ...product
660
- metafields(identifiers: $productMetafieldIdentifiers) {
661
- ...metafield
662
- }
663
- variants(first: 250) {
664
- nodes {
665
- ...variant
666
- metafields(identifiers: $variantMetafieldIdentifiers) {
667
- ...metafield
668
- }
669
- }
670
- }
671
- }
672
- `
673
- )
674
- )}
675
- }
676
- ${productFragment}
677
- ${variantFragment}
678
- ${metafieldFragment}
679
- ${seoFragment}
680
- ${imageFragment}
681
- `
682
- );
683
-
684
- // src/shopify/utils/fetch-graphql-api.ts
685
- import fetchPonyfill from "fetch-ponyfill";
686
-
687
- // src/shopify/utils/errors.ts
688
- var CommerceError = class extends Error {
689
- code;
690
- errors;
691
- constructor({ message, code, errors }) {
692
- const error = message ? { message, ...code ? { code } : {} } : errors[0];
693
- super(error.message);
694
- this.errors = message ? [error] : errors;
695
- if (error.code)
696
- this.code = error.code;
697
- }
698
- };
699
- var CommerceFetcherError = class extends CommerceError {
700
- status;
701
- constructor(options) {
702
- super(options);
703
- this.status = options.status;
704
- }
705
- };
706
-
707
- // src/shopify/utils/handle-fetch-response.ts
708
- function getCommerceError(errors, status = 500) {
709
- errors = errors ?? [{ message: "Failed to fetch Shopify API" }];
710
- return new CommerceFetcherError({ errors, status });
711
- }
712
-
713
- // src/shopify/utils/fetch-graphql-api.ts
714
- var { fetch } = fetchPonyfill();
715
- async function fetchGraphqlApi({
716
- query,
717
- variables,
718
- fetchOptions,
719
- headers,
720
- config
721
- }) {
722
- const { storefrontToken, storeDomain } = config;
723
- let result;
724
- try {
725
- result = await fetch(`https://${storeDomain}/api/2025-07/graphql.json`, {
726
- method: "POST",
727
- headers: {
728
- "Content-Type": "application/json",
729
- "X-Shopify-Storefront-Access-Token": storefrontToken,
730
- ...headers
731
- },
732
- body: JSON.stringify({
733
- ...query && { query },
734
- ...variables && { variables }
735
- }),
736
- ...fetchOptions
737
- });
738
- const { data, errors, status } = await result.json();
739
- if (errors?.length) {
740
- throw new Error(
741
- `Status: ${status}, ${result.status}, GraphQL errors: ` + errors.map(({ message }) => message).join(", ")
742
- );
743
- }
744
- return { data, status, ...errors && { errors } };
745
- } catch (err) {
746
- console.error("fetchGraphqlApi url:", storeDomain, result?.status);
747
- throw getCommerceError(
748
- [
749
- {
750
- message: `status: ${result?.status}, ${err.message}
751
- Most likely related to an unexpected output. e.g the store might be protected with password or not available.`
752
- }
753
- ],
754
- 500
755
- );
756
- }
757
- }
758
-
759
- // src/shopify/utils/helper.ts
760
- import Cookies from "js-cookie";
761
-
762
- // src/shopify/utils/const.ts
763
- var REVALIDATE_TIME = 60 * 5;
764
-
765
- // src/shopify/utils/helper.ts
766
- function atobID(id) {
767
- if (id && typeof id === "string" && id.includes("/")) {
768
- return id.split("/").pop()?.split("?")?.shift();
769
- } else {
770
- return id;
771
- }
772
- }
773
- function constructMetafieldIdentifiersQueryParams(metafieldIdentifiers = {}, metafieldsNamespace = "") {
774
- const identifiers = Object.entries(metafieldIdentifiers).reduce((queryInput, [key, value]) => {
775
- const metafieldIdentifiers2 = value;
776
- queryInput[`${key}MetafieldIdentifiers`] = metafieldIdentifiers2.filter((item) => item.namespace !== metafieldsNamespace).map((item) => ({
777
- namespace: metafieldsNamespace,
778
- key: item.namespace
779
- })).concat(metafieldIdentifiers2);
780
- return queryInput;
781
- }, {});
782
- return identifiers;
783
- }
784
-
785
- // src/shopify/utils/normalize/metafield.ts
786
- var normalizeMetafields = (metafields, metafieldNamespacePrefix) => {
787
- return metafields?.reduce(
788
- (prev, cur) => {
789
- if (cur) {
790
- let namespace = cur.namespace;
791
- if (namespace.startsWith(`${metafieldNamespacePrefix}combo`)) {
792
- namespace = cur.key;
793
- prev[namespace] = prev[namespace] || {};
794
- const parsedMetafields = parseMetafield(cur);
795
- if (parsedMetafields) {
796
- Object.entries(parsedMetafields).forEach(([key, innerMetafields]) => {
797
- prev[namespace][key] = prev[namespace][key] ?? (innerMetafields ? parseMetafield(innerMetafields) : null);
798
- });
799
- }
800
- } else {
801
- prev[namespace] = prev[namespace] || {};
802
- prev[namespace][cur.key] = cur ? parseMetafield(cur) : null;
803
- }
804
- }
805
- return prev;
806
- },
807
- {}
808
- );
809
- };
810
- function parseJSON(str) {
811
- try {
812
- return JSON.parse(str);
813
- } catch (err) {
814
- return {};
815
- }
816
- }
817
- var parseDesc = (desc) => {
818
- const cfg = parseJSON(desc) || {};
819
- return {
820
- parseType: cfg.type,
821
- // JSON_STRING
822
- descContent: cfg.content || "",
823
- // 描述
824
- status: cfg.status || "Active"
825
- // 状态
826
- };
827
- };
828
- var parseMetafield = (metafield) => {
829
- const type = metafield?.type && metafield?.type.toLowerCase();
830
- const { status } = parseDesc(metafield?.description || "");
831
- if (status.toLowerCase() !== "active")
832
- return null;
833
- switch (type) {
834
- case "json":
835
- case "json_string":
836
- case "rating":
837
- case "volume":
838
- case "weight":
839
- case "dimension":
840
- return JSON.parse(metafield.value);
841
- default:
842
- return metafield?.value || metafield;
843
- }
844
- };
845
-
846
- // src/shopify/utils/colors.ts
847
- var import_lodash = __toESM(require_lodash());
848
- var colorMap = {
849
- aliceblue: "#F0F8FF",
850
- antiquewhite: "#FAEBD7",
851
- aqua: "#00FFFF",
852
- aquamarine: "#7FFFD4",
853
- azure: "#F0FFFF",
854
- beige: "#F5F5DC",
855
- bisque: "#FFE4C4",
856
- black: "#000000",
857
- blanchedalmond: "#FFEBCD",
858
- blue: "#0000FF",
859
- blueviolet: "#8A2BE2",
860
- brown: "#A52A2A",
861
- burlywood: "#DEB887",
862
- burgandy: "#800020",
863
- burgundy: "#800020",
864
- cadetblue: "#5F9EA0",
865
- chartreuse: "#7FFF00",
866
- chocolate: "#D2691E",
867
- coral: "#FF7F50",
868
- cornflowerblue: "#6495ED",
869
- cornsilk: "#FFF8DC",
870
- crimson: "#DC143C",
871
- cyan: "#00FFFF",
872
- darkblue: "#00008B",
873
- darkcyan: "#008B8B",
874
- darkgoldenrod: "#B8860B",
875
- darkgray: "#A9A9A9",
876
- darkgreen: "#006400",
877
- darkgrey: "#A9A9A9",
878
- darkkhaki: "#BDB76B",
879
- darkmagenta: "#8B008B",
880
- darkolivegreen: "#556B2F",
881
- darkorange: "#FF8C00",
882
- darkorchid: "#9932CC",
883
- darkred: "#8B0000",
884
- darksalmon: "#E9967A",
885
- darkseagreen: "#8FBC8F",
886
- darkslateblue: "#483D8B",
887
- darkslategray: "#2F4F4F",
888
- darkslategrey: "#2F4F4F",
889
- darkturquoise: "#00CED1",
890
- darkviolet: "#9400D3",
891
- deeppink: "#FF1493",
892
- deepskyblue: "#00BFFF",
893
- dimgray: "#696969",
894
- dimgrey: "#696969",
895
- dodgerblue: "#1E90FF",
896
- firebrick: "#B22222",
897
- floralwhite: "#FFFAF0",
898
- forestgreen: "#228B22",
899
- fuchsia: "#FF00FF",
900
- gainsboro: "#DCDCDC",
901
- ghostwhite: "#F8F8FF",
902
- gold: "#FFD700",
903
- goldenrod: "#DAA520",
904
- gray: "#808080",
905
- green: "#008000",
906
- greenyellow: "#ADFF2F",
907
- grey: "#808080",
908
- honeydew: "#F0FFF0",
909
- hotpink: "#FF69B4",
910
- indianred: "#CD5C5C",
911
- indigo: "#4B0082",
912
- ivory: "#FFFFF0",
913
- khaki: "#F0E68C",
914
- lavender: "#E6E6FA",
915
- lavenderblush: "#FFF0F5",
916
- lawngreen: "#7CFC00",
917
- lemonchiffon: "#FFFACD",
918
- lightblue: "#ADD8E6",
919
- lightcoral: "#F08080",
920
- lightcyan: "#E0FFFF",
921
- lightgoldenrodyellow: "#FAFAD2",
922
- lightgray: "#D3D3D3",
923
- lightgreen: "#90EE90",
924
- lightgrey: "#D3D3D3",
925
- lightpink: "#FFB6C1",
926
- lightsalmon: "#FFA07A",
927
- lightseagreen: "#20B2AA",
928
- lightskyblue: "#87CEFA",
929
- lightslategray: "#778899",
930
- lightslategrey: "#778899",
931
- lightsteelblue: "#B0C4DE",
932
- lightyellow: "#FFFFE0",
933
- lime: "#00FF00",
934
- limegreen: "#32CD32",
935
- linen: "#FAF0E6",
936
- magenta: "#FF00FF",
937
- maroon: "#800000",
938
- mediumaquamarine: "#66CDAA",
939
- mediumblue: "#0000CD",
940
- mediumorchid: "#BA55D3",
941
- mediumpurple: "#9370DB",
942
- mediumseagreen: "#3CB371",
943
- mediumslateblue: "#7B68EE",
944
- mediumspringgreen: "#00FA9A",
945
- mediumturquoise: "#48D1CC",
946
- mediumvioletred: "#C71585",
947
- midnightblue: "#191970",
948
- mintcream: "#F5FFFA",
949
- mistyrose: "#FFE4E1",
950
- moccasin: "#FFE4B5",
951
- navajowhite: "#FFDEAD",
952
- navy: "#000080",
953
- oldlace: "#FDF5E6",
954
- olive: "#808000",
955
- olivedrab: "#6B8E23",
956
- orange: "#FFA500",
957
- orangered: "#FF4500",
958
- orchid: "#DA70D6",
959
- palegoldenrod: "#EEE8AA",
960
- palegreen: "#98FB98",
961
- paleturquoise: "#AFEEEE",
962
- palevioletred: "#DB7093",
963
- papayawhip: "#FFEFD5",
964
- peachpuff: "#FFDAB9",
965
- peru: "#CD853F",
966
- pink: "#FFC0CB",
967
- plum: "#DDA0DD",
968
- powderblue: "#B0E0E6",
969
- purple: "#800080",
970
- rebeccapurple: "#663399",
971
- red: "#FF0000",
972
- rosybrown: "#BC8F8F",
973
- royalblue: "#4169E1",
974
- saddlebrown: "#8B4513",
975
- salmon: "#FA8072",
976
- sandybrown: "#F4A460",
977
- seagreen: "#2E8B57",
978
- seashell: "#FFF5EE",
979
- sienna: "#A0522D",
980
- silver: "#C0C0C0",
981
- skyblue: "#87CEEB",
982
- slateblue: "#6A5ACD",
983
- slategray: "#708090",
984
- slategrey: "#708090",
985
- spacegrey: "#65737e",
986
- spacegray: "#65737e",
987
- snow: "#FFFAFA",
988
- springgreen: "#00FF7F",
989
- steelblue: "#4682B4",
990
- tan: "#D2B48C",
991
- teal: "#008080",
992
- thistle: "#D8BFD8",
993
- tomato: "#FF6347",
994
- turquoise: "#40E0D0",
995
- violet: "#EE82EE",
996
- wheat: "#F5DEB3",
997
- white: "#FFFFFF",
998
- whitesmoke: "#F5F5F5",
999
- yellow: "#FFFF00",
1000
- yellowgreen: "#9ACD32"
1001
- };
1002
-
1003
- // src/shopify/utils/normalize/product.ts
1004
- var money = ({ amount, currencyCode }) => {
1005
- return amount && currencyCode && {
1006
- amount: +amount,
1007
- currencyCode
1008
- };
1009
- };
1010
- var checkVariantAvailable = (variant) => {
1011
- if (!variant.availableForSale)
1012
- return false;
1013
- if (!variant.quantityAvailable && !variant.currentlyNotInStock)
1014
- return false;
1015
- if (variant.price?.amount >= 999999999e-2)
1016
- return false;
1017
- return true;
1018
- };
1019
- var normalizeProductOption = ({
1020
- id,
1021
- name,
1022
- values
1023
- }) => {
1024
- return {
1025
- __typename: "ProductOption",
1026
- id,
1027
- name: name.toLowerCase(),
1028
- values: values.map((value) => {
1029
- let output = {
1030
- label: value
1031
- };
1032
- if (name.match(/colou?r/gi)) {
1033
- const mapedColor = colorMap[value.toLowerCase().replace(/ /g, "")];
1034
- if (mapedColor) {
1035
- output = {
1036
- ...output,
1037
- hexColors: [mapedColor]
1038
- };
1039
- }
1040
- }
1041
- return output;
1042
- })
1043
- };
1044
- };
1045
- var normalizeProductImages = ({ nodes }) => nodes?.map((node) => ({
1046
- url: node.url,
1047
- alt: node.altText || ""
1048
- })) || [];
1049
- var normalizeProductMedia = ({ nodes }) => nodes?.map((node) => node) || [];
1050
- function normalizeVariantProduct(product, metafieldNamespacePrefix = "") {
1051
- const { id, vendor, images, media, variants, handle, priceRange, options, metafields, availableForSale, ...rest } = product;
1052
- return {
1053
- ...rest,
1054
- availableForSale: !!variants.nodes.find((item) => !!item.availableForSale),
1055
- id,
1056
- vendor: vendor || "",
1057
- handle,
1058
- path: `/${handle}`,
1059
- slug: handle?.replace(/^\/+|\/+$/g, ""),
1060
- price: money(priceRange?.minVariantPrice),
1061
- priceRange,
1062
- images: normalizeProductImages(images),
1063
- media: normalizeProductMedia(media),
1064
- options: options ? options.filter((o) => o.name !== "Title").map((o) => normalizeProductOption(o)) : [],
1065
- metafields: normalizeMetafields(metafields, metafieldNamespacePrefix) || {}
1066
- };
1067
- }
1068
- var getCouponsFromVariantMetafields = ({ metafields, variantId }) => {
1069
- const coupons = metafields?.__discountCodeApp?.data?.filter((coupon) => {
1070
- const isRightVariant = String(coupon.variant_shopify_id) === atobID(variantId);
1071
- const isActive = (coupon.ends_at === null || new Date(coupon.ends_at).getTime() > (/* @__PURE__ */ new Date()).getTime()) && (coupon.starts_at === null || new Date(coupon.starts_at).getTime() <= (/* @__PURE__ */ new Date()).getTime());
1072
- return isRightVariant && isActive;
1073
- }) || [];
1074
- return coupons;
1075
- };
1076
- var normalizeProductVariants = ({ nodes }, product, metafieldNamespacePrefix = "") => {
1077
- return nodes?.map((node) => {
1078
- const { id, selectedOptions, sku, price, metafields, ...rest } = node;
1079
- const normalizedMetafields = normalizeMetafields(metafields, metafieldNamespacePrefix);
1080
- const coupons = getCouponsFromVariantMetafields({ metafields: normalizedMetafields, variantId: id });
1081
- return {
1082
- ...rest,
1083
- id,
1084
- sku: sku ?? id,
1085
- weight: node.weight,
1086
- price: money(price),
1087
- availableForSale: checkVariantAvailable(node),
1088
- options: selectedOptions.map(({ name, value }) => {
1089
- const options = normalizeProductOption({
1090
- id,
1091
- name,
1092
- values: [value]
1093
- });
1094
- return options;
1095
- }),
1096
- selectedOptions,
1097
- metafields: normalizedMetafields,
1098
- product: normalizeVariantProduct(product, metafieldNamespacePrefix),
1099
- coupons
1100
- };
1101
- });
1102
- };
1103
- function normalizeProduct(product, metafieldNamespacePrefix = "") {
1104
- const { id, vendor, images, media, variants, handle, priceRange, options, metafields, availableForSale, ...rest } = product;
1105
- const customVariants = variants ? normalizeProductVariants(variants, product, metafieldNamespacePrefix) : [];
1106
- return {
1107
- ...rest,
1108
- availableForSale: !!customVariants.find((item) => !!item.availableForSale),
1109
- id,
1110
- vendor: vendor || "",
1111
- handle,
1112
- path: `/${handle}`,
1113
- slug: handle?.replace(/^\/+|\/+$/g, ""),
1114
- price: money(priceRange?.minVariantPrice),
1115
- priceRange,
1116
- images: normalizeProductImages(images),
1117
- media: normalizeProductMedia(media),
1118
- variants: customVariants,
1119
- options: options?.length > 0 ? options.filter((o) => o.name !== "Title").map((o) => normalizeProductOption(o)) : customVariants.length > 1 ? [
1120
- {
1121
- id: "colorOptionsId",
1122
- name: customVariants?.[0]?.options?.[0]?.name,
1123
- values: customVariants.map((item) => item.options.map((o) => o.values)).flatMap((item) => item.flat())
1124
- }
1125
- ] : [],
1126
- metafields: normalizeMetafields(metafields, metafieldNamespacePrefix) || {}
1127
- };
1128
- }
1129
-
1130
- // src/shopify/fetchers/get-products-by-handles.ts
1131
- var getProductsByHandles = async ({ options, config }) => {
1132
- const { handles, metafieldIdentifiers, comboMetafieldsNamespace } = options;
1133
- if (!handles?.length) {
1134
- throw new Error("Handles are required");
1135
- }
1136
- const products = await fetchGraphqlApi({
1137
- query: getProductsByHandlesQuery(handles),
1138
- variables: {
1139
- handles,
1140
- ...constructMetafieldIdentifiersQueryParams(metafieldIdentifiers, comboMetafieldsNamespace)
1141
- },
1142
- config
1143
- });
1144
- return Object.values(products.data).filter((item) => !!item).map((product) => normalizeProduct(product, ""));
1145
- };
1146
-
1147
- // src/shopify/mutations/add-cart-lines.ts
1148
- var addCartLinesMutation = (
1149
- /* GraphQL */
1150
- `
1151
- mutation addCartLines($cartId: ID!, $lines: [CartLineInput!]!) {
1152
- cartLinesAdd(cartId: $cartId, lines: $lines) {
1153
- cart {
1154
- ...cart
1155
- }
1156
- userErrors {
1157
- field
1158
- message
1159
- }
1160
- }
1161
- }
1162
- ${cartFragment}
1163
- `
1164
- );
1165
-
1166
- // src/shopify/utils/normalize/cart.ts
1167
- function normalizeCart(cart, metafieldsNamespace = "") {
1168
- const lineItems = cart.lines?.edges?.map((item) => normalizeLineItem(item, metafieldsNamespace));
1169
- const orderDiscounts = cart?.discountAllocations?.reduce((pre, cur) => {
1170
- return Number(cur?.discountedAmount?.amount) + pre;
1171
- }, 0);
1172
- const [totalLineItemsDiscount, lineItemsSubtotalPrice] = lineItems?.reduce(
1173
- ([t, l], cur) => {
1174
- const currentDiscount = cur?.discountAllocations?.reduce((p, c) => Number(c?.amount) + p, 0) || 0;
1175
- return [currentDiscount + t, Number(cur?.subtotalAmount) + l];
1176
- },
1177
- [0, 0]
1178
- ) || [0, 0];
1179
- return {
1180
- customAttributes: cart.attributes,
1181
- totalLineItemsDiscount: orderDiscounts + totalLineItemsDiscount,
1182
- id: cart.id,
1183
- url: cart.checkoutUrl,
1184
- ready: true,
1185
- customerId: cart?.buyerIdentity?.customer?.id || "",
1186
- email: cart?.buyerIdentity?.email || "",
1187
- createdAt: cart.createdAt,
1188
- currency: {
1189
- code: cart.cost?.subtotalAmount?.currencyCode
1190
- },
1191
- taxesIncluded: cart.cost?.totalTaxAmountEstimated,
1192
- lineItems: cart.lines?.edges?.map((item) => normalizeLineItem(item, metafieldsNamespace)),
1193
- subtotalPrice: cart.cost?.subtotalAmount?.amount,
1194
- totalPrice: cart.cost?.totalAmount?.amount - (cart.cost?.totalTaxAmount?.amount || 0),
1195
- // 预估税额现在逻辑没理清楚,暂时 写死为 0
1196
- // totalTaxAmount: cart.cost?.totalTaxAmount?.amount,
1197
- totalTaxAmount: 0,
1198
- // lineItemsSubtotalPrice: cart.cost?.subtotalAmount?.amount,
1199
- lineItemsSubtotalPrice,
1200
- discountCodes: cart.discountCodes || [],
1201
- discountAllocations: cart?.discountAllocations?.map((item) => ({
1202
- code: item?.code || item?.title || "",
1203
- amount: item?.discountedAmount?.amount
1204
- })) || []
1205
- };
1206
- }
1207
- function normalizeLineItem({
1208
- node: { id, merchandise: variant, quantity, discountAllocations, attributes, cost }
1209
- }, metafieldNamespacePrefix = "") {
1210
- const price = variant?.price?.amount;
1211
- const name = variant?.product?.title;
1212
- return {
1213
- id,
1214
- name,
1215
- quantity,
1216
- variantId: String(variant?.id),
1217
- productId: String(variant?.product?.id),
1218
- totalAmount: cost?.totalAmount?.amount,
1219
- subtotalAmount: cost?.subtotalAmount?.amount,
1220
- discountAllocations: discountAllocations?.map((item) => ({
1221
- code: item?.code || item?.title || "",
1222
- amount: item?.discountedAmount?.amount
1223
- })) || [],
1224
- customAttributes: attributes?.map((item) => ({
1225
- key: item?.key || "",
1226
- value: item?.value || ""
1227
- })) || [],
1228
- variant: {
1229
- id: String(variant?.id),
1230
- options: [],
1231
- price,
1232
- listPrice: variant?.compareAtPrice?.amount,
1233
- sku: variant?.sku ?? "",
1234
- name: variant?.title,
1235
- requiresShipping: variant?.requiresShipping ?? false,
1236
- availableForSale: availableVariant({
1237
- ...variant,
1238
- price: variant?.price
1239
- }),
1240
- quantityAvailable: variant?.quantityAvailable || 0,
1241
- currentlyNotInStock: variant?.currentlyNotInStock || false,
1242
- metafields: normalizeMetafields(variant.metafields, metafieldNamespacePrefix)
1243
- },
1244
- product: variant?.product,
1245
- path: `/${variant?.product?.handle}`,
1246
- discounts: [],
1247
- options: variant?.title == "Default Title" ? [] : variant?.selectedOptions
1248
- };
1249
- }
1250
- var availableVariant = (variant) => {
1251
- if (!variant.availableForSale)
1252
- return false;
1253
- if (!variant.quantityAvailable && !variant.currentlyNotInStock)
1254
- return false;
1255
- if (variant.price?.amount >= 999999999e-2)
1256
- return false;
1257
- return true;
1258
- };
1259
-
1260
- // src/shopify/fetchers/add-cart-lines.ts
1261
- var addCartLines = async function({
1262
- options,
1263
- config
1264
- }) {
1265
- const { data } = await fetchGraphqlApi({
1266
- query: addCartLinesMutation,
1267
- variables: {
1268
- cartId: options.cartId,
1269
- lines: options.lines
1270
- },
1271
- config
1272
- });
1273
- if (data?.cartLinesAdd?.userErrors?.length) {
1274
- const errors = data.cartLinesAdd.userErrors;
1275
- const quantityError = errors.find((error) => error.field?.includes("quantity"));
1276
- if (quantityError) {
1277
- return Promise.reject(quantityError);
1278
- } else {
1279
- throw new Error(JSON.stringify(data?.cartLinesAdd?.userErrors));
1280
- }
1281
- }
1282
- const cart = data?.cartLinesAdd?.cart;
1283
- if (cart) {
1284
- return normalizeCart(cart, "");
1285
- } else {
1286
- return void 0;
1287
- }
1288
- };
1289
-
1290
- // src/shopify/mutations/create-cart.ts
1291
- var createCartMutation = (
1292
- /* GraphQL */
1293
- `
1294
- mutation createCart(
1295
- $lines: [CartLineInput!]
1296
- $discountCodes: [String!]
1297
- $attributes: [AttributeInput!] = []
1298
- $productMetafieldIdentifiers: [HasMetafieldsIdentifier!] = []
1299
- $variantMetafieldIdentifiers: [HasMetafieldsIdentifier!] = []
1300
- ) {
1301
- cartCreate(input: { lines: $lines, discountCodes: $discountCodes, attributes: $attributes }) {
1302
- cart {
1303
- ...cart
1304
- }
1305
- userErrors {
1306
- field
1307
- message
1308
- }
1309
- }
1310
- }
1311
- ${cartFragment}
1312
- `
1313
- );
1314
-
1315
- // src/shopify/fetchers/create-cart.ts
1316
- var createCart = async function({
1317
- options,
1318
- config
1319
- }) {
1320
- const { comboMetafieldsNamespace, metafieldIdentifiers, ...rest } = options;
1321
- if (!rest.lines?.length) {
1322
- throw new Error("Invalid input used for this operation: Miss lines");
1323
- }
1324
- const { data } = await fetchGraphqlApi({
1325
- query: createCartMutation,
1326
- variables: {
1327
- ...rest,
1328
- ...metafieldIdentifiers && {
1329
- ...constructMetafieldIdentifiersQueryParams(metafieldIdentifiers, comboMetafieldsNamespace)
1330
- }
1331
- },
1332
- config
1333
- });
1334
- const cart = data?.cartCreate?.cart;
1335
- if (cart) {
1336
- return normalizeCart(cart, comboMetafieldsNamespace);
1337
- } else {
1338
- return void 0;
1339
- }
1340
- };
1341
-
1342
- // src/shopify/mutations/remove-cart-items.ts
1343
- var removeCartItemsMutation = (
1344
- /* GraphQL */
1345
- `
1346
- mutation removeFromCart($cartId: ID!, $lineIds: [ID!]!) {
1347
- cartLinesRemove(cartId: $cartId, lineIds: $lineIds) {
1348
- cart {
1349
- ...cart
1350
- }
1351
- userErrors {
1352
- field
1353
- message
1354
- }
1355
- }
1356
- }
1357
- ${cartFragment}
1358
- `
1359
- );
1360
-
1361
- // src/shopify/fetchers/remove-cart-lines.ts
1362
- var removeCartLines = async function({
1363
- options,
1364
- config
1365
- }) {
1366
- const { data } = await fetchGraphqlApi({
1367
- query: removeCartItemsMutation,
1368
- variables: options,
1369
- config
1370
- });
1371
- if (data?.cartLinesRemove?.cart) {
1372
- const normalizedCart = normalizeCart(data.cartLinesRemove.cart, "");
1373
- return normalizedCart;
1374
- } else {
1375
- return void 0;
1376
- }
1377
- };
1378
-
1379
- // src/shopify/mutations/update-cart-attributes.ts
1380
- var updateCartAttributesMutation = (
1381
- /* GraphQL */
1382
- `
1383
- mutation updateCartAttributes($cartId: ID!, $attributes: [AttributeInput!]!) {
1384
- cartAttributesUpdate(cartId: $cartId, attributes: $attributes) {
1385
- cart {
1386
- ...cart
1387
- }
1388
- userErrors {
1389
- field
1390
- message
1391
- }
1392
- }
1393
- }
1394
- ${cartFragment}
1395
- `
1396
- );
1397
-
1398
- // src/shopify/fetchers/update-cart-attributes.ts
1399
- var updateCartAttributes = async function({ options, config }) {
1400
- const { data } = await fetchGraphqlApi({
1401
- query: updateCartAttributesMutation,
1402
- variables: options,
1403
- config
1404
- });
1405
- if (data?.cartAttributesUpdate?.cart) {
1406
- const normalizedCart = normalizeCart(data.cartAttributesUpdate.cart, "");
1407
- return normalizedCart;
1408
- } else {
1409
- return void 0;
1410
- }
1411
- };
1412
-
1413
- // src/shopify/mutations/update-cart-items.ts
1414
- var updateCartLinesMutation = (
1415
- /* GraphQL */
1416
- `
1417
- mutation updateCartLines($cartId: ID!, $lines: [CartLineUpdateInput!]!) {
1418
- cartLinesUpdate(cartId: $cartId, lines: $lines) {
1419
- cart {
1420
- ...cart
1421
- }
1422
- userErrors {
1423
- field
1424
- message
1425
- }
1426
- }
1427
- }
1428
- ${cartFragment}
1429
- `
1430
- );
1431
-
1432
- // src/shopify/fetchers/update-cart-lines.ts
1433
- var updateCartLines = async function({
1434
- options,
1435
- config
1436
- }) {
1437
- const { data } = await fetchGraphqlApi({
1438
- query: updateCartLinesMutation,
1439
- variables: options,
1440
- config
1441
- });
1442
- if (data?.cartLinesUpdate?.userErrors?.length) {
1443
- const errors = data.cartLinesUpdate?.userErrors;
1444
- const quantityError = errors.find((error) => error.field?.includes("quantity"));
1445
- if (quantityError) {
1446
- return Promise.reject(quantityError);
1447
- }
1448
- }
1449
- if (data?.cartLinesUpdate?.cart) {
1450
- const normalizedCart = normalizeCart(data.cartLinesUpdate.cart, "");
1451
- return normalizedCart;
1452
- } else {
1453
- return void 0;
1454
- }
1455
- };
1456
-
1457
- // src/shopify/queries/get-cart.ts
1458
- var getCartQuery = (
1459
- /* GraphQL */
1460
- `
1461
- query getCart(
1462
- $cartId: ID!
1463
- $productMetafieldIdentifiers: [HasMetafieldsIdentifier!] = []
1464
- $variantMetafieldIdentifiers: [HasMetafieldsIdentifier!] = []
1465
- ) {
1466
- cart(id: $cartId) {
1467
- ...cart
1468
- }
1469
- }
1470
- ${cartFragment}
1471
- `
1472
- );
1473
-
1474
- // src/shopify/fetchers/get-cart.ts
1475
- var getCart = async function({ options, config }) {
1476
- const { comboMetafieldsNamespace: metafieldsNamespace, metafieldIdentifiers, cartId } = options;
1477
- if (!cartId) {
1478
- throw new Error("Invalid input used for this operation: Miss cartId");
1479
- }
1480
- const { data } = await fetchGraphqlApi({
1481
- query: getCartQuery,
1482
- variables: {
1483
- cartId,
1484
- ...constructMetafieldIdentifiersQueryParams(metafieldIdentifiers, metafieldsNamespace)
1485
- },
1486
- config
1487
- });
1488
- return normalizeCart(data.cart, metafieldsNamespace);
1489
- };
1490
-
1491
- // src/shopify/hooks/useProductsByHandles.ts
1492
- import useSWR from "swr";
1493
- function useProductsByHandles({
1494
- handles,
1495
- metafieldIdentifiers
1496
- }) {
1497
- const { storefrontToken, storeDomain, comboMetafieldsNamespace } = useHeadlessContext();
1498
- return useSWR(handles?.length ? { handles, metafieldIdentifiers } : void 0, async () => {
1499
- return getProductsByHandles({
1500
- options: {
1501
- handles,
1502
- metafieldIdentifiers,
1503
- comboMetafieldsNamespace
1504
- },
1505
- config: { storefrontToken, storeDomain }
1506
- });
1507
- });
1508
- }
1509
-
1510
- // src/cart/hooks/basic/useBuyNow.ts
1511
- import { useCallback } from "react";
1512
- import useSWRMutation from "swr/mutation";
1513
-
1514
- // src/cart/const.ts
1515
- var currencyCodeMapping = {
1516
- us: "USD",
1517
- ca: "CAD",
1518
- gb: "GBP",
1519
- eu: "EUR",
1520
- au: "AUD",
1521
- nz: "NZD",
1522
- de: "EUR",
1523
- fr: "EUR",
1524
- es: "EUR",
1525
- it: "EUR",
1526
- nl: "EUR",
1527
- pl: "EUR",
1528
- ro: "EUR"
1529
- };
1530
- var defaultSWRMutationConfiguration = {
1531
- throwOnError: false
1532
- };
1533
-
1534
- // src/cart/hooks/basic/useBuyNow.ts
1535
- var useBuyNow = ({ withTrack = true, redirectToCheckout = true } = {}, swrOptions = defaultSWRMutationConfiguration) => {
1536
- const { storefrontToken, storeDomain } = useHeadlessContext();
1537
- const trigger = useCallback(
1538
- async (_, { arg }) => {
1539
- const { lineItems, discountCodes, gtmParams = {}, buyerIdentity, fbqTrackConfig } = arg;
1540
- if (!lineItems) {
1541
- return;
1542
- }
1543
- const linesToBuyNow = lineItems.map((item) => ({
1544
- merchandiseId: item.variant.id,
1545
- quantity: item.quantity || 1,
1546
- attributes: item.attributes
1547
- })).filter((item) => item.merchandiseId && item.quantity);
1548
- let resultCart;
1549
- if (linesToBuyNow.length > 0) {
1550
- const createCartOptions = {
1551
- lines: linesToBuyNow,
1552
- buyerIdentity,
1553
- discountCodes
1554
- };
1555
- resultCart = await createCart({
1556
- options: createCartOptions,
1557
- config: {
1558
- storefrontToken,
1559
- storeDomain
1560
- }
1561
- });
1562
- }
1563
- if (withTrack) {
1564
- }
1565
- if (redirectToCheckout && resultCart?.url) {
1566
- window.location.href = resultCart.url;
1567
- } else {
1568
- throw new Error("Failed to buy now");
1569
- }
1570
- return resultCart;
1571
- },
1572
- [withTrack, redirectToCheckout, createCart]
1573
- );
1574
- return useSWRMutation("buyNow", trigger, swrOptions);
1575
- };
1576
-
1577
- // src/cart/utils/index.ts
1578
- var isAttributesEqual = (oldAttributes, newAttributes) => {
1579
- if (oldAttributes?.length !== newAttributes?.length) {
1580
- return false;
1581
- }
1582
- const oldMap = new Map(oldAttributes.map((attr) => [attr.key, attr.value]));
1583
- const newMap = new Map(newAttributes.map((attr) => [attr.key, attr.value]));
1584
- for (const [key, value] of newMap) {
1585
- if (!oldMap.has(key) || oldMap.get(key) !== value) {
1586
- return false;
1587
- }
1588
- }
1589
- return true;
1590
- };
1591
-
1592
- // src/cart/track/fbq.ts
1593
- var fbq = (...args) => {
1594
- if (window.fbq) {
1595
- window.fbq(...args);
1596
- }
1597
- };
1598
- var gtag = (...args) => {
1599
- if (window.gtag) {
1600
- window.gtag(...args);
1601
- }
1602
- };
1603
- var addToCartFbq = ({ lineItems = [] }) => {
1604
- if (lineItems.length && lineItems[0].variant) {
1605
- const { variant, quantity, finalPrice } = lineItems[0];
1606
- fbq("track", "AddToCart", {
1607
- value: finalPrice?.amount || variant?.price?.amount,
1608
- num_items: quantity,
1609
- currency: variant?.price?.currencyCode,
1610
- content_name: variant?.product?.title,
1611
- // 产品内容的名字
1612
- content_type: "product_group",
1613
- content_ids: String(variant?.id),
1614
- // 产品的varaint id
1615
- content_category: variant?.product?.metafields?.global?.trafficType || "public"
1616
- // 产品分类
1617
- });
1618
- }
1619
- };
1620
- var buyNowFbq = ({
1621
- trackConfig,
1622
- gtagId
1623
- }) => {
1624
- try {
1625
- if (trackConfig?.fbqBuyNowEvent) {
1626
- fbq("trackCustom", trackConfig?.fbqBuyNowEvent);
1627
- }
1628
- if (trackConfig?.gtagBuyNowLabel) {
1629
- gtag("event", trackConfig?.gtagBuyNowConversion || "conversion", {
1630
- send_to: `${gtagId}/${trackConfig?.gtagBuyNowLabel}`
1631
- });
1632
- }
1633
- } catch (error) {
1634
- }
1635
- };
1636
- export {
1637
- HeadlessProvider,
1638
- addCartLines,
1639
- addToCartFbq,
1640
- articleFragment,
1641
- articleWithoutContentFragment,
1642
- blogFragment,
1643
- buyNowFbq,
1644
- cartFragment,
1645
- collectionFragment,
1646
- createCart,
1647
- currencyCodeMapping,
1648
- defaultSWRMutationConfiguration,
1649
- fbq,
1650
- getCart,
1651
- getProductsByHandles,
1652
- getProductsByHandlesQuery,
1653
- gtag,
1654
- imageFragment,
1655
- isAttributesEqual,
1656
- metafieldFragment,
1657
- metafieldFragmentStr,
1658
- pageFragment,
1659
- pageInfoFragment,
1660
- productFragment,
1661
- removeCartLines,
1662
- seoFragment,
1663
- updateCartAttributes,
1664
- updateCartLines,
1665
- useBuyNow,
1666
- useHeadlessContext,
1667
- useProductsByHandles,
1668
- variantFragment
1669
- };