@nextblock-cms/ecom 0.20.3 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. package/_virtual/_rolldown/runtime.cjs.js +1 -0
  2. package/index.cjs.js +1 -1
  3. package/index.es.js +38 -146
  4. package/lib/CurrencyProvider.cjs.js +1 -1
  5. package/lib/CurrencyProvider.d.ts +1 -1
  6. package/lib/CurrencyProvider.es.js +85 -95
  7. package/lib/PaymentReadinessProvider.cjs.js +1 -1
  8. package/lib/PaymentReadinessProvider.d.ts +1 -1
  9. package/lib/PaymentReadinessProvider.es.js +24 -27
  10. package/lib/cart-store.cjs.js +1 -1
  11. package/lib/cart-store.es.js +109 -121
  12. package/lib/components/AccountNavigationMenu.cjs.js +1 -1
  13. package/lib/components/AccountNavigationMenu.d.ts +1 -1
  14. package/lib/components/AccountNavigationMenu.es.js +36 -50
  15. package/lib/components/AddToCartButton.cjs.js +1 -1
  16. package/lib/components/AddToCartButton.d.ts +1 -1
  17. package/lib/components/AddToCartButton.es.js +94 -89
  18. package/lib/components/Cart.cjs.js +1 -1
  19. package/lib/components/Cart.d.ts +1 -1
  20. package/lib/components/Cart.es.js +261 -180
  21. package/lib/components/CartDrawer.cjs.js +1 -1
  22. package/lib/components/CartDrawer.d.ts +1 -1
  23. package/lib/components/CartDrawer.es.js +218 -148
  24. package/lib/components/CartIcon.cjs.js +1 -1
  25. package/lib/components/CartIcon.d.ts +1 -1
  26. package/lib/components/CartIcon.es.js +33 -35
  27. package/lib/components/Checkout.cjs.js +1 -1
  28. package/lib/components/Checkout.d.ts +1 -1
  29. package/lib/components/Checkout.es.js +1092 -1108
  30. package/lib/components/CouponForm.cjs.js +1 -1
  31. package/lib/components/CouponForm.d.ts +1 -1
  32. package/lib/components/CouponForm.es.js +136 -148
  33. package/lib/components/CurrencySwitcher.cjs.js +1 -1
  34. package/lib/components/CurrencySwitcher.d.ts +1 -1
  35. package/lib/components/CurrencySwitcher.es.js +22 -18
  36. package/lib/components/CustomerProfileForm.cjs.js +1 -1
  37. package/lib/components/CustomerProfileForm.es.js +454 -313
  38. package/lib/components/FeaturedProduct.cjs.js +1 -1
  39. package/lib/components/FeaturedProduct.d.ts +1 -1
  40. package/lib/components/FeaturedProduct.es.js +98 -83
  41. package/lib/components/FreemiusLicensePanel.cjs.js +1 -1
  42. package/lib/components/FreemiusLicensePanel.d.ts +1 -1
  43. package/lib/components/FreemiusLicensePanel.es.js +70 -65
  44. package/lib/components/InvoiceDocument.cjs.js +1 -1
  45. package/lib/components/InvoiceDocument.es.js +256 -192
  46. package/lib/components/InvoiceViewerShell.cjs.js +2 -2
  47. package/lib/components/InvoiceViewerShell.d.ts +1 -1
  48. package/lib/components/InvoiceViewerShell.es.js +75 -106
  49. package/lib/components/ProductCard.cjs.js +1 -1
  50. package/lib/components/ProductCard.d.ts +1 -1
  51. package/lib/components/ProductCard.es.js +186 -171
  52. package/lib/components/ProductDetailsLayout.cjs.js +1 -1
  53. package/lib/components/ProductDetailsLayout.es.js +405 -404
  54. package/lib/components/ProductGallery.cjs.js +1 -1
  55. package/lib/components/ProductGallery.d.ts +1 -1
  56. package/lib/components/ProductGallery.es.js +51 -54
  57. package/lib/components/ProductGrid.cjs.js +1 -1
  58. package/lib/components/ProductGrid.d.ts +1 -1
  59. package/lib/components/ProductGrid.es.js +23 -25
  60. package/lib/components/ShippingEstimator.cjs.js +1 -1
  61. package/lib/components/ShippingEstimator.d.ts +1 -1
  62. package/lib/components/ShippingEstimator.es.js +158 -153
  63. package/lib/components/ShortDescription.cjs.js +1 -1
  64. package/lib/components/ShortDescription.es.js +17 -17
  65. package/lib/components/SimpleTiptapRenderer.cjs.js +1 -1
  66. package/lib/components/SimpleTiptapRenderer.es.js +238 -211
  67. package/lib/components/SubscriptionSelector.cjs.js +1 -1
  68. package/lib/components/SubscriptionSelector.es.js +159 -154
  69. package/lib/countries.cjs.js +1 -1
  70. package/lib/countries.es.js +232 -75
  71. package/lib/coupon-server.cjs.js +1 -1
  72. package/lib/coupon-server.es.js +180 -224
  73. package/lib/coupons.cjs.js +1 -1
  74. package/lib/coupons.es.js +12 -14
  75. package/lib/currency-constants.cjs.js +1 -1
  76. package/lib/currency-constants.es.js +4 -4
  77. package/lib/currency-rest-client.cjs.js +1 -1
  78. package/lib/currency-rest-client.es.js +15 -22
  79. package/lib/currency-store.cjs.js +1 -1
  80. package/lib/currency-store.es.js +20 -27
  81. package/lib/currency-sync.cjs.js +1 -1
  82. package/lib/currency-sync.es.js +124 -170
  83. package/lib/currency.cjs.js +1 -1
  84. package/lib/currency.es.js +242 -310
  85. package/lib/customer-addresses.cjs.js +1 -1
  86. package/lib/customer-addresses.es.js +80 -109
  87. package/lib/customer-orders.cjs.js +1 -1
  88. package/lib/customer-orders.es.js +31 -43
  89. package/lib/customer.cjs.js +1 -1
  90. package/lib/customer.es.js +43 -52
  91. package/lib/export-helpers.cjs.js +1 -1
  92. package/lib/export-helpers.es.js +53 -52
  93. package/lib/factory.cjs.js +1 -1
  94. package/lib/factory.es.js +10 -7
  95. package/lib/freemius-coupons.cjs.js +1 -1
  96. package/lib/freemius-coupons.es.js +245 -262
  97. package/lib/freemius-license-claim.cjs.js +1 -1
  98. package/lib/freemius-license-claim.es.js +87 -71
  99. package/lib/freemius-license.cjs.js +1 -1
  100. package/lib/freemius-license.es.js +32 -39
  101. package/lib/freemius-order-sync.cjs.js +1 -1
  102. package/lib/freemius-order-sync.es.js +226 -290
  103. package/lib/freemius-trial-provision.cjs.js +1 -1
  104. package/lib/freemius-trial-provision.es.js +136 -130
  105. package/lib/inventory-settings.cjs.js +1 -1
  106. package/lib/inventory-settings.es.js +69 -77
  107. package/lib/invoice-server.cjs.js +3 -3
  108. package/lib/invoice-server.es.js +94 -141
  109. package/lib/invoice-ui.cjs.js +1 -1
  110. package/lib/invoice-ui.es.js +50 -66
  111. package/lib/invoice.cjs.js +1 -1
  112. package/lib/invoice.es.js +85 -94
  113. package/lib/order-inventory.cjs.js +25 -25
  114. package/lib/order-inventory.es.js +67 -79
  115. package/lib/order-tax-details.cjs.js +1 -1
  116. package/lib/order-tax-details.es.js +142 -153
  117. package/lib/pages/cms/coupons/CouponEditorForm.cjs.js +1 -1
  118. package/lib/pages/cms/coupons/CouponEditorForm.d.ts +1 -1
  119. package/lib/pages/cms/coupons/CouponEditorForm.es.js +227 -185
  120. package/lib/pages/cms/coupons/CouponsPage.cjs.js +2 -2
  121. package/lib/pages/cms/coupons/CouponsPage.d.ts +1 -1
  122. package/lib/pages/cms/coupons/CouponsPage.es.js +235 -166
  123. package/lib/pages/cms/coupons/CreateCouponDialog.cjs.js +1 -1
  124. package/lib/pages/cms/coupons/CreateCouponDialog.d.ts +1 -1
  125. package/lib/pages/cms/coupons/CreateCouponDialog.es.js +35 -34
  126. package/lib/pages/cms/coupons/EditCouponPage.cjs.js +1 -1
  127. package/lib/pages/cms/coupons/EditCouponPage.d.ts +1 -1
  128. package/lib/pages/cms/coupons/EditCouponPage.es.js +47 -47
  129. package/lib/pages/cms/coupons/ProductScopePicker.cjs.js +1 -1
  130. package/lib/pages/cms/coupons/ProductScopePicker.d.ts +1 -1
  131. package/lib/pages/cms/coupons/ProductScopePicker.es.js +128 -117
  132. package/lib/pages/cms/coupons/actions.cjs.js +1 -1
  133. package/lib/pages/cms/coupons/actions.es.js +112 -115
  134. package/lib/pages/cms/coupons/index.cjs.js +1 -0
  135. package/lib/pages/cms/coupons/index.es.js +3 -0
  136. package/lib/pages/cms/coupons/product-options.cjs.js +1 -1
  137. package/lib/pages/cms/coupons/product-options.es.js +21 -23
  138. package/lib/pages/cms/orders/ExportReportsDialog.cjs.js +1 -1
  139. package/lib/pages/cms/orders/ExportReportsDialog.es.js +135 -129
  140. package/lib/pages/cms/orders/MarkPaidButton.d.ts +1 -1
  141. package/lib/pages/cms/orders/OrderDetailPage.cjs.js +1 -1
  142. package/lib/pages/cms/orders/OrderDetailPage.d.ts +1 -1
  143. package/lib/pages/cms/orders/OrderDetailPage.es.js +186 -134
  144. package/lib/pages/cms/orders/OrderPrintButton.cjs.js +1 -1
  145. package/lib/pages/cms/orders/OrderPrintButton.d.ts +1 -1
  146. package/lib/pages/cms/orders/OrderPrintButton.es.js +15 -21
  147. package/lib/pages/cms/orders/OrderStatusForm.cjs.js +1 -1
  148. package/lib/pages/cms/orders/OrderStatusForm.d.ts +1 -1
  149. package/lib/pages/cms/orders/OrderStatusForm.es.js +85 -69
  150. package/lib/pages/cms/orders/OrdersPage.cjs.js +1 -1
  151. package/lib/pages/cms/orders/OrdersPage.d.ts +1 -1
  152. package/lib/pages/cms/orders/OrdersPage.es.js +170 -102
  153. package/lib/pages/cms/orders/actions.cjs.js +3 -3
  154. package/lib/pages/cms/orders/actions.es.js +53 -69
  155. package/lib/pages/cms/orders/export-actions.cjs.js +1 -1
  156. package/lib/pages/cms/orders/export-actions.es.js +23 -26
  157. package/lib/pages/cms/orders/index.cjs.js +1 -0
  158. package/lib/pages/cms/orders/index.es.js +6 -0
  159. package/lib/pages/cms/orders/server-actions.cjs.js +1 -1
  160. package/lib/pages/cms/orders/server-actions.es.js +60 -51
  161. package/lib/pages/cms/payments/PaymentsClient.cjs.js +1 -1
  162. package/lib/pages/cms/payments/PaymentsClient.d.ts +1 -1
  163. package/lib/pages/cms/payments/PaymentsClient.es.js +316 -346
  164. package/lib/pages/cms/payments/PaymentsPage.cjs.js +1 -1
  165. package/lib/pages/cms/payments/PaymentsPage.d.ts +1 -1
  166. package/lib/pages/cms/payments/PaymentsPage.es.js +29 -32
  167. package/lib/pages/cms/payments/actions.cjs.js +1 -1
  168. package/lib/pages/cms/payments/actions.es.js +38 -48
  169. package/lib/pages/cms/payments/index.cjs.js +1 -0
  170. package/lib/pages/cms/payments/index.es.js +3 -0
  171. package/lib/pages/cms/payments/queries.cjs.js +1 -1
  172. package/lib/pages/cms/payments/queries.es.js +38 -48
  173. package/lib/pages/cms/products/ProductsPage.cjs.js +1 -1
  174. package/lib/pages/cms/products/ProductsPage.d.ts +1 -1
  175. package/lib/pages/cms/products/ProductsPage.es.js +63 -66
  176. package/lib/pages/cms/products/[id]/edit/EditProductPage.d.ts +1 -1
  177. package/lib/pages/cms/products/_id_/edit/EditProductPage.cjs.js +1 -1
  178. package/lib/pages/cms/products/_id_/edit/EditProductPage.es.js +138 -155
  179. package/lib/pages/cms/products/actions.cjs.js +4 -4
  180. package/lib/pages/cms/products/actions.es.js +121 -162
  181. package/lib/pages/cms/products/attributes/AttributeManagementPage.cjs.js +1 -1
  182. package/lib/pages/cms/products/attributes/AttributeManagementPage.d.ts +1 -1
  183. package/lib/pages/cms/products/attributes/AttributeManagementPage.es.js +55 -47
  184. package/lib/pages/cms/products/attributes/components/AttributeManager.cjs.js +1 -1
  185. package/lib/pages/cms/products/attributes/components/AttributeManager.d.ts +1 -1
  186. package/lib/pages/cms/products/attributes/components/AttributeManager.es.js +285 -290
  187. package/lib/pages/cms/products/categories/CategoryManagementPage.cjs.js +1 -1
  188. package/lib/pages/cms/products/categories/CategoryManagementPage.d.ts +1 -1
  189. package/lib/pages/cms/products/categories/CategoryManagementPage.es.js +43 -35
  190. package/lib/pages/cms/products/categories/components/CategoryManager.cjs.js +1 -1
  191. package/lib/pages/cms/products/categories/components/CategoryManager.es.js +315 -262
  192. package/lib/pages/cms/products/components/CopyProductFromLanguage.cjs.js +1 -1
  193. package/lib/pages/cms/products/components/CopyProductFromLanguage.es.js +115 -113
  194. package/lib/pages/cms/products/components/CurrencyPriceFields.cjs.js +1 -1
  195. package/lib/pages/cms/products/components/CurrencyPriceFields.d.ts +1 -1
  196. package/lib/pages/cms/products/components/CurrencyPriceFields.es.js +136 -145
  197. package/lib/pages/cms/products/components/DeleteProductButton.cjs.js +1 -1
  198. package/lib/pages/cms/products/components/DeleteProductButton.d.ts +1 -1
  199. package/lib/pages/cms/products/components/DeleteProductButton.es.js +35 -47
  200. package/lib/pages/cms/products/components/FreemiusPricingDashboard.cjs.js +1 -1
  201. package/lib/pages/cms/products/components/FreemiusPricingDashboard.d.ts +1 -1
  202. package/lib/pages/cms/products/components/FreemiusPricingDashboard.es.js +106 -84
  203. package/lib/pages/cms/products/components/ProductCategorySelector.cjs.js +1 -1
  204. package/lib/pages/cms/products/components/ProductCategorySelector.es.js +156 -159
  205. package/lib/pages/cms/products/components/ProductForm.cjs.js +1 -1
  206. package/lib/pages/cms/products/components/ProductForm.es.js +872 -693
  207. package/lib/pages/cms/products/components/ProductMediaManager.cjs.js +1 -1
  208. package/lib/pages/cms/products/components/ProductMediaManager.es.js +106 -103
  209. package/lib/pages/cms/products/components/ProductsBulkTable.cjs.js +1 -1
  210. package/lib/pages/cms/products/components/ProductsBulkTable.d.ts +1 -1
  211. package/lib/pages/cms/products/components/ProductsBulkTable.es.js +303 -294
  212. package/lib/pages/cms/products/components/SaleScheduleFields.cjs.js +1 -1
  213. package/lib/pages/cms/products/components/SaleScheduleFields.d.ts +1 -1
  214. package/lib/pages/cms/products/components/SaleScheduleFields.es.js +111 -134
  215. package/lib/pages/cms/products/components/SyncFreemiusButton.cjs.js +1 -1
  216. package/lib/pages/cms/products/components/SyncFreemiusButton.d.ts +1 -1
  217. package/lib/pages/cms/products/components/SyncFreemiusButton.es.js +29 -35
  218. package/lib/pages/cms/products/components/SyncFreemiusPricingButton.cjs.js +2 -2
  219. package/lib/pages/cms/products/components/SyncFreemiusPricingButton.d.ts +1 -1
  220. package/lib/pages/cms/products/components/SyncFreemiusPricingButton.es.js +36 -48
  221. package/lib/pages/cms/products/components/SyncProductForm.d.ts +1 -1
  222. package/lib/pages/cms/products/components/VariationsEditor.cjs.js +1 -1
  223. package/lib/pages/cms/products/components/VariationsEditor.d.ts +1 -1
  224. package/lib/pages/cms/products/components/VariationsEditor.es.js +396 -405
  225. package/lib/pages/cms/products/index.cjs.js +1 -0
  226. package/lib/pages/cms/products/index.es.js +8 -0
  227. package/lib/pages/cms/products/inventory/InventoryPage.cjs.js +1 -1
  228. package/lib/pages/cms/products/inventory/InventoryPage.d.ts +1 -1
  229. package/lib/pages/cms/products/inventory/InventoryPage.es.js +21 -15
  230. package/lib/pages/cms/products/inventory/InventoryTableClient.cjs.js +2 -2
  231. package/lib/pages/cms/products/inventory/InventoryTableClient.d.ts +1 -1
  232. package/lib/pages/cms/products/inventory/InventoryTableClient.es.js +230 -209
  233. package/lib/pages/cms/products/inventory/actions.cjs.js +3 -3
  234. package/lib/pages/cms/products/inventory/actions.es.js +83 -91
  235. package/lib/pages/cms/products/new/NewProductPage.cjs.js +1 -1
  236. package/lib/pages/cms/products/new/NewProductPage.d.ts +1 -1
  237. package/lib/pages/cms/products/new/NewProductPage.es.js +58 -74
  238. package/lib/pages/cms/products/product-price-sync.cjs.js +1 -1
  239. package/lib/pages/cms/products/product-price-sync.es.js +74 -89
  240. package/lib/pages/cms/products/server-actions.cjs.js +1 -1
  241. package/lib/pages/cms/products/server-actions.es.js +250 -233
  242. package/lib/pages/cms/shipping/ShippingPage.cjs.js +2 -2
  243. package/lib/pages/cms/shipping/ShippingPage.es.js +287 -209
  244. package/lib/pages/cms/shipping/components/RateForm.cjs.js +1 -1
  245. package/lib/pages/cms/shipping/components/RateForm.d.ts +1 -1
  246. package/lib/pages/cms/shipping/components/RateForm.es.js +439 -436
  247. package/lib/pages/cms/shipping/components/ZoneForm.cjs.js +1 -1
  248. package/lib/pages/cms/shipping/components/ZoneForm.es.js +245 -224
  249. package/lib/pages/cms/shipping/index.cjs.js +1 -0
  250. package/lib/pages/cms/shipping/index.es.js +3 -0
  251. package/lib/pages/cms/shipping/server-actions.cjs.js +1 -1
  252. package/lib/pages/cms/shipping/server-actions.es.js +131 -149
  253. package/lib/pages/cms/taxes/TaxesPage.cjs.js +1 -1
  254. package/lib/pages/cms/taxes/TaxesPage.d.ts +1 -1
  255. package/lib/pages/cms/taxes/TaxesPage.es.js +211 -169
  256. package/lib/pages/cms/taxes/actions.cjs.js +1 -1
  257. package/lib/pages/cms/taxes/actions.es.js +41 -53
  258. package/lib/pages/cms/taxes/components/TaxRateForm.cjs.js +1 -1
  259. package/lib/pages/cms/taxes/components/TaxRateForm.d.ts +1 -1
  260. package/lib/pages/cms/taxes/components/TaxRateForm.es.js +112 -99
  261. package/lib/pages/cms/taxes/index.cjs.js +1 -0
  262. package/lib/pages/cms/taxes/index.es.js +3 -0
  263. package/lib/payment-config.cjs.js +1 -1
  264. package/lib/payment-config.es.js +110 -126
  265. package/lib/product-actions.cjs.js +4 -4
  266. package/lib/product-actions.es.js +289 -544
  267. package/lib/product-context.cjs.js +1 -1
  268. package/lib/product-context.es.js +13 -15
  269. package/lib/product-schema.cjs.js +1 -1
  270. package/lib/product-schema.es.js +99 -134
  271. package/lib/providers/freemius.cjs.js +1 -5
  272. package/lib/providers/freemius.es.js +446 -530
  273. package/lib/providers/stripe.cjs.js +1 -1
  274. package/lib/providers/stripe.es.js +417 -477
  275. package/lib/server-actions/coupon-actions.cjs.js +1 -1
  276. package/lib/server-actions/coupon-actions.es.js +22 -22
  277. package/lib/server-actions/customer-actions.cjs.js +1 -1
  278. package/lib/server-actions/customer-actions.es.js +26 -28
  279. package/lib/server-actions/product-actions.cjs.js +1 -1
  280. package/lib/server-actions/product-actions.es.js +9 -15
  281. package/lib/server-actions/shipping-actions.cjs.js +1 -1
  282. package/lib/server-actions/shipping-actions.es.js +27 -24
  283. package/lib/server-actions/tax-actions.cjs.js +1 -1
  284. package/lib/server-actions/tax-actions.es.js +33 -39
  285. package/lib/shared-inventory.cjs.js +2 -2
  286. package/lib/shared-inventory.es.js +111 -160
  287. package/lib/shipping/resolver.cjs.js +2 -2
  288. package/lib/shipping/resolver.es.js +44 -61
  289. package/lib/shipping-rate-currency.cjs.js +1 -1
  290. package/lib/shipping-rate-currency.es.js +52 -67
  291. package/lib/states.cjs.js +1 -1
  292. package/lib/states.es.js +333 -154
  293. package/lib/stripe/checkout.cjs.js +1 -1
  294. package/lib/stripe/checkout.es.js +125 -181
  295. package/lib/stripe/client.cjs.js +1 -1
  296. package/lib/stripe/client.es.js +14 -19
  297. package/lib/stripe/order-sync.cjs.js +1 -1
  298. package/lib/stripe/order-sync.es.js +106 -126
  299. package/lib/stripe/webhooks.cjs.js +1 -1
  300. package/lib/stripe/webhooks.es.js +37 -31
  301. package/lib/tax-calculation.cjs.js +1 -1
  302. package/lib/tax-calculation.es.js +84 -98
  303. package/lib/trials.cjs.js +1 -1
  304. package/lib/trials.es.js +24 -30
  305. package/lib/types.cjs.js +1 -1
  306. package/lib/types.es.js +21 -27
  307. package/lib/use-cart.cjs.js +1 -1
  308. package/lib/use-cart.es.js +38 -40
  309. package/lib/use-price-formatter.cjs.js +1 -1
  310. package/lib/use-price-formatter.es.js +10 -11
  311. package/lib/variation-utils.cjs.js +1 -1
  312. package/lib/variation-utils.es.js +199 -261
  313. package/lib/zod-config.cjs.js +1 -1
  314. package/lib/zod-config.es.js +5 -6
  315. package/package.json +16 -16
  316. package/server.cjs.js +1 -1
  317. package/server.es.js +56 -211
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const I=require("@nextblock-cms/utils"),f=require("./providers/freemius.cjs.js"),h=require("./payment-config.cjs.js");function y(e){if(!e)return null;const o=new Date(e);return Number.isNaN(o.getTime())?e:o.toISOString().replace("T"," ").replace(/\.\d{3}Z$/,"")}function C(e){return e==="percent"?"percentage":"dollar"}function E(e){return f.resolveFreemiusCheckoutCredentials(e).apiKey||f.readFreemiusEnvValue("FREEMIUS_API_KEY")}async function l(e){await h.hydrateFreemiusEnvFromDb();const o=E(e.productId);if(!o)throw new Error(`Missing Freemius API bearer token for product ${e.productId}. Set FREEMIUS_API_KEY or FREEMIUS_CHECKOUT_PRODUCTS_JSON[${e.productId}].apiKey.`);const s=e.couponId?`/${e.couponId}`:"",t=await fetch(`https://api.freemius.com/v1/products/${e.productId}/coupons${s}.json`,{method:e.method,headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json",Accept:"application/json"},body:e.method==="DELETE"?void 0:JSON.stringify(e.body||{})}),n=await t.text(),r=n?JSON.parse(n):null;if(!t.ok)throw new Error(r?.message||r?.error?.message||`Freemius coupon request failed with ${t.status}`);return r}function g(e,o){return{code:e.code,discount:e.discount_type==="fixed"?I.minorUnitAmountToMajor(e.discount_amount,"USD"):e.discount_amount,discount_type:C(e.discount_type),plans:o.planIds.length>0?o.planIds.join(","):null,licenses:null,billing_cycles:null,start_date:y(e.starts_at),end_date:y(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 F(e,o){if(o.provider_scope==="stripe")return[];const{data:s,error:t}=await e.from("coupon_products").select("product_id").eq("coupon_id",o.id);if(t)throw new Error(t.message);const n=(s||[]).map(c=>c.product_id);let r=e.from("products").select("id, freemius_product_id, freemius_plan_id").eq("payment_provider","freemius").not("freemius_product_id","is",null);n.length>0&&(r=r.in("id",n));const{data:u,error:i}=await r;if(i)throw new Error(i.message);const d=new Map;for(const c of u||[]){const a=String(c.freemius_product_id||"").trim();if(!a)continue;const p=d.get(a)??{freemiusProductId:a,productId:c.id,planIds:[]};n.length>0&&c.freemius_plan_id&&p.planIds.push(String(c.freemius_plan_id)),d.set(a,p)}return[...d.values()].map(c=>({...c,planIds:[...new Set(c.planIds)]}))}async function P(e,o){const{data:s}=await e.from("coupon_freemius_mappings").select("sync_status, sync_error").eq("coupon_id",o),t=s||[];if(t.length===0){await e.from("coupons").update({freemius_sync_status:"not_required",freemius_sync_error:null}).eq("id",o);return}const n=t.find(r=>r.sync_status==="failed");await e.from("coupons").update({freemius_sync_status:n?"failed":"synced",freemius_sync_error:n?.sync_error??null}).eq("id",o)}async function q(e){const{data:o,error:s}=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(s||!o)return{success:!1,error:s?.message||"Coupon not found"};const t=o,n=await F(e.client,t);await e.client.from("coupons").update({freemius_sync_status:n.length>0?"pending":"not_required",freemius_sync_error:null}).eq("id",t.id);for(const r of n){const{data:u}=await e.client.from("coupon_freemius_mappings").select("id, freemius_coupon_id").eq("coupon_id",t.id).eq("freemius_product_id",r.freemiusProductId).maybeSingle(),i=g(t,r);try{const d=await l({productId:r.freemiusProductId,method:u?.freemius_coupon_id?"PUT":"POST",couponId:u?.freemius_coupon_id??null,body:i}),c=d?.coupon??d;await e.client.from("coupon_freemius_mappings").upsert({id:u?.id,coupon_id:t.id,product_id:r.productId,freemius_product_id:r.freemiusProductId,freemius_coupon_id:c?.id?String(c.id):u?.freemius_coupon_id??null,freemius_coupon_code:t.code,sync_status:"synced",sync_error:null,remote_payload:d,last_synced_at:new Date().toISOString()},{onConflict:"coupon_id,freemius_product_id"})}catch(d){await e.client.from("coupon_freemius_mappings").upsert({id:u?.id,coupon_id:t.id,product_id:r.productId,freemius_product_id:r.freemiusProductId,freemius_coupon_id:u?.freemius_coupon_id??null,freemius_coupon_code:t.code,sync_status:"failed",sync_error:d.message||"Freemius sync failed",last_synced_at:new Date().toISOString()},{onConflict:"coupon_id,freemius_product_id"})}}return await P(e.client,t.id),{success:!0,targetCount:n.length}}function v(e){const o=(e.sku||"").toUpperCase().replace(/[^A-Z0-9]/g,"");return o?`SALE${o}`.slice(0,32):`SALE${e.productId.replace(/[^A-Za-z0-9]/g,"").toUpperCase()}`.slice(0,32)}function T(e,o){if(typeof e!="number"||e<=0||typeof o!="number"||o<0||o>=e)return null;const s=Math.round((1-o/e)*100);return s<=0||s>100?null:s}async function b(e){const{data:o,error:s}=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(s||!o)return{success:!1,error:s?.message||"Product not found"};const t=o,n=String(t.freemius_product_id||"").trim();if(t.payment_provider!=="freemius"||!n)return{success:!0,skipped:!0,reason:"not_a_freemius_product"};const r=T(t.price,t.sale_price),u=r!==null,{data:i}=await e.client.from("product_freemius_sale_coupons").select("id, freemius_coupon_id, freemius_coupon_code, discount_percent, is_active").eq("product_id",t.id).maybeSingle();if(!u&&!i?.freemius_coupon_id)return i?.id&&await e.client.from("product_freemius_sale_coupons").update({is_active:!1,updated_at:new Date().toISOString()}).eq("id",i.id),{success:!0,active:!1};const d=i?.freemius_coupon_code||v({sku:t.sku,productId:t.id}),c=t.freemius_plan_id?[String(t.freemius_plan_id)]:[],a=r??i?.discount_percent??1,p={id:t.id,code:d,name:`Scheduled sale ${t.sku||t.id}`,discount_type:"percent",discount_amount:a,is_active:u,starts_at:t.sale_start_at,ends_at:t.sale_end_at,redemption_limit:null},S={productId:t.id,planIds:c},w=g(p,S);try{const _=await l({productId:n,method:i?.freemius_coupon_id?"PUT":"POST",couponId:i?.freemius_coupon_id??null,body:w}),m=_?.coupon??_;return await e.client.from("product_freemius_sale_coupons").upsert({id:i?.id,product_id:t.id,freemius_product_id:n,freemius_plan_id:t.freemius_plan_id?String(t.freemius_plan_id):null,freemius_coupon_id:m?.id?String(m.id):i?.freemius_coupon_id??null,freemius_coupon_code:d,discount_percent:r,starts_at:t.sale_start_at,ends_at:t.sale_end_at,is_active:u,sync_status:"synced",sync_error:null,remote_payload:_,last_synced_at:new Date().toISOString()},{onConflict:"product_id"}),{success:!0,active:u,code:d}}catch(_){return await e.client.from("product_freemius_sale_coupons").upsert({id:i?.id,product_id:t.id,freemius_product_id:n,freemius_plan_id:t.freemius_plan_id?String(t.freemius_plan_id):null,freemius_coupon_id:i?.freemius_coupon_id??null,freemius_coupon_code:d,discount_percent:r,starts_at:t.sale_start_at,ends_at:t.sale_end_at,is_active:u,sync_status:"failed",sync_error:_.message||"Freemius sale coupon sync failed",last_synced_at:new Date().toISOString()},{onConflict:"product_id"}),{success:!1,error:_.message||"Freemius sale coupon sync failed"}}}async function D(e){const{data:o}=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(const s of o||[])try{await l({productId:s.freemius_product_id,couponId:s.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",s.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",s.id)}}exports.deleteCouponFromFreemius=D;exports.syncCouponToFreemius=q;exports.syncProductSaleCouponToFreemius=b;
1
+ const e=require("./payment-config.cjs.js"),t=require("./providers/freemius.cjs.js");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,274 +1,257 @@
1
- import { minorUnitAmountToMajor as I } from "@nextblock-cms/utils";
2
- import { resolveFreemiusCheckoutCredentials as S, readFreemiusEnvValue as h } from "./providers/freemius.es.js";
3
- import { hydrateFreemiusEnvFromDb as C } from "./payment-config.es.js";
4
- function f(e) {
5
- if (!e)
6
- return null;
7
- const o = new Date(e);
8
- return Number.isNaN(o.getTime()) ? e : o.toISOString().replace("T", " ").replace(/\.\d{3}Z$/, "");
1
+ import { hydrateFreemiusEnvFromDb as e } from "./payment-config.es.js";
2
+ import { readFreemiusEnvValue as t, resolveFreemiusCheckoutCredentials as n } from "./providers/freemius.es.js";
3
+ import { minorUnitAmountToMajor as r } from "@nextblock-cms/utils";
4
+ //#region libs/ecommerce/src/lib/freemius-coupons.ts
5
+ function i(e) {
6
+ if (!e) return null;
7
+ let t = new Date(e);
8
+ return Number.isNaN(t.getTime()) ? e : t.toISOString().replace("T", " ").replace(/\.\d{3}Z$/, "");
9
9
  }
10
- function E(e) {
11
- return e === "percent" ? "percentage" : "dollar";
10
+ function a(e) {
11
+ return e === "percent" ? "percentage" : "dollar";
12
12
  }
13
- function P(e) {
14
- return S(e).apiKey || h("FREEMIUS_API_KEY");
13
+ function o(e) {
14
+ return n(e).apiKey || t("FREEMIUS_API_KEY");
15
15
  }
16
- async function l(e) {
17
- await C();
18
- const o = P(e.productId);
19
- if (!o)
20
- throw new Error(
21
- `Missing Freemius API bearer token for product ${e.productId}. Set FREEMIUS_API_KEY or FREEMIUS_CHECKOUT_PRODUCTS_JSON[${e.productId}].apiKey.`
22
- );
23
- const s = e.couponId ? `/${e.couponId}` : "", t = await fetch(
24
- `https://api.freemius.com/v1/products/${e.productId}/coupons${s}.json`,
25
- {
26
- method: e.method,
27
- headers: {
28
- Authorization: `Bearer ${o}`,
29
- "Content-Type": "application/json",
30
- Accept: "application/json"
31
- },
32
- body: e.method === "DELETE" ? void 0 : JSON.stringify(e.body || {})
33
- }
34
- ), i = await t.text(), r = i ? JSON.parse(i) : null;
35
- if (!t.ok)
36
- throw new Error(
37
- r?.message || r?.error?.message || `Freemius coupon request failed with ${t.status}`
38
- );
39
- return r;
16
+ async function s(t) {
17
+ await e();
18
+ let n = o(t.productId);
19
+ 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.`);
20
+ let r = t.couponId ? `/${t.couponId}` : "", i = await fetch(`https://api.freemius.com/v1/products/${t.productId}/coupons${r}.json`, {
21
+ method: t.method,
22
+ headers: {
23
+ Authorization: `Bearer ${n}`,
24
+ "Content-Type": "application/json",
25
+ Accept: "application/json"
26
+ },
27
+ body: t.method === "DELETE" ? void 0 : JSON.stringify(t.body || {})
28
+ }), a = await i.text(), s = a ? JSON.parse(a) : null;
29
+ if (!i.ok) throw Error(s?.message || s?.error?.message || `Freemius coupon request failed with ${i.status}`);
30
+ return s;
40
31
  }
41
- function y(e, o) {
42
- return {
43
- code: e.code,
44
- discount: e.discount_type === "fixed" ? I(e.discount_amount, "USD") : e.discount_amount,
45
- discount_type: E(e.discount_type),
46
- plans: o.planIds.length > 0 ? o.planIds.join(",") : null,
47
- licenses: null,
48
- billing_cycles: null,
49
- start_date: f(e.starts_at),
50
- end_date: f(e.ends_at),
51
- redemptions_limit: e.redemption_limit ?? null,
52
- has_renewals_discount: !1,
53
- has_addons_discount: !1,
54
- is_one_per_user: !1,
55
- is_active: e.is_active,
56
- user_type: "all"
57
- };
32
+ function c(e, t) {
33
+ return {
34
+ code: e.code,
35
+ discount: e.discount_type === "fixed" ? r(e.discount_amount, "USD") : e.discount_amount,
36
+ discount_type: a(e.discount_type),
37
+ plans: t.planIds.length > 0 ? t.planIds.join(",") : null,
38
+ licenses: null,
39
+ billing_cycles: null,
40
+ start_date: i(e.starts_at),
41
+ end_date: i(e.ends_at),
42
+ redemptions_limit: e.redemption_limit ?? null,
43
+ has_renewals_discount: !1,
44
+ has_addons_discount: !1,
45
+ is_one_per_user: !1,
46
+ is_active: e.is_active,
47
+ user_type: "all"
48
+ };
58
49
  }
59
- async function q(e, o) {
60
- if (o.provider_scope === "stripe")
61
- return [];
62
- const { data: s, error: t } = await e.from("coupon_products").select("product_id").eq("coupon_id", o.id);
63
- if (t)
64
- throw new Error(t.message);
65
- const i = (s || []).map((c) => c.product_id);
66
- let r = e.from("products").select("id, freemius_product_id, freemius_plan_id").eq("payment_provider", "freemius").not("freemius_product_id", "is", null);
67
- i.length > 0 && (r = r.in("id", i));
68
- const { data: u, error: n } = await r;
69
- if (n)
70
- throw new Error(n.message);
71
- const d = /* @__PURE__ */ new Map();
72
- for (const c of u || []) {
73
- const a = String(c.freemius_product_id || "").trim();
74
- if (!a)
75
- continue;
76
- const p = d.get(a) ?? {
77
- freemiusProductId: a,
78
- productId: c.id,
79
- planIds: []
80
- };
81
- i.length > 0 && c.freemius_plan_id && p.planIds.push(String(c.freemius_plan_id)), d.set(a, p);
82
- }
83
- return [...d.values()].map((c) => ({
84
- ...c,
85
- planIds: [...new Set(c.planIds)]
86
- }));
50
+ async function l(e, t) {
51
+ if (t.provider_scope === "stripe") return [];
52
+ let { data: n, error: r } = await e.from("coupon_products").select("product_id").eq("coupon_id", t.id);
53
+ if (r) throw Error(r.message);
54
+ 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);
55
+ i.length > 0 && (a = a.in("id", i));
56
+ let { data: o, error: s } = await a;
57
+ if (s) throw Error(s.message);
58
+ let c = /* @__PURE__ */ new Map();
59
+ for (let e of o || []) {
60
+ let t = String(e.freemius_product_id || "").trim();
61
+ if (!t) continue;
62
+ let n = c.get(t) ?? {
63
+ freemiusProductId: t,
64
+ productId: e.id,
65
+ planIds: []
66
+ };
67
+ i.length > 0 && e.freemius_plan_id && n.planIds.push(String(e.freemius_plan_id)), c.set(t, n);
68
+ }
69
+ return [...c.values()].map((e) => ({
70
+ ...e,
71
+ planIds: [...new Set(e.planIds)]
72
+ }));
87
73
  }
88
- async function F(e, o) {
89
- const { data: s } = await e.from("coupon_freemius_mappings").select("sync_status, sync_error").eq("coupon_id", o), t = s || [];
90
- if (t.length === 0) {
91
- await e.from("coupons").update({
92
- freemius_sync_status: "not_required",
93
- freemius_sync_error: null
94
- }).eq("id", o);
95
- return;
96
- }
97
- const i = t.find((r) => r.sync_status === "failed");
98
- await e.from("coupons").update({
99
- freemius_sync_status: i ? "failed" : "synced",
100
- freemius_sync_error: i?.sync_error ?? null
101
- }).eq("id", o);
74
+ async function u(e, t) {
75
+ let { data: n } = await e.from("coupon_freemius_mappings").select("sync_status, sync_error").eq("coupon_id", t), r = n || [];
76
+ if (r.length === 0) {
77
+ await e.from("coupons").update({
78
+ freemius_sync_status: "not_required",
79
+ freemius_sync_error: null
80
+ }).eq("id", t);
81
+ return;
82
+ }
83
+ let i = r.find((e) => e.sync_status === "failed");
84
+ await e.from("coupons").update({
85
+ freemius_sync_status: i ? "failed" : "synced",
86
+ freemius_sync_error: i?.sync_error ?? null
87
+ }).eq("id", t);
102
88
  }
103
- async function A(e) {
104
- const { data: o, error: s } = await e.client.from("coupons").select(
105
- "id, code, name, internal_note, provider_scope, discount_type, discount_amount, is_active, starts_at, ends_at, redemption_limit"
106
- ).eq("id", e.couponId).single();
107
- if (s || !o)
108
- return {
109
- success: !1,
110
- error: s?.message || "Coupon not found"
111
- };
112
- const t = o, i = await q(e.client, t);
113
- await e.client.from("coupons").update({
114
- freemius_sync_status: i.length > 0 ? "pending" : "not_required",
115
- freemius_sync_error: null
116
- }).eq("id", t.id);
117
- for (const r of i) {
118
- const { data: u } = await e.client.from("coupon_freemius_mappings").select("id, freemius_coupon_id").eq("coupon_id", t.id).eq("freemius_product_id", r.freemiusProductId).maybeSingle(), n = y(t, r);
119
- try {
120
- const d = await l({
121
- productId: r.freemiusProductId,
122
- method: u?.freemius_coupon_id ? "PUT" : "POST",
123
- couponId: u?.freemius_coupon_id ?? null,
124
- body: n
125
- }), c = d?.coupon ?? d;
126
- await e.client.from("coupon_freemius_mappings").upsert(
127
- {
128
- id: u?.id,
129
- coupon_id: t.id,
130
- product_id: r.productId,
131
- freemius_product_id: r.freemiusProductId,
132
- freemius_coupon_id: c?.id ? String(c.id) : u?.freemius_coupon_id ?? null,
133
- freemius_coupon_code: t.code,
134
- sync_status: "synced",
135
- sync_error: null,
136
- remote_payload: d,
137
- last_synced_at: (/* @__PURE__ */ new Date()).toISOString()
138
- },
139
- { onConflict: "coupon_id,freemius_product_id" }
140
- );
141
- } catch (d) {
142
- await e.client.from("coupon_freemius_mappings").upsert(
143
- {
144
- id: u?.id,
145
- coupon_id: t.id,
146
- product_id: r.productId,
147
- freemius_product_id: r.freemiusProductId,
148
- freemius_coupon_id: u?.freemius_coupon_id ?? null,
149
- freemius_coupon_code: t.code,
150
- sync_status: "failed",
151
- sync_error: d.message || "Freemius sync failed",
152
- last_synced_at: (/* @__PURE__ */ new Date()).toISOString()
153
- },
154
- { onConflict: "coupon_id,freemius_product_id" }
155
- );
156
- }
157
- }
158
- return await F(e.client, t.id), {
159
- success: !0,
160
- targetCount: i.length
161
- };
89
+ async function d(e) {
90
+ 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();
91
+ if (n || !t) return {
92
+ success: !1,
93
+ error: n?.message || "Coupon not found"
94
+ };
95
+ let r = t, i = await l(e.client, r);
96
+ await e.client.from("coupons").update({
97
+ freemius_sync_status: i.length > 0 ? "pending" : "not_required",
98
+ freemius_sync_error: null
99
+ }).eq("id", r.id);
100
+ for (let t of i) {
101
+ 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 = c(r, t);
102
+ try {
103
+ let a = await s({
104
+ productId: t.freemiusProductId,
105
+ method: n?.freemius_coupon_id ? "PUT" : "POST",
106
+ couponId: n?.freemius_coupon_id ?? null,
107
+ body: i
108
+ }), o = a?.coupon ?? a;
109
+ await e.client.from("coupon_freemius_mappings").upsert({
110
+ id: n?.id,
111
+ coupon_id: r.id,
112
+ product_id: t.productId,
113
+ freemius_product_id: t.freemiusProductId,
114
+ freemius_coupon_id: o?.id ? String(o.id) : n?.freemius_coupon_id ?? null,
115
+ freemius_coupon_code: r.code,
116
+ sync_status: "synced",
117
+ sync_error: null,
118
+ remote_payload: a,
119
+ last_synced_at: (/* @__PURE__ */ new Date()).toISOString()
120
+ }, { onConflict: "coupon_id,freemius_product_id" });
121
+ } catch (i) {
122
+ await e.client.from("coupon_freemius_mappings").upsert({
123
+ id: n?.id,
124
+ coupon_id: r.id,
125
+ product_id: t.productId,
126
+ freemius_product_id: t.freemiusProductId,
127
+ freemius_coupon_id: n?.freemius_coupon_id ?? null,
128
+ freemius_coupon_code: r.code,
129
+ sync_status: "failed",
130
+ sync_error: i.message || "Freemius sync failed",
131
+ last_synced_at: (/* @__PURE__ */ new Date()).toISOString()
132
+ }, { onConflict: "coupon_id,freemius_product_id" });
133
+ }
134
+ }
135
+ return await u(e.client, r.id), {
136
+ success: !0,
137
+ targetCount: i.length
138
+ };
162
139
  }
163
- function v(e) {
164
- const o = (e.sku || "").toUpperCase().replace(/[^A-Z0-9]/g, "");
165
- return o ? `SALE${o}`.slice(0, 32) : `SALE${e.productId.replace(/[^A-Za-z0-9]/g, "").toUpperCase()}`.slice(0, 32);
140
+ function f(e) {
141
+ let t = (e.sku || "").toUpperCase().replace(/[^A-Z0-9]/g, "");
142
+ return t ? `SALE${t}`.slice(0, 32) : `SALE${e.productId.replace(/[^A-Za-z0-9]/g, "").toUpperCase()}`.slice(0, 32);
166
143
  }
167
- function D(e, o) {
168
- if (typeof e != "number" || e <= 0 || typeof o != "number" || o < 0 || o >= e)
169
- return null;
170
- const s = Math.round((1 - o / e) * 100);
171
- return s <= 0 || s > 100 ? null : s;
144
+ function p(e, t) {
145
+ if (typeof e != "number" || e <= 0 || typeof t != "number" || t < 0 || t >= e) return null;
146
+ let n = Math.round((1 - t / e) * 100);
147
+ return n <= 0 || n > 100 ? null : n;
172
148
  }
173
- async function U(e) {
174
- const { data: o, error: s } = await e.client.from("products").select(
175
- "id, sku, price, sale_price, sale_start_at, sale_end_at, payment_provider, freemius_product_id, freemius_plan_id"
176
- ).eq("id", e.productId).maybeSingle();
177
- if (s || !o)
178
- return { success: !1, error: s?.message || "Product not found" };
179
- const t = o, i = String(t.freemius_product_id || "").trim();
180
- if (t.payment_provider !== "freemius" || !i)
181
- return { success: !0, skipped: !0, reason: "not_a_freemius_product" };
182
- const r = D(t.price, t.sale_price), u = r !== null, { data: n } = await e.client.from("product_freemius_sale_coupons").select("id, freemius_coupon_id, freemius_coupon_code, discount_percent, is_active").eq("product_id", t.id).maybeSingle();
183
- if (!u && !n?.freemius_coupon_id)
184
- return n?.id && await e.client.from("product_freemius_sale_coupons").update({ is_active: !1, updated_at: (/* @__PURE__ */ new Date()).toISOString() }).eq("id", n.id), { success: !0, active: !1 };
185
- const d = n?.freemius_coupon_code || v({ sku: t.sku, productId: t.id }), c = t.freemius_plan_id ? [String(t.freemius_plan_id)] : [], a = r ?? n?.discount_percent ?? 1, p = {
186
- id: t.id,
187
- code: d,
188
- name: `Scheduled sale ${t.sku || t.id}`,
189
- discount_type: "percent",
190
- discount_amount: a,
191
- is_active: u,
192
- starts_at: t.sale_start_at,
193
- ends_at: t.sale_end_at,
194
- redemption_limit: null
195
- }, g = {
196
- productId: t.id,
197
- planIds: c
198
- }, w = y(p, g);
199
- try {
200
- const _ = await l({
201
- productId: i,
202
- method: n?.freemius_coupon_id ? "PUT" : "POST",
203
- couponId: n?.freemius_coupon_id ?? null,
204
- body: w
205
- }), m = _?.coupon ?? _;
206
- return await e.client.from("product_freemius_sale_coupons").upsert(
207
- {
208
- id: n?.id,
209
- product_id: t.id,
210
- freemius_product_id: i,
211
- freemius_plan_id: t.freemius_plan_id ? String(t.freemius_plan_id) : null,
212
- freemius_coupon_id: m?.id ? String(m.id) : n?.freemius_coupon_id ?? null,
213
- freemius_coupon_code: d,
214
- discount_percent: r,
215
- starts_at: t.sale_start_at,
216
- ends_at: t.sale_end_at,
217
- is_active: u,
218
- sync_status: "synced",
219
- sync_error: null,
220
- remote_payload: _,
221
- last_synced_at: (/* @__PURE__ */ new Date()).toISOString()
222
- },
223
- { onConflict: "product_id" }
224
- ), { success: !0, active: u, code: d };
225
- } catch (_) {
226
- return await e.client.from("product_freemius_sale_coupons").upsert(
227
- {
228
- id: n?.id,
229
- product_id: t.id,
230
- freemius_product_id: i,
231
- freemius_plan_id: t.freemius_plan_id ? String(t.freemius_plan_id) : null,
232
- freemius_coupon_id: n?.freemius_coupon_id ?? null,
233
- freemius_coupon_code: d,
234
- discount_percent: r,
235
- starts_at: t.sale_start_at,
236
- ends_at: t.sale_end_at,
237
- is_active: u,
238
- sync_status: "failed",
239
- sync_error: _.message || "Freemius sale coupon sync failed",
240
- last_synced_at: (/* @__PURE__ */ new Date()).toISOString()
241
- },
242
- { onConflict: "product_id" }
243
- ), {
244
- success: !1,
245
- error: _.message || "Freemius sale coupon sync failed"
246
- };
247
- }
149
+ async function m(e) {
150
+ 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();
151
+ if (n || !t) return {
152
+ success: !1,
153
+ error: n?.message || "Product not found"
154
+ };
155
+ let r = t, i = String(r.freemius_product_id || "").trim();
156
+ if (r.payment_provider !== "freemius" || !i) return {
157
+ success: !0,
158
+ skipped: !0,
159
+ reason: "not_a_freemius_product"
160
+ };
161
+ let a = p(r.price, r.sale_price), o = 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();
162
+ if (!o && !l?.freemius_coupon_id) return l?.id && await e.client.from("product_freemius_sale_coupons").update({
163
+ is_active: !1,
164
+ updated_at: (/* @__PURE__ */ new Date()).toISOString()
165
+ }).eq("id", l.id), {
166
+ success: !0,
167
+ active: !1
168
+ };
169
+ let u = l?.freemius_coupon_code || f({
170
+ sku: r.sku,
171
+ productId: r.id
172
+ }), d = r.freemius_plan_id ? [String(r.freemius_plan_id)] : [], m = a ?? l?.discount_percent ?? 1, h = c({
173
+ id: r.id,
174
+ code: u,
175
+ name: `Scheduled sale ${r.sku || r.id}`,
176
+ provider_scope: "freemius",
177
+ discount_type: "percent",
178
+ discount_amount: m,
179
+ is_active: o,
180
+ starts_at: r.sale_start_at,
181
+ ends_at: r.sale_end_at,
182
+ redemption_limit: null
183
+ }, {
184
+ freemiusProductId: i,
185
+ productId: r.id,
186
+ planIds: d
187
+ });
188
+ try {
189
+ let t = await s({
190
+ productId: i,
191
+ method: l?.freemius_coupon_id ? "PUT" : "POST",
192
+ couponId: l?.freemius_coupon_id ?? null,
193
+ body: h
194
+ }), n = t?.coupon ?? t;
195
+ return await e.client.from("product_freemius_sale_coupons").upsert({
196
+ id: l?.id,
197
+ product_id: r.id,
198
+ freemius_product_id: i,
199
+ freemius_plan_id: r.freemius_plan_id ? String(r.freemius_plan_id) : null,
200
+ freemius_coupon_id: n?.id ? String(n.id) : l?.freemius_coupon_id ?? null,
201
+ freemius_coupon_code: u,
202
+ discount_percent: a,
203
+ starts_at: r.sale_start_at,
204
+ ends_at: r.sale_end_at,
205
+ is_active: o,
206
+ sync_status: "synced",
207
+ sync_error: null,
208
+ remote_payload: t,
209
+ last_synced_at: (/* @__PURE__ */ new Date()).toISOString()
210
+ }, { onConflict: "product_id" }), {
211
+ success: !0,
212
+ active: o,
213
+ code: u
214
+ };
215
+ } catch (t) {
216
+ return await e.client.from("product_freemius_sale_coupons").upsert({
217
+ id: l?.id,
218
+ product_id: r.id,
219
+ freemius_product_id: i,
220
+ freemius_plan_id: r.freemius_plan_id ? String(r.freemius_plan_id) : null,
221
+ freemius_coupon_id: l?.freemius_coupon_id ?? null,
222
+ freemius_coupon_code: u,
223
+ discount_percent: a,
224
+ starts_at: r.sale_start_at,
225
+ ends_at: r.sale_end_at,
226
+ is_active: o,
227
+ sync_status: "failed",
228
+ sync_error: t.message || "Freemius sale coupon sync failed",
229
+ last_synced_at: (/* @__PURE__ */ new Date()).toISOString()
230
+ }, { onConflict: "product_id" }), {
231
+ success: !1,
232
+ error: t.message || "Freemius sale coupon sync failed"
233
+ };
234
+ }
248
235
  }
249
- async function $(e) {
250
- const { data: o } = 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);
251
- for (const s of o || [])
252
- try {
253
- await l({
254
- productId: s.freemius_product_id,
255
- couponId: s.freemius_coupon_id,
256
- method: "DELETE"
257
- }), await e.client.from("coupon_freemius_mappings").update({
258
- sync_status: "deleted",
259
- sync_error: null,
260
- updated_at: (/* @__PURE__ */ new Date()).toISOString()
261
- }).eq("id", s.id);
262
- } catch (t) {
263
- await e.client.from("coupon_freemius_mappings").update({
264
- sync_status: "failed",
265
- sync_error: t.message || "Freemius delete failed",
266
- updated_at: (/* @__PURE__ */ new Date()).toISOString()
267
- }).eq("id", s.id);
268
- }
236
+ async function h(e) {
237
+ 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);
238
+ for (let n of t || []) try {
239
+ await s({
240
+ productId: n.freemius_product_id,
241
+ couponId: n.freemius_coupon_id,
242
+ method: "DELETE"
243
+ }), await e.client.from("coupon_freemius_mappings").update({
244
+ sync_status: "deleted",
245
+ sync_error: null,
246
+ updated_at: (/* @__PURE__ */ new Date()).toISOString()
247
+ }).eq("id", n.id);
248
+ } catch (t) {
249
+ await e.client.from("coupon_freemius_mappings").update({
250
+ sync_status: "failed",
251
+ sync_error: t.message || "Freemius delete failed",
252
+ updated_at: (/* @__PURE__ */ new Date()).toISOString()
253
+ }).eq("id", n.id);
254
+ }
269
255
  }
270
- export {
271
- $ as deleteCouponFromFreemius,
272
- A as syncCouponToFreemius,
273
- U as syncProductSaleCouponToFreemius
274
- };
256
+ //#endregion
257
+ export { h as deleteCouponFromFreemius, d as syncCouponToFreemius, m as syncProductSaleCouponToFreemius };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const _=require("@freemius/sdk"),p=require("./payment-config.cjs.js"),E=require("./providers/freemius.cjs.js"),l=20,c="This license cannot be claimed automatically. Use the key from your purchase email.";function m(r){if(!r||typeof r!="string")return null;const e=r.trim(),s=/(?:z|[+-]\d{2}:?\d{2})$/i.test(e)?e:`${e.replace(" ","T")}Z`,i=Date.parse(s);return Number.isFinite(i)?i:null}function o(r,e){return r==null||e===null||e===void 0?!1:String(r).trim()===String(e).trim()}function u(r){return(r??"").trim().toLowerCase()}function d(r){const{license:e,request:n,user:s}=r,i=r.maxAgeMinutes??l,a=(r.now??new Date).getTime();if(!e||!o(e.id,n.licenseId))return{ok:!1,reason:"license_not_found"};const t=m(e.created);return t===null||a-t>i*6e4||t-a>5*6e4?{ok:!1,reason:"too_old"}:o(e.plugin_id,n.productId)?e.is_cancelled?{ok:!1,reason:"cancelled"}:!n.userId?.trim()||!o(e.user_id,n.userId)?{ok:!1,reason:"user_mismatch"}:!s||!u(n.email)||u(s.email)!==u(n.email)?{ok:!1,reason:"email_mismatch"}:typeof e.activated=="number"&&e.activated>0?{ok:!1,reason:"already_activated"}:e.secret_key?{ok:!0}:{ok:!1,reason:"no_key"}:{ok:!1,reason:"product_mismatch"}}async function y(r,e){await p.hydrateFreemiusEnvFromDb();const n=E.resolveFreemiusCheckoutCredentials(r.productId);if(!n.apiKey||!n.secretKey||!n.publicKey)return{error:"The license service is not configured for this product.",ok:!1,reason:"not_configured",status:503};const s=new _.Freemius({apiKey:n.apiKey,productId:Number(r.productId),publicKey:n.publicKey,secretKey:n.secretKey});let i=null,a=null;try{i=await s.api.license.retrieve(r.licenseId),i?.user_id!==null&&i?.user_id!==void 0&&(a=await s.api.user.retrieve(String(i.user_id)))}catch(f){return console.error("[Freemius License Claim] Freemius lookup failed:",f),{error:"Freemius could not be reached to verify the license.",ok:!1,reason:"upstream_error",status:502}}const t=d({license:i,maxAgeMinutes:e?.maxAgeMinutes,now:e?.now,request:r,user:a});return t.ok?{expiration:i?.expiration??null,licenseKey:String(i?.secret_key),ok:!0,planId:i?.plan_id!==null&&i?.plan_id!==void 0?String(i.plan_id):null}:{error:c,ok:!1,reason:t.reason,status:403}}exports.FREEMIUS_LICENSE_CLAIM_MAX_AGE_MINUTES=l;exports.FREEMIUS_LICENSE_CLAIM_REFUSED_MESSAGE=c;exports.claimFreemiusLicenseKey=y;exports.evaluateFreemiusLicenseClaim=d;exports.parseFreemiusTimestamp=m;
1
+ const e=require("./payment-config.cjs.js"),t=require("./providers/freemius.cjs.js");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;