@vendure-platform/create 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (531) hide show
  1. package/README.md +70 -0
  2. package/dist/assets/demo-data/branding/logo.svg +4 -0
  3. package/dist/assets/demo-data/images/absorbent-pad.webp +0 -0
  4. package/dist/assets/demo-data/images/adjustable-wrench.webp +0 -0
  5. package/dist/assets/demo-data/images/anchor-bolt.webp +0 -0
  6. package/dist/assets/demo-data/images/angle-grinder.webp +0 -0
  7. package/dist/assets/demo-data/images/barrier-tape.webp +0 -0
  8. package/dist/assets/demo-data/images/bench-grinder.webp +0 -0
  9. package/dist/assets/demo-data/images/bracket.webp +0 -0
  10. package/dist/assets/demo-data/images/broom.webp +0 -0
  11. package/dist/assets/demo-data/images/bucket.webp +0 -0
  12. package/dist/assets/demo-data/images/cable-gland.webp +0 -0
  13. package/dist/assets/demo-data/images/cable-tie.webp +0 -0
  14. package/dist/assets/demo-data/images/cable-tray.webp +0 -0
  15. package/dist/assets/demo-data/images/cable.webp +0 -0
  16. package/dist/assets/demo-data/images/chimney-base-kit.webp +0 -0
  17. package/dist/assets/demo-data/images/chimney-cowl-bird-guard.webp +0 -0
  18. package/dist/assets/demo-data/images/chimney-cowl-open.webp +0 -0
  19. package/dist/assets/demo-data/images/chimney-storm-collar.webp +0 -0
  20. package/dist/assets/demo-data/images/chimney-wall-bracket.webp +0 -0
  21. package/dist/assets/demo-data/images/circular-saw.webp +0 -0
  22. package/dist/assets/demo-data/images/cleaning-spray.webp +0 -0
  23. package/dist/assets/demo-data/images/conduit.webp +0 -0
  24. package/dist/assets/demo-data/images/cordless-drill.webp +0 -0
  25. package/dist/assets/demo-data/images/drill-bits.webp +0 -0
  26. package/dist/assets/demo-data/images/dust-mask.webp +0 -0
  27. package/dist/assets/demo-data/images/ear-defenders.webp +0 -0
  28. package/dist/assets/demo-data/images/ear-plugs.webp +0 -0
  29. package/dist/assets/demo-data/images/extension-lead.webp +0 -0
  30. package/dist/assets/demo-data/images/eye-wash-station.webp +0 -0
  31. package/dist/assets/demo-data/images/face-shield.webp +0 -0
  32. package/dist/assets/demo-data/images/file-set.webp +0 -0
  33. package/dist/assets/demo-data/images/first-aid-kit.webp +0 -0
  34. package/dist/assets/demo-data/images/floor-sign.webp +0 -0
  35. package/dist/assets/demo-data/images/flue-bend-45.webp +0 -0
  36. package/dist/assets/demo-data/images/flue-bend-90.webp +0 -0
  37. package/dist/assets/demo-data/images/flue-section-1000mm.webp +0 -0
  38. package/dist/assets/demo-data/images/flue-section-250mm.webp +0 -0
  39. package/dist/assets/demo-data/images/flue-section-500mm.webp +0 -0
  40. package/dist/assets/demo-data/images/fuse.webp +0 -0
  41. package/dist/assets/demo-data/images/glove-dispenser.webp +0 -0
  42. package/dist/assets/demo-data/images/grinding-disc.webp +0 -0
  43. package/dist/assets/demo-data/images/hacksaw.webp +0 -0
  44. package/dist/assets/demo-data/images/hammer.webp +0 -0
  45. package/dist/assets/demo-data/images/hand-sanitiser.webp +0 -0
  46. package/dist/assets/demo-data/images/head-torch.webp +0 -0
  47. package/dist/assets/demo-data/images/heat-gun.webp +0 -0
  48. package/dist/assets/demo-data/images/hex-bolt.webp +0 -0
  49. package/dist/assets/demo-data/images/hex-key-set.webp +0 -0
  50. package/dist/assets/demo-data/images/hex-nut.webp +0 -0
  51. package/dist/assets/demo-data/images/hi-vis-jacket.webp +0 -0
  52. package/dist/assets/demo-data/images/hi-vis-vest.webp +0 -0
  53. package/dist/assets/demo-data/images/hose-clamp.webp +0 -0
  54. package/dist/assets/demo-data/images/impact-driver.webp +0 -0
  55. package/dist/assets/demo-data/images/jigsaw.webp +0 -0
  56. package/dist/assets/demo-data/images/junction-box.webp +0 -0
  57. package/dist/assets/demo-data/images/knee-pads.webp +0 -0
  58. package/dist/assets/demo-data/images/machine-screw.webp +0 -0
  59. package/dist/assets/demo-data/images/made-to-order-configurable-chimney.webp +0 -0
  60. package/dist/assets/demo-data/images/mallet.webp +0 -0
  61. package/dist/assets/demo-data/images/mcb.webp +0 -0
  62. package/dist/assets/demo-data/images/mop.webp +0 -0
  63. package/dist/assets/demo-data/images/paper-towels.webp +0 -0
  64. package/dist/assets/demo-data/images/pipe-wrench.webp +0 -0
  65. package/dist/assets/demo-data/images/pliers-set.webp +0 -0
  66. package/dist/assets/demo-data/images/pry-bar.webp +0 -0
  67. package/dist/assets/demo-data/images/rcd.webp +0 -0
  68. package/dist/assets/demo-data/images/reciprocating-saw.webp +0 -0
  69. package/dist/assets/demo-data/images/rivet.webp +0 -0
  70. package/dist/assets/demo-data/images/roof-flashing-high-pitch.webp +0 -0
  71. package/dist/assets/demo-data/images/roof-flashing-low-pitch.webp +0 -0
  72. package/dist/assets/demo-data/images/safety-boots.webp +0 -0
  73. package/dist/assets/demo-data/images/safety-glasses.webp +0 -0
  74. package/dist/assets/demo-data/images/safety-harness.webp +0 -0
  75. package/dist/assets/demo-data/images/safety-helmet.webp +0 -0
  76. package/dist/assets/demo-data/images/safety-sign.webp +0 -0
  77. package/dist/assets/demo-data/images/sanding-disc.webp +0 -0
  78. package/dist/assets/demo-data/images/saw-blade.webp +0 -0
  79. package/dist/assets/demo-data/images/screwdriver-set.webp +0 -0
  80. package/dist/assets/demo-data/images/screwdriver.webp +0 -0
  81. package/dist/assets/demo-data/images/self-tapping-screw.webp +0 -0
  82. package/dist/assets/demo-data/images/socket-set.webp +0 -0
  83. package/dist/assets/demo-data/images/socket.webp +0 -0
  84. package/dist/assets/demo-data/images/spanner-set.webp +0 -0
  85. package/dist/assets/demo-data/images/spanner.webp +0 -0
  86. package/dist/assets/demo-data/images/spill-kit.webp +0 -0
  87. package/dist/assets/demo-data/images/spirit-level.webp +0 -0
  88. package/dist/assets/demo-data/images/switch.webp +0 -0
  89. package/dist/assets/demo-data/images/tape-measure.webp +0 -0
  90. package/dist/assets/demo-data/images/terminal-block.webp +0 -0
  91. package/dist/assets/demo-data/images/threaded-rod.webp +0 -0
  92. package/dist/assets/demo-data/images/torque-wrench.webp +0 -0
  93. package/dist/assets/demo-data/images/utility-knife.webp +0 -0
  94. package/dist/assets/demo-data/images/wall-pass-sleeve.webp +0 -0
  95. package/dist/assets/demo-data/images/wall-plug.webp +0 -0
  96. package/dist/assets/demo-data/images/washer.webp +0 -0
  97. package/dist/assets/demo-data/images/waste-bin.webp +0 -0
  98. package/dist/assets/demo-data/images/wire-connector.webp +0 -0
  99. package/dist/assets/demo-data/images/wire-cutters.webp +0 -0
  100. package/dist/assets/demo-data/images/wood-screw.webp +0 -0
  101. package/dist/assets/demo-data/images/work-gloves.webp +0 -0
  102. package/dist/assets/demo-data/images/work-light.webp +0 -0
  103. package/dist/assets/demo-data/initial-data.json +667 -0
  104. package/dist/assets/demo-data/products.csv +779 -0
  105. package/dist/assets/storefront/.env.example +14 -0
  106. package/dist/assets/storefront/.env.local +1 -0
  107. package/dist/assets/storefront/components.json +22 -0
  108. package/dist/assets/storefront/eslint.config.mjs +23 -0
  109. package/dist/assets/storefront/graphql.config.yml +2 -0
  110. package/dist/assets/storefront/messages/de.json +1196 -0
  111. package/dist/assets/storefront/messages/en.json +1196 -0
  112. package/dist/assets/storefront/next-env.d.ts +6 -0
  113. package/dist/assets/storefront/next.config.ts +73 -0
  114. package/dist/assets/storefront/package.json +77 -0
  115. package/dist/assets/storefront/postcss.config.mjs +5 -0
  116. package/dist/assets/storefront/public/next.svg +22 -0
  117. package/dist/assets/storefront/public/scenarios/b2b-wholesale/hero/hero-bg.webp +0 -0
  118. package/dist/assets/storefront/public/scenarios/b2b-wholesale/logo.svg +4 -0
  119. package/dist/assets/storefront/public/scenarios/default/logo.svg +4 -0
  120. package/dist/assets/storefront/public/scenarios/kaminpro/hero/hero-bg.webp +0 -0
  121. package/dist/assets/storefront/public/scenarios/kaminpro/logo.svg +7 -0
  122. package/dist/assets/storefront/public/vendure.svg +4 -0
  123. package/dist/assets/storefront/src/app/[locale]/(catalog)/catalog/page.tsx +65 -0
  124. package/dist/assets/storefront/src/app/[locale]/(catalog)/collection/[slug]/loading.tsx +24 -0
  125. package/dist/assets/storefront/src/app/[locale]/(catalog)/collection/[slug]/page.tsx +194 -0
  126. package/dist/assets/storefront/src/app/[locale]/(catalog)/layout.tsx +9 -0
  127. package/dist/assets/storefront/src/app/[locale]/(catalog)/product/[slug]/actions.ts +139 -0
  128. package/dist/assets/storefront/src/app/[locale]/(catalog)/product/[slug]/loading.tsx +46 -0
  129. package/dist/assets/storefront/src/app/[locale]/(catalog)/product/[slug]/page.tsx +330 -0
  130. package/dist/assets/storefront/src/app/[locale]/(catalog)/search/actions.ts +11 -0
  131. package/dist/assets/storefront/src/app/[locale]/(catalog)/search/loading.tsx +20 -0
  132. package/dist/assets/storefront/src/app/[locale]/(catalog)/search/page.tsx +97 -0
  133. package/dist/assets/storefront/src/app/[locale]/(catalog)/search/search-analytics-tracker.tsx +46 -0
  134. package/dist/assets/storefront/src/app/[locale]/(catalog)/search/search-results.tsx +53 -0
  135. package/dist/assets/storefront/src/app/[locale]/(catalog)/search/search-term.tsx +26 -0
  136. package/dist/assets/storefront/src/app/[locale]/(scenario)/[...path]/page.tsx +31 -0
  137. package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/accept-invitation-client.tsx +56 -0
  138. package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/actions.ts +32 -0
  139. package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/page.tsx +85 -0
  140. package/dist/assets/storefront/src/app/[locale]/accept-invitation/[token]/sign-out-and-retry.tsx +26 -0
  141. package/dist/assets/storefront/src/app/[locale]/account/addresses/actions.ts +125 -0
  142. package/dist/assets/storefront/src/app/[locale]/account/addresses/address-form.tsx +180 -0
  143. package/dist/assets/storefront/src/app/[locale]/account/addresses/addresses-client.tsx +292 -0
  144. package/dist/assets/storefront/src/app/[locale]/account/addresses/loading.tsx +48 -0
  145. package/dist/assets/storefront/src/app/[locale]/account/addresses/page.tsx +54 -0
  146. package/dist/assets/storefront/src/app/[locale]/account/approvals/actions.ts +28 -0
  147. package/dist/assets/storefront/src/app/[locale]/account/approvals/page.tsx +340 -0
  148. package/dist/assets/storefront/src/app/[locale]/account/company/actions.ts +33 -0
  149. package/dist/assets/storefront/src/app/[locale]/account/company/addresses/actions.ts +83 -0
  150. package/dist/assets/storefront/src/app/[locale]/account/company/addresses/address-form.tsx +267 -0
  151. package/dist/assets/storefront/src/app/[locale]/account/company/addresses/addresses-client.tsx +253 -0
  152. package/dist/assets/storefront/src/app/[locale]/account/company/addresses/page.tsx +75 -0
  153. package/dist/assets/storefront/src/app/[locale]/account/company/business-units/actions.ts +70 -0
  154. package/dist/assets/storefront/src/app/[locale]/account/company/business-units/business-unit-form.tsx +153 -0
  155. package/dist/assets/storefront/src/app/[locale]/account/company/business-units/business-units-client.tsx +210 -0
  156. package/dist/assets/storefront/src/app/[locale]/account/company/business-units/page.tsx +66 -0
  157. package/dist/assets/storefront/src/app/[locale]/account/company/business-units/types.ts +8 -0
  158. package/dist/assets/storefront/src/app/[locale]/account/company/edit-company-form.tsx +57 -0
  159. package/dist/assets/storefront/src/app/[locale]/account/company/page.tsx +89 -0
  160. package/dist/assets/storefront/src/app/[locale]/account/company/payment-methods/page.tsx +65 -0
  161. package/dist/assets/storefront/src/app/[locale]/account/company/payment-methods/payment-methods-client.tsx +55 -0
  162. package/dist/assets/storefront/src/app/[locale]/account/company/roles/page.tsx +66 -0
  163. package/dist/assets/storefront/src/app/[locale]/account/company/roles/roles-client.tsx +93 -0
  164. package/dist/assets/storefront/src/app/[locale]/account/company/tax-ids/actions.ts +51 -0
  165. package/dist/assets/storefront/src/app/[locale]/account/company/tax-ids/page.tsx +57 -0
  166. package/dist/assets/storefront/src/app/[locale]/account/company/tax-ids/tax-ids-client.tsx +326 -0
  167. package/dist/assets/storefront/src/app/[locale]/account/company/users/actions.ts +74 -0
  168. package/dist/assets/storefront/src/app/[locale]/account/company/users/edit-user-form.tsx +157 -0
  169. package/dist/assets/storefront/src/app/[locale]/account/company/users/invite-user-form.tsx +133 -0
  170. package/dist/assets/storefront/src/app/[locale]/account/company/users/page.tsx +104 -0
  171. package/dist/assets/storefront/src/app/[locale]/account/company/users/users-client.tsx +266 -0
  172. package/dist/assets/storefront/src/app/[locale]/account/error.tsx +24 -0
  173. package/dist/assets/storefront/src/app/[locale]/account/layout.tsx +50 -0
  174. package/dist/assets/storefront/src/app/[locale]/account/orders/[code]/page.tsx +463 -0
  175. package/dist/assets/storefront/src/app/[locale]/account/orders/[code]/reorder-actions.ts +160 -0
  176. package/dist/assets/storefront/src/app/[locale]/account/orders/[code]/reorder-dialog.tsx +386 -0
  177. package/dist/assets/storefront/src/app/[locale]/account/orders/loading.tsx +45 -0
  178. package/dist/assets/storefront/src/app/[locale]/account/orders/page.tsx +309 -0
  179. package/dist/assets/storefront/src/app/[locale]/account/profile/actions.ts +106 -0
  180. package/dist/assets/storefront/src/app/[locale]/account/profile/change-password-form.tsx +82 -0
  181. package/dist/assets/storefront/src/app/[locale]/account/profile/edit-email-form.tsx +88 -0
  182. package/dist/assets/storefront/src/app/[locale]/account/profile/edit-profile-form.tsx +80 -0
  183. package/dist/assets/storefront/src/app/[locale]/account/profile/loading.tsx +54 -0
  184. package/dist/assets/storefront/src/app/[locale]/account/profile/page.tsx +44 -0
  185. package/dist/assets/storefront/src/app/[locale]/account/quick-order/actions.ts +103 -0
  186. package/dist/assets/storefront/src/app/[locale]/account/quick-order/file-upload-tab.tsx +148 -0
  187. package/dist/assets/storefront/src/app/[locale]/account/quick-order/manual-entry-tab.tsx +112 -0
  188. package/dist/assets/storefront/src/app/[locale]/account/quick-order/page.tsx +26 -0
  189. package/dist/assets/storefront/src/app/[locale]/account/quick-order/preview-table.tsx +170 -0
  190. package/dist/assets/storefront/src/app/[locale]/account/quick-order/quick-order-form.tsx +243 -0
  191. package/dist/assets/storefront/src/app/[locale]/account/quick-order/save-to-list-dialog.tsx +153 -0
  192. package/dist/assets/storefront/src/app/[locale]/account/quick-order/sku-autocomplete.tsx +118 -0
  193. package/dist/assets/storefront/src/app/[locale]/account/quick-order/text-input-tab.tsx +40 -0
  194. package/dist/assets/storefront/src/app/[locale]/account/quotes/[id]/page.tsx +260 -0
  195. package/dist/assets/storefront/src/app/[locale]/account/quotes/actions.ts +253 -0
  196. package/dist/assets/storefront/src/app/[locale]/account/quotes/new/new-quote-form.tsx +28 -0
  197. package/dist/assets/storefront/src/app/[locale]/account/quotes/new/page.tsx +51 -0
  198. package/dist/assets/storefront/src/app/[locale]/account/quotes/page.tsx +248 -0
  199. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/[id]/loading.tsx +44 -0
  200. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/[id]/page.tsx +51 -0
  201. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/[id]/shopping-list-detail-client.tsx +562 -0
  202. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/actions.ts +235 -0
  203. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/create-shopping-list-form.tsx +86 -0
  204. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/loading.tsx +48 -0
  205. package/dist/assets/storefront/src/app/[locale]/account/shopping-lists/page.tsx +176 -0
  206. package/dist/assets/storefront/src/app/[locale]/account/store-credits/actions.ts +31 -0
  207. package/dist/assets/storefront/src/app/[locale]/account/store-credits/claim-form.tsx +41 -0
  208. package/dist/assets/storefront/src/app/[locale]/account/store-credits/page.tsx +190 -0
  209. package/dist/assets/storefront/src/app/[locale]/account/store-credits/reveal-code.tsx +38 -0
  210. package/dist/assets/storefront/src/app/[locale]/account/verify-email/page.tsx +117 -0
  211. package/dist/assets/storefront/src/app/[locale]/cart/actions.ts +128 -0
  212. package/dist/assets/storefront/src/app/[locale]/cart/cart-items.tsx +228 -0
  213. package/dist/assets/storefront/src/app/[locale]/cart/cart-line-actions.tsx +55 -0
  214. package/dist/assets/storefront/src/app/[locale]/cart/cart-quantity-control.tsx +158 -0
  215. package/dist/assets/storefront/src/app/[locale]/cart/cart-remove-button.tsx +36 -0
  216. package/dist/assets/storefront/src/app/[locale]/cart/cart.tsx +151 -0
  217. package/dist/assets/storefront/src/app/[locale]/cart/code-input.tsx +49 -0
  218. package/dist/assets/storefront/src/app/[locale]/cart/loading.tsx +10 -0
  219. package/dist/assets/storefront/src/app/[locale]/cart/order-summary.tsx +178 -0
  220. package/dist/assets/storefront/src/app/[locale]/cart/page.tsx +33 -0
  221. package/dist/assets/storefront/src/app/[locale]/cart/promotion-code.tsx +142 -0
  222. package/dist/assets/storefront/src/app/[locale]/cart/reapproval-confirm.tsx +76 -0
  223. package/dist/assets/storefront/src/app/[locale]/cart/request-quote-button.tsx +80 -0
  224. package/dist/assets/storefront/src/app/[locale]/checkout/actions.ts +192 -0
  225. package/dist/assets/storefront/src/app/[locale]/checkout/cancel-quote-checkout-button.tsx +30 -0
  226. package/dist/assets/storefront/src/app/[locale]/checkout/checkout-flow.tsx +214 -0
  227. package/dist/assets/storefront/src/app/[locale]/checkout/checkout-provider.tsx +181 -0
  228. package/dist/assets/storefront/src/app/[locale]/checkout/loading.tsx +90 -0
  229. package/dist/assets/storefront/src/app/[locale]/checkout/order-summary.tsx +160 -0
  230. package/dist/assets/storefront/src/app/[locale]/checkout/page.tsx +154 -0
  231. package/dist/assets/storefront/src/app/[locale]/checkout/steps/delivery-step.tsx +107 -0
  232. package/dist/assets/storefront/src/app/[locale]/checkout/steps/payment-step.tsx +110 -0
  233. package/dist/assets/storefront/src/app/[locale]/checkout/steps/review-step.tsx +180 -0
  234. package/dist/assets/storefront/src/app/[locale]/checkout/steps/shipping-address-step.tsx +518 -0
  235. package/dist/assets/storefront/src/app/[locale]/checkout/types.ts +7 -0
  236. package/dist/assets/storefront/src/app/[locale]/error.tsx +28 -0
  237. package/dist/assets/storefront/src/app/[locale]/forgot-password/actions.ts +28 -0
  238. package/dist/assets/storefront/src/app/[locale]/forgot-password/forgot-password-form.tsx +128 -0
  239. package/dist/assets/storefront/src/app/[locale]/forgot-password/page.tsx +24 -0
  240. package/dist/assets/storefront/src/app/[locale]/globals.css +72 -0
  241. package/dist/assets/storefront/src/app/[locale]/layout.tsx +202 -0
  242. package/dist/assets/storefront/src/app/[locale]/not-found.tsx +26 -0
  243. package/dist/assets/storefront/src/app/[locale]/order-confirmation/[code]/order-confirmation.tsx +296 -0
  244. package/dist/assets/storefront/src/app/[locale]/order-confirmation/[code]/page.tsx +18 -0
  245. package/dist/assets/storefront/src/app/[locale]/page.tsx +125 -0
  246. package/dist/assets/storefront/src/app/[locale]/register/actions.ts +50 -0
  247. package/dist/assets/storefront/src/app/[locale]/register/page.tsx +82 -0
  248. package/dist/assets/storefront/src/app/[locale]/register/registration-form.tsx +237 -0
  249. package/dist/assets/storefront/src/app/[locale]/register-company/actions.ts +40 -0
  250. package/dist/assets/storefront/src/app/[locale]/register-company/page.tsx +43 -0
  251. package/dist/assets/storefront/src/app/[locale]/register-company/registration-form.tsx +48 -0
  252. package/dist/assets/storefront/src/app/[locale]/reset-password/actions.ts +40 -0
  253. package/dist/assets/storefront/src/app/[locale]/reset-password/page.tsx +32 -0
  254. package/dist/assets/storefront/src/app/[locale]/reset-password/reset-password-form.tsx +96 -0
  255. package/dist/assets/storefront/src/app/[locale]/shopping-list/[code]/add-to-cart-button.tsx +31 -0
  256. package/dist/assets/storefront/src/app/[locale]/shopping-list/[code]/loading.tsx +29 -0
  257. package/dist/assets/storefront/src/app/[locale]/shopping-list/[code]/page.tsx +157 -0
  258. package/dist/assets/storefront/src/app/[locale]/sign-in/actions.ts +76 -0
  259. package/dist/assets/storefront/src/app/[locale]/sign-in/login-form.tsx +177 -0
  260. package/dist/assets/storefront/src/app/[locale]/sign-in/page.tsx +81 -0
  261. package/dist/assets/storefront/src/app/[locale]/verify/actions.ts +41 -0
  262. package/dist/assets/storefront/src/app/[locale]/verify/page.tsx +40 -0
  263. package/dist/assets/storefront/src/app/[locale]/verify/verify-content.tsx +127 -0
  264. package/dist/assets/storefront/src/app/[locale]/verify-pending/page.tsx +67 -0
  265. package/dist/assets/storefront/src/app/api/clear-company-context/route.ts +26 -0
  266. package/dist/assets/storefront/src/app/api/draft/disable/route.ts +12 -0
  267. package/dist/assets/storefront/src/app/api/draft/route.ts +17 -0
  268. package/dist/assets/storefront/src/app/api/revalidate/route.ts +110 -0
  269. package/dist/assets/storefront/src/app/api/search-analytics/route.ts +16 -0
  270. package/dist/assets/storefront/src/app/favicon.ico +0 -0
  271. package/dist/assets/storefront/src/components/commerce/account-nav-items.ts +56 -0
  272. package/dist/assets/storefront/src/components/commerce/account-sidebar.tsx +112 -0
  273. package/dist/assets/storefront/src/components/commerce/active-filters.tsx +107 -0
  274. package/dist/assets/storefront/src/components/commerce/approval-decision-form.tsx +70 -0
  275. package/dist/assets/storefront/src/components/commerce/approval-status-badge.tsx +37 -0
  276. package/dist/assets/storefront/src/components/commerce/business-unit-switcher.tsx +56 -0
  277. package/dist/assets/storefront/src/components/commerce/catalog-search-bar.tsx +83 -0
  278. package/dist/assets/storefront/src/components/commerce/category-product-section.tsx +69 -0
  279. package/dist/assets/storefront/src/components/commerce/category-sidebar.tsx +133 -0
  280. package/dist/assets/storefront/src/components/commerce/collection-hero-banner.tsx +36 -0
  281. package/dist/assets/storefront/src/components/commerce/company-state-badge.tsx +32 -0
  282. package/dist/assets/storefront/src/components/commerce/company-switcher.tsx +58 -0
  283. package/dist/assets/storefront/src/components/commerce/configurator-form.tsx +606 -0
  284. package/dist/assets/storefront/src/components/commerce/facet-filters.tsx +286 -0
  285. package/dist/assets/storefront/src/components/commerce/gift-card-pdp.tsx +43 -0
  286. package/dist/assets/storefront/src/components/commerce/gift-card-product-info.tsx +137 -0
  287. package/dist/assets/storefront/src/components/commerce/highlighted-text.tsx +30 -0
  288. package/dist/assets/storefront/src/components/commerce/instant-search-dropdown.tsx +377 -0
  289. package/dist/assets/storefront/src/components/commerce/order-status-badge.tsx +41 -0
  290. package/dist/assets/storefront/src/components/commerce/packaging-unit-selector.tsx +146 -0
  291. package/dist/assets/storefront/src/components/commerce/permission-gate.tsx +20 -0
  292. package/dist/assets/storefront/src/components/commerce/price-range-filter.tsx +111 -0
  293. package/dist/assets/storefront/src/components/commerce/price-tiers.tsx +98 -0
  294. package/dist/assets/storefront/src/components/commerce/price.tsx +29 -0
  295. package/dist/assets/storefront/src/components/commerce/product-card-list.tsx +121 -0
  296. package/dist/assets/storefront/src/components/commerce/product-card.tsx +89 -0
  297. package/dist/assets/storefront/src/components/commerce/product-carousel.tsx +42 -0
  298. package/dist/assets/storefront/src/components/commerce/product-grid.tsx +54 -0
  299. package/dist/assets/storefront/src/components/commerce/product-image-carousel.tsx +127 -0
  300. package/dist/assets/storefront/src/components/commerce/product-info.tsx +525 -0
  301. package/dist/assets/storefront/src/components/commerce/product-list-expansion.tsx +393 -0
  302. package/dist/assets/storefront/src/components/commerce/product-list-view.tsx +34 -0
  303. package/dist/assets/storefront/src/components/commerce/product-sidebar.tsx +175 -0
  304. package/dist/assets/storefront/src/components/commerce/product-view-switcher.tsx +107 -0
  305. package/dist/assets/storefront/src/components/commerce/quote-action-buttons.tsx +235 -0
  306. package/dist/assets/storefront/src/components/commerce/quote-activity-timeline.tsx +320 -0
  307. package/dist/assets/storefront/src/components/commerce/quote-comment-form.tsx +52 -0
  308. package/dist/assets/storefront/src/components/commerce/quote-csv-export-button.tsx +97 -0
  309. package/dist/assets/storefront/src/components/commerce/quote-product-search.tsx +139 -0
  310. package/dist/assets/storefront/src/components/commerce/quote-request-form.tsx +252 -0
  311. package/dist/assets/storefront/src/components/commerce/quote-status-badge.tsx +41 -0
  312. package/dist/assets/storefront/src/components/commerce/quote-validity-indicator.tsx +33 -0
  313. package/dist/assets/storefront/src/components/commerce/quote-version-comparison.tsx +88 -0
  314. package/dist/assets/storefront/src/components/commerce/related-products.tsx +56 -0
  315. package/dist/assets/storefront/src/components/commerce/shop-by-category.tsx +59 -0
  316. package/dist/assets/storefront/src/components/commerce/shopping-list-toggle.tsx +158 -0
  317. package/dist/assets/storefront/src/components/commerce/sort-dropdown.tsx +51 -0
  318. package/dist/assets/storefront/src/components/commerce/store-credit-summary.tsx +45 -0
  319. package/dist/assets/storefront/src/components/commerce/subcollection-tiles.tsx +56 -0
  320. package/dist/assets/storefront/src/components/layout/auth-page-shell.tsx +15 -0
  321. package/dist/assets/storefront/src/components/layout/draft-mode-action.ts +8 -0
  322. package/dist/assets/storefront/src/components/layout/draft-mode-indicator.tsx +54 -0
  323. package/dist/assets/storefront/src/components/layout/draft-mode-link.tsx +29 -0
  324. package/dist/assets/storefront/src/components/layout/footer.tsx +168 -0
  325. package/dist/assets/storefront/src/components/layout/navbar/actions.ts +33 -0
  326. package/dist/assets/storefront/src/components/layout/navbar/cart-icon.tsx +50 -0
  327. package/dist/assets/storefront/src/components/layout/navbar/channel-picker-wrapper.tsx +19 -0
  328. package/dist/assets/storefront/src/components/layout/navbar/channel-picker.tsx +53 -0
  329. package/dist/assets/storefront/src/components/layout/navbar/currency-picker-wrapper.tsx +21 -0
  330. package/dist/assets/storefront/src/components/layout/navbar/currency-picker.tsx +52 -0
  331. package/dist/assets/storefront/src/components/layout/navbar/language-picker.tsx +51 -0
  332. package/dist/assets/storefront/src/components/layout/navbar/login-button.tsx +34 -0
  333. package/dist/assets/storefront/src/components/layout/navbar/mobile-nav.tsx +74 -0
  334. package/dist/assets/storefront/src/components/layout/navbar/nav-menu-items.tsx +51 -0
  335. package/dist/assets/storefront/src/components/layout/navbar/navbar-cart.tsx +5 -0
  336. package/dist/assets/storefront/src/components/layout/navbar/navbar-collections.tsx +291 -0
  337. package/dist/assets/storefront/src/components/layout/navbar/navbar-link.tsx +28 -0
  338. package/dist/assets/storefront/src/components/layout/navbar/navbar-user.tsx +147 -0
  339. package/dist/assets/storefront/src/components/layout/navbar/theme-switcher.tsx +39 -0
  340. package/dist/assets/storefront/src/components/layout/navbar.tsx +117 -0
  341. package/dist/assets/storefront/src/components/layout/search-input.tsx +71 -0
  342. package/dist/assets/storefront/src/components/providers/awaiting-approval-banner.tsx +58 -0
  343. package/dist/assets/storefront/src/components/providers/cart-count-server.tsx +31 -0
  344. package/dist/assets/storefront/src/components/providers/company-context-guard.tsx +47 -0
  345. package/dist/assets/storefront/src/components/providers/company-permissions-server.tsx +14 -0
  346. package/dist/assets/storefront/src/components/providers/theme-provider.tsx +16 -0
  347. package/dist/assets/storefront/src/components/shared/breadcrumbs.tsx +39 -0
  348. package/dist/assets/storefront/src/components/shared/catalog-sidebar-skeleton.tsx +21 -0
  349. package/dist/assets/storefront/src/components/shared/country-select.tsx +83 -0
  350. package/dist/assets/storefront/src/components/shared/error-state.tsx +16 -0
  351. package/dist/assets/storefront/src/components/shared/pagination.tsx +119 -0
  352. package/dist/assets/storefront/src/components/shared/prefetch-link.tsx +36 -0
  353. package/dist/assets/storefront/src/components/shared/product-grid-skeleton.tsx +26 -0
  354. package/dist/assets/storefront/src/components/shared/scenario-paused.tsx +80 -0
  355. package/dist/assets/storefront/src/components/shared/skeletons/cart-skeleton.tsx +48 -0
  356. package/dist/assets/storefront/src/components/shared/skeletons/navbar-user-skeleton.tsx +9 -0
  357. package/dist/assets/storefront/src/components/shared/skeletons/search-input-skeleton.tsx +7 -0
  358. package/dist/assets/storefront/src/components/shared/skeletons/search-results-skeleton.tsx +17 -0
  359. package/dist/assets/storefront/src/components/ui/accordion.tsx +66 -0
  360. package/dist/assets/storefront/src/components/ui/alert-dialog.tsx +157 -0
  361. package/dist/assets/storefront/src/components/ui/alert.tsx +66 -0
  362. package/dist/assets/storefront/src/components/ui/aspect-ratio.tsx +11 -0
  363. package/dist/assets/storefront/src/components/ui/avatar.tsx +53 -0
  364. package/dist/assets/storefront/src/components/ui/badge.tsx +46 -0
  365. package/dist/assets/storefront/src/components/ui/breadcrumb.tsx +109 -0
  366. package/dist/assets/storefront/src/components/ui/button.tsx +58 -0
  367. package/dist/assets/storefront/src/components/ui/calendar.tsx +213 -0
  368. package/dist/assets/storefront/src/components/ui/card.tsx +92 -0
  369. package/dist/assets/storefront/src/components/ui/carousel.tsx +241 -0
  370. package/dist/assets/storefront/src/components/ui/chart.tsx +357 -0
  371. package/dist/assets/storefront/src/components/ui/checkbox.tsx +32 -0
  372. package/dist/assets/storefront/src/components/ui/collapsible.tsx +33 -0
  373. package/dist/assets/storefront/src/components/ui/command.tsx +184 -0
  374. package/dist/assets/storefront/src/components/ui/context-menu.tsx +252 -0
  375. package/dist/assets/storefront/src/components/ui/dialog.tsx +143 -0
  376. package/dist/assets/storefront/src/components/ui/drawer.tsx +135 -0
  377. package/dist/assets/storefront/src/components/ui/dropdown-menu.tsx +257 -0
  378. package/dist/assets/storefront/src/components/ui/empty-state.tsx +37 -0
  379. package/dist/assets/storefront/src/components/ui/field.tsx +244 -0
  380. package/dist/assets/storefront/src/components/ui/form.tsx +167 -0
  381. package/dist/assets/storefront/src/components/ui/hover-card.tsx +44 -0
  382. package/dist/assets/storefront/src/components/ui/input-otp.tsx +77 -0
  383. package/dist/assets/storefront/src/components/ui/input.tsx +21 -0
  384. package/dist/assets/storefront/src/components/ui/kbd-shortcut.tsx +20 -0
  385. package/dist/assets/storefront/src/components/ui/label.tsx +24 -0
  386. package/dist/assets/storefront/src/components/ui/menubar.tsx +276 -0
  387. package/dist/assets/storefront/src/components/ui/navigation-menu.tsx +168 -0
  388. package/dist/assets/storefront/src/components/ui/pagination.tsx +127 -0
  389. package/dist/assets/storefront/src/components/ui/popover.tsx +48 -0
  390. package/dist/assets/storefront/src/components/ui/progress.tsx +31 -0
  391. package/dist/assets/storefront/src/components/ui/radio-group.tsx +45 -0
  392. package/dist/assets/storefront/src/components/ui/resizable.tsx +56 -0
  393. package/dist/assets/storefront/src/components/ui/scroll-area.tsx +58 -0
  394. package/dist/assets/storefront/src/components/ui/select.tsx +185 -0
  395. package/dist/assets/storefront/src/components/ui/separator.tsx +28 -0
  396. package/dist/assets/storefront/src/components/ui/sheet.tsx +139 -0
  397. package/dist/assets/storefront/src/components/ui/sidebar.tsx +728 -0
  398. package/dist/assets/storefront/src/components/ui/skeleton.tsx +13 -0
  399. package/dist/assets/storefront/src/components/ui/slider.tsx +63 -0
  400. package/dist/assets/storefront/src/components/ui/sonner.tsx +25 -0
  401. package/dist/assets/storefront/src/components/ui/switch.tsx +31 -0
  402. package/dist/assets/storefront/src/components/ui/table.tsx +116 -0
  403. package/dist/assets/storefront/src/components/ui/tabs.tsx +66 -0
  404. package/dist/assets/storefront/src/components/ui/textarea.tsx +18 -0
  405. package/dist/assets/storefront/src/components/ui/toggle-group.tsx +73 -0
  406. package/dist/assets/storefront/src/components/ui/toggle.tsx +47 -0
  407. package/dist/assets/storefront/src/components/ui/tooltip.tsx +61 -0
  408. package/dist/assets/storefront/src/config/branding.ts +4 -0
  409. package/dist/assets/storefront/src/config/scenario-meta.ts +46 -0
  410. package/dist/assets/storefront/src/config/scenario.ts +313 -0
  411. package/dist/assets/storefront/src/contexts/auth-context.tsx +35 -0
  412. package/dist/assets/storefront/src/graphql.ts +14 -0
  413. package/dist/assets/storefront/src/hooks/use-mobile.ts +19 -0
  414. package/dist/assets/storefront/src/i18n/locale-utils.ts +33 -0
  415. package/dist/assets/storefront/src/i18n/locales.ts +18 -0
  416. package/dist/assets/storefront/src/i18n/navigation.ts +35 -0
  417. package/dist/assets/storefront/src/i18n/request.ts +19 -0
  418. package/dist/assets/storefront/src/i18n/routing.ts +19 -0
  419. package/dist/assets/storefront/src/i18n/server.ts +16 -0
  420. package/dist/assets/storefront/src/lib/actions/switch-channel.ts +32 -0
  421. package/dist/assets/storefront/src/lib/actions/switch-currency.ts +25 -0
  422. package/dist/assets/storefront/src/lib/auth.ts +18 -0
  423. package/dist/assets/storefront/src/lib/backend-health.ts +38 -0
  424. package/dist/assets/storefront/src/lib/cart-count-context.tsx +59 -0
  425. package/dist/assets/storefront/src/lib/cart-guard-utils.ts +10 -0
  426. package/dist/assets/storefront/src/lib/cart-guard.ts +104 -0
  427. package/dist/assets/storefront/src/lib/channel-server.ts +28 -0
  428. package/dist/assets/storefront/src/lib/channel.ts +2 -0
  429. package/dist/assets/storefront/src/lib/company-context.ts +35 -0
  430. package/dist/assets/storefront/src/lib/company-permissions-context.tsx +40 -0
  431. package/dist/assets/storefront/src/lib/currency-server.ts +20 -0
  432. package/dist/assets/storefront/src/lib/currency.ts +2 -0
  433. package/dist/assets/storefront/src/lib/format.ts +48 -0
  434. package/dist/assets/storefront/src/lib/metadata.ts +85 -0
  435. package/dist/assets/storefront/src/lib/quantity.test.js +20 -0
  436. package/dist/assets/storefront/src/lib/quantity.ts +20 -0
  437. package/dist/assets/storefront/src/lib/search-bar-context.tsx +45 -0
  438. package/dist/assets/storefront/src/lib/search-helpers.ts +69 -0
  439. package/dist/assets/storefront/src/lib/use-recent-searches.ts +55 -0
  440. package/dist/assets/storefront/src/lib/utils.ts +6 -0
  441. package/dist/assets/storefront/src/lib/vendure/actions.ts +96 -0
  442. package/dist/assets/storefront/src/lib/vendure/api.ts +164 -0
  443. package/dist/assets/storefront/src/lib/vendure/approval-utils.ts +21 -0
  444. package/dist/assets/storefront/src/lib/vendure/cached.ts +71 -0
  445. package/dist/assets/storefront/src/lib/vendure/fragments.ts +213 -0
  446. package/dist/assets/storefront/src/lib/vendure/instant-search-action.ts +104 -0
  447. package/dist/assets/storefront/src/lib/vendure/mutations.ts +1136 -0
  448. package/dist/assets/storefront/src/lib/vendure/queries.ts +1406 -0
  449. package/dist/assets/storefront/src/middleware.ts +11 -0
  450. package/dist/assets/storefront/src/scenarios/b2b-wholesale/branding.ts +180 -0
  451. package/dist/assets/storefront/src/scenarios/b2b-wholesale/hero.tsx +122 -0
  452. package/dist/assets/storefront/src/scenarios/b2b-wholesale/index.ts +21 -0
  453. package/dist/assets/storefront/src/scenarios/b2b-wholesale/meta.ts +3 -0
  454. package/dist/assets/storefront/src/scenarios/default/branding.ts +148 -0
  455. package/dist/assets/storefront/src/scenarios/default/hero.tsx +107 -0
  456. package/dist/assets/storefront/src/scenarios/default/index.ts +12 -0
  457. package/dist/assets/storefront/src/scenarios/default/meta.ts +3 -0
  458. package/dist/assets/storefront/src/scenarios/kaminpro/auth-gate.tsx +36 -0
  459. package/dist/assets/storefront/src/scenarios/kaminpro/branding.ts +238 -0
  460. package/dist/assets/storefront/src/scenarios/kaminpro/cart-items.tsx +359 -0
  461. package/dist/assets/storefront/src/scenarios/kaminpro/hero.tsx +123 -0
  462. package/dist/assets/storefront/src/scenarios/kaminpro/index.ts +50 -0
  463. package/dist/assets/storefront/src/scenarios/kaminpro/meta.ts +9 -0
  464. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/banners.tsx +21 -0
  465. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/bom-basket.tsx +221 -0
  466. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/btn.tsx +38 -0
  467. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/chip.tsx +35 -0
  468. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/config-header.tsx +72 -0
  469. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/field-row.tsx +126 -0
  470. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/info-dot.tsx +38 -0
  471. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/login-notice.tsx +81 -0
  472. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/module-panel.tsx +144 -0
  473. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/quote-dialog.tsx +110 -0
  474. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/schematic.tsx +674 -0
  475. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/why-panel.tsx +66 -0
  476. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/configurator-pdp.tsx +43 -0
  477. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/configurator-shell.tsx +320 -0
  478. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/lib/data.ts +150 -0
  479. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/lib/types.ts +30 -0
  480. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/styles.css +104 -0
  481. package/dist/assets/storefront/src/scenarios/kaminpro/shop-by-system.tsx +97 -0
  482. package/dist/assets/storefront/src/scenarios/kaminpro/system-finder/decision-tree.ts +261 -0
  483. package/dist/assets/storefront/src/scenarios/kaminpro/system-finder/page.tsx +21 -0
  484. package/dist/assets/storefront/src/scenarios/kaminpro/system-finder/wizard.tsx +600 -0
  485. package/dist/assets/storefront/src/schema.graphql.placeholder +5 -0
  486. package/dist/assets/storefront/tsconfig.json +37 -0
  487. package/dist/assets/templates/CLAUDE.md.hbs +63 -0
  488. package/dist/assets/templates/README.md.hbs +53 -0
  489. package/dist/assets/templates/custom-populate.ts.hbs +28 -0
  490. package/dist/assets/templates/docker-compose.yml.hbs +29 -0
  491. package/dist/assets/templates/env.hbs +44 -0
  492. package/dist/assets/templates/environment.d.ts.hbs +32 -0
  493. package/dist/assets/templates/gitignore.hbs +7 -0
  494. package/dist/assets/templates/index.ts.hbs +16 -0
  495. package/dist/assets/templates/npmrc.hbs +1 -0
  496. package/dist/assets/templates/populate.ts.hbs +27 -0
  497. package/dist/assets/templates/root-package.json.hbs +17 -0
  498. package/dist/assets/templates/server-package.json.hbs +31 -0
  499. package/dist/assets/templates/tsconfig.dashboard.json.hbs +17 -0
  500. package/dist/assets/templates/tsconfig.root.json.hbs +16 -0
  501. package/dist/assets/templates/tsconfig.server.json.hbs +20 -0
  502. package/dist/assets/templates/vendure-config.ts.hbs +80 -0
  503. package/dist/assets/templates/vite.config.mts.hbs +27 -0
  504. package/dist/bin/run.d.ts +2 -0
  505. package/dist/bin/run.js +79 -0
  506. package/dist/bin/run.js.map +1 -0
  507. package/dist/cli.d.ts +6 -0
  508. package/dist/cli.js +154 -0
  509. package/dist/cli.js.map +1 -0
  510. package/dist/git-init.d.ts +4 -0
  511. package/dist/git-init.js +60 -0
  512. package/dist/git-init.js.map +1 -0
  513. package/dist/index.d.ts +4 -0
  514. package/dist/index.js +13 -0
  515. package/dist/index.js.map +1 -0
  516. package/dist/plugin-registry.d.ts +10 -0
  517. package/dist/plugin-registry.js +485 -0
  518. package/dist/plugin-registry.js.map +1 -0
  519. package/dist/scaffolder.d.ts +10 -0
  520. package/dist/scaffolder.js +218 -0
  521. package/dist/scaffolder.js.map +1 -0
  522. package/dist/storefront-copier.d.ts +6 -0
  523. package/dist/storefront-copier.js +68 -0
  524. package/dist/storefront-copier.js.map +1 -0
  525. package/dist/template-renderer.d.ts +30 -0
  526. package/dist/template-renderer.js +177 -0
  527. package/dist/template-renderer.js.map +1 -0
  528. package/dist/types.d.ts +60 -0
  529. package/dist/types.js +3 -0
  530. package/dist/types.js.map +1 -0
  531. package/package.json +48 -0
