@nextblock-cms/ecom 0.21.0 → 0.21.2
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.
- package/README.md +43 -0
- package/index.cjs +1 -0
- package/lib/CurrencyProvider.cjs +1 -0
- package/lib/CurrencyProvider.es.js +1 -1
- package/lib/PaymentReadinessProvider.cjs +1 -0
- package/lib/PaymentReadinessProvider.es.js +1 -1
- package/lib/cart-store.cjs +1 -0
- package/lib/cart-store.es.js +1 -1
- package/lib/components/AccountNavigationMenu.cjs +1 -0
- package/lib/components/AccountNavigationMenu.es.js +1 -1
- package/lib/components/AddToCartButton.cjs +1 -0
- package/lib/components/AddToCartButton.es.js +1 -1
- package/lib/components/Cart.cjs +1 -0
- package/lib/components/Cart.es.js +1 -1
- package/lib/components/CartDrawer.cjs +1 -0
- package/lib/components/CartDrawer.es.js +1 -1
- package/lib/components/CartIcon.cjs +1 -0
- package/lib/components/CartIcon.es.js +1 -1
- package/lib/components/Checkout.cjs +1 -0
- package/lib/components/Checkout.es.js +1 -1
- package/lib/components/CouponForm.cjs +1 -0
- package/lib/components/CouponForm.es.js +1 -1
- package/lib/components/CurrencySwitcher.cjs +1 -0
- package/lib/components/CurrencySwitcher.es.js +1 -1
- package/lib/components/CustomerProfileForm.cjs +1 -0
- package/lib/components/CustomerProfileForm.es.js +1 -1
- package/lib/components/FeaturedProduct.cjs +1 -0
- package/lib/components/FeaturedProduct.es.js +1 -1
- package/lib/components/FreemiusLicensePanel.cjs +1 -0
- package/lib/components/FreemiusLicensePanel.es.js +1 -1
- package/lib/components/InvoiceDocument.cjs +1 -0
- package/lib/components/InvoiceDocument.es.js +1 -1
- package/lib/components/{InvoiceViewerShell.cjs.js → InvoiceViewerShell.cjs} +1 -1
- package/lib/components/InvoiceViewerShell.es.js +1 -1
- package/lib/components/ProductCard.cjs +1 -0
- package/lib/components/ProductCard.es.js +1 -1
- package/lib/components/ProductDetailsLayout.cjs +1 -0
- package/lib/components/ProductDetailsLayout.es.js +1 -1
- package/lib/components/ProductGallery.cjs +1 -0
- package/lib/components/ProductGallery.es.js +1 -1
- package/lib/components/ProductGrid.cjs +1 -0
- package/lib/components/ProductGrid.es.js +1 -1
- package/lib/components/ShippingEstimator.cjs +1 -0
- package/lib/components/ShippingEstimator.es.js +1 -1
- package/lib/components/ShortDescription.cjs +1 -0
- package/lib/components/ShortDescription.es.js +1 -1
- package/lib/components/SimpleTiptapRenderer.cjs +1 -0
- package/lib/components/SimpleTiptapRenderer.es.js +1 -1
- package/lib/components/SubscriptionSelector.cjs +1 -0
- package/lib/components/SubscriptionSelector.es.js +1 -1
- package/lib/countries.es.js +1 -1
- package/lib/coupon-server.cjs +1 -0
- package/lib/coupon-server.es.js +1 -1
- package/lib/coupons.es.js +1 -1
- package/lib/currency-constants.es.js +1 -1
- package/lib/currency-rest-client.es.js +1 -1
- package/lib/currency-store.es.js +1 -1
- package/lib/currency-sync.cjs +1 -0
- package/lib/currency-sync.es.js +1 -1
- package/lib/currency.es.js +1 -1
- package/lib/customer-addresses.cjs +1 -0
- package/lib/customer-addresses.es.js +1 -1
- package/lib/customer-orders.cjs +1 -0
- package/lib/customer-orders.es.js +1 -1
- package/lib/customer.cjs +1 -0
- package/lib/customer.es.js +1 -1
- package/lib/export-helpers.cjs +1 -0
- package/lib/export-helpers.es.js +1 -1
- package/lib/factory.cjs +1 -0
- package/lib/factory.es.js +1 -1
- package/lib/freemius-coupons.cjs +1 -0
- package/lib/freemius-coupons.es.js +1 -1
- package/lib/freemius-license-claim.cjs +1 -0
- package/lib/freemius-license-claim.es.js +1 -1
- package/lib/freemius-license.cjs +1 -0
- package/lib/freemius-license.es.js +1 -1
- package/lib/freemius-order-sync.cjs +1 -0
- package/lib/freemius-order-sync.es.js +1 -1
- package/lib/freemius-trial-provision.cjs +1 -0
- package/lib/freemius-trial-provision.es.js +1 -1
- package/lib/inventory-settings.es.js +1 -1
- package/lib/{invoice-server.cjs.js → invoice-server.cjs} +1 -1
- package/lib/invoice-server.es.js +1 -1
- package/lib/invoice-ui.es.js +1 -1
- package/lib/invoice.es.js +1 -1
- package/lib/{order-inventory.cjs.js → order-inventory.cjs} +1 -1
- package/lib/order-inventory.es.js +1 -1
- package/lib/order-tax-details.es.js +1 -1
- package/lib/pages/cms/coupons/CouponEditorForm.cjs +1 -0
- package/lib/pages/cms/coupons/CouponEditorForm.es.js +1 -1
- package/lib/pages/cms/coupons/{CouponsPage.cjs.js → CouponsPage.cjs} +1 -1
- package/lib/pages/cms/coupons/CouponsPage.es.js +1 -1
- package/lib/pages/cms/coupons/CreateCouponDialog.cjs +1 -0
- package/lib/pages/cms/coupons/CreateCouponDialog.es.js +1 -1
- package/lib/pages/cms/coupons/EditCouponPage.cjs +1 -0
- package/lib/pages/cms/coupons/EditCouponPage.es.js +1 -1
- package/lib/pages/cms/coupons/ProductScopePicker.es.js +1 -1
- package/lib/pages/cms/coupons/actions.cjs +1 -0
- package/lib/pages/cms/coupons/actions.es.js +1 -1
- package/lib/pages/cms/coupons/index.cjs +1 -0
- package/lib/pages/cms/coupons/product-options.es.js +1 -1
- package/lib/pages/cms/orders/ExportReportsDialog.cjs +1 -0
- package/lib/pages/cms/orders/ExportReportsDialog.es.js +1 -1
- package/lib/pages/cms/orders/OrderDetailPage.cjs +1 -0
- package/lib/pages/cms/orders/OrderDetailPage.es.js +1 -1
- package/lib/pages/cms/orders/OrderPrintButton.es.js +1 -1
- package/lib/pages/cms/orders/OrderStatusForm.cjs +1 -0
- package/lib/pages/cms/orders/OrderStatusForm.es.js +1 -1
- package/lib/pages/cms/orders/OrdersPage.cjs +1 -0
- package/lib/pages/cms/orders/OrdersPage.es.js +1 -1
- package/lib/pages/cms/orders/actions.es.js +1 -1
- package/lib/pages/cms/orders/export-actions.es.js +1 -1
- package/lib/pages/cms/orders/index.cjs +1 -0
- package/lib/pages/cms/orders/server-actions.cjs +1 -0
- package/lib/pages/cms/orders/server-actions.es.js +1 -1
- package/lib/pages/cms/payments/PaymentsClient.es.js +1 -1
- package/lib/pages/cms/payments/PaymentsPage.cjs +1 -0
- package/lib/pages/cms/payments/PaymentsPage.es.js +1 -1
- package/lib/pages/cms/payments/actions.cjs +1 -0
- package/lib/pages/cms/payments/actions.es.js +1 -1
- package/lib/pages/cms/payments/index.cjs +1 -0
- package/lib/pages/cms/payments/queries.cjs +1 -0
- package/lib/pages/cms/payments/queries.es.js +1 -1
- package/lib/pages/cms/products/ProductsPage.cjs +1 -0
- package/lib/pages/cms/products/ProductsPage.es.js +1 -1
- package/lib/pages/cms/products/[id]/edit/EditProductPage.cjs +1 -0
- package/lib/pages/cms/products/{_id_ → [id]}/edit/EditProductPage.es.js +1 -1
- package/lib/pages/cms/products/{actions.cjs.js → actions.cjs} +1 -1
- package/lib/pages/cms/products/actions.es.js +1 -1
- package/lib/pages/cms/products/attributes/AttributeManagementPage.cjs +1 -0
- package/lib/pages/cms/products/attributes/AttributeManagementPage.es.js +1 -1
- package/lib/pages/cms/products/attributes/components/AttributeManager.es.js +1 -1
- package/lib/pages/cms/products/categories/CategoryManagementPage.cjs +1 -0
- package/lib/pages/cms/products/categories/CategoryManagementPage.es.js +1 -1
- package/lib/pages/cms/products/categories/components/CategoryManager.cjs +1 -0
- package/lib/pages/cms/products/categories/components/CategoryManager.es.js +1 -1
- package/lib/pages/cms/products/components/CopyProductFromLanguage.cjs +1 -0
- package/lib/pages/cms/products/components/CopyProductFromLanguage.es.js +1 -1
- package/lib/pages/cms/products/components/CurrencyPriceFields.cjs +1 -0
- package/lib/pages/cms/products/components/CurrencyPriceFields.es.js +1 -1
- package/lib/pages/cms/products/components/DeleteProductButton.es.js +1 -1
- package/lib/pages/cms/products/components/FreemiusPricingDashboard.cjs +1 -0
- package/lib/pages/cms/products/components/FreemiusPricingDashboard.es.js +1 -1
- package/lib/pages/cms/products/components/ProductCategorySelector.cjs +1 -0
- package/lib/pages/cms/products/components/ProductCategorySelector.es.js +1 -1
- package/lib/pages/cms/products/components/ProductForm.cjs +1 -0
- package/lib/pages/cms/products/components/ProductForm.es.js +1 -1
- package/lib/pages/cms/products/components/ProductMediaManager.cjs +1 -0
- package/lib/pages/cms/products/components/ProductMediaManager.es.js +1 -1
- package/lib/pages/cms/products/components/ProductsBulkTable.cjs +1 -0
- package/lib/pages/cms/products/components/ProductsBulkTable.es.js +1 -1
- package/lib/pages/cms/products/components/SaleScheduleFields.es.js +1 -1
- package/lib/pages/cms/products/components/SyncFreemiusButton.cjs +1 -0
- package/lib/pages/cms/products/components/SyncFreemiusButton.es.js +1 -1
- package/lib/pages/cms/products/components/{SyncFreemiusPricingButton.cjs.js → SyncFreemiusPricingButton.cjs} +1 -1
- package/lib/pages/cms/products/components/SyncFreemiusPricingButton.es.js +1 -1
- package/lib/pages/cms/products/components/VariationsEditor.cjs +1 -0
- package/lib/pages/cms/products/components/VariationsEditor.es.js +1 -1
- package/lib/pages/cms/products/index.cjs +1 -0
- package/lib/pages/cms/products/index.es.js +1 -1
- package/lib/pages/cms/products/inventory/InventoryPage.cjs +1 -0
- package/lib/pages/cms/products/inventory/InventoryPage.es.js +1 -1
- package/lib/pages/cms/products/inventory/{InventoryTableClient.cjs.js → InventoryTableClient.cjs} +1 -1
- package/lib/pages/cms/products/inventory/InventoryTableClient.es.js +1 -1
- package/lib/pages/cms/products/inventory/{actions.cjs.js → actions.cjs} +1 -1
- package/lib/pages/cms/products/inventory/actions.es.js +1 -1
- package/lib/pages/cms/products/new/NewProductPage.cjs +1 -0
- package/lib/pages/cms/products/new/NewProductPage.es.js +1 -1
- package/lib/pages/cms/products/product-price-sync.cjs +1 -0
- package/lib/pages/cms/products/product-price-sync.es.js +1 -1
- package/lib/pages/cms/products/server-actions.cjs +1 -0
- package/lib/pages/cms/products/server-actions.es.js +1 -1
- package/lib/pages/cms/shipping/{ShippingPage.cjs.js → ShippingPage.cjs} +1 -1
- package/lib/pages/cms/shipping/ShippingPage.es.js +1 -1
- package/lib/pages/cms/shipping/components/RateForm.cjs +1 -0
- package/lib/pages/cms/shipping/components/RateForm.es.js +1 -1
- package/lib/pages/cms/shipping/components/ZoneForm.cjs +1 -0
- package/lib/pages/cms/shipping/components/ZoneForm.es.js +1 -1
- package/lib/pages/cms/shipping/index.cjs +1 -0
- package/lib/pages/cms/shipping/server-actions.cjs +1 -0
- package/lib/pages/cms/shipping/server-actions.es.js +1 -1
- package/lib/pages/cms/taxes/TaxesPage.cjs +1 -0
- package/lib/pages/cms/taxes/TaxesPage.es.js +1 -1
- package/lib/pages/cms/taxes/actions.cjs +1 -0
- package/lib/pages/cms/taxes/actions.es.js +1 -1
- package/lib/pages/cms/taxes/components/TaxRateForm.cjs +1 -0
- package/lib/pages/cms/taxes/components/TaxRateForm.es.js +1 -1
- package/lib/pages/cms/taxes/index.cjs +1 -0
- package/lib/payment-config.es.js +1 -1
- package/lib/{product-actions.cjs.js → product-actions.cjs} +1 -1
- package/lib/product-actions.es.js +1 -1
- package/lib/product-context.cjs +1 -0
- package/lib/product-context.es.js +1 -1
- package/lib/product-schema.cjs +1 -0
- package/lib/product-schema.es.js +1 -1
- package/lib/providers/freemius.cjs +1 -0
- package/lib/providers/freemius.es.js +1 -1
- package/lib/providers/stripe.cjs +1 -0
- package/lib/providers/stripe.es.js +1 -1
- package/lib/server-actions/coupon-actions.cjs +1 -0
- package/lib/server-actions/coupon-actions.es.js +1 -1
- package/lib/server-actions/customer-actions.cjs +1 -0
- package/lib/server-actions/customer-actions.es.js +1 -1
- package/lib/server-actions/product-actions.cjs +1 -0
- package/lib/server-actions/product-actions.es.js +1 -1
- package/lib/server-actions/shipping-actions.cjs +1 -0
- package/lib/server-actions/shipping-actions.es.js +1 -1
- package/lib/server-actions/tax-actions.cjs +1 -0
- package/lib/server-actions/tax-actions.es.js +1 -1
- package/lib/shared-inventory.es.js +1 -1
- package/lib/shipping/{resolver.cjs.js → resolver.cjs} +1 -1
- package/lib/shipping/resolver.es.js +1 -1
- package/lib/shipping-rate-currency.cjs +1 -0
- package/lib/shipping-rate-currency.es.js +1 -1
- package/lib/states.cjs +1 -0
- package/lib/stripe/checkout.cjs +1 -0
- package/lib/stripe/checkout.es.js +1 -1
- package/lib/stripe/client.cjs +1 -0
- package/lib/stripe/client.es.js +1 -1
- package/lib/stripe/order-sync.cjs +1 -0
- package/lib/stripe/order-sync.es.js +1 -1
- package/lib/stripe/webhooks.cjs +1 -0
- package/lib/stripe/webhooks.es.js +1 -1
- package/lib/tax-calculation.cjs +1 -0
- package/lib/tax-calculation.es.js +1 -1
- package/lib/trials.es.js +1 -1
- package/lib/types.es.js +1 -1
- package/lib/use-cart.cjs +1 -0
- package/lib/use-cart.es.js +1 -1
- package/lib/use-price-formatter.es.js +1 -1
- package/lib/variation-utils.cjs +1 -0
- package/lib/variation-utils.es.js +1 -1
- package/lib/zod-config.es.js +1 -1
- package/package.json +10 -9
- package/server.cjs +1 -0
- package/server.es.js +1 -1
- package/index.cjs.js +0 -1
- package/lib/CurrencyProvider.cjs.js +0 -1
- package/lib/PaymentReadinessProvider.cjs.js +0 -1
- package/lib/cart-store.cjs.js +0 -1
- package/lib/components/AccountNavigationMenu.cjs.js +0 -1
- package/lib/components/AddToCartButton.cjs.js +0 -1
- package/lib/components/Cart.cjs.js +0 -1
- package/lib/components/CartDrawer.cjs.js +0 -1
- package/lib/components/CartIcon.cjs.js +0 -1
- package/lib/components/Checkout.cjs.js +0 -1
- package/lib/components/CouponForm.cjs.js +0 -1
- package/lib/components/CurrencySwitcher.cjs.js +0 -1
- package/lib/components/CustomerProfileForm.cjs.js +0 -1
- package/lib/components/FeaturedProduct.cjs.js +0 -1
- package/lib/components/FreemiusLicensePanel.cjs.js +0 -1
- package/lib/components/InvoiceDocument.cjs.js +0 -1
- package/lib/components/ProductCard.cjs.js +0 -1
- package/lib/components/ProductDetailsLayout.cjs.js +0 -1
- package/lib/components/ProductGallery.cjs.js +0 -1
- package/lib/components/ProductGrid.cjs.js +0 -1
- package/lib/components/ShippingEstimator.cjs.js +0 -1
- package/lib/components/ShortDescription.cjs.js +0 -1
- package/lib/components/SimpleTiptapRenderer.cjs.js +0 -1
- package/lib/components/SubscriptionSelector.cjs.js +0 -1
- package/lib/coupon-server.cjs.js +0 -1
- package/lib/currency-sync.cjs.js +0 -1
- package/lib/customer-addresses.cjs.js +0 -1
- package/lib/customer-orders.cjs.js +0 -1
- package/lib/customer.cjs.js +0 -1
- package/lib/export-helpers.cjs.js +0 -1
- package/lib/factory.cjs.js +0 -1
- package/lib/freemius-coupons.cjs.js +0 -1
- package/lib/freemius-license-claim.cjs.js +0 -1
- package/lib/freemius-license.cjs.js +0 -1
- package/lib/freemius-order-sync.cjs.js +0 -1
- package/lib/freemius-trial-provision.cjs.js +0 -1
- package/lib/pages/cms/coupons/CouponEditorForm.cjs.js +0 -1
- package/lib/pages/cms/coupons/CreateCouponDialog.cjs.js +0 -1
- package/lib/pages/cms/coupons/EditCouponPage.cjs.js +0 -1
- package/lib/pages/cms/coupons/actions.cjs.js +0 -1
- package/lib/pages/cms/coupons/index.cjs.js +0 -1
- package/lib/pages/cms/orders/ExportReportsDialog.cjs.js +0 -1
- package/lib/pages/cms/orders/OrderDetailPage.cjs.js +0 -1
- package/lib/pages/cms/orders/OrderStatusForm.cjs.js +0 -1
- package/lib/pages/cms/orders/OrdersPage.cjs.js +0 -1
- package/lib/pages/cms/orders/index.cjs.js +0 -1
- package/lib/pages/cms/orders/server-actions.cjs.js +0 -1
- package/lib/pages/cms/payments/PaymentsPage.cjs.js +0 -1
- package/lib/pages/cms/payments/actions.cjs.js +0 -1
- package/lib/pages/cms/payments/index.cjs.js +0 -1
- package/lib/pages/cms/payments/queries.cjs.js +0 -1
- package/lib/pages/cms/products/ProductsPage.cjs.js +0 -1
- package/lib/pages/cms/products/_id_/edit/EditProductPage.cjs.js +0 -1
- package/lib/pages/cms/products/attributes/AttributeManagementPage.cjs.js +0 -1
- package/lib/pages/cms/products/categories/CategoryManagementPage.cjs.js +0 -1
- package/lib/pages/cms/products/categories/components/CategoryManager.cjs.js +0 -1
- package/lib/pages/cms/products/components/CopyProductFromLanguage.cjs.js +0 -1
- package/lib/pages/cms/products/components/CurrencyPriceFields.cjs.js +0 -1
- package/lib/pages/cms/products/components/FreemiusPricingDashboard.cjs.js +0 -1
- package/lib/pages/cms/products/components/ProductCategorySelector.cjs.js +0 -1
- package/lib/pages/cms/products/components/ProductForm.cjs.js +0 -1
- package/lib/pages/cms/products/components/ProductMediaManager.cjs.js +0 -1
- package/lib/pages/cms/products/components/ProductsBulkTable.cjs.js +0 -1
- package/lib/pages/cms/products/components/SyncFreemiusButton.cjs.js +0 -1
- package/lib/pages/cms/products/components/VariationsEditor.cjs.js +0 -1
- package/lib/pages/cms/products/index.cjs.js +0 -1
- package/lib/pages/cms/products/inventory/InventoryPage.cjs.js +0 -1
- package/lib/pages/cms/products/new/NewProductPage.cjs.js +0 -1
- package/lib/pages/cms/products/product-price-sync.cjs.js +0 -1
- package/lib/pages/cms/products/server-actions.cjs.js +0 -1
- package/lib/pages/cms/shipping/components/RateForm.cjs.js +0 -1
- package/lib/pages/cms/shipping/components/ZoneForm.cjs.js +0 -1
- package/lib/pages/cms/shipping/index.cjs.js +0 -1
- package/lib/pages/cms/shipping/server-actions.cjs.js +0 -1
- package/lib/pages/cms/taxes/TaxesPage.cjs.js +0 -1
- package/lib/pages/cms/taxes/actions.cjs.js +0 -1
- package/lib/pages/cms/taxes/components/TaxRateForm.cjs.js +0 -1
- package/lib/pages/cms/taxes/index.cjs.js +0 -1
- package/lib/product-context.cjs.js +0 -1
- package/lib/product-schema.cjs.js +0 -1
- package/lib/providers/freemius.cjs.js +0 -1
- package/lib/providers/stripe.cjs.js +0 -1
- package/lib/server-actions/coupon-actions.cjs.js +0 -1
- package/lib/server-actions/customer-actions.cjs.js +0 -1
- package/lib/server-actions/product-actions.cjs.js +0 -1
- package/lib/server-actions/shipping-actions.cjs.js +0 -1
- package/lib/server-actions/tax-actions.cjs.js +0 -1
- package/lib/shipping-rate-currency.cjs.js +0 -1
- package/lib/states.cjs.js +0 -1
- package/lib/stripe/checkout.cjs.js +0 -1
- package/lib/stripe/client.cjs.js +0 -1
- package/lib/stripe/order-sync.cjs.js +0 -1
- package/lib/stripe/webhooks.cjs.js +0 -1
- package/lib/tax-calculation.cjs.js +0 -1
- package/lib/use-cart.cjs.js +0 -1
- package/lib/variation-utils.cjs.js +0 -1
- package/server.cjs.js +0 -1
- /package/_virtual/_rolldown/{runtime.cjs.js → runtime.cjs} +0 -0
- /package/lib/{countries.cjs.js → countries.cjs} +0 -0
- /package/lib/{coupons.cjs.js → coupons.cjs} +0 -0
- /package/lib/{currency-constants.cjs.js → currency-constants.cjs} +0 -0
- /package/lib/{currency-rest-client.cjs.js → currency-rest-client.cjs} +0 -0
- /package/lib/{currency-store.cjs.js → currency-store.cjs} +0 -0
- /package/lib/{currency.cjs.js → currency.cjs} +0 -0
- /package/lib/{inventory-settings.cjs.js → inventory-settings.cjs} +0 -0
- /package/lib/{invoice-ui.cjs.js → invoice-ui.cjs} +0 -0
- /package/lib/{invoice.cjs.js → invoice.cjs} +0 -0
- /package/lib/{order-tax-details.cjs.js → order-tax-details.cjs} +0 -0
- /package/lib/pages/cms/coupons/{ProductScopePicker.cjs.js → ProductScopePicker.cjs} +0 -0
- /package/lib/pages/cms/coupons/{product-options.cjs.js → product-options.cjs} +0 -0
- /package/lib/pages/cms/orders/{OrderPrintButton.cjs.js → OrderPrintButton.cjs} +0 -0
- /package/lib/pages/cms/orders/{actions.cjs.js → actions.cjs} +0 -0
- /package/lib/pages/cms/orders/{export-actions.cjs.js → export-actions.cjs} +0 -0
- /package/lib/pages/cms/payments/{PaymentsClient.cjs.js → PaymentsClient.cjs} +0 -0
- /package/lib/pages/cms/products/attributes/components/{AttributeManager.cjs.js → AttributeManager.cjs} +0 -0
- /package/lib/pages/cms/products/components/{DeleteProductButton.cjs.js → DeleteProductButton.cjs} +0 -0
- /package/lib/pages/cms/products/components/{SaleScheduleFields.cjs.js → SaleScheduleFields.cjs} +0 -0
- /package/lib/{payment-config.cjs.js → payment-config.cjs} +0 -0
- /package/lib/{shared-inventory.cjs.js → shared-inventory.cjs} +0 -0
- /package/lib/{trials.cjs.js → trials.cjs} +0 -0
- /package/lib/{types.cjs.js → types.cjs} +0 -0
- /package/lib/{use-price-formatter.cjs.js → use-price-formatter.cjs} +0 -0
- /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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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(() => {
|
package/lib/countries.es.js
CHANGED
|
@@ -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;
|
package/lib/coupon-server.es.js
CHANGED
|
@@ -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
|
|
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
|
|
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 [];
|
package/lib/currency-store.es.js
CHANGED
|
@@ -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
|
|
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;
|
package/lib/currency-sync.es.js
CHANGED
|
@@ -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
|
|
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.`);
|
package/lib/currency.es.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
4
|
+
//#region src/lib/customer-orders.ts
|
|
5
5
|
var r = ["pending"];
|
|
6
6
|
function i(e) {
|
|
7
7
|
return e ?? n();
|
package/lib/customer.cjs
ADDED
|
@@ -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;
|
package/lib/customer.es.js
CHANGED
|
@@ -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
|
|
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;
|
package/lib/export-helpers.es.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import e from "papaparse";
|
|
2
|
-
//#region
|
|
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) {
|
package/lib/factory.cjs
ADDED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
const e=require("./customer.cjs
|
|
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 (
|
package/lib/invoice-server.es.js
CHANGED
|
@@ -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
|
|
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
|
}
|
package/lib/invoice-ui.es.js
CHANGED
package/lib/invoice.es.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const e=require("../_virtual/_rolldown/runtime.cjs
|
|
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
|
|
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
|
}
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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;
|