@doswiftly/cli 0.1.1

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 (453) hide show
  1. package/README.md +357 -0
  2. package/bin/doswiftly.js +2 -0
  3. package/dist/commands/auth-github.d.ts +6 -0
  4. package/dist/commands/auth-github.d.ts.map +1 -0
  5. package/dist/commands/auth-github.js +89 -0
  6. package/dist/commands/auth-github.js.map +1 -0
  7. package/dist/commands/auth-token.d.ts +12 -0
  8. package/dist/commands/auth-token.d.ts.map +1 -0
  9. package/dist/commands/auth-token.js +43 -0
  10. package/dist/commands/auth-token.js.map +1 -0
  11. package/dist/commands/auth.d.ts +22 -0
  12. package/dist/commands/auth.d.ts.map +1 -0
  13. package/dist/commands/auth.js +348 -0
  14. package/dist/commands/auth.js.map +1 -0
  15. package/dist/commands/check.d.ts +5 -0
  16. package/dist/commands/check.d.ts.map +1 -0
  17. package/dist/commands/check.js +234 -0
  18. package/dist/commands/check.js.map +1 -0
  19. package/dist/commands/config.d.ts +3 -0
  20. package/dist/commands/config.d.ts.map +1 -0
  21. package/dist/commands/config.js +104 -0
  22. package/dist/commands/config.js.map +1 -0
  23. package/dist/commands/deploy.d.ts +37 -0
  24. package/dist/commands/deploy.d.ts.map +1 -0
  25. package/dist/commands/deploy.js +580 -0
  26. package/dist/commands/deploy.js.map +1 -0
  27. package/dist/commands/dev.d.ts +8 -0
  28. package/dist/commands/dev.d.ts.map +1 -0
  29. package/dist/commands/dev.js +83 -0
  30. package/dist/commands/dev.js.map +1 -0
  31. package/dist/commands/doctor.d.ts +5 -0
  32. package/dist/commands/doctor.d.ts.map +1 -0
  33. package/dist/commands/doctor.js +363 -0
  34. package/dist/commands/doctor.js.map +1 -0
  35. package/dist/commands/domain.d.ts +13 -0
  36. package/dist/commands/domain.d.ts.map +1 -0
  37. package/dist/commands/domain.js +128 -0
  38. package/dist/commands/domain.js.map +1 -0
  39. package/dist/commands/env.d.ts +25 -0
  40. package/dist/commands/env.d.ts.map +1 -0
  41. package/dist/commands/env.js +228 -0
  42. package/dist/commands/env.js.map +1 -0
  43. package/dist/commands/init.d.ts +11 -0
  44. package/dist/commands/init.d.ts.map +1 -0
  45. package/dist/commands/init.js +1028 -0
  46. package/dist/commands/init.js.map +1 -0
  47. package/dist/commands/inspect.d.ts +12 -0
  48. package/dist/commands/inspect.d.ts.map +1 -0
  49. package/dist/commands/inspect.js +162 -0
  50. package/dist/commands/inspect.js.map +1 -0
  51. package/dist/commands/migrate.d.ts +18 -0
  52. package/dist/commands/migrate.d.ts.map +1 -0
  53. package/dist/commands/migrate.js +355 -0
  54. package/dist/commands/migrate.js.map +1 -0
  55. package/dist/commands/preview.d.ts +29 -0
  56. package/dist/commands/preview.d.ts.map +1 -0
  57. package/dist/commands/preview.js +199 -0
  58. package/dist/commands/preview.js.map +1 -0
  59. package/dist/commands/proxy.d.ts +9 -0
  60. package/dist/commands/proxy.d.ts.map +1 -0
  61. package/dist/commands/proxy.js +37 -0
  62. package/dist/commands/proxy.js.map +1 -0
  63. package/dist/commands/sdk.d.ts +5 -0
  64. package/dist/commands/sdk.d.ts.map +1 -0
  65. package/dist/commands/sdk.js +82 -0
  66. package/dist/commands/sdk.js.map +1 -0
  67. package/dist/commands/template.d.ts +107 -0
  68. package/dist/commands/template.d.ts.map +1 -0
  69. package/dist/commands/template.js +1309 -0
  70. package/dist/commands/template.js.map +1 -0
  71. package/dist/commands/types.d.ts +5 -0
  72. package/dist/commands/types.d.ts.map +1 -0
  73. package/dist/commands/types.js +82 -0
  74. package/dist/commands/types.js.map +1 -0
  75. package/dist/commands/update.d.ts +2 -0
  76. package/dist/commands/update.d.ts.map +1 -0
  77. package/dist/commands/update.js +103 -0
  78. package/dist/commands/update.js.map +1 -0
  79. package/dist/commands/upgrade.d.ts +18 -0
  80. package/dist/commands/upgrade.d.ts.map +1 -0
  81. package/dist/commands/upgrade.js +55 -0
  82. package/dist/commands/upgrade.js.map +1 -0
  83. package/dist/commands/verify.d.ts +5 -0
  84. package/dist/commands/verify.d.ts.map +1 -0
  85. package/dist/commands/verify.js +232 -0
  86. package/dist/commands/verify.js.map +1 -0
  87. package/dist/commands/whoami.d.ts +5 -0
  88. package/dist/commands/whoami.d.ts.map +1 -0
  89. package/dist/commands/whoami.js +60 -0
  90. package/dist/commands/whoami.js.map +1 -0
  91. package/dist/config/types.d.ts +173 -0
  92. package/dist/config/types.d.ts.map +1 -0
  93. package/dist/config/types.js +48 -0
  94. package/dist/config/types.js.map +1 -0
  95. package/dist/index.d.ts +3 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +416 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/lib/api-url.d.ts +14 -0
  100. package/dist/lib/api-url.d.ts.map +1 -0
  101. package/dist/lib/api-url.js +24 -0
  102. package/dist/lib/api-url.js.map +1 -0
  103. package/dist/lib/api.d.ts +67 -0
  104. package/dist/lib/api.d.ts.map +1 -0
  105. package/dist/lib/api.js +36 -0
  106. package/dist/lib/api.js.map +1 -0
  107. package/dist/lib/config.d.ts +39 -0
  108. package/dist/lib/config.d.ts.map +1 -0
  109. package/dist/lib/config.js +195 -0
  110. package/dist/lib/config.js.map +1 -0
  111. package/dist/lib/env-storage.d.ts +140 -0
  112. package/dist/lib/env-storage.d.ts.map +1 -0
  113. package/dist/lib/env-storage.js +464 -0
  114. package/dist/lib/env-storage.js.map +1 -0
  115. package/dist/lib/errors.d.ts +61 -0
  116. package/dist/lib/errors.d.ts.map +1 -0
  117. package/dist/lib/errors.js +204 -0
  118. package/dist/lib/errors.js.map +1 -0
  119. package/dist/lib/i18n.d.ts +99 -0
  120. package/dist/lib/i18n.d.ts.map +1 -0
  121. package/dist/lib/i18n.js +184 -0
  122. package/dist/lib/i18n.js.map +1 -0
  123. package/dist/lib/logger.d.ts +95 -0
  124. package/dist/lib/logger.d.ts.map +1 -0
  125. package/dist/lib/logger.js +168 -0
  126. package/dist/lib/logger.js.map +1 -0
  127. package/dist/lib/package-manager.d.ts +91 -0
  128. package/dist/lib/package-manager.d.ts.map +1 -0
  129. package/dist/lib/package-manager.js +205 -0
  130. package/dist/lib/package-manager.js.map +1 -0
  131. package/dist/lib/proxy-server.d.ts +24 -0
  132. package/dist/lib/proxy-server.d.ts.map +1 -0
  133. package/dist/lib/proxy-server.js +173 -0
  134. package/dist/lib/proxy-server.js.map +1 -0
  135. package/dist/lib/select-with-back.d.ts +34 -0
  136. package/dist/lib/select-with-back.d.ts.map +1 -0
  137. package/dist/lib/select-with-back.js +94 -0
  138. package/dist/lib/select-with-back.js.map +1 -0
  139. package/dist/lib/shared-api-client.d.ts +40 -0
  140. package/dist/lib/shared-api-client.d.ts.map +1 -0
  141. package/dist/lib/shared-api-client.js +92 -0
  142. package/dist/lib/shared-api-client.js.map +1 -0
  143. package/dist/lib/wizard-engine.d.ts +128 -0
  144. package/dist/lib/wizard-engine.d.ts.map +1 -0
  145. package/dist/lib/wizard-engine.js +168 -0
  146. package/dist/lib/wizard-engine.js.map +1 -0
  147. package/package.json +85 -0
  148. package/templates/storefront-minimal/.env.example +10 -0
  149. package/templates/storefront-minimal/.github/workflows/build-template.yml +109 -0
  150. package/templates/storefront-minimal/app/globals.css +18 -0
  151. package/templates/storefront-minimal/app/layout.tsx +26 -0
  152. package/templates/storefront-minimal/app/page.tsx +93 -0
  153. package/templates/storefront-minimal/lib/graphql-client.ts +23 -0
  154. package/templates/storefront-minimal/next.config.ts +15 -0
  155. package/templates/storefront-minimal/open-next.config.ts +3 -0
  156. package/templates/storefront-minimal/package.json +30 -0
  157. package/templates/storefront-minimal/postcss.config.mjs +5 -0
  158. package/templates/storefront-minimal/tailwind.config.ts +14 -0
  159. package/templates/storefront-minimal/tsconfig.json +27 -0
  160. package/templates/storefront-minimal/wrangler.toml +9 -0
  161. package/templates/storefront-nextjs/.env.example +68 -0
  162. package/templates/storefront-nextjs/.github/workflows/build-template.yml +109 -0
  163. package/templates/storefront-nextjs/.github/workflows/deploy.yml +25 -0
  164. package/templates/storefront-nextjs/.github/workflows/preview.yml +22 -0
  165. package/templates/storefront-nextjs/README.md +520 -0
  166. package/templates/storefront-nextjs/app/account/orders/page.tsx +216 -0
  167. package/templates/storefront-nextjs/app/account/page.tsx +167 -0
  168. package/templates/storefront-nextjs/app/auth/login/page.tsx +135 -0
  169. package/templates/storefront-nextjs/app/auth/register/page.tsx +228 -0
  170. package/templates/storefront-nextjs/app/cart/page.tsx +263 -0
  171. package/templates/storefront-nextjs/app/categories/[slug]/page.tsx +200 -0
  172. package/templates/storefront-nextjs/app/categories/page.tsx +58 -0
  173. package/templates/storefront-nextjs/app/checkout/page.tsx +351 -0
  174. package/templates/storefront-nextjs/app/collections/[slug]/page.tsx +158 -0
  175. package/templates/storefront-nextjs/app/collections/page.tsx +61 -0
  176. package/templates/storefront-nextjs/app/globals.css +98 -0
  177. package/templates/storefront-nextjs/app/layout.tsx +39 -0
  178. package/templates/storefront-nextjs/app/page.tsx +136 -0
  179. package/templates/storefront-nextjs/app/products/[slug]/page.tsx +119 -0
  180. package/templates/storefront-nextjs/app/products/page.tsx +107 -0
  181. package/templates/storefront-nextjs/app/search/page.tsx +127 -0
  182. package/templates/storefront-nextjs/components/auth/auth-guard.tsx +94 -0
  183. package/templates/storefront-nextjs/components/commerce/add-to-cart-button.tsx +77 -0
  184. package/templates/storefront-nextjs/components/commerce/cart-icon.tsx +29 -0
  185. package/templates/storefront-nextjs/components/commerce/currency-selector.tsx +217 -0
  186. package/templates/storefront-nextjs/components/commerce/pagination.tsx +62 -0
  187. package/templates/storefront-nextjs/components/commerce/product-actions.tsx +135 -0
  188. package/templates/storefront-nextjs/components/commerce/product-filters.tsx +109 -0
  189. package/templates/storefront-nextjs/components/commerce/product-price.tsx +375 -0
  190. package/templates/storefront-nextjs/components/commerce/search-input.tsx +178 -0
  191. package/templates/storefront-nextjs/components/commerce/sort-select.tsx +64 -0
  192. package/templates/storefront-nextjs/components/commerce/variant-selector.tsx +210 -0
  193. package/templates/storefront-nextjs/components/layout/footer.tsx +107 -0
  194. package/templates/storefront-nextjs/components/layout/header.tsx +104 -0
  195. package/templates/storefront-nextjs/components/providers.tsx +62 -0
  196. package/templates/storefront-nextjs/lib/auth/routes.ts +52 -0
  197. package/templates/storefront-nextjs/lib/currency.tsx +140 -0
  198. package/templates/storefront-nextjs/lib/format.ts +159 -0
  199. package/templates/storefront-nextjs/lib/graphql-queries.ts +629 -0
  200. package/templates/storefront-nextjs/lib/hooks.ts +30 -0
  201. package/templates/storefront-nextjs/middleware.ts +80 -0
  202. package/templates/storefront-nextjs/next.config.ts +37 -0
  203. package/templates/storefront-nextjs/open-next.config.ts +3 -0
  204. package/templates/storefront-nextjs/package.dev.json +30 -0
  205. package/templates/storefront-nextjs/package.json +32 -0
  206. package/templates/storefront-nextjs/package.json.template +32 -0
  207. package/templates/storefront-nextjs/postcss.config.mjs +8 -0
  208. package/templates/storefront-nextjs/tailwind.config.ts +111 -0
  209. package/templates/storefront-nextjs/tsconfig.json +27 -0
  210. package/templates/storefront-nextjs/wrangler.toml +9 -0
  211. package/templates/storefront-nextjs-shadcn/.env.example +68 -0
  212. package/templates/storefront-nextjs-shadcn/.github/workflows/build-template.yml +109 -0
  213. package/templates/storefront-nextjs-shadcn/.github/workflows/deploy.yml +25 -0
  214. package/templates/storefront-nextjs-shadcn/.github/workflows/preview.yml +22 -0
  215. package/templates/storefront-nextjs-shadcn/CART_INTEGRATION.md +282 -0
  216. package/templates/storefront-nextjs-shadcn/CLAUDE.md +96 -0
  217. package/templates/storefront-nextjs-shadcn/GRAPHQL_DOCUMENT_NAMES.md +190 -0
  218. package/templates/storefront-nextjs-shadcn/GRAPHQL_ERROR_HANDLING.md +263 -0
  219. package/templates/storefront-nextjs-shadcn/GRAPHQL_FIXES_SUMMARY.md +135 -0
  220. package/templates/storefront-nextjs-shadcn/GRAPHQL_INTEGRATION_COMPLETE.md +142 -0
  221. package/templates/storefront-nextjs-shadcn/INTEGRATION_CHECKLIST.md +448 -0
  222. package/templates/storefront-nextjs-shadcn/PRODUCT_DETAIL_PAGE_IMPLEMENTATION.md +307 -0
  223. package/templates/storefront-nextjs-shadcn/README.md +195 -0
  224. package/templates/storefront-nextjs-shadcn/THEME_CUSTOMIZATION.md +245 -0
  225. package/templates/storefront-nextjs-shadcn/app/about/page.tsx +34 -0
  226. package/templates/storefront-nextjs-shadcn/app/account/addresses/page.tsx +215 -0
  227. package/templates/storefront-nextjs-shadcn/app/account/loyalty/page.tsx +484 -0
  228. package/templates/storefront-nextjs-shadcn/app/account/orders/[id]/page.tsx +128 -0
  229. package/templates/storefront-nextjs-shadcn/app/account/orders/[id]/tracking/page.tsx +206 -0
  230. package/templates/storefront-nextjs-shadcn/app/account/orders/page.tsx +80 -0
  231. package/templates/storefront-nextjs-shadcn/app/account/page.tsx +107 -0
  232. package/templates/storefront-nextjs-shadcn/app/account/settings/page.tsx +195 -0
  233. package/templates/storefront-nextjs-shadcn/app/api/auth/clear-token/route.ts +87 -0
  234. package/templates/storefront-nextjs-shadcn/app/api/auth/set-token/route.ts +125 -0
  235. package/templates/storefront-nextjs-shadcn/app/auth/forgot-password/page.tsx +131 -0
  236. package/templates/storefront-nextjs-shadcn/app/auth/login/page.tsx +24 -0
  237. package/templates/storefront-nextjs-shadcn/app/auth/register/page.tsx +20 -0
  238. package/templates/storefront-nextjs-shadcn/app/blog/[slug]/page.tsx +323 -0
  239. package/templates/storefront-nextjs-shadcn/app/blog/page.tsx +159 -0
  240. package/templates/storefront-nextjs-shadcn/app/brands/[slug]/page.tsx +170 -0
  241. package/templates/storefront-nextjs-shadcn/app/brands/page.tsx +73 -0
  242. package/templates/storefront-nextjs-shadcn/app/cart/page.tsx +165 -0
  243. package/templates/storefront-nextjs-shadcn/app/categories/[slug]/page.tsx +78 -0
  244. package/templates/storefront-nextjs-shadcn/app/categories/page.tsx +75 -0
  245. package/templates/storefront-nextjs-shadcn/app/checkout/page.tsx +1752 -0
  246. package/templates/storefront-nextjs-shadcn/app/checkout/success/[orderId]/page.tsx +256 -0
  247. package/templates/storefront-nextjs-shadcn/app/collections/[handle]/page.tsx +74 -0
  248. package/templates/storefront-nextjs-shadcn/app/collections/page.tsx +75 -0
  249. package/templates/storefront-nextjs-shadcn/app/contact/page.tsx +114 -0
  250. package/templates/storefront-nextjs-shadcn/app/error.tsx +90 -0
  251. package/templates/storefront-nextjs-shadcn/app/globals.css +125 -0
  252. package/templates/storefront-nextjs-shadcn/app/layout.tsx +57 -0
  253. package/templates/storefront-nextjs-shadcn/app/not-found.tsx +68 -0
  254. package/templates/storefront-nextjs-shadcn/app/page.tsx +21 -0
  255. package/templates/storefront-nextjs-shadcn/app/products/[slug]/page.tsx +246 -0
  256. package/templates/storefront-nextjs-shadcn/app/products/[slug]/product-client.tsx +343 -0
  257. package/templates/storefront-nextjs-shadcn/app/products/page.tsx +25 -0
  258. package/templates/storefront-nextjs-shadcn/app/products/products-client.tsx +192 -0
  259. package/templates/storefront-nextjs-shadcn/app/returns/page.tsx +77 -0
  260. package/templates/storefront-nextjs-shadcn/app/robots.ts +53 -0
  261. package/templates/storefront-nextjs-shadcn/app/search/page.tsx +16 -0
  262. package/templates/storefront-nextjs-shadcn/app/search/search-client.tsx +47 -0
  263. package/templates/storefront-nextjs-shadcn/app/shipping/page.tsx +62 -0
  264. package/templates/storefront-nextjs-shadcn/app/sitemap.ts +144 -0
  265. package/templates/storefront-nextjs-shadcn/app/wishlist/page.tsx +179 -0
  266. package/templates/storefront-nextjs-shadcn/codegen.ts +51 -0
  267. package/templates/storefront-nextjs-shadcn/components/account/address-form.tsx +348 -0
  268. package/templates/storefront-nextjs-shadcn/components/account/address-list.tsx +144 -0
  269. package/templates/storefront-nextjs-shadcn/components/account/order-details.tsx +258 -0
  270. package/templates/storefront-nextjs-shadcn/components/account/order-history.tsx +107 -0
  271. package/templates/storefront-nextjs-shadcn/components/auth/account-menu.tsx +132 -0
  272. package/templates/storefront-nextjs-shadcn/components/auth/login-form.tsx +188 -0
  273. package/templates/storefront-nextjs-shadcn/components/auth/register-form.tsx +305 -0
  274. package/templates/storefront-nextjs-shadcn/components/blog/blog-card.tsx +240 -0
  275. package/templates/storefront-nextjs-shadcn/components/blog/blog-sidebar.tsx +177 -0
  276. package/templates/storefront-nextjs-shadcn/components/blog/index.ts +8 -0
  277. package/templates/storefront-nextjs-shadcn/components/brand/brand-card.tsx +119 -0
  278. package/templates/storefront-nextjs-shadcn/components/brand/brand-grid.tsx +64 -0
  279. package/templates/storefront-nextjs-shadcn/components/cart/cart-drawer.tsx +140 -0
  280. package/templates/storefront-nextjs-shadcn/components/cart/cart-icon.tsx +48 -0
  281. package/templates/storefront-nextjs-shadcn/components/cart/cart-item.tsx +112 -0
  282. package/templates/storefront-nextjs-shadcn/components/cart/cart-summary.tsx +84 -0
  283. package/templates/storefront-nextjs-shadcn/components/cart/index.ts +17 -0
  284. package/templates/storefront-nextjs-shadcn/components/cart/promo-code-input.tsx +121 -0
  285. package/templates/storefront-nextjs-shadcn/components/cart/shipping-estimator.tsx +162 -0
  286. package/templates/storefront-nextjs-shadcn/components/checkout/index.ts +25 -0
  287. package/templates/storefront-nextjs-shadcn/components/checkout/payment-method-card.tsx +187 -0
  288. package/templates/storefront-nextjs-shadcn/components/checkout/payment-step.tsx +160 -0
  289. package/templates/storefront-nextjs-shadcn/components/checkout/tax-breakdown.tsx +154 -0
  290. package/templates/storefront-nextjs-shadcn/components/commerce/currency-selector.tsx +225 -0
  291. package/templates/storefront-nextjs-shadcn/components/commerce/pagination.tsx +62 -0
  292. package/templates/storefront-nextjs-shadcn/components/commerce/product-actions.tsx +158 -0
  293. package/templates/storefront-nextjs-shadcn/components/commerce/search-input.tsx +174 -0
  294. package/templates/storefront-nextjs-shadcn/components/commerce/variant-selector.tsx +210 -0
  295. package/templates/storefront-nextjs-shadcn/components/common/category-card.tsx +97 -0
  296. package/templates/storefront-nextjs-shadcn/components/common/collection-card.tsx +187 -0
  297. package/templates/storefront-nextjs-shadcn/components/common/price-display.tsx +151 -0
  298. package/templates/storefront-nextjs-shadcn/components/common/social-share.tsx +166 -0
  299. package/templates/storefront-nextjs-shadcn/components/discount/discount-breakdown.tsx +245 -0
  300. package/templates/storefront-nextjs-shadcn/components/discount/discount-code-input.tsx +246 -0
  301. package/templates/storefront-nextjs-shadcn/components/discount/index.ts +19 -0
  302. package/templates/storefront-nextjs-shadcn/components/error/error-boundary.tsx +113 -0
  303. package/templates/storefront-nextjs-shadcn/components/error/index.ts +7 -0
  304. package/templates/storefront-nextjs-shadcn/components/filters/attribute-filter.tsx +153 -0
  305. package/templates/storefront-nextjs-shadcn/components/filters/checkbox-group-filter.tsx +167 -0
  306. package/templates/storefront-nextjs-shadcn/components/filters/color-swatch-filter.tsx +176 -0
  307. package/templates/storefront-nextjs-shadcn/components/filters/dynamic-attribute-filters.tsx +220 -0
  308. package/templates/storefront-nextjs-shadcn/components/filters/index.ts +36 -0
  309. package/templates/storefront-nextjs-shadcn/components/filters/range-slider-filter.tsx +193 -0
  310. package/templates/storefront-nextjs-shadcn/components/filters/toggle-filter.tsx +132 -0
  311. package/templates/storefront-nextjs-shadcn/components/gift-card/gift-card-balance.tsx +321 -0
  312. package/templates/storefront-nextjs-shadcn/components/gift-card/gift-card-input.tsx +309 -0
  313. package/templates/storefront-nextjs-shadcn/components/gift-card/index.ts +24 -0
  314. package/templates/storefront-nextjs-shadcn/components/home/category-grid.tsx +72 -0
  315. package/templates/storefront-nextjs-shadcn/components/home/featured-collections.tsx +107 -0
  316. package/templates/storefront-nextjs-shadcn/components/home/featured-products.tsx +85 -0
  317. package/templates/storefront-nextjs-shadcn/components/home/hero-section.tsx +34 -0
  318. package/templates/storefront-nextjs-shadcn/components/home/index.ts +8 -0
  319. package/templates/storefront-nextjs-shadcn/components/home/newsletter-signup.tsx +108 -0
  320. package/templates/storefront-nextjs-shadcn/components/layout/breadcrumbs.tsx +133 -0
  321. package/templates/storefront-nextjs-shadcn/components/layout/currency-selector.tsx +341 -0
  322. package/templates/storefront-nextjs-shadcn/components/layout/footer.tsx +128 -0
  323. package/templates/storefront-nextjs-shadcn/components/layout/header.tsx +147 -0
  324. package/templates/storefront-nextjs-shadcn/components/layout/index.ts +9 -0
  325. package/templates/storefront-nextjs-shadcn/components/layout/mobile-menu.tsx +211 -0
  326. package/templates/storefront-nextjs-shadcn/components/layout/navigation.tsx +95 -0
  327. package/templates/storefront-nextjs-shadcn/components/layout/theme-switcher.tsx +192 -0
  328. package/templates/storefront-nextjs-shadcn/components/loyalty/index.ts +11 -0
  329. package/templates/storefront-nextjs-shadcn/components/loyalty/points-balance.tsx +93 -0
  330. package/templates/storefront-nextjs-shadcn/components/loyalty/points-history.tsx +177 -0
  331. package/templates/storefront-nextjs-shadcn/components/loyalty/referral-section.tsx +250 -0
  332. package/templates/storefront-nextjs-shadcn/components/loyalty/rewards-catalog.tsx +217 -0
  333. package/templates/storefront-nextjs-shadcn/components/loyalty/tier-badge.tsx +106 -0
  334. package/templates/storefront-nextjs-shadcn/components/loyalty/tier-progress.tsx +131 -0
  335. package/templates/storefront-nextjs-shadcn/components/order/delivery-estimate.tsx +196 -0
  336. package/templates/storefront-nextjs-shadcn/components/order/index.ts +11 -0
  337. package/templates/storefront-nextjs-shadcn/components/order/order-tracking.tsx +200 -0
  338. package/templates/storefront-nextjs-shadcn/components/order/shipment-card.tsx +407 -0
  339. package/templates/storefront-nextjs-shadcn/components/order/tracking-status.tsx +222 -0
  340. package/templates/storefront-nextjs-shadcn/components/order/tracking-timeline.tsx +205 -0
  341. package/templates/storefront-nextjs-shadcn/components/product/add-to-cart-button.tsx +161 -0
  342. package/templates/storefront-nextjs-shadcn/components/product/b2b-price-display.tsx +250 -0
  343. package/templates/storefront-nextjs-shadcn/components/product/discount-badge.tsx +196 -0
  344. package/templates/storefront-nextjs-shadcn/components/product/index.ts +41 -0
  345. package/templates/storefront-nextjs-shadcn/components/product/product-card.tsx +147 -0
  346. package/templates/storefront-nextjs-shadcn/components/product/product-filters.tsx +217 -0
  347. package/templates/storefront-nextjs-shadcn/components/product/product-gallery.tsx +143 -0
  348. package/templates/storefront-nextjs-shadcn/components/product/product-grid.tsx +83 -0
  349. package/templates/storefront-nextjs-shadcn/components/product/product-image.tsx +155 -0
  350. package/templates/storefront-nextjs-shadcn/components/product/product-price.tsx +158 -0
  351. package/templates/storefront-nextjs-shadcn/components/product/product-quantity-selector.tsx +111 -0
  352. package/templates/storefront-nextjs-shadcn/components/product/product-reviews.tsx +238 -0
  353. package/templates/storefront-nextjs-shadcn/components/product/product-sort.tsx +58 -0
  354. package/templates/storefront-nextjs-shadcn/components/product/product-variant-selector.tsx +169 -0
  355. package/templates/storefront-nextjs-shadcn/components/product/review-card.tsx +220 -0
  356. package/templates/storefront-nextjs-shadcn/components/product/review-form.tsx +338 -0
  357. package/templates/storefront-nextjs-shadcn/components/product/review-summary.tsx +143 -0
  358. package/templates/storefront-nextjs-shadcn/components/product/sale-countdown.tsx +166 -0
  359. package/templates/storefront-nextjs-shadcn/components/product/savings-display.tsx +213 -0
  360. package/templates/storefront-nextjs-shadcn/components/product/similar-products.tsx +57 -0
  361. package/templates/storefront-nextjs-shadcn/components/product/stock-indicator.tsx +91 -0
  362. package/templates/storefront-nextjs-shadcn/components/providers/currency-provider.tsx +103 -0
  363. package/templates/storefront-nextjs-shadcn/components/providers/index.ts +8 -0
  364. package/templates/storefront-nextjs-shadcn/components/providers/query-provider.tsx +260 -0
  365. package/templates/storefront-nextjs-shadcn/components/providers/theme-provider.tsx +13 -0
  366. package/templates/storefront-nextjs-shadcn/components/returns/index.ts +26 -0
  367. package/templates/storefront-nextjs-shadcn/components/returns/return-request-form.tsx +608 -0
  368. package/templates/storefront-nextjs-shadcn/components/returns/return-status-card.tsx +554 -0
  369. package/templates/storefront-nextjs-shadcn/components/search/index.ts +8 -0
  370. package/templates/storefront-nextjs-shadcn/components/search/search-bar.tsx +140 -0
  371. package/templates/storefront-nextjs-shadcn/components/search/search-results.tsx +58 -0
  372. package/templates/storefront-nextjs-shadcn/components/search/search-suggestions.tsx +43 -0
  373. package/templates/storefront-nextjs-shadcn/components/seo/index.ts +12 -0
  374. package/templates/storefront-nextjs-shadcn/components/seo/json-ld.tsx +56 -0
  375. package/templates/storefront-nextjs-shadcn/components/seo/product-json-ld.ts +167 -0
  376. package/templates/storefront-nextjs-shadcn/components/shipping/index.ts +16 -0
  377. package/templates/storefront-nextjs-shadcn/components/shipping/shipping-method-selector.tsx +337 -0
  378. package/templates/storefront-nextjs-shadcn/components/ui/accordion.tsx +153 -0
  379. package/templates/storefront-nextjs-shadcn/components/ui/alert.tsx +59 -0
  380. package/templates/storefront-nextjs-shadcn/components/ui/badge.tsx +34 -0
  381. package/templates/storefront-nextjs-shadcn/components/ui/button.tsx +51 -0
  382. package/templates/storefront-nextjs-shadcn/components/ui/card.tsx +77 -0
  383. package/templates/storefront-nextjs-shadcn/components/ui/checkbox.tsx +30 -0
  384. package/templates/storefront-nextjs-shadcn/components/ui/dialog.tsx +137 -0
  385. package/templates/storefront-nextjs-shadcn/components/ui/empty-state.tsx +207 -0
  386. package/templates/storefront-nextjs-shadcn/components/ui/index.ts +67 -0
  387. package/templates/storefront-nextjs-shadcn/components/ui/input.tsx +65 -0
  388. package/templates/storefront-nextjs-shadcn/components/ui/label.tsx +26 -0
  389. package/templates/storefront-nextjs-shadcn/components/ui/pagination.tsx +205 -0
  390. package/templates/storefront-nextjs-shadcn/components/ui/radio-group.tsx +44 -0
  391. package/templates/storefront-nextjs-shadcn/components/ui/select.tsx +160 -0
  392. package/templates/storefront-nextjs-shadcn/components/ui/separator.tsx +28 -0
  393. package/templates/storefront-nextjs-shadcn/components/ui/skeleton.tsx +20 -0
  394. package/templates/storefront-nextjs-shadcn/components/ui/spinner.tsx +82 -0
  395. package/templates/storefront-nextjs-shadcn/components/ui/tabs.tsx +119 -0
  396. package/templates/storefront-nextjs-shadcn/components/ui/toast.tsx +96 -0
  397. package/templates/storefront-nextjs-shadcn/components/wishlist/index.ts +9 -0
  398. package/templates/storefront-nextjs-shadcn/components/wishlist/wishlist-button.tsx +148 -0
  399. package/templates/storefront-nextjs-shadcn/components/wishlist/wishlist-icon.tsx +47 -0
  400. package/templates/storefront-nextjs-shadcn/components/wishlist/wishlist-item.tsx +165 -0
  401. package/templates/storefront-nextjs-shadcn/components.json +19 -0
  402. package/templates/storefront-nextjs-shadcn/generated/.gitkeep +2 -0
  403. package/templates/storefront-nextjs-shadcn/graphql/.gitkeep +31 -0
  404. package/templates/storefront-nextjs-shadcn/graphql/collections.example.ts +168 -0
  405. package/templates/storefront-nextjs-shadcn/graphql/products.example.ts +160 -0
  406. package/templates/storefront-nextjs-shadcn/hooks/index.ts +9 -0
  407. package/templates/storefront-nextjs-shadcn/hooks/use-auth.ts +310 -0
  408. package/templates/storefront-nextjs-shadcn/hooks/use-cart-actions.ts +286 -0
  409. package/templates/storefront-nextjs-shadcn/hooks/use-cart-sync.ts +110 -0
  410. package/templates/storefront-nextjs-shadcn/hooks/use-filter-params.test.ts +173 -0
  411. package/templates/storefront-nextjs-shadcn/hooks/use-filter-params.ts +298 -0
  412. package/templates/storefront-nextjs-shadcn/lib/auth/cookies.ts +220 -0
  413. package/templates/storefront-nextjs-shadcn/lib/auth/routes.ts +57 -0
  414. package/templates/storefront-nextjs-shadcn/lib/config.ts +46 -0
  415. package/templates/storefront-nextjs-shadcn/lib/currency/IMPLEMENTATION_SUMMARY.md +254 -0
  416. package/templates/storefront-nextjs-shadcn/lib/currency/README.md +464 -0
  417. package/templates/storefront-nextjs-shadcn/lib/currency/cookie-manager.test.ts +328 -0
  418. package/templates/storefront-nextjs-shadcn/lib/currency/cookie-manager.ts +295 -0
  419. package/templates/storefront-nextjs-shadcn/lib/currency/index.ts +27 -0
  420. package/templates/storefront-nextjs-shadcn/lib/format.test.ts +397 -0
  421. package/templates/storefront-nextjs-shadcn/lib/format.ts +226 -0
  422. package/templates/storefront-nextjs-shadcn/lib/graphql/client.ts +109 -0
  423. package/templates/storefront-nextjs-shadcn/lib/graphql/hooks.ts +1183 -0
  424. package/templates/storefront-nextjs-shadcn/lib/graphql/server.ts +267 -0
  425. package/templates/storefront-nextjs-shadcn/lib/hooks.ts +30 -0
  426. package/templates/storefront-nextjs-shadcn/lib/theme/theme-config.ts +89 -0
  427. package/templates/storefront-nextjs-shadcn/lib/utils.ts +6 -0
  428. package/templates/storefront-nextjs-shadcn/next.config.ts +47 -0
  429. package/templates/storefront-nextjs-shadcn/open-next.config.ts +3 -0
  430. package/templates/storefront-nextjs-shadcn/package.dev.json +30 -0
  431. package/templates/storefront-nextjs-shadcn/package.json +60 -0
  432. package/templates/storefront-nextjs-shadcn/package.json.template +46 -0
  433. package/templates/storefront-nextjs-shadcn/postcss.config.mjs +8 -0
  434. package/templates/storefront-nextjs-shadcn/proxy.ts +80 -0
  435. package/templates/storefront-nextjs-shadcn/public/icons/payment/apple-pay.svg +8 -0
  436. package/templates/storefront-nextjs-shadcn/public/icons/payment/bank-transfer.svg +10 -0
  437. package/templates/storefront-nextjs-shadcn/public/icons/payment/blik.svg +6 -0
  438. package/templates/storefront-nextjs-shadcn/public/icons/payment/cash-on-delivery.svg +11 -0
  439. package/templates/storefront-nextjs-shadcn/public/icons/payment/google-pay.svg +11 -0
  440. package/templates/storefront-nextjs-shadcn/public/icons/payment/mastercard.svg +7 -0
  441. package/templates/storefront-nextjs-shadcn/public/icons/payment/paypal.svg +7 -0
  442. package/templates/storefront-nextjs-shadcn/public/icons/payment/payu.svg +7 -0
  443. package/templates/storefront-nextjs-shadcn/public/icons/payment/przelewy24.svg +7 -0
  444. package/templates/storefront-nextjs-shadcn/public/icons/payment/stripe.svg +4 -0
  445. package/templates/storefront-nextjs-shadcn/public/icons/payment/visa.svg +5 -0
  446. package/templates/storefront-nextjs-shadcn/stores/auth-store.ts +66 -0
  447. package/templates/storefront-nextjs-shadcn/stores/cart-store.ts +56 -0
  448. package/templates/storefront-nextjs-shadcn/stores/checkout-store.ts +184 -0
  449. package/templates/storefront-nextjs-shadcn/stores/currency-store.ts +103 -0
  450. package/templates/storefront-nextjs-shadcn/stores/wishlist-store.ts +291 -0
  451. package/templates/storefront-nextjs-shadcn/tailwind.config.ts +111 -0
  452. package/templates/storefront-nextjs-shadcn/tsconfig.json +27 -0
  453. package/templates/storefront-nextjs-shadcn/wrangler.toml +9 -0
