@nextblock-cms/ecom 0.21.0 → 0.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (359) hide show
  1. package/README.md +43 -0
  2. package/index.cjs +1 -0
  3. package/lib/CurrencyProvider.cjs +1 -0
  4. package/lib/CurrencyProvider.es.js +1 -1
  5. package/lib/PaymentReadinessProvider.cjs +1 -0
  6. package/lib/PaymentReadinessProvider.es.js +1 -1
  7. package/lib/cart-store.cjs +1 -0
  8. package/lib/cart-store.es.js +1 -1
  9. package/lib/components/AccountNavigationMenu.cjs +1 -0
  10. package/lib/components/AccountNavigationMenu.es.js +1 -1
  11. package/lib/components/AddToCartButton.cjs +1 -0
  12. package/lib/components/AddToCartButton.es.js +1 -1
  13. package/lib/components/Cart.cjs +1 -0
  14. package/lib/components/Cart.es.js +1 -1
  15. package/lib/components/CartDrawer.cjs +1 -0
  16. package/lib/components/CartDrawer.es.js +1 -1
  17. package/lib/components/CartIcon.cjs +1 -0
  18. package/lib/components/CartIcon.es.js +1 -1
  19. package/lib/components/Checkout.cjs +1 -0
  20. package/lib/components/Checkout.es.js +1 -1
  21. package/lib/components/CouponForm.cjs +1 -0
  22. package/lib/components/CouponForm.es.js +1 -1
  23. package/lib/components/CurrencySwitcher.cjs +1 -0
  24. package/lib/components/CurrencySwitcher.es.js +1 -1
  25. package/lib/components/CustomerProfileForm.cjs +1 -0
  26. package/lib/components/CustomerProfileForm.es.js +1 -1
  27. package/lib/components/FeaturedProduct.cjs +1 -0
  28. package/lib/components/FeaturedProduct.es.js +1 -1
  29. package/lib/components/FreemiusLicensePanel.cjs +1 -0
  30. package/lib/components/FreemiusLicensePanel.es.js +1 -1
  31. package/lib/components/InvoiceDocument.cjs +1 -0
  32. package/lib/components/InvoiceDocument.es.js +1 -1
  33. package/lib/components/{InvoiceViewerShell.cjs.js → InvoiceViewerShell.cjs} +1 -1
  34. package/lib/components/InvoiceViewerShell.es.js +1 -1
  35. package/lib/components/ProductCard.cjs +1 -0
  36. package/lib/components/ProductCard.es.js +1 -1
  37. package/lib/components/ProductDetailsLayout.cjs +1 -0
  38. package/lib/components/ProductDetailsLayout.es.js +1 -1
  39. package/lib/components/ProductGallery.cjs +1 -0
  40. package/lib/components/ProductGallery.es.js +1 -1
  41. package/lib/components/ProductGrid.cjs +1 -0
  42. package/lib/components/ProductGrid.es.js +1 -1
  43. package/lib/components/ShippingEstimator.cjs +1 -0
  44. package/lib/components/ShippingEstimator.es.js +1 -1
  45. package/lib/components/ShortDescription.cjs +1 -0
  46. package/lib/components/ShortDescription.es.js +1 -1
  47. package/lib/components/SimpleTiptapRenderer.cjs +1 -0
  48. package/lib/components/SimpleTiptapRenderer.es.js +1 -1
  49. package/lib/components/SubscriptionSelector.cjs +1 -0
  50. package/lib/components/SubscriptionSelector.es.js +1 -1
  51. package/lib/countries.es.js +1 -1
  52. package/lib/coupon-server.cjs +1 -0
  53. package/lib/coupon-server.es.js +1 -1
  54. package/lib/coupons.es.js +1 -1
  55. package/lib/currency-constants.es.js +1 -1
  56. package/lib/currency-rest-client.es.js +1 -1
  57. package/lib/currency-store.es.js +1 -1
  58. package/lib/currency-sync.cjs +1 -0
  59. package/lib/currency-sync.es.js +1 -1
  60. package/lib/currency.es.js +1 -1
  61. package/lib/customer-addresses.cjs +1 -0
  62. package/lib/customer-addresses.es.js +1 -1
  63. package/lib/customer-orders.cjs +1 -0
  64. package/lib/customer-orders.es.js +1 -1
  65. package/lib/customer.cjs +1 -0
  66. package/lib/customer.es.js +1 -1
  67. package/lib/export-helpers.cjs +1 -0
  68. package/lib/export-helpers.es.js +1 -1
  69. package/lib/factory.cjs +1 -0
  70. package/lib/factory.es.js +1 -1
  71. package/lib/freemius-coupons.cjs +1 -0
  72. package/lib/freemius-coupons.es.js +1 -1
  73. package/lib/freemius-license-claim.cjs +1 -0
  74. package/lib/freemius-license-claim.es.js +1 -1
  75. package/lib/freemius-license.cjs +1 -0
  76. package/lib/freemius-license.es.js +1 -1
  77. package/lib/freemius-order-sync.cjs +1 -0
  78. package/lib/freemius-order-sync.es.js +1 -1
  79. package/lib/freemius-trial-provision.cjs +1 -0
  80. package/lib/freemius-trial-provision.es.js +1 -1
  81. package/lib/inventory-settings.es.js +1 -1
  82. package/lib/{invoice-server.cjs.js → invoice-server.cjs} +1 -1
  83. package/lib/invoice-server.es.js +1 -1
  84. package/lib/invoice-ui.es.js +1 -1
  85. package/lib/invoice.es.js +1 -1
  86. package/lib/{order-inventory.cjs.js → order-inventory.cjs} +1 -1
  87. package/lib/order-inventory.es.js +1 -1
  88. package/lib/order-tax-details.es.js +1 -1
  89. package/lib/pages/cms/coupons/CouponEditorForm.cjs +1 -0
  90. package/lib/pages/cms/coupons/CouponEditorForm.es.js +1 -1
  91. package/lib/pages/cms/coupons/{CouponsPage.cjs.js → CouponsPage.cjs} +1 -1
  92. package/lib/pages/cms/coupons/CouponsPage.es.js +1 -1
  93. package/lib/pages/cms/coupons/CreateCouponDialog.cjs +1 -0
  94. package/lib/pages/cms/coupons/CreateCouponDialog.es.js +1 -1
  95. package/lib/pages/cms/coupons/EditCouponPage.cjs +1 -0
  96. package/lib/pages/cms/coupons/EditCouponPage.es.js +1 -1
  97. package/lib/pages/cms/coupons/ProductScopePicker.es.js +1 -1
  98. package/lib/pages/cms/coupons/actions.cjs +1 -0
  99. package/lib/pages/cms/coupons/actions.es.js +1 -1
  100. package/lib/pages/cms/coupons/index.cjs +1 -0
  101. package/lib/pages/cms/coupons/product-options.es.js +1 -1
  102. package/lib/pages/cms/orders/ExportReportsDialog.cjs +1 -0
  103. package/lib/pages/cms/orders/ExportReportsDialog.es.js +1 -1
  104. package/lib/pages/cms/orders/OrderDetailPage.cjs +1 -0
  105. package/lib/pages/cms/orders/OrderDetailPage.es.js +1 -1
  106. package/lib/pages/cms/orders/OrderPrintButton.es.js +1 -1
  107. package/lib/pages/cms/orders/OrderStatusForm.cjs +1 -0
  108. package/lib/pages/cms/orders/OrderStatusForm.es.js +1 -1
  109. package/lib/pages/cms/orders/OrdersPage.cjs +1 -0
  110. package/lib/pages/cms/orders/OrdersPage.es.js +1 -1
  111. package/lib/pages/cms/orders/actions.es.js +1 -1
  112. package/lib/pages/cms/orders/export-actions.es.js +1 -1
  113. package/lib/pages/cms/orders/index.cjs +1 -0
  114. package/lib/pages/cms/orders/server-actions.cjs +1 -0
  115. package/lib/pages/cms/orders/server-actions.es.js +1 -1
  116. package/lib/pages/cms/payments/PaymentsClient.es.js +1 -1
  117. package/lib/pages/cms/payments/PaymentsPage.cjs +1 -0
  118. package/lib/pages/cms/payments/PaymentsPage.es.js +1 -1
  119. package/lib/pages/cms/payments/actions.cjs +1 -0
  120. package/lib/pages/cms/payments/actions.es.js +1 -1
  121. package/lib/pages/cms/payments/index.cjs +1 -0
  122. package/lib/pages/cms/payments/queries.cjs +1 -0
  123. package/lib/pages/cms/payments/queries.es.js +1 -1
  124. package/lib/pages/cms/products/ProductsPage.cjs +1 -0
  125. package/lib/pages/cms/products/ProductsPage.es.js +1 -1
  126. package/lib/pages/cms/products/[id]/edit/EditProductPage.cjs +1 -0
  127. package/lib/pages/cms/products/{_id_ → [id]}/edit/EditProductPage.es.js +1 -1
  128. package/lib/pages/cms/products/{actions.cjs.js → actions.cjs} +1 -1
  129. package/lib/pages/cms/products/actions.es.js +1 -1
  130. package/lib/pages/cms/products/attributes/AttributeManagementPage.cjs +1 -0
  131. package/lib/pages/cms/products/attributes/AttributeManagementPage.es.js +1 -1
  132. package/lib/pages/cms/products/attributes/components/AttributeManager.es.js +1 -1
  133. package/lib/pages/cms/products/categories/CategoryManagementPage.cjs +1 -0
  134. package/lib/pages/cms/products/categories/CategoryManagementPage.es.js +1 -1
  135. package/lib/pages/cms/products/categories/components/CategoryManager.cjs +1 -0
  136. package/lib/pages/cms/products/categories/components/CategoryManager.es.js +1 -1
  137. package/lib/pages/cms/products/components/CopyProductFromLanguage.cjs +1 -0
  138. package/lib/pages/cms/products/components/CopyProductFromLanguage.es.js +1 -1
  139. package/lib/pages/cms/products/components/CurrencyPriceFields.cjs +1 -0
  140. package/lib/pages/cms/products/components/CurrencyPriceFields.es.js +1 -1
  141. package/lib/pages/cms/products/components/DeleteProductButton.es.js +1 -1
  142. package/lib/pages/cms/products/components/FreemiusPricingDashboard.cjs +1 -0
  143. package/lib/pages/cms/products/components/FreemiusPricingDashboard.es.js +1 -1
  144. package/lib/pages/cms/products/components/ProductCategorySelector.cjs +1 -0
  145. package/lib/pages/cms/products/components/ProductCategorySelector.es.js +1 -1
  146. package/lib/pages/cms/products/components/ProductForm.cjs +1 -0
  147. package/lib/pages/cms/products/components/ProductForm.es.js +1 -1
  148. package/lib/pages/cms/products/components/ProductMediaManager.cjs +1 -0
  149. package/lib/pages/cms/products/components/ProductMediaManager.es.js +1 -1
  150. package/lib/pages/cms/products/components/ProductsBulkTable.cjs +1 -0
  151. package/lib/pages/cms/products/components/ProductsBulkTable.es.js +1 -1
  152. package/lib/pages/cms/products/components/SaleScheduleFields.es.js +1 -1
  153. package/lib/pages/cms/products/components/SyncFreemiusButton.cjs +1 -0
  154. package/lib/pages/cms/products/components/SyncFreemiusButton.es.js +1 -1
  155. package/lib/pages/cms/products/components/{SyncFreemiusPricingButton.cjs.js → SyncFreemiusPricingButton.cjs} +1 -1
  156. package/lib/pages/cms/products/components/SyncFreemiusPricingButton.es.js +1 -1
  157. package/lib/pages/cms/products/components/VariationsEditor.cjs +1 -0
  158. package/lib/pages/cms/products/components/VariationsEditor.es.js +1 -1
  159. package/lib/pages/cms/products/index.cjs +1 -0
  160. package/lib/pages/cms/products/index.es.js +1 -1
  161. package/lib/pages/cms/products/inventory/InventoryPage.cjs +1 -0
  162. package/lib/pages/cms/products/inventory/InventoryPage.es.js +1 -1
  163. package/lib/pages/cms/products/inventory/{InventoryTableClient.cjs.js → InventoryTableClient.cjs} +1 -1
  164. package/lib/pages/cms/products/inventory/InventoryTableClient.es.js +1 -1
  165. package/lib/pages/cms/products/inventory/{actions.cjs.js → actions.cjs} +1 -1
  166. package/lib/pages/cms/products/inventory/actions.es.js +1 -1
  167. package/lib/pages/cms/products/new/NewProductPage.cjs +1 -0
  168. package/lib/pages/cms/products/new/NewProductPage.es.js +1 -1
  169. package/lib/pages/cms/products/product-price-sync.cjs +1 -0
  170. package/lib/pages/cms/products/product-price-sync.es.js +1 -1
  171. package/lib/pages/cms/products/server-actions.cjs +1 -0
  172. package/lib/pages/cms/products/server-actions.es.js +1 -1
  173. package/lib/pages/cms/shipping/{ShippingPage.cjs.js → ShippingPage.cjs} +1 -1
  174. package/lib/pages/cms/shipping/ShippingPage.es.js +1 -1
  175. package/lib/pages/cms/shipping/components/RateForm.cjs +1 -0
  176. package/lib/pages/cms/shipping/components/RateForm.es.js +1 -1
  177. package/lib/pages/cms/shipping/components/ZoneForm.cjs +1 -0
  178. package/lib/pages/cms/shipping/components/ZoneForm.es.js +1 -1
  179. package/lib/pages/cms/shipping/index.cjs +1 -0
  180. package/lib/pages/cms/shipping/server-actions.cjs +1 -0
  181. package/lib/pages/cms/shipping/server-actions.es.js +1 -1
  182. package/lib/pages/cms/taxes/TaxesPage.cjs +1 -0
  183. package/lib/pages/cms/taxes/TaxesPage.es.js +1 -1
  184. package/lib/pages/cms/taxes/actions.cjs +1 -0
  185. package/lib/pages/cms/taxes/actions.es.js +1 -1
  186. package/lib/pages/cms/taxes/components/TaxRateForm.cjs +1 -0
  187. package/lib/pages/cms/taxes/components/TaxRateForm.es.js +1 -1
  188. package/lib/pages/cms/taxes/index.cjs +1 -0
  189. package/lib/payment-config.es.js +1 -1
  190. package/lib/{product-actions.cjs.js → product-actions.cjs} +1 -1
  191. package/lib/product-actions.es.js +1 -1
  192. package/lib/product-context.cjs +1 -0
  193. package/lib/product-context.es.js +1 -1
  194. package/lib/product-schema.cjs +1 -0
  195. package/lib/product-schema.es.js +1 -1
  196. package/lib/providers/freemius.cjs +1 -0
  197. package/lib/providers/freemius.es.js +1 -1
  198. package/lib/providers/stripe.cjs +1 -0
  199. package/lib/providers/stripe.es.js +1 -1
  200. package/lib/server-actions/coupon-actions.cjs +1 -0
  201. package/lib/server-actions/coupon-actions.es.js +1 -1
  202. package/lib/server-actions/customer-actions.cjs +1 -0
  203. package/lib/server-actions/customer-actions.es.js +1 -1
  204. package/lib/server-actions/product-actions.cjs +1 -0
  205. package/lib/server-actions/product-actions.es.js +1 -1
  206. package/lib/server-actions/shipping-actions.cjs +1 -0
  207. package/lib/server-actions/shipping-actions.es.js +1 -1
  208. package/lib/server-actions/tax-actions.cjs +1 -0
  209. package/lib/server-actions/tax-actions.es.js +1 -1
  210. package/lib/shared-inventory.es.js +1 -1
  211. package/lib/shipping/{resolver.cjs.js → resolver.cjs} +1 -1
  212. package/lib/shipping/resolver.es.js +1 -1
  213. package/lib/shipping-rate-currency.cjs +1 -0
  214. package/lib/shipping-rate-currency.es.js +1 -1
  215. package/lib/states.cjs +1 -0
  216. package/lib/stripe/checkout.cjs +1 -0
  217. package/lib/stripe/checkout.es.js +1 -1
  218. package/lib/stripe/client.cjs +1 -0
  219. package/lib/stripe/client.es.js +1 -1
  220. package/lib/stripe/order-sync.cjs +1 -0
  221. package/lib/stripe/order-sync.es.js +1 -1
  222. package/lib/stripe/webhooks.cjs +1 -0
  223. package/lib/stripe/webhooks.es.js +1 -1
  224. package/lib/tax-calculation.cjs +1 -0
  225. package/lib/tax-calculation.es.js +1 -1
  226. package/lib/trials.es.js +1 -1
  227. package/lib/types.es.js +1 -1
  228. package/lib/use-cart.cjs +1 -0
  229. package/lib/use-cart.es.js +1 -1
  230. package/lib/use-price-formatter.es.js +1 -1
  231. package/lib/variation-utils.cjs +1 -0
  232. package/lib/variation-utils.es.js +1 -1
  233. package/lib/zod-config.es.js +1 -1
  234. package/package.json +10 -9
  235. package/server.cjs +1 -0
  236. package/server.es.js +1 -1
  237. package/index.cjs.js +0 -1
  238. package/lib/CurrencyProvider.cjs.js +0 -1
  239. package/lib/PaymentReadinessProvider.cjs.js +0 -1
  240. package/lib/cart-store.cjs.js +0 -1
  241. package/lib/components/AccountNavigationMenu.cjs.js +0 -1
  242. package/lib/components/AddToCartButton.cjs.js +0 -1
  243. package/lib/components/Cart.cjs.js +0 -1
  244. package/lib/components/CartDrawer.cjs.js +0 -1
  245. package/lib/components/CartIcon.cjs.js +0 -1
  246. package/lib/components/Checkout.cjs.js +0 -1
  247. package/lib/components/CouponForm.cjs.js +0 -1
  248. package/lib/components/CurrencySwitcher.cjs.js +0 -1
  249. package/lib/components/CustomerProfileForm.cjs.js +0 -1
  250. package/lib/components/FeaturedProduct.cjs.js +0 -1
  251. package/lib/components/FreemiusLicensePanel.cjs.js +0 -1
  252. package/lib/components/InvoiceDocument.cjs.js +0 -1
  253. package/lib/components/ProductCard.cjs.js +0 -1
  254. package/lib/components/ProductDetailsLayout.cjs.js +0 -1
  255. package/lib/components/ProductGallery.cjs.js +0 -1
  256. package/lib/components/ProductGrid.cjs.js +0 -1
  257. package/lib/components/ShippingEstimator.cjs.js +0 -1
  258. package/lib/components/ShortDescription.cjs.js +0 -1
  259. package/lib/components/SimpleTiptapRenderer.cjs.js +0 -1
  260. package/lib/components/SubscriptionSelector.cjs.js +0 -1
  261. package/lib/coupon-server.cjs.js +0 -1
  262. package/lib/currency-sync.cjs.js +0 -1
  263. package/lib/customer-addresses.cjs.js +0 -1
  264. package/lib/customer-orders.cjs.js +0 -1
  265. package/lib/customer.cjs.js +0 -1
  266. package/lib/export-helpers.cjs.js +0 -1
  267. package/lib/factory.cjs.js +0 -1
  268. package/lib/freemius-coupons.cjs.js +0 -1
  269. package/lib/freemius-license-claim.cjs.js +0 -1
  270. package/lib/freemius-license.cjs.js +0 -1
  271. package/lib/freemius-order-sync.cjs.js +0 -1
  272. package/lib/freemius-trial-provision.cjs.js +0 -1
  273. package/lib/pages/cms/coupons/CouponEditorForm.cjs.js +0 -1
  274. package/lib/pages/cms/coupons/CreateCouponDialog.cjs.js +0 -1
  275. package/lib/pages/cms/coupons/EditCouponPage.cjs.js +0 -1
  276. package/lib/pages/cms/coupons/actions.cjs.js +0 -1
  277. package/lib/pages/cms/coupons/index.cjs.js +0 -1
  278. package/lib/pages/cms/orders/ExportReportsDialog.cjs.js +0 -1
  279. package/lib/pages/cms/orders/OrderDetailPage.cjs.js +0 -1
  280. package/lib/pages/cms/orders/OrderStatusForm.cjs.js +0 -1
  281. package/lib/pages/cms/orders/OrdersPage.cjs.js +0 -1
  282. package/lib/pages/cms/orders/index.cjs.js +0 -1
  283. package/lib/pages/cms/orders/server-actions.cjs.js +0 -1
  284. package/lib/pages/cms/payments/PaymentsPage.cjs.js +0 -1
  285. package/lib/pages/cms/payments/actions.cjs.js +0 -1
  286. package/lib/pages/cms/payments/index.cjs.js +0 -1
  287. package/lib/pages/cms/payments/queries.cjs.js +0 -1
  288. package/lib/pages/cms/products/ProductsPage.cjs.js +0 -1
  289. package/lib/pages/cms/products/_id_/edit/EditProductPage.cjs.js +0 -1
  290. package/lib/pages/cms/products/attributes/AttributeManagementPage.cjs.js +0 -1
  291. package/lib/pages/cms/products/categories/CategoryManagementPage.cjs.js +0 -1
  292. package/lib/pages/cms/products/categories/components/CategoryManager.cjs.js +0 -1
  293. package/lib/pages/cms/products/components/CopyProductFromLanguage.cjs.js +0 -1
  294. package/lib/pages/cms/products/components/CurrencyPriceFields.cjs.js +0 -1
  295. package/lib/pages/cms/products/components/FreemiusPricingDashboard.cjs.js +0 -1
  296. package/lib/pages/cms/products/components/ProductCategorySelector.cjs.js +0 -1
  297. package/lib/pages/cms/products/components/ProductForm.cjs.js +0 -1
  298. package/lib/pages/cms/products/components/ProductMediaManager.cjs.js +0 -1
  299. package/lib/pages/cms/products/components/ProductsBulkTable.cjs.js +0 -1
  300. package/lib/pages/cms/products/components/SyncFreemiusButton.cjs.js +0 -1
  301. package/lib/pages/cms/products/components/VariationsEditor.cjs.js +0 -1
  302. package/lib/pages/cms/products/index.cjs.js +0 -1
  303. package/lib/pages/cms/products/inventory/InventoryPage.cjs.js +0 -1
  304. package/lib/pages/cms/products/new/NewProductPage.cjs.js +0 -1
  305. package/lib/pages/cms/products/product-price-sync.cjs.js +0 -1
  306. package/lib/pages/cms/products/server-actions.cjs.js +0 -1
  307. package/lib/pages/cms/shipping/components/RateForm.cjs.js +0 -1
  308. package/lib/pages/cms/shipping/components/ZoneForm.cjs.js +0 -1
  309. package/lib/pages/cms/shipping/index.cjs.js +0 -1
  310. package/lib/pages/cms/shipping/server-actions.cjs.js +0 -1
  311. package/lib/pages/cms/taxes/TaxesPage.cjs.js +0 -1
  312. package/lib/pages/cms/taxes/actions.cjs.js +0 -1
  313. package/lib/pages/cms/taxes/components/TaxRateForm.cjs.js +0 -1
  314. package/lib/pages/cms/taxes/index.cjs.js +0 -1
  315. package/lib/product-context.cjs.js +0 -1
  316. package/lib/product-schema.cjs.js +0 -1
  317. package/lib/providers/freemius.cjs.js +0 -1
  318. package/lib/providers/stripe.cjs.js +0 -1
  319. package/lib/server-actions/coupon-actions.cjs.js +0 -1
  320. package/lib/server-actions/customer-actions.cjs.js +0 -1
  321. package/lib/server-actions/product-actions.cjs.js +0 -1
  322. package/lib/server-actions/shipping-actions.cjs.js +0 -1
  323. package/lib/server-actions/tax-actions.cjs.js +0 -1
  324. package/lib/shipping-rate-currency.cjs.js +0 -1
  325. package/lib/states.cjs.js +0 -1
  326. package/lib/stripe/checkout.cjs.js +0 -1
  327. package/lib/stripe/client.cjs.js +0 -1
  328. package/lib/stripe/order-sync.cjs.js +0 -1
  329. package/lib/stripe/webhooks.cjs.js +0 -1
  330. package/lib/tax-calculation.cjs.js +0 -1
  331. package/lib/use-cart.cjs.js +0 -1
  332. package/lib/variation-utils.cjs.js +0 -1
  333. package/server.cjs.js +0 -1
  334. /package/_virtual/_rolldown/{runtime.cjs.js → runtime.cjs} +0 -0
  335. /package/lib/{countries.cjs.js → countries.cjs} +0 -0
  336. /package/lib/{coupons.cjs.js → coupons.cjs} +0 -0
  337. /package/lib/{currency-constants.cjs.js → currency-constants.cjs} +0 -0
  338. /package/lib/{currency-rest-client.cjs.js → currency-rest-client.cjs} +0 -0
  339. /package/lib/{currency-store.cjs.js → currency-store.cjs} +0 -0
  340. /package/lib/{currency.cjs.js → currency.cjs} +0 -0
  341. /package/lib/{inventory-settings.cjs.js → inventory-settings.cjs} +0 -0
  342. /package/lib/{invoice-ui.cjs.js → invoice-ui.cjs} +0 -0
  343. /package/lib/{invoice.cjs.js → invoice.cjs} +0 -0
  344. /package/lib/{order-tax-details.cjs.js → order-tax-details.cjs} +0 -0
  345. /package/lib/pages/cms/coupons/{ProductScopePicker.cjs.js → ProductScopePicker.cjs} +0 -0
  346. /package/lib/pages/cms/coupons/{product-options.cjs.js → product-options.cjs} +0 -0
  347. /package/lib/pages/cms/orders/{OrderPrintButton.cjs.js → OrderPrintButton.cjs} +0 -0
  348. /package/lib/pages/cms/orders/{actions.cjs.js → actions.cjs} +0 -0
  349. /package/lib/pages/cms/orders/{export-actions.cjs.js → export-actions.cjs} +0 -0
  350. /package/lib/pages/cms/payments/{PaymentsClient.cjs.js → PaymentsClient.cjs} +0 -0
  351. /package/lib/pages/cms/products/attributes/components/{AttributeManager.cjs.js → AttributeManager.cjs} +0 -0
  352. /package/lib/pages/cms/products/components/{DeleteProductButton.cjs.js → DeleteProductButton.cjs} +0 -0
  353. /package/lib/pages/cms/products/components/{SaleScheduleFields.cjs.js → SaleScheduleFields.cjs} +0 -0
  354. /package/lib/{payment-config.cjs.js → payment-config.cjs} +0 -0
  355. /package/lib/{shared-inventory.cjs.js → shared-inventory.cjs} +0 -0
  356. /package/lib/{trials.cjs.js → trials.cjs} +0 -0
  357. /package/lib/{types.cjs.js → types.cjs} +0 -0
  358. /package/lib/{use-price-formatter.cjs.js → use-price-formatter.cjs} +0 -0
  359. /package/lib/{zod-config.cjs.js → zod-config.cjs} +0 -0
