@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,47 @@
1
+ 'use client';
2
+
3
+ /**
4
+ * WishlistIcon Component
5
+ *
6
+ * Header icon showing wishlist with item count badge.
7
+ * Links to wishlist page.
8
+ */
9
+
10
+ import Link from 'next/link';
11
+ import { Heart } from 'lucide-react';
12
+ import { Button } from '@/components/ui/button';
13
+ import { Badge } from '@/components/ui/badge';
14
+ import { cn } from '@/lib/utils';
15
+ import { useWishlistStore } from '@/stores/wishlist-store';
16
+
17
+ interface WishlistIconProps {
18
+ className?: string;
19
+ showCount?: boolean;
20
+ }
21
+
22
+ export function WishlistIcon({ className, showCount = true }: WishlistIconProps) {
23
+ const { getTotalItems, isHydrated } = useWishlistStore();
24
+
25
+ const totalItems = getTotalItems();
26
+
27
+ return (
28
+ <Button
29
+ variant="ghost"
30
+ size="icon"
31
+ className={cn('relative', className)}
32
+ asChild
33
+ >
34
+ <Link href="/wishlist" aria-label={`Lista życzeń (${totalItems} produktów)`}>
35
+ <Heart className="h-5 w-5" />
36
+ {showCount && isHydrated && totalItems > 0 && (
37
+ <Badge
38
+ variant="destructive"
39
+ className="absolute -top-1 -right-1 h-5 min-w-5 px-1 flex items-center justify-center text-xs"
40
+ >
41
+ {totalItems > 99 ? '99+' : totalItems}
42
+ </Badge>
43
+ )}
44
+ </Link>
45
+ </Button>
46
+ );
47
+ }
@@ -0,0 +1,165 @@
1
+ 'use client';
2
+
3
+ /**
4
+ * WishlistItem Component
5
+ *
6
+ * Single item card in wishlist page.
7
+ * Shows product info, price comparison, and actions.
8
+ */
9
+
10
+ import Image from 'next/image';
11
+ import Link from 'next/link';
12
+ import { ShoppingCart, Trash2, TrendingDown, TrendingUp } from 'lucide-react';
13
+ import { Button } from '@/components/ui/button';
14
+ import { Card, CardContent } from '@/components/ui/card';
15
+ import { Badge } from '@/components/ui/badge';
16
+ import { cn } from '@/lib/utils';
17
+ import { useWishlistStore, type WishlistItem as WishlistItemType } from '@/stores/wishlist-store';
18
+ import { useCartActions } from '@/hooks/use-cart-actions';
19
+ import { toast } from 'sonner';
20
+
21
+ interface WishlistItemProps {
22
+ item: WishlistItemType;
23
+ wishlistId: string;
24
+ }
25
+
26
+ export function WishlistItem({ item, wishlistId }: WishlistItemProps) {
27
+ const { removeItem } = useWishlistStore();
28
+ const { addToCart } = useCartActions();
29
+
30
+ const handleRemove = () => {
31
+ removeItem(wishlistId, item.id);
32
+ toast.success('Usunięto z listy życzeń');
33
+ };
34
+
35
+ const handleAddToCart = async () => {
36
+ await addToCart({
37
+ variantId: item.variantId || item.productId,
38
+ productId: item.productId,
39
+ productTitle: item.productTitle,
40
+ variantTitle: item.variantTitle || '',
41
+ price: item.price,
42
+ image: item.image,
43
+ available: true,
44
+ });
45
+ };
46
+
47
+ // Calculate price change since added
48
+ const currentPrice = parseFloat(item.price.amount);
49
+ const originalPrice = parseFloat(item.priceAtAdd.amount);
50
+ const priceChange = currentPrice - originalPrice;
51
+ const priceChangePercent = originalPrice > 0
52
+ ? ((priceChange / originalPrice) * 100).toFixed(0)
53
+ : 0;
54
+
55
+ const formatPrice = (amount: string, currency: string) => {
56
+ return new Intl.NumberFormat('pl-PL', {
57
+ style: 'currency',
58
+ currency,
59
+ }).format(parseFloat(amount));
60
+ };
61
+
62
+ const formatDate = (date: Date) => {
63
+ return new Intl.DateTimeFormat('pl-PL', {
64
+ day: 'numeric',
65
+ month: 'short',
66
+ year: 'numeric',
67
+ }).format(new Date(date));
68
+ };
69
+
70
+ return (
71
+ <Card className="overflow-hidden">
72
+ <CardContent className="p-0">
73
+ <div className="flex gap-4 p-4">
74
+ {/* Product Image */}
75
+ <Link
76
+ href={`/products/${item.productId}`}
77
+ className="relative w-24 h-24 flex-shrink-0 bg-muted rounded-md overflow-hidden"
78
+ >
79
+ {item.image ? (
80
+ <Image
81
+ src={item.image.url}
82
+ alt={item.image.altText || item.productTitle}
83
+ fill
84
+ className="object-cover"
85
+ sizes="96px"
86
+ />
87
+ ) : (
88
+ <div className="w-full h-full flex items-center justify-center text-muted-foreground">
89
+ <ShoppingCart className="h-8 w-8" />
90
+ </div>
91
+ )}
92
+ </Link>
93
+
94
+ {/* Product Info */}
95
+ <div className="flex-1 min-w-0">
96
+ <Link
97
+ href={`/products/${item.productId}`}
98
+ className="block hover:underline"
99
+ >
100
+ <h3 className="font-medium text-foreground truncate">
101
+ {item.productTitle}
102
+ </h3>
103
+ </Link>
104
+ {item.variantTitle && (
105
+ <p className="text-sm text-muted-foreground truncate">
106
+ {item.variantTitle}
107
+ </p>
108
+ )}
109
+
110
+ {/* Price */}
111
+ <div className="mt-2 flex items-center gap-2 flex-wrap">
112
+ <span className="font-semibold text-lg">
113
+ {formatPrice(item.price.amount, item.price.currencyCode)}
114
+ </span>
115
+
116
+ {/* Price change indicator */}
117
+ {priceChange !== 0 && (
118
+ <Badge
119
+ variant={priceChange < 0 ? 'success' : 'destructive'}
120
+ className={cn(
121
+ 'text-xs gap-0.5',
122
+ priceChange < 0 ? 'bg-green-100 text-green-700' : 'bg-red-100 text-red-700'
123
+ )}
124
+ >
125
+ {priceChange < 0 ? (
126
+ <TrendingDown className="h-3 w-3" />
127
+ ) : (
128
+ <TrendingUp className="h-3 w-3" />
129
+ )}
130
+ {priceChangePercent}%
131
+ </Badge>
132
+ )}
133
+ </div>
134
+
135
+ {/* Added date */}
136
+ <p className="text-xs text-muted-foreground mt-1">
137
+ Dodano: {formatDate(item.addedAt)}
138
+ </p>
139
+ </div>
140
+
141
+ {/* Actions */}
142
+ <div className="flex flex-col gap-2">
143
+ <Button
144
+ size="sm"
145
+ onClick={handleAddToCart}
146
+ className="gap-1.5"
147
+ >
148
+ <ShoppingCart className="h-4 w-4" />
149
+ <span className="hidden sm:inline">Do koszyka</span>
150
+ </Button>
151
+ <Button
152
+ variant="ghost"
153
+ size="sm"
154
+ onClick={handleRemove}
155
+ className="text-muted-foreground hover:text-destructive"
156
+ >
157
+ <Trash2 className="h-4 w-4" />
158
+ <span className="hidden sm:inline ml-1.5">Usuń</span>
159
+ </Button>
160
+ </div>
161
+ </div>
162
+ </CardContent>
163
+ </Card>
164
+ );
165
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema.json",
3
+ "style": "default",
4
+ "rsc": true,
5
+ "tsx": true,
6
+ "tailwind": {
7
+ "config": "tailwind.config.ts",
8
+ "css": "app/globals.css",
9
+ "baseColor": "slate",
10
+ "cssVariables": true
11
+ },
12
+ "aliases": {
13
+ "components": "@/components",
14
+ "utils": "@/lib/utils",
15
+ "ui": "@/components/ui",
16
+ "lib": "@/lib",
17
+ "hooks": "@/hooks"
18
+ }
19
+ }
@@ -0,0 +1,2 @@
1
+ # This directory will contain auto-generated GraphQL types
2
+ # Run `pnpm run codegen` to generate graphql.ts
@@ -0,0 +1,31 @@
1
+ # Custom GraphQL Queries
2
+
3
+ Place your custom GraphQL queries here. These will be picked up by codegen and generate TypeScript types.
4
+
5
+ ## Examples
6
+
7
+ See `products.example.ts` and `collections.example.ts` for examples of custom queries.
8
+
9
+ To use the examples:
10
+ 1. Rename `products.example.ts` to `products.ts`
11
+ 2. Rename `collections.example.ts` to `collections.ts`
12
+ 3. Run `pnpm run codegen` to generate types
13
+
14
+ ## When to use custom queries vs backend operations
15
+
16
+ **Use backend operations** (from `@doswiftly/storefront-operations`):
17
+ - For standard CRUD operations (Shop, Product, Cart, Customer)
18
+ - When you need the full object with all fields
19
+ - For consistency across all storefronts
20
+
21
+ **Use custom queries** (in this directory):
22
+ - When you need specific fields only (performance optimization)
23
+ - For custom filtering or sorting logic
24
+ - For combining multiple queries
25
+ - For storefront-specific features
26
+
27
+ ## File naming
28
+
29
+ - Use descriptive names: `products.ts`, `collections.ts`, `cart.ts`
30
+ - Use `.ts` or `.tsx` extension
31
+ - Export queries using `gql` tag from `graphql-tag`
@@ -0,0 +1,168 @@
1
+ import { gql } from 'graphql-tag';
2
+
3
+ /**
4
+ * Example: Custom GraphQL query for collections
5
+ *
6
+ * This file demonstrates how to write custom GraphQL queries for collections
7
+ * that will be picked up by codegen and generate TypeScript types.
8
+ *
9
+ * To use this example:
10
+ * 1. Rename this file from collections.example.ts to collections.ts
11
+ * 2. Run `pnpm run codegen` to generate types
12
+ * 3. Import the generated query in your components
13
+ */
14
+
15
+ // Example 1: Get featured collections
16
+ export const GET_FEATURED_COLLECTIONS = gql`
17
+ query GetFeaturedCollections($first: Int = 6) {
18
+ collections(first: $first, query: "featured:true") {
19
+ edges {
20
+ node {
21
+ id
22
+ handle
23
+ title
24
+ description
25
+ image {
26
+ url
27
+ altText
28
+ width
29
+ height
30
+ }
31
+ }
32
+ cursor
33
+ }
34
+ pageInfo {
35
+ hasNextPage
36
+ endCursor
37
+ }
38
+ }
39
+ }
40
+ `;
41
+
42
+ // Example 2: Get collection with products
43
+ export const GET_COLLECTION_WITH_PRODUCTS = gql`
44
+ query GetCollectionWithProducts(
45
+ $handle: String!
46
+ $first: Int = 20
47
+ $after: String
48
+ ) {
49
+ collection(handle: $handle) {
50
+ id
51
+ title
52
+ description
53
+ descriptionHtml
54
+ image {
55
+ url
56
+ altText
57
+ }
58
+ seo {
59
+ title
60
+ description
61
+ }
62
+ products(
63
+ first: $first
64
+ after: $after
65
+ ) {
66
+ edges {
67
+ node {
68
+ id
69
+ handle
70
+ title
71
+ description
72
+ featuredImage {
73
+ url
74
+ altText
75
+ }
76
+ priceRange {
77
+ minVariantPrice {
78
+ amount
79
+ currencyCode
80
+ baseAmount
81
+ baseCurrencyCode
82
+ isConverted
83
+ }
84
+ }
85
+ compareAtPriceRange {
86
+ minVariantPrice {
87
+ amount
88
+ currencyCode
89
+ }
90
+ }
91
+ vendor
92
+ productType
93
+ tags
94
+ totalInventory
95
+ }
96
+ cursor
97
+ }
98
+ pageInfo {
99
+ hasNextPage
100
+ hasPreviousPage
101
+ startCursor
102
+ endCursor
103
+ }
104
+ totalCount
105
+ }
106
+ }
107
+ }
108
+ `;
109
+
110
+ // Example 3: Get all collections with product counts
111
+ export const GET_ALL_COLLECTIONS = gql`
112
+ query GetAllCollections(
113
+ $first: Int = 50
114
+ $after: String
115
+ $sortKey: CollectionSortKeys = TITLE
116
+ ) {
117
+ collections(first: $first, after: $after, sortKey: $sortKey) {
118
+ edges {
119
+ node {
120
+ id
121
+ handle
122
+ title
123
+ description
124
+ image {
125
+ url
126
+ altText
127
+ }
128
+ products(first: 1) {
129
+ totalCount
130
+ }
131
+ }
132
+ cursor
133
+ }
134
+ pageInfo {
135
+ hasNextPage
136
+ hasPreviousPage
137
+ startCursor
138
+ endCursor
139
+ }
140
+ totalCount
141
+ }
142
+ }
143
+ `;
144
+
145
+ /**
146
+ * Usage in components:
147
+ *
148
+ * // Server Component
149
+ * import { getClient } from '@/lib/graphql/server';
150
+ * import { GetFeaturedCollectionsDocument } from '@/generated/graphql';
151
+ *
152
+ * const client = getClient();
153
+ * const { collections } = await client.request(GetFeaturedCollectionsDocument);
154
+ *
155
+ * // Client Component
156
+ * import { useQuery } from '@tanstack/react-query';
157
+ * import { getGraphQLClient } from '@/lib/graphql/client';
158
+ * import { GetCollectionWithProductsDocument } from '@/generated/graphql';
159
+ *
160
+ * const client = getGraphQLClient();
161
+ * const { data } = useQuery({
162
+ * queryKey: ['Collection', handle],
163
+ * queryFn: () => client.request(GetCollectionWithProductsDocument, {
164
+ * handle,
165
+ * first: 20
166
+ * }),
167
+ * });
168
+ */
@@ -0,0 +1,160 @@
1
+ import { gql } from 'graphql-tag';
2
+
3
+ /**
4
+ * Example: Custom GraphQL query for featured products
5
+ *
6
+ * This file demonstrates how to write custom GraphQL queries
7
+ * that will be picked up by codegen and generate TypeScript types.
8
+ *
9
+ * To use this example:
10
+ * 1. Rename this file from products.example.ts to products.ts
11
+ * 2. Run `pnpm run codegen` to generate types
12
+ * 3. Import the generated query in your components
13
+ */
14
+
15
+ // Example 1: Get featured products with specific fields
16
+ export const GET_FEATURED_PRODUCTS = gql`
17
+ query GetFeaturedProducts($first: Int = 6) {
18
+ products(first: $first, query: "tag:featured") {
19
+ edges {
20
+ node {
21
+ id
22
+ handle
23
+ title
24
+ description
25
+ featuredImage {
26
+ url
27
+ altText
28
+ width
29
+ height
30
+ }
31
+ priceRange {
32
+ minVariantPrice {
33
+ amount
34
+ currencyCode
35
+ }
36
+ }
37
+ }
38
+ cursor
39
+ }
40
+ pageInfo {
41
+ hasNextPage
42
+ endCursor
43
+ }
44
+ }
45
+ }
46
+ `;
47
+
48
+ // Example 2: Get product with reviews
49
+ export const GET_PRODUCT_WITH_REVIEWS = gql`
50
+ query GetProductWithReviews($handle: String!) {
51
+ product(handle: $handle) {
52
+ id
53
+ title
54
+ description
55
+ descriptionHtml
56
+ averageRating
57
+ reviewCount
58
+ featuredImage {
59
+ url
60
+ altText
61
+ }
62
+ priceRange {
63
+ minVariantPrice {
64
+ amount
65
+ currencyCode
66
+ baseAmount
67
+ baseCurrencyCode
68
+ isConverted
69
+ }
70
+ }
71
+ variants(first: 10) {
72
+ id
73
+ title
74
+ price {
75
+ amount
76
+ currencyCode
77
+ }
78
+ available
79
+ quantityAvailable
80
+ }
81
+ }
82
+ }
83
+ `;
84
+
85
+ // Example 3: Search products with filters
86
+ export const SEARCH_PRODUCTS_WITH_FILTERS = gql`
87
+ query SearchProductsWithFilters(
88
+ $query: String!
89
+ $first: Int = 20
90
+ $after: String
91
+ $filters: ProductFilterInput
92
+ ) {
93
+ products(
94
+ query: $query
95
+ first: $first
96
+ after: $after
97
+ filters: $filters
98
+ ) {
99
+ edges {
100
+ node {
101
+ id
102
+ handle
103
+ title
104
+ vendor
105
+ productType
106
+ featuredImage {
107
+ url
108
+ altText
109
+ }
110
+ priceRange {
111
+ minVariantPrice {
112
+ amount
113
+ currencyCode
114
+ }
115
+ maxVariantPrice {
116
+ amount
117
+ currencyCode
118
+ }
119
+ }
120
+ compareAtPriceRange {
121
+ minVariantPrice {
122
+ amount
123
+ currencyCode
124
+ }
125
+ }
126
+ }
127
+ cursor
128
+ }
129
+ pageInfo {
130
+ hasNextPage
131
+ hasPreviousPage
132
+ startCursor
133
+ endCursor
134
+ }
135
+ totalCount
136
+ }
137
+ }
138
+ `;
139
+
140
+ /**
141
+ * Usage in components:
142
+ *
143
+ * // Server Component
144
+ * import { getClient } from '@/lib/graphql/server';
145
+ * import { GetFeaturedProductsDocument } from '@/generated/graphql';
146
+ *
147
+ * const client = getClient();
148
+ * const { products } = await client.request(GetFeaturedProductsDocument, { first: 6 });
149
+ *
150
+ * // Client Component
151
+ * import { useQuery } from '@tanstack/react-query';
152
+ * import { getGraphQLClient } from '@/lib/graphql/client';
153
+ * import { GetFeaturedProductsDocument } from '@/generated/graphql';
154
+ *
155
+ * const client = getGraphQLClient();
156
+ * const { data } = useQuery({
157
+ * queryKey: ['FeaturedProducts'],
158
+ * queryFn: () => client.request(GetFeaturedProductsDocument, { first: 6 }),
159
+ * });
160
+ */
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Hooks - Custom React hooks for storefront functionality
3
+ */
4
+
5
+ export { useAuth } from "./use-auth";
6
+ export { useCartSync } from "./use-cart-sync";
7
+ export { useCartActions } from "./use-cart-actions";
8
+ export { useFilterParams } from "./use-filter-params";
9
+ export type { UseFilterParamsReturn, UseFilterParamsOptions } from "./use-filter-params";