the-foxy-library 1.0.0

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 (125) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +111 -0
  3. package/dist/components/index.d.ts +33 -0
  4. package/dist/components/iv-accordion.d.ts +11 -0
  5. package/dist/components/iv-banner.d.ts +11 -0
  6. package/dist/components/iv-button.d.ts +11 -0
  7. package/dist/components/iv-card.d.ts +11 -0
  8. package/dist/components/iv-carousel.d.ts +11 -0
  9. package/dist/components/iv-dynamic-products-carousel.d.ts +11 -0
  10. package/dist/components/iv-dynamic-products.d.ts +11 -0
  11. package/dist/components/iv-filters.d.ts +11 -0
  12. package/dist/components/iv-layout.d.ts +11 -0
  13. package/dist/components/iv-link.d.ts +11 -0
  14. package/dist/components/iv-modal.d.ts +11 -0
  15. package/dist/components/iv-predictive-search.d.ts +11 -0
  16. package/dist/components/iv-recently-viewed.d.ts +11 -0
  17. package/dist/components/iv-sidebar.d.ts +11 -0
  18. package/dist/components/iv-spinner.d.ts +11 -0
  19. package/dist/components/iv-suggest.d.ts +11 -0
  20. package/dist/components/iv-tabs.d.ts +11 -0
  21. package/dist/components/iv-toast-container.d.ts +11 -0
  22. package/dist/components/iv-toast.d.ts +11 -0
  23. package/dist/components/iv-wishlist-view.d.ts +11 -0
  24. package/dist/components/iv-wishlist.d.ts +11 -0
  25. package/dist/components/sw-in-grid-content.d.ts +11 -0
  26. package/dist/components/sw-size-guide.d.ts +11 -0
  27. package/dist/intravenous/factory-1QinX-o0.js +275 -0
  28. package/dist/intravenous/factory-1QinX-o0.js.map +1 -0
  29. package/dist/intravenous/factory-JClanx-E.js +596 -0
  30. package/dist/intravenous/factory-JClanx-E.js.map +1 -0
  31. package/dist/intravenous/factory-mrqy6XUM.js +36 -0
  32. package/dist/intravenous/factory-mrqy6XUM.js.map +1 -0
  33. package/dist/intravenous/index-Py50VI8u.js +4761 -0
  34. package/dist/intravenous/index-Py50VI8u.js.map +1 -0
  35. package/dist/intravenous/index.esm.js +17 -0
  36. package/dist/intravenous/index.esm.js.map +1 -0
  37. package/dist/intravenous/intravenous.esm.js +48 -0
  38. package/dist/intravenous/intravenous.esm.js.map +1 -0
  39. package/dist/intravenous/iv-accordion.entry.esm.js.map +1 -0
  40. package/dist/intravenous/iv-accordion.entry.js +35 -0
  41. package/dist/intravenous/iv-banner.entry.esm.js.map +1 -0
  42. package/dist/intravenous/iv-banner.entry.js +28 -0
  43. package/dist/intravenous/iv-button.entry.esm.js.map +1 -0
  44. package/dist/intravenous/iv-button.entry.js +40 -0
  45. package/dist/intravenous/iv-card.entry.esm.js.map +1 -0
  46. package/dist/intravenous/iv-card.entry.js +82 -0
  47. package/dist/intravenous/iv-carousel.entry.esm.js.map +1 -0
  48. package/dist/intravenous/iv-carousel.entry.js +16 -0
  49. package/dist/intravenous/iv-dynamic-products-carousel.entry.esm.js.map +1 -0
  50. package/dist/intravenous/iv-dynamic-products-carousel.entry.js +114 -0
  51. package/dist/intravenous/iv-dynamic-products.entry.esm.js.map +1 -0
  52. package/dist/intravenous/iv-dynamic-products.entry.js +97 -0
  53. package/dist/intravenous/iv-filters.entry.esm.js.map +1 -0
  54. package/dist/intravenous/iv-filters.entry.js +19 -0
  55. package/dist/intravenous/iv-layout.entry.esm.js.map +1 -0
  56. package/dist/intravenous/iv-layout.entry.js +60 -0
  57. package/dist/intravenous/iv-link.entry.esm.js.map +1 -0
  58. package/dist/intravenous/iv-link.entry.js +25 -0
  59. package/dist/intravenous/iv-modal.entry.esm.js.map +1 -0
  60. package/dist/intravenous/iv-modal.entry.js +19 -0
  61. package/dist/intravenous/iv-predictive-search.entry.esm.js.map +1 -0
  62. package/dist/intravenous/iv-predictive-search.entry.js +311 -0
  63. package/dist/intravenous/iv-recently-viewed.entry.esm.js.map +1 -0
  64. package/dist/intravenous/iv-recently-viewed.entry.js +101 -0
  65. package/dist/intravenous/iv-sidebar.entry.esm.js.map +1 -0
  66. package/dist/intravenous/iv-sidebar.entry.js +24 -0
  67. package/dist/intravenous/iv-spinner.entry.esm.js.map +1 -0
  68. package/dist/intravenous/iv-spinner.entry.js +19 -0
  69. package/dist/intravenous/iv-suggest.entry.esm.js.map +1 -0
  70. package/dist/intravenous/iv-suggest.entry.js +72 -0
  71. package/dist/intravenous/iv-tabs.entry.esm.js.map +1 -0
  72. package/dist/intravenous/iv-tabs.entry.js +22 -0
  73. package/dist/intravenous/iv-toast-container.entry.esm.js.map +1 -0
  74. package/dist/intravenous/iv-toast-container.entry.js +44 -0
  75. package/dist/intravenous/iv-toast.entry.esm.js.map +1 -0
  76. package/dist/intravenous/iv-toast.entry.js +23 -0
  77. package/dist/intravenous/iv-wishlist-view.entry.esm.js.map +1 -0
  78. package/dist/intravenous/iv-wishlist-view.entry.js +21 -0
  79. package/dist/intravenous/iv-wishlist.entry.esm.js.map +1 -0
  80. package/dist/intravenous/iv-wishlist.entry.js +73 -0
  81. package/dist/intravenous/loader.esm.js.map +1 -0
  82. package/dist/intravenous/sw-in-grid-content.entry.esm.js.map +1 -0
  83. package/dist/intravenous/sw-in-grid-content.entry.js +18 -0
  84. package/dist/intravenous/sw-size-guide.entry.esm.js.map +1 -0
  85. package/dist/intravenous/sw-size-guide.entry.js +111 -0
  86. package/dist/types/components/iv-accordion/iv-accordion.d.ts +12 -0
  87. package/dist/types/components/iv-banner/iv-banner.d.ts +7 -0
  88. package/dist/types/components/iv-button/iv-button.d.ts +12 -0
  89. package/dist/types/components/iv-card/iv-card.d.ts +15 -0
  90. package/dist/types/components/iv-carousel/iv-carousel.d.ts +3 -0
  91. package/dist/types/components/iv-dynamic-products/iv-dynamic-products.d.ts +26 -0
  92. package/dist/types/components/iv-dynamic-products-carousel/iv-dynamic-products-carousel.d.ts +29 -0
  93. package/dist/types/components/iv-filters/iv-filters.d.ts +3 -0
  94. package/dist/types/components/iv-layout/iv-layout.d.ts +12 -0
  95. package/dist/types/components/iv-link/iv-link.d.ts +9 -0
  96. package/dist/types/components/iv-modal/iv-modal.d.ts +3 -0
  97. package/dist/types/components/iv-predictive-search/iv-predictive-search.d.ts +44 -0
  98. package/dist/types/components/iv-recently-viewed/iv-recently-viewed.d.ts +17 -0
  99. package/dist/types/components/iv-sidebar/iv-sidebar.d.ts +5 -0
  100. package/dist/types/components/iv-spinner/iv-spinner.d.ts +4 -0
  101. package/dist/types/components/iv-suggest/iv-suggest.d.ts +21 -0
  102. package/dist/types/components/iv-tabs/iv-tabs.d.ts +7 -0
  103. package/dist/types/components/iv-toast/iv-toast.d.ts +7 -0
  104. package/dist/types/components/iv-toast-container/iv-toast-container.d.ts +8 -0
  105. package/dist/types/components/iv-wishlist/iv-wishlist.d.ts +16 -0
  106. package/dist/types/components/iv-wishlist-view/iv-wishlist-view.d.ts +3 -0
  107. package/dist/types/components/sw-in-grid-content/sw-in-grid-content.d.ts +3 -0
  108. package/dist/types/components/sw-size-guide/sw-size-guide.d.ts +14 -0
  109. package/dist/types/components.d.ts +943 -0
  110. package/dist/types/global/app.d.ts +1 -0
  111. package/dist/types/index.d.ts +11 -0
  112. package/dist/types/stencil-public-runtime.d.ts +1746 -0
  113. package/dist/types/utils/caching/factory.d.ts +72 -0
  114. package/dist/types/utils/config/factory.d.ts +2 -0
  115. package/dist/types/utils/error_handling/factory.d.ts +58 -0
  116. package/dist/types/utils/helpers/factory.d.ts +6 -0
  117. package/dist/types/utils/store/store.d.ts +21 -0
  118. package/dist/types/utils/storefront_api/factory.d.ts +22 -0
  119. package/dist/types/utils/utils.d.ts +1 -0
  120. package/loader/cdn.js +1 -0
  121. package/loader/index.cjs.js +1 -0
  122. package/loader/index.d.ts +24 -0
  123. package/loader/index.es2017.js +1 -0
  124. package/loader/index.js +2 -0
  125. package/package.json +54 -0