@@ -0,0 +1,629 @@
1
+ /**
2
+ * @deprecated This file is DEPRECATED and will be removed in future versions.
3
+ *
4
+ * ⚠️ DO NOT USE - Use SDK factory instead!
5
+ *
6
+ * ## Migration Path:
7
+ *
8
+ * Instead of raw GraphQL queries, use the auto-generated SDK with factory:
9
+ *
10
+ * ```typescript
11
+ * import { createStorefrontSdkFromEnv } from "@doswiftly/commerce-sdk/graphql";
12
+ *
13
+ * const sdk = createStorefrontSdkFromEnv();
14
+ * const { products } = await sdk.Products({ first: 20 });
15
+ * ```
16
+ *
17
+ * ## Why migrate?
18
+ * - ✅ Full TypeScript type safety
19
+ * - ✅ Auto-generated from backend operations (SSOT)
20
+ * - ✅ Automatic header management (X-Shop-Slug, X-Preferred-Currency)
21
+ * - ✅ No manual GraphQL string maintenance
22
+ *
23
+ * ## Adding custom queries:
24
+ * See: packages/@doswiftly/commerce-sdk/CUSTOM_OPERATIONS.md
25
+ *
26
+ * ---
27
+ *
28
+ * Raw GraphQL Queries for Currency-enabled Storefront
29
+ *
30
+ * These queries work with the new price structure where:
31
+ * - `price` / `priceRange` = converted price (customer's preferred currency)
32
+ * - `originalPrice` / `originalPriceRange` = original price (shop's base currency)
33
+ *
34
+ * Usage: Send with `x-preferred-currency` header to get prices in desired currency.
35
+ *
36
+ * Types are imported from SDK (SSOT) - auto-generated from GraphQL schema.
37
+ */
38
+
39
+ import type { PriceMoney, Money } from "@doswiftly/commerce-sdk/graphql";
40
+ export type { PriceMoney, Money };
41
+
42
+ // ============================================================================
43
+ // FRAGMENTS
44
+ // ============================================================================
45
+
46
+ /**
47
+ * PriceMoney fragment - full conversion transparency
48
+ */
49
+ export const PRICE_MONEY_FRAGMENT = /* GraphQL */ `
50
+ fragment PriceMoneyFields on PriceMoney {
51
+ amount
52
+ currencyCode
53
+ baseAmount
54
+ baseCurrencyCode
55
+ exchangeRate
56
+ marginApplied
57
+ rateTimestamp
58
+ isConverted
59
+ }
60
+ `;
61
+
62
+ /**
63
+ * Money fragment - simple price (for original prices)
64
+ */
65
+ export const MONEY_FRAGMENT = /* GraphQL */ `
66
+ fragment MoneyFields on Money {
67
+ amount
68
+ currencyCode
69
+ }
70
+ `;
71
+
72
+ /**
73
+ * Product variant with prices
74
+ */
75
+ export const PRODUCT_VARIANT_FRAGMENT = /* GraphQL */ `
76
+ fragment ProductVariantFields on ProductVariant {
77
+ id
78
+ title
79
+ sku
80
+ available
81
+ quantityAvailable
82
+ price {
83
+ ...PriceMoneyFields
84
+ }
85
+ originalPrice {
86
+ ...MoneyFields
87
+ }
88
+ compareAtPrice {
89
+ ...PriceMoneyFields
90
+ }
91
+ originalCompareAtPrice {
92
+ ...MoneyFields
93
+ }
94
+ image {
95
+ id
96
+ url
97
+ altText
98
+ }
99
+ selectedOptions {
100
+ name
101
+ value
102
+ }
103
+ }
104
+ `;
105
+
106
+ /**
107
+ * Product with prices
108
+ */
109
+ export const PRODUCT_FRAGMENT = /* GraphQL */ `
110
+ fragment ProductFields on Product {
111
+ id
112
+ title
113
+ handle
114
+ description
115
+ descriptionHtml
116
+ priceRange {
117
+ minVariantPrice {
118
+ ...PriceMoneyFields
119
+ }
120
+ maxVariantPrice {
121
+ ...PriceMoneyFields
122
+ }
123
+ }
124
+ originalPriceRange {
125
+ minVariantPrice {
126
+ ...MoneyFields
127
+ }
128
+ maxVariantPrice {
129
+ ...MoneyFields
130
+ }
131
+ }
132
+ featuredImage {
133
+ id
134
+ url
135
+ altText
136
+ }
137
+ images(first: 10) {
138
+ id
139
+ url
140
+ altText
141
+ }
142
+ totalInventory
143
+ vendor
144
+ productType
145
+ tags
146
+ createdAt
147
+ updatedAt
148
+ }
149
+ `;
150
+
151
+ // ============================================================================
152
+ // QUERIES
153
+ // ============================================================================
154
+
155
+ /**
156
+ * Get shop info with currency configuration
157
+ */
158
+ export const SHOP_QUERY = /* GraphQL */ `
159
+ query Shop {
160
+ shop {
161
+ id
162
+ name
163
+ description
164
+ currencyCode
165
+ supportedCurrencies
166
+ defaultLanguage
167
+ supportedLanguages
168
+ primaryDomain
169
+ }
170
+ }
171
+ `;
172
+
173
+ /**
174
+ * Get products list with converted prices
175
+ */
176
+ export const PRODUCTS_QUERY = /* GraphQL */ `
177
+ ${PRICE_MONEY_FRAGMENT}
178
+ ${MONEY_FRAGMENT}
179
+
180
+ query Products(
181
+ $first: Int!
182
+ $after: String
183
+ $query: String
184
+ $sortKey: ProductSortKeys
185
+ $reverse: Boolean
186
+ ) {
187
+ products(
188
+ first: $first
189
+ after: $after
190
+ query: $query
191
+ sortKey: $sortKey
192
+ reverse: $reverse
193
+ ) {
194
+ edges {
195
+ node {
196
+ id
197
+ title
198
+ handle
199
+ description
200
+ priceRange {
201
+ minVariantPrice {
202
+ ...PriceMoneyFields
203
+ }
204
+ maxVariantPrice {
205
+ ...PriceMoneyFields
206
+ }
207
+ }
208
+ originalPriceRange {
209
+ minVariantPrice {
210
+ ...MoneyFields
211
+ }
212
+ maxVariantPrice {
213
+ ...MoneyFields
214
+ }
215
+ }
216
+ featuredImage {
217
+ id
218
+ url
219
+ altText
220
+ }
221
+ totalInventory
222
+ vendor
223
+ tags
224
+ }
225
+ cursor
226
+ }
227
+ pageInfo {
228
+ hasNextPage
229
+ hasPreviousPage
230
+ startCursor
231
+ endCursor
232
+ }
233
+ totalCount
234
+ }
235
+ }
236
+ `;
237
+
238
+ /**
239
+ * Get single product with all variants and prices
240
+ */
241
+ export const PRODUCT_QUERY = /* GraphQL */ `
242
+ ${PRICE_MONEY_FRAGMENT}
243
+ ${MONEY_FRAGMENT}
244
+ ${PRODUCT_VARIANT_FRAGMENT}
245
+
246
+ query Product($id: ID, $handle: String) {
247
+ product(id: $id, handle: $handle) {
248
+ id
249
+ title
250
+ handle
251
+ description
252
+ descriptionHtml
253
+ priceRange {
254
+ minVariantPrice {
255
+ ...PriceMoneyFields
256
+ }
257
+ maxVariantPrice {
258
+ ...PriceMoneyFields
259
+ }
260
+ }
261
+ originalPriceRange {
262
+ minVariantPrice {
263
+ ...MoneyFields
264
+ }
265
+ maxVariantPrice {
266
+ ...MoneyFields
267
+ }
268
+ }
269
+ featuredImage {
270
+ id
271
+ url
272
+ altText
273
+ }
274
+ images(first: 20) {
275
+ id
276
+ url
277
+ altText
278
+ }
279
+ variants(first: 100) {
280
+ ...ProductVariantFields
281
+ }
282
+ totalInventory
283
+ vendor
284
+ productType
285
+ tags
286
+ seo {
287
+ title
288
+ description
289
+ }
290
+ createdAt
291
+ updatedAt
292
+ }
293
+ }
294
+ `;
295
+
296
+ /**
297
+ * Get cart with converted prices
298
+ */
299
+ export const CART_QUERY = /* GraphQL */ `
300
+ ${PRICE_MONEY_FRAGMENT}
301
+ ${MONEY_FRAGMENT}
302
+
303
+ query Cart($id: ID!) {
304
+ cart(id: $id) {
305
+ id
306
+ checkoutUrl
307
+ totalQuantity
308
+ cost {
309
+ subtotalAmount {
310
+ ...PriceMoneyFields
311
+ }
312
+ totalAmount {
313
+ ...PriceMoneyFields
314
+ }
315
+ totalTaxAmount {
316
+ ...PriceMoneyFields
317
+ }
318
+ }
319
+ lines(first: 100) {
320
+ id
321
+ quantity
322
+ merchandise {
323
+ id
324
+ title
325
+ sku
326
+ price {
327
+ ...PriceMoneyFields
328
+ }
329
+ originalPrice {
330
+ ...MoneyFields
331
+ }
332
+ image {
333
+ url
334
+ altText
335
+ }
336
+ }
337
+ cost {
338
+ amountPerQuantity {
339
+ ...PriceMoneyFields
340
+ }
341
+ subtotalAmount {
342
+ ...PriceMoneyFields
343
+ }
344
+ totalAmount {
345
+ ...PriceMoneyFields
346
+ }
347
+ }
348
+ }
349
+ createdAt
350
+ updatedAt
351
+ }
352
+ }
353
+ `;
354
+
355
+ // ============================================================================
356
+ // MUTATIONS
357
+ // ============================================================================
358
+
359
+ /**
360
+ * Create cart
361
+ */
362
+ export const CART_CREATE_MUTATION = /* GraphQL */ `
363
+ ${PRICE_MONEY_FRAGMENT}
364
+ ${MONEY_FRAGMENT}
365
+
366
+ mutation CartCreate($input: CartCreateInput) {
367
+ cartCreate(input: $input) {
368
+ cart {
369
+ id
370
+ checkoutUrl
371
+ totalQuantity
372
+ cost {
373
+ totalAmount {
374
+ ...PriceMoneyFields
375
+ }
376
+ }
377
+ lines(first: 10) {
378
+ id
379
+ quantity
380
+ merchandise {
381
+ id
382
+ title
383
+ price {
384
+ ...PriceMoneyFields
385
+ }
386
+ }
387
+ }
388
+ }
389
+ userErrors {
390
+ message
391
+ field
392
+ code
393
+ }
394
+ }
395
+ }
396
+ `;
397
+
398
+ /**
399
+ * Add lines to cart
400
+ */
401
+ export const CART_LINES_ADD_MUTATION = /* GraphQL */ `
402
+ ${PRICE_MONEY_FRAGMENT}
403
+
404
+ mutation CartLinesAdd($cartId: ID!, $lines: [CartLineInput!]!) {
405
+ cartLinesAdd(cartId: $cartId, lines: $lines) {
406
+ cart {
407
+ id
408
+ totalQuantity
409
+ cost {
410
+ totalAmount {
411
+ ...PriceMoneyFields
412
+ }
413
+ }
414
+ }
415
+ userErrors {
416
+ message
417
+ field
418
+ code
419
+ }
420
+ }
421
+ }
422
+ `;
423
+
424
+ /**
425
+ * Update cart lines
426
+ */
427
+ export const CART_LINES_UPDATE_MUTATION = /* GraphQL */ `
428
+ ${PRICE_MONEY_FRAGMENT}
429
+
430
+ mutation CartLinesUpdate($cartId: ID!, $lines: [CartLineUpdateInput!]!) {
431
+ cartLinesUpdate(cartId: $cartId, lines: $lines) {
432
+ cart {
433
+ id
434
+ totalQuantity
435
+ cost {
436
+ totalAmount {
437
+ ...PriceMoneyFields
438
+ }
439
+ }
440
+ }
441
+ userErrors {
442
+ message
443
+ field
444
+ code
445
+ }
446
+ }
447
+ }
448
+ `;
449
+
450
+ /**
451
+ * Remove lines from cart
452
+ */
453
+ export const CART_LINES_REMOVE_MUTATION = /* GraphQL */ `
454
+ ${PRICE_MONEY_FRAGMENT}
455
+
456
+ mutation CartLinesRemove($cartId: ID!, $lineIds: [ID!]!) {
457
+ cartLinesRemove(cartId: $cartId, lineIds: $lineIds) {
458
+ cart {
459
+ id
460
+ totalQuantity
461
+ cost {
462
+ totalAmount {
463
+ ...PriceMoneyFields
464
+ }
465
+ }
466
+ }
467
+ userErrors {
468
+ message
469
+ field
470
+ code
471
+ }
472
+ }
473
+ }
474
+ `;
475
+
476
+ // ============================================================================
477
+ // FETCH HELPER
478
+ // ============================================================================
479
+
480
+ interface GraphQLResponse<T> {
481
+ data?: T;
482
+ errors?: Array<{ message: string }>;
483
+ }
484
+
485
+ /**
486
+ * Execute GraphQL query with currency header
487
+ *
488
+ * Note: For most use cases, prefer SDK hooks (useProducts, etc.)
489
+ * which automatically normalize responses.
490
+ *
491
+ * @example
492
+ * ```typescript
493
+ * const data = await fetchGraphQL(PRODUCTS_QUERY, { first: 10 }, "EUR");
494
+ * console.log(data.products.edges); // Raw GraphQL structure
495
+ * ```
496
+ */
497
+ export async function fetchGraphQL<T = any>(
498
+ query: string,
499
+ variables: Record<string, any> = {},
500
+ preferredCurrency?: string
501
+ ): Promise<T> {
502
+ const apiUrl = process.env.NEXT_PUBLIC_API_URL || "http://localhost:8000";
503
+ const shopSlug = process.env.NEXT_PUBLIC_SHOP_SLUG || "demo-shop";
504
+
505
+ const headers: Record<string, string> = {
506
+ "Content-Type": "application/json",
507
+ "x-shop-slug": shopSlug,
508
+ };
509
+
510
+ if (preferredCurrency) {
511
+ headers["x-preferred-currency"] = preferredCurrency;
512
+ }
513
+
514
+ const response = await fetch(`${apiUrl}/storefront/graphql`, {
515
+ method: "POST",
516
+ headers,
517
+ body: JSON.stringify({ query, variables }),
518
+ cache: "no-store", // For dynamic pricing
519
+ });
520
+
521
+ if (!response.ok) {
522
+ throw new Error(
523
+ `GraphQL request failed: ${response.status} ${response.statusText}`
524
+ );
525
+ }
526
+
527
+ const json: GraphQLResponse<T> = await response.json();
528
+
529
+ if (json.errors?.length) {
530
+ throw new Error(
531
+ `GraphQL errors: ${json.errors.map((e) => e.message).join(", ")}`
532
+ );
533
+ }
534
+
535
+ return json.data as T;
536
+ }
537
+
538
+ // ============================================================================
539
+ // TYPED FETCH FUNCTIONS
540
+ // ============================================================================
541
+
542
+ export interface ShopData {
543
+ shop: {
544
+ id: string;
545
+ name: string;
546
+ description?: string;
547
+ currencyCode: string;
548
+ supportedCurrencies: string[];
549
+ defaultLanguage: string;
550
+ supportedLanguages: string[];
551
+ primaryDomain?: string;
552
+ };
553
+ }
554
+
555
+ export interface ProductsData {
556
+ products: {
557
+ edges: Array<{
558
+ node: {
559
+ id: string;
560
+ title: string;
561
+ handle: string;
562
+ description?: string;
563
+ priceRange: {
564
+ minVariantPrice: PriceMoney;
565
+ maxVariantPrice: PriceMoney;
566
+ };
567
+ originalPriceRange?: {
568
+ minVariantPrice: Money;
569
+ maxVariantPrice: Money;
570
+ };
571
+ featuredImage?: {
572
+ id: string;
573
+ url: string;
574
+ altText?: string;
575
+ };
576
+ totalInventory?: number;
577
+ vendor?: string;
578
+ tags: string[];
579
+ };
580
+ cursor: string;
581
+ }>;
582
+ pageInfo: {
583
+ hasNextPage: boolean;
584
+ hasPreviousPage: boolean;
585
+ startCursor?: string;
586
+ endCursor?: string;
587
+ };
588
+ totalCount: number;
589
+ };
590
+ }
591
+
592
+ // PriceMoney and Money types are imported from SDK at the top of this file
593
+
594
+ /**
595
+ * Fetch shop info
596
+ */
597
+ export async function getShop(
598
+ preferredCurrency?: string
599
+ ): Promise<ShopData["shop"]> {
600
+ const data = await fetchGraphQL<ShopData>(SHOP_QUERY, {}, preferredCurrency);
601
+ return data.shop;
602
+ }
603
+
604
+ /**
605
+ * Fetch products with pagination
606
+ */
607
+ export async function getProducts(
608
+ params: {
609
+ first?: number;
610
+ after?: string;
611
+ query?: string;
612
+ sortKey?: string;
613
+ reverse?: boolean;
614
+ } = {},
615
+ preferredCurrency?: string
616
+ ): Promise<ProductsData["products"]> {
617
+ const data = await fetchGraphQL<ProductsData>(
618
+ PRODUCTS_QUERY,
619
+ {
620
+ first: params.first ?? 20,
621
+ after: params.after,
622
+ query: params.query,
623
+ sortKey: params.sortKey,
624
+ reverse: params.reverse,
625
+ },
626
+ preferredCurrency
627
+ );
628
+ return data.products;
629
+ }
@@ -0,0 +1,30 @@
1
+ import { useState, useEffect } from "react";
2
+
3
+ /**
4
+ * useDebouncedValue - Debounce a value
5
+ *
6
+ * @param value - Value to debounce
7
+ * @param delay - Delay in ms (default: 300)
8
+ * @returns Debounced value
9
+ *
10
+ * @example
11
+ * ```tsx
12
+ * const [query, setQuery] = useState("");
13
+ * const debouncedQuery = useDebouncedValue(query, 300);
14
+ *
15
+ * // debouncedQuery updates 300ms after query stops changing
16
+ * ```
17
+ */
18
+ export function useDebouncedValue<T>(value: T, delay = 300): T {
19
+ const [debouncedValue, setDebouncedValue] = useState(value);
20
+
21
+ useEffect(() => {
22
+ const timer = setTimeout(() => {
23
+ setDebouncedValue(value);
24
+ }, delay);
25
+
26
+ return () => clearTimeout(timer);
27
+ }, [value, delay]);
28
+
29
+ return debouncedValue;
30
+ }