@@ -0,0 +1,96 @@
1
+ import {client} from './api';
2
+ import {GetActiveCustomerQuery, GetCompanyAccountQuery, GetMyCompaniesQuery, type CompanyUserCompany} from './queries';
3
+ import {getActiveChannelCached} from './cached';
4
+ import {cache} from "react";
5
+ import {readFragment, ResultOf} from "@/graphql";
6
+ import {
7
+ ActiveCustomerFragment,
8
+ CompanyBusinessUnitFragment,
9
+ CompanyFragment,
10
+ CompanyPermissionFragment,
11
+ CompanyRoleFragment,
12
+ CompanyUserFragment,
13
+ } from "@/lib/vendure/fragments";
14
+
15
+ type CompanyRoleData = Omit<ResultOf<typeof CompanyRoleFragment>, 'permissions'> & {
16
+ permissions: ResultOf<typeof CompanyPermissionFragment>[];
17
+ };
18
+
19
+ type CompanyUserData = Omit<ResultOf<typeof CompanyUserFragment>, 'companyRoles' | 'businessUnits'> & {
20
+ companyRoles: CompanyRoleData[];
21
+ businessUnits: ResultOf<typeof CompanyBusinessUnitFragment>[];
22
+ };
23
+
24
+ export interface CompanyAccount {
25
+ company: ResultOf<typeof CompanyFragment>;
26
+ companyUser: CompanyUserData;
27
+ activeBusinessUnit: ResultOf<typeof CompanyBusinessUnitFragment> | null;
28
+ permissions: string[];
29
+ }
30
+
31
+ export const getActiveCustomer = cache(async () => {
32
+ const [result, error] = await client.query(GetActiveCustomerQuery);
33
+ if (error) {
34
+ return null;
35
+ }
36
+ return readFragment(ActiveCustomerFragment, result.data.activeCustomer);
37
+ })
38
+
39
+ export const getCompanyAccount = cache(async (): Promise<CompanyAccount | null> => {
40
+ const [result, error] = await client.query(GetCompanyAccountQuery);
41
+ if (error) {
42
+ return null;
43
+ }
44
+ const account = result.data.companyAccount;
45
+ if (!account) return null;
46
+
47
+ const company = readFragment(CompanyFragment, account.company);
48
+ const rawUser = readFragment(CompanyUserFragment, account.companyUser);
49
+ const activeBusinessUnit = account.activeBusinessUnit
50
+ ? readFragment(CompanyBusinessUnitFragment, account.activeBusinessUnit)
51
+ : null;
52
+
53
+ const companyUser: CompanyUserData = {
54
+ ...rawUser,
55
+ companyRoles: rawUser.companyRoles.map(r => {
56
+ const role = readFragment(CompanyRoleFragment, r);
57
+ return {
58
+ ...role,
59
+ permissions: role.permissions.map(p => readFragment(CompanyPermissionFragment, p)),
60
+ };
61
+ }),
62
+ businessUnits: rawUser.businessUnits.map(bu => readFragment(CompanyBusinessUnitFragment, bu)),
63
+ };
64
+
65
+ return {
66
+ company,
67
+ companyUser,
68
+ activeBusinessUnit,
69
+ permissions: [...account.permissions],
70
+ };
71
+ });
72
+
73
+ export const getMyCompanies = cache(async (): Promise<CompanyUserCompany[]> => {
74
+ const [result, error] = await client.query(GetMyCompaniesQuery);
75
+ if (error) return [];
76
+ const customer = result.data.activeCustomer;
77
+ if (!customer) return [];
78
+ return customer.companyUsers
79
+ .filter(cu => cu.state === 'Active')
80
+ .map(cu => ({ id: cu.company.id, name: cu.company.name, state: cu.company.state }));
81
+ });
82
+
83
+ /**
84
+ * Returns true if the current user belongs to any company (active or pending).
85
+ * Uses getCompanyAccount (which requires Active company state) with a fallback
86
+ * to getMyCompanies (which includes pending companies via CompanyUser state).
87
+ */
88
+ export const getHasCompany = cache(async (): Promise<boolean> => {
89
+ const [companyAccount, companies] = await Promise.all([
90
+ getCompanyAccount(),
91
+ getMyCompanies(),
92
+ ]);
93
+ return !!companyAccount || companies.length > 0;
94
+ });
95
+
96
+ export const getActiveChannel = getActiveChannelCached;
@@ -0,0 +1,164 @@
1
+ import {createClient} from '@vendure-platform/storefront-client';
2
+ import type {RequestMiddleware} from '@vendure-platform/storefront-client';
3
+
4
+ const DRAFT_MODE_SECRET = process.env.DRAFT_MODE_SECRET;
5
+
6
+ /**
7
+ * Middleware that appends ?draftMode=<secret> to the Vendure API URL
8
+ * when Next.js draft mode is enabled, so the content-versioning plugin
9
+ * returns unpublished draft content.
10
+ */
11
+ const draftModeMiddleware: RequestMiddleware = async (req, next) => {
12
+ if (DRAFT_MODE_SECRET) {
13
+ try {
14
+ const {draftMode} = await import('next/headers');
15
+ const draft = await draftMode();
16
+ if (draft.isEnabled) {
17
+ const url = new URL(req.url);
18
+ url.searchParams.set('draftMode', DRAFT_MODE_SECRET);
19
+ req.url = url.toString();
20
+ }
21
+ } catch {
22
+ // draftMode() not available (e.g. during build or in 'use cache' blocks)
23
+ }
24
+ }
25
+ return next(req);
26
+ };
27
+
28
+ const VENDURE_API_URL = process.env.VENDURE_SHOP_API_URL || process.env.NEXT_PUBLIC_VENDURE_SHOP_API_URL;
29
+ const VENDURE_CHANNEL_TOKEN = process.env.VENDURE_CHANNEL_TOKEN || process.env.NEXT_PUBLIC_VENDURE_CHANNEL_TOKEN;
30
+ const VENDURE_AUTH_TOKEN_HEADER = process.env.VENDURE_AUTH_TOKEN_HEADER || 'vendure-auth-token';
31
+ const VENDURE_CHANNEL_TOKEN_HEADER = process.env.VENDURE_CHANNEL_TOKEN_HEADER || 'vendure-token';
32
+
33
+ if (!VENDURE_API_URL) {
34
+ throw new Error('VENDURE_SHOP_API_URL or NEXT_PUBLIC_VENDURE_SHOP_API_URL environment variable is not set');
35
+ }
36
+
37
+ // Dynamic imports to avoid Next.js static analysis marking this module as dynamic.
38
+ // cookies() is only available in request context — providers gracefully return undefined otherwise.
39
+ async function safeGetAuthToken(): Promise<string | undefined> {
40
+ try {
41
+ const {getAuthToken} = await import('@/lib/auth');
42
+ return await getAuthToken();
43
+ } catch { return undefined; }
44
+ }
45
+
46
+ async function safeGetCompanyId(): Promise<string | undefined> {
47
+ try {
48
+ const {getCompanyId} = await import('@/lib/company-context');
49
+ return await getCompanyId();
50
+ } catch { return undefined; }
51
+ }
52
+
53
+ async function safeGetBusinessUnitId(): Promise<string | undefined> {
54
+ try {
55
+ const {getBusinessUnitId} = await import('@/lib/company-context');
56
+ return await getBusinessUnitId();
57
+ } catch { return undefined; }
58
+ }
59
+
60
+ /**
61
+ * Provider for the `client`'s dynamic channel token (layer 3 in storefront-client precedence).
62
+ * Precedence: per-request option (layer 1) > client state (layer 2) > provider (layer 3) > config (layer 4).
63
+ * When this returns a token, it overrides `sharedConfig.channelToken` (the env var default at layer 4).
64
+ * When it returns undefined (build time, 'use cache' blocks), the env var default is used.
65
+ */
66
+ async function safeGetChannelToken(): Promise<string | undefined> {
67
+ try {
68
+ const {getActiveChannelToken} = await import('@/lib/channel-server');
69
+ return await getActiveChannelToken();
70
+ } catch { return undefined; }
71
+ }
72
+
73
+ async function safeGetLanguageCode(): Promise<string | undefined> {
74
+ try {
75
+ const {getLocale} = await import('next-intl/server');
76
+ return await getLocale();
77
+ } catch { return undefined; }
78
+ }
79
+
80
+ const sharedConfig = {
81
+ apiUrl: VENDURE_API_URL,
82
+ channelToken: VENDURE_CHANNEL_TOKEN,
83
+ headerNames: {
84
+ authToken: VENDURE_AUTH_TOKEN_HEADER,
85
+ channelToken: VENDURE_CHANNEL_TOKEN_HEADER,
86
+ },
87
+ } as const;
88
+
89
+ /**
90
+ * Middleware that sets the currencyCode query parameter from the user's
91
+ * currency cookie, so Vendure returns prices in the selected currency.
92
+ */
93
+ const currencyMiddleware: RequestMiddleware = async (req, next) => {
94
+ try {
95
+ const {getActiveCurrencyCode} = await import('@/lib/currency-server');
96
+ const currency = await getActiveCurrencyCode();
97
+ const url = new URL(req.url);
98
+ url.searchParams.set('currencyCode', currency);
99
+ req.url = url.toString();
100
+ } catch {
101
+ // cookies() not available (e.g. during build or in 'use cache' blocks)
102
+ }
103
+ return next(req);
104
+ };
105
+
106
+ const middleware = [draftModeMiddleware, currencyMiddleware];
107
+
108
+ export const client = createClient({
109
+ ...sharedConfig,
110
+ middleware,
111
+ providers: {
112
+ authToken: safeGetAuthToken,
113
+ channelToken: safeGetChannelToken,
114
+ companyId: safeGetCompanyId,
115
+ businessUnitId: safeGetBusinessUnitId,
116
+ // languageCode is NOT included here because with cacheComponents: true,
117
+ // every server component is an implicit cache scope where getLocale()
118
+ // triggers headers() which is forbidden. Instead, languageCode is passed
119
+ // explicitly via VendureContext or query options.
120
+ },
121
+ });
122
+
123
+ /**
124
+ * Client without providers or middleware — for 'use cache' functions that fetch public data.
125
+ * Next.js 'use cache' forbids Dynamic APIs (cookies/headers), so this client must not
126
+ * access cookies, headers, or draftMode. Pass languageCode and currencyCode explicitly
127
+ * as query options from the calling function.
128
+ */
129
+ export const publicClient = createClient({...sharedConfig});
130
+
131
+ /**
132
+ * Pre-resolved context for use at cache boundaries where cookies() is not available.
133
+ */
134
+ export interface VendureContext {
135
+ authToken?: string;
136
+ channelToken?: string;
137
+ companyId?: string;
138
+ businessUnitId?: string;
139
+ locale: string;
140
+ currencyCode?: string;
141
+ }
142
+
143
+ /**
144
+ * Resolves auth token and company context from cookies.
145
+ * Use this at cache boundaries ('use cache') where providers can't access cookies().
146
+ */
147
+ export async function getVendureContext(): Promise<VendureContext> {
148
+ const {getAuthToken} = await import('@/lib/auth');
149
+ const authToken = await getAuthToken();
150
+ let companyId: string | undefined;
151
+ let businessUnitId: string | undefined;
152
+ try {
153
+ const {getCompanyId, getBusinessUnitId} = await import('@/lib/company-context');
154
+ companyId = await getCompanyId();
155
+ businessUnitId = await getBusinessUnitId();
156
+ } catch {}
157
+ const {getActiveChannelToken} = await import('@/lib/channel-server');
158
+ const channelToken = await getActiveChannelToken();
159
+ const {getRouteLocale} = await import('@/i18n/server');
160
+ const locale = await getRouteLocale();
161
+ const {getActiveCurrencyCode} = await import('@/lib/currency-server');
162
+ const currencyCode = await getActiveCurrencyCode();
163
+ return {authToken, channelToken, companyId, businessUnitId, locale, currencyCode};
164
+ }
@@ -0,0 +1,21 @@
1
+ import {client} from '@/lib/vendure/api';
2
+ import type {VendureContext} from '@/lib/vendure/api';
3
+ import {GetApprovalHistoryForEntityQuery} from '@/lib/vendure/queries';
4
+
5
+ export async function getLatestApprovalForOrder(orderId: string, ctx?: VendureContext) {
6
+ const queryArgs = { entityType: 'Order', entityId: orderId } as const;
7
+ const [result] = ctx
8
+ ? await client.query(GetApprovalHistoryForEntityQuery, queryArgs, ctx)
9
+ : await client.query(GetApprovalHistoryForEntityQuery, queryArgs);
10
+ const history = [...(result?.data?.approvalHistoryForEntity ?? [])]
11
+ .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
12
+ const latestApproval = history[0] ?? null;
13
+ const changesRequested = latestApproval?.status === 'CHANGES_REQUESTED';
14
+ const changesComment = changesRequested
15
+ ? latestApproval.decisions
16
+ ?.filter((d: any) => d.decision === 'CHANGES_REQUESTED' && d.comment)
17
+ .map((d: any) => d.comment)
18
+ .at(-1) ?? null
19
+ : null;
20
+ return { latestApproval, changesRequested, changesComment };
21
+ }
@@ -0,0 +1,71 @@
1
+ import {cacheLife, cacheTag} from 'next/cache';
2
+ import {publicClient} from './api';
3
+ import {GetActiveChannelQuery, GetAvailableCountriesQuery, GetTopCollectionsQuery} from './queries';
4
+
5
+ /**
6
+ * Get the active channel with caching enabled.
7
+ * Channel configuration rarely changes, so we cache it for 1 hour.
8
+ * Not locale-dependent — channel config is the same for all locales.
9
+ *
10
+ * @param channelToken - When provided, queries this specific channel instead of the static default.
11
+ * Used by multi-channel scenarios (e.g. b2b-wholesale) where the channel varies per-request.
12
+ * The token is included in the cache key automatically (function argument in 'use cache').
13
+ */
14
+ export async function getActiveChannelCached(channelToken?: string) {
15
+ 'use cache';
16
+ cacheLife('hours');
17
+ if (channelToken) cacheTag(`channel-${channelToken}`);
18
+
19
+ const [result, error] = await publicClient.query(
20
+ GetActiveChannelQuery,
21
+ undefined,
22
+ channelToken ? {channelToken} : undefined,
23
+ );
24
+ if (error) {
25
+ // Vendure API unavailable during build
26
+ return { id: '', code: '', defaultLanguageCode: 'en' as const, availableLanguageCodes: [], defaultCurrencyCode: 'USD' as const, availableCurrencyCodes: [] };
27
+ }
28
+ return result.data.activeChannel;
29
+ }
30
+
31
+ /**
32
+ * Get available countries with caching enabled.
33
+ * Country names are locale-dependent (translated by Vendure).
34
+ * Countries may differ per channel (different shipping zones).
35
+ */
36
+ export async function getAvailableCountriesCached(locale: string, channelToken?: string) {
37
+ 'use cache';
38
+ cacheLife('max');
39
+ cacheTag(`countries-${locale}${channelToken ? `-${channelToken}` : ''}`);
40
+
41
+ const [result, error] = await publicClient.query(
42
+ GetAvailableCountriesQuery,
43
+ undefined,
44
+ {languageCode: locale, ...(channelToken ? {channelToken} : {})},
45
+ );
46
+ if (error) {
47
+ return [];
48
+ }
49
+ return result.data.availableCountries || [];
50
+ }
51
+
52
+ /**
53
+ * Get top-level collections with caching enabled.
54
+ * Collection names/descriptions are locale-dependent (translated by Vendure).
55
+ * Collections may differ per channel (e.g. DE excludes Trockenbau).
56
+ */
57
+ export async function getTopCollections(locale: string, channelToken?: string) {
58
+ 'use cache';
59
+ cacheLife('days');
60
+ cacheTag(`collections-${locale}${channelToken ? `-${channelToken}` : ''}`);
61
+
62
+ const [result, error] = await publicClient.query(
63
+ GetTopCollectionsQuery,
64
+ undefined,
65
+ {languageCode: locale, ...(channelToken ? {channelToken} : {})},
66
+ );
67
+ if (error) {
68
+ return [];
69
+ }
70
+ return result.data.collections.items;
71
+ }
@@ -0,0 +1,213 @@
1
+ import { graphql } from '@/graphql';
2
+
3
+ export const ProductCardFragment = graphql(`
4
+ fragment ProductCard on SearchResult {
5
+ productId
6
+ productName
7
+ slug
8
+ sku
9
+ inStock
10
+ productAsset {
11
+ id
12
+ preview
13
+ }
14
+ price {
15
+ __typename
16
+ ... on PriceRange {
17
+ min
18
+ max
19
+ }
20
+ ... on SinglePrice {
21
+ value
22
+ }
23
+ }
24
+ priceWithTax {
25
+ __typename
26
+ ... on PriceRange {
27
+ min
28
+ max
29
+ }
30
+ ... on SinglePrice {
31
+ value
32
+ }
33
+ }
34
+ currencyCode
35
+ highlights {
36
+ field
37
+ matchedTokens
38
+ }
39
+ }
40
+ `);
41
+
42
+ export const ActiveCustomerFragment = graphql(`
43
+ fragment ActiveCustomer on Customer {
44
+ id
45
+ firstName
46
+ lastName
47
+ emailAddress
48
+ }
49
+ `);
50
+
51
+ export const ShoppingListFragment = graphql(`
52
+ fragment ShoppingListFields on ShoppingList {
53
+ id
54
+ createdAt
55
+ updatedAt
56
+ name
57
+ description
58
+ isDefault
59
+ isPublic
60
+ publicCode
61
+ customer {
62
+ id
63
+ firstName
64
+ lastName
65
+ }
66
+ }
67
+ `);
68
+
69
+ export const ShoppingListItemFragment = graphql(`
70
+ fragment ShoppingListItemFields on ShoppingListItem {
71
+ id
72
+ createdAt
73
+ updatedAt
74
+ productVariantId
75
+ purchased
76
+ lastPurchasedAt
77
+ note
78
+ quantity
79
+ sortOrder
80
+ productVariant {
81
+ id
82
+ name
83
+ sku
84
+ priceWithTax
85
+ stockLevel
86
+ product {
87
+ id
88
+ name
89
+ slug
90
+ featuredAsset {
91
+ id
92
+ preview
93
+ }
94
+ }
95
+ }
96
+ }
97
+ `);
98
+ export const CompanyPermissionFragment = graphql(`
99
+ fragment CompanyPermission on CompanyPermission {
100
+ id
101
+ name
102
+ description
103
+ isBuiltIn
104
+ }
105
+ `);
106
+
107
+ export const CompanyRoleFragment = graphql(
108
+ `
109
+ fragment CompanyRole on CompanyRole {
110
+ id
111
+ name
112
+ isDefault
113
+ permissions {
114
+ ...CompanyPermission
115
+ }
116
+ }
117
+ `,
118
+ [CompanyPermissionFragment],
119
+ );
120
+
121
+ export const CompanyBusinessUnitFragment = graphql(`
122
+ fragment CompanyBusinessUnit on CompanyBusinessUnit {
123
+ id
124
+ name
125
+ email
126
+ phone
127
+ parent {
128
+ id
129
+ name
130
+ }
131
+ children {
132
+ id
133
+ name
134
+ }
135
+ }
136
+ `);
137
+
138
+ export const CompanyAddressFragment = graphql(`
139
+ fragment CompanyAddress on CompanyAddress {
140
+ id
141
+ fullName
142
+ streetLine1
143
+ streetLine2
144
+ province
145
+ country {
146
+ id
147
+ code
148
+ name
149
+ }
150
+ city
151
+ postalCode
152
+ phoneNumber
153
+ defaultShippingAddress
154
+ defaultBillingAddress
155
+ businessUnit {
156
+ id
157
+ name
158
+ }
159
+ }
160
+ `);
161
+
162
+ export const CompanyPaymentMethodFragment = graphql(`
163
+ fragment CompanyPaymentMethod on CompanyPaymentMethod {
164
+ id
165
+ name
166
+ description
167
+ terms
168
+ }
169
+ `);
170
+
171
+ export const CompanyUserFragment = graphql(
172
+ `
173
+ fragment CompanyUser on CompanyUser {
174
+ id
175
+ state
176
+ customer {
177
+ id
178
+ firstName
179
+ lastName
180
+ emailAddress
181
+ }
182
+ companyRoles {
183
+ ...CompanyRole
184
+ }
185
+ businessUnits {
186
+ ...CompanyBusinessUnit
187
+ }
188
+ }
189
+ `,
190
+ [CompanyRoleFragment, CompanyBusinessUnitFragment],
191
+ );
192
+
193
+ export const CompanyFragment = graphql(`
194
+ fragment Company on Company {
195
+ id
196
+ name
197
+ state
198
+ }
199
+ `);
200
+
201
+ export const TaxIdFragment = graphql(`
202
+ fragment TaxIdFields on TaxId {
203
+ id
204
+ createdAt
205
+ updatedAt
206
+ number
207
+ type
208
+ countryCode
209
+ validationStatus
210
+ validatedAt
211
+ isDefault
212
+ }
213
+ `);
@@ -0,0 +1,104 @@
1
+ 'use server';
2
+
3
+ import { client } from './api';
4
+ import { CollectionSearchQuery, InstantSearchQuery } from './queries';
5
+
6
+ export interface InstantSearchProduct {
7
+ productId: string;
8
+ productName: string;
9
+ slug: string;
10
+ sku: string;
11
+ inStock: boolean;
12
+ imageUrl?: string;
13
+ price: { type: 'single'; value: number } | { type: 'range'; min: number; max: number };
14
+ currencyCode: string;
15
+ }
16
+
17
+ export interface InstantSearchCollection {
18
+ id: string;
19
+ name: string;
20
+ slug: string;
21
+ score: number;
22
+ }
23
+
24
+ export interface InstantSearchResult {
25
+ products: InstantSearchProduct[];
26
+ collections: InstantSearchCollection[];
27
+ totalItems: number;
28
+ }
29
+
30
+ export async function instantSearch(term: string): Promise<InstantSearchResult> {
31
+ if (!term || term.trim().length < 2) {
32
+ return { products: [], collections: [], totalItems: 0 };
33
+ }
34
+
35
+ const trimmed = term.trim();
36
+
37
+ // Fire product search and collection search in parallel
38
+ const [productResult, collectionResult] = await Promise.all([
39
+ client.query(InstantSearchQuery, {
40
+ input: {
41
+ term: trimmed,
42
+ take: 6,
43
+ skip: 0,
44
+ groupByProduct: true,
45
+ prefixMode: true,
46
+ },
47
+ }),
48
+ client.query(CollectionSearchQuery, {
49
+ input: {
50
+ term: trimmed,
51
+ take: 3,
52
+ prefixMode: true,
53
+ },
54
+ }),
55
+ ]);
56
+
57
+ const [prodRes, prodError] = productResult;
58
+ if (prodError) throw prodError;
59
+
60
+ const data = prodRes.data.search;
61
+
62
+ // Deduplicate products by productId
63
+ const seenProductIds = new Set<string>();
64
+ const products: InstantSearchProduct[] = [];
65
+ for (const item of data.items) {
66
+ if (seenProductIds.has(item.productId)) continue;
67
+ seenProductIds.add(item.productId);
68
+
69
+ let price: InstantSearchProduct['price'];
70
+ if (item.price.__typename === 'PriceRange') {
71
+ price = { type: 'range', min: item.price.min, max: item.price.max };
72
+ } else {
73
+ price = { type: 'single', value: item.price.value };
74
+ }
75
+
76
+ products.push({
77
+ productId: item.productId,
78
+ productName: item.productName,
79
+ slug: item.slug,
80
+ sku: item.sku,
81
+ inStock: item.inStock,
82
+ imageUrl: item.productAsset?.preview,
83
+ price,
84
+ currencyCode: item.currencyCode,
85
+ });
86
+ }
87
+
88
+ const [collRes, collError] = collectionResult;
89
+ if (collError) {
90
+ console.error('[instantSearch] Collection search failed:', collError);
91
+ }
92
+ const collections: InstantSearchCollection[] = [];
93
+ if (!collError) {
94
+ for (const c of collRes.data.searchCollections?.items ?? []) {
95
+ collections.push({ id: c.id, name: c.name, slug: c.slug, score: c.score });
96
+ }
97
+ }
98
+
99
+ return {
100
+ products,
101
+ collections,
102
+ totalItems: data.totalItems,
103
+ };
104
+ }