@@ -0,0 +1,275 @@
1
+ import { d as state, e as showToast } from './index-Py50VI8u.js';
2
+
3
+ async function shopifyFetch(query, variables = {}) {
4
+ try {
5
+ if (!state.shopDomain || !state.storefrontToken)
6
+ throw new Error('Missing Shopify configuration (shopDomain/storefrontToken)');
7
+ const endpoint = `https://${state.shopDomain}/api/2025-07/graphql.json`;
8
+ const token = state.storefrontToken;
9
+ const res = await fetch(endpoint, {
10
+ method: 'POST',
11
+ headers: {
12
+ 'Content-Type': 'application/json',
13
+ 'X-Shopify-Storefront-Access-Token': token
14
+ },
15
+ body: JSON.stringify({ query, variables })
16
+ });
17
+ const json = await res.json();
18
+ if (json.errors)
19
+ throw new Error(json.errors.map((e) => e.message).join(', '));
20
+ return json.data;
21
+ }
22
+ catch (error) {
23
+ console.error('Shopify Fetch Error:', error);
24
+ throw error;
25
+ }
26
+ ;
27
+ }
28
+ ;
29
+ async function getIdFromHandle(handle) {
30
+ const query = `
31
+ query ($handle: String!) {
32
+ product(handle: $handle) {
33
+ id
34
+ }
35
+ }`;
36
+ try {
37
+ const data = await shopifyFetch(query, { handle });
38
+ return data?.product?.id || null;
39
+ }
40
+ catch (error) {
41
+ console.error('getIdFromHandle error:', error);
42
+ return null;
43
+ }
44
+ ;
45
+ }
46
+ ;
47
+ // Field + normalization helpers
48
+ const BASE_PRODUCT_FIELDS = ['id', 'handle', 'title'];
49
+ const DEFAULT_VARIANT_FIELDS = ['id', 'title', 'price { amount currencyCode }'];
50
+ function mergeFields(requested, defaults) {
51
+ const req = (Array.isArray(requested) ? requested : requested.split(','))
52
+ .map(f => f.trim())
53
+ .filter(Boolean);
54
+ const seen = new Set();
55
+ const ordered = [];
56
+ for (const f of req) {
57
+ if (!seen.has(f)) {
58
+ seen.add(f);
59
+ ordered.push(f);
60
+ }
61
+ ;
62
+ }
63
+ ;
64
+ for (const d of defaults) {
65
+ if (!seen.has(d)) {
66
+ seen.add(d);
67
+ ordered.push(d);
68
+ }
69
+ ;
70
+ }
71
+ ;
72
+ return ordered;
73
+ }
74
+ ;
75
+ function expandProductFields(fields) {
76
+ return fields
77
+ .filter(f => f !== 'price')
78
+ .map(f => {
79
+ if (f === 'images')
80
+ return 'images(first: 10) { nodes { url altText } }';
81
+ return f;
82
+ })
83
+ .join('\n');
84
+ }
85
+ ;
86
+ function variantSelection(fields = DEFAULT_VARIANT_FIELDS) {
87
+ return fields.join('\n');
88
+ }
89
+ ;
90
+ ;
91
+ function normalizeProduct(product, selectedVariant) {
92
+ const variant = selectedVariant || product.variants?.edges?.[0]?.node || {};
93
+ let imageUrl = null;
94
+ let imageAlt = null;
95
+ if (product.images?.nodes && product.images.nodes.length > 0) {
96
+ imageUrl = product.images.nodes[0].url || null;
97
+ imageAlt = product.images.nodes[0].altText || null;
98
+ }
99
+ ;
100
+ const { id: variantId, price } = variant;
101
+ return {
102
+ id: product.id,
103
+ ...Object.fromEntries(Object.entries(product).filter(([key]) => key !== 'variants')),
104
+ variantId,
105
+ price: price?.amount || null,
106
+ imageUrl,
107
+ imageAlt,
108
+ };
109
+ }
110
+ ;
111
+ // Query builders
112
+ function buildProductsQuery(fieldsString, variantFieldsString) {
113
+ return `
114
+ query ($limit: Int!, $sortKey: ProductSortKeys!, $reverse: Boolean) {
115
+ products(first: $limit, sortKey: $sortKey, reverse: $reverse) {
116
+ edges {
117
+ node {
118
+ ${fieldsString}
119
+ variants(first: 1) { edges { node { ${variantFieldsString} } } }
120
+ }
121
+ }
122
+ }
123
+ }`;
124
+ }
125
+ ;
126
+ function buildCollectionProductsQuery(fieldsString, variantFieldsString) {
127
+ return `
128
+ query ($handle: String!, $limit: Int!, $sortKey: ProductCollectionSortKeys!, $reverse: Boolean) {
129
+ collection(handle: $handle) {
130
+ products(first: $limit, sortKey: $sortKey, reverse: $reverse) {
131
+ edges {
132
+ node {
133
+ ${fieldsString}
134
+ variants(first: 1) { edges { node { ${variantFieldsString} } } }
135
+ }
136
+ }
137
+ }
138
+ }
139
+ }`;
140
+ }
141
+ ;
142
+ function buildSingleProductQuery(fieldsString, variantFieldsString) {
143
+ return `
144
+ query ($id: ID!) {
145
+ product(id: $id) {
146
+ ${fieldsString}
147
+ variants(first: 1) { edges { node { ${variantFieldsString} } } }
148
+ }
149
+ }`;
150
+ }
151
+ ;
152
+ function buildVariantProductQuery(productFieldsString, variantFieldsString) {
153
+ return `
154
+ query ($id: ID!) {
155
+ productVariant(id: $id) {
156
+ ${variantFieldsString}
157
+ product {
158
+ ${productFieldsString}
159
+ variants(first: 1) { edges { node { ${variantFieldsString} } } }
160
+ }
161
+ }
162
+ }`;
163
+ }
164
+ ;
165
+ // Public API
166
+ async function fetchProducts(limit, collectionHandle, sortKey, fields, reversed = false) {
167
+ try {
168
+ const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);
169
+ const fieldsString = expandProductFields(merged);
170
+ const variantFieldsString = variantSelection();
171
+ const isAll = !collectionHandle || collectionHandle === 'all';
172
+ const query = isAll ? buildProductsQuery(fieldsString, variantFieldsString) : buildCollectionProductsQuery(fieldsString, variantFieldsString);
173
+ const reverse = !!reversed;
174
+ const variables = isAll ? { limit, sortKey, reverse } : { handle: collectionHandle, limit, sortKey, reverse };
175
+ const data = await shopifyFetch(query, variables);
176
+ const productEdges = data.products?.edges || data.collection?.products?.edges || [];
177
+ return productEdges.map((edge) => normalizeProduct(edge.node));
178
+ }
179
+ catch (error) {
180
+ console.error('Fetch Products Error:', error);
181
+ throw error;
182
+ }
183
+ ;
184
+ }
185
+ ;
186
+ async function fetchProductByID(id, fields, options) {
187
+ try {
188
+ if (options?.variantId)
189
+ return await getVariantProduct(options.variantId, fields);
190
+ const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);
191
+ const fieldsString = expandProductFields(merged);
192
+ const variantFieldsString = variantSelection();
193
+ const query = buildSingleProductQuery(fieldsString, variantFieldsString);
194
+ const data = await shopifyFetch(query, { id });
195
+ const product = data?.product;
196
+ if (!product)
197
+ return null;
198
+ return normalizeProduct(product);
199
+ }
200
+ catch (error) {
201
+ console.error('Fetch Product By ID Error:', error);
202
+ throw error;
203
+ }
204
+ ;
205
+ }
206
+ ;
207
+ async function getVariantProduct(variantId, fields) {
208
+ try {
209
+ const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);
210
+ const productFieldsString = expandProductFields(merged);
211
+ const variantFieldsString = variantSelection();
212
+ const query = buildVariantProductQuery(productFieldsString, variantFieldsString);
213
+ const data = await shopifyFetch(query, { id: variantId });
214
+ const variantNode = data?.productVariant;
215
+ if (!variantNode)
216
+ return null;
217
+ const product = variantNode.product;
218
+ if (!product)
219
+ return null;
220
+ return normalizeProduct(product, variantNode);
221
+ }
222
+ catch (error) {
223
+ console.error('Get Variant Product Error:', error);
224
+ throw error;
225
+ }
226
+ ;
227
+ }
228
+ ;
229
+ async function addToCart(options) {
230
+ try {
231
+ console.log('IV add to cart called');
232
+ if (!options.id)
233
+ throw new Error('No variant id provided for addToCart');
234
+ const quantity = options.quantity || 1;
235
+ const properties = options.properties || {};
236
+ const payload = {
237
+ items: [
238
+ {
239
+ id: options.id,
240
+ quantity,
241
+ properties
242
+ }
243
+ ]
244
+ };
245
+ const url = '/cart/add.js';
246
+ const res = await fetch(url, {
247
+ method: 'POST',
248
+ headers: {
249
+ 'Content-Type': 'application/json',
250
+ 'Accept': 'application/json',
251
+ 'X-Requested-With': 'XMLHttpRequest'
252
+ },
253
+ body: JSON.stringify(payload)
254
+ });
255
+ if (!res.ok) {
256
+ const errorText = await res.text();
257
+ throw new Error(errorText);
258
+ }
259
+ ;
260
+ const cartItem = await res.json();
261
+ showToast('Added to cart!', 'success', 3000);
262
+ return cartItem;
263
+ }
264
+ catch (error) {
265
+ showToast('Error adding to cart', 'error', 5000);
266
+ throw error;
267
+ }
268
+ ;
269
+ }
270
+ ;
271
+
272
+ export { fetchProductByID as a, addToCart as b, fetchProducts as f, getIdFromHandle as g };
273
+ //# sourceMappingURL=factory-1QinX-o0.js.map
274
+
275
+ //# sourceMappingURL=factory-1QinX-o0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory-1QinX-o0.js","sources":["src/utils/storefront_api/factory.ts"],"sourcesContent":["import { state, showToast } from \"../store/store\";\n\nasync function shopifyFetch(query: string, variables: Record<string, any> = {}): Promise<any> {\n try {\n if(!state.shopDomain || !state.storefrontToken) throw new Error('Missing Shopify configuration (shopDomain/storefrontToken)');\n const endpoint = `https://${state.shopDomain}/api/2025-07/graphql.json`;\n const token = state.storefrontToken;\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Shopify-Storefront-Access-Token': token\n },\n body: JSON.stringify({ query, variables })\n });\n const json = await res.json();\n if(json.errors) throw new Error(json.errors.map((e: any) => e.message).join(', '));\n return json.data;\n } catch(error) {\n console.error('Shopify Fetch Error:', error);\n throw error; \n };\n};\n\nexport async function getIdFromHandle(handle: string): Promise<string | null> {\n const query = `\n query ($handle: String!) {\n product(handle: $handle) {\n id\n }\n }`;\n try {\n const data = await shopifyFetch(query, { handle });\n return data?.product?.id || null;\n } catch (error) {\n console.error('getIdFromHandle error:', error);\n return null;\n };\n};\n\n// Field + normalization helpers\nconst BASE_PRODUCT_FIELDS = ['id','handle','title'];\nconst DEFAULT_VARIANT_FIELDS = ['id','title','price { amount currencyCode }'];\n\nfunction mergeFields(requested: string[] | string, defaults: string[]): string[] {\n const req = (Array.isArray(requested) ? requested : requested.split(','))\n .map(f => f.trim())\n .filter(Boolean);\n const seen = new Set<string>();\n const ordered: string[] = [];\n for(const f of req) { \n if(!seen.has(f)) { \n seen.add(f); ordered.push(f); \n }; \n };\n for(const d of defaults) { \n if(!seen.has(d)) { \n seen.add(d); \n ordered.push(d); \n }; \n };\n return ordered;\n};\n\nfunction expandProductFields(fields: string[]): string {\n return fields\n .filter(f => f !== 'price')\n .map(f => {\n if(f === 'images') return 'images(first: 10) { nodes { url altText } }';\n return f;\n })\n .join('\\n');\n};\n\nfunction variantSelection(fields: string[] = DEFAULT_VARIANT_FIELDS): string {\n return fields.join('\\n');\n};\n\ninterface NormalizedProduct {\n id: string;\n handle?: string;\n title?: string;\n variantId?: string;\n price?: string | null;\n imageUrl?: string | null;\n imageAlt?: string | null;\n // index signature for dynamic requested fields\n [key: string]: any;\n};\n\nfunction normalizeProduct(product: any, selectedVariant?: any): NormalizedProduct {\n const variant = selectedVariant || product.variants?.edges?.[0]?.node || {};\n let imageUrl = null;\n let imageAlt = null;\n if(product.images?.nodes && product.images.nodes.length > 0) {\n imageUrl = product.images.nodes[0].url || null;\n imageAlt = product.images.nodes[0].altText || null;\n };\n const { id: variantId, price } = variant;\n return {\n id: product.id,\n ...Object.fromEntries(Object.entries(product).filter(([key]) => key !== 'variants')),\n variantId,\n price: price?.amount || null,\n imageUrl,\n imageAlt,\n };\n};\n\n// Query builders\nfunction buildProductsQuery(fieldsString: string, variantFieldsString: string) {\n return `\n query ($limit: Int!, $sortKey: ProductSortKeys!, $reverse: Boolean) {\n products(first: $limit, sortKey: $sortKey, reverse: $reverse) {\n edges {\n node {\n ${fieldsString}\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\n }\n }\n }\n }`;\n};\n\nfunction buildCollectionProductsQuery(fieldsString: string, variantFieldsString: string) {\n return `\n query ($handle: String!, $limit: Int!, $sortKey: ProductCollectionSortKeys!, $reverse: Boolean) {\n collection(handle: $handle) {\n products(first: $limit, sortKey: $sortKey, reverse: $reverse) {\n edges {\n node {\n ${fieldsString}\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\n }\n }\n }\n }\n }`;\n};\n\nfunction buildSingleProductQuery(fieldsString: string, variantFieldsString: string) {\n return `\n query ($id: ID!) {\n product(id: $id) {\n ${fieldsString}\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\n }\n }`;\n};\n\nfunction buildVariantProductQuery(productFieldsString: string, variantFieldsString: string) {\n return `\n query ($id: ID!) {\n productVariant(id: $id) {\n ${variantFieldsString}\n product {\n ${productFieldsString}\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\n }\n }\n }`;\n};\n\n// Public API\nexport async function fetchProducts(limit: number, collectionHandle: string, sortKey: string, fields: string[] | string, reversed: boolean = false) {\n try {\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\n const fieldsString = expandProductFields(merged);\n const variantFieldsString = variantSelection();\n const isAll = !collectionHandle || collectionHandle === 'all';\n const query = isAll ? buildProductsQuery(fieldsString, variantFieldsString) : buildCollectionProductsQuery(fieldsString, variantFieldsString);\n const reverse = !!reversed;\n const variables: Record<string, any> = isAll ? { limit, sortKey, reverse } : { handle: collectionHandle, limit, sortKey, reverse };\n const data = await shopifyFetch(query, variables);\n const productEdges = data.products?.edges || data.collection?.products?.edges || [];\n return productEdges.map((edge: any) => normalizeProduct(edge.node));\n } catch(error) { \n console.error('Fetch Products Error:', error); throw error;\n };\n};\n\nexport async function fetchProductByID(id: string, fields: string[] | string, options?: { variantId?: string }): Promise<NormalizedProduct | null> {\n try {\n if(options?.variantId) return await getVariantProduct(options.variantId, fields);\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\n const fieldsString = expandProductFields(merged);\n const variantFieldsString = variantSelection();\n const query = buildSingleProductQuery(fieldsString, variantFieldsString);\n const data = await shopifyFetch(query, { id });\n const product = data?.product;\n if(!product) return null;\n return normalizeProduct(product);\n } catch(error) { console.error('Fetch Product By ID Error:', error); throw error; };\n};\n\nexport async function getVariantProduct(variantId: string, fields: string[] | string): Promise<NormalizedProduct | null> {\n try {\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\n const productFieldsString = expandProductFields(merged);\n const variantFieldsString = variantSelection();\n const query = buildVariantProductQuery(productFieldsString, variantFieldsString);\n const data = await shopifyFetch(query, { id: variantId });\n const variantNode = data?.productVariant;\n if(!variantNode) return null;\n const product = variantNode.product;\n if(!product) return null;\n return normalizeProduct(product, variantNode); \n } catch(error) { console.error('Get Variant Product Error:', error); throw error; };\n};\n\nexport async function addToCart(options: {\n id: number;\n quantity?: number;\n properties?: Record<string, any>;\n}) {\n try {\n console.log('IV add to cart called');\n if(!options.id) throw new Error('No variant id provided for addToCart');\n const quantity = options.quantity || 1;\n const properties = options.properties || {};\n const payload = {\n items: [\n {\n id: options.id,\n quantity,\n properties\n }\n ]\n };\n const url = '/cart/add.js';\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'X-Requested-With': 'XMLHttpRequest'\n },\n body: JSON.stringify(payload)\n });\n if(!res.ok) {\n const errorText = await res.text();\n throw new Error(errorText);\n };\n const cartItem = await res.json();\n showToast('Added to cart!', 'success', 3000);\n return cartItem;\n } catch (error) {\n showToast('Error adding to cart', 'error', 5000);\n throw error;\n };\n};"],"names":[],"mappings":"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"}