@hanzo/commerce 7.6.1 → 7.6.4

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 (264) hide show
  1. package/LICENSE.md +21 -0
  2. package/client.ts +124 -64
  3. package/components/add-to-cart-widget.tsx +6 -0
  4. package/components/item/product-card.tsx +18 -1
  5. package/dist/billing.d.ts +2 -0
  6. package/dist/billing.js +3 -0
  7. package/dist/billing.js.map +1 -0
  8. package/dist/client.d.ts +432 -0
  9. package/dist/client.js +392 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/components/Icons.d.ts +18 -0
  12. package/dist/components/Icons.js +19 -0
  13. package/dist/components/Icons.js.map +1 -0
  14. package/dist/components/add-to-cart-widget.d.ts +11 -0
  15. package/dist/components/add-to-cart-widget.js +85 -0
  16. package/dist/components/add-to-cart-widget.js.map +1 -0
  17. package/dist/components/buy/buy-card.d.ts +30 -0
  18. package/dist/components/buy/buy-card.js +109 -0
  19. package/dist/components/buy/buy-card.js.map +1 -0
  20. package/dist/components/buy/carousel-buy-card.d.ts +12 -0
  21. package/dist/components/buy/carousel-buy-card.js +94 -0
  22. package/dist/components/buy/carousel-buy-card.js.map +1 -0
  23. package/dist/components/buy/multi-family/all-variants-carousel.d.ts +4 -0
  24. package/dist/components/buy/multi-family/all-variants-carousel.js +115 -0
  25. package/dist/components/buy/multi-family/all-variants-carousel.js.map +1 -0
  26. package/dist/components/buy/multi-family/family-carousel/index.d.ts +4 -0
  27. package/dist/components/buy/multi-family/family-carousel/index.js +27 -0
  28. package/dist/components/buy/multi-family/family-carousel/index.js.map +1 -0
  29. package/dist/components/buy/multi-family/family-carousel/slide.d.ts +11 -0
  30. package/dist/components/buy/multi-family/family-carousel/slide.js +35 -0
  31. package/dist/components/buy/multi-family/family-carousel/slide.js.map +1 -0
  32. package/dist/components/buy/multi-family/family-carousel/state.d.ts +20 -0
  33. package/dist/components/buy/multi-family/family-carousel/state.js +59 -0
  34. package/dist/components/buy/multi-family/family-carousel/state.js.map +1 -0
  35. package/dist/components/buy/multi-family/index.d.ts +2 -0
  36. package/dist/components/buy/multi-family/index.js +3 -0
  37. package/dist/components/buy/multi-family/index.js.map +1 -0
  38. package/dist/components/buy/single-family-selector.d.ts +15 -0
  39. package/dist/components/buy/single-family-selector.js +28 -0
  40. package/dist/components/buy/single-family-selector.js.map +1 -0
  41. package/dist/components/buy/title-and-byline.d.ts +8 -0
  42. package/dist/components/buy/title-and-byline.js +7 -0
  43. package/dist/components/buy/title-and-byline.js.map +1 -0
  44. package/dist/components/cart/cart-panel/cart-line-item.d.ts +11 -0
  45. package/dist/components/cart/cart-panel/cart-line-item.js +25 -0
  46. package/dist/components/cart/cart-panel/cart-line-item.js.map +1 -0
  47. package/dist/components/cart/cart-panel/index.d.ts +19 -0
  48. package/dist/components/cart/cart-panel/index.js +65 -0
  49. package/dist/components/cart/cart-panel/index.js.map +1 -0
  50. package/dist/components/cart/cart-panel/promo-code.d.ts +4 -0
  51. package/dist/components/cart/cart-panel/promo-code.js +62 -0
  52. package/dist/components/cart/cart-panel/promo-code.js.map +1 -0
  53. package/dist/components/cart/cart-panel/total-area.d.ts +7 -0
  54. package/dist/components/cart/cart-panel/total-area.js +14 -0
  55. package/dist/components/cart/cart-panel/total-area.js.map +1 -0
  56. package/dist/components/checkout/payment-step-form/card-icon-row.d.ts +2 -0
  57. package/dist/components/checkout/payment-step-form/card-icon-row.js +14 -0
  58. package/dist/components/checkout/payment-step-form/card-icon-row.js.map +1 -0
  59. package/dist/components/checkout/payment-step-form/card-icons/amex.d.ts +4 -0
  60. package/dist/components/checkout/payment-step-form/card-icons/amex.js +6 -0
  61. package/dist/components/checkout/payment-step-form/card-icons/amex.js.map +1 -0
  62. package/dist/components/checkout/payment-step-form/card-icons/diners-club.d.ts +4 -0
  63. package/dist/components/checkout/payment-step-form/card-icons/diners-club.js +6 -0
  64. package/dist/components/checkout/payment-step-form/card-icons/diners-club.js.map +1 -0
  65. package/dist/components/checkout/payment-step-form/card-icons/discover.d.ts +4 -0
  66. package/dist/components/checkout/payment-step-form/card-icons/discover.js +6 -0
  67. package/dist/components/checkout/payment-step-form/card-icons/discover.js.map +1 -0
  68. package/dist/components/checkout/payment-step-form/card-icons/jcb.d.ts +4 -0
  69. package/dist/components/checkout/payment-step-form/card-icons/jcb.js +6 -0
  70. package/dist/components/checkout/payment-step-form/card-icons/jcb.js.map +1 -0
  71. package/dist/components/checkout/payment-step-form/card-icons/mastercard.d.ts +4 -0
  72. package/dist/components/checkout/payment-step-form/card-icons/mastercard.js +6 -0
  73. package/dist/components/checkout/payment-step-form/card-icons/mastercard.js.map +1 -0
  74. package/dist/components/checkout/payment-step-form/card-icons/visa.d.ts +4 -0
  75. package/dist/components/checkout/payment-step-form/card-icons/visa.js +6 -0
  76. package/dist/components/checkout/payment-step-form/card-icons/visa.js.map +1 -0
  77. package/dist/components/checkout/payment-step-form/cc-button.d.ts +3 -0
  78. package/dist/components/checkout/payment-step-form/cc-button.js +6 -0
  79. package/dist/components/checkout/payment-step-form/cc-button.js.map +1 -0
  80. package/dist/components/checkout/payment-step-form/contact-form.d.ts +5 -0
  81. package/dist/components/checkout/payment-step-form/contact-form.js +6 -0
  82. package/dist/components/checkout/payment-step-form/contact-form.js.map +1 -0
  83. package/dist/components/checkout/payment-step-form/crypto-icons/btc.d.ts +4 -0
  84. package/dist/components/checkout/payment-step-form/crypto-icons/btc.js +6 -0
  85. package/dist/components/checkout/payment-step-form/crypto-icons/btc.js.map +1 -0
  86. package/dist/components/checkout/payment-step-form/crypto-icons/eth.d.ts +4 -0
  87. package/dist/components/checkout/payment-step-form/crypto-icons/eth.js +6 -0
  88. package/dist/components/checkout/payment-step-form/crypto-icons/eth.js.map +1 -0
  89. package/dist/components/checkout/payment-step-form/crypto-icons/usdt.d.ts +4 -0
  90. package/dist/components/checkout/payment-step-form/crypto-icons/usdt.js +6 -0
  91. package/dist/components/checkout/payment-step-form/crypto-icons/usdt.js.map +1 -0
  92. package/dist/components/checkout/payment-step-form/index.d.ts +4 -0
  93. package/dist/components/checkout/payment-step-form/index.js +66 -0
  94. package/dist/components/checkout/payment-step-form/index.js.map +1 -0
  95. package/dist/components/checkout/payment-step-form/methods/bank-transfer.d.ts +4 -0
  96. package/dist/components/checkout/payment-step-form/methods/bank-transfer.js +24 -0
  97. package/dist/components/checkout/payment-step-form/methods/bank-transfer.js.map +1 -0
  98. package/dist/components/checkout/payment-step-form/methods/card.d.ts +4 -0
  99. package/dist/components/checkout/payment-step-form/methods/card.js +160 -0
  100. package/dist/components/checkout/payment-step-form/methods/card.js.map +1 -0
  101. package/dist/components/checkout/payment-step-form/methods/crypto.d.ts +9 -0
  102. package/dist/components/checkout/payment-step-form/methods/crypto.js +137 -0
  103. package/dist/components/checkout/payment-step-form/methods/crypto.js.map +1 -0
  104. package/dist/components/checkout/payment-step-form/methods/index.d.ts +6 -0
  105. package/dist/components/checkout/payment-step-form/methods/index.js +21 -0
  106. package/dist/components/checkout/payment-step-form/methods/index.js.map +1 -0
  107. package/dist/components/checkout/shipping-step-form.d.ts +3 -0
  108. package/dist/components/checkout/shipping-step-form.js +53 -0
  109. package/dist/components/checkout/shipping-step-form.js.map +1 -0
  110. package/dist/components/index.d.ts +8 -0
  111. package/dist/components/index.js +9 -0
  112. package/dist/components/index.js.map +1 -0
  113. package/dist/components/item/product-card.d.ts +7 -0
  114. package/dist/components/item/product-card.js +9 -0
  115. package/dist/components/item/product-card.js.map +1 -0
  116. package/dist/components/item-selector/button.d.ts +4 -0
  117. package/dist/components/item-selector/button.js +47 -0
  118. package/dist/components/item-selector/button.js.map +1 -0
  119. package/dist/components/item-selector/carousel/index.d.ts +12 -0
  120. package/dist/components/item-selector/carousel/index.js +74 -0
  121. package/dist/components/item-selector/carousel/index.js.map +1 -0
  122. package/dist/components/item-selector/carousel/slider.d.ts +8 -0
  123. package/dist/components/item-selector/carousel/slider.js +12 -0
  124. package/dist/components/item-selector/carousel/slider.js.map +1 -0
  125. package/dist/components/item-selector/index.d.ts +2 -0
  126. package/dist/components/item-selector/index.js +3 -0
  127. package/dist/components/item-selector/index.js.map +1 -0
  128. package/dist/components/item-selector/quantity-indicator.d.ts +9 -0
  129. package/dist/components/item-selector/quantity-indicator.js +16 -0
  130. package/dist/components/item-selector/quantity-indicator.js.map +1 -0
  131. package/dist/components/node-tabs/index.d.ts +14 -0
  132. package/dist/components/node-tabs/index.js +42 -0
  133. package/dist/components/node-tabs/index.js.map +1 -0
  134. package/dist/components/node-tabs/node-image.d.ts +6 -0
  135. package/dist/components/node-tabs/node-image.js +13 -0
  136. package/dist/components/node-tabs/node-image.js.map +1 -0
  137. package/dist/index.d.ts +9 -0
  138. package/dist/index.js +9 -0
  139. package/dist/index.js.map +1 -0
  140. package/dist/metering.d.ts +162 -0
  141. package/dist/metering.js +204 -0
  142. package/dist/metering.js.map +1 -0
  143. package/dist/metering.test.d.ts +13 -0
  144. package/dist/metering.test.js +181 -0
  145. package/dist/metering.test.js.map +1 -0
  146. package/dist/product-card.test.d.ts +14 -0
  147. package/dist/product-card.test.js +96 -0
  148. package/dist/product-card.test.js.map +1 -0
  149. package/dist/service/context.d.ts +8 -0
  150. package/dist/service/context.js +19 -0
  151. package/dist/service/context.js.map +1 -0
  152. package/dist/service/debug.d.ts +10 -0
  153. package/dist/service/debug.js +30 -0
  154. package/dist/service/debug.js.map +1 -0
  155. package/dist/service/impls/standalone/actual-line-item.d.ts +40 -0
  156. package/dist/service/impls/standalone/actual-line-item.js +84 -0
  157. package/dist/service/impls/standalone/actual-line-item.js.map +1 -0
  158. package/dist/service/impls/standalone/get-instance.d.ts +2 -0
  159. package/dist/service/impls/standalone/get-instance.js +39 -0
  160. package/dist/service/impls/standalone/get-instance.js.map +1 -0
  161. package/dist/service/impls/standalone/index.d.ts +67 -0
  162. package/dist/service/impls/standalone/index.js +416 -0
  163. package/dist/service/impls/standalone/index.js.map +1 -0
  164. package/dist/service/impls/standalone/order/firebase.d.ts +6 -0
  165. package/dist/service/impls/standalone/order/firebase.js +6 -0
  166. package/dist/service/impls/standalone/order/firebase.js.map +1 -0
  167. package/dist/service/impls/standalone/order/index.d.ts +30 -0
  168. package/dist/service/impls/standalone/order/index.js +21 -0
  169. package/dist/service/impls/standalone/order/index.js.map +1 -0
  170. package/dist/service/impls/standalone/persistence.d.ts +4 -0
  171. package/dist/service/impls/standalone/persistence.js +22 -0
  172. package/dist/service/impls/standalone/persistence.js.map +1 -0
  173. package/dist/service/path-utils.d.ts +7 -0
  174. package/dist/service/path-utils.js +16 -0
  175. package/dist/service/path-utils.js.map +1 -0
  176. package/dist/service/sep.d.ts +6 -0
  177. package/dist/service/sep.js +6 -0
  178. package/dist/service/sep.js.map +1 -0
  179. package/dist/types/category-node.d.ts +36 -0
  180. package/dist/types/category-node.js +2 -0
  181. package/dist/types/category-node.js.map +1 -0
  182. package/dist/types/checkout.d.ts +33 -0
  183. package/dist/types/checkout.js +2 -0
  184. package/dist/types/checkout.js.map +1 -0
  185. package/dist/types/commerce-config.d.ts +11 -0
  186. package/dist/types/commerce-config.js +2 -0
  187. package/dist/types/commerce-config.js.map +1 -0
  188. package/dist/types/commerce-service.d.ts +109 -0
  189. package/dist/types/commerce-service.js +2 -0
  190. package/dist/types/commerce-service.js.map +1 -0
  191. package/dist/types/family.d.ts +16 -0
  192. package/dist/types/family.js +2 -0
  193. package/dist/types/family.js.map +1 -0
  194. package/dist/types/index.d.ts +13 -0
  195. package/dist/types/index.js +8 -0
  196. package/dist/types/index.js.map +1 -0
  197. package/dist/types/item-selector.d.ts +72 -0
  198. package/dist/types/item-selector.js +2 -0
  199. package/dist/types/item-selector.js.map +1 -0
  200. package/dist/types/line-item.d.ts +14 -0
  201. package/dist/types/line-item.js +2 -0
  202. package/dist/types/line-item.js.map +1 -0
  203. package/dist/types/multi-family-selector-props.d.ts +16 -0
  204. package/dist/types/multi-family-selector-props.js +2 -0
  205. package/dist/types/multi-family-selector-props.js.map +1 -0
  206. package/dist/types/product.d.ts +15 -0
  207. package/dist/types/product.js +2 -0
  208. package/dist/types/product.js.map +1 -0
  209. package/dist/types/promo.d.ts +7 -0
  210. package/dist/types/promo.js +2 -0
  211. package/dist/types/promo.js.map +1 -0
  212. package/dist/types/selection-ui-specifier.d.ts +40 -0
  213. package/dist/types/selection-ui-specifier.js +2 -0
  214. package/dist/types/selection-ui-specifier.js.map +1 -0
  215. package/dist/types/string-mutator.d.ts +9 -0
  216. package/dist/types/string-mutator.js +2 -0
  217. package/dist/types/string-mutator.js.map +1 -0
  218. package/dist/types/token-separators.d.ts +6 -0
  219. package/dist/types/token-separators.js +2 -0
  220. package/dist/types/token-separators.js.map +1 -0
  221. package/dist/util/analytics.d.ts +9 -0
  222. package/dist/util/analytics.js +10 -0
  223. package/dist/util/analytics.js.map +1 -0
  224. package/dist/util/countries.d.ts +7 -0
  225. package/dist/util/countries.js +197 -0
  226. package/dist/util/countries.js.map +1 -0
  227. package/dist/util/error.d.ts +1 -0
  228. package/dist/util/error.js +22 -0
  229. package/dist/util/error.js.map +1 -0
  230. package/dist/util/index.d.ts +15 -0
  231. package/dist/util/index.js +54 -0
  232. package/dist/util/index.js.map +1 -0
  233. package/dist/util/item-selector-options-accessor.d.ts +3 -0
  234. package/dist/util/item-selector-options-accessor.js +27 -0
  235. package/dist/util/item-selector-options-accessor.js.map +1 -0
  236. package/dist/util/line-item-ref.d.ts +8 -0
  237. package/dist/util/line-item-ref.js +15 -0
  238. package/dist/util/line-item-ref.js.map +1 -0
  239. package/dist/util/multi-family-selector-options-accessor.d.ts +3 -0
  240. package/dist/util/multi-family-selector-options-accessor.js +11 -0
  241. package/dist/util/multi-family-selector-options-accessor.js.map +1 -0
  242. package/dist/util/obs-string-mutator.d.ts +8 -0
  243. package/dist/util/obs-string-mutator.js +15 -0
  244. package/dist/util/obs-string-mutator.js.map +1 -0
  245. package/dist/util/product-media-accessor.d.ts +29 -0
  246. package/dist/util/product-media-accessor.js +22 -0
  247. package/dist/util/product-media-accessor.js.map +1 -0
  248. package/dist/util/promo-codes.d.ts +3 -0
  249. package/dist/util/promo-codes.js +100 -0
  250. package/dist/util/promo-codes.js.map +1 -0
  251. package/dist/util/selection-ui-specifiers.d.ts +3 -0
  252. package/dist/util/selection-ui-specifiers.js +24 -0
  253. package/dist/util/selection-ui-specifiers.js.map +1 -0
  254. package/dist/util/square-payment.d.ts +7 -0
  255. package/dist/util/square-payment.js +37 -0
  256. package/dist/util/square-payment.js.map +1 -0
  257. package/dist/util/use-sync-sku-param-w-current-item.d.ts +2 -0
  258. package/dist/util/use-sync-sku-param-w-current-item.js +61 -0
  259. package/dist/util/use-sync-sku-param-w-current-item.js.map +1 -0
  260. package/index.ts +18 -3
  261. package/metering.test.ts +199 -0
  262. package/metering.ts +289 -0
  263. package/package.json +19 -17
  264. package/product-card.test.tsx +104 -0