@@ -0,0 +1 @@
1
+ "use client";Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./ProductCard.cjs");let t=require("@nextblock-cms/utils"),n=require("react/jsx-runtime");var r=({products:r,columns:i=3,className:a})=>{let{t:o}=(0,t.useTranslations)();if(!r.length){let e=o(`ecommerce.no_products_found`);return(0,n.jsx)(`div`,{className:`py-12 text-center text-muted-foreground`,children:e===`ecommerce.no_products_found`?`No products found.`:e})}return(0,n.jsx)(`div`,{className:(0,t.cn)(`grid gap-6 sm:grid-cols-2`,i===3&&`lg:grid-cols-3`,i===4&&`lg:grid-cols-4`,a),children:r.map((t,r)=>(0,n.jsx)(e.ProductCard,{product:t,priority:r<i},t.id))})};exports.ProductGrid=r;
@@ -2,7 +2,7 @@
2
2
  import { ProductCard as e } from "./ProductCard.es.js";
3
3
  import { cn as t, useTranslations as n } from "@nextblock-cms/utils";
4
4
  import { jsx as r } from "react/jsx-runtime";
5
- //#region libs/ecommerce/src/lib/components/ProductGrid.tsx
5
+ //#region src/lib/components/ProductGrid.tsx
6
6
  var i = ({ products: i, columns: a = 3, className: o }) => {
7
7
  let { t: s } = n();
8
8
  if (!i.length) {
@@ -0,0 +1 @@
1
+ "use client";const e=require("../CurrencyProvider.cjs"),t=require("../use-price-formatter.cjs"),n=require("../countries.cjs"),r=require("../states.cjs"),i=require("../server-actions/shipping-actions.cjs");let a=require("@nextblock-cms/ui/button"),o=require("react"),s=require("lucide-react"),c=require("@nextblock-cms/utils"),l=require("react/jsx-runtime"),u=require("@nextblock-cms/ui/input"),d=require("@nextblock-cms/ui/label");var f=({physicalSubtotal:f})=>{let p=t.usePriceFormatter(),[m,h]=(0,o.useState)(`CA`),[g,_]=(0,o.useState)(``),[v,y]=(0,o.useState)(``),[b,x]=(0,o.useState)(!1),[S,C]=(0,o.useState)(null),[w,T]=(0,o.useState)(null),{t:E,lang:D}=(0,c.useTranslations)(),{activeCurrencyCode:O}=e.useCurrency(),k=(e,t)=>{let n=E(e);return n===e?t:n},A=r.getStatesForCountry(m),j=r.countryUsesStructuredStates(m),M=(0,o.useMemo)(()=>{try{return new Intl.DisplayNames([D],{type:`region`})}catch{return null}},[D]),N=k(`select_an_option`,`Select an option`),P=k(`state_province`,`State / Province`),F=async()=>{x(!0),T(null),C(null);try{let e=await i.getShippingEstimates(f,{country:m,state:g||void 0,postal_code:v},D,O);e.success&&e.methods?C(e.methods):T(e.errorKey?k(e.errorKey,e.error||E(`ecommerce.no_rates_found`)):e.error||E(`ecommerce.no_rates_found`))}catch(e){console.error(`[ShippingEstimator] Failed to load rates:`,e),T(k(`ecommerce.shipping_calculation_failed`,`We couldn't calculate shipping right now. Please try again.`))}finally{x(!1)}};return(0,l.jsxs)(`div`,{className:`space-y-4 rounded-lg border bg-muted/30 p-4 mt-6`,children:[(0,l.jsxs)(`div`,{className:`flex items-center gap-2 font-semibold text-sm`,children:[(0,l.jsx)(s.Truck,{className:`h-4 w-4`}),(0,l.jsx)(`span`,{children:E(`ecommerce.estimate_shipping`)})]}),(0,l.jsxs)(`div`,{className:`grid gap-3`,children:[(0,l.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,l.jsx)(d.Label,{htmlFor:`estimate-country`,className:`text-xs uppercase tracking-wider text-muted-foreground`,children:E(`ecommerce.country`)}),(0,l.jsx)(`select`,{id:`estimate-country`,name:`estimate-country`,autoComplete:`shipping country`,value:m,onChange:e=>{let t=e.target.value,n=r.getStatesForCountry(t);h(t),_(n.some(e=>e.code===g)?g:``)},className:`flex h-9 w-full rounded-md border border-input bg-background px-3 py-2 text-sm`,children:n.countries.map(e=>(0,l.jsx)(`option`,{value:e.code,children:M?.of(e.code)??e.name},e.code))})]}),j&&(0,l.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,l.jsx)(d.Label,{htmlFor:`estimate-state`,className:`text-xs uppercase tracking-wider text-muted-foreground`,children:E(`state_province`)}),(0,l.jsxs)(`select`,{id:`estimate-state`,name:`estimate-state`,autoComplete:`shipping address-level1`,value:g,onChange:e=>_(e.target.value),className:`flex h-9 w-full rounded-md border border-input bg-background px-3 py-2 text-sm`,children:[(0,l.jsx)(`option`,{value:``,children:`${N}: ${P}`}),A.map(e=>(0,l.jsx)(`option`,{value:e.code,children:r.getSubdivisionLabel(m,e,D)},e.code))]})]}),(0,l.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,l.jsx)(d.Label,{htmlFor:`estimate-postal`,className:`text-xs uppercase tracking-wider text-muted-foreground`,children:E(`ecommerce.postal_code`)}),(0,l.jsxs)(`div`,{className:`flex gap-2`,children:[(0,l.jsx)(u.Input,{id:`estimate-postal`,name:`estimate-postal`,autoComplete:`shipping postal-code`,placeholder:m===`CA`?`A1A 1A1`:void 0,value:v,onChange:e=>y(e.target.value),onKeyDown:e=>{e.key===`Enter`&&!b&&(e.preventDefault(),F())},className:`h-9 text-sm bg-background`}),(0,l.jsxs)(a.Button,{size:`sm`,variant:`secondary`,onClick:F,disabled:b,className:`shrink-0`,children:[b?(0,l.jsx)(s.Loader2,{className:`h-4 w-4 mr-1.5 animate-spin`}):(0,l.jsx)(s.Calculator,{className:`h-4 w-4 mr-1.5`}),E(`ecommerce.calculate`)]})]})]})]}),w&&(0,l.jsx)(`p`,{role:`alert`,className:`text-xs text-destructive mt-2`,children:w}),(0,l.jsxs)(`div`,{"aria-live":`polite`,children:[S&&S.length>0&&(0,l.jsxs)(`div`,{className:`mt-4 space-y-2 border-t pt-3`,children:[(0,l.jsxs)(`p`,{className:`text-xs font-medium text-muted-foreground uppercase`,children:[E(`ecommerce.available_rates`),`:`]}),S.map(e=>(0,l.jsxs)(`div`,{className:`flex justify-between items-center p-3 border rounded-lg bg-muted/30`,children:[(0,l.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,l.jsx)(s.Truck,{className:`h-4 w-4 text-muted-foreground`}),(0,l.jsx)(`span`,{className:`text-sm font-medium`,children:e.name})]}),(0,l.jsx)(`span`,{className:`text-sm font-bold tabular-nums`,children:e.amount===0?E(`ecommerce.free`):p(e.amount,O)})]},e.id))]}),S&&S.length===0&&!w&&(0,l.jsx)(`p`,{className:`text-xs text-muted-foreground mt-2 italic`,children:E(`ecommerce.no_rates_found`)})]})]})};exports.ShippingEstimator=f;
@@ -11,7 +11,7 @@ import { useTranslations as p } from "@nextblock-cms/utils";
11
11
  import { jsx as m, jsxs as h } from "react/jsx-runtime";
12
12
  import { Input as g } from "@nextblock-cms/ui/input";
13
13
  import { Label as _ } from "@nextblock-cms/ui/label";
