@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,168 @@
1
+ import chalk from 'chalk';
2
+ /**
3
+ * Global logger state
4
+ */
5
+ let config = {
6
+ verbose: false,
7
+ quiet: false,
8
+ dryRun: false,
9
+ };
10
+ /**
11
+ * Configure the logger
12
+ */
13
+ export function configureLogger(options) {
14
+ config = { ...config, ...options };
15
+ }
16
+ /**
17
+ * Get current logger configuration
18
+ */
19
+ export function getLoggerConfig() {
20
+ return { ...config };
21
+ }
22
+ /**
23
+ * Check if verbose mode is enabled
24
+ */
25
+ export function isVerbose() {
26
+ return config.verbose;
27
+ }
28
+ /**
29
+ * Check if dry-run mode is enabled
30
+ */
31
+ export function isDryRun() {
32
+ return config.dryRun;
33
+ }
34
+ /**
35
+ * Format a message with optional prefix
36
+ */
37
+ function formatMessage(message, prefix) {
38
+ const dryRunPrefix = config.dryRun ? chalk.yellow('[DRY-RUN] ') : '';
39
+ const msgPrefix = prefix ? `${prefix} ` : '';
40
+ return `${dryRunPrefix}${msgPrefix}${message}`;
41
+ }
42
+ /**
43
+ * Log a debug message (only shown in verbose mode)
44
+ */
45
+ export function debug(message, ...args) {
46
+ if (config.verbose && !config.quiet) {
47
+ console.log(formatMessage(chalk.gray(message), chalk.gray('🔍')), ...args);
48
+ }
49
+ }
50
+ /**
51
+ * Log an info message
52
+ */
53
+ export function info(message, ...args) {
54
+ if (!config.quiet) {
55
+ console.log(formatMessage(message, chalk.blue('ℹ')), ...args);
56
+ }
57
+ }
58
+ /**
59
+ * Log a success message
60
+ */
61
+ export function success(message, ...args) {
62
+ if (!config.quiet) {
63
+ console.log(formatMessage(chalk.green(message), chalk.green('✔')), ...args);
64
+ }
65
+ }
66
+ /**
67
+ * Log a warning message
68
+ */
69
+ export function warn(message, ...args) {
70
+ if (!config.quiet) {
71
+ console.warn(formatMessage(chalk.yellow(message), chalk.yellow('⚠')), ...args);
72
+ }
73
+ }
74
+ /**
75
+ * Log an error message
76
+ */
77
+ export function error(message, ...args) {
78
+ console.error(formatMessage(chalk.red(message), chalk.red('✖')), ...args);
79
+ }
80
+ /**
81
+ * Log a step in a process
82
+ */
83
+ export function step(current, total, message) {
84
+ if (!config.quiet) {
85
+ const prefix = chalk.cyan(`[${current}/${total}]`);
86
+ console.log(formatMessage(message, prefix));
87
+ }
88
+ }
89
+ /**
90
+ * Log verbose details (only shown in verbose mode)
91
+ */
92
+ export function verbose(label, value) {
93
+ if (config.verbose && !config.quiet) {
94
+ console.log(formatMessage(`${chalk.gray(label + ':')} ${JSON.stringify(value, null, 2)}`));
95
+ }
96
+ }
97
+ /**
98
+ * Log a command that would be executed
99
+ */
100
+ export function command(cmd) {
101
+ if (config.verbose && !config.quiet) {
102
+ console.log(formatMessage(chalk.dim(`$ ${cmd}`)));
103
+ }
104
+ }
105
+ /**
106
+ * Log a file operation
107
+ */
108
+ export function fileOp(operation, path) {
109
+ const icons = {
110
+ create: chalk.green('+'),
111
+ update: chalk.yellow('~'),
112
+ delete: chalk.red('-'),
113
+ copy: chalk.blue('→'),
114
+ };
115
+ if (!config.quiet) {
116
+ console.log(formatMessage(`${icons[operation]} ${path}`));
117
+ }
118
+ }
119
+ /**
120
+ * Create a logger namespace for a specific module
121
+ */
122
+ export function createLogger(namespace) {
123
+ const prefix = chalk.dim(`[${namespace}]`);
124
+ return {
125
+ debug: (message, ...args) => {
126
+ if (config.verbose && !config.quiet) {
127
+ console.log(formatMessage(chalk.gray(message), `${prefix} ${chalk.gray('🔍')}`), ...args);
128
+ }
129
+ },
130
+ info: (message, ...args) => {
131
+ if (!config.quiet) {
132
+ console.log(formatMessage(message, `${prefix} ${chalk.blue('ℹ')}`), ...args);
133
+ }
134
+ },
135
+ success: (message, ...args) => {
136
+ if (!config.quiet) {
137
+ console.log(formatMessage(chalk.green(message), `${prefix} ${chalk.green('✔')}`), ...args);
138
+ }
139
+ },
140
+ warn: (message, ...args) => {
141
+ if (!config.quiet) {
142
+ console.warn(formatMessage(chalk.yellow(message), `${prefix} ${chalk.yellow('⚠')}`), ...args);
143
+ }
144
+ },
145
+ error: (message, ...args) => {
146
+ console.error(formatMessage(chalk.red(message), `${prefix} ${chalk.red('✖')}`), ...args);
147
+ },
148
+ };
149
+ }
150
+ // Default export for convenience
151
+ export const logger = {
152
+ debug,
153
+ info,
154
+ success,
155
+ warn,
156
+ error,
157
+ step,
158
+ verbose,
159
+ command,
160
+ fileOp,
161
+ configure: configureLogger,
162
+ getConfig: getLoggerConfig,
163
+ isVerbose,
164
+ isDryRun,
165
+ createLogger,
166
+ };
167
+ export default logger;
168
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Supported package managers
3
+ */
4
+ export type PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun';
5
+ /**
6
+ * Package manager information including commands and lock file
7
+ */
8
+ export interface PackageManagerInfo {
9
+ /** Package manager name */
10
+ name: PackageManager;
11
+ /** Detected version (if available) */
12
+ version: string;
13
+ /** Lock file name for this package manager */
14
+ lockFile: string;
15
+ /** Command to install all dependencies */
16
+ installCommand: string;
17
+ /** Command to add a new dependency */
18
+ addCommand: string;
19
+ /** Command to run scripts */
20
+ runCommand: string;
21
+ }
22
+ /**
23
+ * Detect the package manager used in a directory by checking for lock files.
24
+ *
25
+ * Detection priority:
26
+ * 1. pnpm-lock.yaml → pnpm
27
+ * 2. package-lock.json → npm
28
+ * 3. yarn.lock → yarn
29
+ * 4. bun.lockb → bun
30
+ *
31
+ * If no lock file is found, falls back to pnpm if available, otherwise npm.
32
+ *
33
+ * @param cwd - Directory to check (defaults to current working directory)
34
+ * @returns Package manager information
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * const pm = await detectPackageManager();
39
+ * console.log(pm.name); // 'pnpm'
40
+ * console.log(pm.addCommand); // 'pnpm add'
41
+ * ```
42
+ */
43
+ export declare function detectPackageManager(cwd?: string): Promise<PackageManagerInfo>;
44
+ /**
45
+ * Get package manager info by name
46
+ *
47
+ * @param name - Package manager name
48
+ * @returns Package manager information
49
+ */
50
+ export declare function getPackageManagerInfo(name: PackageManager): Promise<PackageManagerInfo>;
51
+ /**
52
+ * Run a package manager command
53
+ *
54
+ * @param pm - Package manager to use
55
+ * @param args - Command arguments
56
+ * @param options - Execa options
57
+ * @returns Execa result
58
+ *
59
+ * @example
60
+ * ```typescript
61
+ * // Install a package
62
+ * await runPackageManager('pnpm', ['add', '@doswiftly/commerce-sdk']);
63
+ *
64
+ * // Run a script
65
+ * await runPackageManager('npm', ['run', 'build']);
66
+ * ```
67
+ */
68
+ export declare function runPackageManager(pm: PackageManager, args: string[], options?: {
69
+ cwd?: string;
70
+ stdio?: 'pipe' | 'inherit';
71
+ }): Promise<{
72
+ stdout: string;
73
+ stderr: string;
74
+ }>;
75
+ /**
76
+ * Install dependencies using the detected or specified package manager
77
+ *
78
+ * @param pm - Package manager to use
79
+ * @param packages - Packages to install (empty for all dependencies)
80
+ * @param options - Installation options
81
+ */
82
+ export declare function installDependencies(pm: PackageManager, packages?: string[], options?: {
83
+ cwd?: string;
84
+ dev?: boolean;
85
+ stdio?: 'pipe' | 'inherit';
86
+ }): Promise<void>;
87
+ /**
88
+ * Check if a specific package manager is the one being used in the directory
89
+ */
90
+ export declare function isUsingPackageManager(pm: PackageManager, cwd?: string): boolean;
91
+ //# sourceMappingURL=package-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/lib/package-manager.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,2BAA2B;IAC3B,IAAI,EAAE,cAAc,CAAC;IACrB,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,cAAc,EAAE,MAAM,CAAC;IACvB,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAC;CACpB;AAsED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA+BnG;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAM7F;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAO,GACzD,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAM7C;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,cAAc,EAClB,QAAQ,GAAE,MAAM,EAAO,EACvB,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAO,GACxE,OAAO,CAAC,IAAI,CAAC,CAoCf;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,cAAc,EAAE,GAAG,GAAE,MAAsB,GAAG,OAAO,CAG9F"}
@@ -0,0 +1,205 @@
1
+ import { existsSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { execa } from 'execa';
4
+ /**
5
+ * Lock file to package manager mapping
6
+ */
7
+ const LOCK_FILES = {
8
+ 'pnpm-lock.yaml': 'pnpm',
9
+ 'package-lock.json': 'npm',
10
+ 'yarn.lock': 'yarn',
11
+ 'bun.lockb': 'bun',
12
+ };
13
+ /**
14
+ * Package manager command configurations
15
+ */
16
+ const PM_CONFIGS = {
17
+ pnpm: {
18
+ name: 'pnpm',
19
+ lockFile: 'pnpm-lock.yaml',
20
+ installCommand: 'pnpm install',
21
+ addCommand: 'pnpm add',
22
+ runCommand: 'pnpm run',
23
+ },
24
+ npm: {
25
+ name: 'npm',
26
+ lockFile: 'package-lock.json',
27
+ installCommand: 'npm install',
28
+ addCommand: 'npm install',
29
+ runCommand: 'npm run',
30
+ },
31
+ yarn: {
32
+ name: 'yarn',
33
+ lockFile: 'yarn.lock',
34
+ installCommand: 'yarn install',
35
+ addCommand: 'yarn add',
36
+ runCommand: 'yarn',
37
+ },
38
+ bun: {
39
+ name: 'bun',
40
+ lockFile: 'bun.lockb',
41
+ installCommand: 'bun install',
42
+ addCommand: 'bun add',
43
+ runCommand: 'bun run',
44
+ },
45
+ };
46
+ /**
47
+ * Get the version of a package manager
48
+ */
49
+ async function getPackageManagerVersion(pm) {
50
+ try {
51
+ const { stdout } = await execa(pm, ['--version'], { stdio: 'pipe' });
52
+ return stdout.trim();
53
+ }
54
+ catch {
55
+ return 'unknown';
56
+ }
57
+ }
58
+ /**
59
+ * Check if a package manager is available in the system
60
+ */
61
+ async function isPackageManagerAvailable(pm) {
62
+ try {
63
+ await execa(pm, ['--version'], { stdio: 'pipe' });
64
+ return true;
65
+ }
66
+ catch {
67
+ return false;
68
+ }
69
+ }
70
+ /**
71
+ * Detect the package manager used in a directory by checking for lock files.
72
+ *
73
+ * Detection priority:
74
+ * 1. pnpm-lock.yaml → pnpm
75
+ * 2. package-lock.json → npm
76
+ * 3. yarn.lock → yarn
77
+ * 4. bun.lockb → bun
78
+ *
79
+ * If no lock file is found, falls back to pnpm if available, otherwise npm.
80
+ *
81
+ * @param cwd - Directory to check (defaults to current working directory)
82
+ * @returns Package manager information
83
+ *
84
+ * @example
85
+ * ```typescript
86
+ * const pm = await detectPackageManager();
87
+ * console.log(pm.name); // 'pnpm'
88
+ * console.log(pm.addCommand); // 'pnpm add'
89
+ * ```
90
+ */
91
+ export async function detectPackageManager(cwd = process.cwd()) {
92
+ // Check for lock files in order of preference
93
+ for (const [lockFile, pmName] of Object.entries(LOCK_FILES)) {
94
+ if (existsSync(join(cwd, lockFile))) {
95
+ const version = await getPackageManagerVersion(pmName);
96
+ return {
97
+ ...PM_CONFIGS[pmName],
98
+ version,
99
+ };
100
+ }
101
+ }
102
+ // No lock file found, check for available package managers
103
+ // Prefer pnpm, then npm as fallback
104
+ const preferredOrder = ['pnpm', 'npm', 'yarn', 'bun'];
105
+ for (const pm of preferredOrder) {
106
+ if (await isPackageManagerAvailable(pm)) {
107
+ const version = await getPackageManagerVersion(pm);
108
+ return {
109
+ ...PM_CONFIGS[pm],
110
+ version,
111
+ };
112
+ }
113
+ }
114
+ // Default to npm if nothing else is available
115
+ return {
116
+ ...PM_CONFIGS.npm,
117
+ version: 'unknown',
118
+ };
119
+ }
120
+ /**
121
+ * Get package manager info by name
122
+ *
123
+ * @param name - Package manager name
124
+ * @returns Package manager information
125
+ */
126
+ export async function getPackageManagerInfo(name) {
127
+ const version = await getPackageManagerVersion(name);
128
+ return {
129
+ ...PM_CONFIGS[name],
130
+ version,
131
+ };
132
+ }
133
+ /**
134
+ * Run a package manager command
135
+ *
136
+ * @param pm - Package manager to use
137
+ * @param args - Command arguments
138
+ * @param options - Execa options
139
+ * @returns Execa result
140
+ *
141
+ * @example
142
+ * ```typescript
143
+ * // Install a package
144
+ * await runPackageManager('pnpm', ['add', '@doswiftly/commerce-sdk']);
145
+ *
146
+ * // Run a script
147
+ * await runPackageManager('npm', ['run', 'build']);
148
+ * ```
149
+ */
150
+ export async function runPackageManager(pm, args, options = {}) {
151
+ const result = await execa(pm, args, {
152
+ cwd: options.cwd,
153
+ stdio: options.stdio || 'pipe',
154
+ });
155
+ return { stdout: result.stdout ?? '', stderr: result.stderr ?? '' };
156
+ }
157
+ /**
158
+ * Install dependencies using the detected or specified package manager
159
+ *
160
+ * @param pm - Package manager to use
161
+ * @param packages - Packages to install (empty for all dependencies)
162
+ * @param options - Installation options
163
+ */
164
+ export async function installDependencies(pm, packages = [], options = {}) {
165
+ const args = [];
166
+ if (packages.length === 0) {
167
+ // Install all dependencies
168
+ args.push('install');
169
+ }
170
+ else {
171
+ // Add specific packages
172
+ switch (pm) {
173
+ case 'pnpm':
174
+ case 'yarn':
175
+ case 'bun':
176
+ args.push('add');
177
+ break;
178
+ case 'npm':
179
+ args.push('install');
180
+ break;
181
+ }
182
+ if (options.dev) {
183
+ switch (pm) {
184
+ case 'pnpm':
185
+ case 'yarn':
186
+ case 'bun':
187
+ args.push('-D');
188
+ break;
189
+ case 'npm':
190
+ args.push('--save-dev');
191
+ break;
192
+ }
193
+ }
194
+ args.push(...packages);
195
+ }
196
+ await runPackageManager(pm, args, { cwd: options.cwd, stdio: options.stdio });
197
+ }
198
+ /**
199
+ * Check if a specific package manager is the one being used in the directory
200
+ */
201
+ export function isUsingPackageManager(pm, cwd = process.cwd()) {
202
+ const lockFile = PM_CONFIGS[pm].lockFile;
203
+ return existsSync(join(cwd, lockFile));
204
+ }
205
+ //# sourceMappingURL=package-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../../src/lib/package-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ interface ProxyOptions {
2
+ port: number;
3
+ targetUrl: string;
4
+ shopSlug: string;
5
+ }
6
+ interface RequestLogEntry {
7
+ timestamp: string;
8
+ method: string;
9
+ path: string;
10
+ status: number;
11
+ duration: number;
12
+ requestHeaders: Record<string, string | string[] | undefined>;
13
+ responseHeaders: Record<string, string | string[] | undefined>;
14
+ }
15
+ /**
16
+ * Start the proxy server
17
+ */
18
+ export declare function startProxyServer(options: ProxyOptions): Promise<void>;
19
+ /**
20
+ * Get request logs
21
+ */
22
+ export declare function getRequestLogs(): RequestLogEntry[];
23
+ export {};
24
+ //# sourceMappingURL=proxy-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-server.d.ts","sourceRoot":"","sources":["../../src/lib/proxy-server.ts"],"names":[],"mappings":"AAIA,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,eAAe;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IAC9D,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;CAChE;AA0JD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAoCrE;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,eAAe,EAAE,CAElD"}
@@ -0,0 +1,173 @@
1
+ import chalk from 'chalk';
2
+ import { createServer } from 'http';
3
+ import { logger } from './logger.js';
4
+ const requestLogs = [];
5
+ /**
6
+ * Format request log for console output
7
+ */
8
+ function formatLogEntry(entry) {
9
+ const statusColor = entry.status >= 400 ? chalk.red : entry.status >= 300 ? chalk.yellow : chalk.green;
10
+ const methodColor = {
11
+ GET: chalk.cyan,
12
+ POST: chalk.green,
13
+ PUT: chalk.yellow,
14
+ PATCH: chalk.yellow,
15
+ DELETE: chalk.red,
16
+ }[entry.method] || chalk.white;
17
+ return `${chalk.gray(entry.timestamp.split('T')[1].split('.')[0])} ` +
18
+ `${methodColor(entry.method.padEnd(7))} ` +
19
+ `${statusColor(String(entry.status).padEnd(4))} ` +
20
+ `${chalk.gray(`${entry.duration}ms`.padStart(6))} ` +
21
+ `${entry.path}`;
22
+ }
23
+ /**
24
+ * Proxy incoming request to target API
25
+ */
26
+ async function proxyRequest(req, res, options) {
27
+ const startTime = Date.now();
28
+ const method = req.method || 'GET';
29
+ const path = req.url || '/';
30
+ const targetUrl = `${options.targetUrl}${path}`;
31
+ logger.debug(`Proxying ${method} ${path} -> ${targetUrl}`);
32
+ try {
33
+ // Collect request body
34
+ const chunks = [];
35
+ for await (const chunk of req) {
36
+ chunks.push(chunk);
37
+ }
38
+ const body = chunks.length > 0 ? Buffer.concat(chunks) : undefined;
39
+ // Build headers for target request
40
+ const headers = {
41
+ 'X-Shop-Slug': options.shopSlug,
42
+ };
43
+ // Copy relevant headers from original request
44
+ const copyHeaders = ['content-type', 'accept', 'authorization', 'user-agent'];
45
+ for (const header of copyHeaders) {
46
+ const value = req.headers[header];
47
+ if (value && typeof value === 'string') {
48
+ headers[header] = value;
49
+ }
50
+ }
51
+ // Make request to target
52
+ const response = await fetch(targetUrl, {
53
+ method,
54
+ headers,
55
+ body: body && body.length > 0 ? body : undefined,
56
+ });
57
+ const duration = Date.now() - startTime;
58
+ // Get response body
59
+ const responseBody = await response.arrayBuffer();
60
+ // Copy response headers
61
+ const responseHeaders = {};
62
+ response.headers.forEach((value, key) => {
63
+ responseHeaders[key] = value;
64
+ // Don't copy certain headers
65
+ if (!['content-encoding', 'transfer-encoding', 'connection'].includes(key.toLowerCase())) {
66
+ res.setHeader(key, value);
67
+ }
68
+ });
69
+ // Add CORS headers for local development (restricted to localhost)
70
+ const origin = req.headers.origin;
71
+ const isLocalhost = origin && /^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/.test(origin);
72
+ res.setHeader('Access-Control-Allow-Origin', isLocalhost ? origin : 'http://localhost:3000');
73
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE, OPTIONS');
74
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Shop-Slug');
75
+ // Log the request
76
+ const logEntry = {
77
+ timestamp: new Date().toISOString(),
78
+ method,
79
+ path,
80
+ status: response.status,
81
+ duration,
82
+ requestHeaders: req.headers,
83
+ responseHeaders,
84
+ };
85
+ requestLogs.push(logEntry);
86
+ // Keep only last 100 logs
87
+ if (requestLogs.length > 100) {
88
+ requestLogs.shift();
89
+ }
90
+ // Output to console
91
+ console.log(formatLogEntry(logEntry));
92
+ // Send response
93
+ res.statusCode = response.status;
94
+ res.end(Buffer.from(responseBody));
95
+ }
96
+ catch (error) {
97
+ const duration = Date.now() - startTime;
98
+ const logEntry = {
99
+ timestamp: new Date().toISOString(),
100
+ method,
101
+ path,
102
+ status: 502,
103
+ duration,
104
+ requestHeaders: req.headers,
105
+ responseHeaders: {},
106
+ };
107
+ requestLogs.push(logEntry);
108
+ console.log(formatLogEntry(logEntry));
109
+ logger.debug(`Proxy error: ${error.message}`);
110
+ res.statusCode = 502;
111
+ res.setHeader('Content-Type', 'application/json');
112
+ res.end(JSON.stringify({
113
+ error: 'Bad Gateway',
114
+ message: `Failed to proxy request: ${error.message}`,
115
+ }));
116
+ }
117
+ }
118
+ /**
119
+ * Handle CORS preflight requests
120
+ */
121
+ function handlePreflight(req, res) {
122
+ const origin = req.headers.origin;
123
+ const isLocalhost = origin && /^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/.test(origin);
124
+ res.setHeader('Access-Control-Allow-Origin', isLocalhost ? origin : 'http://localhost:3000');
125
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE, OPTIONS');
126
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Shop-Slug');
127
+ res.setHeader('Access-Control-Max-Age', '86400');
128
+ res.statusCode = 204;
129
+ res.end();
130
+ }
131
+ /**
132
+ * Start the proxy server
133
+ */
134
+ export function startProxyServer(options) {
135
+ return new Promise((resolve, reject) => {
136
+ const server = createServer((req, res) => {
137
+ // Handle CORS preflight
138
+ if (req.method === 'OPTIONS') {
139
+ handlePreflight(req, res);
140
+ return;
141
+ }
142
+ proxyRequest(req, res, options).catch((error) => {
143
+ logger.debug(`Request handler error: ${error.message}`);
144
+ });
145
+ });
146
+ server.on('error', (error) => {
147
+ reject(error);
148
+ });
149
+ server.listen(options.port, () => {
150
+ console.log(chalk.bold.blue('\n🔌 DoSwiftly Proxy Server\n'));
151
+ console.log(` ${chalk.bold('Local:')} ${chalk.cyan(`http://localhost:${options.port}`)}`);
152
+ console.log(` ${chalk.bold('Target:')} ${chalk.cyan(options.targetUrl)}`);
153
+ console.log(` ${chalk.bold('Shop:')} ${chalk.cyan(options.shopSlug)}`);
154
+ console.log('');
155
+ console.log(chalk.gray(' All requests will be logged below.\n'));
156
+ console.log(chalk.gray('─'.repeat(80)));
157
+ resolve();
158
+ });
159
+ // Handle shutdown
160
+ process.on('SIGINT', () => {
161
+ console.log(chalk.yellow('\n\n⚠️ Stopping proxy server...\n'));
162
+ server.close();
163
+ process.exit(0);
164
+ });
165
+ });
166
+ }
167
+ /**
168
+ * Get request logs
169
+ */
170
+ export function getRequestLogs() {
171
+ return [...requestLogs];
172
+ }
173
+ //# sourceMappingURL=proxy-server.js.map