@rovela-ai/sdk 0.1.18 → 0.1.19
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/dist/admin/api/auth.js +5 -11
- package/dist/admin/api/auth.js.map +1 -1
- package/dist/admin/api/categories.js +43 -50
- package/dist/admin/api/categories.js.map +1 -1
- package/dist/admin/api/check.js +6 -9
- package/dist/admin/api/check.js.map +1 -1
- package/dist/admin/api/customers.js +17 -21
- package/dist/admin/api/customers.js.map +1 -1
- package/dist/admin/api/index.js +10 -38
- package/dist/admin/api/index.js.map +1 -1
- package/dist/admin/api/orders.js +30 -35
- package/dist/admin/api/orders.js.map +1 -1
- package/dist/admin/api/products.js +56 -66
- package/dist/admin/api/products.js.map +1 -1
- package/dist/admin/api/refund.js +26 -29
- package/dist/admin/api/refund.js.map +1 -1
- package/dist/admin/api/settings.js +17 -21
- package/dist/admin/api/settings.js.map +1 -1
- package/dist/admin/api/setup.js +17 -20
- package/dist/admin/api/setup.js.map +1 -1
- package/dist/admin/api/stats.js +14 -17
- package/dist/admin/api/stats.js.map +1 -1
- package/dist/admin/components/AdminGuard.js +13 -17
- package/dist/admin/components/AdminGuard.js.map +1 -1
- package/dist/admin/components/AdminHeader.js +8 -11
- package/dist/admin/components/AdminHeader.js.map +1 -1
- package/dist/admin/components/AdminLayout.js +5 -8
- package/dist/admin/components/AdminLayout.js.map +1 -1
- package/dist/admin/components/AdminLoginForm.js +11 -14
- package/dist/admin/components/AdminLoginForm.js.map +1 -1
- package/dist/admin/components/AdminNav.js +11 -14
- package/dist/admin/components/AdminNav.js.map +1 -1
- package/dist/admin/components/AdminSetupForm.js +11 -14
- package/dist/admin/components/AdminSetupForm.js.map +1 -1
- package/dist/admin/components/InventoryEditor.js +16 -19
- package/dist/admin/components/InventoryEditor.js.map +1 -1
- package/dist/admin/components/LowStockAlert.js +6 -9
- package/dist/admin/components/LowStockAlert.js.map +1 -1
- package/dist/admin/components/OrderDetails.js +15 -18
- package/dist/admin/components/OrderDetails.js.map +1 -1
- package/dist/admin/components/OrderTable.js +13 -16
- package/dist/admin/components/OrderTable.js.map +1 -1
- package/dist/admin/components/ProductForm.js +17 -20
- package/dist/admin/components/ProductForm.js.map +1 -1
- package/dist/admin/components/ProductTable.js +15 -18
- package/dist/admin/components/ProductTable.js.map +1 -1
- package/dist/admin/components/RecentOrders.js +6 -9
- package/dist/admin/components/RecentOrders.js.map +1 -1
- package/dist/admin/components/RefundDialog.js +12 -15
- package/dist/admin/components/RefundDialog.js.map +1 -1
- package/dist/admin/components/StatsCards.js +7 -10
- package/dist/admin/components/StatsCards.js.map +1 -1
- package/dist/admin/components/StoreSettings.js +10 -13
- package/dist/admin/components/StoreSettings.js.map +1 -1
- package/dist/admin/components/index.js +16 -35
- package/dist/admin/components/index.js.map +1 -1
- package/dist/admin/config.js +12 -54
- package/dist/admin/config.js.map +1 -1
- package/dist/admin/hooks/index.js +4 -11
- package/dist/admin/hooks/index.js.map +1 -1
- package/dist/admin/hooks/useAdminAuth.js +9 -12
- package/dist/admin/hooks/useAdminAuth.js.map +1 -1
- package/dist/admin/hooks/useAdminOrders.js +11 -14
- package/dist/admin/hooks/useAdminOrders.js.map +1 -1
- package/dist/admin/hooks/useAdminProducts.js +13 -16
- package/dist/admin/hooks/useAdminProducts.js.map +1 -1
- package/dist/admin/hooks/useAdminStats.js +11 -14
- package/dist/admin/hooks/useAdminStats.js.map +1 -1
- package/dist/admin/index.js +13 -66
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/server/admin-service.js +39 -83
- package/dist/admin/server/admin-service.js.map +1 -1
- package/dist/admin/server/index.js +3 -13
- package/dist/admin/server/index.js.map +1 -1
- package/dist/admin/types.js +1 -2
- package/dist/admin/types.js.map +1 -1
- package/dist/auth/api/auth.js +6 -14
- package/dist/auth/api/auth.js.map +1 -1
- package/dist/auth/api/forgot-password.js +8 -11
- package/dist/auth/api/forgot-password.js.map +1 -1
- package/dist/auth/api/index.js +6 -18
- package/dist/auth/api/index.js.map +1 -1
- package/dist/auth/api/register.js +17 -20
- package/dist/auth/api/register.js.map +1 -1
- package/dist/auth/api/resend-verification.js +9 -12
- package/dist/auth/api/resend-verification.js.map +1 -1
- package/dist/auth/api/reset-password.js +18 -22
- package/dist/auth/api/reset-password.js.map +1 -1
- package/dist/auth/api/verify-email.js +14 -18
- package/dist/auth/api/verify-email.js.map +1 -1
- package/dist/auth/components/AuthGuard.js +13 -17
- package/dist/auth/components/AuthGuard.js.map +1 -1
- package/dist/auth/components/ForgotPasswordForm.js +11 -14
- package/dist/auth/components/ForgotPasswordForm.js.map +1 -1
- package/dist/auth/components/ResetPasswordForm.js +18 -21
- package/dist/auth/components/ResetPasswordForm.js.map +1 -1
- package/dist/auth/components/SignInForm.js +13 -16
- package/dist/auth/components/SignInForm.js.map +1 -1
- package/dist/auth/components/SignUpForm.js +15 -18
- package/dist/auth/components/SignUpForm.js.map +1 -1
- package/dist/auth/components/UserMenu.js +13 -16
- package/dist/auth/components/UserMenu.js.map +1 -1
- package/dist/auth/components/VerifyEmailNotice.js +10 -13
- package/dist/auth/components/VerifyEmailNotice.js.map +1 -1
- package/dist/auth/components/index.js +7 -18
- package/dist/auth/components/index.js.map +1 -1
- package/dist/auth/config.js +9 -49
- package/dist/auth/config.js.map +1 -1
- package/dist/auth/hooks/index.js +1 -5
- package/dist/auth/hooks/index.js.map +1 -1
- package/dist/auth/hooks/useAuth.js +14 -17
- package/dist/auth/hooks/useAuth.js.map +1 -1
- package/dist/auth/index.js +15 -37
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/server/customer-service.js +39 -83
- package/dist/auth/server/customer-service.js.map +1 -1
- package/dist/auth/server/email-sender.js +11 -17
- package/dist/auth/server/email-sender.js.map +1 -1
- package/dist/auth/server/index.js +5 -36
- package/dist/auth/server/index.js.map +1 -1
- package/dist/auth/server/password-reset-service.js +30 -70
- package/dist/auth/server/password-reset-service.js.map +1 -1
- package/dist/auth/server/password.js +9 -18
- package/dist/auth/server/password.js.map +1 -1
- package/dist/auth/server/verification-service.js +35 -76
- package/dist/auth/server/verification-service.js.map +1 -1
- package/dist/auth/types.js +1 -2
- package/dist/auth/types.js.map +1 -1
- package/dist/cart/CartProvider.js +13 -17
- package/dist/cart/CartProvider.js.map +1 -1
- package/dist/cart/components/AddToCartButton.js +16 -19
- package/dist/cart/components/AddToCartButton.js.map +1 -1
- package/dist/cart/components/CartDrawer.js +17 -23
- package/dist/cart/components/CartDrawer.js.map +1 -1
- package/dist/cart/components/CartIcon.js +9 -12
- package/dist/cart/components/CartIcon.js.map +1 -1
- package/dist/cart/components/CartItem.js +7 -13
- package/dist/cart/components/CartItem.js.map +1 -1
- package/dist/cart/components/CartSummary.js +12 -15
- package/dist/cart/components/CartSummary.js.map +1 -1
- package/dist/cart/components/QuantitySelector.js +9 -12
- package/dist/cart/components/QuantitySelector.js.map +1 -1
- package/dist/cart/components/index.js +6 -15
- package/dist/cart/components/index.js.map +1 -1
- package/dist/cart/index.js +3 -17
- package/dist/cart/index.js.map +1 -1
- package/dist/cart/store.js +8 -13
- package/dist/cart/store.js.map +1 -1
- package/dist/checkout/api/checkout.js +12 -15
- package/dist/checkout/api/checkout.js.map +1 -1
- package/dist/checkout/api/index.js +2 -7
- package/dist/checkout/api/index.js.map +1 -1
- package/dist/checkout/api/webhook.js +8 -11
- package/dist/checkout/api/webhook.js.map +1 -1
- package/dist/checkout/components/CheckoutButton.js +8 -11
- package/dist/checkout/components/CheckoutButton.js.map +1 -1
- package/dist/checkout/components/CheckoutSuccess.js +11 -14
- package/dist/checkout/components/CheckoutSuccess.js.map +1 -1
- package/dist/checkout/components/OrderSummary.js +8 -11
- package/dist/checkout/components/OrderSummary.js.map +1 -1
- package/dist/checkout/components/ShippingForm.js +14 -17
- package/dist/checkout/components/ShippingForm.js.map +1 -1
- package/dist/checkout/components/index.js +4 -11
- package/dist/checkout/components/index.js.map +1 -1
- package/dist/checkout/hooks/index.js +1 -6
- package/dist/checkout/hooks/index.js.map +1 -1
- package/dist/checkout/hooks/useCheckout.js +10 -19
- package/dist/checkout/hooks/useCheckout.js.map +1 -1
- package/dist/checkout/index.js +7 -28
- package/dist/checkout/index.js.map +1 -1
- package/dist/checkout/server/create-checkout-session.js +11 -16
- package/dist/checkout/server/create-checkout-session.js.map +1 -1
- package/dist/checkout/server/handle-webhook.js +21 -24
- package/dist/checkout/server/handle-webhook.js.map +1 -1
- package/dist/checkout/server/index.js +3 -13
- package/dist/checkout/server/index.js.map +1 -1
- package/dist/checkout/server/order-service.js +11 -16
- package/dist/checkout/server/order-service.js.map +1 -1
- package/dist/checkout/stripe/client.js +13 -29
- package/dist/checkout/stripe/client.js.map +1 -1
- package/dist/checkout/stripe/index.js +1 -15
- package/dist/checkout/stripe/index.js.map +1 -1
- package/dist/checkout/types.js +1 -2
- package/dist/checkout/types.js.map +1 -1
- package/dist/core/config.js +12 -57
- package/dist/core/config.js.map +1 -1
- package/dist/core/db/client.js +16 -62
- package/dist/core/db/client.js.map +1 -1
- package/dist/core/db/index.js +14 -93
- package/dist/core/db/index.js.map +1 -1
- package/dist/core/db/queries.d.ts +6 -6
- package/dist/core/db/queries.js +207 -284
- package/dist/core/db/queries.js.map +1 -1
- package/dist/core/db/schema.js +179 -182
- package/dist/core/db/schema.js.map +1 -1
- package/dist/core/index.js +12 -42
- package/dist/core/index.js.map +1 -1
- package/dist/core/server/index.js +16 -68
- package/dist/core/server/index.js.map +1 -1
- package/dist/core/types.js +1 -2
- package/dist/core/types.js.map +1 -1
- package/dist/core/utils.js +26 -51
- package/dist/core/utils.js.map +1 -1
- package/dist/emails/config.js +13 -21
- package/dist/emails/config.js.map +1 -1
- package/dist/emails/index.js +10 -72
- package/dist/emails/index.js.map +1 -1
- package/dist/emails/send/auth.js +26 -34
- package/dist/emails/send/auth.js.map +1 -1
- package/dist/emails/send/index.js +2 -21
- package/dist/emails/send/index.js.map +1 -1
- package/dist/emails/send/orders.js +38 -50
- package/dist/emails/send/orders.js.map +1 -1
- package/dist/emails/sender.js +7 -12
- package/dist/emails/sender.js.map +1 -1
- package/dist/emails/templates/base.js +37 -53
- package/dist/emails/templates/base.js.map +1 -1
- package/dist/emails/templates/email-verification.js +12 -16
- package/dist/emails/templates/email-verification.js.map +1 -1
- package/dist/emails/templates/index.js +9 -43
- package/dist/emails/templates/index.js.map +1 -1
- package/dist/emails/templates/order-cancelled.js +18 -22
- package/dist/emails/templates/order-cancelled.js.map +1 -1
- package/dist/emails/templates/order-confirmation.js +30 -34
- package/dist/emails/templates/order-confirmation.js.map +1 -1
- package/dist/emails/templates/order-delivered.js +20 -24
- package/dist/emails/templates/order-delivered.js.map +1 -1
- package/dist/emails/templates/order-shipped.js +19 -23
- package/dist/emails/templates/order-shipped.js.map +1 -1
- package/dist/emails/templates/password-reset.js +12 -16
- package/dist/emails/templates/password-reset.js.map +1 -1
- package/dist/emails/templates/refund-processed.js +17 -21
- package/dist/emails/templates/refund-processed.js.map +1 -1
- package/dist/emails/templates/welcome.js +11 -15
- package/dist/emails/templates/welcome.js.map +1 -1
- package/dist/emails/types.js +1 -2
- package/dist/emails/types.js.map +1 -1
- package/dist/emails/utils.js +9 -20
- package/dist/emails/utils.js.map +1 -1
- package/dist/index.js +24 -176
- package/dist/index.js.map +1 -1
- package/dist/products/api/categories.js +7 -10
- package/dist/products/api/categories.js.map +1 -1
- package/dist/products/api/index.js +3 -9
- package/dist/products/api/index.js.map +1 -1
- package/dist/products/api/product.js +10 -13
- package/dist/products/api/product.js.map +1 -1
- package/dist/products/api/products.js +8 -11
- package/dist/products/api/products.js.map +1 -1
- package/dist/products/components/CategoryNav.js +20 -26
- package/dist/products/components/CategoryNav.js.map +1 -1
- package/dist/products/components/ProductBreadcrumb.js +7 -13
- package/dist/products/components/ProductBreadcrumb.js.map +1 -1
- package/dist/products/components/ProductCard.js +6 -12
- package/dist/products/components/ProductCard.js.map +1 -1
- package/dist/products/components/ProductDetails.js +14 -17
- package/dist/products/components/ProductDetails.js.map +1 -1
- package/dist/products/components/ProductFilters.js +15 -18
- package/dist/products/components/ProductFilters.js.map +1 -1
- package/dist/products/components/ProductGallery.js +17 -23
- package/dist/products/components/ProductGallery.js.map +1 -1
- package/dist/products/components/ProductGrid.js +10 -13
- package/dist/products/components/ProductGrid.js.map +1 -1
- package/dist/products/components/ProductSearch.js +14 -17
- package/dist/products/components/ProductSearch.js.map +1 -1
- package/dist/products/components/ProductSort.js +8 -11
- package/dist/products/components/ProductSort.js.map +1 -1
- package/dist/products/components/VariantSelector.js +16 -19
- package/dist/products/components/VariantSelector.js.map +1 -1
- package/dist/products/components/index.js +10 -23
- package/dist/products/components/index.js.map +1 -1
- package/dist/products/hooks/index.js +4 -11
- package/dist/products/hooks/index.js.map +1 -1
- package/dist/products/hooks/useCategories.js +12 -15
- package/dist/products/hooks/useCategories.js.map +1 -1
- package/dist/products/hooks/useProduct.js +9 -12
- package/dist/products/hooks/useProduct.js.map +1 -1
- package/dist/products/hooks/useProductAttributes.js +10 -13
- package/dist/products/hooks/useProductAttributes.js.map +1 -1
- package/dist/products/hooks/useProducts.js +15 -18
- package/dist/products/hooks/useProducts.js.map +1 -1
- package/dist/products/index.js +6 -23
- package/dist/products/index.js.map +1 -1
- package/dist/theme/ThemeProvider.js +12 -14
- package/dist/theme/ThemeProvider.js.map +1 -1
- package/dist/theme/colors.js +3 -8
- package/dist/theme/colors.js.map +1 -1
- package/dist/theme/defaults.js +27 -30
- package/dist/theme/defaults.js.map +1 -1
- package/dist/theme/fonts.js +12 -18
- package/dist/theme/fonts.js.map +1 -1
- package/dist/theme/generator.js +63 -69
- package/dist/theme/generator.js.map +1 -1
- package/dist/theme/hooks.js +11 -16
- package/dist/theme/hooks.js.map +1 -1
- package/dist/theme/index.js +6 -42
- package/dist/theme/index.js.map +1 -1
- package/package.json +31 -30
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* @rovela/sdk/emails/templates/order-shipped
|
|
4
3
|
*
|
|
5
4
|
* Order shipped email template.
|
|
6
5
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
exports.getOrderShippedSubject = getOrderShippedSubject;
|
|
10
|
-
const utils_1 = require("../utils");
|
|
11
|
-
const base_1 = require("./base");
|
|
6
|
+
import { escapeHtml, formatAddressHtml } from '../utils';
|
|
7
|
+
import { baseLayout, statusBadge, heading, primaryButton, labeledValue, addressSection, highlightBox, STYLES, } from './base';
|
|
12
8
|
// =============================================================================
|
|
13
9
|
// Main Template
|
|
14
10
|
// =============================================================================
|
|
@@ -32,19 +28,19 @@ const base_1 = require("./base");
|
|
|
32
28
|
* })
|
|
33
29
|
* ```
|
|
34
30
|
*/
|
|
35
|
-
function renderOrderShipped(data) {
|
|
36
|
-
const badge =
|
|
31
|
+
export function renderOrderShipped(data) {
|
|
32
|
+
const badge = statusBadge('Order Shipped', '📦');
|
|
37
33
|
// Tracking info box
|
|
38
34
|
const trackingInfoBox = `
|
|
39
|
-
<div style="padding: 24px; background-color: ${
|
|
35
|
+
<div style="padding: 24px; background-color: ${STYLES.footerBackground}; border-radius: 16px; border: 1px solid ${STYLES.cardBorder}; margin-bottom: 32px;">
|
|
40
36
|
<table width="100%" cellpadding="0" cellspacing="0">
|
|
41
|
-
${
|
|
42
|
-
${
|
|
43
|
-
valueColor:
|
|
37
|
+
${labeledValue('Order Number', `#${data.orderNumber}`, { borderBottom: true })}
|
|
38
|
+
${labeledValue('Tracking Number', data.trackingNumber, {
|
|
39
|
+
valueColor: STYLES.primaryColor,
|
|
44
40
|
borderTop: true,
|
|
45
41
|
borderBottom: true,
|
|
46
42
|
})}
|
|
47
|
-
${
|
|
43
|
+
${labeledValue('Carrier', data.carrierName, {
|
|
48
44
|
valueSize: '16px',
|
|
49
45
|
borderTop: true,
|
|
50
46
|
})}
|
|
@@ -52,27 +48,27 @@ function renderOrderShipped(data) {
|
|
|
52
48
|
</div>
|
|
53
49
|
`;
|
|
54
50
|
// Estimated delivery highlight box
|
|
55
|
-
const estimatedDeliveryBox =
|
|
56
|
-
<p style="margin: 0 0 8px 0; font-family: ${
|
|
57
|
-
<p style="margin: 0; font-family: ${
|
|
51
|
+
const estimatedDeliveryBox = highlightBox(`
|
|
52
|
+
<p style="margin: 0 0 8px 0; font-family: ${STYLES.fontFamily}; font-size: 14px; font-weight: 400; color: ${STYLES.textSecondary}; text-transform: uppercase; letter-spacing: 0.05em; text-align: center;">Estimated Delivery</p>
|
|
53
|
+
<p style="margin: 0; font-family: ${STYLES.fontFamily}; font-size: 24px; font-weight: 700; color: ${STYLES.primaryColor}; text-align: center;">${escapeHtml(data.estimatedDeliveryDate)}</p>
|
|
58
54
|
`);
|
|
59
55
|
const content = `
|
|
60
56
|
${badge}
|
|
61
|
-
${
|
|
57
|
+
${heading('Your Order is On Its Way!')}
|
|
62
58
|
|
|
63
|
-
<p style="margin: 0 0 32px 0; font-family: ${
|
|
64
|
-
Hi ${
|
|
59
|
+
<p style="margin: 0 0 32px 0; font-family: ${STYLES.fontFamily}; font-size: 16px; font-weight: 400; line-height: 1.625; color: ${STYLES.textSecondary}; text-align: center;">
|
|
60
|
+
Hi ${escapeHtml(data.customerName)}, great news! Your order has been shipped and is heading your way.
|
|
65
61
|
</p>
|
|
66
62
|
|
|
67
63
|
${trackingInfoBox}
|
|
68
64
|
|
|
69
65
|
${estimatedDeliveryBox}
|
|
70
66
|
|
|
71
|
-
${
|
|
67
|
+
${addressSection('Shipping To', formatAddressHtml(data.shippingAddress))}
|
|
72
68
|
|
|
73
|
-
${
|
|
69
|
+
${primaryButton('Track Your Package', data.trackingUrl)}
|
|
74
70
|
`;
|
|
75
|
-
return
|
|
71
|
+
return baseLayout({
|
|
76
72
|
config: data.config,
|
|
77
73
|
title: `Your Order Has Shipped - #${data.orderNumber}`,
|
|
78
74
|
content,
|
|
@@ -81,7 +77,7 @@ function renderOrderShipped(data) {
|
|
|
81
77
|
/**
|
|
82
78
|
* Get the subject line for order shipped emails.
|
|
83
79
|
*/
|
|
84
|
-
function getOrderShippedSubject(storeName, orderNumber) {
|
|
80
|
+
export function getOrderShippedSubject(storeName, orderNumber) {
|
|
85
81
|
return `Your Order Has Shipped - #${orderNumber} | ${storeName}`;
|
|
86
82
|
}
|
|
87
83
|
//# sourceMappingURL=order-shipped.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"order-shipped.js","sourceRoot":"","sources":["../../../src/emails/templates/order-shipped.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"order-shipped.js","sourceRoot":"","sources":["../../../src/emails/templates/order-shipped.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AACxD,OAAO,EACL,UAAU,EACV,WAAW,EACX,OAAO,EACP,aAAa,EACb,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,MAAM,GACP,MAAM,QAAQ,CAAA;AAEf,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAsB;IACvD,MAAM,KAAK,GAAG,WAAW,CAAC,eAAe,EAAE,IAAI,CAAC,CAAA;IAEhD,oBAAoB;IACpB,MAAM,eAAe,GAAG;mDACyB,MAAM,CAAC,gBAAgB,4CAA4C,MAAM,CAAC,UAAU;;UAE7H,YAAY,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;UAC5E,YAAY,CAAC,iBAAiB,EAAE,IAAI,CAAC,cAAc,EAAE;QACrD,UAAU,EAAE,MAAM,CAAC,YAAY;QAC/B,SAAS,EAAE,IAAI;QACf,YAAY,EAAE,IAAI;KACnB,CAAC;UACA,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,EAAE;QAC1C,SAAS,EAAE,MAAM;QACjB,SAAS,EAAE,IAAI;KAChB,CAAC;;;GAGP,CAAA;IAED,mCAAmC;IACnC,MAAM,oBAAoB,GAAG,YAAY,CAAC;gDACI,MAAM,CAAC,UAAU,+CAA+C,MAAM,CAAC,aAAa;wCAC5F,MAAM,CAAC,UAAU,+CAA+C,MAAM,CAAC,YAAY,0BAA0B,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC;GACxL,CAAC,CAAA;IAEF,MAAM,OAAO,GAAG;MACZ,KAAK;MACL,OAAO,CAAC,2BAA2B,CAAC;;iDAEO,MAAM,CAAC,UAAU,mEAAmE,MAAM,CAAC,aAAa;WAC9I,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC;;;MAGlC,eAAe;;MAEf,oBAAoB;;MAEpB,cAAc,CAAC,aAAa,EAAE,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;;MAEtE,aAAa,CAAC,oBAAoB,EAAE,IAAI,CAAC,WAAW,CAAC;GACxD,CAAA;IAED,OAAO,UAAU,CAAC;QAChB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,6BAA6B,IAAI,CAAC,WAAW,EAAE;QACtD,OAAO;KACR,CAAC,CAAA;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,SAAiB,EACjB,WAAmB;IAEnB,OAAO,6BAA6B,WAAW,MAAM,SAAS,EAAE,CAAA;AAClE,CAAC"}
|
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* @rovela/sdk/emails/templates/password-reset
|
|
4
3
|
*
|
|
5
4
|
* Password reset email template.
|
|
6
5
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
exports.getPasswordResetSubject = getPasswordResetSubject;
|
|
10
|
-
const utils_1 = require("../utils");
|
|
11
|
-
const base_1 = require("./base");
|
|
6
|
+
import { escapeHtml } from '../utils';
|
|
7
|
+
import { baseLayout, heading, paragraph, primaryButton, linkFallback, } from './base';
|
|
12
8
|
/**
|
|
13
9
|
* Render the password reset email template.
|
|
14
10
|
*
|
|
@@ -24,23 +20,23 @@ const base_1 = require("./base");
|
|
|
24
20
|
* })
|
|
25
21
|
* ```
|
|
26
22
|
*/
|
|
27
|
-
function renderPasswordResetEmail(data) {
|
|
23
|
+
export function renderPasswordResetEmail(data) {
|
|
28
24
|
const content = `
|
|
29
|
-
${
|
|
25
|
+
${heading('Reset Your Password')}
|
|
30
26
|
|
|
31
|
-
${
|
|
27
|
+
${paragraph(`Hi ${escapeHtml(data.customerName)},`)}
|
|
32
28
|
|
|
33
|
-
${
|
|
29
|
+
${paragraph('We received a request to reset your password. Click the button below to create a new password:', '32px')}
|
|
34
30
|
|
|
35
|
-
${
|
|
31
|
+
${primaryButton('Reset Password', data.resetLink)}
|
|
36
32
|
|
|
37
|
-
${
|
|
33
|
+
${paragraph(`This link will expire in ${escapeHtml(data.expiryTime)} ${data.expiryTime === '1' ? 'hour' : 'hours'} for security reasons.`)}
|
|
38
34
|
|
|
39
|
-
${
|
|
35
|
+
${paragraph("If you didn't request a password reset, you can safely ignore this email. Your password will remain unchanged.", '24px')}
|
|
40
36
|
|
|
41
|
-
${
|
|
37
|
+
${linkFallback(data.resetLink)}
|
|
42
38
|
`;
|
|
43
|
-
return
|
|
39
|
+
return baseLayout({
|
|
44
40
|
config: data.config,
|
|
45
41
|
title: 'Reset Your Password',
|
|
46
42
|
content,
|
|
@@ -49,7 +45,7 @@ function renderPasswordResetEmail(data) {
|
|
|
49
45
|
/**
|
|
50
46
|
* Get the subject line for password reset emails.
|
|
51
47
|
*/
|
|
52
|
-
function getPasswordResetSubject(storeName) {
|
|
48
|
+
export function getPasswordResetSubject(storeName) {
|
|
53
49
|
return `Reset your password - ${storeName}`;
|
|
54
50
|
}
|
|
55
51
|
//# sourceMappingURL=password-reset.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"password-reset.js","sourceRoot":"","sources":["../../../src/emails/templates/password-reset.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"password-reset.js","sourceRoot":"","sources":["../../../src/emails/templates/password-reset.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EACL,UAAU,EACV,OAAO,EACP,SAAS,EACT,aAAa,EACb,YAAY,GACb,MAAM,QAAQ,CAAA;AAEf;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAA4B;IACnE,MAAM,OAAO,GAAG;MACZ,OAAO,CAAC,qBAAqB,CAAC;;MAE9B,SAAS,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;;MAEjD,SAAS,CACT,gGAAgG,EAChG,MAAM,CACP;;MAEC,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC;;MAE/C,SAAS,CACT,4BAA4B,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,wBAAwB,CAC9H;;MAEC,SAAS,CACT,gHAAgH,EAChH,MAAM,CACP;;MAEC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;GAC/B,CAAA;IAED,OAAO,UAAU,CAAC;QAChB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,qBAAqB;QAC5B,OAAO;KACR,CAAC,CAAA;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,SAAiB;IACvD,OAAO,yBAAyB,SAAS,EAAE,CAAA;AAC7C,CAAC"}
|
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* @rovela/sdk/emails/templates/refund-processed
|
|
4
3
|
*
|
|
5
4
|
* Refund processed email template.
|
|
6
5
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
exports.getRefundProcessedSubject = getRefundProcessedSubject;
|
|
10
|
-
const utils_1 = require("../utils");
|
|
11
|
-
const base_1 = require("./base");
|
|
6
|
+
import { escapeHtml } from '../utils';
|
|
7
|
+
import { baseLayout, statusBadge, heading, paragraph, primaryButton, labeledValue, detailBox, STYLES, } from './base';
|
|
12
8
|
// =============================================================================
|
|
13
9
|
// Main Template
|
|
14
10
|
// =============================================================================
|
|
@@ -32,24 +28,24 @@ const base_1 = require("./base");
|
|
|
32
28
|
* })
|
|
33
29
|
* ```
|
|
34
30
|
*/
|
|
35
|
-
function renderRefundProcessed(data) {
|
|
36
|
-
const badge =
|
|
31
|
+
export function renderRefundProcessed(data) {
|
|
32
|
+
const badge = statusBadge('Refund Processed');
|
|
37
33
|
// Refund details box (green highlighted)
|
|
38
34
|
const refundDetailsBox = `
|
|
39
35
|
<div style="padding: 24px; background-color: rgba(12, 175, 125, 0.05); border-radius: 16px; border: 1px solid rgba(12, 175, 125, 0.2); margin-bottom: 32px;">
|
|
40
36
|
<table width="100%" cellpadding="0" cellspacing="0">
|
|
41
37
|
<tr>
|
|
42
38
|
<td style="padding-bottom: 16px;">
|
|
43
|
-
<p style="margin: 0 0 4px 0; font-family: ${
|
|
44
|
-
<p style="margin: 0; font-family: ${
|
|
39
|
+
<p style="margin: 0 0 4px 0; font-family: ${STYLES.fontFamily}; font-size: 12px; font-weight: 400; color: ${STYLES.textSecondary}; text-transform: uppercase; letter-spacing: 0.05em;">Refund Amount</p>
|
|
40
|
+
<p style="margin: 0; font-family: ${STYLES.fontFamily}; font-size: 28px; font-weight: 700; color: ${STYLES.primaryColor};">${escapeHtml(data.refundAmount)}</p>
|
|
45
41
|
</td>
|
|
46
42
|
</tr>
|
|
47
|
-
${
|
|
43
|
+
${labeledValue('Order Number', `#${data.orderNumber}`, {
|
|
48
44
|
valueSize: '16px',
|
|
49
45
|
borderTop: true,
|
|
50
46
|
borderBottom: true,
|
|
51
47
|
})}
|
|
52
|
-
${
|
|
48
|
+
${labeledValue('Refund Date', data.refundDate, {
|
|
53
49
|
valueSize: '16px',
|
|
54
50
|
borderTop: true,
|
|
55
51
|
})}
|
|
@@ -57,31 +53,31 @@ function renderRefundProcessed(data) {
|
|
|
57
53
|
</div>
|
|
58
54
|
`;
|
|
59
55
|
// Payment method info box
|
|
60
|
-
const paymentMethodBox =
|
|
56
|
+
const paymentMethodBox = detailBox('Refund Details', [
|
|
61
57
|
{ label: 'Payment Method', value: data.paymentMethod },
|
|
62
58
|
{ label: 'Estimated Arrival', value: data.estimatedArrival },
|
|
63
59
|
]);
|
|
64
60
|
const content = `
|
|
65
61
|
${badge}
|
|
66
|
-
${
|
|
62
|
+
${heading('Your Refund Has Been Processed')}
|
|
67
63
|
|
|
68
|
-
${
|
|
64
|
+
${paragraph(`Hi ${escapeHtml(data.customerName)},`)}
|
|
69
65
|
|
|
70
|
-
${
|
|
66
|
+
${paragraph(`Good news! Your refund for order #${escapeHtml(data.orderNumber)} has been processed and issued to your original payment method.`, '32px')}
|
|
71
67
|
|
|
72
68
|
${refundDetailsBox}
|
|
73
69
|
|
|
74
70
|
${paymentMethodBox}
|
|
75
71
|
|
|
76
|
-
${
|
|
72
|
+
${paragraph(`Please allow ${escapeHtml(data.businessDays)} business days for the refund to appear in your account. The exact timing depends on your bank or card issuer.`, '32px')}
|
|
77
73
|
|
|
78
|
-
<p style="margin: 0 0 32px 0; font-family: ${
|
|
74
|
+
<p style="margin: 0 0 32px 0; font-family: ${STYLES.fontFamily}; font-size: 14px; font-weight: 400; line-height: 1.625; color: ${STYLES.textSecondary}; text-align: center;">
|
|
79
75
|
If you have any questions about this refund, please don't hesitate to contact us.
|
|
80
76
|
</p>
|
|
81
77
|
|
|
82
|
-
${
|
|
78
|
+
${primaryButton('Continue Shopping', data.config.shopUrl)}
|
|
83
79
|
`;
|
|
84
|
-
return
|
|
80
|
+
return baseLayout({
|
|
85
81
|
config: data.config,
|
|
86
82
|
title: `Refund Processed - #${data.orderNumber}`,
|
|
87
83
|
content,
|
|
@@ -90,7 +86,7 @@ function renderRefundProcessed(data) {
|
|
|
90
86
|
/**
|
|
91
87
|
* Get the subject line for refund processed emails.
|
|
92
88
|
*/
|
|
93
|
-
function getRefundProcessedSubject(storeName, orderNumber) {
|
|
89
|
+
export function getRefundProcessedSubject(storeName, orderNumber) {
|
|
94
90
|
return `Refund Processed - #${orderNumber} | ${storeName}`;
|
|
95
91
|
}
|
|
96
92
|
//# sourceMappingURL=refund-processed.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refund-processed.js","sourceRoot":"","sources":["../../../src/emails/templates/refund-processed.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"refund-processed.js","sourceRoot":"","sources":["../../../src/emails/templates/refund-processed.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EACL,UAAU,EACV,WAAW,EACX,OAAO,EACP,SAAS,EACT,aAAa,EACb,YAAY,EACZ,SAAS,EACT,MAAM,GACP,MAAM,QAAQ,CAAA;AAEf,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAyB;IAC7D,MAAM,KAAK,GAAG,WAAW,CAAC,kBAAkB,CAAC,CAAA;IAE7C,yCAAyC;IACzC,MAAM,gBAAgB,GAAG;;;;;wDAK6B,MAAM,CAAC,UAAU,+CAA+C,MAAM,CAAC,aAAa;gDAC5F,MAAM,CAAC,UAAU,+CAA+C,MAAM,CAAC,YAAY,MAAM,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC;;;UAG5J,YAAY,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;QACrD,SAAS,EAAE,MAAM;QACjB,SAAS,EAAE,IAAI;QACf,YAAY,EAAE,IAAI;KACnB,CAAC;UACA,YAAY,CAAC,aAAa,EAAE,IAAI,CAAC,UAAU,EAAE;QAC7C,SAAS,EAAE,MAAM;QACjB,SAAS,EAAE,IAAI;KAChB,CAAC;;;GAGP,CAAA;IAED,0BAA0B;IAC1B,MAAM,gBAAgB,GAAG,SAAS,CAAC,gBAAgB,EAAE;QACnD,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE;QACtD,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE;KAC7D,CAAC,CAAA;IAEF,MAAM,OAAO,GAAG;MACZ,KAAK;MACL,OAAO,CAAC,gCAAgC,CAAC;;MAEzC,SAAS,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;;MAEjD,SAAS,CACT,qCAAqC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,iEAAiE,EAClI,MAAM,CACP;;MAEC,gBAAgB;;MAEhB,gBAAgB;;MAEhB,SAAS,CACT,gBAAgB,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,gHAAgH,EAC7J,MAAM,CACP;;iDAE4C,MAAM,CAAC,UAAU,mEAAmE,MAAM,CAAC,aAAa;;;;MAInJ,aAAa,CAAC,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;GAC1D,CAAA;IAED,OAAO,UAAU,CAAC;QAChB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,uBAAuB,IAAI,CAAC,WAAW,EAAE;QAChD,OAAO;KACR,CAAC,CAAA;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,SAAiB,EACjB,WAAmB;IAEnB,OAAO,uBAAuB,WAAW,MAAM,SAAS,EAAE,CAAA;AAC5D,CAAC"}
|
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* @rovela/sdk/emails/templates/welcome
|
|
4
3
|
*
|
|
5
4
|
* Welcome email template for newly verified accounts.
|
|
6
5
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
exports.getWelcomeEmailSubject = getWelcomeEmailSubject;
|
|
10
|
-
const utils_1 = require("../utils");
|
|
11
|
-
const base_1 = require("./base");
|
|
6
|
+
import { escapeHtml } from '../utils';
|
|
7
|
+
import { baseLayout, heading, paragraph, primaryButton, detailBox, } from './base';
|
|
12
8
|
/**
|
|
13
9
|
* Render the welcome email template.
|
|
14
10
|
*
|
|
@@ -24,24 +20,24 @@ const base_1 = require("./base");
|
|
|
24
20
|
* })
|
|
25
21
|
* ```
|
|
26
22
|
*/
|
|
27
|
-
function renderWelcomeEmail(data) {
|
|
23
|
+
export function renderWelcomeEmail(data) {
|
|
28
24
|
const content = `
|
|
29
|
-
${
|
|
25
|
+
${heading(`Welcome to ${escapeHtml(data.config.storeName)}!`)}
|
|
30
26
|
|
|
31
|
-
${
|
|
27
|
+
${paragraph(`Hi ${escapeHtml(data.customerName)},`)}
|
|
32
28
|
|
|
33
|
-
${
|
|
29
|
+
${paragraph("Thank you for creating an account with us! We're excited to have you join our community.", '24px')}
|
|
34
30
|
|
|
35
|
-
${
|
|
31
|
+
${paragraph('Your account is now set up and ready to go. You can start exploring our products and enjoy a seamless shopping experience.', '32px')}
|
|
36
32
|
|
|
37
|
-
${
|
|
33
|
+
${primaryButton('Start Shopping', data.config.shopUrl)}
|
|
38
34
|
|
|
39
|
-
${
|
|
35
|
+
${detailBox('Your Account Details', [
|
|
40
36
|
{ label: 'Email', value: data.customerEmail },
|
|
41
37
|
{ label: 'Account Created', value: data.createdDate },
|
|
42
38
|
])}
|
|
43
39
|
`;
|
|
44
|
-
return
|
|
40
|
+
return baseLayout({
|
|
45
41
|
config: data.config,
|
|
46
42
|
title: `Welcome to ${data.config.storeName}`,
|
|
47
43
|
content,
|
|
@@ -50,7 +46,7 @@ function renderWelcomeEmail(data) {
|
|
|
50
46
|
/**
|
|
51
47
|
* Get the subject line for welcome emails.
|
|
52
48
|
*/
|
|
53
|
-
function getWelcomeEmailSubject(storeName) {
|
|
49
|
+
export function getWelcomeEmailSubject(storeName) {
|
|
54
50
|
return `Welcome to ${storeName}!`;
|
|
55
51
|
}
|
|
56
52
|
//# sourceMappingURL=welcome.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../../src/emails/templates/welcome.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../../src/emails/templates/welcome.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EACL,UAAU,EACV,OAAO,EACP,SAAS,EACT,aAAa,EACb,SAAS,GACV,MAAM,QAAQ,CAAA;AAEf;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAsB;IACvD,MAAM,OAAO,GAAG;MACZ,OAAO,CAAC,cAAc,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;;MAE3D,SAAS,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;;MAEjD,SAAS,CACT,0FAA0F,EAC1F,MAAM,CACP;;MAEC,SAAS,CACT,4HAA4H,EAC5H,MAAM,CACP;;MAEC,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;;MAEpD,SAAS,CAAC,sBAAsB,EAAE;QAClC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE;QAC7C,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE;KACtD,CAAC;GACH,CAAA;IAED,OAAO,UAAU,CAAC;QAChB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,cAAc,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;QAC5C,OAAO;KACR,CAAC,CAAA;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAiB;IACtD,OAAO,cAAc,SAAS,GAAG,CAAA;AACnC,CAAC"}
|
package/dist/emails/types.js
CHANGED
package/dist/emails/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/emails/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/emails/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
package/dist/emails/utils.js
CHANGED
|
@@ -1,19 +1,8 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* @rovela/sdk/emails/utils
|
|
4
3
|
*
|
|
5
4
|
* Utility functions for email template rendering.
|
|
6
5
|
*/
|
|
7
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.formatDate = formatDate;
|
|
9
|
-
exports.formatDateTime = formatDateTime;
|
|
10
|
-
exports.formatPrice = formatPrice;
|
|
11
|
-
exports.formatAddressLine = formatAddressLine;
|
|
12
|
-
exports.formatAddressHtml = formatAddressHtml;
|
|
13
|
-
exports.escapeHtml = escapeHtml;
|
|
14
|
-
exports.emailButton = emailButton;
|
|
15
|
-
exports.emailFooter = emailFooter;
|
|
16
|
-
exports.formatOrderNumber = formatOrderNumber;
|
|
17
6
|
// =============================================================================
|
|
18
7
|
// Date Formatting
|
|
19
8
|
// =============================================================================
|
|
@@ -27,7 +16,7 @@ exports.formatOrderNumber = formatOrderNumber;
|
|
|
27
16
|
* formatDate('2025-11-28') // "November 28, 2025"
|
|
28
17
|
* ```
|
|
29
18
|
*/
|
|
30
|
-
function formatDate(date) {
|
|
19
|
+
export function formatDate(date) {
|
|
31
20
|
const d = typeof date === 'string' ? new Date(date) : date;
|
|
32
21
|
return d.toLocaleDateString('en-US', {
|
|
33
22
|
year: 'numeric',
|
|
@@ -39,7 +28,7 @@ function formatDate(date) {
|
|
|
39
28
|
* Format a date with time for display in emails.
|
|
40
29
|
* Returns format like "November 28, 2025 at 2:30 PM"
|
|
41
30
|
*/
|
|
42
|
-
function formatDateTime(date) {
|
|
31
|
+
export function formatDateTime(date) {
|
|
43
32
|
const d = typeof date === 'string' ? new Date(date) : date;
|
|
44
33
|
return d.toLocaleDateString('en-US', {
|
|
45
34
|
year: 'numeric',
|
|
@@ -65,7 +54,7 @@ function formatDateTime(date) {
|
|
|
65
54
|
* formatPrice('Free') // "Free" (passthrough)
|
|
66
55
|
* ```
|
|
67
56
|
*/
|
|
68
|
-
function formatPrice(amount, currency = 'USD') {
|
|
57
|
+
export function formatPrice(amount, currency = 'USD') {
|
|
69
58
|
// Handle "Free" or other string passthroughs
|
|
70
59
|
if (typeof amount === 'string' && isNaN(parseFloat(amount))) {
|
|
71
60
|
return amount;
|
|
@@ -107,7 +96,7 @@ function formatPrice(amount, currency = 'USD') {
|
|
|
107
96
|
* // "123 Main St, New York, NY 10001, US"
|
|
108
97
|
* ```
|
|
109
98
|
*/
|
|
110
|
-
function formatAddressLine(address) {
|
|
99
|
+
export function formatAddressLine(address) {
|
|
111
100
|
const parts = [
|
|
112
101
|
address.line1,
|
|
113
102
|
address.line2,
|
|
@@ -135,7 +124,7 @@ function formatAddressLine(address) {
|
|
|
135
124
|
* // "John Doe<br>123 Main St<br>Apt 4B<br>New York, NY 10001<br>United States"
|
|
136
125
|
* ```
|
|
137
126
|
*/
|
|
138
|
-
function formatAddressHtml(address) {
|
|
127
|
+
export function formatAddressHtml(address) {
|
|
139
128
|
const lines = [];
|
|
140
129
|
// Name
|
|
141
130
|
if (address.name) {
|
|
@@ -165,7 +154,7 @@ function formatAddressHtml(address) {
|
|
|
165
154
|
/**
|
|
166
155
|
* Escape HTML special characters to prevent XSS.
|
|
167
156
|
*/
|
|
168
|
-
function escapeHtml(str) {
|
|
157
|
+
export function escapeHtml(str) {
|
|
169
158
|
return str
|
|
170
159
|
.replace(/&/g, '&')
|
|
171
160
|
.replace(/</g, '<')
|
|
@@ -177,7 +166,7 @@ function escapeHtml(str) {
|
|
|
177
166
|
* Generate an HTML button for emails.
|
|
178
167
|
* Uses table-based layout for maximum email client compatibility.
|
|
179
168
|
*/
|
|
180
|
-
function emailButton(text, href, options = {}) {
|
|
169
|
+
export function emailButton(text, href, options = {}) {
|
|
181
170
|
const { backgroundColor = '#0CAF7D', textColor = '#FFFFFF', borderRadius = '24px', } = options;
|
|
182
171
|
return `
|
|
183
172
|
<table cellpadding="0" cellspacing="0" border="0" style="margin: 24px 0;">
|
|
@@ -194,7 +183,7 @@ function emailButton(text, href, options = {}) {
|
|
|
194
183
|
/**
|
|
195
184
|
* Generate the standard email footer.
|
|
196
185
|
*/
|
|
197
|
-
function emailFooter(storeName, storeAddress) {
|
|
186
|
+
export function emailFooter(storeName, storeAddress) {
|
|
198
187
|
return `
|
|
199
188
|
<table width="100%" cellpadding="0" cellspacing="0" border="0" style="margin-top: 32px; padding-top: 24px; border-top: 1px solid #E5E5E5;">
|
|
200
189
|
<tr>
|
|
@@ -214,7 +203,7 @@ function emailFooter(storeName, storeAddress) {
|
|
|
214
203
|
* If the order ID is a UUID, shows first 8 characters.
|
|
215
204
|
* If already formatted (e.g., "ORD-12345"), returns as-is.
|
|
216
205
|
*/
|
|
217
|
-
function formatOrderNumber(orderId) {
|
|
206
|
+
export function formatOrderNumber(orderId) {
|
|
218
207
|
// If it looks like a UUID, format it
|
|
219
208
|
if (orderId.length === 36 && orderId.includes('-')) {
|
|
220
209
|
return `#${orderId.slice(0, 8).toUpperCase()}`;
|
package/dist/emails/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/emails/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/emails/utils.ts"],"names":[],"mappings":"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"}
|