14
- //#region libs/ecommerce/src/lib/components/ShippingEstimator.tsx
14
+ //#region src/lib/components/ShippingEstimator.tsx
15
15
  var v = ({ physicalSubtotal: v }) => {
16
16
  let y = t(), [b, x] = l("CA"), [S, C] = l(""), [w, T] = l(""), [E, D] = l(!1), [O, k] = l(null), [A, j] = l(null), { t: M, lang: N } = p(), { activeCurrencyCode: P } = e(), F = (e, t) => {
17
17
  let n = M(e);
@@ -0,0 +1 @@
1
+ const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("./SimpleTiptapRenderer.cjs");let n=require("react");n=e.__toESM(n,1);let r=require("@nextblock-cms/utils"),i=require("react/jsx-runtime");var a=/<\/?[a-z][^>]*>/i,o=e=>a.test(e);function s({value:e,className:n}){let a=e?.trim();return a?o(a)?(0,i.jsx)(`div`,{className:n,dangerouslySetInnerHTML:{__html:t.toNoCookieEmbedSrc(a)??a}}):(0,i.jsx)(`p`,{className:(0,r.cn)(`whitespace-pre-line`,n),children:a}):null}exports.ShortDescription=s,exports.isHtmlShortDescription=o;
@@ -2,7 +2,7 @@ import { toNoCookieEmbedSrc as e } from "./SimpleTiptapRenderer.es.js";
2
2
  import "react";
3
3
  import { cn as t } from "@nextblock-cms/utils";
4
4
  import { jsx as n } from "react/jsx-runtime";
5
- //#region libs/ecommerce/src/lib/components/ShortDescription.tsx
5
+ //#region src/lib/components/ShortDescription.tsx
6
6
  var r = /<\/?[a-z][^>]*>/i, i = (e) => r.test(e);
7
7
  function a({ value: r, className: a }) {
8
8
  let o = r?.trim();
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../_virtual/_rolldown/runtime.cjs");let t=require("react");t=e.__toESM(t,1);let n=require("react/jsx-runtime");var r=(e,t)=>t.reduce((e,t)=>{switch(t.type){case`bold`:return(0,n.jsx)(`strong`,{children:e});case`italic`:return(0,n.jsx)(`em`,{children:e});case`underline`:case`u`:return(0,n.jsx)(`u`,{children:e});case`strike`:return(0,n.jsx)(`s`,{children:e});case`code`:return(0,n.jsx)(`code`,{className:`bg-muted px-1.5 py-0.5 rounded text-[0.875em] font-mono`,children:e});case`link`:{let r=t.attrs?.href||`#`,i=t.attrs?.target||`_blank`;return(0,n.jsx)(`a`,{href:r,target:i,rel:`noopener noreferrer`,className:`underline text-primary hover:text-primary/80`,children:e})}case`highlight`:{let r=t.attrs?.color;return(0,n.jsx)(`mark`,{style:r?{backgroundColor:r}:{},className:r?void 0:`bg-yellow-200 dark:bg-yellow-800/50`,children:e})}case`subscript`:return(0,n.jsx)(`sub`,{children:e});case`superscript`:return(0,n.jsx)(`sup`,{children:e});case`textStyle`:{let r={};return t.attrs?.color&&(r.color=t.attrs.color),t.attrs?.fontSize&&(r.fontSize=t.attrs.fontSize),t.attrs?.fontFamily&&(r.fontFamily=t.attrs.fontFamily),Object.keys(r).length>0?(0,n.jsx)(`span`,{style:r,children:e}):(0,n.jsx)(n.Fragment,{children:e})}default:return e}},e),i=[`h1`,`h2`,`h3`,`h4`,`h5`,`h6`],a=(e,n,r,a)=>{let o=i[Math.max(1,Math.min(6,e))-1],s=a?.id;return t.default.createElement(o,{key:r,className:`font-bold my-4`,id:s},n)},o=e=>{let t={},n={},r=e?.colspan,i=e?.rowspan,a=e?.colwidth;return r&&r>1&&(t.colSpan=r),i&&i>1&&(t.rowSpan=i),a&&Array.isArray(a)&&a[0]&&(n.minWidth=a[0]),Object.keys(n).length>0&&(t.style=n),t},s=(e,i)=>{if(e.type===`text`){let a=e.text??``;return(0,n.jsx)(t.default.Fragment,{children:e.marks?.length?r(a,e.marks):a},i)}let l=e.content?.map((e,t)=>s(e,t))??null;switch(e.type){case`doc`:return(0,n.jsx)(`div`,{children:l},i);case`paragraph`:{if(!e.content?.length||e.content.every(e=>e.type===`text`&&(!e.text||!e.text.trim())))return null;let t=e.attrs?.textAlign,r=t?{textAlign:t}:{};return(0,n.jsx)(`p`,{className:`mb-4`,style:Object.keys(r).length?r:void 0,children:l},i)}case`heading`:return a(e.attrs?.level||1,l,i,e.attrs??void 0);case`bulletList`:return(0,n.jsx)(`ul`,{className:`list-disc pl-5 mb-4`,children:l},i);case`orderedList`:{let t=e.attrs?.start??1;return(0,n.jsx)(`ol`,{className:`list-decimal pl-5 mb-4`,start:t===1?void 0:t,children:l},i)}case`listItem`:return(0,n.jsx)(`li`,{children:l},i);case`taskList`:return(0,n.jsx)(`ul`,{className:`list-none pl-0 mb-4 space-y-1`,children:l},i);case`taskItem`:{let t=!!e.attrs?.checked;return(0,n.jsxs)(`li`,{className:`flex items-start gap-2`,children:[(0,n.jsx)(`input`,{type:`checkbox`,checked:t,readOnly:!0,className:`mt-1.5 rounded`}),(0,n.jsx)(`div`,{className:t?`line-through text-muted-foreground`:``,children:l})]},i)}case`blockquote`:return(0,n.jsx)(`blockquote`,{className:`border-l-4 border-border pl-4 italic my-4`,children:l},i);case`codeBlock`:{let t=e.attrs?.language;return(0,n.jsx)(`pre`,{className:`bg-muted rounded-lg p-4 mb-4 overflow-x-auto`,"data-language":t||void 0,children:(0,n.jsx)(`code`,{className:`text-sm font-mono`,children:l})},i)}case`horizontalRule`:return(0,n.jsx)(`hr`,{className:`my-6 border-border`},i);case`hardBreak`:return(0,n.jsx)(`br`,{},i);case`image`:{let t=e.attrs?.src,r=e.attrs?.alt||``,a=e.attrs?.title,o=e.attrs?.width,s=e.attrs?.height,c={};return o&&(c.width=typeof o==`number`?`${o}px`:o),s&&(c.height=typeof s==`number`?`${s}px`:s),(0,n.jsx)(`img`,{src:t,alt:r??``,title:a,width:typeof o==`number`?o:void 0,height:typeof s==`number`?s:void 0,loading:`lazy`,decoding:`async`,style:Object.keys(c).length?c:void 0,className:`max-w-full h-auto rounded my-4`},i)}case`table`:return(0,n.jsx)(`div`,{className:`overflow-x-auto my-4`,children:(0,n.jsx)(`table`,{className:`w-full border-collapse border border-gray-300 dark:border-gray-700`,style:{minWidth:500},children:(0,n.jsx)(`tbody`,{children:l})})},i);case`tableRow`:return(0,n.jsx)(`tr`,{className:`border-b border-gray-300 dark:border-gray-700`,children:l},i);case`tableHeader`:return(0,n.jsx)(`th`,{...o(e.attrs??void 0),className:`bg-gray-100 dark:bg-gray-800 font-bold p-3 text-left border border-gray-300 dark:border-gray-700`,children:l},i);case`tableCell`:return(0,n.jsx)(`td`,{...o(e.attrs??void 0),className:`p-3 border border-gray-300 dark:border-gray-700`,children:l},i);case`details`:return(0,n.jsx)(`details`,{className:`my-4 border rounded-lg overflow-hidden`,children:l},i);case`detailsSummary`:return(0,n.jsx)(`summary`,{className:`cursor-pointer p-3 font-semibold bg-muted/30 hover:bg-muted/50`,children:l},i);case`detailsContent`:return(0,n.jsx)(`div`,{className:`p-3 border-t`,children:l},i);case`youtube`:{let t=c(e.attrs?.src),r=e.attrs?.width||640,a=e.attrs?.height||480;return(0,n.jsx)(`div`,{className:`relative my-4 overflow-hidden rounded-lg`,style:{aspectRatio:`${r}/${a}`,maxWidth:r},children:(0,n.jsx)(`iframe`,{src:t,title:e.attrs?.title||`Embedded video`,allow:`accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture`,allowFullScreen:!0,loading:`lazy`,className:`absolute inset-0 w-full h-full`})},i)}case`iframe`:{let t=c(e.attrs?.src);return(0,n.jsx)(`div`,{className:`my-4 overflow-hidden rounded-lg`,style:{aspectRatio:`16/9`},children:(0,n.jsx)(`iframe`,{src:t,title:e.attrs?.title||`Embedded content`,allowFullScreen:!0,loading:`lazy`,className:`w-full h-full border-0`})},i)}case`mention`:{let t=e.attrs?.label||e.attrs?.id||``;return(0,n.jsxs)(`span`,{className:`text-primary font-medium`,children:[`@`,t]},i)}default:return(0,n.jsx)(`div`,{children:l},i)}},c=e=>e?.replace(/(?:https?:)?\/\/(?:www\.|m\.|music\.)?youtube\.com\/embed\//gi,`https://www.youtube-nocookie.com/embed/`),l=({content:e,className:t})=>{if(!e)return null;if(typeof e==`string`){if(e.trim().startsWith(`{`)||e.trim().startsWith(`[`))try{let r=JSON.parse(e);return(0,n.jsx)(l,{content:r,className:t})}catch{}return(0,n.jsx)(`div`,{className:t,dangerouslySetInnerHTML:{__html:c(e)??e}})}let r=e;return!r.content||!Array.isArray(r.content)?null:(0,n.jsx)(`div`,{className:t,children:r.content.map((e,t)=>s(e,t))})};exports.SimpleTiptapRenderer=l,exports.toNoCookieEmbedSrc=c;
@@ -1,6 +1,6 @@
1
1
  import e from "react";
2
2
  import { Fragment as t, jsx as n, jsxs as r } from "react/jsx-runtime";
3
- //#region libs/ecommerce/src/lib/components/SimpleTiptapRenderer.tsx
3
+ //#region src/lib/components/SimpleTiptapRenderer.tsx
4
4
  var i = (e, r) => r.reduce((e, r) => {
5
5
  switch (r.type) {
6
6
  case "bold": return /* @__PURE__ */ n("strong", { children: e });
@@ -0,0 +1 @@
1
+ "use client";const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../currency.cjs"),n=require("../CurrencyProvider.cjs"),r=require("../use-cart.cjs"),i=require("../use-price-formatter.cjs"),a=require("../trials.cjs"),o=require("../pages/cms/products/actions.cjs");let s=require("@nextblock-cms/ui/button"),c=require("react");c=e.__toESM(c,1);let l=require("lucide-react"),u=require("@nextblock-cms/utils"),d=require("react/jsx-runtime"),f=require("sonner"),p=require("@nextblock-cms/ui/Skeleton");var m=({product:e})=>{let m=i.usePriceFormatter(),h=r.useCart(e=>e),{t:g}=(0,u.useTranslations)(),{activeCurrencyCode:_,currencies:v,defaultCurrency:y}=n.useCurrency(),[b,x]=(0,c.useState)([]),[S,C]=(0,c.useState)(!0),[w,T]=(0,c.useState)(`annual`);if((0,c.useEffect)(()=>{async function t(){try{if(!e.id)return;let t=await o.getPublicFreemiusPricing(e.id);x(t)}catch(e){console.error(`Failed to load pricing:`,e)}finally{C(!1)}}t()},[e.id]),!h)return(0,d.jsx)(p.Skeleton,{className:`h-14 w-full`});let{addItem:E}=h,D=b[0],O=D?.pricing?.[0],k=()=>{let n=e.price,r=e.freemius_plan_id;O&&(w===`monthly`&&O.monthly_price!=null&&(n=(0,u.majorUnitAmountToMinor)(O.monthly_price,y.code)),w===`annual`&&O.annual_price!=null&&(n=(0,u.majorUnitAmountToMinor)(O.annual_price,y.code)),w===`lifetime`&&O.lifetime_price!=null&&(n=(0,u.majorUnitAmountToMinor)(O.lifetime_price,y.code)));let i=v.reduce((e,r)=>(e[r.code]=t.convertMinorUnitAmount({amount:n,fromCurrencyCode:y.code,toCurrencyCode:r.code,currencies:v,applyRounding:!0}),e),{}),a=i[_]??n;D&&D.id&&(r=D.id);let{success:o,error:s}=E({id:e.id,product_id:e.id,title:e.title,price:a,prices:i,image_url:e.image_url,slug:e.slug,sku:e.sku,language_id:e.language_id,translation_group_id:e.translation_group_id,product_type:`digital`,payment_provider:`freemius`,provider:`freemius`,billing_cycle:w,freemius_product_id:e.freemius_product_id,freemius_plan_id:r,trial_period_days:e.trial_period_days??0,trial_requires_payment_method:e.trial_requires_payment_method??!1,is_taxable:e.is_taxable,currency_code:_});o?f.toast.success(g(`ecommerce.added_to_cart_success`,{item:e.title})):f.toast.error(s||g(`ecommerce.added_to_cart_error`))};if(S)return(0,d.jsx)(p.Skeleton,{className:`h-32 w-full`});if(!D||!O)return(0,d.jsx)(`div`,{className:`p-4 border border-dashed rounded-lg text-center text-muted-foreground`,children:g(`ecommerce.pricing_unavailable`)});let A=O.monthly_price!=null,j=O.annual_price!=null,M=O.lifetime_price!=null;w===`annual`&&!j&&(A?T(`monthly`):M&&T(`lifetime`));let N=a.getTrialSummary(e,g),P=e.price;return w===`monthly`&&O.monthly_price!=null&&(P=t.convertMinorUnitAmount({amount:(0,u.majorUnitAmountToMinor)(O.monthly_price,y.code),fromCurrencyCode:y.code,toCurrencyCode:_,currencies:v,applyRounding:!0})),w===`annual`&&O.annual_price!=null&&(P=t.convertMinorUnitAmount({amount:(0,u.majorUnitAmountToMinor)(O.annual_price,y.code),fromCurrencyCode:y.code,toCurrencyCode:_,currencies:v,applyRounding:!0})),w===`lifetime`&&O.lifetime_price!=null&&(P=t.convertMinorUnitAmount({amount:(0,u.majorUnitAmountToMinor)(O.lifetime_price,y.code),fromCurrencyCode:y.code,toCurrencyCode:_,currencies:v,applyRounding:!0})),(0,d.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,d.jsxs)(`div`,{role:`group`,"aria-label":g(`ecommerce.billing_cycle`)===`ecommerce.billing_cycle`?`Billing cycle`:g(`ecommerce.billing_cycle`),className:`flex bg-secondary/35 p-1 rounded-lg w-full max-w-sm mx-auto shadow-inner`,children:[A&&(0,d.jsx)(`button`,{type:`button`,"aria-pressed":w===`monthly`,onClick:()=>T(`monthly`),className:`flex-1 py-1.5 text-xs font-semibold rounded-md transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring ${w===`monthly`?`bg-background shadow-sm text-foreground`:`text-muted-foreground hover:text-foreground`}`,children:g(`ecommerce.monthly`)}),j&&(0,d.jsx)(`button`,{type:`button`,"aria-pressed":w===`annual`,onClick:()=>T(`annual`),className:`flex-1 py-1.5 text-xs font-semibold rounded-md transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring ${w===`annual`?`bg-background shadow-sm text-foreground`:`text-muted-foreground hover:text-foreground`}`,children:g(`ecommerce.annual`)}),M&&(0,d.jsx)(`button`,{type:`button`,"aria-pressed":w===`lifetime`,onClick:()=>T(`lifetime`),className:`flex-1 py-1.5 text-xs font-semibold rounded-md transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring ${w===`lifetime`?`bg-background shadow-sm text-foreground`:`text-muted-foreground hover:text-foreground`}`,children:g(`ecommerce.lifetime`)})]}),(0,d.jsxs)(`div`,{className:`text-center`,children:[(0,d.jsx)(`span`,{className:`text-3xl font-extrabold text-foreground tabular-nums`,children:m(P,_)}),w!==`lifetime`&&(0,d.jsxs)(`span`,{className:`text-muted-foreground text-sm ml-1.5`,children:[`/ `,g(w===`annual`?`ecommerce.year`:`ecommerce.month`)]}),N&&(0,d.jsxs)(`div`,{className:`mt-1 text-xs font-medium text-emerald-600 dark:text-emerald-400`,children:[N.label,(0,d.jsx)(`span`,{className:`mx-2 text-muted-foreground/50`,children:`|`}),(0,d.jsx)(`span`,{className:`text-muted-foreground`,children:N.paymentRequirementLabel})]})]}),(0,d.jsxs)(s.Button,{onClick:k,className:`w-full h-12 text-base font-bold shadow-md transition-shadow hover:shadow-lg active:scale-[0.98]`,children:[(0,d.jsx)(l.ShoppingCart,{className:`mr-2 h-4 w-4`}),N?.label?g(`ecommerce.start_trial`,{trial:N.label})===`ecommerce.start_trial`?`Start ${N.label}`:g(`ecommerce.start_trial`,{trial:N.label}):g(`ecommerce.get_license`)]})]})};exports.SubscriptionSelector=m;
@@ -12,7 +12,7 @@ import { majorUnitAmountToMinor as u, useTranslations as d } from "@nextblock-cm
12
12
  import { jsx as f, jsxs as p } from "react/jsx-runtime";
13
13
  import { toast as m } from "sonner";
14
14
  import { Skeleton as h } from "@nextblock-cms/ui/Skeleton";
15
- //#region libs/ecommerce/src/lib/components/SubscriptionSelector.tsx
15
+ //#region src/lib/components/SubscriptionSelector.tsx
16
16
  var g = ({ product: g }) => {
17
17
  let _ = r(), v = n((e) => e), { t: y } = d(), { activeCurrencyCode: b, currencies: x, defaultCurrency: S } = t(), [C, w] = c([]), [T, E] = c(!0), [D, O] = c("annual");
18
18
  if (s(() => {
@@ -1,4 +1,4 @@
1
- //#region libs/ecommerce/src/lib/countries.ts
1
+ //#region src/lib/countries.ts
2
2
  var e = [
3
3
  {
4
4
  code: "US",
@@ -0,0 +1 @@
1
+ const e=require("./currency.cjs"),t=require("./coupons.cjs");function n(e){if(!e)return null;let t=new Date(e);return Number.isNaN(t.getTime())?null:t}function r(e,t){return e===`all`||e===t}function i(e){return e===`stripe`||e===`freemius`?e:null}async function a(t){let{data:n,error:r}=await t.from(`currencies`).select(`code, symbol, exchange_rate, is_default, is_active, auto_sync_product_prices, auto_update_exchange_rate, exchange_rate_source, exchange_rate_updated_at, rounding_mode, rounding_increment, rounding_charm_amount`).eq(`is_active`,!0).order(`code`,{ascending:!0});if(r)throw Error(r.message);return(n||[]).map(t=>e.normalizeCurrencyRecord(t))}async function o(n){let{client:r,items:o}=n,s=await a(r);if(s.length===0)throw Error(`No active currencies are configured.`);let c=s.find(e=>e.code===(n.currencyCode||``).toUpperCase())??e.getDefaultCurrency(s),l=[...new Set(o.map(e=>e.product_id).filter(Boolean))],u=[...new Set(o.map(e=>e.variant_id).filter(e=>!!e))];if(l.length===0)return{lines:[],currencies:s,selectedCurrency:c};let[{data:d,error:f},p]=await Promise.all([r.from(`products`).select(`id, title, price, prices, sale_price, sale_prices, sale_start_at, sale_end_at, scheduled_price, scheduled_prices, scheduled_price_at, product_type, payment_provider, freemius_product_id, freemius_plan_id`).in(`id`,l),u.length?r.from(`product_variants`).select(`id, product_id, price, prices, sale_price, sale_prices, sale_start_at, sale_end_at, scheduled_price, scheduled_prices, scheduled_price_at`).in(`id`,u):Promise.resolve({data:[],error:null})]);if(f)throw Error(f.message);if(p.error)throw Error(p.error.message);let m=d||[],h=p.data||[],g=new Map(m.map(e=>[e.id,e])),_=new Map(h.map(e=>[e.id,e])),v=[];for(let n of o){let r=g.get(n.product_id);if(!r)continue;let a=i(r.payment_provider)??(r.product_type===`digital`?`freemius`:`stripe`),o=n.variant_id?_.get(n.variant_id):null,l=o&&o.product_id===r.id?o:r,u=e.resolveEffectivePriceForCurrency({prices:e.normalizePriceMap(l.prices),salePrices:e.normalizeSalePriceMap(l.sale_prices),fallbackPrice:l.price,fallbackSalePrice:l.sale_price,saleStartAt:l.sale_start_at,saleEndAt:l.sale_end_at,scheduledPrice:l.scheduled_price,scheduledPrices:e.normalizePriceMap(l.scheduled_prices),scheduledPriceAt:l.scheduled_price_at,currencyCode:c.code,currencies:s}),d=a===`freemius`?1:Math.max(1,Number(n.quantity)||1),f=Math.max(0,u.sale_price??u.price);v.push({key:t.getCartLineCouponKey(n),product_id:r.id,variant_id:o?.id??null,title:r.title,quantity:d,provider:a,subtotal:f*d,freemius_product_id:r.freemius_product_id??null,freemius_plan_id:r.freemius_plan_id??null})}return{lines:v,currencies:s,selectedCurrency:c}}async function s(e,t){let{data:n,error:r}=await e.from(`coupon_products`).select(`product_id`).eq(`coupon_id`,t);if(r)throw Error(r.message);return new Set((n||[]).map(e=>e.product_id))}function c(e,t){let n=e.reduce((e,t)=>e+t.subtotal,0),r=Math.min(t,n);if(n<=0||r<=0)return new Map;let i=new Map,a=0;return e.forEach((t,o)=>{let s=o===e.length-1?r-a:Math.min(t.subtotal,Math.floor(r*t.subtotal/n));a+=s,i.set(t.key,s)}),i}async function l(e){let i=t.normalizeCouponCode(e.code);if(!i)return{success:!1,error:`Enter a coupon code.`,errorKey:`ecommerce.coupon_code_required`};if(!e.items.length)return{success:!1,error:`Add an item to your cart before applying a coupon.`,errorKey:`ecommerce.coupon_cart_empty`};let{data:a,error:l}=await e.client.from(`coupons`).select(`id, code, name, provider_scope, discount_type, discount_amount, is_active, starts_at, ends_at, redemption_limit, redemptions_count`).ilike(`code`,i).maybeSingle();if(l)throw Error(l.message);if(!a)return{success:!1,error:`Coupon code not found.`,errorKey:`ecommerce.coupon_not_found`};let u=a,d=new Date,f=n(u.starts_at),p=n(u.ends_at);if(!u.is_active)return{success:!1,error:`This coupon is not active.`,errorKey:`ecommerce.coupon_inactive`};if(f&&f>d)return{success:!1,error:`This coupon is not active yet.`,errorKey:`ecommerce.coupon_not_started`};if(p&&p<=d)return{success:!1,error:`This coupon has expired.`,errorKey:`ecommerce.coupon_expired`};if(u.redemption_limit!==null&&(u.redemptions_count??0)>=u.redemption_limit)return{success:!1,error:`This coupon has reached its redemption limit.`,errorKey:`ecommerce.coupon_limit_reached`};let[{lines:m},h]=await Promise.all([o({client:e.client,items:e.items,currencyCode:e.currencyCode}),s(e.client,u.id)]),g=h.size>0,_=m.filter(e=>e.subtotal>0&&r(u.provider_scope,e.provider)&&(!g||h.has(e.product_id)));if(_.length===0)return{success:!1,error:`This coupon does not apply to the items in your cart.`,errorKey:`ecommerce.coupon_not_applicable`};let v=u.discount_type===`fixed`?c(_,u.discount_amount):null,y=t.emptyProviderDiscounts(),b=_.map(e=>{let t=u.discount_type===`percent`?Math.min(e.subtotal,Math.round(e.subtotal*u.discount_amount/100)):v?.get(e.key)??0;return y[e.provider]+=t,{key:e.key,product_id:e.product_id,variant_id:e.variant_id,provider:e.provider,title:e.title,quantity:e.quantity,subtotal:e.subtotal,discount:t}});return{success:!0,quote:{couponId:u.id,code:u.code,name:u.name,discountType:u.discount_type,discountAmount:u.discount_amount,providerScope:u.provider_scope,eligibleSubtotal:_.reduce((e,t)=>e+t.subtotal,0),discountTotal:y.stripe+y.freemius,providerDiscounts:y,lineDiscounts:b}}}function u(e){let t=new Map;for(let n of e?.lineDiscounts??[])t.set(n.key,n.discount);return t}async function d(e){let{error:t}=await e.client.from(`coupon_redemptions`).insert({coupon_id:e.quote.couponId,order_id:e.orderId,coupon_code:e.quote.code,provider:e.provider,discount_total:Math.max(0,e.discountTotal),user_id:e.userId||null,customer_email:e.customerEmail||null,metadata:e.metadata||{}});if(t){console.error(`Failed to record coupon redemption:`,t);return}let{data:n}=await e.client.from(`coupons`).select(`redemptions_count`).eq(`id`,e.quote.couponId).single();await e.client.from(`coupons`).update({redemptions_count:(n?.redemptions_count??0)+1,updated_at:new Date().toISOString()}).eq(`id`,e.quote.couponId)}exports.getCouponQuote=l,exports.getQuoteLineDiscountMap=u,exports.recordCouponRedemption=d;
@@ -1,6 +1,6 @@
1
1
  import { getDefaultCurrency as e, normalizeCurrencyRecord as t, normalizePriceMap as n, normalizeSalePriceMap as r, resolveEffectivePriceForCurrency as i } from "./currency.es.js";
2
2
  import { emptyProviderDiscounts as a, getCartLineCouponKey as o, normalizeCouponCode as s } from "./coupons.es.js";
3
- //#region libs/ecommerce/src/lib/coupon-server.ts
3
+ //#region src/lib/coupon-server.ts
4
4
  function c(e) {
5
5
  if (!e) return null;
6
6
  let t = new Date(e);
package/lib/coupons.es.js CHANGED
@@ -1,4 +1,4 @@
1
- //#region libs/ecommerce/src/lib/coupons.ts
1
+ //#region src/lib/coupons.ts
2
2
  function e(e) {
3
3
  return (e || "").trim().replace(/\s+/g, "").toUpperCase();
4
4
  }
@@ -1,4 +1,4 @@
1
- //#region libs/ecommerce/src/lib/currency-constants.ts
1
+ //#region src/lib/currency-constants.ts
2
2
  var e = "NEXTBLOCK_CURRENCY";
3
3
  //#endregion
4
4
  export { e as CURRENCY_COOKIE_NAME };
@@ -1,4 +1,4 @@
1
- //#region libs/ecommerce/src/lib/currency-rest-client.ts
1
+ //#region src/lib/currency-rest-client.ts
2
2
  async function e() {
3
3
  let e = process.env.NEXT_PUBLIC_SUPABASE_URL || process.env.SUPABASE_URL, t = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || process.env.SUPABASE_ANON_KEY || process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY || process.env.SUPABASE_PUBLISHABLE_KEY;
4
4
  if (!e || !t) return [];
@@ -1,7 +1,7 @@
1
1
  import { create as e } from "zustand";
2
2
  import { createJSONStorage as t, persist as n } from "zustand/middleware";
3
3
  import { normalizeCurrencyCode as r } from "@nextblock-cms/utils";
4
- //#region libs/ecommerce/src/lib/currency-store.ts
4
+ //#region src/lib/currency-store.ts
5
5
  var i = e()(n((e) => ({
6
6
  activeCurrencyCode: null,
7
7
  hasHydrated: !1,
@@ -0,0 +1 @@
1
+ const e=require("./currency.cjs");let t=require("@nextblock-cms/utils"),n=require("@nextblock-cms/db/server");require("server-only");var r=`https://api.frankfurter.dev`,i=`id, code, symbol, exchange_rate, is_default, is_active, auto_update_exchange_rate, auto_sync_product_prices, exchange_rate_source, exchange_rate_updated_at, updated_at, rounding_mode, rounding_increment, rounding_charm_amount`;function a(e){if(!e.id)throw Error(`Currency ${(0,t.normalizeCurrencyCode)(e.code)} is missing its ID.`);return e.id}function o(){return process.env.FX_API_BASE_URL?.trim().replace(/\/+$/,``)||r}function s(e){try{let t=new URL(e),n=t.pathname.replace(/\/+$/,``);return`${t.host}${n&&n!==`/`?n:``}`}catch{return e}}function c(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.base==`string`&&typeof t.date==`string`&&typeof t.quote==`string`&&typeof t.rate==`number`&&Number.isFinite(t.rate)&&t.rate>0}function l(e){return Array.isArray(e)&&e.every(c)}async function u(){let e=(0,n.getServiceRoleSupabaseClient)(),{data:t,error:r}=await e.from(`currencies`).select(i).order(`code`,{ascending:!0});if(r)throw Error(r.message);return{supabase:e,currencies:t||[]}}async function d(e){let n=(0,t.normalizeCurrencyCode)(e.newDefaultCurrencyCode),r=Number(e.previousBaseRate);if(!Number.isFinite(r)||r<=0)throw Error(`Cannot rebase exchange rates without a valid previous base rate.`);let{supabase:i,currencies:o}=await u();if(!o.find(e=>(0,t.normalizeCurrencyCode)(e.code)===n))throw Error(`Currency ${n} was not found for rebasing.`);let s=new Date().toISOString(),c=[],l=o.map(e=>{let i=a(e),o=(0,t.normalizeCurrencyCode)(e.code),l=o===n?1:Number((e.exchange_rate/r).toFixed(10));return c.push(o),{...e,id:i,exchange_rate:l,auto_update_exchange_rate:o!==n&&e.auto_update_exchange_rate,exchange_rate_source:o===n?`store-default`:e.exchange_rate_source||`rebased-default`,exchange_rate_updated_at:s,updated_at:s}}),{error:d}=await i.from(`currencies`).upsert(l,{onConflict:`id`});if(d)throw Error(d.message);return{rebasedAt:s,newDefaultCurrencyCode:n,updatedCurrencies:c}}async function f(){let{supabase:n,currencies:r}=await u();if(!r.length)throw Error(`No currencies are configured yet.`);let i=r.map(t=>e.normalizeCurrencyRecord(t)),c=e.getDefaultCurrency(i),d=(0,t.normalizeCurrencyCode)(c.code),f=r.find(e=>(0,t.normalizeCurrencyCode)(e.code)===d);if(!f)throw Error(`Default currency ${d} could not be found for syncing.`);let p=r.filter(e=>(0,t.normalizeCurrencyCode)(e.code)!==d&&e.auto_update_exchange_rate!==!1),m=o(),h=s(m),g=new Date().toISOString(),{error:_}=await n.from(`currencies`).upsert({...f,id:a(f),exchange_rate:1,auto_update_exchange_rate:!1,exchange_rate_source:`store-default`,exchange_rate_updated_at:g,updated_at:g},{onConflict:`id`});if(_)throw Error(_.message);if(!p.length)return{baseCurrencyCode:d,fetchedAt:g,provider:h,providerUrl:m,skippedCurrencies:[],updatedCurrencies:[]};let v=new URL(`${m}/v2/rates`);v.searchParams.set(`base`,d),v.searchParams.set(`quotes`,[...new Set(p.map(e=>(0,t.normalizeCurrencyCode)(e.code)))].join(`,`));let y=await fetch(v.toString(),{cache:`no-store`,headers:{Accept:`application/json`}});if(!y.ok){let e=await y.text();throw Error(`FX provider request failed (${y.status}): ${e||`Unexpected response body.`}`)}let b=await y.json();if(!l(b))throw Error(`FX provider returned an unexpected response payload.`);let x=new Map;for(let e of b)x.set((0,t.normalizeCurrencyCode)(e.quote),e.rate);let S=[],C=[],w=[];for(let e of p){let n=(0,t.normalizeCurrencyCode)(e.code),r=x.get(n);if(!r||!Number.isFinite(r)||r<=0){C.push(n);continue}w.push({...e,id:a(e),exchange_rate:Number(r.toFixed(10)),exchange_rate_source:h,exchange_rate_updated_at:g,updated_at:g}),S.push(n)}if(w.length){let{error:e}=await n.from(`currencies`).upsert(w,{onConflict:`id`});if(e)throw Error(e.message)}return{baseCurrencyCode:d,fetchedAt:g,provider:h,providerUrl:m,skippedCurrencies:C,updatedCurrencies:S}}async function p(e){let r=(0,t.normalizeCurrencyCode)(e),{error:i}=await(0,n.getServiceRoleSupabaseClient)().rpc(`clear_currency_price_overrides`,{target_currency:r});if(i)throw Error(i.message);return{currencyCode:r}}exports.clearAutoSyncedCurrencyPriceOverrides=p,exports.rebaseStoreCurrencyExchangeRates=d,exports.syncStoreCurrencyRates=f;
@@ -2,7 +2,7 @@ import { getDefaultCurrency as e, normalizeCurrencyRecord as t } from "./currenc
2
2
  import { normalizeCurrencyCode as n } from "@nextblock-cms/utils";
3
3
  import { getServiceRoleSupabaseClient as r } from "@nextblock-cms/db/server";
4
4
  import "server-only";
5
- //#region libs/ecommerce/src/lib/currency-sync.ts
5
+ //#region src/lib/currency-sync.ts
6
6
  var i = "https://api.frankfurter.dev", a = "id, code, symbol, exchange_rate, is_default, is_active, auto_update_exchange_rate, auto_sync_product_prices, exchange_rate_source, exchange_rate_updated_at, updated_at, rounding_mode, rounding_increment, rounding_charm_amount";
7
7
  function o(e) {
8
8
  if (!e.id) throw Error(`Currency ${n(e.code)} is missing its ID.`);
@@ -1,5 +1,5 @@
1
1
  import { formatPrice as e, getCurrencyMinorUnitFactor as t, majorUnitAmountToMinor as n, minorUnitAmountToMajor as r, normalizeCurrencyCode as i } from "@nextblock-cms/utils";
2
- //#region libs/ecommerce/src/lib/currency.ts
2
+ //#region src/lib/currency.ts
3
3
  var a = [
4
4
  "none",
5
5
  "nearest",
@@ -0,0 +1 @@
1
+ const e=require("./customer.cjs");let t=require("@nextblock-cms/db/server");function n(e){return e?.trim()||null}function r(t){return t?e.normalizeCustomerAddress({company_name:t.company_name,recipient_name:t.recipient_name,line1:t.line1,line2:t.line2,city:t.city,state:t.state,postal_code:t.postal_code,country_code:t.country_code}):null}function i(e,t){return e?.find(e=>e.address_type===t&&e.is_default)??e?.find(e=>e.address_type===t)??null}async function a(t,n,r,i){let a=e.normalizeCustomerAddress(i),{data:o,error:s}=await t.from(`user_addresses`).select(`*`).eq(`user_id`,n).eq(`address_type`,r).order(`is_default`,{ascending:!1}).order(`updated_at`,{ascending:!1});if(s)throw Error(s.message);let c=o?.[0]??null,l=(o??[]).slice(1).map(e=>e.id);if(!a){if(o?.length){let e=o.map(e=>e.id),{error:n}=await t.from(`user_addresses`).delete().in(`id`,e);if(n)throw Error(n.message)}return}let u={user_id:n,address_type:r,is_default:!0,company_name:a.company_name??null,recipient_name:a.recipient_name??null,line1:a.line1??null,line2:a.line2??null,city:a.city??null,state:a.state??null,postal_code:a.postal_code??null,country_code:a.country_code??null,updated_at:new Date().toISOString()};if(c){let{error:e}=await t.from(`user_addresses`).update(u).eq(`id`,c.id);if(e)throw Error(e.message)}else{let{error:e}=await t.from(`user_addresses`).insert(u);if(e)throw Error(e.message)}if(l.length){let{error:e}=await t.from(`user_addresses`).delete().in(`id`,l);if(e)throw Error(e.message)}}async function o(e,n){let{data:a,error:o}=await(n??(0,t.createClient)()).from(`user_addresses`).select(`*`).eq(`user_id`,e).in(`address_type`,[`billing`,`shipping`]).order(`is_default`,{ascending:!1}).order(`updated_at`,{ascending:!1});if(o)throw Error(o.message);return{billingAddress:r(i(a??[],`billing`)),shippingAddress:r(i(a??[],`shipping`))}}async function s(e){let n=e.client??(0,t.createClient)();await a(n,e.userId,`billing`,e.billingAddress??null),await a(n,e.userId,`shipping`,e.shippingAddress??null)}async function c(e){let r=e.client??(0,t.createClient)(),i=n(e.fullName),a=n(e.phone);if(!i&&!a)return;let{data:o,error:s}=await r.from(`profiles`).select(`full_name, phone`).eq(`id`,e.userId).maybeSingle();if(s)throw Error(s.message);if(!o)return;let c=n(o.full_name)||i,l=n(o.phone)||a;if(n(o.full_name)===c&&n(o.phone)===l)return;let{error:u}=await r.from(`profiles`).update({full_name:c,phone:l,updated_at:new Date().toISOString()}).eq(`id`,e.userId);if(u)throw Error(u.message)}exports.fillMissingUserProfileCheckoutDetails=c,exports.getDefaultUserAddresses=o,exports.upsertDefaultUserAddresses=s;
@@ -1,6 +1,6 @@
1
1
  import { normalizeCustomerAddress as e } from "./customer.es.js";
2
2
  import { createClient as t } from "@nextblock-cms/db/server";
3
- //#region libs/ecommerce/src/lib/customer-addresses.ts
3
+ //#region src/lib/customer-addresses.ts
4
4
  function n(e) {
5
5
  return e?.trim() || null;
6
6
  }
@@ -0,0 +1 @@
1
+ const e=require("./invoice-server.cjs"),t=require("./freemius-license.cjs");let n=require("@nextblock-cms/db/server");var r=[`pending`];function i(e){return e??(0,n.createClient)()}async function a(e){let{data:{user:t},error:n}=await e.auth.getUser();if(n||!t)throw Error(`Unauthorized`);return t}async function o(e){let t=i(e),n=await a(t),{data:o,error:s}=await t.from(`orders`).select(`id, invoice_number, paid_at, created_at, currency, status, provider, subtotal, shipping_total, tax_total, total`).eq(`user_id`,n.id).not(`status`,`in`,`(${r.join(`,`)})`).order(`created_at`,{ascending:!1});if(s)throw Error(s.message);return o??[]}async function s(e,t){let n=i(t),o=await a(n),{data:s,error:c}=await n.from(`orders`).select(`id, invoice_number, paid_at, created_at, currency, status, provider, subtotal, shipping_total, tax_total, total`).eq(`id`,e).eq(`user_id`,o.id).not(`status`,`in`,`(${r.join(`,`)})`).maybeSingle();if(c)throw Error(c.message);return s??null}async function c(n,r){let a=i(r),o=await s(n,a);return o?{order:o,invoice:o.invoice_number?await e.getInvoicePresentationData(n,a):null,license:o.provider===`freemius`?await t.getFreemiusOrderLicense({orderId:n,client:a}):null}:null}exports.getCurrentCustomerOrder=s,exports.getCurrentCustomerOrderInvoice=c,exports.getCurrentCustomerOrders=o;
@@ -1,7 +1,7 @@
1
1
  import { getInvoicePresentationData as e } from "./invoice-server.es.js";
2
2
  import { getFreemiusOrderLicense as t } from "./freemius-license.es.js";
3
3
  import { createClient as n } from "@nextblock-cms/db/server";
4
- //#region libs/ecommerce/src/lib/customer-orders.ts
4
+ //#region src/lib/customer-orders.ts
5
5
  var r = ["pending"];
6
6
  function i(e) {
7
7
  return e ?? n();
@@ -0,0 +1 @@
1
+ const e=require("./countries.cjs"),t=require("./states.cjs");var n=()=>({company_name:``,recipient_name:``,line1:``,line2:``,city:``,state:``,postal_code:``,country_code:`CA`});function r(e){return e?.trim()||null}function i(n){if(!n)return null;let i={company_name:r(n.company_name),recipient_name:r(n.recipient_name),line1:r(n.line1),line2:r(n.line2),city:r(n.city),postal_code:r(n.postal_code),country_code:e.normalizeCountryCode(n.country_code)};return i.state=t.normalizeSubdivisionCode(i.country_code,r(n.state)),Object.values(i).some(Boolean)?i:null}function a(e){let n=i(e);return n?!!(n.recipient_name&&n.line1&&n.city&&n.postal_code&&n.country_code&&(!t.countryUsesStructuredStates(n.country_code)||n.state)):!1}function o(e){let t=i(e.billing),n=i(e.shipping),a=r(e.email)?.toLowerCase()??null,o=r(e.phone);return{email:a,name:r(e.name)??t?.recipient_name??n?.recipient_name??null,phone:o,billing:t,shipping:n}}function s(e,t){let n=i(e),r=i(t);return JSON.stringify(n)===JSON.stringify(r)}exports.addressesMatch=s,exports.emptyCustomerAddress=n,exports.isCustomerAddressComplete=a,exports.normalizeCustomerAddress=i,exports.normalizeOrderCustomerDetails=o;
@@ -1,6 +1,6 @@
1
1
  import { normalizeCountryCode as e } from "./countries.es.js";
2
2
  import { countryUsesStructuredStates as t, normalizeSubdivisionCode as n } from "./states.es.js";
3
- //#region libs/ecommerce/src/lib/customer.ts
3
+ //#region src/lib/customer.ts
4
4
  var r = () => ({
5
5
  company_name: "",
6
6
  recipient_name: "",
@@ -0,0 +1 @@
1
+ const e=require("../_virtual/_rolldown/runtime.cjs");let t=require("papaparse");t=e.__toESM(t,1);function n(e,n){let r=t.default.unparse(e),i=new Blob([r],{type:`text/csv;charset=utf-8;`}),a=document.createElement(`a`);if(a.download!==void 0){let e=URL.createObjectURL(i);a.setAttribute(`href`,e),a.setAttribute(`download`,n),a.style.visibility=`hidden`,document.body.appendChild(a),a.click(),document.body.removeChild(a)}}function r(e){return e.map(e=>({"Order ID":e.id,Date:new Date(e.created_at).toLocaleDateString(),"Customer Name":e.customer?.full_name||e.customer_details?.name||`Guest`,"Customer Email":e.customer?.email||e.customer_details?.email||`N/A`,Subtotal:(e.subtotal/100).toFixed(2),"Tax Amount":(e.tax_total/100).toFixed(2),"Shipping Amount":(e.shipping_total/100).toFixed(2),Total:(e.total/100).toFixed(2),Currency:e.currency.toUpperCase(),"Payment Status":e.status,"Fulfillment Status":e.status===`shipped`?`Shipped`:e.status===`paid`?`Paid`:e.status===`trial`?`Trial`:`Pending`,"Payment Gateway":e.provider===`freemius`?`Freemius`:`Stripe`}))}function i(e){return e.filter(e=>e.status===`paid`).map(e=>{let t=e.customer_details?.shipping||e.customer_details?.billing,n=t?.country_code||`N/A`,r=t?.state||`N/A`,i=e.tax_details?.lines?.[0]?.rate?.display_name||`N/A`,a=e.tax_details?.lines?.[0]?.rate?.percentage||0;return{Date:e.paid_at?new Date(e.paid_at).toLocaleDateString():new Date(e.created_at).toLocaleDateString(),"Order ID":e.id,Destination:`${r}, ${n}`,"Tax Rate Applied":`${a}% (${i})`,"Total Taxable Amount":(e.subtotal/100).toFixed(2),"Tax Collected":(e.tax_total/100).toFixed(2),Currency:e.currency.toUpperCase()}})}function a(e){let t={};return e.filter(e=>e.status===`paid`).forEach(e=>{let n=e.currency.toUpperCase();t[n]||(t[n]={volume:0,subtotal:0,tax:0}),t[n].volume+=e.total,t[n].subtotal+=e.subtotal,t[n].tax+=e.tax_total}),Object.entries(t).map(([e,t])=>({Currency:e,"Total Transaction Volume":(t.volume/100).toFixed(2),"Total Subtotal":(t.subtotal/100).toFixed(2),"Total Tax Collected":(t.tax/100).toFixed(2)}))}exports.generateCSV=n,exports.mapGeneralSalesLedger=r,exports.mapMultiCurrencyRevenue=a,exports.mapTaxLiabilitySummary=i;
@@ -1,5 +1,5 @@
1
1
  import e from "papaparse";
2
- //#region libs/ecommerce/src/lib/export-helpers.ts
2
+ //#region src/lib/export-helpers.ts
3
3
  function t(t, n) {
4
4
  let r = e.unparse(t), i = new Blob([r], { type: "text/csv;charset=utf-8;" }), a = document.createElement("a");
5
5
  if (a.download !== void 0) {
@@ -0,0 +1 @@
1
+ const e=require("./providers/freemius.cjs"),t=require("./providers/stripe.cjs");function n(n){switch(n){case`freemius`:return new e.FreemiusProvider;default:return new t.StripeProvider}}exports.getPaymentProvider=n;
package/lib/factory.es.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { FreemiusProvider as e } from "./providers/freemius.es.js";
2
2
  import { StripeProvider as t } from "./providers/stripe.es.js";
3
- //#region libs/ecommerce/src/lib/factory.ts
3
+ //#region src/lib/factory.ts
4
4
  function n(n) {
5
5
  switch (n) {
6
6
  case "freemius": return new e();
@@ -0,0 +1 @@
1
+ const e=require("./payment-config.cjs"),t=require("./providers/freemius.cjs");let n=require("@nextblock-cms/utils");function r(e){if(!e)return null;let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toISOString().replace(`T`,` `).replace(/\.\d{3}Z$/,``)}function i(e){return e===`percent`?`percentage`:`dollar`}function a(e){return t.resolveFreemiusCheckoutCredentials(e).apiKey||t.readFreemiusEnvValue(`FREEMIUS_API_KEY`)}async function o(t){await e.hydrateFreemiusEnvFromDb();let n=a(t.productId);if(!n)throw Error(`Missing Freemius API bearer token for product ${t.productId}. Set FREEMIUS_API_KEY or FREEMIUS_CHECKOUT_PRODUCTS_JSON[${t.productId}].apiKey.`);let r=t.couponId?`/${t.couponId}`:``,i=await fetch(`https://api.freemius.com/v1/products/${t.productId}/coupons${r}.json`,{method:t.method,headers:{Authorization:`Bearer ${n}`,"Content-Type":`application/json`,Accept:`application/json`},body:t.method===`DELETE`?void 0:JSON.stringify(t.body||{})}),o=await i.text(),s=o?JSON.parse(o):null;if(!i.ok)throw Error(s?.message||s?.error?.message||`Freemius coupon request failed with ${i.status}`);return s}function s(e,t){return{code:e.code,discount:e.discount_type===`fixed`?(0,n.minorUnitAmountToMajor)(e.discount_amount,`USD`):e.discount_amount,discount_type:i(e.discount_type),plans:t.planIds.length>0?t.planIds.join(`,`):null,licenses:null,billing_cycles:null,start_date:r(e.starts_at),end_date:r(e.ends_at),redemptions_limit:e.redemption_limit??null,has_renewals_discount:!1,has_addons_discount:!1,is_one_per_user:!1,is_active:e.is_active,user_type:`all`}}async function c(e,t){if(t.provider_scope===`stripe`)return[];let{data:n,error:r}=await e.from(`coupon_products`).select(`product_id`).eq(`coupon_id`,t.id);if(r)throw Error(r.message);let i=(n||[]).map(e=>e.product_id),a=e.from(`products`).select(`id, freemius_product_id, freemius_plan_id`).eq(`payment_provider`,`freemius`).not(`freemius_product_id`,`is`,null);i.length>0&&(a=a.in(`id`,i));let{data:o,error:s}=await a;if(s)throw Error(s.message);let c=new Map;for(let e of o||[]){let t=String(e.freemius_product_id||``).trim();if(!t)continue;let n=c.get(t)??{freemiusProductId:t,productId:e.id,planIds:[]};i.length>0&&e.freemius_plan_id&&n.planIds.push(String(e.freemius_plan_id)),c.set(t,n)}return[...c.values()].map(e=>({...e,planIds:[...new Set(e.planIds)]}))}async function l(e,t){let{data:n}=await e.from(`coupon_freemius_mappings`).select(`sync_status, sync_error`).eq(`coupon_id`,t),r=n||[];if(r.length===0){await e.from(`coupons`).update({freemius_sync_status:`not_required`,freemius_sync_error:null}).eq(`id`,t);return}let i=r.find(e=>e.sync_status===`failed`);await e.from(`coupons`).update({freemius_sync_status:i?`failed`:`synced`,freemius_sync_error:i?.sync_error??null}).eq(`id`,t)}async function u(e){let{data:t,error:n}=await e.client.from(`coupons`).select(`id, code, name, internal_note, provider_scope, discount_type, discount_amount, is_active, starts_at, ends_at, redemption_limit`).eq(`id`,e.couponId).single();if(n||!t)return{success:!1,error:n?.message||`Coupon not found`};let r=t,i=await c(e.client,r);await e.client.from(`coupons`).update({freemius_sync_status:i.length>0?`pending`:`not_required`,freemius_sync_error:null}).eq(`id`,r.id);for(let t of i){let{data:n}=await e.client.from(`coupon_freemius_mappings`).select(`id, freemius_coupon_id`).eq(`coupon_id`,r.id).eq(`freemius_product_id`,t.freemiusProductId).maybeSingle(),i=s(r,t);try{let a=await o({productId:t.freemiusProductId,method:n?.freemius_coupon_id?`PUT`:`POST`,couponId:n?.freemius_coupon_id??null,body:i}),s=a?.coupon??a;await e.client.from(`coupon_freemius_mappings`).upsert({id:n?.id,coupon_id:r.id,product_id:t.productId,freemius_product_id:t.freemiusProductId,freemius_coupon_id:s?.id?String(s.id):n?.freemius_coupon_id??null,freemius_coupon_code:r.code,sync_status:`synced`,sync_error:null,remote_payload:a,last_synced_at:new Date().toISOString()},{onConflict:`coupon_id,freemius_product_id`})}catch(i){await e.client.from(`coupon_freemius_mappings`).upsert({id:n?.id,coupon_id:r.id,product_id:t.productId,freemius_product_id:t.freemiusProductId,freemius_coupon_id:n?.freemius_coupon_id??null,freemius_coupon_code:r.code,sync_status:`failed`,sync_error:i.message||`Freemius sync failed`,last_synced_at:new Date().toISOString()},{onConflict:`coupon_id,freemius_product_id`})}}return await l(e.client,r.id),{success:!0,targetCount:i.length}}function d(e){let t=(e.sku||``).toUpperCase().replace(/[^A-Z0-9]/g,``);return t?`SALE${t}`.slice(0,32):`SALE${e.productId.replace(/[^A-Za-z0-9]/g,``).toUpperCase()}`.slice(0,32)}function f(e,t){if(typeof e!=`number`||e<=0||typeof t!=`number`||t<0||t>=e)return null;let n=Math.round((1-t/e)*100);return n<=0||n>100?null:n}async function p(e){let{data:t,error:n}=await e.client.from(`products`).select(`id, sku, price, sale_price, sale_start_at, sale_end_at, payment_provider, freemius_product_id, freemius_plan_id`).eq(`id`,e.productId).maybeSingle();if(n||!t)return{success:!1,error:n?.message||`Product not found`};let r=t,i=String(r.freemius_product_id||``).trim();if(r.payment_provider!==`freemius`||!i)return{success:!0,skipped:!0,reason:`not_a_freemius_product`};let a=f(r.price,r.sale_price),c=a!==null,{data:l}=await e.client.from(`product_freemius_sale_coupons`).select(`id, freemius_coupon_id, freemius_coupon_code, discount_percent, is_active`).eq(`product_id`,r.id).maybeSingle();if(!c&&!l?.freemius_coupon_id)return l?.id&&await e.client.from(`product_freemius_sale_coupons`).update({is_active:!1,updated_at:new Date().toISOString()}).eq(`id`,l.id),{success:!0,active:!1};let u=l?.freemius_coupon_code||d({sku:r.sku,productId:r.id}),p=r.freemius_plan_id?[String(r.freemius_plan_id)]:[],m=a??l?.discount_percent??1,h=s({id:r.id,code:u,name:`Scheduled sale ${r.sku||r.id}`,provider_scope:`freemius`,discount_type:`percent`,discount_amount:m,is_active:c,starts_at:r.sale_start_at,ends_at:r.sale_end_at,redemption_limit:null},{freemiusProductId:i,productId:r.id,planIds:p});try{let t=await o({productId:i,method:l?.freemius_coupon_id?`PUT`:`POST`,couponId:l?.freemius_coupon_id??null,body:h}),n=t?.coupon??t;return await e.client.from(`product_freemius_sale_coupons`).upsert({id:l?.id,product_id:r.id,freemius_product_id:i,freemius_plan_id:r.freemius_plan_id?String(r.freemius_plan_id):null,freemius_coupon_id:n?.id?String(n.id):l?.freemius_coupon_id??null,freemius_coupon_code:u,discount_percent:a,starts_at:r.sale_start_at,ends_at:r.sale_end_at,is_active:c,sync_status:`synced`,sync_error:null,remote_payload:t,last_synced_at:new Date().toISOString()},{onConflict:`product_id`}),{success:!0,active:c,code:u}}catch(t){return await e.client.from(`product_freemius_sale_coupons`).upsert({id:l?.id,product_id:r.id,freemius_product_id:i,freemius_plan_id:r.freemius_plan_id?String(r.freemius_plan_id):null,freemius_coupon_id:l?.freemius_coupon_id??null,freemius_coupon_code:u,discount_percent:a,starts_at:r.sale_start_at,ends_at:r.sale_end_at,is_active:c,sync_status:`failed`,sync_error:t.message||`Freemius sale coupon sync failed`,last_synced_at:new Date().toISOString()},{onConflict:`product_id`}),{success:!1,error:t.message||`Freemius sale coupon sync failed`}}}async function m(e){let{data:t}=await e.client.from(`coupon_freemius_mappings`).select(`id, freemius_product_id, freemius_coupon_id`).eq(`coupon_id`,e.couponId).not(`freemius_coupon_id`,`is`,null);for(let n of t||[])try{await o({productId:n.freemius_product_id,couponId:n.freemius_coupon_id,method:`DELETE`}),await e.client.from(`coupon_freemius_mappings`).update({sync_status:`deleted`,sync_error:null,updated_at:new Date().toISOString()}).eq(`id`,n.id)}catch(t){await e.client.from(`coupon_freemius_mappings`).update({sync_status:`failed`,sync_error:t.message||`Freemius delete failed`,updated_at:new Date().toISOString()}).eq(`id`,n.id)}}exports.deleteCouponFromFreemius=m,exports.syncCouponToFreemius=u,exports.syncProductSaleCouponToFreemius=p;
@@ -1,7 +1,7 @@
1
1
  import { hydrateFreemiusEnvFromDb as e } from "./payment-config.es.js";
2
2
  import { readFreemiusEnvValue as t, resolveFreemiusCheckoutCredentials as n } from "./providers/freemius.es.js";
3
3
  import { minorUnitAmountToMajor as r } from "@nextblock-cms/utils";
4
- //#region libs/ecommerce/src/lib/freemius-coupons.ts
4
+ //#region src/lib/freemius-coupons.ts
5
5
  function i(e) {
6
6
  if (!e) return null;
7
7
  let t = new Date(e);
@@ -0,0 +1 @@
1
+ const e=require("./payment-config.cjs"),t=require("./providers/freemius.cjs");let n=require("@freemius/sdk");var r=20,i=`This license cannot be claimed automatically. Use the key from your purchase email.`;function a(e){if(!e||typeof e!=`string`)return null;let t=e.trim(),n=/(?:z|[+-]\d{2}:?\d{2})$/i.test(t)?t:`${t.replace(` `,`T`)}Z`,r=Date.parse(n);return Number.isFinite(r)?r:null}function o(e,t){return e==null||t==null?!1:String(e).trim()===String(t).trim()}function s(e){return(e??``).trim().toLowerCase()}function c(e){let{license:t,request:n,user:r}=e,i=e.maxAgeMinutes??20,c=(e.now??new Date).getTime();if(!t||!o(t.id,n.licenseId))return{ok:!1,reason:`license_not_found`};let l=a(t.created);return l===null||c-l>i*6e4||l-c>3e5?{ok:!1,reason:`too_old`}:o(t.plugin_id,n.productId)?t.is_cancelled?{ok:!1,reason:`cancelled`}:!n.userId?.trim()||!o(t.user_id,n.userId)?{ok:!1,reason:`user_mismatch`}:!r||!s(n.email)||s(r.email)!==s(n.email)?{ok:!1,reason:`email_mismatch`}:typeof t.activated==`number`&&t.activated>0?{ok:!1,reason:`already_activated`}:t.secret_key?{ok:!0}:{ok:!1,reason:`no_key`}:{ok:!1,reason:`product_mismatch`}}async function l(r,a){await e.hydrateFreemiusEnvFromDb();let o=t.resolveFreemiusCheckoutCredentials(r.productId);if(!o.apiKey||!o.secretKey||!o.publicKey)return{error:`The license service is not configured for this product.`,ok:!1,reason:`not_configured`,status:503};let s=new n.Freemius({apiKey:o.apiKey,productId:Number(r.productId),publicKey:o.publicKey,secretKey:o.secretKey}),l=null,u=null;try{l=await s.api.license.retrieve(r.licenseId),l?.user_id!==null&&l?.user_id!==void 0&&(u=await s.api.user.retrieve(String(l.user_id)))}catch(e){return console.error(`[Freemius License Claim] Freemius lookup failed:`,e),{error:`Freemius could not be reached to verify the license.`,ok:!1,reason:`upstream_error`,status:502}}let d=c({license:l,maxAgeMinutes:a?.maxAgeMinutes,now:a?.now,request:r,user:u});return d.ok?{expiration:l?.expiration??null,licenseKey:String(l?.secret_key),ok:!0,planId:l?.plan_id!==null&&l?.plan_id!==void 0?String(l.plan_id):null}:{error:i,ok:!1,reason:d.reason,status:403}}exports.FREEMIUS_LICENSE_CLAIM_MAX_AGE_MINUTES=r,exports.FREEMIUS_LICENSE_CLAIM_REFUSED_MESSAGE=i,exports.claimFreemiusLicenseKey=l,exports.evaluateFreemiusLicenseClaim=c,exports.parseFreemiusTimestamp=a;
@@ -1,7 +1,7 @@
1
1
  import { hydrateFreemiusEnvFromDb as e } from "./payment-config.es.js";
2
2
  import { resolveFreemiusCheckoutCredentials as t } from "./providers/freemius.es.js";
3
3
  import { Freemius as n } from "@freemius/sdk";
4
- //#region libs/ecommerce/src/lib/freemius-license-claim.ts
4
+ //#region src/lib/freemius-license-claim.ts
5
5
  var r = 20, i = "This license cannot be claimed automatically. Use the key from your purchase email.";
6
6
  function a(e) {
7
7
  if (!e || typeof e != "string") return null;
@@ -0,0 +1 @@
1
+ const e=require("./payment-config.cjs"),t=require("./providers/freemius.cjs");let n=require("@freemius/sdk");async function r(e,r){if(!e)return null;let i=t.resolveFreemiusCheckoutCredentials(e);return!i.apiKey||!i.secretKey||!i.publicKey?null:new n.Freemius({productId:Number(e),apiKey:i.apiKey,secretKey:i.secretKey,publicKey:i.publicKey}).api.license.retrieve(r)}async function i(t){let{data:n,error:i}=await t.client.from(`orders`).select(`id, provider, freemius_product_id, freemius_license_id, freemius_trial_ends_at`).eq(`id`,t.orderId).maybeSingle();if(i||!n||n.provider!==`freemius`||!n.freemius_license_id)return null;let a=null;try{await e.hydrateFreemiusEnvFromDb(),a=await r(n.freemius_product_id,String(n.freemius_license_id))}catch(e){console.error(`[Freemius License] Failed to retrieve license key:`,e)}return{licenseId:String(n.freemius_license_id),licenseKey:a?.secret_key??null,planId:a?.plan_id==null?null:String(a.plan_id),expiration:a?.expiration??null,trialEndsAt:n.freemius_trial_ends_at??null,isCancelled:!!a?.is_cancelled}}exports.getFreemiusOrderLicense=i;
@@ -1,7 +1,7 @@
1
1
  import { hydrateFreemiusEnvFromDb as e } from "./payment-config.es.js";
2
2
  import { resolveFreemiusCheckoutCredentials as t } from "./providers/freemius.es.js";
3
3
  import { Freemius as n } from "@freemius/sdk";
4
- //#region libs/ecommerce/src/lib/freemius-license.ts
4
+ //#region src/lib/freemius-license.ts
5
5
  async function r(e, r) {
6
6
  if (!e) return null;
7
7
  let i = t(e);
@@ -0,0 +1 @@
1
+ const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("./providers/freemius.cjs"),n=require("./order-inventory.cjs"),r=require("./invoice-server.cjs");let i=require("@supabase/supabase-js"),a=require("crypto");a=e.__toESM(a,1);let o=require("@freemius/sdk");function s(e){return e==null||e===``?null:String(e)}function c(e){let t=s(e);if(!t)return null;let n=t.includes(`T`)?t:t.replace(` `,`T`)+`Z`,r=new Date(n);return Number.isNaN(r.getTime())?t:r.toISOString()}function l(e){if(e==null||e===``)return null;let t=Number(e);return Number.isFinite(t)?t:null}function u(...e){return e.some(e=>{let t=l(e);return t!==null&&t>0})}function d(e){return e===`pending`||e===`trial`}function f(e){return[`license.cancelled`,`license.deleted`,`license.expired`,`subscription.cancelled`,`subscription.renewal.failed.last`,`trial.cancelled`,`trial.expired`].includes(e||``)}function p(e,t){return e===`license.extended`&&(t?.is_renewal===!0||t?.is_renewal===1||t?.is_renewal===`1`||t?.is_renewal===`true`)}function m(e){let t=e.objects?.payment??e.data?.payment??e.data;return e.type===`payment.created`&&u(t?.gross,t?.total_gross,t?.amount,t?.initial_amount)}function h(e){let t=e?.purchase??null,n=e?.trial??null;return{freemius_product_id:s(t?.plugin_id)??s(t?.product_id)??s(t?.productId)??s(n?.plugin_id)??s(n?.product_id)??s(n?.productId),freemius_plan_id:s(t?.plan_id)??s(t?.planId),freemius_license_id:s(t?.license_id)??s(t?.licenseId)??s(n?.license_id)??s(n?.licenseId),freemius_subscription_id:s(t?.subscription_id)??s(t?.subscriptionId)??s(n?.subscription_id)??s(n?.subscriptionId),freemius_trial_id:s(n?.id),freemius_user_id:s(t?.user_id)??s(t?.userId)??s(n?.user_id)??s(n?.userId)??s(e?.user?.id),freemius_trial_ends_at:c(n?.trial_ends_at)??c(n?.trialEndsAt)??c(t?.trial_ends)??c(t?.trialEnds)}}function g(e,t=`pending`){let n=e?.purchase??null,r=e?.trial??null;return t===`paid`?`paid`:r&&(r.canceled_at||r.canceledAt)&&d(t)?`cancelled`:r?`trial`:n?(n.canceled_at||n.canceledAt)&&d(t)?`cancelled`:u(n.initial_amount,n.initialAmount,n.gross,n.total_gross,n.totalGross)?`paid`:n.trial_ends||n.trialEnds||n.subscription_id||n.subscriptionId?`trial`:t:t}function _(e){let{event:t,currentStatus:n,purchaseData:r}=e;return n===`paid`&&f(t.type)?`paid`:f(t.type)?d(n)?`cancelled`:n:m(t)||p(t.type,t.data)||r&&u(r.initialAmount,r.initial_amount,r.gross,r.totalGross,r.total_gross)?`paid`:r?.canceled===!0&&d(n)?`cancelled`:n===`pending`&&(r?.trialEndsAt||r?.trial_ends_at||r?.trialEnds||r?.trial_ends)||(r?.subscriptionId||r?.subscription_id||t.type===`subscription.created`||t.type===`license.created`)&&n===`pending`?`trial`:n}function v(e,...t){let n=t.filter(e=>!!e);return e===`paid`||n.includes(`paid`)?`paid`:n.includes(`cancelled`)?`cancelled`:n.includes(`trial`)?`trial`:n.includes(`shipped`)?`shipped`:n.includes(`refunded`)?`refunded`:e}function y(e,t){let n={freemius_last_event_type:t,freemius_last_synced_at:new Date().toISOString()};for(let[t,r]of Object.entries(e))r!=null&&r!==``&&(n[t]=r);return n}function b(){let e=process.env.NEXT_PUBLIC_SUPABASE_URL||process.env.SUPABASE_URL,t=process.env.SUPABASE_SERVICE_ROLE_KEY||process.env.SUPABASE_SECRET_KEY;if(!e||!t)throw Error(`Missing Supabase Service Role environment variables`);return(0,i.createClient)(e,t,{auth:{autoRefreshToken:!1,persistSession:!1}})}async function x(e,t){let{data:n,error:r}=await e.from(`orders`).select(`id, status, provider, freemius_product_id, freemius_plan_id, freemius_license_id, freemius_subscription_id, freemius_trial_id, freemius_user_id, freemius_trial_ends_at`).eq(`id`,t).single();if(r||!n)throw Error(r?.message||`Order not found`);return n}async function S(e,t){let{data:n,error:r}=await e.from(`orders`).select(`id, status, provider, freemius_product_id, freemius_plan_id, freemius_license_id, freemius_subscription_id, freemius_trial_id, freemius_user_id, freemius_trial_ends_at`).eq(`freemius_license_id`,t).order(`created_at`,{ascending:!1}).limit(1).maybeSingle();if(r)throw Error(r.message);return n??null}async function C(e){let t=y(e.metadata,e.eventType),i=e.order.status,a=i===`paid`&&e.nextStatus!==`paid`?`paid`:e.nextStatus;a!==i&&(t.status=a);let{error:o}=await e.client.from(`orders`).update(t).eq(`id`,e.order.id);if(o)throw Error(o.message);return a===`paid`&&i!==`paid`&&(await r.assignInvoiceMetadata({orderId:e.order.id,client:e.client}),await n.applyOrderInventoryDeduction(e.client,e.order.id)),a}async function w(e){let t=e.client??b(),n=await x(t,e.orderId);if(n.provider!==`freemius`)return{success:!1,error:`Only Freemius orders can be synced from Freemius checkout`};let r=h(e.checkoutResponse),i=null;if(r.freemius_license_id)try{i=await D(r.freemius_product_id??n.freemius_product_id,r.freemius_license_id)}catch(e){console.error(`[Freemius Checkout Sync] Failed to retrieve purchase data:`,e)}let a={type:`checkout.purchaseCompleted`,data:{license_id:r.freemius_license_id},objects:{}},o={...r,...E(a,i)},s=g(e.checkoutResponse,n.status),c=i?_({event:a,currentStatus:n.status,purchaseData:i}):null,l=s===`paid`?n.status:s,u=await C({client:t,order:n,nextStatus:v(n.status,l,c),metadata:o,eventType:`checkout.purchaseCompleted`});return{success:!0,orderId:n.id,status:u,metadata:o}}function T(e){return s(e.data?.license_id)??s(e.objects?.license?.id)??s(e.objects?.subscription?.license_id)??s(e.objects?.payment?.license_id)??s(e.data?.payment?.license_id)}function E(e,t){let n=e.objects?.license,r=e.objects?.subscription,i=e.objects?.trial,a=e.objects?.payment??e.data?.payment;return{freemius_product_id:s(t?.productId)??s(t?.product_id)??s(n?.plugin_id)??s(r?.plugin_id)??s(a?.plugin_id),freemius_plan_id:s(t?.planId)??s(t?.plan_id)??s(n?.plan_id),freemius_license_id:s(t?.licenseId)??s(t?.license_id)??T(e),freemius_subscription_id:s(t?.subscriptionId)??s(t?.subscription_id)??s(r?.id)??s(e.data?.subscription_id),freemius_trial_id:s(i?.id)??s(e.data?.trial_id),freemius_user_id:s(t?.userId)??s(t?.user_id)??s(e.objects?.user?.id),freemius_trial_ends_at:c(i?.trial_ends_at)??c(i?.trial_ends)??c(n?.trial_ends)??c(t?.trialEndsAt)??c(t?.trial_ends_at)}}async function D(e,n){if(!e)return null;let r=t.resolveFreemiusCheckoutCredentials(e);return!r.apiKey||!r.secretKey||!r.publicKey?null:new o.Freemius({productId:Number(e),apiKey:r.apiKey,secretKey:r.secretKey,publicKey:r.publicKey}).purchase.retrievePurchaseData(n)}async function O(e){let t=e.client??b(),n=T(e.event);if(!n)return{success:!0,ignored:!0,reason:`missing_license_id`,type:e.event.type};let r=await S(t,n);if(!r)return{success:!0,ignored:!0,reason:`unknown_license_id`,licenseId:n,type:e.event.type};let i=null;try{i=await D(r.freemius_product_id??e.event.objects?.license?.plugin_id,n)}catch(e){console.error(`[Freemius Sync] Failed to retrieve purchase data:`,e)}let a=E(e.event,i),o=await C({client:t,order:r,nextStatus:_({event:e.event,currentStatus:r.status,purchaseData:i}),metadata:a,eventType:e.event.type??null});return{success:!0,orderId:r.id,status:o,type:e.event.type}}function k(){let e=[t.readFreemiusEnvValue(`FREEMIUS_SECRET_KEY`),t.readFreemiusEnvValue(`FREEMIUS_ECOMMERCE_SANDBOX_SECRET_KEY`),...Object.values(t.parseFreemiusCheckoutCredentialsMap()??{}).map(e=>e.secretKey??null)];return Array.from(new Set(e.filter(e=>!!e)))}function A(e,t){return t?k().some(n=>{let r=a.default.createHmac(`sha256`,n).update(e).digest(`hex`);try{return a.default.timingSafeEqual(Buffer.from(r,`hex`),Buffer.from(t,`hex`))}catch{return!1}}):!1}exports.extractFreemiusCheckoutMetadata=h,exports.getFreemiusWebhookSecretCandidates=k,exports.resolveFreemiusStatusFromCheckoutResponse=g,exports.resolveFreemiusStatusFromWebhookEvent=_,exports.syncFreemiusCheckoutOrder=w,exports.syncFreemiusOrderFromWebhookEvent=O,exports.verifyFreemiusWebhookSignature=A;
@@ -4,7 +4,7 @@ import { assignInvoiceMetadata as i } from "./invoice-server.es.js";
4
4
  import { createClient as a } from "@supabase/supabase-js";
5
5
  import o from "crypto";
6
6
  import { Freemius as s } from "@freemius/sdk";
7
- //#region libs/ecommerce/src/lib/freemius-order-sync.ts
7
+ //#region src/lib/freemius-order-sync.ts
8
8
  function c(e) {
9
9
  return e == null || e === "" ? null : String(e);
10
10
  }
@@ -0,0 +1 @@
1
+ const e=require("./payment-config.cjs"),t=require("./providers/freemius.cjs");let n=require("@freemius/sdk");var r=`A NextBlock license or trial already exists for this email. Activate that key from CMS Settings → Packages, or purchase a license at nextblock.dev.`,i=`The trial could not be provisioned automatically. Start it from CMS Settings → Packages instead.`;function a(e){return e.toISOString().slice(0,19).replace(`T`,` `)}function o(e,t){let n=Number.isFinite(t)&&t>0?Math.floor(t):30;return new Date(e.getTime()+n*24*60*60*1e3)}function s(e){let t=e.filter(e=>e.id!==null&&e.id!==void 0);if(t.length===0)return null;let n=t.filter(e=>!e.is_hidden);return[...n.length>0?n:t].sort((e,t)=>(e.licenses===null||e.licenses===void 0?1/0:e.licenses)-(t.licenses===null||t.licenses===void 0?1/0:t.licenses))[0]}function c(e){return e.existingLicenses.some(t=>t.plugin_id===null||t.plugin_id===void 0||String(t.plugin_id).trim()===String(e.productId).trim())?{ok:!1,reason:`already_licensed`}:{ok:!0}}function l(e){return e.trim().toLowerCase()}async function u(u,d){await e.hydrateFreemiusEnvFromDb();let f=t.resolveFreemiusCheckoutCredentials(u.productId);if(!f.apiKey||!f.secretKey||!f.publicKey)return{error:`The license service is not configured for this product.`,ok:!1,reason:`not_configured`,status:503};let p=new n.Freemius({apiKey:f.apiKey,productId:Number(u.productId),publicKey:f.publicKey,secretKey:f.secretKey}),m=l(u.email),h=p.api.__unstable_ApiClient,g={product_id:u.productId},_=[];try{let e=await p.api.user.retrieveByEmail(m);e?.id!==null&&e?.id!==void 0&&(_=await p.api.user.retrieveLicenses(e.id))}catch(e){return console.error(`[Freemius trial] user lookup failed:`,e),{error:`Freemius could not be reached to verify eligibility.`,ok:!1,reason:`upstream_error`,status:502}}if(!c({existingLicenses:_,productId:u.productId}).ok)return{error:r,ok:!1,reason:`already_licensed`,status:409};let v=null;try{let{data:e,error:t}=await h.GET(`/products/{product_id}/plans/{plan_id}/pricing.json`,{params:{path:{...g,plan_id:u.planId}}});if(t)throw Error(JSON.stringify(t));let n=s(e?.pricing??[]);v=n?.id!==null&&n?.id!==void 0?String(n.id):null}catch(e){return console.error(`[Freemius trial] pricing lookup failed:`,e),{error:`Freemius could not be reached to resolve the plan pricing.`,ok:!1,reason:`upstream_error`,status:502}}if(!v)return{error:i,ok:!1,reason:`no_pricing`,status:502};let y=a(o(d?.now??new Date,u.trialDays)),b=null,x=null;try{let{data:e,error:t}=await h.POST(`/products/{product_id}/plans/{plan_id}/pricing/{pricing_id}/licenses.json`,{body:{expires_at:y,is_block_features:!0,send_email:!1},params:{path:{...g,plan_id:u.planId,pricing_id:v}}});if(t)throw Error(JSON.stringify(t));let n=e?.license;b=n?.secret_key?.trim()||null,x=n?.id!==null&&n?.id!==void 0?String(n.id):null}catch(e){return console.error(`[Freemius trial] license creation failed:`,e),{error:`Freemius could not create the trial license.`,ok:!1,reason:`upstream_error`,status:502}}if(!b)return{error:i,ok:!1,reason:`no_key`,status:502};let S=!1;try{let{error:e}=await h.PUT(`/products/{product_id}/licenses.json`,{body:{email:m,license_key:b,name:u.name.trim()},params:{path:g}});S=!e,e&&console.warn(`[Freemius trial] license assignment refused:`,JSON.stringify(e))}catch(e){console.warn(`[Freemius trial] license assignment failed:`,e)}return{assigned:S,expiresAt:y,licenseId:x,licenseKey:b,ok:!0,planId:u.planId,pricingId:v}}exports.FREEMIUS_TRIAL_ALREADY_USED_MESSAGE=r,exports.FREEMIUS_TRIAL_PROVISION_FAILED_MESSAGE=i,exports.computeTrialExpiry=o,exports.evaluateTrialEligibility=c,exports.formatFreemiusTimestamp=a,exports.pickTrialPricing=s,exports.provisionFreemiusTrialLicense=u;
@@ -1,7 +1,7 @@
1
1
  import { hydrateFreemiusEnvFromDb as e } from "./payment-config.es.js";
2
2
  import { resolveFreemiusCheckoutCredentials as t } from "./providers/freemius.es.js";
3
3
  import { Freemius as n } from "@freemius/sdk";
4
- //#region libs/ecommerce/src/lib/freemius-trial-provision.ts
4
+ //#region src/lib/freemius-trial-provision.ts
5
5
  var r = "A NextBlock license or trial already exists for this email. Activate that key from CMS Settings → Packages, or purchase a license at nextblock.dev.", i = "The trial could not be provisioned automatically. Start it from CMS Settings → Packages instead.";
6
6
  function a(e) {
7
7
  return e.toISOString().slice(0, 19).replace("T", " ");
@@ -1,4 +1,4 @@
1
- //#region libs/ecommerce/src/lib/inventory-settings.ts
1
+ //#region src/lib/inventory-settings.ts
2
2
  var e = "ecommerce_inventory_settings", t = {
3
3
  trackQuantities: !0,
4
4
  enableTaxes: !1,
@@ -1,4 +1,4 @@
1
- const e=require("./customer.cjs.js"),t=require("./invoice.cjs.js"),n=require("./order-tax-details.cjs.js");let r=require("@nextblock-cms/db/server");function i(e){return e?e.startsWith(`http`)||e.startsWith(`/`)?e:process.env.NEXT_PUBLIC_R2_BASE_URL?`${process.env.NEXT_PUBLIC_R2_BASE_URL}/${e}`:process.env.NEXT_PUBLIC_SUPABASE_URL?`${process.env.NEXT_PUBLIC_SUPABASE_URL}/storage/v1/object/public/media/${e}`:e:null}function a(e){return e??(0,r.getServiceRoleSupabaseClient)()}function o(e){if(!e)return null;let t=e.media?.object_key??e.media?.file_path??null;return{id:e.id,name:e.name??null,url:i(t),width:e.media?.width??null,height:e.media?.height??null}}var s=`active_logo_id`,c=`
1
+ const e=require("./customer.cjs"),t=require("./invoice.cjs"),n=require("./order-tax-details.cjs");let r=require("@nextblock-cms/db/server");function i(e){return e?e.startsWith(`http`)||e.startsWith(`/`)?e:process.env.NEXT_PUBLIC_R2_BASE_URL?`${process.env.NEXT_PUBLIC_R2_BASE_URL}/${e}`:process.env.NEXT_PUBLIC_SUPABASE_URL?`${process.env.NEXT_PUBLIC_SUPABASE_URL}/storage/v1/object/public/media/${e}`:e:null}function a(e){return e??(0,r.getServiceRoleSupabaseClient)()}function o(e){if(!e)return null;let t=e.media?.object_key??e.media?.file_path??null;return{id:e.id,name:e.name??null,url:i(t),width:e.media?.width??null,height:e.media?.height??null}}var s=`active_logo_id`,c=`
2
2
  id,
3
3
  name,
4
4
  media:media_id (
@@ -2,7 +2,7 @@ import { normalizeOrderCustomerDetails as e } from "./customer.es.js";
2
2
  import { DEFAULT_INVOICE_SETTINGS as t, INVOICE_SETTINGS_KEY as n, normalizeInvoiceSettings as r } from "./invoice.es.js";
3
3
  import { normalizeOrderTaxDetails as i } from "./order-tax-details.es.js";
4
4
  import { getServiceRoleSupabaseClient as a } from "@nextblock-cms/db/server";
5
- //#region libs/ecommerce/src/lib/invoice-server.ts
5
+ //#region src/lib/invoice-server.ts
6
6
  function o(e) {
7
7
  return e ? e.startsWith("http") || e.startsWith("/") ? e : process.env.NEXT_PUBLIC_R2_BASE_URL ? `${process.env.NEXT_PUBLIC_R2_BASE_URL}/${e}` : process.env.NEXT_PUBLIC_SUPABASE_URL ? `${process.env.NEXT_PUBLIC_SUPABASE_URL}/storage/v1/object/public/media/${e}` : e : null;
8
8
  }
@@ -1,4 +1,4 @@
1
- //#region libs/ecommerce/src/lib/invoice-ui.ts
1
+ //#region src/lib/invoice-ui.ts
2
2
  function e(e, t, n) {
3
3
  let r = e(t);
4
4
  return r === t ? n : r;
package/lib/invoice.es.js CHANGED
@@ -1,4 +1,4 @@
1
- //#region libs/ecommerce/src/lib/invoice.ts
1
+ //#region src/lib/invoice.ts
2
2
  var e = "invoice_settings", t = {
3
3
  businessName: "",
4
4
  email: "",
@@ -1,4 +1,4 @@
1
- const e=require("../_virtual/_rolldown/runtime.cjs.js"),t=require("./inventory-settings.cjs.js");require("server-only");let n=require("postgres");n=e.__toESM(n,1);function r(){return process.env.POSTGRES_URL||process.env.DATABASE_URL||null}async function i(e){let i=r();if(!i)throw Error(`Missing POSTGRES_URL or DATABASE_URL for inventory fallback`);let a=(0,n.default)(i,{ssl:`require`,onnotice:()=>{}});try{await a.begin(async n=>{let r=n,i=(await r`
1
+ const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("./inventory-settings.cjs");require("server-only");let n=require("postgres");n=e.__toESM(n,1);function r(){return process.env.POSTGRES_URL||process.env.DATABASE_URL||null}async function i(e){let i=r();if(!i)throw Error(`Missing POSTGRES_URL or DATABASE_URL for inventory fallback`);let a=(0,n.default)(i,{ssl:`require`,onnotice:()=>{}});try{await a.begin(async n=>{let r=n,i=(await r`
2
2
  SELECT inventory_deducted_at
3
3
  FROM public.orders
4
4
  WHERE id = ${e}
@@ -1,7 +1,7 @@
1
1
  import { ECOMMERCE_INVENTORY_SETTINGS_KEY as e, normalizeEcommerceInventorySettings as t } from "./inventory-settings.es.js";
2
2
  import "server-only";
3
3
  import n from "postgres";
4
- //#region libs/ecommerce/src/lib/order-inventory.ts
4
+ //#region src/lib/order-inventory.ts
5
5
  function r() {
6
6
  return process.env.POSTGRES_URL || process.env.DATABASE_URL || null;
7
7
  }
@@ -1,4 +1,4 @@
1
- //#region libs/ecommerce/src/lib/order-tax-details.ts
1
+ //#region src/lib/order-tax-details.ts
2
2
  var e = {
3
3
  gst: "GST",
4
4
  qst: "QST",
@@ -0,0 +1 @@
1
+ const e=require("./ProductScopePicker.cjs");let t=require("@nextblock-cms/utils"),n=require("react/jsx-runtime"),r=require("@nextblock-cms/ui");function i(e){if(!e)return``;let t=new Date(e);return Number.isNaN(t.getTime())?``:t.toISOString().slice(0,16)}function a(e,n){let r=(0,t.getCurrencyMinorUnitFactor)(n)===1?0:2;return e.toFixed(r)}function o(e,n){return e?.discount_amount?e.discount_type===`fixed`?a((0,t.minorUnitAmountToMajor)(e.discount_amount,n),n):e.discount_amount:10}function s({action:t,products:a,coupon:s,selectedProductIds:c=[],submitLabel:l,currencyCode:u=`USD`}){return(0,n.jsxs)(`form`,{action:t,children:[(0,n.jsx)(`input`,{type:`hidden`,name:`currency_code`,value:u}),(0,n.jsxs)(r.Card,{children:[(0,n.jsx)(r.CardHeader,{children:(0,n.jsx)(r.CardTitle,{children:s?.id?`Edit Coupon`:`Create Coupon`})}),(0,n.jsxs)(r.CardContent,{className:`space-y-6`,children:[(0,n.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,n.jsxs)(`div`,{className:`space-y-2`,children:[(0,n.jsx)(r.Label,{htmlFor:`coupon-code`,children:`Code`}),(0,n.jsx)(r.Input,{id:`coupon-code`,name:`code`,defaultValue:s?.code||``,className:`uppercase`,required:!0})]}),(0,n.jsxs)(`div`,{className:`space-y-2`,children:[(0,n.jsx)(r.Label,{htmlFor:`coupon-name`,children:`Name`}),(0,n.jsx)(r.Input,{id:`coupon-name`,name:`name`,defaultValue:s?.name||``,required:!0})]})]}),(0,n.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-3`,children:[(0,n.jsxs)(`div`,{className:`space-y-2`,children:[(0,n.jsx)(r.Label,{htmlFor:`provider-scope`,children:`Provider scope`}),(0,n.jsxs)(`select`,{id:`provider-scope`,name:`provider_scope`,defaultValue:s?.provider_scope||`all`,className:`flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm`,children:[(0,n.jsx)(`option`,{value:`all`,children:`Stripe + Freemius`}),(0,n.jsx)(`option`,{value:`stripe`,children:`Stripe only`}),(0,n.jsx)(`option`,{value:`freemius`,children:`Freemius only`})]})]}),(0,n.jsxs)(`div`,{className:`space-y-2`,children:[(0,n.jsx)(r.Label,{htmlFor:`discount-type`,children:`Discount type`}),(0,n.jsxs)(`select`,{id:`discount-type`,name:`discount_type`,defaultValue:s?.discount_type||`percent`,className:`flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm`,children:[(0,n.jsx)(`option`,{value:`percent`,children:`Percent`}),(0,n.jsx)(`option`,{value:`fixed`,children:`Fixed amount`})]})]}),(0,n.jsxs)(`div`,{className:`space-y-2`,children:[(0,n.jsx)(r.Label,{htmlFor:`discount-amount`,children:`Amount`}),(0,n.jsx)(r.Input,{id:`discount-amount`,name:`discount_amount`,type:`number`,min:`0.01`,step:`0.01`,defaultValue:o(s,u),required:!0}),(0,n.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Percent coupons use 1-100. Fixed coupons use regular amounts, for example $10.00.`})]})]}),(0,n.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-3`,children:[(0,n.jsxs)(`div`,{className:`space-y-2`,children:[(0,n.jsx)(r.Label,{htmlFor:`starts-at`,children:`Starts at`}),(0,n.jsx)(r.Input,{id:`starts-at`,name:`starts_at`,type:`datetime-local`,defaultValue:i(s?.starts_at)})]}),(0,n.jsxs)(`div`,{className:`space-y-2`,children:[(0,n.jsx)(r.Label,{htmlFor:`ends-at`,children:`Ends at`}),(0,n.jsx)(r.Input,{id:`ends-at`,name:`ends_at`,type:`datetime-local`,defaultValue:i(s?.ends_at)})]}),(0,n.jsxs)(`div`,{className:`space-y-2`,children:[(0,n.jsx)(r.Label,{htmlFor:`redemption-limit`,children:`Redemption limit`}),(0,n.jsx)(r.Input,{id:`redemption-limit`,name:`redemption_limit`,type:`number`,min:`1`,defaultValue:s?.redemption_limit||``})]})]}),(0,n.jsxs)(`div`,{className:`space-y-2`,children:[(0,n.jsx)(r.Label,{htmlFor:`internal-note`,children:`Internal note`}),(0,n.jsx)(r.Textarea,{id:`internal-note`,name:`internal_note`,defaultValue:s?.internal_note||``,rows:3})]}),(0,n.jsxs)(`div`,{className:`rounded-lg border bg-muted/20 p-4`,children:[(0,n.jsx)(`input`,{type:`hidden`,name:`is_active`,value:`false`}),(0,n.jsxs)(`label`,{htmlFor:`coupon-active`,className:`flex cursor-pointer items-start gap-3`,children:[(0,n.jsx)(`input`,{id:`coupon-active`,name:`is_active`,type:`checkbox`,value:`true`,defaultChecked:s?.is_active??!0,className:`mt-0.5 h-4 w-4 rounded border-slate-300 text-primary focus:ring-primary`}),(0,n.jsxs)(`span`,{children:[(0,n.jsx)(`span`,{className:`block text-sm font-medium`,children:`Active`}),(0,n.jsx)(`span`,{className:`block text-sm text-muted-foreground`,children:`Active coupons can be applied by shoppers during cart and checkout.`})]})]})]}),(0,n.jsxs)(`div`,{className:`space-y-3`,children:[(0,n.jsxs)(`div`,{children:[(0,n.jsx)(`h3`,{className:`font-semibold`,children:`Product scope`}),(0,n.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Leave every product unchecked to apply this coupon to all products in the selected provider scope.`})]}),(0,n.jsx)(e.ProductScopePicker,{products:a,selectedProductIds:c})]}),(0,n.jsx)(`div`,{className:`flex justify-end`,children:(0,n.jsx)(r.Button,{type:`submit`,children:l})})]})]})]})}exports.CouponEditorForm=s;
@@ -2,7 +2,7 @@ import { ProductScopePicker as e } from "./ProductScopePicker.es.js";
2
2
  import { getCurrencyMinorUnitFactor as t, minorUnitAmountToMajor as n } from "@nextblock-cms/utils";
3
3
  import { jsx as r, jsxs as i } from "react/jsx-runtime";
4
4
  import { Button as a, Card as o, CardContent as s, CardHeader as c, CardTitle as l, Input as u, Label as d, Textarea as f } from "@nextblock-cms/ui";
5
- //#region libs/ecommerce/src/lib/pages/cms/coupons/CouponEditorForm.tsx
5
+ //#region src/lib/pages/cms/coupons/CouponEditorForm.tsx
6
6
  function p(e) {
7
7
  if (!e) return "";
8
8
  let t = new Date(e);
@@ -1,4 +1,4 @@
1
- const e=require("../../../../_virtual/_rolldown/runtime.cjs.js"),t=require("./actions.cjs.js"),n=require("./CreateCouponDialog.cjs.js"),r=require("./product-options.cjs.js");let i=require("next/link");i=e.__toESM(i,1);let a=require("lucide-react"),o=require("@nextblock-cms/utils"),s=require("react/jsx-runtime"),c=require("@nextblock-cms/db/server"),l=require("@nextblock-cms/ui");function u(e,t){return e.discount_type===`percent`?`${e.discount_amount}%`:(0,o.formatPrice)(e.discount_amount,t)}function d(e,t){return t?e===`synced`||e===`not_required`?`default`:`secondary`:`outline`}function f(e,t){let n=new Set;for(let r of e||[]){let e=r.product_id;e&&n.add(t.get(e)||e)}return n.size}function p(e,t){let n=f(e,t);return n===0?`All eligible products`:`${n} scoped SKU${n===1?``:`s`}`}async function m({searchParams:e}){let o=(0,c.getServiceRoleSupabaseClient)(),f=o.from(`coupons`).select(`
1
+ const e=require("../../../../_virtual/_rolldown/runtime.cjs"),t=require("./actions.cjs"),n=require("./CreateCouponDialog.cjs"),r=require("./product-options.cjs");let i=require("next/link");i=e.__toESM(i,1);let a=require("lucide-react"),o=require("@nextblock-cms/utils"),s=require("react/jsx-runtime"),c=require("@nextblock-cms/db/server"),l=require("@nextblock-cms/ui");function u(e,t){return e.discount_type===`percent`?`${e.discount_amount}%`:(0,o.formatPrice)(e.discount_amount,t)}function d(e,t){return t?e===`synced`||e===`not_required`?`default`:`secondary`:`outline`}function f(e,t){let n=new Set;for(let r of e||[]){let e=r.product_id;e&&n.add(t.get(e)||e)}return n.size}function p(e,t){let n=f(e,t);return n===0?`All eligible products`:`${n} scoped SKU${n===1?``:`s`}`}async function m({searchParams:e}){let o=(0,c.getServiceRoleSupabaseClient)(),f=o.from(`coupons`).select(`
2
2
  *,
3
3
  coupon_products(product_id),
4
4
  coupon_freemius_mappings(sync_status, sync_error)
@@ -7,7 +7,7 @@ import { formatPrice as l } from "@nextblock-cms/utils";
7
7
  import { jsx as u, jsxs as d } from "react/jsx-runtime";
8
8
  import { getServiceRoleSupabaseClient as f } from "@nextblock-cms/db/server";
9
9
  import { Badge as p, Button as m, Card as h, CardContent as g, CardDescription as _, CardHeader as v, CardTitle as y } from "@nextblock-cms/ui";
10
- //#region libs/ecommerce/src/lib/pages/cms/coupons/CouponsPage.tsx
10
+ //#region src/lib/pages/cms/coupons/CouponsPage.tsx
11
11
  function b(e, t) {
12
12
  return e.discount_type === "percent" ? `${e.discount_amount}%` : l(e.discount_amount, t);
13
13
  }
@@ -0,0 +1 @@
1
+ "use client";const e=require("./CouponEditorForm.cjs");let t=require("@nextblock-cms/ui/button"),n=require("react"),r=require("lucide-react"),i=require("react/jsx-runtime"),a=require("@nextblock-cms/ui/dialog");function o({action:o,products:s,currencyCode:c}){let[l,u]=(0,n.useState)(!1);return(0,i.jsxs)(a.Dialog,{open:l,onOpenChange:u,children:[(0,i.jsx)(a.DialogTrigger,{asChild:!0,children:(0,i.jsxs)(t.Button,{type:`button`,className:`gap-2`,children:[(0,i.jsx)(r.Plus,{className:`h-4 w-4`}),`Create Coupon`]})}),(0,i.jsxs)(a.DialogContent,{className:`max-h-[90vh] overflow-y-auto sm:max-w-[92vw] lg:max-w-5xl xl:max-w-6xl`,children:[(0,i.jsx)(a.DialogHeader,{children:(0,i.jsx)(a.DialogTitle,{className:`sr-only`,children:`Create Coupon`})}),(0,i.jsx)(e.CouponEditorForm,{action:o,products:s,submitLabel:`Create Coupon`,currencyCode:c})]})]})}exports.CreateCouponDialog=o;
@@ -5,7 +5,7 @@ import { useState as n } from "react";
5
5
  import { Plus as r } from "lucide-react";
6
6
  import { jsx as i, jsxs as a } from "react/jsx-runtime";
7
7
  import { Dialog as o, DialogContent as s, DialogHeader as c, DialogTitle as l, DialogTrigger as u } from "@nextblock-cms/ui/dialog";
8
- //#region libs/ecommerce/src/lib/pages/cms/coupons/CreateCouponDialog.tsx
8
+ //#region src/lib/pages/cms/coupons/CreateCouponDialog.tsx
9
9
  function d({ action: d, products: f, currencyCode: p }) {
10
10
  let [m, h] = n(!1);
11
11
  return /* @__PURE__ */ a(o, {
@@ -0,0 +1 @@
1
+ const e=require("../../../../_virtual/_rolldown/runtime.cjs"),t=require("./actions.cjs"),n=require("./CouponEditorForm.cjs"),r=require("./product-options.cjs");let i=require("next/link");i=e.__toESM(i,1);let a=require("react/jsx-runtime"),o=require("@nextblock-cms/db/server"),s=require("next/navigation"),c=require("@nextblock-cms/ui");async function l({params:e}){let{id:l}=await e,u=(0,o.getServiceRoleSupabaseClient)(),[{data:d},{data:f},{data:p},{data:m}]=await Promise.all([u.from(`coupons`).select(`*`).eq(`id`,l).single(),u.from(`products`).select(`id, title, sku, payment_provider, freemius_product_id, language:languages(code, name), product_media(sort_order, media(file_path, object_key))`).order(`title`,{ascending:!0}),u.from(`coupon_products`).select(`product_id`).eq(`coupon_id`,l),u.from(`currencies`).select(`code, is_default`).eq(`is_active`,!0)]);d||(0,s.notFound)();let h=(p||[]).map(e=>e.product_id),g=m?.find(e=>e.is_default)?.code||m?.[0]?.code||`USD`;return(0,a.jsxs)(`div`,{className:`mx-auto w-full max-w-5xl space-y-6 px-6 py-8`,children:[(0,a.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,a.jsxs)(`div`,{children:[(0,a.jsx)(`h1`,{className:`text-3xl font-bold tracking-tight`,children:`Edit Coupon`}),(0,a.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Changes are resynced to Freemius after saving.`})]}),(0,a.jsx)(c.Button,{asChild:!0,variant:`outline`,children:(0,a.jsx)(i.default,{href:`/cms/coupons`,children:`Back to coupons`})})]}),(0,a.jsx)(n.CouponEditorForm,{action:t.updateCouponAction.bind(null,l),products:r.normalizeCouponProductOptions(f),coupon:d,selectedProductIds:h,submitLabel:`Save Coupon`,currencyCode:g})]})}exports.EditCouponPage=l;
@@ -6,7 +6,7 @@ import { jsx as i, jsxs as a } from "react/jsx-runtime";
6
6
  import { getServiceRoleSupabaseClient as o } from "@nextblock-cms/db/server";
7
7
  import { notFound as s } from "next/navigation";
8
8
  import { Button as c } from "@nextblock-cms/ui";
9
- //#region libs/ecommerce/src/lib/pages/cms/coupons/EditCouponPage.tsx
9
+ //#region src/lib/pages/cms/coupons/EditCouponPage.tsx
10
10
  async function l({ params: l }) {
11
11
  let { id: u } = await l, d = o(), [{ data: f }, { data: p }, { data: m }, { data: h }] = await Promise.all([
12
12
  d.from("coupons").select("*").eq("id", u).single(),
@@ -4,7 +4,7 @@ import { useMemo as t, useState as n } from "react";
4
4
  import { ImageIcon as r, Search as i } from "lucide-react";
5
5
  import { jsx as a, jsxs as o } from "react/jsx-runtime";
6
6
  import { Input as s } from "@nextblock-cms/ui/input";
7
- //#region libs/ecommerce/src/lib/pages/cms/coupons/ProductScopePicker.tsx
7
+ //#region src/lib/pages/cms/coupons/ProductScopePicker.tsx
8
8
  function c(e) {
9
9
  let t = e.sku?.trim();
10
10
  return t ? t.toUpperCase() : `PRODUCT:${e.id}`;
@@ -0,0 +1 @@
1
+ "use server";const e=require("../../../coupons.cjs"),t=require("../../../freemius-coupons.cjs");let n=require("@nextblock-cms/utils"),r=require("@nextblock-cms/db/server"),i=require("next/navigation"),a=require("next/cache");async function o(){let e=(0,r.createClient)(),{data:{user:t}}=await e.auth.getUser();if(!t)throw Error(`Unauthorized`);let{data:n}=await e.from(`profiles`).select(`role`).eq(`id`,t.id).single();if(n?.role!==`ADMIN`)throw Error(`Forbidden`);return(0,r.getServiceRoleSupabaseClient)()}function s(e){return(typeof e==`string`?e.trim():``)||null}function c(e){let t=s(e);if(!t)return null;let n=new Date(t);return Number.isNaN(n.getTime())?null:n.toISOString()}function l(e){let t=s(e.value),r=t?Number.parseFloat(t):NaN;if(!Number.isFinite(r)||r<=0)throw Error(`Discount amount must be greater than zero.`);return e.discountType===`fixed`?(0,n.majorUnitAmountToMinor)(r,e.currencyCode):Math.round(r)}function u(e,t){return e.getAll(t).some(e=>e===`true`)}function d(t){let r=e.normalizeCouponCode(s(t.get(`code`))),i=s(t.get(`name`)),a=s(t.get(`provider_scope`))||`all`,o=s(t.get(`discount_type`))||`percent`,d=(0,n.normalizeCurrencyCode)(s(t.get(`currency_code`))),f=l({value:t.get(`discount_amount`),discountType:o,currencyCode:d}),p=s(t.get(`redemption_limit`));if(!r)throw Error(`Coupon code is required.`);if(!i)throw Error(`Coupon name is required.`);if(o===`percent`&&f>100)throw Error(`Percent discounts cannot exceed 100.`);return{coupon:{code:r,name:i,internal_note:s(t.get(`internal_note`)),provider_scope:a,discount_type:o,discount_amount:f,is_active:u(t,`is_active`),starts_at:c(t.get(`starts_at`)),ends_at:c(t.get(`ends_at`)),redemption_limit:p?Number.parseInt(p,10):null,freemius_sync_status:a===`stripe`?`not_required`:`pending`,freemius_sync_error:null},productIds:t.getAll(`product_ids`).map(e=>typeof e==`string`?e.trim():``).filter(Boolean)}}async function f(e){if(await e.client.from(`coupon_products`).delete().eq(`coupon_id`,e.couponId),e.productIds.length===0)return;let{error:t}=await e.client.from(`coupon_products`).insert(e.productIds.map(t=>({coupon_id:e.couponId,product_id:t})));if(t)throw Error(t.message)}async function p(e){let n=await o(),r=d(e),{data:s,error:c}=await n.from(`coupons`).insert(r.coupon).select(`id`).single();if(c||!s)throw Error(c?.message||`Failed to create coupon.`);await f({client:n,couponId:s.id,productIds:r.productIds}),await t.syncCouponToFreemius({couponId:s.id,client:n}),(0,a.revalidatePath)(`/cms/coupons`),(0,i.redirect)(`/cms/coupons`)}async function m(e,n){let r=await o(),s=d(n),{error:c}=await r.from(`coupons`).update(s.coupon).eq(`id`,e);if(c)throw Error(c.message);await f({client:r,couponId:e,productIds:s.productIds}),s.coupon.provider_scope===`stripe`?await t.deleteCouponFromFreemius({couponId:e,client:r}):await t.syncCouponToFreemius({couponId:e,client:r}),(0,a.revalidatePath)(`/cms/coupons`),(0,a.revalidatePath)(`/cms/coupons/${e}/edit`),(0,i.redirect)(`/cms/coupons`)}async function h(e,n){let r=await o(),{error:i}=await r.from(`coupons`).update({is_active:n,freemius_sync_status:`pending`,updated_at:new Date().toISOString()}).eq(`id`,e);if(i)throw Error(i.message);await t.syncCouponToFreemius({couponId:e,client:r}),(0,a.revalidatePath)(`/cms/coupons`)}async function g(e){let n=await o();await t.syncCouponToFreemius({couponId:e,client:n}),(0,a.revalidatePath)(`/cms/coupons`),(0,a.revalidatePath)(`/cms/coupons/${e}/edit`)}async function _(e){let n=await o();await t.deleteCouponFromFreemius({couponId:e,client:n});let{error:r}=await n.from(`coupons`).delete().eq(`id`,e);if(r)throw Error(r.message);(0,a.revalidatePath)(`/cms/coupons`)}exports.createCouponAction=p,exports.deleteCouponAction=_,exports.syncCouponAction=g,exports.toggleCouponActiveAction=h,exports.updateCouponAction=m;
@@ -5,7 +5,7 @@ import { majorUnitAmountToMinor as r, normalizeCurrencyCode as i } from "@nextbl
5
5
  import { createClient as a, getServiceRoleSupabaseClient as o } from "@nextblock-cms/db/server";
6
6
  import { redirect as s } from "next/navigation";
7
7
  import { revalidatePath as c } from "next/cache";
8
- //#region libs/ecommerce/src/lib/pages/cms/coupons/actions.ts
8
+ //#region src/lib/pages/cms/coupons/actions.ts
9
9
  async function l() {
10
10
  let e = a(), { data: { user: t } } = await e.auth.getUser();
11
11
  if (!t) throw Error("Unauthorized");
@@ -0,0 +1 @@
1
+ const e=require("./CouponsPage.cjs"),t=require("./EditCouponPage.cjs");exports.CouponsPage=e.CouponsPage,exports.EditCouponPage=t.EditCouponPage;