@@ -0,0 +1,47 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import React from 'react';
4
+ import { observer } from 'mobx-react-lite';
5
+ import * as RadioGroupPrimitive from "@radix-ui/react-radio-group";
6
+ import { Image, Label, RadioGroup, ScrollArea } from '@hanzo/ui/primitives';
7
+ import { cn } from '@hanzo/ui/util';
8
+ import { accessItemOptions, formatCurrencyValue } from '../../util';
9
+ import QuantityIndicator from './quantity-indicator';
10
+ const DEFAULT_CONSTRAINT = { h: 36, w: 72 }; // // Apple suggest 42px for clickability
11
+ const ImageRadioGroupItem = React.forwardRef(({ item, constrainTo, className, ...props }, ref) => {
12
+ const img = item.optionImg ? item.optionImg : item.img;
13
+ return (_jsx(RadioGroupPrimitive.Item, { ref: ref, "data-vaul-no-drag": true, className: cn('ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-ring', 'focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50', className, 'overflow-hidden', img?.rounded ? `rounded-${img.rounded}` : 'rounded-sm'), ...props, id: item.sku, value: item.sku, children: img ? (_jsx(Image, { def: img, constrainTo: constrainTo, preload: true, className: '' })) : ( // placeholder so things align
14
+ _jsx("div", { style: { height: constrainTo.h, width: constrainTo.w } })) }));
15
+ });
16
+ ImageRadioGroupItem.displayName = 'ImageRadioGroupItem';
17
+ const ButtonItemSelector = observer(({ items, selectedItemRef: itemRef, selectSku, clx = '', itemClx = '', soleItemClx = '', scrollable = false, mobile = false, options = {} }) => {
18
+ const { showPrice, showQuantity, showFamilyInOption, buttonType, horizButtons, showButtonIfOnlyOne } = accessItemOptions(options);
19
+ const showImage = buttonType !== 'text';
20
+ const showText = buttonType !== 'image';
21
+ const showBoth = buttonType === 'image-and-text';
22
+ const labelAndPrice = (item) => ((showFamilyInOption ? (item.familyTitle + ', ' + item.optionLabel) : item.optionLabel) +
23
+ (showPrice ? ((showFamilyInOption ? ': ' : ', ') + formatCurrencyValue(item.price)) : ''));
24
+ const Item = observer(({ item, selected }) => {
25
+ const textClx = (selected) ? 'text-accent' : 'text-muted';
26
+ const cursorClx = (selected) ? 'hover:cursor-default' : 'hover:cursor-pointer';
27
+ const justifyClx = (showBoth) ? '' : 'justify-center';
28
+ // If no image, the Label must fill the entire button since it has to be
29
+ // clickable all the way to the border
30
+ const paddingClx = (showImage) ? (scrollable ? 'px-4 py-2' : 'px-2 py-2') : '';
31
+ let bgClx = '';
32
+ let borderClx = '';
33
+ if (scrollable) {
34
+ borderClx += (selected) ? 'border-foreground border ' : 'border-b border-muted-2 ';
35
+ }
36
+ else if (!showImage) {
37
+ borderClx += 'border rounded-lg ';
38
+ borderClx += (selected) ? 'border-foreground ' : 'border-muted-2 ';
39
+ bgClx += 'hover:bg-level-2';
40
+ }
41
+ const outerClx = ['h-10 flex items-center', justifyClx, paddingClx, bgClx, borderClx];
42
+ return (_jsxs("div", { className: cn(...outerClx, itemClx), "data-vaul-no-drag": true, children: [_jsx(ImageRadioGroupItem, { item: item, constrainTo: DEFAULT_CONSTRAINT, className: cn(cursorClx, (scrollable ? '' : 'border-transparent border-2 data-[state=checked]:border-foreground'), showBoth ? 'mr-2' : (showImage ? '' : 'hidden')) }), _jsxs(Label, { htmlFor: item.sku, className: cn(showQuantity ? 'flex items-center' : 'block', textClx, cursorClx, (showImage ? '' : 'self-stretch w-full flex items-center justify-center px-3 py-2'), (showText ? '' : 'hidden')), children: [_jsx("div", { className: showQuantity ? 'grow' : '', children: labelAndPrice(item) }), showQuantity && (_jsx(QuantityIndicator, { item: item, clx: 'grow-0 shrink-0 h-[20px] ml-2', iconClx: selected ? 'fill-foreground' : 'fill-muted', digitClx: 'font-semibold text-primary-fg leading-none font-sans text-xxs' }))] })] }));
43
+ });
44
+ return showButtonIfOnlyOne || items.length > 1 ? (_jsx(RadioGroup, { className: cn((scrollable ? 'shrink min-h-0 gap-0' : (mobile ? 'gap-3' : 'gap-1')), (horizButtons ? `grid grid-cols-${items.length} gap-1` : 'flex flex-col'), (mobile && showText) ? 'min-w-pr-50' : '', clx), onValueChange: selectSku, value: itemRef.item ? itemRef.item.sku : '', "data-vaul-no-drag": true, children: scrollable ? (_jsx(ScrollArea, { className: 'mt-2 w-full h-full py-0 border border-muted-2', "data-vaul-no-drag": true, children: items.map((item) => (_jsx(Item, { item: item, selected: itemRef.item?.sku === item.sku }, item.sku))) })) : (_jsx(_Fragment, { children: items.map((item) => (_jsx(Item, { item: item, selected: itemRef.item?.sku === item.sku }, item.sku))) })) })) : (_jsxs("div", { className: cn(showQuantity ? 'flex items-center' : 'block', soleItemClx), children: [_jsx("div", { className: showQuantity ? 'grow' : '', children: labelAndPrice(items[0]) }), showQuantity && (_jsx(QuantityIndicator, { item: items[0], clx: 'grow-0 shrink-0 font-semibold text-sm leading-none px-2' }))] }));
45
+ });
46
+ export default ButtonItemSelector;
47
+ //# sourceMappingURL=button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button.js","sourceRoot":"","sources":["../../../components/item-selector/button.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import type { Dimensions } from '@hanzo/ui/types';
3
+ import { type CarouselOptions } from '@hanzo/ui/primitives';
4
+ import type { ItemSelectorProps } from '../../../types';
5
+ interface CarouselItemSelectorPropsExt {
6
+ constrainTo: Dimensions;
7
+ options?: CarouselOptions;
8
+ /** Do not show Family and / or Item title and Price */
9
+ imageOnly?: boolean;
10
+ }
11
+ declare const CarouselItemSelector: React.FC<ItemSelectorProps>;
12
+ export { type CarouselItemSelectorPropsExt, CarouselItemSelector as default };
@@ -0,0 +1,74 @@
1
+ 'use client';
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import React, { useCallback, useEffect, useRef, useState } from 'react';
4
+ import { reaction } from 'mobx';
5
+ import { observer } from 'mobx-react-lite';
6
+ import { cn } from '@hanzo/ui/util';
7
+ import { ApplyTypography, Carousel, CarouselContent, CarouselItem, CarouselPrevious, CarouselNext, MediaStack, } from '@hanzo/ui/primitives';
8
+ import { formatCurrencyValue, accessItemOptions } from '../../../util';
9
+ import QuantityIndicator from '../quantity-indicator';
10
+ import ItemCarouselSlider from './slider';
11
+ const DEFAULT_CONSTRAINT = { w: 250, h: 250 };
12
+ const ItemSlide = ({ item, constrainTo, clx = '' }) => (_jsx(CarouselItem, { className: cn('p-2 flex flex-col justify-center items-center', clx), children: _jsx(MediaStack, { media: item, constrainTo: constrainTo, clx: 'my-4' }) }));
13
+ const CarouselItemSelector = observer(({ items, selectSku, selectedItemRef: itemRef, clx = '', itemClx = '', options = {}, ext = {
14
+ options: { loop: true },
15
+ constrainTo: DEFAULT_CONSTRAINT,
16
+ imageOnly: false
17
+ } }) => {
18
+ const { showPrice, showQuantity, showFamilyInOption, showByline, showSlider, } = accessItemOptions(options);
19
+ const elbaApiRef = useRef(undefined);
20
+ const scrollToRef = useRef(undefined);
21
+ const dontRespondRef = useRef(false);
22
+ const setApi = (api) => { elbaApiRef.current = api; };
23
+ const setScrollTo = (scrollTo) => { scrollToRef.current = scrollTo; };
24
+ const carouselOptions = 'options' in ext ? ext.options : undefined;
25
+ const constrainTo = 'constrainTo' in ext ? ext.constrainTo : DEFAULT_CONSTRAINT;
26
+ const imageOnly = 'imageOnly' in ext ? ext.imageOnly : false;
27
+ const onSelect = useCallback((emblaApi) => {
28
+ if (dontRespondRef.current) {
29
+ dontRespondRef.current = false;
30
+ return;
31
+ }
32
+ const index = emblaApi.selectedScrollSnap();
33
+ if (index !== -1) {
34
+ selectSku(items[index].sku);
35
+ if (scrollToRef.current) {
36
+ scrollToRef.current(index);
37
+ }
38
+ }
39
+ dontRespondRef.current = false;
40
+ }, [scrollToRef.current]);
41
+ useEffect(() => {
42
+ return reaction(() => (itemRef.item), (item) => {
43
+ if (elbaApiRef.current) {
44
+ const index = items.findIndex((el) => (el.sku === item?.sku));
45
+ if (index !== -1) {
46
+ dontRespondRef.current = true;
47
+ elbaApiRef.current.scrollTo(index);
48
+ }
49
+ }
50
+ });
51
+ }, []);
52
+ const optionLabel = () => (showFamilyInOption ?
53
+ (itemRef.item?.familyTitle + ', ' + itemRef.item?.optionLabel)
54
+ :
55
+ itemRef.item?.optionLabel);
56
+ const debugBorder = (c) => {
57
+ return '';
58
+ switch (c) {
59
+ case 'r': return ' border border-[#ffaaaa] ';
60
+ case 'g': return ' border border-[#aaffaa] ';
61
+ case 'b': return ' border border-[#aaaaff] ';
62
+ }
63
+ };
64
+ const onScrollIndexChange = (index) => {
65
+ dontRespondRef.current = true;
66
+ selectSku(items[index].sku);
67
+ elbaApiRef.current?.scrollTo(index);
68
+ };
69
+ return (_jsxs("div", { className: cn('w-full flex flex-col items-center', clx), children: [_jsxs(Carousel, { options: showSlider ? { ...carouselOptions, loop: false } : carouselOptions, className: 'w-full px-2' + debugBorder('r'), onCarouselSelect: onSelect, setApi: setApi, children: [_jsx(CarouselContent, { children: items.map((item) => (_jsx(ItemSlide, { item: item, constrainTo: constrainTo, clx: itemClx }, item.sku))) }), !showSlider && (_jsxs(_Fragment, { children: [_jsx(CarouselPrevious, { className: 'left-1' }), _jsx(CarouselNext, { className: 'right-1' })] }))] }), (!imageOnly && itemRef.item) && (_jsxs(_Fragment, { children: [_jsxs(ApplyTypography, { className: 'flex flex-col items-center [&>*]:!m-0 !gap-1 ', children: [_jsxs("div", { className: 'flex items-center gap-1 [&>*]:!m-0 ' + debugBorder('g') +
70
+ (showFamilyInOption ? 'flex-col' : 'flex-row'), children: [_jsx("h6", { className: 'font-semibold', children: optionLabel() + (showPrice && !showFamilyInOption ? ',' : '') }), _jsxs("div", { className: 'flex items-center gap-1 [&>*]:!m-0 flex-row ' + debugBorder('b') +
71
+ (showFamilyInOption ? 'w-full justify-between' : ''), children: [showPrice && (_jsx("p", { children: formatCurrencyValue(itemRef.item.price) })), showQuantity && (_jsx(QuantityIndicator, { item: itemRef.item, clx: 'h-[22px] ml-4', iconClx: 'fill-foreground', digitClx: 'not-typography font-semibold text-primary-fg leading-none font-sans text-xs' }))] })] }), showByline && itemRef.item.byline && (_jsx("p", { children: itemRef.item.byline }))] }), showSlider && items.length > 1 && (_jsx(ItemCarouselSlider, { clx: 'mt-5 w-[320px]', numStops: items.length, setScrollTo: setScrollTo, onIndexChange: onScrollIndexChange }))] }))] }));
72
+ });
73
+ export { CarouselItemSelector as default };
74
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../components/item-selector/carousel/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ declare const ItemCarouselSlider: React.FC<{
3
+ clx?: string;
4
+ setScrollTo: (scrollTo: (index: number) => void) => void;
5
+ onIndexChange: (i: number) => void;
6
+ numStops: number;
7
+ }>;
8
+ export default ItemCarouselSlider;
@@ -0,0 +1,12 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import React, { useEffect, useState } from 'react';
4
+ import { Slider } from '@hanzo/ui/primitives';
5
+ const ItemCarouselSlider = ({ clx = '', setScrollTo, onIndexChange, numStops, }) => {
6
+ const [index, setIndex] = useState(0);
7
+ useEffect(() => { setScrollTo(setIndex); }, [setScrollTo]);
8
+ const onValueChange = (v) => { setIndex(v[0]); onIndexChange(v[0]); };
9
+ return (_jsx(Slider, { className: clx, thumbClx: 'w-8 border-muted border-2 bg-level-1 focus-visible:ring-0 focus-visible:ring-offset-0 transition-none', trackBgClx: 'bg-level-3', rangeBgClx: 'bg-level-3', thumbSlidingClx: 'bg-muted-2', defaultValue: [0], min: 0, max: numStops - 1, step: 1, value: [index], onValueChange: onValueChange }));
10
+ };
11
+ export default ItemCarouselSlider;
12
+ //# sourceMappingURL=slider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider.js","sourceRoot":"","sources":["../../../../components/item-selector/carousel/slider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AACZ,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAElD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAE7C,MAAM,kBAAkB,GAKnB,CAAC,EACJ,GAAG,GAAC,EAAE,EACN,WAAW,EACX,aAAa,EACb,QAAQ,GACT,EAAE,EAAE;IAEH,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAS,CAAC,CAAC,CAAA;IAC7C,SAAS,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAA,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;IAEzD,MAAM,aAAa,GAAG,CAAC,CAAW,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC,CAAC,CAAA;IAE9E,OAAO,CACL,KAAC,MAAM,IACL,SAAS,EAAE,GAAG,EACd,QAAQ,EAAC,uGAAuG,EAChH,UAAU,EAAC,YAAY,EACvB,UAAU,EAAC,YAAY,EACvB,eAAe,EAAC,YAAY,EAC5B,YAAY,EAAE,CAAC,CAAC,CAAC,EACjB,GAAG,EAAE,CAAC,EACN,GAAG,EAAE,QAAQ,GAAG,CAAC,EACjB,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,CAAC,KAAK,CAAC,EACd,aAAa,EAAE,aAAa,GAC5B,CACH,CAAA;AACH,CAAC,CAAA;AAED,eAAe,kBAAkB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { default as ButtonItemSelector } from './button';
2
+ export { default as CarouselItemSelector, type CarouselItemSelectorPropsExt } from './carousel';
@@ -0,0 +1,3 @@
1
+ export { default as ButtonItemSelector } from './button';
2
+ export { default as CarouselItemSelector } from './carousel';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../components/item-selector/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,UAAU,CAAA;AACxD,OAAO,EACL,OAAO,IAAI,oBAAoB,EAEhC,MAAM,YAAY,CAAA"}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import type { LineItem } from '../../types';
3
+ declare const QuantityIndicator: React.FC<{
4
+ item: LineItem;
5
+ clx?: string;
6
+ iconClx?: string;
7
+ digitClx?: string;
8
+ }>;
9
+ export default QuantityIndicator;
@@ -0,0 +1,16 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import React from 'react';
4
+ import { observer } from 'mobx-react-lite';
5
+ import {} from 'lucide-react';
6
+ import { cn } from '@hanzo/ui/util';
7
+ // Generalize this.
8
+ const BagIcon = (props) => (_jsx("svg", { fill: "currentColor", viewBox: '0 0 20 23', ...props, children: _jsx("path", { fillRule: "evenodd", d: "M5 5a5 5 0 0 1 10 0v1h-2V5a3 3 0 1 0-6 0v1H5V5Zm0 1v4h2V6h6v4h2V6h3.5a1 1 0 0 1 1 1v15a1 1 0 0 1-1 1h-17a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1H5Z", clipRule: "evenodd" }) }));
9
+ const QuantityIndicator = observer(({ item, clx = '', iconClx = '', digitClx = '' }) => {
10
+ if (!item.isInCart) {
11
+ return _jsx("div", {});
12
+ }
13
+ return (_jsxs("div", { className: cn('relative aspect-square flex items-center justify-center', clx), children: [_jsxs("div", { className: cn('z-above-content flex flex-col justify-center items-center', 'absolute left-0 right-0 top-0 bottom-0', digitClx), children: [_jsx("div", { className: 'h-[1px] w-full' }), _jsx("div", { style: { color: 'black' /* tailwind bug */ }, children: item.quantity })] }), _jsx(BagIcon, { className: cn('relative -top-[12%] h-full ', iconClx), "aria-hidden": "true" })] }));
14
+ }); // -top-[3px]
15
+ export default QuantityIndicator;
16
+ //# sourceMappingURL=quantity-indicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quantity-indicator.js","sourceRoot":"","sources":["../../../components/item-selector/quantity-indicator.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AACZ,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAE1C,OAAO,EAAoB,MAAM,cAAc,CAAA;AAE/C,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAA;AAGjC,mBAAmB;AACrB,MAAM,OAAO,GAA0B,CAAC,KAAkB,EAAE,EAAE,CAAC,CAC7D,cAAK,IAAI,EAAC,cAAc,EAAC,OAAO,EAAC,WAAW,KAAK,KAAK,YACpD,eAAM,QAAQ,EAAC,SAAS,EAAC,CAAC,EAAC,2IAA2I,EAAC,QAAQ,EAAC,SAAS,GAAE,GACvL,CACP,CAAA;AAED,MAAM,iBAAiB,GAKlB,QAAQ,CAAC,CAAC,EACb,IAAI,EACJ,GAAG,GAAC,EAAE,EACN,OAAO,GAAC,EAAE,EACV,QAAQ,GAAC,EAAE,EACZ,EAAE,EAAE;IAEH,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO,eAAO,CAAA;IAChB,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,yDAAyD,EAAE,GAAG,CAAC,aAChF,eAAK,SAAS,EAAE,EAAE,CAChB,2DAA2D,EAC3D,wCAAwC,EACxC,QAAQ,CACT,aACC,cAAK,SAAS,EAAC,gBAAgB,GAAG,EAClC,cAAK,KAAK,EAAE,EAAC,KAAK,EAAE,OAAO,CAAC,kBAAkB,EAAC,YAAG,IAAI,CAAC,QAAQ,GAAO,IAClE,EACN,KAAC,OAAO,IAAC,SAAS,EAAE,EAAE,CAAC,6BAA6B,EAAE,OAAO,CAAG,iBAAc,MAAM,GAAG,IACnF,CACP,CAAA;AACH,CAAC,CAAC,CAAA,CAAC,cAAc;AAEjB,eAAe,iBAAiB,CAAA"}
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import type { CategoryNode, StringMutator, StringArrayMutator } from '../../types';
3
+ declare const NodeTabs: React.FC<{
4
+ levelNodes: CategoryNode[];
5
+ mutator: StringMutator | StringArrayMutator;
6
+ multiple?: boolean;
7
+ className?: string;
8
+ buttonClx?: string;
9
+ itemClx?: string;
10
+ mobile?: boolean;
11
+ tabSize?: string;
12
+ show?: 'image' | 'label' | 'image-and-label';
13
+ }>;
14
+ export default NodeTabs;
@@ -0,0 +1,42 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import React, { useState } from 'react';
4
+ import { ToggleGroup, ToggleGroupItem } from "@hanzo/ui/primitives";
5
+ import { cn } from '@hanzo/ui/util';
6
+ import NodeImage from './node-image';
7
+ const NodeTabs = ({ levelNodes, mutator, multiple = false, buttonClx = '', itemClx = '', className = '', mobile = false, tabSize, show = 'image-and-label' }) => {
8
+ const [last, setLast] = useState(undefined);
9
+ const handleChangeMultiple = (selected) => {
10
+ mutator.set(selected);
11
+ setLast(selected.length === 1 ? selected[0] : undefined);
12
+ };
13
+ const handleChangeSingle = (selected) => {
14
+ mutator.set(selected);
15
+ if (selected) {
16
+ setLast(selected);
17
+ }
18
+ };
19
+ const roundedToSpread = {};
20
+ if (multiple) {
21
+ roundedToSpread.rounded = 'xl';
22
+ }
23
+ const val = multiple ?
24
+ mutator.get()
25
+ :
26
+ mutator.get();
27
+ return (_jsx(ToggleGroup, { type: multiple ? 'multiple' : 'single', value: val, variant: 'default', size: tabSize ? tabSize : (mobile ? 'sm' : 'default'), onValueChange: multiple ? handleChangeMultiple : handleChangeSingle, className: className, ...roundedToSpread, children: levelNodes.map((treeNode, index) => {
28
+ const roundedToSpread = {};
29
+ if (!multiple) {
30
+ roundedToSpread.rounded = 'none';
31
+ if (index === 0) {
32
+ roundedToSpread.rounded = 'llg';
33
+ }
34
+ else if (index === levelNodes.length - 1) {
35
+ roundedToSpread.rounded = 'rlg';
36
+ }
37
+ }
38
+ return (_jsx(ToggleGroupItem, { value: treeNode.skuToken, disabled: (last && last === treeNode.skuToken || treeNode.skuToken === mutator.get()), "aria-label": `Select ${treeNode.label}`, ...roundedToSpread, className: buttonClx, children: _jsxs("span", { className: cn('flex flex-row justify-center gap-1 h-6 items-center', itemClx), children: [!(show === 'label') && (_jsx(NodeImage, { treeNode: treeNode })), (!(show === 'image') || !treeNode.img) && (_jsx("span", { className: 'whitespace-nowrap', children: treeNode.label }))] }) }, treeNode.skuToken));
39
+ }) }));
40
+ };
41
+ export default NodeTabs;
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../components/node-tabs/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import type { CategoryNode } from '../../types';
3
+ declare const NodeImage: React.FC<{
4
+ treeNode: CategoryNode;
5
+ }>;
6
+ export default NodeImage;
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import Image from 'next/image';
4
+ const ICON_SIZE = 20;
5
+ const NodeImage = ({ treeNode: { img, imgAR: ar, label } }) => {
6
+ if (!img) {
7
+ return null;
8
+ }
9
+ // treat as URL
10
+ return (typeof img === 'string') ? (_jsx(Image, { src: img, alt: `Toggle ${label}`, className: 'block mr-1 ', width: ar ? ar * ICON_SIZE : ICON_SIZE, height: ICON_SIZE })) : img;
11
+ };
12
+ export default NodeImage;
13
+ //# sourceMappingURL=node-image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-image.js","sourceRoot":"","sources":["../../../components/node-tabs/node-image.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,MAAM,YAAY,CAAA;AAI9B,MAAM,SAAS,GAAG,EAAE,CAAA;AAEpB,MAAM,SAAS,GAEV,CAAC,EACJ,QAAQ,EAAE,EACR,GAAG,EACH,KAAK,EAAE,EAAE,EACT,KAAK,EACN,EACF,EAAE,EAAE;IAEH,IAAI,CAAC,GAAG,EAAE,CAAC;QAAC,OAAO,IAAI,CAAA;IAAC,CAAC;IACvB,eAAe;IACjB,OAAO,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CACjC,KAAC,KAAK,IACJ,GAAG,EAAE,GAAa,EAClB,GAAG,EAAE,UAAU,KAAK,EAAE,EACtB,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,EAAE,CAAC,CAAC,CAAE,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,EACvC,MAAM,EAAE,SAAS,GACjB,CACH,CAAC,CAAC,CAAE,GAAuB,CAAA;AAC9B,CAAC,CAAA;AAED,eAAe,SAAS,CAAA"}
@@ -0,0 +1,9 @@
1
+ export * from './service/context';
2
+ export * from './components';
3
+ export type { StandaloneServiceOptions as ServiceOptions } from './service/impls/standalone';
4
+ export { useSyncSkuParamWithCurrentItem, getFacetValuesMutator, formatCurrencyValue, ProductMediaAccessor, LineItemRef } from './util';
5
+ export * from './util/selection-ui-specifiers';
6
+ export { Commerce, CommerceApiError, hanzoCommerce } from './client';
7
+ export type { CommerceClientConfig, Balance, TierResponse, Transaction, Subscription, Plan, Payment, UsageRecord, Coupon, CouponType, CouponValidateResult, Discount, CheckoutItem, CheckoutSessionRequest, CheckoutSessionResponse, PaymentMethod, PaymentMethodType, Referral, Referrer, Affiliate, CreditGrant, } from './client';
8
+ export { Metering, DEFAULT_COMMERCE_URL, identityFromHeaders, HEADER_USER_ID, HEADER_ORG_ID, } from './metering';
9
+ export type { MeteringConfig, MeteringIdentity, UsageEvent, RecordResult, AuthDecision, } from './metering';
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export * from './service/context';
2
+ export * from './components';
3
+ export { useSyncSkuParamWithCurrentItem, getFacetValuesMutator, formatCurrencyValue, ProductMediaAccessor, LineItemRef } from './util';
4
+ export * from './util/selection-ui-specifiers';
5
+ // Commerce API client
6
+ export { Commerce, CommerceApiError, hanzoCommerce } from './client';
7
+ // Server-side usage metering (the one way every product meters to commerce)
8
+ export { Metering, DEFAULT_COMMERCE_URL, identityFromHeaders, HEADER_USER_ID, HEADER_ORG_ID, } from './metering';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,cAAc,CAAA;AAG5B,OAAO,EACL,8BAA8B,EAC9B,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,WAAW,EACZ,MAAM,QAAQ,CAAA;AAEf,cAAc,gCAAgC,CAAA;AAE9C,sBAAsB;AACtB,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAyBpE,4EAA4E;AAC5E,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,aAAa,GACd,MAAM,YAAY,CAAA"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * @hanzo/commerce/metering
3
+ *
4
+ * The ONE way every Hanzo product meters usage to commerce — the single
5
+ * billing source of truth — so that everything (not only the LLM/cloud path)
6
+ * can be paid for. This is the TypeScript counterpart of
7
+ * github.com/hanzoai/go-sdk/metering; the two share an identical wire contract.
8
+ *
9
+ * It provides two operations against commerce's canonical billing API:
10
+ *
11
+ * - authorize(): a pre-request balance gate. Fail-closed by default — if the
12
+ * balance cannot be determined the request is denied, exactly like the
13
+ * gateway's prepaid-balance gate. With tierAware it consults the effective
14
+ * balance (prepaid + included plan allotment, e.g. the free-tier daily
15
+ * credit) so included usage is honored before prepaid funds.
16
+ *
17
+ * - record(): a post-request usage write that debits the user's balance.
18
+ *
19
+ * Composition over duplication: this wraps the existing {@link Commerce}
20
+ * client (GET /v1/billing/balance, GET /v1/billing/tier, POST /v1/billing/usage)
21
+ * rather than re-implementing the HTTP layer.
22
+ *
23
+ * Auth is the commerce service token (admin-scoped S2S), sent as
24
+ * `Authorization: Bearer <token>` plus the tenant org as `X-IAM-Org-Id`. The
25
+ * token is a secret and MUST come from KMS (the operator wires it into
26
+ * COMMERCE_SERVICE_TOKEN); this module never reads it from disk.
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * import { Metering } from '@hanzo/commerce/metering'
31
+ *
32
+ * const meter = Metering.fromEnv() // COMMERCE_URL + COMMERCE_SERVICE_TOKEN (KMS) + COMMERCE_SERVICE_ORG
33
+ *
34
+ * // Pre-request gate (fail-closed).
35
+ * const gate = await meter.authorize({ user: 'hanzo/alice' })
36
+ * if (!gate.allowed) {
37
+ * res.status(gate.reason === 'insufficient_balance' ? 402 : 503).end()
38
+ * return
39
+ * }
40
+ *
41
+ * // ... do the work, compute cost ...
42
+ *
43
+ * // Post-request record (best-effort).
44
+ * await meter.record({ user: 'hanzo/alice', amount: 5, provider: 'search' })
45
+ * ```
46
+ */
47
+ /** Canonical in-cluster commerce address (matches the gateway default). */
48
+ export declare const DEFAULT_COMMERCE_URL = "http://commerce.hanzo.svc.cluster.local:8001";
49
+ export type MeteringConfig = {
50
+ /**
51
+ * Commerce base URL (no /v1 suffix). When empty the meter is in
52
+ * "not configured" mode: authorize allows and record is a no-op.
53
+ */
54
+ baseUrl?: string;
55
+ /** Commerce service token (admin-scoped S2S). MUST be KMS-sourced. */
56
+ token?: string;
57
+ /** Default tenant org slug sent as X-IAM-Org-Id (default "hanzo"). */
58
+ org?: string;
59
+ /**
60
+ * Gate on the tier-aware effective balance (prepaid + included plan
61
+ * allotment) instead of the bare prepaid balance. Default false.
62
+ */
63
+ tierAware?: boolean;
64
+ /**
65
+ * Allow-on-error. Default false (fail-closed, like the gateway). Set true
66
+ * only where availability outranks billing.
67
+ */
68
+ failOpen?: boolean;
69
+ /** Request timeout in ms. Default 5000 (the gateway's value). */
70
+ timeoutMs?: number;
71
+ };
72
+ /** Who to authorize / charge. user is the IAM "org/sub" identity. */
73
+ export type MeteringIdentity = {
74
+ user: string;
75
+ org?: string;
76
+ currency?: string;
77
+ };
78
+ /** One usage event to record. Mirrors commerce's usageRequest one-for-one. */
79
+ export type UsageEvent = {
80
+ user: string;
81
+ org?: string;
82
+ /** Cost to debit, in cents. */
83
+ amount: number;
84
+ currency?: string;
85
+ model?: string;
86
+ provider?: string;
87
+ promptTokens?: number;
88
+ completionTokens?: number;
89
+ totalTokens?: number;
90
+ requestId?: string;
91
+ premium?: boolean;
92
+ stream?: boolean;
93
+ status?: string;
94
+ clientIp?: string;
95
+ };
96
+ /** Result of a usage write. */
97
+ export type RecordResult = {
98
+ transactionId: string;
99
+ user: string;
100
+ amount: number;
101
+ currency: string;
102
+ type: string;
103
+ };
104
+ /** Outcome of an authorize() gate. */
105
+ export type AuthDecision = {
106
+ allowed: boolean;
107
+ /** 'insufficient_balance' -> 402 ; 'balance_unavailable' -> 503 (fail-closed). */
108
+ reason?: 'insufficient_balance' | 'balance_unavailable';
109
+ /** Spendable balance in cents that the decision was based on (when known). */
110
+ available?: number;
111
+ };
112
+ /**
113
+ * Metering is the server-side hook a product uses to charge for usage. It is
114
+ * safe to share a single instance across requests.
115
+ */
116
+ export declare class Metering {
117
+ private readonly commerce;
118
+ private readonly org;
119
+ private readonly tierAware;
120
+ private readonly failOpen;
121
+ constructor(config?: MeteringConfig);
122
+ /**
123
+ * Build a Metering instance from the canonical environment variables. This
124
+ * is the one-liner products use at startup. Honors METERING_DISABLED for
125
+ * local dev.
126
+ */
127
+ static fromEnv(env?: Record<string, string | undefined>): Metering;
128
+ /** Whether a commerce base URL is configured. */
129
+ get enabled(): boolean;
130
+ /**
131
+ * Pre-request balance gate. Never throws — returns a decision so callers map
132
+ * it to a status code. When not configured it always allows.
133
+ *
134
+ * Outcomes (matching the gateway):
135
+ * { allowed: true } -> allow.
136
+ * { allowed: false, reason: 'insufficient_balance' } -> 402 (out of funds).
137
+ * { allowed: false, reason: 'balance_unavailable' } -> 503 (fail-closed).
138
+ */
139
+ authorize(id: MeteringIdentity): Promise<AuthDecision>;
140
+ /**
141
+ * Record a usage event, debiting the user's balance. No-op when not
142
+ * configured or amount <= 0 (commerce treats zero-cost usage as skipped).
143
+ * Decoupled from gating: the work already happened, so balance is not
144
+ * re-checked here. Returns null on no-op.
145
+ */
146
+ record(usage: UsageEvent): Promise<RecordResult | null>;
147
+ /**
148
+ * Convenience for products that prefer to throw on denial. Throws a
149
+ * {@link CommerceApiError} with status 402 (insufficient) or 503 (unknown).
150
+ */
151
+ authorizeOrThrow(id: MeteringIdentity): Promise<void>;
152
+ }
153
+ /** Gateway-minted identity headers. */
154
+ export declare const HEADER_USER_ID = "x-user-id";
155
+ export declare const HEADER_ORG_ID = "x-org-id";
156
+ /**
157
+ * Build a {@link MeteringIdentity} from gateway-minted identity headers. The
158
+ * user is "{org}/{sub}" (commerce's iam-user form) when both are present.
159
+ * Accepts a header bag with string | string[] | undefined values (Node http,
160
+ * Next.js, fetch Headers via Object.fromEntries).
161
+ */
162
+ export declare function identityFromHeaders(headers: Record<string, string | string[] | undefined> | Headers): MeteringIdentity;