@fas-core/shared-types 1.0.100 → 1.0.101
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/index.d.mts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +19 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -419,6 +419,7 @@ declare const PaymentStatusEnum: {
|
|
|
419
419
|
};
|
|
420
420
|
type PaymentStatusEnum = (typeof PaymentStatusEnum)[keyof typeof PaymentStatusEnum];
|
|
421
421
|
declare const PAYMENT_STATUS_VALUES: ("INITIATED" | "PENDING" | "PROCESSING" | "FAILED" | "CANCELLED" | "PENDING_CAPTURE" | "COMPLETED" | "VOIDED" | "REDIRECTED_TO_GATEWAY" | "UNKNOWN" | "REFUNDED" | "PARTIALLY_REFUNDED" | "NOT_REQUIRED")[];
|
|
422
|
+
declare const AWAITING_PAYMENT_STATUSES: PaymentStatusEnum[];
|
|
422
423
|
declare const paymentStatusColorMap: Record<PaymentStatusEnum, string>;
|
|
423
424
|
declare const PaymentMethodEnum: {
|
|
424
425
|
readonly CREDIT_CARD: "CREDIT_CARD";
|
|
@@ -494,6 +495,7 @@ type OrderStatusEnum = (typeof OrderStatusEnum)[keyof typeof OrderStatusEnum];
|
|
|
494
495
|
declare const ORDER_STATUS_VALUES: ("PENDING" | "PROCESSING" | "FAILED" | "REFUNDED" | "PARTIALLY_REFUNDED" | "CREATED" | "RECEIVED" | "CONFIRMED" | "SHIPPED" | "DELIVERED" | "CANCELED" | "ARCHIVED" | "RETURNED" | "QUOTE_REQUESTED" | "QUOTED" | "QUOTE_ACCEPTED" | "QUOTE_DECLINED" | "QUOTE_EXPIRED")[];
|
|
495
496
|
declare const statusColors: Record<OrderStatusEnum, string>;
|
|
496
497
|
declare const PURCHASE_ORDER_STATUSES: OrderStatusEnum[];
|
|
498
|
+
declare const OPEN_ORDER_STATUSES: OrderStatusEnum[];
|
|
497
499
|
declare const QUOTE_ORDER_STATUSES: OrderStatusEnum[];
|
|
498
500
|
interface IOrder extends BaseEntity {
|
|
499
501
|
orderId: string;
|
|
@@ -1522,4 +1524,4 @@ interface IWishlist extends BaseEntity {
|
|
|
1522
1524
|
items: IWishlistItem[];
|
|
1523
1525
|
}
|
|
1524
1526
|
|
|
1525
|
-
export { ACTIVE_SUBSCRIPTION_CHANNELS, ADMIN_ACTIONS, ADMIN_AUDIT_ACTIONS, ADMIN_RESOURCES, ADMIN_RESOURCE_LIST, ALL_STORES, type AddonAmountInput, type AddonSelectionRef, type ApiResponse, type BaseEntity, CAMPAIGN_RECIPIENT_STATUS_VALUES, CAMPAIGN_STATUS_VALUES, CART_STATUS_VALUES, CONFIGURATOR_CONDITION_TYPE_VALUES, CONFIGURATOR_EFFECT_TYPE_VALUES, CONFIGURATOR_SELECT_MODE_VALUES, CONFIGURATOR_SOURCE_VALUES, CampaignRecipientStatusEnum, CampaignStatusEnum, type CartIssue, type CartIssueType, CartIssueTypes, CartStatusEnum, type CartValidation, type CheckoutAddressInput, type CheckoutPayload, type CheckoutResult, ConfiguratorConditionTypeEnum, ConfiguratorEffectTypeEnum, ConfiguratorErrorCodeEnum, type ConfiguratorEvalContext, type ConfiguratorEvalError, type ConfiguratorEvalResult, ConfiguratorSelectModeEnum, type ConfiguratorSelections, ConfiguratorSourceEnum, DEFAULT_SUBSCRIPTION_TOPICS, DiscountTypeEnum, EMAIL_TEMPLATE_EVENT_VALUES, EMAIL_TEMPLATE_VARIABLES_BY_EVENT, EMPTY_ACCESS, type EffectiveAccess, EmailTemplateEventEnum, FEE_APPLIES_TO_VALUES, FeeAppliesToEnum, type IAddonConfig, type IAddonGroup, type IAddress, type IAdmin, type IAdminAction, type IAdminAuditAction, type IAdminAuditLog, type IAdminBaseAction, type IAdminPermission, type IAdminResource, type IAdminRole, type IAdminRoleCreate, type IAdminSafe, type IAdminStoreAccess, type IAppliedFee, type IBannerSlide, type IBlogAuthor, type IBlogCategory, type IBlogCitation, type IBlogPost, type IBrand, type ICampaign, type ICampaignRecipient, type ICampaignStats, type ICart, type ICartItem, type ICategory, type IConfigurator, type IConfiguratorCondition, type IConfiguratorEffect, type IConfiguratorFacet, type IConfiguratorFacetValue, type IConfiguratorOption, type IConfiguratorPriceAdjustment, type IConfiguratorQuery, type IConfiguratorRule, type IConfiguratorSection, type IConfiguratorStep, type IConfiguratorTarget, type IContact, type ICountry, type ICoupon, type ICurrency, type ICustomer, type IDiscountType, type IEmailTemplate, type IFaq, type IFaqCategory, type IKeyValue, type ILinePricing, type IMediaAsset, INVENTORY_POLICY_VALUES, type INotification, type IOrder, type IOrderItem, type IOrderLog, type IOrderTransaction, type IPaymentLink, type IPodcastEpisode, type IPrice, type IProduct, type IProductDailyStat, type IProductRelationGroup, type IProductTechnicalSpec, type IProductTechnicalSpecTable, type IProductVariantFields, type IProductVariantOptionGroup, type IProductVariantOptionMatrix, type IProductVariantOptionValue, type IRedirect, type IRedirectSuggestion, type IRefundTransaction, type IRelationGroup, type ISEOMetaData, type ISelectableFee, type IShipFromAddress, type IShipping, type IShippingRate, type IState, type IStock, type IStore, type IStoreFee, type IStoreSettings, type ISubscriber, type ISubscriberConsent, type ISubscription, type ISummaryPricing, type ITechnicalSpecColumn, type ITechnicalSpecGroup, type ITransactionBase, type IUnmatched404, type IVariant, type IVariantOptionSelection, type IWishlist, type IWishlistItem, type Id, type InventoryPolicy, InventoryPolicyEnum, type Metadata, NOTIFICATION_TYPE_VALUES, NotificationTypeEnum, ORDER_LOG_TYPE_VALUES, ORDER_STATUS_VALUES, OrderLogTypeEnum, OrderStatusEnum, PAYMENT_GATEWAY_VALUES, PAYMENT_LINK_STATUS_VALUES, PAYMENT_METHOD_VALUES, PAYMENT_STATUS_VALUES, PRICING_TYPE_VALUES, PRODUCT_VARIANT_TYPE_VALUES, PURCHASE_ORDER_STATUSES, PaymentGatewayEnum, PaymentLinkStatusEnum, PaymentMethodEnum, PaymentStatusEnum, type PricedLineLike, type PricingType, PricingTypeEnum, type ProductAddonScope, ProductEventTypeEnum, type ProductVariantType, ProductVariantTypeEnum, QUOTE_ORDER_STATUSES, RESOURCE_OPERATIONS, RETIRED_CART_STATUSES, type RedirectTargetType, type ResolveAccessInput, type ResolvedAddonSelection, SALE_TYPE_VALUES, SUBSCRIPTION_CHANNEL_VALUES, SUBSCRIPTION_TOPIC_LABELS, SUBSCRIPTION_TOPIC_VALUES, type SaleType, SaleTypeEnum, type SaleTypedLike, type StockDemandLine, type StockStatus, StockStatusEnum, type StockVerdict, StockVerdictEnum, type StoreAccessCheckInput, type StoreScopeInput, SubscriptionChannelEnum, SubscriptionTopicEnum, TRANSACTION_TYPE_VALUES, TransactionTypeEnum, type VariantOptionMode, WIRED_EMAIL_TEMPLATE_EVENTS, actionsForResource, addonUnitAmount, addonsOfLine, addonsUnitAmount, adjustmentsFor, applyPriceAdjustments, baseUnitPriceOfLine, can, canAny, canonicalizePath, canonicalizeSlug, conditionHolds, demandByKey, evaluateConfigurator, feeHint, formatMoney, grantedPermissions, groupHasDefaultAddon, hasStoreAccess, isConfigurationValid, isNonEmptyString, isQuoteOnlyItem, isValidAction, isValidEmail, missingGrants, normalizeLineQuantity, normalizeNumber, normalizePath, orderLogTypeColorMap, paymentLinkStatusColorMap, paymentMethodColorMap, paymentStatusColorMap, resolveAddonSelections, resolveEffectivePermissions, resolveProductAddonGroups, resolveStoreScope, roundMoney, saleTypeOf, statusColors, stockVerdict, toIdString, typeColorMap };
|
|
1527
|
+
export { ACTIVE_SUBSCRIPTION_CHANNELS, ADMIN_ACTIONS, ADMIN_AUDIT_ACTIONS, ADMIN_RESOURCES, ADMIN_RESOURCE_LIST, ALL_STORES, AWAITING_PAYMENT_STATUSES, type AddonAmountInput, type AddonSelectionRef, type ApiResponse, type BaseEntity, CAMPAIGN_RECIPIENT_STATUS_VALUES, CAMPAIGN_STATUS_VALUES, CART_STATUS_VALUES, CONFIGURATOR_CONDITION_TYPE_VALUES, CONFIGURATOR_EFFECT_TYPE_VALUES, CONFIGURATOR_SELECT_MODE_VALUES, CONFIGURATOR_SOURCE_VALUES, CampaignRecipientStatusEnum, CampaignStatusEnum, type CartIssue, type CartIssueType, CartIssueTypes, CartStatusEnum, type CartValidation, type CheckoutAddressInput, type CheckoutPayload, type CheckoutResult, ConfiguratorConditionTypeEnum, ConfiguratorEffectTypeEnum, ConfiguratorErrorCodeEnum, type ConfiguratorEvalContext, type ConfiguratorEvalError, type ConfiguratorEvalResult, ConfiguratorSelectModeEnum, type ConfiguratorSelections, ConfiguratorSourceEnum, DEFAULT_SUBSCRIPTION_TOPICS, DiscountTypeEnum, EMAIL_TEMPLATE_EVENT_VALUES, EMAIL_TEMPLATE_VARIABLES_BY_EVENT, EMPTY_ACCESS, type EffectiveAccess, EmailTemplateEventEnum, FEE_APPLIES_TO_VALUES, FeeAppliesToEnum, type IAddonConfig, type IAddonGroup, type IAddress, type IAdmin, type IAdminAction, type IAdminAuditAction, type IAdminAuditLog, type IAdminBaseAction, type IAdminPermission, type IAdminResource, type IAdminRole, type IAdminRoleCreate, type IAdminSafe, type IAdminStoreAccess, type IAppliedFee, type IBannerSlide, type IBlogAuthor, type IBlogCategory, type IBlogCitation, type IBlogPost, type IBrand, type ICampaign, type ICampaignRecipient, type ICampaignStats, type ICart, type ICartItem, type ICategory, type IConfigurator, type IConfiguratorCondition, type IConfiguratorEffect, type IConfiguratorFacet, type IConfiguratorFacetValue, type IConfiguratorOption, type IConfiguratorPriceAdjustment, type IConfiguratorQuery, type IConfiguratorRule, type IConfiguratorSection, type IConfiguratorStep, type IConfiguratorTarget, type IContact, type ICountry, type ICoupon, type ICurrency, type ICustomer, type IDiscountType, type IEmailTemplate, type IFaq, type IFaqCategory, type IKeyValue, type ILinePricing, type IMediaAsset, INVENTORY_POLICY_VALUES, type INotification, type IOrder, type IOrderItem, type IOrderLog, type IOrderTransaction, type IPaymentLink, type IPodcastEpisode, type IPrice, type IProduct, type IProductDailyStat, type IProductRelationGroup, type IProductTechnicalSpec, type IProductTechnicalSpecTable, type IProductVariantFields, type IProductVariantOptionGroup, type IProductVariantOptionMatrix, type IProductVariantOptionValue, type IRedirect, type IRedirectSuggestion, type IRefundTransaction, type IRelationGroup, type ISEOMetaData, type ISelectableFee, type IShipFromAddress, type IShipping, type IShippingRate, type IState, type IStock, type IStore, type IStoreFee, type IStoreSettings, type ISubscriber, type ISubscriberConsent, type ISubscription, type ISummaryPricing, type ITechnicalSpecColumn, type ITechnicalSpecGroup, type ITransactionBase, type IUnmatched404, type IVariant, type IVariantOptionSelection, type IWishlist, type IWishlistItem, type Id, type InventoryPolicy, InventoryPolicyEnum, type Metadata, NOTIFICATION_TYPE_VALUES, NotificationTypeEnum, OPEN_ORDER_STATUSES, ORDER_LOG_TYPE_VALUES, ORDER_STATUS_VALUES, OrderLogTypeEnum, OrderStatusEnum, PAYMENT_GATEWAY_VALUES, PAYMENT_LINK_STATUS_VALUES, PAYMENT_METHOD_VALUES, PAYMENT_STATUS_VALUES, PRICING_TYPE_VALUES, PRODUCT_VARIANT_TYPE_VALUES, PURCHASE_ORDER_STATUSES, PaymentGatewayEnum, PaymentLinkStatusEnum, PaymentMethodEnum, PaymentStatusEnum, type PricedLineLike, type PricingType, PricingTypeEnum, type ProductAddonScope, ProductEventTypeEnum, type ProductVariantType, ProductVariantTypeEnum, QUOTE_ORDER_STATUSES, RESOURCE_OPERATIONS, RETIRED_CART_STATUSES, type RedirectTargetType, type ResolveAccessInput, type ResolvedAddonSelection, SALE_TYPE_VALUES, SUBSCRIPTION_CHANNEL_VALUES, SUBSCRIPTION_TOPIC_LABELS, SUBSCRIPTION_TOPIC_VALUES, type SaleType, SaleTypeEnum, type SaleTypedLike, type StockDemandLine, type StockStatus, StockStatusEnum, type StockVerdict, StockVerdictEnum, type StoreAccessCheckInput, type StoreScopeInput, SubscriptionChannelEnum, SubscriptionTopicEnum, TRANSACTION_TYPE_VALUES, TransactionTypeEnum, type VariantOptionMode, WIRED_EMAIL_TEMPLATE_EVENTS, actionsForResource, addonUnitAmount, addonsOfLine, addonsUnitAmount, adjustmentsFor, applyPriceAdjustments, baseUnitPriceOfLine, can, canAny, canonicalizePath, canonicalizeSlug, conditionHolds, demandByKey, evaluateConfigurator, feeHint, formatMoney, grantedPermissions, groupHasDefaultAddon, hasStoreAccess, isConfigurationValid, isNonEmptyString, isQuoteOnlyItem, isValidAction, isValidEmail, missingGrants, normalizeLineQuantity, normalizeNumber, normalizePath, orderLogTypeColorMap, paymentLinkStatusColorMap, paymentMethodColorMap, paymentStatusColorMap, resolveAddonSelections, resolveEffectivePermissions, resolveProductAddonGroups, resolveStoreScope, roundMoney, saleTypeOf, statusColors, stockVerdict, toIdString, typeColorMap };
|
package/dist/index.d.ts
CHANGED
|
@@ -419,6 +419,7 @@ declare const PaymentStatusEnum: {
|
|
|
419
419
|
};
|
|
420
420
|
type PaymentStatusEnum = (typeof PaymentStatusEnum)[keyof typeof PaymentStatusEnum];
|
|
421
421
|
declare const PAYMENT_STATUS_VALUES: ("INITIATED" | "PENDING" | "PROCESSING" | "FAILED" | "CANCELLED" | "PENDING_CAPTURE" | "COMPLETED" | "VOIDED" | "REDIRECTED_TO_GATEWAY" | "UNKNOWN" | "REFUNDED" | "PARTIALLY_REFUNDED" | "NOT_REQUIRED")[];
|
|
422
|
+
declare const AWAITING_PAYMENT_STATUSES: PaymentStatusEnum[];
|
|
422
423
|
declare const paymentStatusColorMap: Record<PaymentStatusEnum, string>;
|
|
423
424
|
declare const PaymentMethodEnum: {
|
|
424
425
|
readonly CREDIT_CARD: "CREDIT_CARD";
|
|
@@ -494,6 +495,7 @@ type OrderStatusEnum = (typeof OrderStatusEnum)[keyof typeof OrderStatusEnum];
|
|
|
494
495
|
declare const ORDER_STATUS_VALUES: ("PENDING" | "PROCESSING" | "FAILED" | "REFUNDED" | "PARTIALLY_REFUNDED" | "CREATED" | "RECEIVED" | "CONFIRMED" | "SHIPPED" | "DELIVERED" | "CANCELED" | "ARCHIVED" | "RETURNED" | "QUOTE_REQUESTED" | "QUOTED" | "QUOTE_ACCEPTED" | "QUOTE_DECLINED" | "QUOTE_EXPIRED")[];
|
|
495
496
|
declare const statusColors: Record<OrderStatusEnum, string>;
|
|
496
497
|
declare const PURCHASE_ORDER_STATUSES: OrderStatusEnum[];
|
|
498
|
+
declare const OPEN_ORDER_STATUSES: OrderStatusEnum[];
|
|
497
499
|
declare const QUOTE_ORDER_STATUSES: OrderStatusEnum[];
|
|
498
500
|
interface IOrder extends BaseEntity {
|
|
499
501
|
orderId: string;
|
|
@@ -1522,4 +1524,4 @@ interface IWishlist extends BaseEntity {
|
|
|
1522
1524
|
items: IWishlistItem[];
|
|
1523
1525
|
}
|
|
1524
1526
|
|
|
1525
|
-
export { ACTIVE_SUBSCRIPTION_CHANNELS, ADMIN_ACTIONS, ADMIN_AUDIT_ACTIONS, ADMIN_RESOURCES, ADMIN_RESOURCE_LIST, ALL_STORES, type AddonAmountInput, type AddonSelectionRef, type ApiResponse, type BaseEntity, CAMPAIGN_RECIPIENT_STATUS_VALUES, CAMPAIGN_STATUS_VALUES, CART_STATUS_VALUES, CONFIGURATOR_CONDITION_TYPE_VALUES, CONFIGURATOR_EFFECT_TYPE_VALUES, CONFIGURATOR_SELECT_MODE_VALUES, CONFIGURATOR_SOURCE_VALUES, CampaignRecipientStatusEnum, CampaignStatusEnum, type CartIssue, type CartIssueType, CartIssueTypes, CartStatusEnum, type CartValidation, type CheckoutAddressInput, type CheckoutPayload, type CheckoutResult, ConfiguratorConditionTypeEnum, ConfiguratorEffectTypeEnum, ConfiguratorErrorCodeEnum, type ConfiguratorEvalContext, type ConfiguratorEvalError, type ConfiguratorEvalResult, ConfiguratorSelectModeEnum, type ConfiguratorSelections, ConfiguratorSourceEnum, DEFAULT_SUBSCRIPTION_TOPICS, DiscountTypeEnum, EMAIL_TEMPLATE_EVENT_VALUES, EMAIL_TEMPLATE_VARIABLES_BY_EVENT, EMPTY_ACCESS, type EffectiveAccess, EmailTemplateEventEnum, FEE_APPLIES_TO_VALUES, FeeAppliesToEnum, type IAddonConfig, type IAddonGroup, type IAddress, type IAdmin, type IAdminAction, type IAdminAuditAction, type IAdminAuditLog, type IAdminBaseAction, type IAdminPermission, type IAdminResource, type IAdminRole, type IAdminRoleCreate, type IAdminSafe, type IAdminStoreAccess, type IAppliedFee, type IBannerSlide, type IBlogAuthor, type IBlogCategory, type IBlogCitation, type IBlogPost, type IBrand, type ICampaign, type ICampaignRecipient, type ICampaignStats, type ICart, type ICartItem, type ICategory, type IConfigurator, type IConfiguratorCondition, type IConfiguratorEffect, type IConfiguratorFacet, type IConfiguratorFacetValue, type IConfiguratorOption, type IConfiguratorPriceAdjustment, type IConfiguratorQuery, type IConfiguratorRule, type IConfiguratorSection, type IConfiguratorStep, type IConfiguratorTarget, type IContact, type ICountry, type ICoupon, type ICurrency, type ICustomer, type IDiscountType, type IEmailTemplate, type IFaq, type IFaqCategory, type IKeyValue, type ILinePricing, type IMediaAsset, INVENTORY_POLICY_VALUES, type INotification, type IOrder, type IOrderItem, type IOrderLog, type IOrderTransaction, type IPaymentLink, type IPodcastEpisode, type IPrice, type IProduct, type IProductDailyStat, type IProductRelationGroup, type IProductTechnicalSpec, type IProductTechnicalSpecTable, type IProductVariantFields, type IProductVariantOptionGroup, type IProductVariantOptionMatrix, type IProductVariantOptionValue, type IRedirect, type IRedirectSuggestion, type IRefundTransaction, type IRelationGroup, type ISEOMetaData, type ISelectableFee, type IShipFromAddress, type IShipping, type IShippingRate, type IState, type IStock, type IStore, type IStoreFee, type IStoreSettings, type ISubscriber, type ISubscriberConsent, type ISubscription, type ISummaryPricing, type ITechnicalSpecColumn, type ITechnicalSpecGroup, type ITransactionBase, type IUnmatched404, type IVariant, type IVariantOptionSelection, type IWishlist, type IWishlistItem, type Id, type InventoryPolicy, InventoryPolicyEnum, type Metadata, NOTIFICATION_TYPE_VALUES, NotificationTypeEnum, ORDER_LOG_TYPE_VALUES, ORDER_STATUS_VALUES, OrderLogTypeEnum, OrderStatusEnum, PAYMENT_GATEWAY_VALUES, PAYMENT_LINK_STATUS_VALUES, PAYMENT_METHOD_VALUES, PAYMENT_STATUS_VALUES, PRICING_TYPE_VALUES, PRODUCT_VARIANT_TYPE_VALUES, PURCHASE_ORDER_STATUSES, PaymentGatewayEnum, PaymentLinkStatusEnum, PaymentMethodEnum, PaymentStatusEnum, type PricedLineLike, type PricingType, PricingTypeEnum, type ProductAddonScope, ProductEventTypeEnum, type ProductVariantType, ProductVariantTypeEnum, QUOTE_ORDER_STATUSES, RESOURCE_OPERATIONS, RETIRED_CART_STATUSES, type RedirectTargetType, type ResolveAccessInput, type ResolvedAddonSelection, SALE_TYPE_VALUES, SUBSCRIPTION_CHANNEL_VALUES, SUBSCRIPTION_TOPIC_LABELS, SUBSCRIPTION_TOPIC_VALUES, type SaleType, SaleTypeEnum, type SaleTypedLike, type StockDemandLine, type StockStatus, StockStatusEnum, type StockVerdict, StockVerdictEnum, type StoreAccessCheckInput, type StoreScopeInput, SubscriptionChannelEnum, SubscriptionTopicEnum, TRANSACTION_TYPE_VALUES, TransactionTypeEnum, type VariantOptionMode, WIRED_EMAIL_TEMPLATE_EVENTS, actionsForResource, addonUnitAmount, addonsOfLine, addonsUnitAmount, adjustmentsFor, applyPriceAdjustments, baseUnitPriceOfLine, can, canAny, canonicalizePath, canonicalizeSlug, conditionHolds, demandByKey, evaluateConfigurator, feeHint, formatMoney, grantedPermissions, groupHasDefaultAddon, hasStoreAccess, isConfigurationValid, isNonEmptyString, isQuoteOnlyItem, isValidAction, isValidEmail, missingGrants, normalizeLineQuantity, normalizeNumber, normalizePath, orderLogTypeColorMap, paymentLinkStatusColorMap, paymentMethodColorMap, paymentStatusColorMap, resolveAddonSelections, resolveEffectivePermissions, resolveProductAddonGroups, resolveStoreScope, roundMoney, saleTypeOf, statusColors, stockVerdict, toIdString, typeColorMap };
|
|
1527
|
+
export { ACTIVE_SUBSCRIPTION_CHANNELS, ADMIN_ACTIONS, ADMIN_AUDIT_ACTIONS, ADMIN_RESOURCES, ADMIN_RESOURCE_LIST, ALL_STORES, AWAITING_PAYMENT_STATUSES, type AddonAmountInput, type AddonSelectionRef, type ApiResponse, type BaseEntity, CAMPAIGN_RECIPIENT_STATUS_VALUES, CAMPAIGN_STATUS_VALUES, CART_STATUS_VALUES, CONFIGURATOR_CONDITION_TYPE_VALUES, CONFIGURATOR_EFFECT_TYPE_VALUES, CONFIGURATOR_SELECT_MODE_VALUES, CONFIGURATOR_SOURCE_VALUES, CampaignRecipientStatusEnum, CampaignStatusEnum, type CartIssue, type CartIssueType, CartIssueTypes, CartStatusEnum, type CartValidation, type CheckoutAddressInput, type CheckoutPayload, type CheckoutResult, ConfiguratorConditionTypeEnum, ConfiguratorEffectTypeEnum, ConfiguratorErrorCodeEnum, type ConfiguratorEvalContext, type ConfiguratorEvalError, type ConfiguratorEvalResult, ConfiguratorSelectModeEnum, type ConfiguratorSelections, ConfiguratorSourceEnum, DEFAULT_SUBSCRIPTION_TOPICS, DiscountTypeEnum, EMAIL_TEMPLATE_EVENT_VALUES, EMAIL_TEMPLATE_VARIABLES_BY_EVENT, EMPTY_ACCESS, type EffectiveAccess, EmailTemplateEventEnum, FEE_APPLIES_TO_VALUES, FeeAppliesToEnum, type IAddonConfig, type IAddonGroup, type IAddress, type IAdmin, type IAdminAction, type IAdminAuditAction, type IAdminAuditLog, type IAdminBaseAction, type IAdminPermission, type IAdminResource, type IAdminRole, type IAdminRoleCreate, type IAdminSafe, type IAdminStoreAccess, type IAppliedFee, type IBannerSlide, type IBlogAuthor, type IBlogCategory, type IBlogCitation, type IBlogPost, type IBrand, type ICampaign, type ICampaignRecipient, type ICampaignStats, type ICart, type ICartItem, type ICategory, type IConfigurator, type IConfiguratorCondition, type IConfiguratorEffect, type IConfiguratorFacet, type IConfiguratorFacetValue, type IConfiguratorOption, type IConfiguratorPriceAdjustment, type IConfiguratorQuery, type IConfiguratorRule, type IConfiguratorSection, type IConfiguratorStep, type IConfiguratorTarget, type IContact, type ICountry, type ICoupon, type ICurrency, type ICustomer, type IDiscountType, type IEmailTemplate, type IFaq, type IFaqCategory, type IKeyValue, type ILinePricing, type IMediaAsset, INVENTORY_POLICY_VALUES, type INotification, type IOrder, type IOrderItem, type IOrderLog, type IOrderTransaction, type IPaymentLink, type IPodcastEpisode, type IPrice, type IProduct, type IProductDailyStat, type IProductRelationGroup, type IProductTechnicalSpec, type IProductTechnicalSpecTable, type IProductVariantFields, type IProductVariantOptionGroup, type IProductVariantOptionMatrix, type IProductVariantOptionValue, type IRedirect, type IRedirectSuggestion, type IRefundTransaction, type IRelationGroup, type ISEOMetaData, type ISelectableFee, type IShipFromAddress, type IShipping, type IShippingRate, type IState, type IStock, type IStore, type IStoreFee, type IStoreSettings, type ISubscriber, type ISubscriberConsent, type ISubscription, type ISummaryPricing, type ITechnicalSpecColumn, type ITechnicalSpecGroup, type ITransactionBase, type IUnmatched404, type IVariant, type IVariantOptionSelection, type IWishlist, type IWishlistItem, type Id, type InventoryPolicy, InventoryPolicyEnum, type Metadata, NOTIFICATION_TYPE_VALUES, NotificationTypeEnum, OPEN_ORDER_STATUSES, ORDER_LOG_TYPE_VALUES, ORDER_STATUS_VALUES, OrderLogTypeEnum, OrderStatusEnum, PAYMENT_GATEWAY_VALUES, PAYMENT_LINK_STATUS_VALUES, PAYMENT_METHOD_VALUES, PAYMENT_STATUS_VALUES, PRICING_TYPE_VALUES, PRODUCT_VARIANT_TYPE_VALUES, PURCHASE_ORDER_STATUSES, PaymentGatewayEnum, PaymentLinkStatusEnum, PaymentMethodEnum, PaymentStatusEnum, type PricedLineLike, type PricingType, PricingTypeEnum, type ProductAddonScope, ProductEventTypeEnum, type ProductVariantType, ProductVariantTypeEnum, QUOTE_ORDER_STATUSES, RESOURCE_OPERATIONS, RETIRED_CART_STATUSES, type RedirectTargetType, type ResolveAccessInput, type ResolvedAddonSelection, SALE_TYPE_VALUES, SUBSCRIPTION_CHANNEL_VALUES, SUBSCRIPTION_TOPIC_LABELS, SUBSCRIPTION_TOPIC_VALUES, type SaleType, SaleTypeEnum, type SaleTypedLike, type StockDemandLine, type StockStatus, StockStatusEnum, type StockVerdict, StockVerdictEnum, type StoreAccessCheckInput, type StoreScopeInput, SubscriptionChannelEnum, SubscriptionTopicEnum, TRANSACTION_TYPE_VALUES, TransactionTypeEnum, type VariantOptionMode, WIRED_EMAIL_TEMPLATE_EVENTS, actionsForResource, addonUnitAmount, addonsOfLine, addonsUnitAmount, adjustmentsFor, applyPriceAdjustments, baseUnitPriceOfLine, can, canAny, canonicalizePath, canonicalizeSlug, conditionHolds, demandByKey, evaluateConfigurator, feeHint, formatMoney, grantedPermissions, groupHasDefaultAddon, hasStoreAccess, isConfigurationValid, isNonEmptyString, isQuoteOnlyItem, isValidAction, isValidEmail, missingGrants, normalizeLineQuantity, normalizeNumber, normalizePath, orderLogTypeColorMap, paymentLinkStatusColorMap, paymentMethodColorMap, paymentStatusColorMap, resolveAddonSelections, resolveEffectivePermissions, resolveProductAddonGroups, resolveStoreScope, roundMoney, saleTypeOf, statusColors, stockVerdict, toIdString, typeColorMap };
|
package/dist/index.js
CHANGED
|
@@ -26,6 +26,7 @@ __export(index_exports, {
|
|
|
26
26
|
ADMIN_RESOURCES: () => ADMIN_RESOURCES,
|
|
27
27
|
ADMIN_RESOURCE_LIST: () => ADMIN_RESOURCE_LIST,
|
|
28
28
|
ALL_STORES: () => ALL_STORES,
|
|
29
|
+
AWAITING_PAYMENT_STATUSES: () => AWAITING_PAYMENT_STATUSES,
|
|
29
30
|
CAMPAIGN_RECIPIENT_STATUS_VALUES: () => CAMPAIGN_RECIPIENT_STATUS_VALUES,
|
|
30
31
|
CAMPAIGN_STATUS_VALUES: () => CAMPAIGN_STATUS_VALUES,
|
|
31
32
|
CART_STATUS_VALUES: () => CART_STATUS_VALUES,
|
|
@@ -54,6 +55,7 @@ __export(index_exports, {
|
|
|
54
55
|
InventoryPolicyEnum: () => InventoryPolicyEnum,
|
|
55
56
|
NOTIFICATION_TYPE_VALUES: () => NOTIFICATION_TYPE_VALUES,
|
|
56
57
|
NotificationTypeEnum: () => NotificationTypeEnum,
|
|
58
|
+
OPEN_ORDER_STATUSES: () => OPEN_ORDER_STATUSES,
|
|
57
59
|
ORDER_LOG_TYPE_VALUES: () => ORDER_LOG_TYPE_VALUES,
|
|
58
60
|
ORDER_STATUS_VALUES: () => ORDER_STATUS_VALUES,
|
|
59
61
|
OrderLogTypeEnum: () => OrderLogTypeEnum,
|
|
@@ -943,6 +945,14 @@ var PURCHASE_ORDER_STATUSES = [
|
|
|
943
945
|
OrderStatusEnum.ARCHIVED,
|
|
944
946
|
OrderStatusEnum.RETURNED
|
|
945
947
|
];
|
|
948
|
+
var OPEN_ORDER_STATUSES = [
|
|
949
|
+
OrderStatusEnum.CREATED,
|
|
950
|
+
OrderStatusEnum.RECEIVED,
|
|
951
|
+
OrderStatusEnum.PENDING,
|
|
952
|
+
OrderStatusEnum.CONFIRMED,
|
|
953
|
+
OrderStatusEnum.PROCESSING,
|
|
954
|
+
OrderStatusEnum.SHIPPED
|
|
955
|
+
];
|
|
946
956
|
var QUOTE_ORDER_STATUSES = [
|
|
947
957
|
OrderStatusEnum.QUOTE_REQUESTED,
|
|
948
958
|
OrderStatusEnum.QUOTED,
|
|
@@ -1105,6 +1115,15 @@ var PaymentStatusEnum = {
|
|
|
1105
1115
|
NOT_REQUIRED: "NOT_REQUIRED"
|
|
1106
1116
|
};
|
|
1107
1117
|
var PAYMENT_STATUS_VALUES = Object.values(PaymentStatusEnum);
|
|
1118
|
+
var AWAITING_PAYMENT_STATUSES = [
|
|
1119
|
+
PaymentStatusEnum.INITIATED,
|
|
1120
|
+
PaymentStatusEnum.PENDING,
|
|
1121
|
+
PaymentStatusEnum.PROCESSING,
|
|
1122
|
+
PaymentStatusEnum.PENDING_CAPTURE,
|
|
1123
|
+
PaymentStatusEnum.REDIRECTED_TO_GATEWAY,
|
|
1124
|
+
PaymentStatusEnum.FAILED,
|
|
1125
|
+
PaymentStatusEnum.UNKNOWN
|
|
1126
|
+
];
|
|
1108
1127
|
var paymentStatusColorMap = {
|
|
1109
1128
|
[PaymentStatusEnum.INITIATED]: "default",
|
|
1110
1129
|
[PaymentStatusEnum.PENDING]: "gold",
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/admin/interface.ts","../src/admin/access.ts","../src/common/objectId.ts","../src/common/validate.ts","../src/coupon/interface.ts","../src/productVariantOptions/interface.ts","../src/addonConfig/interface.ts","../src/addonConfig/resolve.ts","../src/storeFee/interface.ts","../src/emailTemplate/interface.ts","../src/configurator/interface.ts","../src/pricing/index.ts","../src/configurator/evaluate.ts","../src/inventory/interface.ts","../src/saleType/interface.ts","../src/saleType/rules.ts","../src/path/index.ts","../src/order/interface.ts","../src/orderLog/interface.ts","../src/paymentLink/interface.ts","../src/cart/interface.ts","../src/cartItem/stock.ts","../src/subscriber/interface.ts","../src/campaign/interface.ts","../src/stock/interface.ts","../src/transaction/interface.ts","../src/analytics/interface.ts","../src/notification/interface.ts"],"sourcesContent":["export * from './address';\nexport * from './admin';\nexport * from './base';\nexport * from './common';\nexport * from './country';\nexport * from './customer';\nexport * from './state';\nexport * from './store';\nexport * from './currency';\nexport * from './contact';\nexport * from './coupon';\nexport * from './product';\nexport * from './productVariantOptions';\nexport * from './productTechnicalSpec';\nexport * from './addonConfig';\nexport * from './storeFee';\nexport * from './emailTemplate';\nexport * from './relationGroup';\nexport * from './configurator';\nexport * from './inventory';\nexport * from './saleType';\nexport * from './redirect';\nexport * from './path';\nexport * from './pricing';\nexport * from './variant';\nexport * from './productVariant';\nexport * from './order';\nexport * from './orderItem';\nexport * from './orderLog';\nexport * from './paymentLink';\nexport * from './cart';\nexport * from './cartItem';\nexport * from './subscriber';\nexport * from './campaign';\nexport * from './category';\nexport * from './blog';\nexport * from './faq';\nexport * from './podcast';\nexport * from './brand';\nexport * from './stock';\nexport * from './transaction';\nexport * from './checkout';\nexport * from './analytics';\nexport * from './notification';\nexport * from './shipping';\nexport * from './wishlist';\n","import type { BaseEntity } from '../base/interface';\n\nexport const ADMIN_RESOURCE_LIST = [\n { value: 'dashboard', label: 'Dashboard', group: 'Overview' },\n { value: 'metrics', label: 'Metrics', group: 'Overview' },\n { value: 'products', label: 'Products', group: 'Catalog' },\n { value: 'categories', label: 'Categories', group: 'Catalog' },\n { value: 'brands', label: 'Brands', group: 'Catalog' },\n { value: 'technical-specs', label: 'Technical Specs', group: 'Catalog' },\n { value: 'addon-configs', label: 'Addon Configs', group: 'Catalog' },\n { value: 'relation-groups', label: 'Relation Groups', group: 'Catalog' },\n { value: 'configurators', label: 'Configurators', group: 'Catalog' },\n { value: 'orders', label: 'Orders', group: 'Commerce' },\n { value: 'quotes', label: 'Quotes', group: 'Commerce' },\n { value: 'carts', label: 'Carts', group: 'Commerce' },\n { value: 'transactions', label: 'Transactions', group: 'Commerce' },\n { value: 'coupons', label: 'Coupons', group: 'Commerce' },\n { value: 'store-fees', label: 'Store Fees', group: 'Commerce' },\n { value: 'customers', label: 'Customers', group: 'People' },\n { value: 'contact-us', label: 'Contact Requests', group: 'People' },\n { value: 'subscribers', label: 'Subscribers', group: 'People' },\n { value: 'blog', label: 'Blog', group: 'Content' },\n { value: 'faqs', label: 'FAQs', group: 'Content' },\n { value: 'podcast', label: 'Podcast', group: 'Content' },\n { value: 'email-templates', label: 'Email Templates', group: 'Content' },\n { value: 'notifications', label: 'Notifications', group: 'Content' },\n { value: 'campaigns', label: 'Campaigns', group: 'Content' },\n { value: 'stores', label: 'Stores', group: 'Settings' },\n { value: 'currencies', label: 'Currencies', group: 'Settings' },\n { value: 'redirects', label: 'Redirects', group: 'Settings' },\n { value: 'cache', label: 'Cache', group: 'Settings' },\n { value: 'admins', label: 'Admins', group: 'Settings' },\n { value: 'account', label: 'Account', group: 'Settings' },\n] as const;\n\nexport const ADMIN_RESOURCES = ADMIN_RESOURCE_LIST.map((entry) => entry.value);\n\nexport type IAdminResource = (typeof ADMIN_RESOURCE_LIST)[number]['value'];\n\nexport const ADMIN_ACTIONS = ['read', 'write', 'delete'] as const;\n\nexport type IAdminBaseAction = (typeof ADMIN_ACTIONS)[number];\n\nexport const RESOURCE_OPERATIONS: Partial<Record<IAdminResource, readonly string[]>> = {\n products: ['sync'],\n brands: ['sync'],\n categories: ['sync'],\n orders: ['charge'],\n transactions: ['refund'],\n cache: ['purge'],\n};\n\nexport type IAdminAction = IAdminBaseAction | string;\n\nexport const actionsForResource = (resource: IAdminResource): IAdminAction[] => [\n ...ADMIN_ACTIONS,\n ...(RESOURCE_OPERATIONS[resource] ?? []),\n];\n\nexport const isValidAction = (resource: IAdminResource, action: string): boolean =>\n actionsForResource(resource).includes(action);\n\nexport interface IAdminPermission {\n resource: IAdminResource;\n actions: IAdminAction[];\n}\n\nexport interface IAdminStoreAccess {\n store: string;\n role?: string | null;\n extras: IAdminPermission[];\n}\n\nexport interface IAdminRole extends BaseEntity {\n key: string;\n name: string;\n description: string;\n permissions: IAdminPermission[];\n isSuperAdmin: boolean;\n isSystem: boolean;\n}\n\nexport type IAdminRoleCreate = Omit<IAdminRole, keyof BaseEntity>;\nexport interface IAdmin extends BaseEntity {\n firstName: string;\n lastName: string;\n email: string;\n phoneNumber: string;\n status: boolean;\n password: string;\n role: string;\n access_list: string[];\n storeAccess: IAdminStoreAccess[];\n resetPasswordTokenHash?: string;\n resetPasswordTokenExpiresAt?: Date | null;\n joiningDate: Date;\n profileImage: string;\n lastLogin: Date;\n}\n\nexport type IAdminSafe = Omit<IAdmin, 'password'>;\n\nexport const ADMIN_AUDIT_ACTIONS = [\n 'role.create',\n 'role.update',\n 'role.delete',\n 'admin.create',\n 'admin.role',\n 'admin.grants',\n 'admin.status',\n 'admin.delete',\n] as const;\n\nexport type IAdminAuditAction = (typeof ADMIN_AUDIT_ACTIONS)[number];\n\nexport interface IAdminAuditLog extends BaseEntity {\n actor: IAdmin | string;\n actorName: string;\n action: IAdminAuditAction;\n targetAdmin?: IAdmin | string | null;\n targetRole?: IAdminRole | string | null;\n store?: string | null;\n summary: string;\n before?: Record<string, unknown> | null;\n after?: Record<string, unknown> | null;\n}\n","import type {\n IAdminAction,\n IAdminPermission,\n IAdminResource,\n IAdminRole,\n IAdminStoreAccess,\n} from './interface';\n\nexport interface EffectiveAccess {\n isSuperAdmin: boolean;\n permissions: Record<string, string[]>;\n}\n\nexport interface ResolveAccessInput {\n role?: string | null;\n storeAccess?: IAdminStoreAccess[];\n roles: Record<string, Pick<IAdminRole, 'permissions' | 'isSuperAdmin'>>;\n storeId?: string | null;\n}\n\nexport const EMPTY_ACCESS: EffectiveAccess = { isSuperAdmin: false, permissions: {} };\n\nconst addGrant = (into: Map<string, Set<string>>, grants: IAdminPermission[] = []): void => {\n for (const { resource, actions } of grants) {\n const bucket = into.get(resource) ?? new Set<string>();\n for (const action of actions ?? []) bucket.add(action);\n into.set(resource, bucket);\n }\n};\n\nconst idOf = (value: unknown): string => (value == null ? '' : String(value));\n\nconst rowApplies = (row: IAdminStoreAccess, storeId: string | null): boolean => {\n const rowStore = idOf(row.store);\n if (!rowStore || rowStore === '*') return true;\n if (!storeId) return true;\n return rowStore === storeId;\n};\n\nexport const resolveEffectivePermissions = (input: ResolveAccessInput): EffectiveAccess => {\n const { roles, storeAccess = [] } = input;\n const storeId = input.storeId == null ? null : idOf(input.storeId);\n\n const globalRole = input.role ? roles[input.role] : undefined;\n if (globalRole?.isSuperAdmin) {\n return { isSuperAdmin: true, permissions: {} };\n }\n\n const merged = new Map<string, Set<string>>();\n addGrant(merged, globalRole?.permissions);\n\n for (const row of storeAccess) {\n if (!rowApplies(row, storeId)) continue;\n\n const rowRole = row.role ? roles[row.role] : undefined;\n if (rowRole?.isSuperAdmin) {\n return { isSuperAdmin: true, permissions: {} };\n }\n\n addGrant(merged, rowRole?.permissions);\n addGrant(merged, row.extras);\n }\n\n const permissions: Record<string, string[]> = {};\n for (const [resource, actions] of merged) {\n if (actions.size > 0) permissions[resource] = [...actions].sort();\n }\n\n return { isSuperAdmin: false, permissions };\n};\n\nexport const can = (\n access: EffectiveAccess,\n resource: IAdminResource,\n action: IAdminAction\n): boolean => {\n if (access.isSuperAdmin) return true;\n return access.permissions[resource]?.includes(action) === true;\n};\n\nexport const canAny = (access: EffectiveAccess, resource: IAdminResource): boolean => {\n if (access.isSuperAdmin) return true;\n return (access.permissions[resource]?.length ?? 0) > 0;\n};\n\nexport const grantedPermissions = (access: EffectiveAccess): IAdminPermission[] =>\n Object.entries(access.permissions).map(([resource, actions]) => ({\n resource: resource as IAdminResource,\n actions: actions as IAdminAction[],\n }));\n\nexport const missingGrants = (\n actor: EffectiveAccess,\n requested: IAdminPermission[]\n): string[] => {\n if (actor.isSuperAdmin) return [];\n\n const missing: string[] = [];\n for (const { resource, actions } of requested) {\n for (const action of actions ?? []) {\n if (!can(actor, resource, action)) missing.push(`${resource}:${action}`);\n }\n }\n return missing;\n};\n\nexport const ALL_STORES = '*';\n\nexport interface StoreScopeInput {\n role?: string | null;\n storeAccess?: IAdminStoreAccess[];\n roles: Record<string, Pick<IAdminRole, 'permissions' | 'isSuperAdmin'>>;\n}\n\nexport const resolveStoreScope = (input: StoreScopeInput): string[] | null => {\n const { roles, storeAccess = [] } = input;\n\n if (input.role && roles[input.role]?.isSuperAdmin) return null;\n\n const scoped: string[] = [];\n for (const row of storeAccess) {\n const store = idOf(row.store);\n if (!store || store === ALL_STORES) return null;\n scoped.push(store);\n }\n\n return scoped;\n};\n\nexport interface StoreAccessCheckInput extends StoreScopeInput {\n storeId?: string | null;\n}\n\nexport const hasStoreAccess = (input: StoreAccessCheckInput): boolean => {\n const scope = resolveStoreScope(input);\n if (scope === null) return true;\n\n const storeId = idOf(input.storeId);\n if (!storeId) return false;\n\n return scope.includes(storeId);\n};\n","export const toIdString = (value: unknown): string => {\n if (!value) return \"\";\n if (typeof value === \"string\") return value;\n\n if (typeof value === \"object\") {\n const candidate = value as { toHexString?: unknown; _id?: unknown };\n\n if (typeof candidate.toHexString === \"function\") {\n return (candidate.toHexString as () => string)();\n }\n\n if (\"_id\" in candidate && candidate._id !== value) {\n return toIdString(candidate._id);\n }\n }\n\n return String(value);\n};\n","export const isNonEmptyString = (value: unknown): value is string =>\n typeof value === 'string' && value.trim().length > 0;\n\nexport const normalizeNumber = (value: unknown, fallback = 0): number => {\n if (typeof value === 'number') return Number.isFinite(value) ? value : fallback;\n if (typeof value === 'string' && value.trim() !== '') {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n }\n return fallback;\n};\n\nexport const isValidEmail = (email: unknown): email is string =>\n typeof email === 'string' && /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email.trim());\n","import type { BaseEntity } from \"../base\";\nimport type { IStore } from \"../store\";\n\nexport const DiscountTypeEnum = {\n PERCENTAGE: \"PERCENTAGE\",\n FIXED: \"FIXED\",\n} as const;\n\nexport type DiscountTypeEnum = (typeof DiscountTypeEnum)[keyof typeof DiscountTypeEnum];\n\nexport interface IDiscountType {\n type: DiscountTypeEnum;\n value: number;\n}\n\nexport interface ICoupon extends BaseEntity {\n title: string;\n couponCode: string;\n startTime: Date;\n endTime: Date;\n discountType: IDiscountType;\n minimumAmount: number;\n isPromotional: boolean;\n status: boolean;\n stores: IStore[];\n}\n","export type VariantOptionMode = \"OPTION_BACKED\" | \"MANUAL\";\n\nexport const ProductVariantTypeEnum = {\n SINGLE: \"SINGLE\",\n OPTION_BACKED: \"OPTION_BACKED\",\n MANUAL: \"MANUAL\",\n} as const;\n\nexport type ProductVariantType = (typeof ProductVariantTypeEnum)[keyof typeof ProductVariantTypeEnum];\n\nexport const PRODUCT_VARIANT_TYPE_VALUES = Object.values(ProductVariantTypeEnum);\n\nexport interface IProductVariantOptionValue {\n id?: string;\n valueKey: string;\n label: string;\n sortOrder: number;\n}\n\nexport interface IProductVariantOptionGroup {\n id?: string;\n optionKey: string;\n name: string;\n sortOrder: number;\n values: IProductVariantOptionValue[];\n}\n\nexport interface IProductVariantOptionMatrix {\n groups: IProductVariantOptionGroup[];\n optionSignatures: string[];\n}\n\nexport interface IVariantOptionSelection {\n id?: string;\n group?: string;\n value?: string;\n optionKey: string;\n optionName: string;\n valueKey: string;\n valueLabel: string;\n sortOrder: number;\n}\n\n","import type { BaseEntity } from \"../base\";\nimport type { IStore } from \"../store\";\n\nexport const PricingTypeEnum = {\n PERCENTAGE: \"PERCENTAGE\",\n FIXED: \"FIXED\",\n} as const;\n\nexport type PricingType = (typeof PricingTypeEnum)[keyof typeof PricingTypeEnum];\nexport const PRICING_TYPE_VALUES = Object.values(PricingTypeEnum);\n\nexport interface IAddonConfig extends BaseEntity {\n name: string;\n key: string;\n description: string;\n stores: (IStore | string)[];\n price: number;\n pricingType: PricingType;\n quantity: number;\n sortOrder: number;\n applyToAll: boolean;\n isDefault: boolean;\n isVisible: boolean;\n status: boolean;\n}\n\nexport interface IAddonGroup extends BaseEntity {\n name: string;\n key: string;\n description: string;\n addons: IAddonConfig[];\n sortOrder: number;\n isVisible: boolean;\n status: boolean;\n}\n","import type { IStore } from \"../store\";\nimport type { IAddonConfig, IAddonGroup } from \"./interface\";\n\nexport interface ProductAddonScope {\n storeId?: string;\n productAddonIds?: string[];\n}\n\nconst idOf = (value: unknown): string => {\n if (!value) return \"\";\n if (typeof value === \"string\") return value;\n const record = value as { _id?: unknown };\n return String(record._id ?? value);\n};\n\nconst isLive = (entity: { status?: boolean; isVisible?: boolean }): boolean =>\n entity.status !== false && entity.isVisible !== false;\n\nconst appliesToStore = (stores: (IStore | string)[] | undefined, storeId: string | undefined): boolean => {\n const list = stores ?? [];\n return list.length === 0 || (!!storeId && list.some((store) => idOf(store) === storeId));\n};\n\nconst appliesToProduct = (addon: IAddonConfig, attachedIds: string[]): boolean =>\n addon.applyToAll !== false || attachedIds.includes(idOf(addon._id));\n\nexport const resolveProductAddonGroups = (\n groups: IAddonGroup[],\n scope: ProductAddonScope = {},\n): IAddonGroup[] => {\n const addonIds = scope.productAddonIds ?? [];\n\n return groups\n .filter(isLive)\n .map((group) => ({\n ...group,\n addons: (group.addons ?? []).filter((addon: IAddonConfig) => (\n isLive(addon)\n && appliesToStore(addon.stores, scope.storeId)\n && appliesToProduct(addon, addonIds)\n )),\n }))\n .filter((group) => group.addons.length > 0);\n};\n\nexport const groupHasDefaultAddon = (group: IAddonGroup): boolean =>\n (group.addons ?? []).some((addon) => addon.isDefault && isLive(addon));\n\nexport interface AddonSelectionRef {\n groupKey: string;\n addonKey: string;\n}\n\nexport interface ResolvedAddonSelection extends AddonSelectionRef {\n addon: IAddonConfig;\n}\n\nexport const resolveAddonSelections = (\n groups: IAddonGroup[],\n selections: AddonSelectionRef[],\n): ResolvedAddonSelection[] => {\n const allowed = new Map<string, IAddonConfig>();\n const pickOne = new Set<string>();\n\n for (const group of groups) {\n if (groupHasDefaultAddon(group)) pickOne.add(group.key);\n for (const addon of group.addons ?? []) {\n allowed.set(`${group.key}:${addon.key}`, addon);\n }\n }\n\n const seen = new Set<string>();\n const filled = new Set<string>();\n const resolved: ResolvedAddonSelection[] = [];\n\n for (const selection of selections) {\n if (typeof selection?.groupKey !== \"string\" || typeof selection?.addonKey !== \"string\") continue;\n\n const pair = `${selection.groupKey}:${selection.addonKey}`;\n if (seen.has(pair)) continue;\n\n const addon = allowed.get(pair);\n if (!addon) continue;\n\n if (pickOne.has(selection.groupKey) && filled.has(selection.groupKey)) continue;\n\n seen.add(pair);\n filled.add(selection.groupKey);\n resolved.push({ groupKey: selection.groupKey, addonKey: selection.addonKey, addon });\n }\n\n return resolved;\n};\n","import type { BaseEntity } from \"../base\";\nimport type { PricingType } from \"../addonConfig\";\nimport type { IStore } from \"../store\";\n\nexport const FeeAppliesToEnum = {\n SUBTOTAL: \"SUBTOTAL\",\n TOTAL: \"TOTAL\",\n} as const;\n\nexport type FeeAppliesToEnum = (typeof FeeAppliesToEnum)[keyof typeof FeeAppliesToEnum];\nexport const FEE_APPLIES_TO_VALUES = Object.values(FeeAppliesToEnum);\n\nexport interface IStoreFee extends BaseEntity {\n stores: (IStore | string)[];\n name: string;\n key: string;\n description?: string;\n pricingType: PricingType;\n value: number;\n appliesTo: FeeAppliesToEnum;\n enabled: boolean;\n isVisible: boolean;\n optional: boolean;\n defaultSelected: boolean;\n sortOrder: number;\n status: boolean;\n}\n\nexport interface ISelectableFee {\n key: string;\n name: string;\n description?: string;\n pricingType: PricingType;\n value: number;\n appliesTo: FeeAppliesToEnum;\n optional: boolean;\n selected: boolean;\n amount: number;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { IStore } from \"../store\";\n\nexport const EmailTemplateEventEnum = {\n ORDER_RECEIVED: \"ORDER_RECEIVED\",\n ORDER_CANCELLED: \"ORDER_CANCELLED\",\n WELCOME: \"WELCOME\",\n PASSWORD_RESET: \"PASSWORD_RESET\",\n QUOTE: \"QUOTE\",\n QUOTE_REQUESTED: \"QUOTE_REQUESTED\",\n QUOTE_SENT: \"QUOTE_SENT\",\n QUOTE_DECLINED: \"QUOTE_DECLINED\",\n INVOICE: \"INVOICE\",\n PROMOTIONAL: \"PROMOTIONAL\",\n CONTACT_US: \"CONTACT_US\",\n NOTIFICATION: \"NOTIFICATION\",\n} as const;\n\nexport type EmailTemplateEventEnum = (typeof EmailTemplateEventEnum)[keyof typeof EmailTemplateEventEnum];\nexport const EMAIL_TEMPLATE_EVENT_VALUES = Object.values(EmailTemplateEventEnum);\n\nexport const WIRED_EMAIL_TEMPLATE_EVENTS: EmailTemplateEventEnum[] = [\n EmailTemplateEventEnum.ORDER_RECEIVED,\n EmailTemplateEventEnum.ORDER_CANCELLED,\n EmailTemplateEventEnum.QUOTE,\n EmailTemplateEventEnum.QUOTE_REQUESTED,\n EmailTemplateEventEnum.QUOTE_SENT,\n EmailTemplateEventEnum.QUOTE_DECLINED,\n EmailTemplateEventEnum.INVOICE,\n EmailTemplateEventEnum.WELCOME,\n EmailTemplateEventEnum.PASSWORD_RESET,\n EmailTemplateEventEnum.CONTACT_US,\n EmailTemplateEventEnum.NOTIFICATION,\n EmailTemplateEventEnum.PROMOTIONAL,\n];\n\nexport const EMAIL_TEMPLATE_VARIABLES_BY_EVENT: Partial<Record<EmailTemplateEventEnum, string[]>> = {\n [EmailTemplateEventEnum.ORDER_RECEIVED]: [\n \"customerName\", \"orderId\", \"orderDate\", \"itemsHtml\", \"subtotal\", \"shippingHandling\",\n \"estimatedTax\", \"grandTotal\", \"shippingAddress\", \"billingAddress\", \"shippingMethod\",\n \"paymentMethod\",\n ],\n [EmailTemplateEventEnum.ORDER_CANCELLED]: [\"customerName\", \"orderId\", \"reason\", \"refundAmount\"],\n [EmailTemplateEventEnum.QUOTE]: [\n \"customerName\", \"itemCount\", \"savedDate\", \"itemsHtml\", \"subtotal\", \"discount\", \"grandTotal\", \"quoteLink\",\n ],\n [EmailTemplateEventEnum.WELCOME]: [\"name\", \"appName\", \"ctaLabel\", \"ctaUrl\"],\n [EmailTemplateEventEnum.PASSWORD_RESET]: [\"name\", \"resetUrl\", \"expiryLabel\"],\n [EmailTemplateEventEnum.CONTACT_US]: [\"customerName\", \"caseNumber\", \"department\", \"subjectSummary\"],\n [EmailTemplateEventEnum.INVOICE]: [\n \"customerName\", \"orderId\", \"orderDate\", \"itemsHtml\", \"subtotal\", \"shippingHandling\",\n \"estimatedTax\", \"grandTotal\", \"amountDue\", \"shippingAddress\", \"billingAddress\", \"paymentLink\",\n ],\n [EmailTemplateEventEnum.QUOTE_REQUESTED]: [\n \"customerName\", \"quoteId\", \"requestDate\", \"itemCount\", \"customerNote\", \"itemsHtml\", \"shippingAddress\",\n ],\n [EmailTemplateEventEnum.QUOTE_SENT]: [\n \"customerName\", \"quoteId\", \"quoteDate\", \"itemsHtml\", \"subtotal\", \"shipping\", \"discount\",\n \"estimatedTax\", \"feesHtml\", \"grandTotal\", \"validUntil\", \"shippingAddress\", \"customerNote\",\n ],\n [EmailTemplateEventEnum.QUOTE_DECLINED]: [\"customerName\", \"quoteId\", \"reason\"],\n [EmailTemplateEventEnum.NOTIFICATION]: [\"recipientName\", \"title\", \"message\", \"ctaLabel\", \"ctaUrl\"],\n [EmailTemplateEventEnum.PROMOTIONAL]: [\"recipientName\", \"headline\", \"body\", \"ctaLabel\", \"ctaUrl\", \"unsubscribeUrl\"],\n};\n\nexport interface IEmailTemplate extends BaseEntity {\n stores: (IStore | string)[];\n name: string;\n key: string;\n event: EmailTemplateEventEnum;\n subject: string;\n headerHtml: string;\n bodyHtml: string;\n footerHtml: string;\n variables: string[];\n isVisible: boolean;\n status: boolean;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { PricingType } from \"../addonConfig\";\nimport type { IStore } from \"../store\";\n\nexport const ConfiguratorSelectModeEnum = {\n SINGLE: \"SINGLE\",\n MULTI: \"MULTI\",\n} as const;\n\nexport type ConfiguratorSelectModeEnum =\n (typeof ConfiguratorSelectModeEnum)[keyof typeof ConfiguratorSelectModeEnum];\nexport const CONFIGURATOR_SELECT_MODE_VALUES = Object.values(ConfiguratorSelectModeEnum);\n\nexport const ConfiguratorSourceEnum = {\n PICKED: \"PICKED\",\n QUERY: \"QUERY\",\n} as const;\n\nexport type ConfiguratorSourceEnum =\n (typeof ConfiguratorSourceEnum)[keyof typeof ConfiguratorSourceEnum];\nexport const CONFIGURATOR_SOURCE_VALUES = Object.values(ConfiguratorSourceEnum);\n\nexport const ConfiguratorConditionTypeEnum = {\n SELECTED: \"SELECTED\",\n ALL: \"ALL\",\n ANY: \"ANY\",\n NOT: \"NOT\",\n} as const;\n\nexport type ConfiguratorConditionTypeEnum =\n (typeof ConfiguratorConditionTypeEnum)[keyof typeof ConfiguratorConditionTypeEnum];\nexport const CONFIGURATOR_CONDITION_TYPE_VALUES = Object.values(ConfiguratorConditionTypeEnum);\n\nexport const ConfiguratorEffectTypeEnum = {\n SHOW: \"SHOW\",\n HIDE: \"HIDE\",\n REQUIRE: \"REQUIRE\",\n OPTIONAL: \"OPTIONAL\",\n SELECT: \"SELECT\",\n DESELECT: \"DESELECT\",\n PRICE_ADJUST: \"PRICE_ADJUST\",\n} as const;\n\nexport type ConfiguratorEffectTypeEnum =\n (typeof ConfiguratorEffectTypeEnum)[keyof typeof ConfiguratorEffectTypeEnum];\nexport const CONFIGURATOR_EFFECT_TYPE_VALUES = Object.values(ConfiguratorEffectTypeEnum);\n\nexport const ConfiguratorErrorCodeEnum = {\n REQUIRED_SECTION_EMPTY: \"REQUIRED_SECTION_EMPTY\",\n OPTION_NOT_AVAILABLE: \"OPTION_NOT_AVAILABLE\",\n SECTION_NOT_AVAILABLE: \"SECTION_NOT_AVAILABLE\",\n UNKNOWN_SECTION: \"UNKNOWN_SECTION\",\n SINGLE_SELECT_OVERFILLED: \"SINGLE_SELECT_OVERFILLED\",\n RULES_UNSTABLE: \"RULES_UNSTABLE\",\n} as const;\n\nexport type ConfiguratorErrorCodeEnum =\n (typeof ConfiguratorErrorCodeEnum)[keyof typeof ConfiguratorErrorCodeEnum];\nexport interface IConfiguratorQuery {\n search?: string;\n categories?: string[];\n brands?: string[];\n types?: string[];\n minPrice?: number;\n maxPrice?: number;\n inStock?: boolean;\n limit?: number;\n}\n\nexport interface IConfiguratorFacetValue {\n key: string;\n label: string;\n tags?: string[];\n query?: IConfiguratorQuery;\n isDefault?: boolean;\n}\n\nexport interface IConfiguratorFacet {\n key: string;\n label: string;\n values: IConfiguratorFacetValue[];\n}\n\nexport interface IConfiguratorOption {\n key: string;\n sku: string;\n tags?: string[];\n sortOrder?: number;\n}\n\nexport interface IConfiguratorSection {\n key: string;\n title: string;\n description?: string;\n selectMode: ConfiguratorSelectModeEnum;\n required: boolean;\n source: ConfiguratorSourceEnum;\n options?: IConfiguratorOption[];\n query?: IConfiguratorQuery;\n facets?: IConfiguratorFacet[];\n contentHtml?: string;\n sortOrder?: number;\n}\n\nexport interface IConfiguratorStep {\n key: string;\n title: string;\n description?: string;\n sections: IConfiguratorSection[];\n sortOrder?: number;\n}\n\nexport interface IConfiguratorTarget {\n sectionKey: string;\n optionKey?: string;\n tag?: string;\n}\n\nexport type IConfiguratorCondition =\n | {\n type: typeof ConfiguratorConditionTypeEnum.SELECTED;\n sectionKey: string;\n optionKeys?: string[];\n }\n | {\n type: typeof ConfiguratorConditionTypeEnum.ALL | typeof ConfiguratorConditionTypeEnum.ANY;\n conditions: IConfiguratorCondition[];\n }\n | {\n type: typeof ConfiguratorConditionTypeEnum.NOT;\n condition: IConfiguratorCondition;\n };\n\nexport interface IConfiguratorEffect {\n type: ConfiguratorEffectTypeEnum;\n target: IConfiguratorTarget;\n mode?: PricingType;\n amount?: number;\n}\n\nexport interface IConfiguratorPriceAdjustment {\n sectionKey: string;\n optionKey?: string;\n mode: PricingType;\n amount: number;\n}\n\nexport interface IConfiguratorRule {\n key: string;\n description?: string;\n when: IConfiguratorCondition;\n then: IConfiguratorEffect[];\n}\n\nexport interface IConfigurator extends BaseEntity {\n name: string;\n key: string;\n description: string;\n images?: string[];\n stores: (IStore | string)[];\n steps: IConfiguratorStep[];\n rules: IConfiguratorRule[];\n sortOrder: number;\n isVisible: boolean;\n status: boolean;\n}\n\nexport type ConfiguratorSelections = Record<string, string[]>;\n","import { PricingTypeEnum, type PricingType } from \"../addonConfig\";\nimport { FeeAppliesToEnum } from \"../storeFee\";\nimport type { IAppliedFee } from \"../common\";\n\nexport const roundMoney = (amount: number): number => {\n if (!Number.isFinite(amount)) return 0;\n return Math.round((amount + Number.EPSILON) * 100) / 100;\n};\n\nconst moneyFormatters = new Map<string, Intl.NumberFormat>();\n\nconst moneyFormatter = (currencyCode: string): Intl.NumberFormat => {\n let formatter = moneyFormatters.get(currencyCode);\n if (!formatter) {\n formatter = new Intl.NumberFormat(\"en-US\", { style: \"currency\", currency: currencyCode });\n moneyFormatters.set(currencyCode, formatter);\n }\n return formatter;\n};\n\nexport const formatMoney = (value: number, currencyCode: string = \"USD\"): string =>\n moneyFormatter(currencyCode).format(value ?? 0);\n\nexport const normalizeLineQuantity = (quantity: number): number =>\n Math.max(1, Math.floor(Number(quantity)) || 1);\n\nexport interface AddonAmountInput {\n price: number;\n pricingType: PricingType;\n quantity: number;\n}\n\nexport const addonUnitAmount = (addon: AddonAmountInput, baseUnitPrice: number): number => {\n const value = Number.isFinite(addon.price) ? addon.price : 0;\n const quantity = Number.isFinite(addon.quantity) ? addon.quantity : 1;\n const amount = addon.pricingType === PricingTypeEnum.PERCENTAGE ? baseUnitPrice * (value / 100) : value;\n return roundMoney(amount * quantity);\n};\n\nexport const addonsUnitAmount = (addons: AddonAmountInput[], baseUnitPrice: number): number =>\n roundMoney(addons.reduce((sum, addon) => sum + addonUnitAmount(addon, baseUnitPrice), 0));\n\nexport interface PricedLineLike {\n pricing?: { baseUnitPrice?: number; unitPrice?: number };\n metaData?: unknown;\n}\n\nexport const addonsOfLine = (line: PricedLineLike): AddonAmountInput[] => {\n const raw = (line.metaData as { addons?: unknown } | undefined)?.addons;\n if (!Array.isArray(raw)) return [];\n return (raw as { price?: number; pricingType?: PricingType; quantity?: number }[]).map((addon) => ({\n price: Number(addon.price ?? 0),\n pricingType: addon.pricingType === PricingTypeEnum.PERCENTAGE ? PricingTypeEnum.PERCENTAGE : PricingTypeEnum.FIXED,\n quantity: Number(addon.quantity ?? 1),\n }));\n};\n\nexport const baseUnitPriceOfLine = (line: PricedLineLike): number | null => {\n const stored = line.pricing?.baseUnitPrice;\n if (typeof stored === \"number\") return stored;\n return addonsOfLine(line).length === 0 ? line.pricing?.unitPrice ?? 0 : null;\n};\n\nexport const feeHint = (fee: IAppliedFee): string => {\n const basis = fee.pricingType === PricingTypeEnum.PERCENTAGE && fee.value != null\n ? `${fee.value}% of ${fee.appliesTo === FeeAppliesToEnum.TOTAL ? \"order total\" : \"subtotal\"}`\n : \"Flat fee\";\n return fee.description ? `${basis} — ${fee.description}` : basis;\n};\n","import { roundMoney } from \"../pricing\";\nimport { PricingTypeEnum } from \"../addonConfig\";\nimport {\n ConfiguratorConditionTypeEnum,\n ConfiguratorEffectTypeEnum,\n ConfiguratorErrorCodeEnum,\n ConfiguratorSelectModeEnum,\n type ConfiguratorSelections,\n type IConfigurator,\n type IConfiguratorCondition,\n type IConfiguratorPriceAdjustment,\n type IConfiguratorSection,\n} from \"./interface\";\n\nexport interface ConfiguratorEvalContext {\n optionKeysBySection?: Record<string, string[]>;\n}\n\nexport interface ConfiguratorEvalError {\n code: ConfiguratorErrorCodeEnum;\n sectionKey: string;\n optionKey?: string;\n}\n\nexport interface ConfiguratorEvalResult {\n selections: ConfiguratorSelections;\n hiddenSections: string[];\n hiddenOptions: string[];\n requiredSections: string[];\n errors: ConfiguratorEvalError[];\n priceAdjustments: IConfiguratorPriceAdjustment[];\n stable: boolean;\n hiddenBy: Record<string, string>;\n selectedBy: Record<string, string>;\n}\n\nconst MAX_PASSES = 10;\n\nconst optionId = (sectionKey: string, optionKey: string): string => `${sectionKey}:${optionKey}`;\n\nconst targetOptionKeys = (\n target: { optionKey?: string; tag?: string } | undefined,\n section: IConfiguratorSection,\n): string[] => {\n if (target?.optionKey) return [target.optionKey];\n if (!target?.tag) return [];\n return (section.options ?? [])\n .filter((option) => (option.tags ?? []).includes(target.tag as string))\n .map((option) => option.key);\n};\n\nconst collectSections = (config: IConfigurator): Map<string, IConfiguratorSection> => {\n const sections = new Map<string, IConfiguratorSection>();\n for (const step of config.steps ?? []) {\n for (const section of step.sections ?? []) {\n if (section?.key) sections.set(section.key, section);\n }\n }\n return sections;\n};\n\nconst collectOptionKeys = (\n sections: Map<string, IConfiguratorSection>,\n override: Record<string, string[]> | undefined,\n): Map<string, Set<string> | null> => {\n const universe = new Map<string, Set<string> | null>();\n for (const [key, section] of sections) {\n const supplied = override?.[key];\n if (supplied) {\n universe.set(key, new Set(supplied));\n } else if (section.options?.length) {\n universe.set(key, new Set(section.options.map((option) => option.key)));\n } else {\n universe.set(key, null);\n }\n }\n return universe;\n};\n\nexport const conditionHolds = (\n condition: IConfiguratorCondition | undefined,\n selections: ConfiguratorSelections,\n): boolean => {\n if (!condition) return false;\n\n switch (condition.type) {\n case ConfiguratorConditionTypeEnum.SELECTED: {\n const chosen = selections[condition.sectionKey] ?? [];\n const wanted = condition.optionKeys ?? [];\n if (wanted.length === 0) return chosen.length > 0;\n return wanted.some((key) => chosen.includes(key));\n }\n case ConfiguratorConditionTypeEnum.ALL:\n return (condition.conditions ?? []).every((child) => conditionHolds(child, selections));\n case ConfiguratorConditionTypeEnum.ANY:\n return (condition.conditions ?? []).some((child) => conditionHolds(child, selections));\n case ConfiguratorConditionTypeEnum.NOT:\n return !conditionHolds(condition.condition, selections);\n default:\n return false;\n }\n};\n\nconst sameSelections = (a: ConfiguratorSelections, b: ConfiguratorSelections): boolean => {\n const keys = new Set([...Object.keys(a), ...Object.keys(b)]);\n for (const key of keys) {\n const left = a[key] ?? [];\n const right = b[key] ?? [];\n if (left.length !== right.length) return false;\n if (left.some((value, index) => value !== right[index])) return false;\n }\n return true;\n};\n\nconst sameSet = (a: Set<string>, b: Set<string>): boolean =>\n a.size === b.size && [...a].every((value) => b.has(value));\n\nexport const evaluateConfigurator = (\n config: IConfigurator,\n selections: ConfiguratorSelections,\n context: ConfiguratorEvalContext = {},\n): ConfiguratorEvalResult => {\n const sections = collectSections(config);\n const universe = collectOptionKeys(sections, context.optionKeysBySection);\n const rules = config.rules ?? [];\n\n let current: ConfiguratorSelections = {};\n for (const [sectionKey, chosen] of Object.entries(selections ?? {})) {\n current[sectionKey] = [...(chosen ?? [])];\n }\n\n let hiddenSections = new Set<string>();\n let hiddenOptions = new Set<string>();\n let requiredSections = new Set<string>();\n let errors: ConfiguratorEvalError[] = [];\n let stable = false;\n\n for (let pass = 0; pass < MAX_PASSES; pass++) {\n const nextHiddenSections = new Set<string>();\n const nextHiddenOptions = new Set<string>();\n const nextRequired = new Set<string>();\n for (const [key, section] of sections) {\n if (section.required) nextRequired.add(key);\n }\n\n const working: ConfiguratorSelections = {};\n for (const [sectionKey, chosen] of Object.entries(current)) {\n working[sectionKey] = [...chosen];\n }\n\n for (const rule of rules) {\n if (!conditionHolds(rule?.when, current)) continue;\n\n for (const effect of rule.then ?? []) {\n const sectionKey = effect?.target?.sectionKey;\n if (!sectionKey || !sections.has(sectionKey)) continue;\n const section = sections.get(sectionKey) as IConfiguratorSection;\n const targeted = targetOptionKeys(effect.target, section);\n const optionKey = targeted[0];\n\n switch (effect.type) {\n case ConfiguratorEffectTypeEnum.HIDE:\n if (effect.target.tag && targeted.length === 0) break;\n if (targeted.length) {\n for (const key of targeted) nextHiddenOptions.add(optionId(sectionKey, key));\n } else nextHiddenSections.add(sectionKey);\n break;\n case ConfiguratorEffectTypeEnum.SHOW:\n if (effect.target.tag && targeted.length === 0) break;\n if (targeted.length) {\n for (const key of targeted) nextHiddenOptions.delete(optionId(sectionKey, key));\n } else nextHiddenSections.delete(sectionKey);\n break;\n case ConfiguratorEffectTypeEnum.REQUIRE:\n nextRequired.add(sectionKey);\n break;\n case ConfiguratorEffectTypeEnum.OPTIONAL:\n nextRequired.delete(sectionKey);\n break;\n case ConfiguratorEffectTypeEnum.SELECT: {\n if (!optionKey) break;\n if (section.selectMode === ConfiguratorSelectModeEnum.SINGLE) {\n working[sectionKey] = [optionKey];\n break;\n }\n const chosen = working[sectionKey] ?? [];\n const added = targeted.filter((key) => !chosen.includes(key));\n if (added.length) working[sectionKey] = [...chosen, ...added];\n break;\n }\n case ConfiguratorEffectTypeEnum.PRICE_ADJUST:\n break;\n case ConfiguratorEffectTypeEnum.DESELECT: {\n if (!targeted.length) break;\n working[sectionKey] = (working[sectionKey] ?? []).filter((key) => !targeted.includes(key));\n break;\n }\n default:\n break;\n }\n }\n }\n\n const pruned: ConfiguratorSelections = {};\n\n for (const [sectionKey, chosen] of Object.entries(working)) {\n const section = sections.get(sectionKey);\n if (!section) continue;\n\n if (nextHiddenSections.has(sectionKey)) {\n pruned[sectionKey] = [];\n continue;\n }\n\n const known = universe.get(sectionKey) ?? null;\n const kept = chosen.filter((optionKey) => (\n (known === null || known.has(optionKey))\n && !nextHiddenOptions.has(optionId(sectionKey, optionKey))\n ));\n\n pruned[sectionKey] = section.selectMode === ConfiguratorSelectModeEnum.SINGLE && kept.length > 1\n ? kept.slice(-1)\n : kept;\n }\n\n const settled =\n sameSelections(pruned, current)\n && sameSet(nextHiddenSections, hiddenSections)\n && sameSet(nextHiddenOptions, hiddenOptions)\n && sameSet(nextRequired, requiredSections)\n && pass > 0;\n\n current = pruned;\n hiddenSections = nextHiddenSections;\n hiddenOptions = nextHiddenOptions;\n requiredSections = nextRequired;\n\n if (settled) {\n stable = true;\n break;\n }\n }\n\n if (!stable) {\n errors.push({ code: ConfiguratorErrorCodeEnum.RULES_UNSTABLE, sectionKey: \"\" });\n }\n\n for (const [sectionKey, chosen] of Object.entries(selections ?? {})) {\n const submitted = chosen ?? [];\n if (submitted.length === 0) continue;\n\n const section = sections.get(sectionKey);\n if (!section) {\n errors.push({ code: ConfiguratorErrorCodeEnum.UNKNOWN_SECTION, sectionKey });\n continue;\n }\n\n if (hiddenSections.has(sectionKey)) {\n for (const optionKey of submitted) {\n errors.push({ code: ConfiguratorErrorCodeEnum.SECTION_NOT_AVAILABLE, sectionKey, optionKey });\n }\n continue;\n }\n\n const known = universe.get(sectionKey) ?? null;\n const survivors = current[sectionKey] ?? [];\n const overfilled = section.selectMode === ConfiguratorSelectModeEnum.SINGLE && submitted.length > 1;\n\n for (const optionKey of submitted) {\n if (known !== null && !known.has(optionKey)) {\n errors.push({ code: ConfiguratorErrorCodeEnum.OPTION_NOT_AVAILABLE, sectionKey, optionKey });\n } else if (hiddenOptions.has(optionId(sectionKey, optionKey))) {\n errors.push({ code: ConfiguratorErrorCodeEnum.OPTION_NOT_AVAILABLE, sectionKey, optionKey });\n } else if (overfilled && !survivors.includes(optionKey)) {\n errors.push({ code: ConfiguratorErrorCodeEnum.SINGLE_SELECT_OVERFILLED, sectionKey, optionKey });\n }\n }\n }\n\n const priceAdjustments: IConfiguratorPriceAdjustment[] = [];\n for (const rule of rules) {\n if (!conditionHolds(rule?.when, current)) continue;\n for (const effect of rule.then ?? []) {\n if (effect?.type !== ConfiguratorEffectTypeEnum.PRICE_ADJUST) continue;\n\n const sectionKey = effect.target?.sectionKey;\n const amount = Number(effect.amount);\n if (!sectionKey || !sections.has(sectionKey) || !Number.isFinite(amount) || amount === 0) continue;\n if (hiddenSections.has(sectionKey)) continue;\n\n const section = sections.get(sectionKey) as IConfiguratorSection;\n const targeted = targetOptionKeys(effect.target, section);\n const chosen = current[sectionKey] ?? [];\n const mode = effect.mode === PricingTypeEnum.PERCENTAGE ? PricingTypeEnum.PERCENTAGE : PricingTypeEnum.FIXED;\n\n if (targeted.length) {\n for (const optionKey of targeted) {\n if (!chosen.includes(optionKey)) continue;\n priceAdjustments.push({ sectionKey, optionKey, mode, amount });\n }\n continue;\n }\n if (effect.target.tag || chosen.length === 0) continue;\n\n priceAdjustments.push({ sectionKey, mode, amount });\n }\n }\n\n const hiddenBy: Record<string, string> = {};\n const selectedBy: Record<string, string> = {};\n for (const rule of rules) {\n if (!conditionHolds(rule?.when, current)) continue;\n for (const effect of rule.then ?? []) {\n const sectionKey = effect?.target?.sectionKey;\n if (!sectionKey || !sections.has(sectionKey)) continue;\n if (effect.type !== ConfiguratorEffectTypeEnum.HIDE && effect.type !== ConfiguratorEffectTypeEnum.SELECT) continue;\n\n const section = sections.get(sectionKey) as IConfiguratorSection;\n const targeted = targetOptionKeys(effect.target, section);\n const note = rule.description?.trim()\n || (effect.type === ConfiguratorEffectTypeEnum.HIDE\n ? \"Not compatible with your current build.\"\n : \"Included with your build.\");\n const into = effect.type === ConfiguratorEffectTypeEnum.HIDE ? hiddenBy : selectedBy;\n\n if (targeted.length === 0) {\n if (!effect.target.tag && effect.type === ConfiguratorEffectTypeEnum.HIDE) into[sectionKey] = note;\n continue;\n }\n for (const optionKey of targeted) into[optionId(sectionKey, optionKey)] = note;\n }\n }\n\n for (const sectionKey of requiredSections) {\n if (hiddenSections.has(sectionKey)) continue;\n if ((current[sectionKey] ?? []).length === 0) {\n errors.push({ code: ConfiguratorErrorCodeEnum.REQUIRED_SECTION_EMPTY, sectionKey });\n }\n }\n\n return {\n selections: current,\n hiddenSections: [...hiddenSections],\n hiddenOptions: [...hiddenOptions],\n requiredSections: [...requiredSections],\n errors,\n priceAdjustments,\n stable,\n hiddenBy,\n selectedBy,\n };\n};\n\nexport const applyPriceAdjustments = (\n baseUnitPrice: number,\n adjustments: IConfiguratorPriceAdjustment[],\n): number => {\n if (adjustments.length === 0) return roundMoney(baseUnitPrice);\n\n let delta = 0;\n for (const adjustment of adjustments) {\n delta += adjustment.mode === PricingTypeEnum.PERCENTAGE\n ? (baseUnitPrice * adjustment.amount) / 100\n : adjustment.amount;\n }\n return roundMoney(Math.max(0, baseUnitPrice + delta));\n};\n\nexport const adjustmentsFor = (\n adjustments: IConfiguratorPriceAdjustment[],\n sectionKey: string,\n optionKey: string,\n): IConfiguratorPriceAdjustment[] =>\n adjustments.filter((adjustment) => (\n adjustment.sectionKey === sectionKey\n && (!adjustment.optionKey || adjustment.optionKey === optionKey)\n ));\n\nexport const isConfigurationValid = (result: ConfiguratorEvalResult): boolean =>\n result.stable && result.errors.length === 0;\n","export const InventoryPolicyEnum = {\n DENY: \"deny\",\n CONTINUE: \"continue\",\n} as const;\n\nexport type InventoryPolicy = (typeof InventoryPolicyEnum)[keyof typeof InventoryPolicyEnum];\n\nexport const INVENTORY_POLICY_VALUES: InventoryPolicy[] = Object.values(InventoryPolicyEnum);\n","export const SaleTypeEnum = {\n DIRECT: \"DIRECT\",\n QUOTE: \"QUOTE\",\n} as const;\n\nexport type SaleType = (typeof SaleTypeEnum)[keyof typeof SaleTypeEnum];\n\nexport const SALE_TYPE_VALUES: SaleType[] = Object.values(SaleTypeEnum);\n","import { SaleTypeEnum, type SaleType } from \"./interface\";\n\nexport interface SaleTypedLike {\n saleType?: SaleType;\n metaData?: unknown;\n price?: { price?: number } | null;\n}\n\nexport const saleTypeOf = (item: SaleTypedLike | null | undefined): SaleType => {\n if (item?.saleType) return item.saleType;\n const flagged = (item?.metaData as { quoteOnly?: boolean } | undefined)?.quoteOnly === true;\n const price = Number(item?.price?.price ?? 0);\n return flagged || !Number.isFinite(price) || price <= 0 ? SaleTypeEnum.QUOTE : SaleTypeEnum.DIRECT;\n};\n\nexport const isQuoteOnlyItem = (item: SaleTypedLike | null | undefined): boolean =>\n saleTypeOf(item) === SaleTypeEnum.QUOTE;\n","export const normalizePath = (input: string): string => {\n if (!input || typeof input !== \"string\") return \"/\";\n\n let path = input.trim();\n\n if (/^https?:\\/\\//i.test(path)) {\n try {\n path = new URL(path).pathname;\n } catch {\n }\n }\n\n path = path.split(\"?\")[0].split(\"#\")[0];\n\n try {\n path = decodeURIComponent(path);\n } catch {\n }\n\n if (!path.startsWith(\"/\")) path = `/${path}`;\n path = path.replace(/\\/{2,}/g, \"/\").toLowerCase();\n\n if (path.length > 1) path = path.replace(/\\/+$/, \"\");\n\n return path || \"/\";\n};\n\nexport const canonicalizeSlug = (input: string): string => {\n if (!input || typeof input !== \"string\") return \"\";\n return input\n .trim()\n .toLowerCase()\n .replace(/\\s+/g, \"-\")\n .replace(/-{2,}/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n};\n\nexport const canonicalizePath = (input: string): string => {\n if (!input || typeof input !== \"string\") return \"/\";\n\n let path = input.trim();\n\n if (/^https?:\\/\\//i.test(path)) {\n try {\n path = new URL(path).pathname;\n } catch {\n }\n }\n\n path = path.split(\"?\")[0].split(\"#\")[0];\n\n try {\n path = decodeURIComponent(path);\n } catch {\n }\n\n if (!path.startsWith(\"/\")) path = `/${path}`;\n\n const hadTrailingSlash = path.length > 1 && path.endsWith(\"/\");\n\n const segments = path\n .split(\"/\")\n .map((segment) => (segment ? canonicalizeSlug(segment) : segment))\n .filter((segment, index) => segment !== \"\" || index === 0);\n\n let out = segments.join(\"/\") || \"/\";\n if (!out.startsWith(\"/\")) out = `/${out}`;\n if (hadTrailingSlash && out !== \"/\") out += \"/\";\n\n return out;\n};\n","import type { BaseEntity } from \"../base\";\nimport type { IAddress } from \"../address\";\nimport type { ISummaryPricing, Metadata } from \"../common\";\nimport type { ICoupon } from \"../coupon\";\nimport type { ICustomer } from \"../customer\";\nimport type { IOrderItem } from \"../orderItem\";\nimport type { IStore } from \"../store\";\nimport type { IOrderTransaction, IRefundTransaction } from \"../transaction\";\nimport type { PaymentGatewayEnum, PaymentMethodEnum, PaymentStatusEnum } from \"../transaction\";\nimport type { SaleType } from \"../saleType\";\n\nexport const OrderStatusEnum = {\n CREATED: \"CREATED\",\n RECEIVED: \"RECEIVED\",\n PENDING: \"PENDING\",\n CONFIRMED: \"CONFIRMED\",\n PROCESSING: \"PROCESSING\",\n SHIPPED: \"SHIPPED\",\n DELIVERED: \"DELIVERED\",\n CANCELED: \"CANCELED\",\n FAILED: \"FAILED\",\n REFUNDED: \"REFUNDED\",\n PARTIALLY_REFUNDED: \"PARTIALLY_REFUNDED\",\n ARCHIVED: \"ARCHIVED\",\n RETURNED: \"RETURNED\",\n\n QUOTE_REQUESTED: \"QUOTE_REQUESTED\",\n QUOTED: \"QUOTED\",\n QUOTE_ACCEPTED: \"QUOTE_ACCEPTED\",\n QUOTE_DECLINED: \"QUOTE_DECLINED\",\n QUOTE_EXPIRED: \"QUOTE_EXPIRED\",\n} as const;\n\nexport type OrderStatusEnum = (typeof OrderStatusEnum)[keyof typeof OrderStatusEnum];\nexport const ORDER_STATUS_VALUES = Object.values(OrderStatusEnum);\n\nexport const statusColors: Record<OrderStatusEnum, string> = {\n [OrderStatusEnum.CREATED]: \"default\",\n [OrderStatusEnum.RECEIVED]: \"cyan\",\n [OrderStatusEnum.PENDING]: \"gold\",\n [OrderStatusEnum.CONFIRMED]: \"blue\",\n [OrderStatusEnum.PROCESSING]: \"cyan\",\n [OrderStatusEnum.SHIPPED]: \"purple\",\n [OrderStatusEnum.DELIVERED]: \"green\",\n [OrderStatusEnum.CANCELED]: \"volcano\",\n [OrderStatusEnum.FAILED]: \"red\",\n [OrderStatusEnum.REFUNDED]: \"orange\",\n [OrderStatusEnum.PARTIALLY_REFUNDED]: \"magenta\",\n [OrderStatusEnum.ARCHIVED]: \"gray\",\n [OrderStatusEnum.RETURNED]: \"purple\",\n [OrderStatusEnum.QUOTE_REQUESTED]: \"gold\",\n [OrderStatusEnum.QUOTED]: \"blue\",\n [OrderStatusEnum.QUOTE_ACCEPTED]: \"green\",\n [OrderStatusEnum.QUOTE_DECLINED]: \"volcano\",\n [OrderStatusEnum.QUOTE_EXPIRED]: \"gray\",\n};\n\nexport const PURCHASE_ORDER_STATUSES: OrderStatusEnum[] = [\n OrderStatusEnum.CREATED, OrderStatusEnum.RECEIVED, OrderStatusEnum.PENDING,\n OrderStatusEnum.CONFIRMED, OrderStatusEnum.PROCESSING, OrderStatusEnum.SHIPPED,\n OrderStatusEnum.DELIVERED, OrderStatusEnum.CANCELED, OrderStatusEnum.FAILED,\n OrderStatusEnum.REFUNDED, OrderStatusEnum.PARTIALLY_REFUNDED, OrderStatusEnum.ARCHIVED,\n OrderStatusEnum.RETURNED,\n];\n\nexport const QUOTE_ORDER_STATUSES: OrderStatusEnum[] = [\n OrderStatusEnum.QUOTE_REQUESTED, OrderStatusEnum.QUOTED, OrderStatusEnum.QUOTE_ACCEPTED,\n OrderStatusEnum.QUOTE_DECLINED, OrderStatusEnum.QUOTE_EXPIRED, OrderStatusEnum.CANCELED,\n];\n\nexport interface IOrder extends BaseEntity {\n orderId: string;\n orderItems: IOrderItem[];\n customer: ICustomer;\n coupon: ICoupon;\n store: IStore;\n status: OrderStatusEnum;\n type?: SaleType;\n sourceQuote?: IOrder | string;\n convertedOrder?: IOrder | string;\n quoteValidUntil?: Date;\n paymentStatus: PaymentStatusEnum;\n paymentMethod: PaymentMethodEnum;\n paymentGateway: PaymentGatewayEnum;\n shippingAddress: IAddress;\n billingAddress: IAddress;\n shippingMethod: string;\n acceptedTermsAt: Date;\n customerNote: string;\n metaData: Metadata;\n orderTransactions: IOrderTransaction[];\n refundTransactions: IRefundTransaction[];\n pricing: ISummaryPricing;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { Metadata } from \"../common\";\nimport type { IOrder } from \"../order\";\n\nexport const OrderLogTypeEnum = {\n ORDER_PLACED: \"ORDER_PLACED\",\n PAYMENT_PENDING: \"PAYMENT_PENDING\",\n PAYMENT_SUCCEEDED: \"PAYMENT_SUCCEEDED\",\n PAYMENT_FAILED: \"PAYMENT_FAILED\",\n PAYMENT_CANCELLED: \"PAYMENT_CANCELLED\",\n ORDER_STATUS: \"ORDER_STATUS\",\n REFUND: \"REFUND\",\n EMAIL: \"EMAIL\",\n NOTE: \"NOTE\",\n} as const;\n\nexport type OrderLogTypeEnum = (typeof OrderLogTypeEnum)[keyof typeof OrderLogTypeEnum];\nexport const ORDER_LOG_TYPE_VALUES = Object.values(OrderLogTypeEnum);\n\nexport const orderLogTypeColorMap: Record<OrderLogTypeEnum, string> = {\n [OrderLogTypeEnum.ORDER_PLACED]: \"blue\",\n [OrderLogTypeEnum.PAYMENT_PENDING]: \"gold\",\n [OrderLogTypeEnum.PAYMENT_SUCCEEDED]: \"green\",\n [OrderLogTypeEnum.PAYMENT_FAILED]: \"red\",\n [OrderLogTypeEnum.PAYMENT_CANCELLED]: \"volcano\",\n [OrderLogTypeEnum.ORDER_STATUS]: \"cyan\",\n [OrderLogTypeEnum.REFUND]: \"purple\",\n [OrderLogTypeEnum.EMAIL]: \"geekblue\",\n [OrderLogTypeEnum.NOTE]: \"default\",\n};\n\nexport interface IOrderLog extends BaseEntity {\n order: IOrder | string;\n type: OrderLogTypeEnum;\n message: string;\n actor?: string;\n meta?: Metadata;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { IOrder } from \"../order\";\nimport type { PaymentGatewayEnum } from \"../transaction\";\n\nexport const PaymentLinkStatusEnum = {\n PENDING: \"PENDING\",\n PAID: \"PAID\",\n EXPIRED: \"EXPIRED\",\n CANCELLED: \"CANCELLED\",\n} as const;\n\nexport type PaymentLinkStatusEnum = (typeof PaymentLinkStatusEnum)[keyof typeof PaymentLinkStatusEnum];\nexport const PAYMENT_LINK_STATUS_VALUES = Object.values(PaymentLinkStatusEnum);\n\nexport const paymentLinkStatusColorMap: Record<PaymentLinkStatusEnum, string> = {\n [PaymentLinkStatusEnum.PENDING]: \"gold\",\n [PaymentLinkStatusEnum.PAID]: \"green\",\n [PaymentLinkStatusEnum.EXPIRED]: \"default\",\n [PaymentLinkStatusEnum.CANCELLED]: \"volcano\",\n};\n\nexport interface IPaymentLink extends BaseEntity {\n order: IOrder | string;\n token: string;\n amount: number;\n currencyCode: string;\n gateway: PaymentGatewayEnum;\n status: PaymentLinkStatusEnum;\n expiresAt?: string | Date;\n paidAt?: string | Date;\n transaction?: string;\n createdBy?: string;\n baseUrl: string;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { ISummaryPricing, Metadata } from \"../common\";\nimport type { ICoupon } from \"../coupon\";\nimport type { ICustomer } from \"../customer\";\nimport type { IStore } from \"../store\";\nimport type { ICartItem } from \"../cartItem\";\nimport type { IOrder } from \"../order\";\nimport type { IShippingRate } from \"../shipping\";\nimport type { SaleType } from \"../saleType\";\n\n\nexport const CartStatusEnum = {\n ACTIVE: \"ACTIVE\",\n CONVERTED: \"CONVERTED\",\n QUOTED: \"QUOTED\",\n ABANDONED: \"ABANDONED\",\n} as const;\n\nexport type CartStatusEnum = (typeof CartStatusEnum)[keyof typeof CartStatusEnum];\nexport const CART_STATUS_VALUES = Object.values(CartStatusEnum);\nexport const RETIRED_CART_STATUSES: CartStatusEnum[] = [\n CartStatusEnum.CONVERTED,\n CartStatusEnum.QUOTED,\n CartStatusEnum.ABANDONED,\n];\n\n\nexport interface ICart extends BaseEntity {\n cartId: string;\n cartItems: ICartItem[];\n user?: ICustomer;\n coupon?: ICoupon;\n store: IStore;\n metaData: Metadata;\n optionalFees?: Record<string, boolean>;\n pricing: ISummaryPricing;\n selectedShippingRate?: IShippingRate;\n status: CartStatusEnum;\n type: SaleType;\n order?: IOrder | string;\n convertedAt?: Date;\n quoteToken?: string;\n quotedAt?: Date;\n quoteEmail?: string;\n sourceCart?: ICart | string;\n}\n\nexport const CartIssueTypes = {\n ITEM_UNAVAILABLE: \"ITEM_UNAVAILABLE\",\n OUT_OF_STOCK: \"OUT_OF_STOCK\",\n INSUFFICIENT_STOCK: \"INSUFFICIENT_STOCK\",\n COUPON_INVALID: \"COUPON_INVALID\",\n} as const;\n\nexport type CartIssueType = (typeof CartIssueTypes)[keyof typeof CartIssueTypes];\nexport interface CartIssue {\n type: CartIssueType;\n itemId?: string;\n name?: string;\n available?: number;\n requested?: number;\n message: string;\n}\n\nexport interface CartValidation {\n ok: boolean;\n issues: CartIssue[];\n}\n","export interface StockDemandLine {\n key: string;\n quantity: number;\n}\n\nexport const demandByKey = (lines: StockDemandLine[]): Map<string, number> => {\n const totals = new Map<string, number>();\n for (const line of lines) {\n if (!line.key) continue;\n const quantity = Number(line.quantity);\n if (!Number.isFinite(quantity) || quantity <= 0) continue;\n totals.set(line.key, (totals.get(line.key) ?? 0) + quantity);\n }\n return totals;\n};\n\nexport const StockVerdictEnum = {\n OK: \"OK\",\n OUT_OF_STOCK: \"OUT_OF_STOCK\",\n INSUFFICIENT_STOCK: \"INSUFFICIENT_STOCK\",\n} as const;\n\nexport type StockVerdict =\n | { type: typeof StockVerdictEnum.OK }\n | { type: typeof StockVerdictEnum.OUT_OF_STOCK; available: 0; requested: number }\n | { type: typeof StockVerdictEnum.INSUFFICIENT_STOCK; available: number; requested: number };\n\nexport const stockVerdict = (available: number, requested: number): StockVerdict => {\n const stock = Number.isFinite(available) ? Math.max(0, Math.floor(available)) : 0;\n const wanted = Number.isFinite(requested) ? Math.max(0, Math.floor(requested)) : 0;\n if (stock <= 0) return { type: StockVerdictEnum.OUT_OF_STOCK, available: 0, requested: wanted };\n if (wanted > stock) return { type: StockVerdictEnum.INSUFFICIENT_STOCK, available: stock, requested: wanted };\n return { type: StockVerdictEnum.OK };\n};\n","import type { BaseEntity } from \"../base\";\nimport type { ICustomer } from \"../customer\";\nimport type { IStore } from \"../store\";\n\nexport const SubscriptionChannelEnum = {\n EMAIL: \"EMAIL\",\n SMS: \"SMS\",\n PUSH: \"PUSH\",\n} as const;\n\nexport type SubscriptionChannelEnum = (typeof SubscriptionChannelEnum)[keyof typeof SubscriptionChannelEnum];\nexport const SUBSCRIPTION_CHANNEL_VALUES = Object.values(SubscriptionChannelEnum);\n\nexport const ACTIVE_SUBSCRIPTION_CHANNELS: SubscriptionChannelEnum[] = [SubscriptionChannelEnum.EMAIL];\n\nexport const SubscriptionTopicEnum = {\n PROMOTIONAL: \"PROMOTIONAL\",\n NEWSLETTER: \"NEWSLETTER\",\n BACK_IN_STOCK: \"BACK_IN_STOCK\",\n PRICE_DROP: \"PRICE_DROP\",\n} as const;\n\nexport type SubscriptionTopicEnum = (typeof SubscriptionTopicEnum)[keyof typeof SubscriptionTopicEnum];\nexport const SUBSCRIPTION_TOPIC_VALUES = Object.values(SubscriptionTopicEnum);\n\nexport const SUBSCRIPTION_TOPIC_LABELS: Record<SubscriptionTopicEnum, string> = {\n [SubscriptionTopicEnum.PROMOTIONAL]: \"Promotional\",\n [SubscriptionTopicEnum.NEWSLETTER]: \"Newsletter\",\n [SubscriptionTopicEnum.BACK_IN_STOCK]: \"Back in stock\",\n [SubscriptionTopicEnum.PRICE_DROP]: \"Price drop\",\n};\n\nexport const DEFAULT_SUBSCRIPTION_TOPICS: SubscriptionTopicEnum[] = [\n SubscriptionTopicEnum.PROMOTIONAL,\n SubscriptionTopicEnum.NEWSLETTER,\n];\n\nexport interface ISubscription {\n channel: SubscriptionChannelEnum;\n topic: SubscriptionTopicEnum;\n subscribed: boolean;\n source?: string;\n updatedAt?: Date | string;\n}\n\nexport interface ISubscriberConsent {\n source?: string;\n ip?: string;\n at?: Date | string;\n}\n\nexport interface ISubscriber extends BaseEntity {\n email: string;\n phone?: string;\n customer?: ICustomer | string;\n firstName?: string;\n lastName?: string;\n stores?: (IStore | string)[];\n subscriptions: ISubscription[];\n consent?: ISubscriberConsent;\n unsubscribeToken?: string;\n status: boolean;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { IStore } from \"../store\";\nimport type { ISubscriber } from \"../subscriber\";\nimport type { SubscriptionChannelEnum, SubscriptionTopicEnum } from \"../subscriber\";\n\nexport const CampaignStatusEnum = {\n SENDING: \"SENDING\",\n SENT: \"SENT\",\n FAILED: \"FAILED\",\n} as const;\n\nexport type CampaignStatusEnum = (typeof CampaignStatusEnum)[keyof typeof CampaignStatusEnum];\nexport const CAMPAIGN_STATUS_VALUES = Object.values(CampaignStatusEnum);\n\nexport const CampaignRecipientStatusEnum = {\n QUEUED: \"QUEUED\",\n SENT: \"SENT\",\n DELIVERED: \"DELIVERED\",\n OPENED: \"OPENED\",\n CLICKED: \"CLICKED\",\n BOUNCED: \"BOUNCED\",\n COMPLAINED: \"COMPLAINED\",\n FAILED: \"FAILED\",\n} as const;\n\nexport type CampaignRecipientStatusEnum = (typeof CampaignRecipientStatusEnum)[keyof typeof CampaignRecipientStatusEnum];\nexport const CAMPAIGN_RECIPIENT_STATUS_VALUES = Object.values(CampaignRecipientStatusEnum);\n\nexport interface ICampaignStats {\n sent: number;\n delivered: number;\n opened: number;\n clicked: number;\n bounced: number;\n complained: number;\n failed: number;\n}\n\nexport interface ICampaign extends BaseEntity {\n headline: string;\n body: string;\n ctaLabel?: string;\n ctaUrl?: string;\n channel: SubscriptionChannelEnum;\n topic: SubscriptionTopicEnum;\n store?: IStore | string;\n status: CampaignStatusEnum;\n recipientCount: number;\n stats: ICampaignStats;\n createdBy?: string;\n sentAt?: Date | string;\n}\n\nexport interface ICampaignRecipient extends BaseEntity {\n campaign: ICampaign | string;\n subscriber?: ISubscriber | string;\n email: string;\n resendEmailId?: string;\n status: CampaignRecipientStatusEnum;\n openedAt?: Date | string;\n clickedAt?: Date | string;\n lastEventAt?: Date | string;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { IProduct } from \"../product\";\nimport type { IStore } from \"../store\";\nimport type { IVariant } from \"../variant\";\n\nexport const StockStatusEnum = {\n IN_STOCK: \"IN_STOCK\",\n LOW_STOCK: \"LOW_STOCK\",\n OUT_OF_STOCK: \"OUT_OF_STOCK\",\n} as const;\n\nexport type StockStatus = (typeof StockStatusEnum)[keyof typeof StockStatusEnum];\nexport interface IStock extends BaseEntity {\n sku: string;\n product: IProduct;\n variant?: IVariant | null;\n store?: IStore | string | null;\n\n quantity: number;\n reserved: number;\n available: number;\n\n status: StockStatus;\n lowStockThreshold: number;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { IStore } from \"../store\";\nimport type { Metadata } from \"../common\";\nimport type { IOrder } from \"../order\";\nimport type { ICurrency } from \"../currency\";\n\nexport const PaymentStatusEnum = {\n INITIATED: 'INITIATED',\n PENDING: 'PENDING',\n PROCESSING: 'PROCESSING',\n FAILED: 'FAILED',\n CANCELLED: 'CANCELLED',\n PENDING_CAPTURE: 'PENDING_CAPTURE',\n COMPLETED: 'COMPLETED',\n VOIDED: 'VOIDED',\n REDIRECTED_TO_GATEWAY: 'REDIRECTED_TO_GATEWAY',\n UNKNOWN: 'UNKNOWN',\n REFUNDED: 'REFUNDED',\n PARTIALLY_REFUNDED: 'PARTIALLY_REFUNDED',\n NOT_REQUIRED: 'NOT_REQUIRED',\n} as const;\n\nexport type PaymentStatusEnum = (typeof PaymentStatusEnum)[keyof typeof PaymentStatusEnum];\nexport const PAYMENT_STATUS_VALUES = Object.values(PaymentStatusEnum);\n\nexport const paymentStatusColorMap: Record<PaymentStatusEnum, string> = {\n [PaymentStatusEnum.INITIATED]: 'default',\n [PaymentStatusEnum.PENDING]: 'gold',\n [PaymentStatusEnum.PROCESSING]: 'cyan',\n [PaymentStatusEnum.FAILED]: 'red',\n [PaymentStatusEnum.CANCELLED]: 'volcano',\n [PaymentStatusEnum.PENDING_CAPTURE]: 'blue',\n [PaymentStatusEnum.COMPLETED]: 'green',\n [PaymentStatusEnum.VOIDED]: 'magenta',\n [PaymentStatusEnum.REDIRECTED_TO_GATEWAY]: 'purple',\n [PaymentStatusEnum.UNKNOWN]: 'gray',\n [PaymentStatusEnum.REFUNDED]: 'orange',\n [PaymentStatusEnum.PARTIALLY_REFUNDED]: 'magenta',\n [PaymentStatusEnum.NOT_REQUIRED]: 'default',\n};\n\nexport const PaymentMethodEnum = {\n CREDIT_CARD: 'CREDIT_CARD',\n PAYPAL: 'PAYPAL',\n STRIPE: 'STRIPE',\n CHECK: 'CHECK',\n APPLE_PAY: 'APPLE_PAY',\n PURCHASE_ORDER: 'PURCHASE_ORDER',\n} as const;\n\nexport type PaymentMethodEnum = (typeof PaymentMethodEnum)[keyof typeof PaymentMethodEnum];\nexport const PAYMENT_METHOD_VALUES = Object.values(PaymentMethodEnum);\n\nexport const paymentMethodColorMap: Record<PaymentMethodEnum, string> = {\n [PaymentMethodEnum.CREDIT_CARD]: 'blue',\n [PaymentMethodEnum.PAYPAL]: 'geekblue',\n [PaymentMethodEnum.STRIPE]: 'purple',\n [PaymentMethodEnum.CHECK]: 'orange',\n [PaymentMethodEnum.APPLE_PAY]: 'black',\n [PaymentMethodEnum.PURCHASE_ORDER]: 'gold',\n};\n\nexport const PaymentGatewayEnum = {\n STRIPE: 'STRIPE',\n PAYPAL: 'PAYPAL',\n BRAINTREE: 'BRAINTREE',\n MANUAL: 'MANUAL',\n} as const;\n\nexport type PaymentGatewayEnum = (typeof PaymentGatewayEnum)[keyof typeof PaymentGatewayEnum];\nexport const PAYMENT_GATEWAY_VALUES = Object.values(PaymentGatewayEnum);\n\nexport const TransactionTypeEnum = {\n ORDER: \"ORDER\",\n REFUND: \"REFUND\",\n} as const;\n\nexport type TransactionTypeEnum = (typeof TransactionTypeEnum)[keyof typeof TransactionTypeEnum];\n\nexport const TRANSACTION_TYPE_VALUES = Object.values(TransactionTypeEnum);\n\nexport const typeColorMap: Record<TransactionTypeEnum, string> = {\n [TransactionTypeEnum.ORDER]: \"blue\",\n [TransactionTypeEnum.REFUND]: \"purple\",\n};\n\nexport interface ITransactionBase extends BaseEntity {\n order: IOrder;\n store: IStore | string;\n currency: ICurrency;\n transactionId: string;\n amount: number;\n status: PaymentStatusEnum;\n paymentMethod: PaymentMethodEnum;\n gateway: PaymentGatewayEnum;\n gatewayId?: string;\n metaData: Metadata;\n comment?: string;\n isPaymentLink: boolean;\n refundedAmount: number;\n proofFileId?: string;\n}\n\nexport interface IOrderTransaction extends ITransactionBase {\n type: typeof TransactionTypeEnum.ORDER;\n}\n\nexport interface IRefundTransaction extends ITransactionBase {\n type: typeof TransactionTypeEnum.REFUND;\n originalTransaction?: ITransactionBase;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { IProduct } from \"../product\";\nimport type { IStore } from \"../store\";\n\nexport const ProductEventTypeEnum = {\n VIEW: \"view\",\n ADD_TO_CART: \"add_to_cart\",\n PURCHASE: \"purchase\",\n} as const;\n\nexport type ProductEventTypeEnum = (typeof ProductEventTypeEnum)[keyof typeof ProductEventTypeEnum];\nexport interface IProductDailyStat extends BaseEntity {\n product: IProduct | string;\n store?: IStore | string | null;\n date: string;\n views: number;\n addToCarts: number;\n purchases: number;\n revenue: number;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { Metadata } from \"../common\";\nimport type { IOrder } from \"../order\";\nimport type { IStore } from \"../store\";\n\nexport const NotificationTypeEnum = {\n ORDER_RECEIVED: \"ORDER_RECEIVED\",\n PAYMENT_SUCCEEDED: \"PAYMENT_SUCCEEDED\",\n PAYMENT_FAILED: \"PAYMENT_FAILED\",\n REFUND: \"REFUND\",\n ORDER_CANCELLED: \"ORDER_CANCELLED\",\n ORDER_STATUS: \"ORDER_STATUS\",\n QUOTE_REQUESTED: \"QUOTE_REQUESTED\",\n} as const;\n\nexport type NotificationTypeEnum = (typeof NotificationTypeEnum)[keyof typeof NotificationTypeEnum];\nexport const NOTIFICATION_TYPE_VALUES = Object.values(NotificationTypeEnum);\n\nexport interface INotification extends BaseEntity {\n type: NotificationTypeEnum;\n title: string;\n message: string;\n order?: IOrder | string | null;\n store?: IStore | string | null;\n read: boolean;\n readAt?: Date | null;\n meta?: Metadata;\n}\n"],"mappings":"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","names":["idOf"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/admin/interface.ts","../src/admin/access.ts","../src/common/objectId.ts","../src/common/validate.ts","../src/coupon/interface.ts","../src/productVariantOptions/interface.ts","../src/addonConfig/interface.ts","../src/addonConfig/resolve.ts","../src/storeFee/interface.ts","../src/emailTemplate/interface.ts","../src/configurator/interface.ts","../src/pricing/index.ts","../src/configurator/evaluate.ts","../src/inventory/interface.ts","../src/saleType/interface.ts","../src/saleType/rules.ts","../src/path/index.ts","../src/order/interface.ts","../src/orderLog/interface.ts","../src/paymentLink/interface.ts","../src/cart/interface.ts","../src/cartItem/stock.ts","../src/subscriber/interface.ts","../src/campaign/interface.ts","../src/stock/interface.ts","../src/transaction/interface.ts","../src/analytics/interface.ts","../src/notification/interface.ts"],"sourcesContent":["export * from './address';\nexport * from './admin';\nexport * from './base';\nexport * from './common';\nexport * from './country';\nexport * from './customer';\nexport * from './state';\nexport * from './store';\nexport * from './currency';\nexport * from './contact';\nexport * from './coupon';\nexport * from './product';\nexport * from './productVariantOptions';\nexport * from './productTechnicalSpec';\nexport * from './addonConfig';\nexport * from './storeFee';\nexport * from './emailTemplate';\nexport * from './relationGroup';\nexport * from './configurator';\nexport * from './inventory';\nexport * from './saleType';\nexport * from './redirect';\nexport * from './path';\nexport * from './pricing';\nexport * from './variant';\nexport * from './productVariant';\nexport * from './order';\nexport * from './orderItem';\nexport * from './orderLog';\nexport * from './paymentLink';\nexport * from './cart';\nexport * from './cartItem';\nexport * from './subscriber';\nexport * from './campaign';\nexport * from './category';\nexport * from './blog';\nexport * from './faq';\nexport * from './podcast';\nexport * from './brand';\nexport * from './stock';\nexport * from './transaction';\nexport * from './checkout';\nexport * from './analytics';\nexport * from './notification';\nexport * from './shipping';\nexport * from './wishlist';\n","import type { BaseEntity } from '../base/interface';\n\nexport const ADMIN_RESOURCE_LIST = [\n { value: 'dashboard', label: 'Dashboard', group: 'Overview' },\n { value: 'metrics', label: 'Metrics', group: 'Overview' },\n { value: 'products', label: 'Products', group: 'Catalog' },\n { value: 'categories', label: 'Categories', group: 'Catalog' },\n { value: 'brands', label: 'Brands', group: 'Catalog' },\n { value: 'technical-specs', label: 'Technical Specs', group: 'Catalog' },\n { value: 'addon-configs', label: 'Addon Configs', group: 'Catalog' },\n { value: 'relation-groups', label: 'Relation Groups', group: 'Catalog' },\n { value: 'configurators', label: 'Configurators', group: 'Catalog' },\n { value: 'orders', label: 'Orders', group: 'Commerce' },\n { value: 'quotes', label: 'Quotes', group: 'Commerce' },\n { value: 'carts', label: 'Carts', group: 'Commerce' },\n { value: 'transactions', label: 'Transactions', group: 'Commerce' },\n { value: 'coupons', label: 'Coupons', group: 'Commerce' },\n { value: 'store-fees', label: 'Store Fees', group: 'Commerce' },\n { value: 'customers', label: 'Customers', group: 'People' },\n { value: 'contact-us', label: 'Contact Requests', group: 'People' },\n { value: 'subscribers', label: 'Subscribers', group: 'People' },\n { value: 'blog', label: 'Blog', group: 'Content' },\n { value: 'faqs', label: 'FAQs', group: 'Content' },\n { value: 'podcast', label: 'Podcast', group: 'Content' },\n { value: 'email-templates', label: 'Email Templates', group: 'Content' },\n { value: 'notifications', label: 'Notifications', group: 'Content' },\n { value: 'campaigns', label: 'Campaigns', group: 'Content' },\n { value: 'stores', label: 'Stores', group: 'Settings' },\n { value: 'currencies', label: 'Currencies', group: 'Settings' },\n { value: 'redirects', label: 'Redirects', group: 'Settings' },\n { value: 'cache', label: 'Cache', group: 'Settings' },\n { value: 'admins', label: 'Admins', group: 'Settings' },\n { value: 'account', label: 'Account', group: 'Settings' },\n] as const;\n\nexport const ADMIN_RESOURCES = ADMIN_RESOURCE_LIST.map((entry) => entry.value);\n\nexport type IAdminResource = (typeof ADMIN_RESOURCE_LIST)[number]['value'];\n\nexport const ADMIN_ACTIONS = ['read', 'write', 'delete'] as const;\n\nexport type IAdminBaseAction = (typeof ADMIN_ACTIONS)[number];\n\nexport const RESOURCE_OPERATIONS: Partial<Record<IAdminResource, readonly string[]>> = {\n products: ['sync'],\n brands: ['sync'],\n categories: ['sync'],\n orders: ['charge'],\n transactions: ['refund'],\n cache: ['purge'],\n};\n\nexport type IAdminAction = IAdminBaseAction | string;\n\nexport const actionsForResource = (resource: IAdminResource): IAdminAction[] => [\n ...ADMIN_ACTIONS,\n ...(RESOURCE_OPERATIONS[resource] ?? []),\n];\n\nexport const isValidAction = (resource: IAdminResource, action: string): boolean =>\n actionsForResource(resource).includes(action);\n\nexport interface IAdminPermission {\n resource: IAdminResource;\n actions: IAdminAction[];\n}\n\nexport interface IAdminStoreAccess {\n store: string;\n role?: string | null;\n extras: IAdminPermission[];\n}\n\nexport interface IAdminRole extends BaseEntity {\n key: string;\n name: string;\n description: string;\n permissions: IAdminPermission[];\n isSuperAdmin: boolean;\n isSystem: boolean;\n}\n\nexport type IAdminRoleCreate = Omit<IAdminRole, keyof BaseEntity>;\nexport interface IAdmin extends BaseEntity {\n firstName: string;\n lastName: string;\n email: string;\n phoneNumber: string;\n status: boolean;\n password: string;\n role: string;\n access_list: string[];\n storeAccess: IAdminStoreAccess[];\n resetPasswordTokenHash?: string;\n resetPasswordTokenExpiresAt?: Date | null;\n joiningDate: Date;\n profileImage: string;\n lastLogin: Date;\n}\n\nexport type IAdminSafe = Omit<IAdmin, 'password'>;\n\nexport const ADMIN_AUDIT_ACTIONS = [\n 'role.create',\n 'role.update',\n 'role.delete',\n 'admin.create',\n 'admin.role',\n 'admin.grants',\n 'admin.status',\n 'admin.delete',\n] as const;\n\nexport type IAdminAuditAction = (typeof ADMIN_AUDIT_ACTIONS)[number];\n\nexport interface IAdminAuditLog extends BaseEntity {\n actor: IAdmin | string;\n actorName: string;\n action: IAdminAuditAction;\n targetAdmin?: IAdmin | string | null;\n targetRole?: IAdminRole | string | null;\n store?: string | null;\n summary: string;\n before?: Record<string, unknown> | null;\n after?: Record<string, unknown> | null;\n}\n","import type {\n IAdminAction,\n IAdminPermission,\n IAdminResource,\n IAdminRole,\n IAdminStoreAccess,\n} from './interface';\n\nexport interface EffectiveAccess {\n isSuperAdmin: boolean;\n permissions: Record<string, string[]>;\n}\n\nexport interface ResolveAccessInput {\n role?: string | null;\n storeAccess?: IAdminStoreAccess[];\n roles: Record<string, Pick<IAdminRole, 'permissions' | 'isSuperAdmin'>>;\n storeId?: string | null;\n}\n\nexport const EMPTY_ACCESS: EffectiveAccess = { isSuperAdmin: false, permissions: {} };\n\nconst addGrant = (into: Map<string, Set<string>>, grants: IAdminPermission[] = []): void => {\n for (const { resource, actions } of grants) {\n const bucket = into.get(resource) ?? new Set<string>();\n for (const action of actions ?? []) bucket.add(action);\n into.set(resource, bucket);\n }\n};\n\nconst idOf = (value: unknown): string => (value == null ? '' : String(value));\n\nconst rowApplies = (row: IAdminStoreAccess, storeId: string | null): boolean => {\n const rowStore = idOf(row.store);\n if (!rowStore || rowStore === '*') return true;\n if (!storeId) return true;\n return rowStore === storeId;\n};\n\nexport const resolveEffectivePermissions = (input: ResolveAccessInput): EffectiveAccess => {\n const { roles, storeAccess = [] } = input;\n const storeId = input.storeId == null ? null : idOf(input.storeId);\n\n const globalRole = input.role ? roles[input.role] : undefined;\n if (globalRole?.isSuperAdmin) {\n return { isSuperAdmin: true, permissions: {} };\n }\n\n const merged = new Map<string, Set<string>>();\n addGrant(merged, globalRole?.permissions);\n\n for (const row of storeAccess) {\n if (!rowApplies(row, storeId)) continue;\n\n const rowRole = row.role ? roles[row.role] : undefined;\n if (rowRole?.isSuperAdmin) {\n return { isSuperAdmin: true, permissions: {} };\n }\n\n addGrant(merged, rowRole?.permissions);\n addGrant(merged, row.extras);\n }\n\n const permissions: Record<string, string[]> = {};\n for (const [resource, actions] of merged) {\n if (actions.size > 0) permissions[resource] = [...actions].sort();\n }\n\n return { isSuperAdmin: false, permissions };\n};\n\nexport const can = (\n access: EffectiveAccess,\n resource: IAdminResource,\n action: IAdminAction\n): boolean => {\n if (access.isSuperAdmin) return true;\n return access.permissions[resource]?.includes(action) === true;\n};\n\nexport const canAny = (access: EffectiveAccess, resource: IAdminResource): boolean => {\n if (access.isSuperAdmin) return true;\n return (access.permissions[resource]?.length ?? 0) > 0;\n};\n\nexport const grantedPermissions = (access: EffectiveAccess): IAdminPermission[] =>\n Object.entries(access.permissions).map(([resource, actions]) => ({\n resource: resource as IAdminResource,\n actions: actions as IAdminAction[],\n }));\n\nexport const missingGrants = (\n actor: EffectiveAccess,\n requested: IAdminPermission[]\n): string[] => {\n if (actor.isSuperAdmin) return [];\n\n const missing: string[] = [];\n for (const { resource, actions } of requested) {\n for (const action of actions ?? []) {\n if (!can(actor, resource, action)) missing.push(`${resource}:${action}`);\n }\n }\n return missing;\n};\n\nexport const ALL_STORES = '*';\n\nexport interface StoreScopeInput {\n role?: string | null;\n storeAccess?: IAdminStoreAccess[];\n roles: Record<string, Pick<IAdminRole, 'permissions' | 'isSuperAdmin'>>;\n}\n\nexport const resolveStoreScope = (input: StoreScopeInput): string[] | null => {\n const { roles, storeAccess = [] } = input;\n\n if (input.role && roles[input.role]?.isSuperAdmin) return null;\n\n const scoped: string[] = [];\n for (const row of storeAccess) {\n const store = idOf(row.store);\n if (!store || store === ALL_STORES) return null;\n scoped.push(store);\n }\n\n return scoped;\n};\n\nexport interface StoreAccessCheckInput extends StoreScopeInput {\n storeId?: string | null;\n}\n\nexport const hasStoreAccess = (input: StoreAccessCheckInput): boolean => {\n const scope = resolveStoreScope(input);\n if (scope === null) return true;\n\n const storeId = idOf(input.storeId);\n if (!storeId) return false;\n\n return scope.includes(storeId);\n};\n","export const toIdString = (value: unknown): string => {\n if (!value) return \"\";\n if (typeof value === \"string\") return value;\n\n if (typeof value === \"object\") {\n const candidate = value as { toHexString?: unknown; _id?: unknown };\n\n if (typeof candidate.toHexString === \"function\") {\n return (candidate.toHexString as () => string)();\n }\n\n if (\"_id\" in candidate && candidate._id !== value) {\n return toIdString(candidate._id);\n }\n }\n\n return String(value);\n};\n","export const isNonEmptyString = (value: unknown): value is string =>\n typeof value === 'string' && value.trim().length > 0;\n\nexport const normalizeNumber = (value: unknown, fallback = 0): number => {\n if (typeof value === 'number') return Number.isFinite(value) ? value : fallback;\n if (typeof value === 'string' && value.trim() !== '') {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n }\n return fallback;\n};\n\nexport const isValidEmail = (email: unknown): email is string =>\n typeof email === 'string' && /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email.trim());\n","import type { BaseEntity } from \"../base\";\nimport type { IStore } from \"../store\";\n\nexport const DiscountTypeEnum = {\n PERCENTAGE: \"PERCENTAGE\",\n FIXED: \"FIXED\",\n} as const;\n\nexport type DiscountTypeEnum = (typeof DiscountTypeEnum)[keyof typeof DiscountTypeEnum];\n\nexport interface IDiscountType {\n type: DiscountTypeEnum;\n value: number;\n}\n\nexport interface ICoupon extends BaseEntity {\n title: string;\n couponCode: string;\n startTime: Date;\n endTime: Date;\n discountType: IDiscountType;\n minimumAmount: number;\n isPromotional: boolean;\n status: boolean;\n stores: IStore[];\n}\n","export type VariantOptionMode = \"OPTION_BACKED\" | \"MANUAL\";\n\nexport const ProductVariantTypeEnum = {\n SINGLE: \"SINGLE\",\n OPTION_BACKED: \"OPTION_BACKED\",\n MANUAL: \"MANUAL\",\n} as const;\n\nexport type ProductVariantType = (typeof ProductVariantTypeEnum)[keyof typeof ProductVariantTypeEnum];\n\nexport const PRODUCT_VARIANT_TYPE_VALUES = Object.values(ProductVariantTypeEnum);\n\nexport interface IProductVariantOptionValue {\n id?: string;\n valueKey: string;\n label: string;\n sortOrder: number;\n}\n\nexport interface IProductVariantOptionGroup {\n id?: string;\n optionKey: string;\n name: string;\n sortOrder: number;\n values: IProductVariantOptionValue[];\n}\n\nexport interface IProductVariantOptionMatrix {\n groups: IProductVariantOptionGroup[];\n optionSignatures: string[];\n}\n\nexport interface IVariantOptionSelection {\n id?: string;\n group?: string;\n value?: string;\n optionKey: string;\n optionName: string;\n valueKey: string;\n valueLabel: string;\n sortOrder: number;\n}\n\n","import type { BaseEntity } from \"../base\";\nimport type { IStore } from \"../store\";\n\nexport const PricingTypeEnum = {\n PERCENTAGE: \"PERCENTAGE\",\n FIXED: \"FIXED\",\n} as const;\n\nexport type PricingType = (typeof PricingTypeEnum)[keyof typeof PricingTypeEnum];\nexport const PRICING_TYPE_VALUES = Object.values(PricingTypeEnum);\n\nexport interface IAddonConfig extends BaseEntity {\n name: string;\n key: string;\n description: string;\n stores: (IStore | string)[];\n price: number;\n pricingType: PricingType;\n quantity: number;\n sortOrder: number;\n applyToAll: boolean;\n isDefault: boolean;\n isVisible: boolean;\n status: boolean;\n}\n\nexport interface IAddonGroup extends BaseEntity {\n name: string;\n key: string;\n description: string;\n addons: IAddonConfig[];\n sortOrder: number;\n isVisible: boolean;\n status: boolean;\n}\n","import type { IStore } from \"../store\";\nimport type { IAddonConfig, IAddonGroup } from \"./interface\";\n\nexport interface ProductAddonScope {\n storeId?: string;\n productAddonIds?: string[];\n}\n\nconst idOf = (value: unknown): string => {\n if (!value) return \"\";\n if (typeof value === \"string\") return value;\n const record = value as { _id?: unknown };\n return String(record._id ?? value);\n};\n\nconst isLive = (entity: { status?: boolean; isVisible?: boolean }): boolean =>\n entity.status !== false && entity.isVisible !== false;\n\nconst appliesToStore = (stores: (IStore | string)[] | undefined, storeId: string | undefined): boolean => {\n const list = stores ?? [];\n return list.length === 0 || (!!storeId && list.some((store) => idOf(store) === storeId));\n};\n\nconst appliesToProduct = (addon: IAddonConfig, attachedIds: string[]): boolean =>\n addon.applyToAll !== false || attachedIds.includes(idOf(addon._id));\n\nexport const resolveProductAddonGroups = (\n groups: IAddonGroup[],\n scope: ProductAddonScope = {},\n): IAddonGroup[] => {\n const addonIds = scope.productAddonIds ?? [];\n\n return groups\n .filter(isLive)\n .map((group) => ({\n ...group,\n addons: (group.addons ?? []).filter((addon: IAddonConfig) => (\n isLive(addon)\n && appliesToStore(addon.stores, scope.storeId)\n && appliesToProduct(addon, addonIds)\n )),\n }))\n .filter((group) => group.addons.length > 0);\n};\n\nexport const groupHasDefaultAddon = (group: IAddonGroup): boolean =>\n (group.addons ?? []).some((addon) => addon.isDefault && isLive(addon));\n\nexport interface AddonSelectionRef {\n groupKey: string;\n addonKey: string;\n}\n\nexport interface ResolvedAddonSelection extends AddonSelectionRef {\n addon: IAddonConfig;\n}\n\nexport const resolveAddonSelections = (\n groups: IAddonGroup[],\n selections: AddonSelectionRef[],\n): ResolvedAddonSelection[] => {\n const allowed = new Map<string, IAddonConfig>();\n const pickOne = new Set<string>();\n\n for (const group of groups) {\n if (groupHasDefaultAddon(group)) pickOne.add(group.key);\n for (const addon of group.addons ?? []) {\n allowed.set(`${group.key}:${addon.key}`, addon);\n }\n }\n\n const seen = new Set<string>();\n const filled = new Set<string>();\n const resolved: ResolvedAddonSelection[] = [];\n\n for (const selection of selections) {\n if (typeof selection?.groupKey !== \"string\" || typeof selection?.addonKey !== \"string\") continue;\n\n const pair = `${selection.groupKey}:${selection.addonKey}`;\n if (seen.has(pair)) continue;\n\n const addon = allowed.get(pair);\n if (!addon) continue;\n\n if (pickOne.has(selection.groupKey) && filled.has(selection.groupKey)) continue;\n\n seen.add(pair);\n filled.add(selection.groupKey);\n resolved.push({ groupKey: selection.groupKey, addonKey: selection.addonKey, addon });\n }\n\n return resolved;\n};\n","import type { BaseEntity } from \"../base\";\nimport type { PricingType } from \"../addonConfig\";\nimport type { IStore } from \"../store\";\n\nexport const FeeAppliesToEnum = {\n SUBTOTAL: \"SUBTOTAL\",\n TOTAL: \"TOTAL\",\n} as const;\n\nexport type FeeAppliesToEnum = (typeof FeeAppliesToEnum)[keyof typeof FeeAppliesToEnum];\nexport const FEE_APPLIES_TO_VALUES = Object.values(FeeAppliesToEnum);\n\nexport interface IStoreFee extends BaseEntity {\n stores: (IStore | string)[];\n name: string;\n key: string;\n description?: string;\n pricingType: PricingType;\n value: number;\n appliesTo: FeeAppliesToEnum;\n enabled: boolean;\n isVisible: boolean;\n optional: boolean;\n defaultSelected: boolean;\n sortOrder: number;\n status: boolean;\n}\n\nexport interface ISelectableFee {\n key: string;\n name: string;\n description?: string;\n pricingType: PricingType;\n value: number;\n appliesTo: FeeAppliesToEnum;\n optional: boolean;\n selected: boolean;\n amount: number;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { IStore } from \"../store\";\n\nexport const EmailTemplateEventEnum = {\n ORDER_RECEIVED: \"ORDER_RECEIVED\",\n ORDER_CANCELLED: \"ORDER_CANCELLED\",\n WELCOME: \"WELCOME\",\n PASSWORD_RESET: \"PASSWORD_RESET\",\n QUOTE: \"QUOTE\",\n QUOTE_REQUESTED: \"QUOTE_REQUESTED\",\n QUOTE_SENT: \"QUOTE_SENT\",\n QUOTE_DECLINED: \"QUOTE_DECLINED\",\n INVOICE: \"INVOICE\",\n PROMOTIONAL: \"PROMOTIONAL\",\n CONTACT_US: \"CONTACT_US\",\n NOTIFICATION: \"NOTIFICATION\",\n} as const;\n\nexport type EmailTemplateEventEnum = (typeof EmailTemplateEventEnum)[keyof typeof EmailTemplateEventEnum];\nexport const EMAIL_TEMPLATE_EVENT_VALUES = Object.values(EmailTemplateEventEnum);\n\nexport const WIRED_EMAIL_TEMPLATE_EVENTS: EmailTemplateEventEnum[] = [\n EmailTemplateEventEnum.ORDER_RECEIVED,\n EmailTemplateEventEnum.ORDER_CANCELLED,\n EmailTemplateEventEnum.QUOTE,\n EmailTemplateEventEnum.QUOTE_REQUESTED,\n EmailTemplateEventEnum.QUOTE_SENT,\n EmailTemplateEventEnum.QUOTE_DECLINED,\n EmailTemplateEventEnum.INVOICE,\n EmailTemplateEventEnum.WELCOME,\n EmailTemplateEventEnum.PASSWORD_RESET,\n EmailTemplateEventEnum.CONTACT_US,\n EmailTemplateEventEnum.NOTIFICATION,\n EmailTemplateEventEnum.PROMOTIONAL,\n];\n\nexport const EMAIL_TEMPLATE_VARIABLES_BY_EVENT: Partial<Record<EmailTemplateEventEnum, string[]>> = {\n [EmailTemplateEventEnum.ORDER_RECEIVED]: [\n \"customerName\", \"orderId\", \"orderDate\", \"itemsHtml\", \"subtotal\", \"shippingHandling\",\n \"estimatedTax\", \"grandTotal\", \"shippingAddress\", \"billingAddress\", \"shippingMethod\",\n \"paymentMethod\",\n ],\n [EmailTemplateEventEnum.ORDER_CANCELLED]: [\"customerName\", \"orderId\", \"reason\", \"refundAmount\"],\n [EmailTemplateEventEnum.QUOTE]: [\n \"customerName\", \"itemCount\", \"savedDate\", \"itemsHtml\", \"subtotal\", \"discount\", \"grandTotal\", \"quoteLink\",\n ],\n [EmailTemplateEventEnum.WELCOME]: [\"name\", \"appName\", \"ctaLabel\", \"ctaUrl\"],\n [EmailTemplateEventEnum.PASSWORD_RESET]: [\"name\", \"resetUrl\", \"expiryLabel\"],\n [EmailTemplateEventEnum.CONTACT_US]: [\"customerName\", \"caseNumber\", \"department\", \"subjectSummary\"],\n [EmailTemplateEventEnum.INVOICE]: [\n \"customerName\", \"orderId\", \"orderDate\", \"itemsHtml\", \"subtotal\", \"shippingHandling\",\n \"estimatedTax\", \"grandTotal\", \"amountDue\", \"shippingAddress\", \"billingAddress\", \"paymentLink\",\n ],\n [EmailTemplateEventEnum.QUOTE_REQUESTED]: [\n \"customerName\", \"quoteId\", \"requestDate\", \"itemCount\", \"customerNote\", \"itemsHtml\", \"shippingAddress\",\n ],\n [EmailTemplateEventEnum.QUOTE_SENT]: [\n \"customerName\", \"quoteId\", \"quoteDate\", \"itemsHtml\", \"subtotal\", \"shipping\", \"discount\",\n \"estimatedTax\", \"feesHtml\", \"grandTotal\", \"validUntil\", \"shippingAddress\", \"customerNote\",\n ],\n [EmailTemplateEventEnum.QUOTE_DECLINED]: [\"customerName\", \"quoteId\", \"reason\"],\n [EmailTemplateEventEnum.NOTIFICATION]: [\"recipientName\", \"title\", \"message\", \"ctaLabel\", \"ctaUrl\"],\n [EmailTemplateEventEnum.PROMOTIONAL]: [\"recipientName\", \"headline\", \"body\", \"ctaLabel\", \"ctaUrl\", \"unsubscribeUrl\"],\n};\n\nexport interface IEmailTemplate extends BaseEntity {\n stores: (IStore | string)[];\n name: string;\n key: string;\n event: EmailTemplateEventEnum;\n subject: string;\n headerHtml: string;\n bodyHtml: string;\n footerHtml: string;\n variables: string[];\n isVisible: boolean;\n status: boolean;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { PricingType } from \"../addonConfig\";\nimport type { IStore } from \"../store\";\n\nexport const ConfiguratorSelectModeEnum = {\n SINGLE: \"SINGLE\",\n MULTI: \"MULTI\",\n} as const;\n\nexport type ConfiguratorSelectModeEnum =\n (typeof ConfiguratorSelectModeEnum)[keyof typeof ConfiguratorSelectModeEnum];\nexport const CONFIGURATOR_SELECT_MODE_VALUES = Object.values(ConfiguratorSelectModeEnum);\n\nexport const ConfiguratorSourceEnum = {\n PICKED: \"PICKED\",\n QUERY: \"QUERY\",\n} as const;\n\nexport type ConfiguratorSourceEnum =\n (typeof ConfiguratorSourceEnum)[keyof typeof ConfiguratorSourceEnum];\nexport const CONFIGURATOR_SOURCE_VALUES = Object.values(ConfiguratorSourceEnum);\n\nexport const ConfiguratorConditionTypeEnum = {\n SELECTED: \"SELECTED\",\n ALL: \"ALL\",\n ANY: \"ANY\",\n NOT: \"NOT\",\n} as const;\n\nexport type ConfiguratorConditionTypeEnum =\n (typeof ConfiguratorConditionTypeEnum)[keyof typeof ConfiguratorConditionTypeEnum];\nexport const CONFIGURATOR_CONDITION_TYPE_VALUES = Object.values(ConfiguratorConditionTypeEnum);\n\nexport const ConfiguratorEffectTypeEnum = {\n SHOW: \"SHOW\",\n HIDE: \"HIDE\",\n REQUIRE: \"REQUIRE\",\n OPTIONAL: \"OPTIONAL\",\n SELECT: \"SELECT\",\n DESELECT: \"DESELECT\",\n PRICE_ADJUST: \"PRICE_ADJUST\",\n} as const;\n\nexport type ConfiguratorEffectTypeEnum =\n (typeof ConfiguratorEffectTypeEnum)[keyof typeof ConfiguratorEffectTypeEnum];\nexport const CONFIGURATOR_EFFECT_TYPE_VALUES = Object.values(ConfiguratorEffectTypeEnum);\n\nexport const ConfiguratorErrorCodeEnum = {\n REQUIRED_SECTION_EMPTY: \"REQUIRED_SECTION_EMPTY\",\n OPTION_NOT_AVAILABLE: \"OPTION_NOT_AVAILABLE\",\n SECTION_NOT_AVAILABLE: \"SECTION_NOT_AVAILABLE\",\n UNKNOWN_SECTION: \"UNKNOWN_SECTION\",\n SINGLE_SELECT_OVERFILLED: \"SINGLE_SELECT_OVERFILLED\",\n RULES_UNSTABLE: \"RULES_UNSTABLE\",\n} as const;\n\nexport type ConfiguratorErrorCodeEnum =\n (typeof ConfiguratorErrorCodeEnum)[keyof typeof ConfiguratorErrorCodeEnum];\nexport interface IConfiguratorQuery {\n search?: string;\n categories?: string[];\n brands?: string[];\n types?: string[];\n minPrice?: number;\n maxPrice?: number;\n inStock?: boolean;\n limit?: number;\n}\n\nexport interface IConfiguratorFacetValue {\n key: string;\n label: string;\n tags?: string[];\n query?: IConfiguratorQuery;\n isDefault?: boolean;\n}\n\nexport interface IConfiguratorFacet {\n key: string;\n label: string;\n values: IConfiguratorFacetValue[];\n}\n\nexport interface IConfiguratorOption {\n key: string;\n sku: string;\n tags?: string[];\n sortOrder?: number;\n}\n\nexport interface IConfiguratorSection {\n key: string;\n title: string;\n description?: string;\n selectMode: ConfiguratorSelectModeEnum;\n required: boolean;\n source: ConfiguratorSourceEnum;\n options?: IConfiguratorOption[];\n query?: IConfiguratorQuery;\n facets?: IConfiguratorFacet[];\n contentHtml?: string;\n sortOrder?: number;\n}\n\nexport interface IConfiguratorStep {\n key: string;\n title: string;\n description?: string;\n sections: IConfiguratorSection[];\n sortOrder?: number;\n}\n\nexport interface IConfiguratorTarget {\n sectionKey: string;\n optionKey?: string;\n tag?: string;\n}\n\nexport type IConfiguratorCondition =\n | {\n type: typeof ConfiguratorConditionTypeEnum.SELECTED;\n sectionKey: string;\n optionKeys?: string[];\n }\n | {\n type: typeof ConfiguratorConditionTypeEnum.ALL | typeof ConfiguratorConditionTypeEnum.ANY;\n conditions: IConfiguratorCondition[];\n }\n | {\n type: typeof ConfiguratorConditionTypeEnum.NOT;\n condition: IConfiguratorCondition;\n };\n\nexport interface IConfiguratorEffect {\n type: ConfiguratorEffectTypeEnum;\n target: IConfiguratorTarget;\n mode?: PricingType;\n amount?: number;\n}\n\nexport interface IConfiguratorPriceAdjustment {\n sectionKey: string;\n optionKey?: string;\n mode: PricingType;\n amount: number;\n}\n\nexport interface IConfiguratorRule {\n key: string;\n description?: string;\n when: IConfiguratorCondition;\n then: IConfiguratorEffect[];\n}\n\nexport interface IConfigurator extends BaseEntity {\n name: string;\n key: string;\n description: string;\n images?: string[];\n stores: (IStore | string)[];\n steps: IConfiguratorStep[];\n rules: IConfiguratorRule[];\n sortOrder: number;\n isVisible: boolean;\n status: boolean;\n}\n\nexport type ConfiguratorSelections = Record<string, string[]>;\n","import { PricingTypeEnum, type PricingType } from \"../addonConfig\";\nimport { FeeAppliesToEnum } from \"../storeFee\";\nimport type { IAppliedFee } from \"../common\";\n\nexport const roundMoney = (amount: number): number => {\n if (!Number.isFinite(amount)) return 0;\n return Math.round((amount + Number.EPSILON) * 100) / 100;\n};\n\nconst moneyFormatters = new Map<string, Intl.NumberFormat>();\n\nconst moneyFormatter = (currencyCode: string): Intl.NumberFormat => {\n let formatter = moneyFormatters.get(currencyCode);\n if (!formatter) {\n formatter = new Intl.NumberFormat(\"en-US\", { style: \"currency\", currency: currencyCode });\n moneyFormatters.set(currencyCode, formatter);\n }\n return formatter;\n};\n\nexport const formatMoney = (value: number, currencyCode: string = \"USD\"): string =>\n moneyFormatter(currencyCode).format(value ?? 0);\n\nexport const normalizeLineQuantity = (quantity: number): number =>\n Math.max(1, Math.floor(Number(quantity)) || 1);\n\nexport interface AddonAmountInput {\n price: number;\n pricingType: PricingType;\n quantity: number;\n}\n\nexport const addonUnitAmount = (addon: AddonAmountInput, baseUnitPrice: number): number => {\n const value = Number.isFinite(addon.price) ? addon.price : 0;\n const quantity = Number.isFinite(addon.quantity) ? addon.quantity : 1;\n const amount = addon.pricingType === PricingTypeEnum.PERCENTAGE ? baseUnitPrice * (value / 100) : value;\n return roundMoney(amount * quantity);\n};\n\nexport const addonsUnitAmount = (addons: AddonAmountInput[], baseUnitPrice: number): number =>\n roundMoney(addons.reduce((sum, addon) => sum + addonUnitAmount(addon, baseUnitPrice), 0));\n\nexport interface PricedLineLike {\n pricing?: { baseUnitPrice?: number; unitPrice?: number };\n metaData?: unknown;\n}\n\nexport const addonsOfLine = (line: PricedLineLike): AddonAmountInput[] => {\n const raw = (line.metaData as { addons?: unknown } | undefined)?.addons;\n if (!Array.isArray(raw)) return [];\n return (raw as { price?: number; pricingType?: PricingType; quantity?: number }[]).map((addon) => ({\n price: Number(addon.price ?? 0),\n pricingType: addon.pricingType === PricingTypeEnum.PERCENTAGE ? PricingTypeEnum.PERCENTAGE : PricingTypeEnum.FIXED,\n quantity: Number(addon.quantity ?? 1),\n }));\n};\n\nexport const baseUnitPriceOfLine = (line: PricedLineLike): number | null => {\n const stored = line.pricing?.baseUnitPrice;\n if (typeof stored === \"number\") return stored;\n return addonsOfLine(line).length === 0 ? line.pricing?.unitPrice ?? 0 : null;\n};\n\nexport const feeHint = (fee: IAppliedFee): string => {\n const basis = fee.pricingType === PricingTypeEnum.PERCENTAGE && fee.value != null\n ? `${fee.value}% of ${fee.appliesTo === FeeAppliesToEnum.TOTAL ? \"order total\" : \"subtotal\"}`\n : \"Flat fee\";\n return fee.description ? `${basis} — ${fee.description}` : basis;\n};\n","import { roundMoney } from \"../pricing\";\nimport { PricingTypeEnum } from \"../addonConfig\";\nimport {\n ConfiguratorConditionTypeEnum,\n ConfiguratorEffectTypeEnum,\n ConfiguratorErrorCodeEnum,\n ConfiguratorSelectModeEnum,\n type ConfiguratorSelections,\n type IConfigurator,\n type IConfiguratorCondition,\n type IConfiguratorPriceAdjustment,\n type IConfiguratorSection,\n} from \"./interface\";\n\nexport interface ConfiguratorEvalContext {\n optionKeysBySection?: Record<string, string[]>;\n}\n\nexport interface ConfiguratorEvalError {\n code: ConfiguratorErrorCodeEnum;\n sectionKey: string;\n optionKey?: string;\n}\n\nexport interface ConfiguratorEvalResult {\n selections: ConfiguratorSelections;\n hiddenSections: string[];\n hiddenOptions: string[];\n requiredSections: string[];\n errors: ConfiguratorEvalError[];\n priceAdjustments: IConfiguratorPriceAdjustment[];\n stable: boolean;\n hiddenBy: Record<string, string>;\n selectedBy: Record<string, string>;\n}\n\nconst MAX_PASSES = 10;\n\nconst optionId = (sectionKey: string, optionKey: string): string => `${sectionKey}:${optionKey}`;\n\nconst targetOptionKeys = (\n target: { optionKey?: string; tag?: string } | undefined,\n section: IConfiguratorSection,\n): string[] => {\n if (target?.optionKey) return [target.optionKey];\n if (!target?.tag) return [];\n return (section.options ?? [])\n .filter((option) => (option.tags ?? []).includes(target.tag as string))\n .map((option) => option.key);\n};\n\nconst collectSections = (config: IConfigurator): Map<string, IConfiguratorSection> => {\n const sections = new Map<string, IConfiguratorSection>();\n for (const step of config.steps ?? []) {\n for (const section of step.sections ?? []) {\n if (section?.key) sections.set(section.key, section);\n }\n }\n return sections;\n};\n\nconst collectOptionKeys = (\n sections: Map<string, IConfiguratorSection>,\n override: Record<string, string[]> | undefined,\n): Map<string, Set<string> | null> => {\n const universe = new Map<string, Set<string> | null>();\n for (const [key, section] of sections) {\n const supplied = override?.[key];\n if (supplied) {\n universe.set(key, new Set(supplied));\n } else if (section.options?.length) {\n universe.set(key, new Set(section.options.map((option) => option.key)));\n } else {\n universe.set(key, null);\n }\n }\n return universe;\n};\n\nexport const conditionHolds = (\n condition: IConfiguratorCondition | undefined,\n selections: ConfiguratorSelections,\n): boolean => {\n if (!condition) return false;\n\n switch (condition.type) {\n case ConfiguratorConditionTypeEnum.SELECTED: {\n const chosen = selections[condition.sectionKey] ?? [];\n const wanted = condition.optionKeys ?? [];\n if (wanted.length === 0) return chosen.length > 0;\n return wanted.some((key) => chosen.includes(key));\n }\n case ConfiguratorConditionTypeEnum.ALL:\n return (condition.conditions ?? []).every((child) => conditionHolds(child, selections));\n case ConfiguratorConditionTypeEnum.ANY:\n return (condition.conditions ?? []).some((child) => conditionHolds(child, selections));\n case ConfiguratorConditionTypeEnum.NOT:\n return !conditionHolds(condition.condition, selections);\n default:\n return false;\n }\n};\n\nconst sameSelections = (a: ConfiguratorSelections, b: ConfiguratorSelections): boolean => {\n const keys = new Set([...Object.keys(a), ...Object.keys(b)]);\n for (const key of keys) {\n const left = a[key] ?? [];\n const right = b[key] ?? [];\n if (left.length !== right.length) return false;\n if (left.some((value, index) => value !== right[index])) return false;\n }\n return true;\n};\n\nconst sameSet = (a: Set<string>, b: Set<string>): boolean =>\n a.size === b.size && [...a].every((value) => b.has(value));\n\nexport const evaluateConfigurator = (\n config: IConfigurator,\n selections: ConfiguratorSelections,\n context: ConfiguratorEvalContext = {},\n): ConfiguratorEvalResult => {\n const sections = collectSections(config);\n const universe = collectOptionKeys(sections, context.optionKeysBySection);\n const rules = config.rules ?? [];\n\n let current: ConfiguratorSelections = {};\n for (const [sectionKey, chosen] of Object.entries(selections ?? {})) {\n current[sectionKey] = [...(chosen ?? [])];\n }\n\n let hiddenSections = new Set<string>();\n let hiddenOptions = new Set<string>();\n let requiredSections = new Set<string>();\n let errors: ConfiguratorEvalError[] = [];\n let stable = false;\n\n for (let pass = 0; pass < MAX_PASSES; pass++) {\n const nextHiddenSections = new Set<string>();\n const nextHiddenOptions = new Set<string>();\n const nextRequired = new Set<string>();\n for (const [key, section] of sections) {\n if (section.required) nextRequired.add(key);\n }\n\n const working: ConfiguratorSelections = {};\n for (const [sectionKey, chosen] of Object.entries(current)) {\n working[sectionKey] = [...chosen];\n }\n\n for (const rule of rules) {\n if (!conditionHolds(rule?.when, current)) continue;\n\n for (const effect of rule.then ?? []) {\n const sectionKey = effect?.target?.sectionKey;\n if (!sectionKey || !sections.has(sectionKey)) continue;\n const section = sections.get(sectionKey) as IConfiguratorSection;\n const targeted = targetOptionKeys(effect.target, section);\n const optionKey = targeted[0];\n\n switch (effect.type) {\n case ConfiguratorEffectTypeEnum.HIDE:\n if (effect.target.tag && targeted.length === 0) break;\n if (targeted.length) {\n for (const key of targeted) nextHiddenOptions.add(optionId(sectionKey, key));\n } else nextHiddenSections.add(sectionKey);\n break;\n case ConfiguratorEffectTypeEnum.SHOW:\n if (effect.target.tag && targeted.length === 0) break;\n if (targeted.length) {\n for (const key of targeted) nextHiddenOptions.delete(optionId(sectionKey, key));\n } else nextHiddenSections.delete(sectionKey);\n break;\n case ConfiguratorEffectTypeEnum.REQUIRE:\n nextRequired.add(sectionKey);\n break;\n case ConfiguratorEffectTypeEnum.OPTIONAL:\n nextRequired.delete(sectionKey);\n break;\n case ConfiguratorEffectTypeEnum.SELECT: {\n if (!optionKey) break;\n if (section.selectMode === ConfiguratorSelectModeEnum.SINGLE) {\n working[sectionKey] = [optionKey];\n break;\n }\n const chosen = working[sectionKey] ?? [];\n const added = targeted.filter((key) => !chosen.includes(key));\n if (added.length) working[sectionKey] = [...chosen, ...added];\n break;\n }\n case ConfiguratorEffectTypeEnum.PRICE_ADJUST:\n break;\n case ConfiguratorEffectTypeEnum.DESELECT: {\n if (!targeted.length) break;\n working[sectionKey] = (working[sectionKey] ?? []).filter((key) => !targeted.includes(key));\n break;\n }\n default:\n break;\n }\n }\n }\n\n const pruned: ConfiguratorSelections = {};\n\n for (const [sectionKey, chosen] of Object.entries(working)) {\n const section = sections.get(sectionKey);\n if (!section) continue;\n\n if (nextHiddenSections.has(sectionKey)) {\n pruned[sectionKey] = [];\n continue;\n }\n\n const known = universe.get(sectionKey) ?? null;\n const kept = chosen.filter((optionKey) => (\n (known === null || known.has(optionKey))\n && !nextHiddenOptions.has(optionId(sectionKey, optionKey))\n ));\n\n pruned[sectionKey] = section.selectMode === ConfiguratorSelectModeEnum.SINGLE && kept.length > 1\n ? kept.slice(-1)\n : kept;\n }\n\n const settled =\n sameSelections(pruned, current)\n && sameSet(nextHiddenSections, hiddenSections)\n && sameSet(nextHiddenOptions, hiddenOptions)\n && sameSet(nextRequired, requiredSections)\n && pass > 0;\n\n current = pruned;\n hiddenSections = nextHiddenSections;\n hiddenOptions = nextHiddenOptions;\n requiredSections = nextRequired;\n\n if (settled) {\n stable = true;\n break;\n }\n }\n\n if (!stable) {\n errors.push({ code: ConfiguratorErrorCodeEnum.RULES_UNSTABLE, sectionKey: \"\" });\n }\n\n for (const [sectionKey, chosen] of Object.entries(selections ?? {})) {\n const submitted = chosen ?? [];\n if (submitted.length === 0) continue;\n\n const section = sections.get(sectionKey);\n if (!section) {\n errors.push({ code: ConfiguratorErrorCodeEnum.UNKNOWN_SECTION, sectionKey });\n continue;\n }\n\n if (hiddenSections.has(sectionKey)) {\n for (const optionKey of submitted) {\n errors.push({ code: ConfiguratorErrorCodeEnum.SECTION_NOT_AVAILABLE, sectionKey, optionKey });\n }\n continue;\n }\n\n const known = universe.get(sectionKey) ?? null;\n const survivors = current[sectionKey] ?? [];\n const overfilled = section.selectMode === ConfiguratorSelectModeEnum.SINGLE && submitted.length > 1;\n\n for (const optionKey of submitted) {\n if (known !== null && !known.has(optionKey)) {\n errors.push({ code: ConfiguratorErrorCodeEnum.OPTION_NOT_AVAILABLE, sectionKey, optionKey });\n } else if (hiddenOptions.has(optionId(sectionKey, optionKey))) {\n errors.push({ code: ConfiguratorErrorCodeEnum.OPTION_NOT_AVAILABLE, sectionKey, optionKey });\n } else if (overfilled && !survivors.includes(optionKey)) {\n errors.push({ code: ConfiguratorErrorCodeEnum.SINGLE_SELECT_OVERFILLED, sectionKey, optionKey });\n }\n }\n }\n\n const priceAdjustments: IConfiguratorPriceAdjustment[] = [];\n for (const rule of rules) {\n if (!conditionHolds(rule?.when, current)) continue;\n for (const effect of rule.then ?? []) {\n if (effect?.type !== ConfiguratorEffectTypeEnum.PRICE_ADJUST) continue;\n\n const sectionKey = effect.target?.sectionKey;\n const amount = Number(effect.amount);\n if (!sectionKey || !sections.has(sectionKey) || !Number.isFinite(amount) || amount === 0) continue;\n if (hiddenSections.has(sectionKey)) continue;\n\n const section = sections.get(sectionKey) as IConfiguratorSection;\n const targeted = targetOptionKeys(effect.target, section);\n const chosen = current[sectionKey] ?? [];\n const mode = effect.mode === PricingTypeEnum.PERCENTAGE ? PricingTypeEnum.PERCENTAGE : PricingTypeEnum.FIXED;\n\n if (targeted.length) {\n for (const optionKey of targeted) {\n if (!chosen.includes(optionKey)) continue;\n priceAdjustments.push({ sectionKey, optionKey, mode, amount });\n }\n continue;\n }\n if (effect.target.tag || chosen.length === 0) continue;\n\n priceAdjustments.push({ sectionKey, mode, amount });\n }\n }\n\n const hiddenBy: Record<string, string> = {};\n const selectedBy: Record<string, string> = {};\n for (const rule of rules) {\n if (!conditionHolds(rule?.when, current)) continue;\n for (const effect of rule.then ?? []) {\n const sectionKey = effect?.target?.sectionKey;\n if (!sectionKey || !sections.has(sectionKey)) continue;\n if (effect.type !== ConfiguratorEffectTypeEnum.HIDE && effect.type !== ConfiguratorEffectTypeEnum.SELECT) continue;\n\n const section = sections.get(sectionKey) as IConfiguratorSection;\n const targeted = targetOptionKeys(effect.target, section);\n const note = rule.description?.trim()\n || (effect.type === ConfiguratorEffectTypeEnum.HIDE\n ? \"Not compatible with your current build.\"\n : \"Included with your build.\");\n const into = effect.type === ConfiguratorEffectTypeEnum.HIDE ? hiddenBy : selectedBy;\n\n if (targeted.length === 0) {\n if (!effect.target.tag && effect.type === ConfiguratorEffectTypeEnum.HIDE) into[sectionKey] = note;\n continue;\n }\n for (const optionKey of targeted) into[optionId(sectionKey, optionKey)] = note;\n }\n }\n\n for (const sectionKey of requiredSections) {\n if (hiddenSections.has(sectionKey)) continue;\n if ((current[sectionKey] ?? []).length === 0) {\n errors.push({ code: ConfiguratorErrorCodeEnum.REQUIRED_SECTION_EMPTY, sectionKey });\n }\n }\n\n return {\n selections: current,\n hiddenSections: [...hiddenSections],\n hiddenOptions: [...hiddenOptions],\n requiredSections: [...requiredSections],\n errors,\n priceAdjustments,\n stable,\n hiddenBy,\n selectedBy,\n };\n};\n\nexport const applyPriceAdjustments = (\n baseUnitPrice: number,\n adjustments: IConfiguratorPriceAdjustment[],\n): number => {\n if (adjustments.length === 0) return roundMoney(baseUnitPrice);\n\n let delta = 0;\n for (const adjustment of adjustments) {\n delta += adjustment.mode === PricingTypeEnum.PERCENTAGE\n ? (baseUnitPrice * adjustment.amount) / 100\n : adjustment.amount;\n }\n return roundMoney(Math.max(0, baseUnitPrice + delta));\n};\n\nexport const adjustmentsFor = (\n adjustments: IConfiguratorPriceAdjustment[],\n sectionKey: string,\n optionKey: string,\n): IConfiguratorPriceAdjustment[] =>\n adjustments.filter((adjustment) => (\n adjustment.sectionKey === sectionKey\n && (!adjustment.optionKey || adjustment.optionKey === optionKey)\n ));\n\nexport const isConfigurationValid = (result: ConfiguratorEvalResult): boolean =>\n result.stable && result.errors.length === 0;\n","export const InventoryPolicyEnum = {\n DENY: \"deny\",\n CONTINUE: \"continue\",\n} as const;\n\nexport type InventoryPolicy = (typeof InventoryPolicyEnum)[keyof typeof InventoryPolicyEnum];\n\nexport const INVENTORY_POLICY_VALUES: InventoryPolicy[] = Object.values(InventoryPolicyEnum);\n","export const SaleTypeEnum = {\n DIRECT: \"DIRECT\",\n QUOTE: \"QUOTE\",\n} as const;\n\nexport type SaleType = (typeof SaleTypeEnum)[keyof typeof SaleTypeEnum];\n\nexport const SALE_TYPE_VALUES: SaleType[] = Object.values(SaleTypeEnum);\n","import { SaleTypeEnum, type SaleType } from \"./interface\";\n\nexport interface SaleTypedLike {\n saleType?: SaleType;\n metaData?: unknown;\n price?: { price?: number } | null;\n}\n\nexport const saleTypeOf = (item: SaleTypedLike | null | undefined): SaleType => {\n if (item?.saleType) return item.saleType;\n const flagged = (item?.metaData as { quoteOnly?: boolean } | undefined)?.quoteOnly === true;\n const price = Number(item?.price?.price ?? 0);\n return flagged || !Number.isFinite(price) || price <= 0 ? SaleTypeEnum.QUOTE : SaleTypeEnum.DIRECT;\n};\n\nexport const isQuoteOnlyItem = (item: SaleTypedLike | null | undefined): boolean =>\n saleTypeOf(item) === SaleTypeEnum.QUOTE;\n","export const normalizePath = (input: string): string => {\n if (!input || typeof input !== \"string\") return \"/\";\n\n let path = input.trim();\n\n if (/^https?:\\/\\//i.test(path)) {\n try {\n path = new URL(path).pathname;\n } catch {\n }\n }\n\n path = path.split(\"?\")[0].split(\"#\")[0];\n\n try {\n path = decodeURIComponent(path);\n } catch {\n }\n\n if (!path.startsWith(\"/\")) path = `/${path}`;\n path = path.replace(/\\/{2,}/g, \"/\").toLowerCase();\n\n if (path.length > 1) path = path.replace(/\\/+$/, \"\");\n\n return path || \"/\";\n};\n\nexport const canonicalizeSlug = (input: string): string => {\n if (!input || typeof input !== \"string\") return \"\";\n return input\n .trim()\n .toLowerCase()\n .replace(/\\s+/g, \"-\")\n .replace(/-{2,}/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n};\n\nexport const canonicalizePath = (input: string): string => {\n if (!input || typeof input !== \"string\") return \"/\";\n\n let path = input.trim();\n\n if (/^https?:\\/\\//i.test(path)) {\n try {\n path = new URL(path).pathname;\n } catch {\n }\n }\n\n path = path.split(\"?\")[0].split(\"#\")[0];\n\n try {\n path = decodeURIComponent(path);\n } catch {\n }\n\n if (!path.startsWith(\"/\")) path = `/${path}`;\n\n const hadTrailingSlash = path.length > 1 && path.endsWith(\"/\");\n\n const segments = path\n .split(\"/\")\n .map((segment) => (segment ? canonicalizeSlug(segment) : segment))\n .filter((segment, index) => segment !== \"\" || index === 0);\n\n let out = segments.join(\"/\") || \"/\";\n if (!out.startsWith(\"/\")) out = `/${out}`;\n if (hadTrailingSlash && out !== \"/\") out += \"/\";\n\n return out;\n};\n","import type { BaseEntity } from \"../base\";\nimport type { IAddress } from \"../address\";\nimport type { ISummaryPricing, Metadata } from \"../common\";\nimport type { ICoupon } from \"../coupon\";\nimport type { ICustomer } from \"../customer\";\nimport type { IOrderItem } from \"../orderItem\";\nimport type { IStore } from \"../store\";\nimport type { IOrderTransaction, IRefundTransaction } from \"../transaction\";\nimport type { PaymentGatewayEnum, PaymentMethodEnum, PaymentStatusEnum } from \"../transaction\";\nimport type { SaleType } from \"../saleType\";\n\nexport const OrderStatusEnum = {\n CREATED: \"CREATED\",\n RECEIVED: \"RECEIVED\",\n PENDING: \"PENDING\",\n CONFIRMED: \"CONFIRMED\",\n PROCESSING: \"PROCESSING\",\n SHIPPED: \"SHIPPED\",\n DELIVERED: \"DELIVERED\",\n CANCELED: \"CANCELED\",\n FAILED: \"FAILED\",\n REFUNDED: \"REFUNDED\",\n PARTIALLY_REFUNDED: \"PARTIALLY_REFUNDED\",\n ARCHIVED: \"ARCHIVED\",\n RETURNED: \"RETURNED\",\n\n QUOTE_REQUESTED: \"QUOTE_REQUESTED\",\n QUOTED: \"QUOTED\",\n QUOTE_ACCEPTED: \"QUOTE_ACCEPTED\",\n QUOTE_DECLINED: \"QUOTE_DECLINED\",\n QUOTE_EXPIRED: \"QUOTE_EXPIRED\",\n} as const;\n\nexport type OrderStatusEnum = (typeof OrderStatusEnum)[keyof typeof OrderStatusEnum];\nexport const ORDER_STATUS_VALUES = Object.values(OrderStatusEnum);\n\nexport const statusColors: Record<OrderStatusEnum, string> = {\n [OrderStatusEnum.CREATED]: \"default\",\n [OrderStatusEnum.RECEIVED]: \"cyan\",\n [OrderStatusEnum.PENDING]: \"gold\",\n [OrderStatusEnum.CONFIRMED]: \"blue\",\n [OrderStatusEnum.PROCESSING]: \"cyan\",\n [OrderStatusEnum.SHIPPED]: \"purple\",\n [OrderStatusEnum.DELIVERED]: \"green\",\n [OrderStatusEnum.CANCELED]: \"volcano\",\n [OrderStatusEnum.FAILED]: \"red\",\n [OrderStatusEnum.REFUNDED]: \"orange\",\n [OrderStatusEnum.PARTIALLY_REFUNDED]: \"magenta\",\n [OrderStatusEnum.ARCHIVED]: \"gray\",\n [OrderStatusEnum.RETURNED]: \"purple\",\n [OrderStatusEnum.QUOTE_REQUESTED]: \"gold\",\n [OrderStatusEnum.QUOTED]: \"blue\",\n [OrderStatusEnum.QUOTE_ACCEPTED]: \"green\",\n [OrderStatusEnum.QUOTE_DECLINED]: \"volcano\",\n [OrderStatusEnum.QUOTE_EXPIRED]: \"gray\",\n};\n\nexport const PURCHASE_ORDER_STATUSES: OrderStatusEnum[] = [\n OrderStatusEnum.CREATED, OrderStatusEnum.RECEIVED, OrderStatusEnum.PENDING,\n OrderStatusEnum.CONFIRMED, OrderStatusEnum.PROCESSING, OrderStatusEnum.SHIPPED,\n OrderStatusEnum.DELIVERED, OrderStatusEnum.CANCELED, OrderStatusEnum.FAILED,\n OrderStatusEnum.REFUNDED, OrderStatusEnum.PARTIALLY_REFUNDED, OrderStatusEnum.ARCHIVED,\n OrderStatusEnum.RETURNED,\n];\n\nexport const OPEN_ORDER_STATUSES: OrderStatusEnum[] = [\n OrderStatusEnum.CREATED, OrderStatusEnum.RECEIVED, OrderStatusEnum.PENDING,\n OrderStatusEnum.CONFIRMED, OrderStatusEnum.PROCESSING, OrderStatusEnum.SHIPPED,\n];\n\nexport const QUOTE_ORDER_STATUSES: OrderStatusEnum[] = [\n OrderStatusEnum.QUOTE_REQUESTED, OrderStatusEnum.QUOTED, OrderStatusEnum.QUOTE_ACCEPTED,\n OrderStatusEnum.QUOTE_DECLINED, OrderStatusEnum.QUOTE_EXPIRED, OrderStatusEnum.CANCELED,\n];\n\nexport interface IOrder extends BaseEntity {\n orderId: string;\n orderItems: IOrderItem[];\n customer: ICustomer;\n coupon: ICoupon;\n store: IStore;\n status: OrderStatusEnum;\n type?: SaleType;\n sourceQuote?: IOrder | string;\n convertedOrder?: IOrder | string;\n quoteValidUntil?: Date;\n paymentStatus: PaymentStatusEnum;\n paymentMethod: PaymentMethodEnum;\n paymentGateway: PaymentGatewayEnum;\n shippingAddress: IAddress;\n billingAddress: IAddress;\n shippingMethod: string;\n acceptedTermsAt: Date;\n customerNote: string;\n metaData: Metadata;\n orderTransactions: IOrderTransaction[];\n refundTransactions: IRefundTransaction[];\n pricing: ISummaryPricing;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { Metadata } from \"../common\";\nimport type { IOrder } from \"../order\";\n\nexport const OrderLogTypeEnum = {\n ORDER_PLACED: \"ORDER_PLACED\",\n PAYMENT_PENDING: \"PAYMENT_PENDING\",\n PAYMENT_SUCCEEDED: \"PAYMENT_SUCCEEDED\",\n PAYMENT_FAILED: \"PAYMENT_FAILED\",\n PAYMENT_CANCELLED: \"PAYMENT_CANCELLED\",\n ORDER_STATUS: \"ORDER_STATUS\",\n REFUND: \"REFUND\",\n EMAIL: \"EMAIL\",\n NOTE: \"NOTE\",\n} as const;\n\nexport type OrderLogTypeEnum = (typeof OrderLogTypeEnum)[keyof typeof OrderLogTypeEnum];\nexport const ORDER_LOG_TYPE_VALUES = Object.values(OrderLogTypeEnum);\n\nexport const orderLogTypeColorMap: Record<OrderLogTypeEnum, string> = {\n [OrderLogTypeEnum.ORDER_PLACED]: \"blue\",\n [OrderLogTypeEnum.PAYMENT_PENDING]: \"gold\",\n [OrderLogTypeEnum.PAYMENT_SUCCEEDED]: \"green\",\n [OrderLogTypeEnum.PAYMENT_FAILED]: \"red\",\n [OrderLogTypeEnum.PAYMENT_CANCELLED]: \"volcano\",\n [OrderLogTypeEnum.ORDER_STATUS]: \"cyan\",\n [OrderLogTypeEnum.REFUND]: \"purple\",\n [OrderLogTypeEnum.EMAIL]: \"geekblue\",\n [OrderLogTypeEnum.NOTE]: \"default\",\n};\n\nexport interface IOrderLog extends BaseEntity {\n order: IOrder | string;\n type: OrderLogTypeEnum;\n message: string;\n actor?: string;\n meta?: Metadata;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { IOrder } from \"../order\";\nimport type { PaymentGatewayEnum } from \"../transaction\";\n\nexport const PaymentLinkStatusEnum = {\n PENDING: \"PENDING\",\n PAID: \"PAID\",\n EXPIRED: \"EXPIRED\",\n CANCELLED: \"CANCELLED\",\n} as const;\n\nexport type PaymentLinkStatusEnum = (typeof PaymentLinkStatusEnum)[keyof typeof PaymentLinkStatusEnum];\nexport const PAYMENT_LINK_STATUS_VALUES = Object.values(PaymentLinkStatusEnum);\n\nexport const paymentLinkStatusColorMap: Record<PaymentLinkStatusEnum, string> = {\n [PaymentLinkStatusEnum.PENDING]: \"gold\",\n [PaymentLinkStatusEnum.PAID]: \"green\",\n [PaymentLinkStatusEnum.EXPIRED]: \"default\",\n [PaymentLinkStatusEnum.CANCELLED]: \"volcano\",\n};\n\nexport interface IPaymentLink extends BaseEntity {\n order: IOrder | string;\n token: string;\n amount: number;\n currencyCode: string;\n gateway: PaymentGatewayEnum;\n status: PaymentLinkStatusEnum;\n expiresAt?: string | Date;\n paidAt?: string | Date;\n transaction?: string;\n createdBy?: string;\n baseUrl: string;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { ISummaryPricing, Metadata } from \"../common\";\nimport type { ICoupon } from \"../coupon\";\nimport type { ICustomer } from \"../customer\";\nimport type { IStore } from \"../store\";\nimport type { ICartItem } from \"../cartItem\";\nimport type { IOrder } from \"../order\";\nimport type { IShippingRate } from \"../shipping\";\nimport type { SaleType } from \"../saleType\";\n\n\nexport const CartStatusEnum = {\n ACTIVE: \"ACTIVE\",\n CONVERTED: \"CONVERTED\",\n QUOTED: \"QUOTED\",\n ABANDONED: \"ABANDONED\",\n} as const;\n\nexport type CartStatusEnum = (typeof CartStatusEnum)[keyof typeof CartStatusEnum];\nexport const CART_STATUS_VALUES = Object.values(CartStatusEnum);\nexport const RETIRED_CART_STATUSES: CartStatusEnum[] = [\n CartStatusEnum.CONVERTED,\n CartStatusEnum.QUOTED,\n CartStatusEnum.ABANDONED,\n];\n\n\nexport interface ICart extends BaseEntity {\n cartId: string;\n cartItems: ICartItem[];\n user?: ICustomer;\n coupon?: ICoupon;\n store: IStore;\n metaData: Metadata;\n optionalFees?: Record<string, boolean>;\n pricing: ISummaryPricing;\n selectedShippingRate?: IShippingRate;\n status: CartStatusEnum;\n type: SaleType;\n order?: IOrder | string;\n convertedAt?: Date;\n quoteToken?: string;\n quotedAt?: Date;\n quoteEmail?: string;\n sourceCart?: ICart | string;\n}\n\nexport const CartIssueTypes = {\n ITEM_UNAVAILABLE: \"ITEM_UNAVAILABLE\",\n OUT_OF_STOCK: \"OUT_OF_STOCK\",\n INSUFFICIENT_STOCK: \"INSUFFICIENT_STOCK\",\n COUPON_INVALID: \"COUPON_INVALID\",\n} as const;\n\nexport type CartIssueType = (typeof CartIssueTypes)[keyof typeof CartIssueTypes];\nexport interface CartIssue {\n type: CartIssueType;\n itemId?: string;\n name?: string;\n available?: number;\n requested?: number;\n message: string;\n}\n\nexport interface CartValidation {\n ok: boolean;\n issues: CartIssue[];\n}\n","export interface StockDemandLine {\n key: string;\n quantity: number;\n}\n\nexport const demandByKey = (lines: StockDemandLine[]): Map<string, number> => {\n const totals = new Map<string, number>();\n for (const line of lines) {\n if (!line.key) continue;\n const quantity = Number(line.quantity);\n if (!Number.isFinite(quantity) || quantity <= 0) continue;\n totals.set(line.key, (totals.get(line.key) ?? 0) + quantity);\n }\n return totals;\n};\n\nexport const StockVerdictEnum = {\n OK: \"OK\",\n OUT_OF_STOCK: \"OUT_OF_STOCK\",\n INSUFFICIENT_STOCK: \"INSUFFICIENT_STOCK\",\n} as const;\n\nexport type StockVerdict =\n | { type: typeof StockVerdictEnum.OK }\n | { type: typeof StockVerdictEnum.OUT_OF_STOCK; available: 0; requested: number }\n | { type: typeof StockVerdictEnum.INSUFFICIENT_STOCK; available: number; requested: number };\n\nexport const stockVerdict = (available: number, requested: number): StockVerdict => {\n const stock = Number.isFinite(available) ? Math.max(0, Math.floor(available)) : 0;\n const wanted = Number.isFinite(requested) ? Math.max(0, Math.floor(requested)) : 0;\n if (stock <= 0) return { type: StockVerdictEnum.OUT_OF_STOCK, available: 0, requested: wanted };\n if (wanted > stock) return { type: StockVerdictEnum.INSUFFICIENT_STOCK, available: stock, requested: wanted };\n return { type: StockVerdictEnum.OK };\n};\n","import type { BaseEntity } from \"../base\";\nimport type { ICustomer } from \"../customer\";\nimport type { IStore } from \"../store\";\n\nexport const SubscriptionChannelEnum = {\n EMAIL: \"EMAIL\",\n SMS: \"SMS\",\n PUSH: \"PUSH\",\n} as const;\n\nexport type SubscriptionChannelEnum = (typeof SubscriptionChannelEnum)[keyof typeof SubscriptionChannelEnum];\nexport const SUBSCRIPTION_CHANNEL_VALUES = Object.values(SubscriptionChannelEnum);\n\nexport const ACTIVE_SUBSCRIPTION_CHANNELS: SubscriptionChannelEnum[] = [SubscriptionChannelEnum.EMAIL];\n\nexport const SubscriptionTopicEnum = {\n PROMOTIONAL: \"PROMOTIONAL\",\n NEWSLETTER: \"NEWSLETTER\",\n BACK_IN_STOCK: \"BACK_IN_STOCK\",\n PRICE_DROP: \"PRICE_DROP\",\n} as const;\n\nexport type SubscriptionTopicEnum = (typeof SubscriptionTopicEnum)[keyof typeof SubscriptionTopicEnum];\nexport const SUBSCRIPTION_TOPIC_VALUES = Object.values(SubscriptionTopicEnum);\n\nexport const SUBSCRIPTION_TOPIC_LABELS: Record<SubscriptionTopicEnum, string> = {\n [SubscriptionTopicEnum.PROMOTIONAL]: \"Promotional\",\n [SubscriptionTopicEnum.NEWSLETTER]: \"Newsletter\",\n [SubscriptionTopicEnum.BACK_IN_STOCK]: \"Back in stock\",\n [SubscriptionTopicEnum.PRICE_DROP]: \"Price drop\",\n};\n\nexport const DEFAULT_SUBSCRIPTION_TOPICS: SubscriptionTopicEnum[] = [\n SubscriptionTopicEnum.PROMOTIONAL,\n SubscriptionTopicEnum.NEWSLETTER,\n];\n\nexport interface ISubscription {\n channel: SubscriptionChannelEnum;\n topic: SubscriptionTopicEnum;\n subscribed: boolean;\n source?: string;\n updatedAt?: Date | string;\n}\n\nexport interface ISubscriberConsent {\n source?: string;\n ip?: string;\n at?: Date | string;\n}\n\nexport interface ISubscriber extends BaseEntity {\n email: string;\n phone?: string;\n customer?: ICustomer | string;\n firstName?: string;\n lastName?: string;\n stores?: (IStore | string)[];\n subscriptions: ISubscription[];\n consent?: ISubscriberConsent;\n unsubscribeToken?: string;\n status: boolean;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { IStore } from \"../store\";\nimport type { ISubscriber } from \"../subscriber\";\nimport type { SubscriptionChannelEnum, SubscriptionTopicEnum } from \"../subscriber\";\n\nexport const CampaignStatusEnum = {\n SENDING: \"SENDING\",\n SENT: \"SENT\",\n FAILED: \"FAILED\",\n} as const;\n\nexport type CampaignStatusEnum = (typeof CampaignStatusEnum)[keyof typeof CampaignStatusEnum];\nexport const CAMPAIGN_STATUS_VALUES = Object.values(CampaignStatusEnum);\n\nexport const CampaignRecipientStatusEnum = {\n QUEUED: \"QUEUED\",\n SENT: \"SENT\",\n DELIVERED: \"DELIVERED\",\n OPENED: \"OPENED\",\n CLICKED: \"CLICKED\",\n BOUNCED: \"BOUNCED\",\n COMPLAINED: \"COMPLAINED\",\n FAILED: \"FAILED\",\n} as const;\n\nexport type CampaignRecipientStatusEnum = (typeof CampaignRecipientStatusEnum)[keyof typeof CampaignRecipientStatusEnum];\nexport const CAMPAIGN_RECIPIENT_STATUS_VALUES = Object.values(CampaignRecipientStatusEnum);\n\nexport interface ICampaignStats {\n sent: number;\n delivered: number;\n opened: number;\n clicked: number;\n bounced: number;\n complained: number;\n failed: number;\n}\n\nexport interface ICampaign extends BaseEntity {\n headline: string;\n body: string;\n ctaLabel?: string;\n ctaUrl?: string;\n channel: SubscriptionChannelEnum;\n topic: SubscriptionTopicEnum;\n store?: IStore | string;\n status: CampaignStatusEnum;\n recipientCount: number;\n stats: ICampaignStats;\n createdBy?: string;\n sentAt?: Date | string;\n}\n\nexport interface ICampaignRecipient extends BaseEntity {\n campaign: ICampaign | string;\n subscriber?: ISubscriber | string;\n email: string;\n resendEmailId?: string;\n status: CampaignRecipientStatusEnum;\n openedAt?: Date | string;\n clickedAt?: Date | string;\n lastEventAt?: Date | string;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { IProduct } from \"../product\";\nimport type { IStore } from \"../store\";\nimport type { IVariant } from \"../variant\";\n\nexport const StockStatusEnum = {\n IN_STOCK: \"IN_STOCK\",\n LOW_STOCK: \"LOW_STOCK\",\n OUT_OF_STOCK: \"OUT_OF_STOCK\",\n} as const;\n\nexport type StockStatus = (typeof StockStatusEnum)[keyof typeof StockStatusEnum];\nexport interface IStock extends BaseEntity {\n sku: string;\n product: IProduct;\n variant?: IVariant | null;\n store?: IStore | string | null;\n\n quantity: number;\n reserved: number;\n available: number;\n\n status: StockStatus;\n lowStockThreshold: number;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { IStore } from \"../store\";\nimport type { Metadata } from \"../common\";\nimport type { IOrder } from \"../order\";\nimport type { ICurrency } from \"../currency\";\n\nexport const PaymentStatusEnum = {\n INITIATED: 'INITIATED',\n PENDING: 'PENDING',\n PROCESSING: 'PROCESSING',\n FAILED: 'FAILED',\n CANCELLED: 'CANCELLED',\n PENDING_CAPTURE: 'PENDING_CAPTURE',\n COMPLETED: 'COMPLETED',\n VOIDED: 'VOIDED',\n REDIRECTED_TO_GATEWAY: 'REDIRECTED_TO_GATEWAY',\n UNKNOWN: 'UNKNOWN',\n REFUNDED: 'REFUNDED',\n PARTIALLY_REFUNDED: 'PARTIALLY_REFUNDED',\n NOT_REQUIRED: 'NOT_REQUIRED',\n} as const;\n\nexport type PaymentStatusEnum = (typeof PaymentStatusEnum)[keyof typeof PaymentStatusEnum];\nexport const PAYMENT_STATUS_VALUES = Object.values(PaymentStatusEnum);\n\nexport const AWAITING_PAYMENT_STATUSES: PaymentStatusEnum[] = [\n PaymentStatusEnum.INITIATED,\n PaymentStatusEnum.PENDING,\n PaymentStatusEnum.PROCESSING,\n PaymentStatusEnum.PENDING_CAPTURE,\n PaymentStatusEnum.REDIRECTED_TO_GATEWAY,\n PaymentStatusEnum.FAILED,\n PaymentStatusEnum.UNKNOWN,\n];\n\nexport const paymentStatusColorMap: Record<PaymentStatusEnum, string> = {\n [PaymentStatusEnum.INITIATED]: 'default',\n [PaymentStatusEnum.PENDING]: 'gold',\n [PaymentStatusEnum.PROCESSING]: 'cyan',\n [PaymentStatusEnum.FAILED]: 'red',\n [PaymentStatusEnum.CANCELLED]: 'volcano',\n [PaymentStatusEnum.PENDING_CAPTURE]: 'blue',\n [PaymentStatusEnum.COMPLETED]: 'green',\n [PaymentStatusEnum.VOIDED]: 'magenta',\n [PaymentStatusEnum.REDIRECTED_TO_GATEWAY]: 'purple',\n [PaymentStatusEnum.UNKNOWN]: 'gray',\n [PaymentStatusEnum.REFUNDED]: 'orange',\n [PaymentStatusEnum.PARTIALLY_REFUNDED]: 'magenta',\n [PaymentStatusEnum.NOT_REQUIRED]: 'default',\n};\n\nexport const PaymentMethodEnum = {\n CREDIT_CARD: 'CREDIT_CARD',\n PAYPAL: 'PAYPAL',\n STRIPE: 'STRIPE',\n CHECK: 'CHECK',\n APPLE_PAY: 'APPLE_PAY',\n PURCHASE_ORDER: 'PURCHASE_ORDER',\n} as const;\n\nexport type PaymentMethodEnum = (typeof PaymentMethodEnum)[keyof typeof PaymentMethodEnum];\nexport const PAYMENT_METHOD_VALUES = Object.values(PaymentMethodEnum);\n\nexport const paymentMethodColorMap: Record<PaymentMethodEnum, string> = {\n [PaymentMethodEnum.CREDIT_CARD]: 'blue',\n [PaymentMethodEnum.PAYPAL]: 'geekblue',\n [PaymentMethodEnum.STRIPE]: 'purple',\n [PaymentMethodEnum.CHECK]: 'orange',\n [PaymentMethodEnum.APPLE_PAY]: 'black',\n [PaymentMethodEnum.PURCHASE_ORDER]: 'gold',\n};\n\nexport const PaymentGatewayEnum = {\n STRIPE: 'STRIPE',\n PAYPAL: 'PAYPAL',\n BRAINTREE: 'BRAINTREE',\n MANUAL: 'MANUAL',\n} as const;\n\nexport type PaymentGatewayEnum = (typeof PaymentGatewayEnum)[keyof typeof PaymentGatewayEnum];\nexport const PAYMENT_GATEWAY_VALUES = Object.values(PaymentGatewayEnum);\n\nexport const TransactionTypeEnum = {\n ORDER: \"ORDER\",\n REFUND: \"REFUND\",\n} as const;\n\nexport type TransactionTypeEnum = (typeof TransactionTypeEnum)[keyof typeof TransactionTypeEnum];\n\nexport const TRANSACTION_TYPE_VALUES = Object.values(TransactionTypeEnum);\n\nexport const typeColorMap: Record<TransactionTypeEnum, string> = {\n [TransactionTypeEnum.ORDER]: \"blue\",\n [TransactionTypeEnum.REFUND]: \"purple\",\n};\n\nexport interface ITransactionBase extends BaseEntity {\n order: IOrder;\n store: IStore | string;\n currency: ICurrency;\n transactionId: string;\n amount: number;\n status: PaymentStatusEnum;\n paymentMethod: PaymentMethodEnum;\n gateway: PaymentGatewayEnum;\n gatewayId?: string;\n metaData: Metadata;\n comment?: string;\n isPaymentLink: boolean;\n refundedAmount: number;\n proofFileId?: string;\n}\n\nexport interface IOrderTransaction extends ITransactionBase {\n type: typeof TransactionTypeEnum.ORDER;\n}\n\nexport interface IRefundTransaction extends ITransactionBase {\n type: typeof TransactionTypeEnum.REFUND;\n originalTransaction?: ITransactionBase;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { IProduct } from \"../product\";\nimport type { IStore } from \"../store\";\n\nexport const ProductEventTypeEnum = {\n VIEW: \"view\",\n ADD_TO_CART: \"add_to_cart\",\n PURCHASE: \"purchase\",\n} as const;\n\nexport type ProductEventTypeEnum = (typeof ProductEventTypeEnum)[keyof typeof ProductEventTypeEnum];\nexport interface IProductDailyStat extends BaseEntity {\n product: IProduct | string;\n store?: IStore | string | null;\n date: string;\n views: number;\n addToCarts: number;\n purchases: number;\n revenue: number;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { Metadata } from \"../common\";\nimport type { IOrder } from \"../order\";\nimport type { IStore } from \"../store\";\n\nexport const NotificationTypeEnum = {\n ORDER_RECEIVED: \"ORDER_RECEIVED\",\n PAYMENT_SUCCEEDED: \"PAYMENT_SUCCEEDED\",\n PAYMENT_FAILED: \"PAYMENT_FAILED\",\n REFUND: \"REFUND\",\n ORDER_CANCELLED: \"ORDER_CANCELLED\",\n ORDER_STATUS: \"ORDER_STATUS\",\n QUOTE_REQUESTED: \"QUOTE_REQUESTED\",\n} as const;\n\nexport type NotificationTypeEnum = (typeof NotificationTypeEnum)[keyof typeof NotificationTypeEnum];\nexport const NOTIFICATION_TYPE_VALUES = Object.values(NotificationTypeEnum);\n\nexport interface INotification extends BaseEntity {\n type: NotificationTypeEnum;\n title: string;\n message: string;\n order?: IOrder | string | null;\n store?: IStore | string | null;\n read: boolean;\n readAt?: Date | null;\n meta?: Metadata;\n}\n"],"mappings":"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","names":["idOf"]}
|
package/dist/index.mjs
CHANGED
|
@@ -809,6 +809,14 @@ var PURCHASE_ORDER_STATUSES = [
|
|
|
809
809
|
OrderStatusEnum.ARCHIVED,
|
|
810
810
|
OrderStatusEnum.RETURNED
|
|
811
811
|
];
|
|
812
|
+
var OPEN_ORDER_STATUSES = [
|
|
813
|
+
OrderStatusEnum.CREATED,
|
|
814
|
+
OrderStatusEnum.RECEIVED,
|
|
815
|
+
OrderStatusEnum.PENDING,
|
|
816
|
+
OrderStatusEnum.CONFIRMED,
|
|
817
|
+
OrderStatusEnum.PROCESSING,
|
|
818
|
+
OrderStatusEnum.SHIPPED
|
|
819
|
+
];
|
|
812
820
|
var QUOTE_ORDER_STATUSES = [
|
|
813
821
|
OrderStatusEnum.QUOTE_REQUESTED,
|
|
814
822
|
OrderStatusEnum.QUOTED,
|
|
@@ -971,6 +979,15 @@ var PaymentStatusEnum = {
|
|
|
971
979
|
NOT_REQUIRED: "NOT_REQUIRED"
|
|
972
980
|
};
|
|
973
981
|
var PAYMENT_STATUS_VALUES = Object.values(PaymentStatusEnum);
|
|
982
|
+
var AWAITING_PAYMENT_STATUSES = [
|
|
983
|
+
PaymentStatusEnum.INITIATED,
|
|
984
|
+
PaymentStatusEnum.PENDING,
|
|
985
|
+
PaymentStatusEnum.PROCESSING,
|
|
986
|
+
PaymentStatusEnum.PENDING_CAPTURE,
|
|
987
|
+
PaymentStatusEnum.REDIRECTED_TO_GATEWAY,
|
|
988
|
+
PaymentStatusEnum.FAILED,
|
|
989
|
+
PaymentStatusEnum.UNKNOWN
|
|
990
|
+
];
|
|
974
991
|
var paymentStatusColorMap = {
|
|
975
992
|
[PaymentStatusEnum.INITIATED]: "default",
|
|
976
993
|
[PaymentStatusEnum.PENDING]: "gold",
|
|
@@ -1045,6 +1062,7 @@ export {
|
|
|
1045
1062
|
ADMIN_RESOURCES,
|
|
1046
1063
|
ADMIN_RESOURCE_LIST,
|
|
1047
1064
|
ALL_STORES,
|
|
1065
|
+
AWAITING_PAYMENT_STATUSES,
|
|
1048
1066
|
CAMPAIGN_RECIPIENT_STATUS_VALUES,
|
|
1049
1067
|
CAMPAIGN_STATUS_VALUES,
|
|
1050
1068
|
CART_STATUS_VALUES,
|
|
@@ -1073,6 +1091,7 @@ export {
|
|
|
1073
1091
|
InventoryPolicyEnum,
|
|
1074
1092
|
NOTIFICATION_TYPE_VALUES,
|
|
1075
1093
|
NotificationTypeEnum,
|
|
1094
|
+
OPEN_ORDER_STATUSES,
|
|
1076
1095
|
ORDER_LOG_TYPE_VALUES,
|
|
1077
1096
|
ORDER_STATUS_VALUES,
|
|
1078
1097
|
OrderLogTypeEnum,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/admin/interface.ts","../src/admin/access.ts","../src/common/objectId.ts","../src/common/validate.ts","../src/coupon/interface.ts","../src/productVariantOptions/interface.ts","../src/addonConfig/interface.ts","../src/addonConfig/resolve.ts","../src/storeFee/interface.ts","../src/emailTemplate/interface.ts","../src/configurator/interface.ts","../src/pricing/index.ts","../src/configurator/evaluate.ts","../src/inventory/interface.ts","../src/saleType/interface.ts","../src/saleType/rules.ts","../src/path/index.ts","../src/order/interface.ts","../src/orderLog/interface.ts","../src/paymentLink/interface.ts","../src/cart/interface.ts","../src/cartItem/stock.ts","../src/subscriber/interface.ts","../src/campaign/interface.ts","../src/stock/interface.ts","../src/transaction/interface.ts","../src/analytics/interface.ts","../src/notification/interface.ts"],"sourcesContent":["import type { BaseEntity } from '../base/interface';\n\nexport const ADMIN_RESOURCE_LIST = [\n { value: 'dashboard', label: 'Dashboard', group: 'Overview' },\n { value: 'metrics', label: 'Metrics', group: 'Overview' },\n { value: 'products', label: 'Products', group: 'Catalog' },\n { value: 'categories', label: 'Categories', group: 'Catalog' },\n { value: 'brands', label: 'Brands', group: 'Catalog' },\n { value: 'technical-specs', label: 'Technical Specs', group: 'Catalog' },\n { value: 'addon-configs', label: 'Addon Configs', group: 'Catalog' },\n { value: 'relation-groups', label: 'Relation Groups', group: 'Catalog' },\n { value: 'configurators', label: 'Configurators', group: 'Catalog' },\n { value: 'orders', label: 'Orders', group: 'Commerce' },\n { value: 'quotes', label: 'Quotes', group: 'Commerce' },\n { value: 'carts', label: 'Carts', group: 'Commerce' },\n { value: 'transactions', label: 'Transactions', group: 'Commerce' },\n { value: 'coupons', label: 'Coupons', group: 'Commerce' },\n { value: 'store-fees', label: 'Store Fees', group: 'Commerce' },\n { value: 'customers', label: 'Customers', group: 'People' },\n { value: 'contact-us', label: 'Contact Requests', group: 'People' },\n { value: 'subscribers', label: 'Subscribers', group: 'People' },\n { value: 'blog', label: 'Blog', group: 'Content' },\n { value: 'faqs', label: 'FAQs', group: 'Content' },\n { value: 'podcast', label: 'Podcast', group: 'Content' },\n { value: 'email-templates', label: 'Email Templates', group: 'Content' },\n { value: 'notifications', label: 'Notifications', group: 'Content' },\n { value: 'campaigns', label: 'Campaigns', group: 'Content' },\n { value: 'stores', label: 'Stores', group: 'Settings' },\n { value: 'currencies', label: 'Currencies', group: 'Settings' },\n { value: 'redirects', label: 'Redirects', group: 'Settings' },\n { value: 'cache', label: 'Cache', group: 'Settings' },\n { value: 'admins', label: 'Admins', group: 'Settings' },\n { value: 'account', label: 'Account', group: 'Settings' },\n] as const;\n\nexport const ADMIN_RESOURCES = ADMIN_RESOURCE_LIST.map((entry) => entry.value);\n\nexport type IAdminResource = (typeof ADMIN_RESOURCE_LIST)[number]['value'];\n\nexport const ADMIN_ACTIONS = ['read', 'write', 'delete'] as const;\n\nexport type IAdminBaseAction = (typeof ADMIN_ACTIONS)[number];\n\nexport const RESOURCE_OPERATIONS: Partial<Record<IAdminResource, readonly string[]>> = {\n products: ['sync'],\n brands: ['sync'],\n categories: ['sync'],\n orders: ['charge'],\n transactions: ['refund'],\n cache: ['purge'],\n};\n\nexport type IAdminAction = IAdminBaseAction | string;\n\nexport const actionsForResource = (resource: IAdminResource): IAdminAction[] => [\n ...ADMIN_ACTIONS,\n ...(RESOURCE_OPERATIONS[resource] ?? []),\n];\n\nexport const isValidAction = (resource: IAdminResource, action: string): boolean =>\n actionsForResource(resource).includes(action);\n\nexport interface IAdminPermission {\n resource: IAdminResource;\n actions: IAdminAction[];\n}\n\nexport interface IAdminStoreAccess {\n store: string;\n role?: string | null;\n extras: IAdminPermission[];\n}\n\nexport interface IAdminRole extends BaseEntity {\n key: string;\n name: string;\n description: string;\n permissions: IAdminPermission[];\n isSuperAdmin: boolean;\n isSystem: boolean;\n}\n\nexport type IAdminRoleCreate = Omit<IAdminRole, keyof BaseEntity>;\nexport interface IAdmin extends BaseEntity {\n firstName: string;\n lastName: string;\n email: string;\n phoneNumber: string;\n status: boolean;\n password: string;\n role: string;\n access_list: string[];\n storeAccess: IAdminStoreAccess[];\n resetPasswordTokenHash?: string;\n resetPasswordTokenExpiresAt?: Date | null;\n joiningDate: Date;\n profileImage: string;\n lastLogin: Date;\n}\n\nexport type IAdminSafe = Omit<IAdmin, 'password'>;\n\nexport const ADMIN_AUDIT_ACTIONS = [\n 'role.create',\n 'role.update',\n 'role.delete',\n 'admin.create',\n 'admin.role',\n 'admin.grants',\n 'admin.status',\n 'admin.delete',\n] as const;\n\nexport type IAdminAuditAction = (typeof ADMIN_AUDIT_ACTIONS)[number];\n\nexport interface IAdminAuditLog extends BaseEntity {\n actor: IAdmin | string;\n actorName: string;\n action: IAdminAuditAction;\n targetAdmin?: IAdmin | string | null;\n targetRole?: IAdminRole | string | null;\n store?: string | null;\n summary: string;\n before?: Record<string, unknown> | null;\n after?: Record<string, unknown> | null;\n}\n","import type {\n IAdminAction,\n IAdminPermission,\n IAdminResource,\n IAdminRole,\n IAdminStoreAccess,\n} from './interface';\n\nexport interface EffectiveAccess {\n isSuperAdmin: boolean;\n permissions: Record<string, string[]>;\n}\n\nexport interface ResolveAccessInput {\n role?: string | null;\n storeAccess?: IAdminStoreAccess[];\n roles: Record<string, Pick<IAdminRole, 'permissions' | 'isSuperAdmin'>>;\n storeId?: string | null;\n}\n\nexport const EMPTY_ACCESS: EffectiveAccess = { isSuperAdmin: false, permissions: {} };\n\nconst addGrant = (into: Map<string, Set<string>>, grants: IAdminPermission[] = []): void => {\n for (const { resource, actions } of grants) {\n const bucket = into.get(resource) ?? new Set<string>();\n for (const action of actions ?? []) bucket.add(action);\n into.set(resource, bucket);\n }\n};\n\nconst idOf = (value: unknown): string => (value == null ? '' : String(value));\n\nconst rowApplies = (row: IAdminStoreAccess, storeId: string | null): boolean => {\n const rowStore = idOf(row.store);\n if (!rowStore || rowStore === '*') return true;\n if (!storeId) return true;\n return rowStore === storeId;\n};\n\nexport const resolveEffectivePermissions = (input: ResolveAccessInput): EffectiveAccess => {\n const { roles, storeAccess = [] } = input;\n const storeId = input.storeId == null ? null : idOf(input.storeId);\n\n const globalRole = input.role ? roles[input.role] : undefined;\n if (globalRole?.isSuperAdmin) {\n return { isSuperAdmin: true, permissions: {} };\n }\n\n const merged = new Map<string, Set<string>>();\n addGrant(merged, globalRole?.permissions);\n\n for (const row of storeAccess) {\n if (!rowApplies(row, storeId)) continue;\n\n const rowRole = row.role ? roles[row.role] : undefined;\n if (rowRole?.isSuperAdmin) {\n return { isSuperAdmin: true, permissions: {} };\n }\n\n addGrant(merged, rowRole?.permissions);\n addGrant(merged, row.extras);\n }\n\n const permissions: Record<string, string[]> = {};\n for (const [resource, actions] of merged) {\n if (actions.size > 0) permissions[resource] = [...actions].sort();\n }\n\n return { isSuperAdmin: false, permissions };\n};\n\nexport const can = (\n access: EffectiveAccess,\n resource: IAdminResource,\n action: IAdminAction\n): boolean => {\n if (access.isSuperAdmin) return true;\n return access.permissions[resource]?.includes(action) === true;\n};\n\nexport const canAny = (access: EffectiveAccess, resource: IAdminResource): boolean => {\n if (access.isSuperAdmin) return true;\n return (access.permissions[resource]?.length ?? 0) > 0;\n};\n\nexport const grantedPermissions = (access: EffectiveAccess): IAdminPermission[] =>\n Object.entries(access.permissions).map(([resource, actions]) => ({\n resource: resource as IAdminResource,\n actions: actions as IAdminAction[],\n }));\n\nexport const missingGrants = (\n actor: EffectiveAccess,\n requested: IAdminPermission[]\n): string[] => {\n if (actor.isSuperAdmin) return [];\n\n const missing: string[] = [];\n for (const { resource, actions } of requested) {\n for (const action of actions ?? []) {\n if (!can(actor, resource, action)) missing.push(`${resource}:${action}`);\n }\n }\n return missing;\n};\n\nexport const ALL_STORES = '*';\n\nexport interface StoreScopeInput {\n role?: string | null;\n storeAccess?: IAdminStoreAccess[];\n roles: Record<string, Pick<IAdminRole, 'permissions' | 'isSuperAdmin'>>;\n}\n\nexport const resolveStoreScope = (input: StoreScopeInput): string[] | null => {\n const { roles, storeAccess = [] } = input;\n\n if (input.role && roles[input.role]?.isSuperAdmin) return null;\n\n const scoped: string[] = [];\n for (const row of storeAccess) {\n const store = idOf(row.store);\n if (!store || store === ALL_STORES) return null;\n scoped.push(store);\n }\n\n return scoped;\n};\n\nexport interface StoreAccessCheckInput extends StoreScopeInput {\n storeId?: string | null;\n}\n\nexport const hasStoreAccess = (input: StoreAccessCheckInput): boolean => {\n const scope = resolveStoreScope(input);\n if (scope === null) return true;\n\n const storeId = idOf(input.storeId);\n if (!storeId) return false;\n\n return scope.includes(storeId);\n};\n","export const toIdString = (value: unknown): string => {\n if (!value) return \"\";\n if (typeof value === \"string\") return value;\n\n if (typeof value === \"object\") {\n const candidate = value as { toHexString?: unknown; _id?: unknown };\n\n if (typeof candidate.toHexString === \"function\") {\n return (candidate.toHexString as () => string)();\n }\n\n if (\"_id\" in candidate && candidate._id !== value) {\n return toIdString(candidate._id);\n }\n }\n\n return String(value);\n};\n","export const isNonEmptyString = (value: unknown): value is string =>\n typeof value === 'string' && value.trim().length > 0;\n\nexport const normalizeNumber = (value: unknown, fallback = 0): number => {\n if (typeof value === 'number') return Number.isFinite(value) ? value : fallback;\n if (typeof value === 'string' && value.trim() !== '') {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n }\n return fallback;\n};\n\nexport const isValidEmail = (email: unknown): email is string =>\n typeof email === 'string' && /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email.trim());\n","import type { BaseEntity } from \"../base\";\nimport type { IStore } from \"../store\";\n\nexport const DiscountTypeEnum = {\n PERCENTAGE: \"PERCENTAGE\",\n FIXED: \"FIXED\",\n} as const;\n\nexport type DiscountTypeEnum = (typeof DiscountTypeEnum)[keyof typeof DiscountTypeEnum];\n\nexport interface IDiscountType {\n type: DiscountTypeEnum;\n value: number;\n}\n\nexport interface ICoupon extends BaseEntity {\n title: string;\n couponCode: string;\n startTime: Date;\n endTime: Date;\n discountType: IDiscountType;\n minimumAmount: number;\n isPromotional: boolean;\n status: boolean;\n stores: IStore[];\n}\n","export type VariantOptionMode = \"OPTION_BACKED\" | \"MANUAL\";\n\nexport const ProductVariantTypeEnum = {\n SINGLE: \"SINGLE\",\n OPTION_BACKED: \"OPTION_BACKED\",\n MANUAL: \"MANUAL\",\n} as const;\n\nexport type ProductVariantType = (typeof ProductVariantTypeEnum)[keyof typeof ProductVariantTypeEnum];\n\nexport const PRODUCT_VARIANT_TYPE_VALUES = Object.values(ProductVariantTypeEnum);\n\nexport interface IProductVariantOptionValue {\n id?: string;\n valueKey: string;\n label: string;\n sortOrder: number;\n}\n\nexport interface IProductVariantOptionGroup {\n id?: string;\n optionKey: string;\n name: string;\n sortOrder: number;\n values: IProductVariantOptionValue[];\n}\n\nexport interface IProductVariantOptionMatrix {\n groups: IProductVariantOptionGroup[];\n optionSignatures: string[];\n}\n\nexport interface IVariantOptionSelection {\n id?: string;\n group?: string;\n value?: string;\n optionKey: string;\n optionName: string;\n valueKey: string;\n valueLabel: string;\n sortOrder: number;\n}\n\n","import type { BaseEntity } from \"../base\";\nimport type { IStore } from \"../store\";\n\nexport const PricingTypeEnum = {\n PERCENTAGE: \"PERCENTAGE\",\n FIXED: \"FIXED\",\n} as const;\n\nexport type PricingType = (typeof PricingTypeEnum)[keyof typeof PricingTypeEnum];\nexport const PRICING_TYPE_VALUES = Object.values(PricingTypeEnum);\n\nexport interface IAddonConfig extends BaseEntity {\n name: string;\n key: string;\n description: string;\n stores: (IStore | string)[];\n price: number;\n pricingType: PricingType;\n quantity: number;\n sortOrder: number;\n applyToAll: boolean;\n isDefault: boolean;\n isVisible: boolean;\n status: boolean;\n}\n\nexport interface IAddonGroup extends BaseEntity {\n name: string;\n key: string;\n description: string;\n addons: IAddonConfig[];\n sortOrder: number;\n isVisible: boolean;\n status: boolean;\n}\n","import type { IStore } from \"../store\";\nimport type { IAddonConfig, IAddonGroup } from \"./interface\";\n\nexport interface ProductAddonScope {\n storeId?: string;\n productAddonIds?: string[];\n}\n\nconst idOf = (value: unknown): string => {\n if (!value) return \"\";\n if (typeof value === \"string\") return value;\n const record = value as { _id?: unknown };\n return String(record._id ?? value);\n};\n\nconst isLive = (entity: { status?: boolean; isVisible?: boolean }): boolean =>\n entity.status !== false && entity.isVisible !== false;\n\nconst appliesToStore = (stores: (IStore | string)[] | undefined, storeId: string | undefined): boolean => {\n const list = stores ?? [];\n return list.length === 0 || (!!storeId && list.some((store) => idOf(store) === storeId));\n};\n\nconst appliesToProduct = (addon: IAddonConfig, attachedIds: string[]): boolean =>\n addon.applyToAll !== false || attachedIds.includes(idOf(addon._id));\n\nexport const resolveProductAddonGroups = (\n groups: IAddonGroup[],\n scope: ProductAddonScope = {},\n): IAddonGroup[] => {\n const addonIds = scope.productAddonIds ?? [];\n\n return groups\n .filter(isLive)\n .map((group) => ({\n ...group,\n addons: (group.addons ?? []).filter((addon: IAddonConfig) => (\n isLive(addon)\n && appliesToStore(addon.stores, scope.storeId)\n && appliesToProduct(addon, addonIds)\n )),\n }))\n .filter((group) => group.addons.length > 0);\n};\n\nexport const groupHasDefaultAddon = (group: IAddonGroup): boolean =>\n (group.addons ?? []).some((addon) => addon.isDefault && isLive(addon));\n\nexport interface AddonSelectionRef {\n groupKey: string;\n addonKey: string;\n}\n\nexport interface ResolvedAddonSelection extends AddonSelectionRef {\n addon: IAddonConfig;\n}\n\nexport const resolveAddonSelections = (\n groups: IAddonGroup[],\n selections: AddonSelectionRef[],\n): ResolvedAddonSelection[] => {\n const allowed = new Map<string, IAddonConfig>();\n const pickOne = new Set<string>();\n\n for (const group of groups) {\n if (groupHasDefaultAddon(group)) pickOne.add(group.key);\n for (const addon of group.addons ?? []) {\n allowed.set(`${group.key}:${addon.key}`, addon);\n }\n }\n\n const seen = new Set<string>();\n const filled = new Set<string>();\n const resolved: ResolvedAddonSelection[] = [];\n\n for (const selection of selections) {\n if (typeof selection?.groupKey !== \"string\" || typeof selection?.addonKey !== \"string\") continue;\n\n const pair = `${selection.groupKey}:${selection.addonKey}`;\n if (seen.has(pair)) continue;\n\n const addon = allowed.get(pair);\n if (!addon) continue;\n\n if (pickOne.has(selection.groupKey) && filled.has(selection.groupKey)) continue;\n\n seen.add(pair);\n filled.add(selection.groupKey);\n resolved.push({ groupKey: selection.groupKey, addonKey: selection.addonKey, addon });\n }\n\n return resolved;\n};\n","import type { BaseEntity } from \"../base\";\nimport type { PricingType } from \"../addonConfig\";\nimport type { IStore } from \"../store\";\n\nexport const FeeAppliesToEnum = {\n SUBTOTAL: \"SUBTOTAL\",\n TOTAL: \"TOTAL\",\n} as const;\n\nexport type FeeAppliesToEnum = (typeof FeeAppliesToEnum)[keyof typeof FeeAppliesToEnum];\nexport const FEE_APPLIES_TO_VALUES = Object.values(FeeAppliesToEnum);\n\nexport interface IStoreFee extends BaseEntity {\n stores: (IStore | string)[];\n name: string;\n key: string;\n description?: string;\n pricingType: PricingType;\n value: number;\n appliesTo: FeeAppliesToEnum;\n enabled: boolean;\n isVisible: boolean;\n optional: boolean;\n defaultSelected: boolean;\n sortOrder: number;\n status: boolean;\n}\n\nexport interface ISelectableFee {\n key: string;\n name: string;\n description?: string;\n pricingType: PricingType;\n value: number;\n appliesTo: FeeAppliesToEnum;\n optional: boolean;\n selected: boolean;\n amount: number;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { IStore } from \"../store\";\n\nexport const EmailTemplateEventEnum = {\n ORDER_RECEIVED: \"ORDER_RECEIVED\",\n ORDER_CANCELLED: \"ORDER_CANCELLED\",\n WELCOME: \"WELCOME\",\n PASSWORD_RESET: \"PASSWORD_RESET\",\n QUOTE: \"QUOTE\",\n QUOTE_REQUESTED: \"QUOTE_REQUESTED\",\n QUOTE_SENT: \"QUOTE_SENT\",\n QUOTE_DECLINED: \"QUOTE_DECLINED\",\n INVOICE: \"INVOICE\",\n PROMOTIONAL: \"PROMOTIONAL\",\n CONTACT_US: \"CONTACT_US\",\n NOTIFICATION: \"NOTIFICATION\",\n} as const;\n\nexport type EmailTemplateEventEnum = (typeof EmailTemplateEventEnum)[keyof typeof EmailTemplateEventEnum];\nexport const EMAIL_TEMPLATE_EVENT_VALUES = Object.values(EmailTemplateEventEnum);\n\nexport const WIRED_EMAIL_TEMPLATE_EVENTS: EmailTemplateEventEnum[] = [\n EmailTemplateEventEnum.ORDER_RECEIVED,\n EmailTemplateEventEnum.ORDER_CANCELLED,\n EmailTemplateEventEnum.QUOTE,\n EmailTemplateEventEnum.QUOTE_REQUESTED,\n EmailTemplateEventEnum.QUOTE_SENT,\n EmailTemplateEventEnum.QUOTE_DECLINED,\n EmailTemplateEventEnum.INVOICE,\n EmailTemplateEventEnum.WELCOME,\n EmailTemplateEventEnum.PASSWORD_RESET,\n EmailTemplateEventEnum.CONTACT_US,\n EmailTemplateEventEnum.NOTIFICATION,\n EmailTemplateEventEnum.PROMOTIONAL,\n];\n\nexport const EMAIL_TEMPLATE_VARIABLES_BY_EVENT: Partial<Record<EmailTemplateEventEnum, string[]>> = {\n [EmailTemplateEventEnum.ORDER_RECEIVED]: [\n \"customerName\", \"orderId\", \"orderDate\", \"itemsHtml\", \"subtotal\", \"shippingHandling\",\n \"estimatedTax\", \"grandTotal\", \"shippingAddress\", \"billingAddress\", \"shippingMethod\",\n \"paymentMethod\",\n ],\n [EmailTemplateEventEnum.ORDER_CANCELLED]: [\"customerName\", \"orderId\", \"reason\", \"refundAmount\"],\n [EmailTemplateEventEnum.QUOTE]: [\n \"customerName\", \"itemCount\", \"savedDate\", \"itemsHtml\", \"subtotal\", \"discount\", \"grandTotal\", \"quoteLink\",\n ],\n [EmailTemplateEventEnum.WELCOME]: [\"name\", \"appName\", \"ctaLabel\", \"ctaUrl\"],\n [EmailTemplateEventEnum.PASSWORD_RESET]: [\"name\", \"resetUrl\", \"expiryLabel\"],\n [EmailTemplateEventEnum.CONTACT_US]: [\"customerName\", \"caseNumber\", \"department\", \"subjectSummary\"],\n [EmailTemplateEventEnum.INVOICE]: [\n \"customerName\", \"orderId\", \"orderDate\", \"itemsHtml\", \"subtotal\", \"shippingHandling\",\n \"estimatedTax\", \"grandTotal\", \"amountDue\", \"shippingAddress\", \"billingAddress\", \"paymentLink\",\n ],\n [EmailTemplateEventEnum.QUOTE_REQUESTED]: [\n \"customerName\", \"quoteId\", \"requestDate\", \"itemCount\", \"customerNote\", \"itemsHtml\", \"shippingAddress\",\n ],\n [EmailTemplateEventEnum.QUOTE_SENT]: [\n \"customerName\", \"quoteId\", \"quoteDate\", \"itemsHtml\", \"subtotal\", \"shipping\", \"discount\",\n \"estimatedTax\", \"feesHtml\", \"grandTotal\", \"validUntil\", \"shippingAddress\", \"customerNote\",\n ],\n [EmailTemplateEventEnum.QUOTE_DECLINED]: [\"customerName\", \"quoteId\", \"reason\"],\n [EmailTemplateEventEnum.NOTIFICATION]: [\"recipientName\", \"title\", \"message\", \"ctaLabel\", \"ctaUrl\"],\n [EmailTemplateEventEnum.PROMOTIONAL]: [\"recipientName\", \"headline\", \"body\", \"ctaLabel\", \"ctaUrl\", \"unsubscribeUrl\"],\n};\n\nexport interface IEmailTemplate extends BaseEntity {\n stores: (IStore | string)[];\n name: string;\n key: string;\n event: EmailTemplateEventEnum;\n subject: string;\n headerHtml: string;\n bodyHtml: string;\n footerHtml: string;\n variables: string[];\n isVisible: boolean;\n status: boolean;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { PricingType } from \"../addonConfig\";\nimport type { IStore } from \"../store\";\n\nexport const ConfiguratorSelectModeEnum = {\n SINGLE: \"SINGLE\",\n MULTI: \"MULTI\",\n} as const;\n\nexport type ConfiguratorSelectModeEnum =\n (typeof ConfiguratorSelectModeEnum)[keyof typeof ConfiguratorSelectModeEnum];\nexport const CONFIGURATOR_SELECT_MODE_VALUES = Object.values(ConfiguratorSelectModeEnum);\n\nexport const ConfiguratorSourceEnum = {\n PICKED: \"PICKED\",\n QUERY: \"QUERY\",\n} as const;\n\nexport type ConfiguratorSourceEnum =\n (typeof ConfiguratorSourceEnum)[keyof typeof ConfiguratorSourceEnum];\nexport const CONFIGURATOR_SOURCE_VALUES = Object.values(ConfiguratorSourceEnum);\n\nexport const ConfiguratorConditionTypeEnum = {\n SELECTED: \"SELECTED\",\n ALL: \"ALL\",\n ANY: \"ANY\",\n NOT: \"NOT\",\n} as const;\n\nexport type ConfiguratorConditionTypeEnum =\n (typeof ConfiguratorConditionTypeEnum)[keyof typeof ConfiguratorConditionTypeEnum];\nexport const CONFIGURATOR_CONDITION_TYPE_VALUES = Object.values(ConfiguratorConditionTypeEnum);\n\nexport const ConfiguratorEffectTypeEnum = {\n SHOW: \"SHOW\",\n HIDE: \"HIDE\",\n REQUIRE: \"REQUIRE\",\n OPTIONAL: \"OPTIONAL\",\n SELECT: \"SELECT\",\n DESELECT: \"DESELECT\",\n PRICE_ADJUST: \"PRICE_ADJUST\",\n} as const;\n\nexport type ConfiguratorEffectTypeEnum =\n (typeof ConfiguratorEffectTypeEnum)[keyof typeof ConfiguratorEffectTypeEnum];\nexport const CONFIGURATOR_EFFECT_TYPE_VALUES = Object.values(ConfiguratorEffectTypeEnum);\n\nexport const ConfiguratorErrorCodeEnum = {\n REQUIRED_SECTION_EMPTY: \"REQUIRED_SECTION_EMPTY\",\n OPTION_NOT_AVAILABLE: \"OPTION_NOT_AVAILABLE\",\n SECTION_NOT_AVAILABLE: \"SECTION_NOT_AVAILABLE\",\n UNKNOWN_SECTION: \"UNKNOWN_SECTION\",\n SINGLE_SELECT_OVERFILLED: \"SINGLE_SELECT_OVERFILLED\",\n RULES_UNSTABLE: \"RULES_UNSTABLE\",\n} as const;\n\nexport type ConfiguratorErrorCodeEnum =\n (typeof ConfiguratorErrorCodeEnum)[keyof typeof ConfiguratorErrorCodeEnum];\nexport interface IConfiguratorQuery {\n search?: string;\n categories?: string[];\n brands?: string[];\n types?: string[];\n minPrice?: number;\n maxPrice?: number;\n inStock?: boolean;\n limit?: number;\n}\n\nexport interface IConfiguratorFacetValue {\n key: string;\n label: string;\n tags?: string[];\n query?: IConfiguratorQuery;\n isDefault?: boolean;\n}\n\nexport interface IConfiguratorFacet {\n key: string;\n label: string;\n values: IConfiguratorFacetValue[];\n}\n\nexport interface IConfiguratorOption {\n key: string;\n sku: string;\n tags?: string[];\n sortOrder?: number;\n}\n\nexport interface IConfiguratorSection {\n key: string;\n title: string;\n description?: string;\n selectMode: ConfiguratorSelectModeEnum;\n required: boolean;\n source: ConfiguratorSourceEnum;\n options?: IConfiguratorOption[];\n query?: IConfiguratorQuery;\n facets?: IConfiguratorFacet[];\n contentHtml?: string;\n sortOrder?: number;\n}\n\nexport interface IConfiguratorStep {\n key: string;\n title: string;\n description?: string;\n sections: IConfiguratorSection[];\n sortOrder?: number;\n}\n\nexport interface IConfiguratorTarget {\n sectionKey: string;\n optionKey?: string;\n tag?: string;\n}\n\nexport type IConfiguratorCondition =\n | {\n type: typeof ConfiguratorConditionTypeEnum.SELECTED;\n sectionKey: string;\n optionKeys?: string[];\n }\n | {\n type: typeof ConfiguratorConditionTypeEnum.ALL | typeof ConfiguratorConditionTypeEnum.ANY;\n conditions: IConfiguratorCondition[];\n }\n | {\n type: typeof ConfiguratorConditionTypeEnum.NOT;\n condition: IConfiguratorCondition;\n };\n\nexport interface IConfiguratorEffect {\n type: ConfiguratorEffectTypeEnum;\n target: IConfiguratorTarget;\n mode?: PricingType;\n amount?: number;\n}\n\nexport interface IConfiguratorPriceAdjustment {\n sectionKey: string;\n optionKey?: string;\n mode: PricingType;\n amount: number;\n}\n\nexport interface IConfiguratorRule {\n key: string;\n description?: string;\n when: IConfiguratorCondition;\n then: IConfiguratorEffect[];\n}\n\nexport interface IConfigurator extends BaseEntity {\n name: string;\n key: string;\n description: string;\n images?: string[];\n stores: (IStore | string)[];\n steps: IConfiguratorStep[];\n rules: IConfiguratorRule[];\n sortOrder: number;\n isVisible: boolean;\n status: boolean;\n}\n\nexport type ConfiguratorSelections = Record<string, string[]>;\n","import { PricingTypeEnum, type PricingType } from \"../addonConfig\";\nimport { FeeAppliesToEnum } from \"../storeFee\";\nimport type { IAppliedFee } from \"../common\";\n\nexport const roundMoney = (amount: number): number => {\n if (!Number.isFinite(amount)) return 0;\n return Math.round((amount + Number.EPSILON) * 100) / 100;\n};\n\nconst moneyFormatters = new Map<string, Intl.NumberFormat>();\n\nconst moneyFormatter = (currencyCode: string): Intl.NumberFormat => {\n let formatter = moneyFormatters.get(currencyCode);\n if (!formatter) {\n formatter = new Intl.NumberFormat(\"en-US\", { style: \"currency\", currency: currencyCode });\n moneyFormatters.set(currencyCode, formatter);\n }\n return formatter;\n};\n\nexport const formatMoney = (value: number, currencyCode: string = \"USD\"): string =>\n moneyFormatter(currencyCode).format(value ?? 0);\n\nexport const normalizeLineQuantity = (quantity: number): number =>\n Math.max(1, Math.floor(Number(quantity)) || 1);\n\nexport interface AddonAmountInput {\n price: number;\n pricingType: PricingType;\n quantity: number;\n}\n\nexport const addonUnitAmount = (addon: AddonAmountInput, baseUnitPrice: number): number => {\n const value = Number.isFinite(addon.price) ? addon.price : 0;\n const quantity = Number.isFinite(addon.quantity) ? addon.quantity : 1;\n const amount = addon.pricingType === PricingTypeEnum.PERCENTAGE ? baseUnitPrice * (value / 100) : value;\n return roundMoney(amount * quantity);\n};\n\nexport const addonsUnitAmount = (addons: AddonAmountInput[], baseUnitPrice: number): number =>\n roundMoney(addons.reduce((sum, addon) => sum + addonUnitAmount(addon, baseUnitPrice), 0));\n\nexport interface PricedLineLike {\n pricing?: { baseUnitPrice?: number; unitPrice?: number };\n metaData?: unknown;\n}\n\nexport const addonsOfLine = (line: PricedLineLike): AddonAmountInput[] => {\n const raw = (line.metaData as { addons?: unknown } | undefined)?.addons;\n if (!Array.isArray(raw)) return [];\n return (raw as { price?: number; pricingType?: PricingType; quantity?: number }[]).map((addon) => ({\n price: Number(addon.price ?? 0),\n pricingType: addon.pricingType === PricingTypeEnum.PERCENTAGE ? PricingTypeEnum.PERCENTAGE : PricingTypeEnum.FIXED,\n quantity: Number(addon.quantity ?? 1),\n }));\n};\n\nexport const baseUnitPriceOfLine = (line: PricedLineLike): number | null => {\n const stored = line.pricing?.baseUnitPrice;\n if (typeof stored === \"number\") return stored;\n return addonsOfLine(line).length === 0 ? line.pricing?.unitPrice ?? 0 : null;\n};\n\nexport const feeHint = (fee: IAppliedFee): string => {\n const basis = fee.pricingType === PricingTypeEnum.PERCENTAGE && fee.value != null\n ? `${fee.value}% of ${fee.appliesTo === FeeAppliesToEnum.TOTAL ? \"order total\" : \"subtotal\"}`\n : \"Flat fee\";\n return fee.description ? `${basis} — ${fee.description}` : basis;\n};\n","import { roundMoney } from \"../pricing\";\nimport { PricingTypeEnum } from \"../addonConfig\";\nimport {\n ConfiguratorConditionTypeEnum,\n ConfiguratorEffectTypeEnum,\n ConfiguratorErrorCodeEnum,\n ConfiguratorSelectModeEnum,\n type ConfiguratorSelections,\n type IConfigurator,\n type IConfiguratorCondition,\n type IConfiguratorPriceAdjustment,\n type IConfiguratorSection,\n} from \"./interface\";\n\nexport interface ConfiguratorEvalContext {\n optionKeysBySection?: Record<string, string[]>;\n}\n\nexport interface ConfiguratorEvalError {\n code: ConfiguratorErrorCodeEnum;\n sectionKey: string;\n optionKey?: string;\n}\n\nexport interface ConfiguratorEvalResult {\n selections: ConfiguratorSelections;\n hiddenSections: string[];\n hiddenOptions: string[];\n requiredSections: string[];\n errors: ConfiguratorEvalError[];\n priceAdjustments: IConfiguratorPriceAdjustment[];\n stable: boolean;\n hiddenBy: Record<string, string>;\n selectedBy: Record<string, string>;\n}\n\nconst MAX_PASSES = 10;\n\nconst optionId = (sectionKey: string, optionKey: string): string => `${sectionKey}:${optionKey}`;\n\nconst targetOptionKeys = (\n target: { optionKey?: string; tag?: string } | undefined,\n section: IConfiguratorSection,\n): string[] => {\n if (target?.optionKey) return [target.optionKey];\n if (!target?.tag) return [];\n return (section.options ?? [])\n .filter((option) => (option.tags ?? []).includes(target.tag as string))\n .map((option) => option.key);\n};\n\nconst collectSections = (config: IConfigurator): Map<string, IConfiguratorSection> => {\n const sections = new Map<string, IConfiguratorSection>();\n for (const step of config.steps ?? []) {\n for (const section of step.sections ?? []) {\n if (section?.key) sections.set(section.key, section);\n }\n }\n return sections;\n};\n\nconst collectOptionKeys = (\n sections: Map<string, IConfiguratorSection>,\n override: Record<string, string[]> | undefined,\n): Map<string, Set<string> | null> => {\n const universe = new Map<string, Set<string> | null>();\n for (const [key, section] of sections) {\n const supplied = override?.[key];\n if (supplied) {\n universe.set(key, new Set(supplied));\n } else if (section.options?.length) {\n universe.set(key, new Set(section.options.map((option) => option.key)));\n } else {\n universe.set(key, null);\n }\n }\n return universe;\n};\n\nexport const conditionHolds = (\n condition: IConfiguratorCondition | undefined,\n selections: ConfiguratorSelections,\n): boolean => {\n if (!condition) return false;\n\n switch (condition.type) {\n case ConfiguratorConditionTypeEnum.SELECTED: {\n const chosen = selections[condition.sectionKey] ?? [];\n const wanted = condition.optionKeys ?? [];\n if (wanted.length === 0) return chosen.length > 0;\n return wanted.some((key) => chosen.includes(key));\n }\n case ConfiguratorConditionTypeEnum.ALL:\n return (condition.conditions ?? []).every((child) => conditionHolds(child, selections));\n case ConfiguratorConditionTypeEnum.ANY:\n return (condition.conditions ?? []).some((child) => conditionHolds(child, selections));\n case ConfiguratorConditionTypeEnum.NOT:\n return !conditionHolds(condition.condition, selections);\n default:\n return false;\n }\n};\n\nconst sameSelections = (a: ConfiguratorSelections, b: ConfiguratorSelections): boolean => {\n const keys = new Set([...Object.keys(a), ...Object.keys(b)]);\n for (const key of keys) {\n const left = a[key] ?? [];\n const right = b[key] ?? [];\n if (left.length !== right.length) return false;\n if (left.some((value, index) => value !== right[index])) return false;\n }\n return true;\n};\n\nconst sameSet = (a: Set<string>, b: Set<string>): boolean =>\n a.size === b.size && [...a].every((value) => b.has(value));\n\nexport const evaluateConfigurator = (\n config: IConfigurator,\n selections: ConfiguratorSelections,\n context: ConfiguratorEvalContext = {},\n): ConfiguratorEvalResult => {\n const sections = collectSections(config);\n const universe = collectOptionKeys(sections, context.optionKeysBySection);\n const rules = config.rules ?? [];\n\n let current: ConfiguratorSelections = {};\n for (const [sectionKey, chosen] of Object.entries(selections ?? {})) {\n current[sectionKey] = [...(chosen ?? [])];\n }\n\n let hiddenSections = new Set<string>();\n let hiddenOptions = new Set<string>();\n let requiredSections = new Set<string>();\n let errors: ConfiguratorEvalError[] = [];\n let stable = false;\n\n for (let pass = 0; pass < MAX_PASSES; pass++) {\n const nextHiddenSections = new Set<string>();\n const nextHiddenOptions = new Set<string>();\n const nextRequired = new Set<string>();\n for (const [key, section] of sections) {\n if (section.required) nextRequired.add(key);\n }\n\n const working: ConfiguratorSelections = {};\n for (const [sectionKey, chosen] of Object.entries(current)) {\n working[sectionKey] = [...chosen];\n }\n\n for (const rule of rules) {\n if (!conditionHolds(rule?.when, current)) continue;\n\n for (const effect of rule.then ?? []) {\n const sectionKey = effect?.target?.sectionKey;\n if (!sectionKey || !sections.has(sectionKey)) continue;\n const section = sections.get(sectionKey) as IConfiguratorSection;\n const targeted = targetOptionKeys(effect.target, section);\n const optionKey = targeted[0];\n\n switch (effect.type) {\n case ConfiguratorEffectTypeEnum.HIDE:\n if (effect.target.tag && targeted.length === 0) break;\n if (targeted.length) {\n for (const key of targeted) nextHiddenOptions.add(optionId(sectionKey, key));\n } else nextHiddenSections.add(sectionKey);\n break;\n case ConfiguratorEffectTypeEnum.SHOW:\n if (effect.target.tag && targeted.length === 0) break;\n if (targeted.length) {\n for (const key of targeted) nextHiddenOptions.delete(optionId(sectionKey, key));\n } else nextHiddenSections.delete(sectionKey);\n break;\n case ConfiguratorEffectTypeEnum.REQUIRE:\n nextRequired.add(sectionKey);\n break;\n case ConfiguratorEffectTypeEnum.OPTIONAL:\n nextRequired.delete(sectionKey);\n break;\n case ConfiguratorEffectTypeEnum.SELECT: {\n if (!optionKey) break;\n if (section.selectMode === ConfiguratorSelectModeEnum.SINGLE) {\n working[sectionKey] = [optionKey];\n break;\n }\n const chosen = working[sectionKey] ?? [];\n const added = targeted.filter((key) => !chosen.includes(key));\n if (added.length) working[sectionKey] = [...chosen, ...added];\n break;\n }\n case ConfiguratorEffectTypeEnum.PRICE_ADJUST:\n break;\n case ConfiguratorEffectTypeEnum.DESELECT: {\n if (!targeted.length) break;\n working[sectionKey] = (working[sectionKey] ?? []).filter((key) => !targeted.includes(key));\n break;\n }\n default:\n break;\n }\n }\n }\n\n const pruned: ConfiguratorSelections = {};\n\n for (const [sectionKey, chosen] of Object.entries(working)) {\n const section = sections.get(sectionKey);\n if (!section) continue;\n\n if (nextHiddenSections.has(sectionKey)) {\n pruned[sectionKey] = [];\n continue;\n }\n\n const known = universe.get(sectionKey) ?? null;\n const kept = chosen.filter((optionKey) => (\n (known === null || known.has(optionKey))\n && !nextHiddenOptions.has(optionId(sectionKey, optionKey))\n ));\n\n pruned[sectionKey] = section.selectMode === ConfiguratorSelectModeEnum.SINGLE && kept.length > 1\n ? kept.slice(-1)\n : kept;\n }\n\n const settled =\n sameSelections(pruned, current)\n && sameSet(nextHiddenSections, hiddenSections)\n && sameSet(nextHiddenOptions, hiddenOptions)\n && sameSet(nextRequired, requiredSections)\n && pass > 0;\n\n current = pruned;\n hiddenSections = nextHiddenSections;\n hiddenOptions = nextHiddenOptions;\n requiredSections = nextRequired;\n\n if (settled) {\n stable = true;\n break;\n }\n }\n\n if (!stable) {\n errors.push({ code: ConfiguratorErrorCodeEnum.RULES_UNSTABLE, sectionKey: \"\" });\n }\n\n for (const [sectionKey, chosen] of Object.entries(selections ?? {})) {\n const submitted = chosen ?? [];\n if (submitted.length === 0) continue;\n\n const section = sections.get(sectionKey);\n if (!section) {\n errors.push({ code: ConfiguratorErrorCodeEnum.UNKNOWN_SECTION, sectionKey });\n continue;\n }\n\n if (hiddenSections.has(sectionKey)) {\n for (const optionKey of submitted) {\n errors.push({ code: ConfiguratorErrorCodeEnum.SECTION_NOT_AVAILABLE, sectionKey, optionKey });\n }\n continue;\n }\n\n const known = universe.get(sectionKey) ?? null;\n const survivors = current[sectionKey] ?? [];\n const overfilled = section.selectMode === ConfiguratorSelectModeEnum.SINGLE && submitted.length > 1;\n\n for (const optionKey of submitted) {\n if (known !== null && !known.has(optionKey)) {\n errors.push({ code: ConfiguratorErrorCodeEnum.OPTION_NOT_AVAILABLE, sectionKey, optionKey });\n } else if (hiddenOptions.has(optionId(sectionKey, optionKey))) {\n errors.push({ code: ConfiguratorErrorCodeEnum.OPTION_NOT_AVAILABLE, sectionKey, optionKey });\n } else if (overfilled && !survivors.includes(optionKey)) {\n errors.push({ code: ConfiguratorErrorCodeEnum.SINGLE_SELECT_OVERFILLED, sectionKey, optionKey });\n }\n }\n }\n\n const priceAdjustments: IConfiguratorPriceAdjustment[] = [];\n for (const rule of rules) {\n if (!conditionHolds(rule?.when, current)) continue;\n for (const effect of rule.then ?? []) {\n if (effect?.type !== ConfiguratorEffectTypeEnum.PRICE_ADJUST) continue;\n\n const sectionKey = effect.target?.sectionKey;\n const amount = Number(effect.amount);\n if (!sectionKey || !sections.has(sectionKey) || !Number.isFinite(amount) || amount === 0) continue;\n if (hiddenSections.has(sectionKey)) continue;\n\n const section = sections.get(sectionKey) as IConfiguratorSection;\n const targeted = targetOptionKeys(effect.target, section);\n const chosen = current[sectionKey] ?? [];\n const mode = effect.mode === PricingTypeEnum.PERCENTAGE ? PricingTypeEnum.PERCENTAGE : PricingTypeEnum.FIXED;\n\n if (targeted.length) {\n for (const optionKey of targeted) {\n if (!chosen.includes(optionKey)) continue;\n priceAdjustments.push({ sectionKey, optionKey, mode, amount });\n }\n continue;\n }\n if (effect.target.tag || chosen.length === 0) continue;\n\n priceAdjustments.push({ sectionKey, mode, amount });\n }\n }\n\n const hiddenBy: Record<string, string> = {};\n const selectedBy: Record<string, string> = {};\n for (const rule of rules) {\n if (!conditionHolds(rule?.when, current)) continue;\n for (const effect of rule.then ?? []) {\n const sectionKey = effect?.target?.sectionKey;\n if (!sectionKey || !sections.has(sectionKey)) continue;\n if (effect.type !== ConfiguratorEffectTypeEnum.HIDE && effect.type !== ConfiguratorEffectTypeEnum.SELECT) continue;\n\n const section = sections.get(sectionKey) as IConfiguratorSection;\n const targeted = targetOptionKeys(effect.target, section);\n const note = rule.description?.trim()\n || (effect.type === ConfiguratorEffectTypeEnum.HIDE\n ? \"Not compatible with your current build.\"\n : \"Included with your build.\");\n const into = effect.type === ConfiguratorEffectTypeEnum.HIDE ? hiddenBy : selectedBy;\n\n if (targeted.length === 0) {\n if (!effect.target.tag && effect.type === ConfiguratorEffectTypeEnum.HIDE) into[sectionKey] = note;\n continue;\n }\n for (const optionKey of targeted) into[optionId(sectionKey, optionKey)] = note;\n }\n }\n\n for (const sectionKey of requiredSections) {\n if (hiddenSections.has(sectionKey)) continue;\n if ((current[sectionKey] ?? []).length === 0) {\n errors.push({ code: ConfiguratorErrorCodeEnum.REQUIRED_SECTION_EMPTY, sectionKey });\n }\n }\n\n return {\n selections: current,\n hiddenSections: [...hiddenSections],\n hiddenOptions: [...hiddenOptions],\n requiredSections: [...requiredSections],\n errors,\n priceAdjustments,\n stable,\n hiddenBy,\n selectedBy,\n };\n};\n\nexport const applyPriceAdjustments = (\n baseUnitPrice: number,\n adjustments: IConfiguratorPriceAdjustment[],\n): number => {\n if (adjustments.length === 0) return roundMoney(baseUnitPrice);\n\n let delta = 0;\n for (const adjustment of adjustments) {\n delta += adjustment.mode === PricingTypeEnum.PERCENTAGE\n ? (baseUnitPrice * adjustment.amount) / 100\n : adjustment.amount;\n }\n return roundMoney(Math.max(0, baseUnitPrice + delta));\n};\n\nexport const adjustmentsFor = (\n adjustments: IConfiguratorPriceAdjustment[],\n sectionKey: string,\n optionKey: string,\n): IConfiguratorPriceAdjustment[] =>\n adjustments.filter((adjustment) => (\n adjustment.sectionKey === sectionKey\n && (!adjustment.optionKey || adjustment.optionKey === optionKey)\n ));\n\nexport const isConfigurationValid = (result: ConfiguratorEvalResult): boolean =>\n result.stable && result.errors.length === 0;\n","export const InventoryPolicyEnum = {\n DENY: \"deny\",\n CONTINUE: \"continue\",\n} as const;\n\nexport type InventoryPolicy = (typeof InventoryPolicyEnum)[keyof typeof InventoryPolicyEnum];\n\nexport const INVENTORY_POLICY_VALUES: InventoryPolicy[] = Object.values(InventoryPolicyEnum);\n","export const SaleTypeEnum = {\n DIRECT: \"DIRECT\",\n QUOTE: \"QUOTE\",\n} as const;\n\nexport type SaleType = (typeof SaleTypeEnum)[keyof typeof SaleTypeEnum];\n\nexport const SALE_TYPE_VALUES: SaleType[] = Object.values(SaleTypeEnum);\n","import { SaleTypeEnum, type SaleType } from \"./interface\";\n\nexport interface SaleTypedLike {\n saleType?: SaleType;\n metaData?: unknown;\n price?: { price?: number } | null;\n}\n\nexport const saleTypeOf = (item: SaleTypedLike | null | undefined): SaleType => {\n if (item?.saleType) return item.saleType;\n const flagged = (item?.metaData as { quoteOnly?: boolean } | undefined)?.quoteOnly === true;\n const price = Number(item?.price?.price ?? 0);\n return flagged || !Number.isFinite(price) || price <= 0 ? SaleTypeEnum.QUOTE : SaleTypeEnum.DIRECT;\n};\n\nexport const isQuoteOnlyItem = (item: SaleTypedLike | null | undefined): boolean =>\n saleTypeOf(item) === SaleTypeEnum.QUOTE;\n","export const normalizePath = (input: string): string => {\n if (!input || typeof input !== \"string\") return \"/\";\n\n let path = input.trim();\n\n if (/^https?:\\/\\//i.test(path)) {\n try {\n path = new URL(path).pathname;\n } catch {\n }\n }\n\n path = path.split(\"?\")[0].split(\"#\")[0];\n\n try {\n path = decodeURIComponent(path);\n } catch {\n }\n\n if (!path.startsWith(\"/\")) path = `/${path}`;\n path = path.replace(/\\/{2,}/g, \"/\").toLowerCase();\n\n if (path.length > 1) path = path.replace(/\\/+$/, \"\");\n\n return path || \"/\";\n};\n\nexport const canonicalizeSlug = (input: string): string => {\n if (!input || typeof input !== \"string\") return \"\";\n return input\n .trim()\n .toLowerCase()\n .replace(/\\s+/g, \"-\")\n .replace(/-{2,}/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n};\n\nexport const canonicalizePath = (input: string): string => {\n if (!input || typeof input !== \"string\") return \"/\";\n\n let path = input.trim();\n\n if (/^https?:\\/\\//i.test(path)) {\n try {\n path = new URL(path).pathname;\n } catch {\n }\n }\n\n path = path.split(\"?\")[0].split(\"#\")[0];\n\n try {\n path = decodeURIComponent(path);\n } catch {\n }\n\n if (!path.startsWith(\"/\")) path = `/${path}`;\n\n const hadTrailingSlash = path.length > 1 && path.endsWith(\"/\");\n\n const segments = path\n .split(\"/\")\n .map((segment) => (segment ? canonicalizeSlug(segment) : segment))\n .filter((segment, index) => segment !== \"\" || index === 0);\n\n let out = segments.join(\"/\") || \"/\";\n if (!out.startsWith(\"/\")) out = `/${out}`;\n if (hadTrailingSlash && out !== \"/\") out += \"/\";\n\n return out;\n};\n","import type { BaseEntity } from \"../base\";\nimport type { IAddress } from \"../address\";\nimport type { ISummaryPricing, Metadata } from \"../common\";\nimport type { ICoupon } from \"../coupon\";\nimport type { ICustomer } from \"../customer\";\nimport type { IOrderItem } from \"../orderItem\";\nimport type { IStore } from \"../store\";\nimport type { IOrderTransaction, IRefundTransaction } from \"../transaction\";\nimport type { PaymentGatewayEnum, PaymentMethodEnum, PaymentStatusEnum } from \"../transaction\";\nimport type { SaleType } from \"../saleType\";\n\nexport const OrderStatusEnum = {\n CREATED: \"CREATED\",\n RECEIVED: \"RECEIVED\",\n PENDING: \"PENDING\",\n CONFIRMED: \"CONFIRMED\",\n PROCESSING: \"PROCESSING\",\n SHIPPED: \"SHIPPED\",\n DELIVERED: \"DELIVERED\",\n CANCELED: \"CANCELED\",\n FAILED: \"FAILED\",\n REFUNDED: \"REFUNDED\",\n PARTIALLY_REFUNDED: \"PARTIALLY_REFUNDED\",\n ARCHIVED: \"ARCHIVED\",\n RETURNED: \"RETURNED\",\n\n QUOTE_REQUESTED: \"QUOTE_REQUESTED\",\n QUOTED: \"QUOTED\",\n QUOTE_ACCEPTED: \"QUOTE_ACCEPTED\",\n QUOTE_DECLINED: \"QUOTE_DECLINED\",\n QUOTE_EXPIRED: \"QUOTE_EXPIRED\",\n} as const;\n\nexport type OrderStatusEnum = (typeof OrderStatusEnum)[keyof typeof OrderStatusEnum];\nexport const ORDER_STATUS_VALUES = Object.values(OrderStatusEnum);\n\nexport const statusColors: Record<OrderStatusEnum, string> = {\n [OrderStatusEnum.CREATED]: \"default\",\n [OrderStatusEnum.RECEIVED]: \"cyan\",\n [OrderStatusEnum.PENDING]: \"gold\",\n [OrderStatusEnum.CONFIRMED]: \"blue\",\n [OrderStatusEnum.PROCESSING]: \"cyan\",\n [OrderStatusEnum.SHIPPED]: \"purple\",\n [OrderStatusEnum.DELIVERED]: \"green\",\n [OrderStatusEnum.CANCELED]: \"volcano\",\n [OrderStatusEnum.FAILED]: \"red\",\n [OrderStatusEnum.REFUNDED]: \"orange\",\n [OrderStatusEnum.PARTIALLY_REFUNDED]: \"magenta\",\n [OrderStatusEnum.ARCHIVED]: \"gray\",\n [OrderStatusEnum.RETURNED]: \"purple\",\n [OrderStatusEnum.QUOTE_REQUESTED]: \"gold\",\n [OrderStatusEnum.QUOTED]: \"blue\",\n [OrderStatusEnum.QUOTE_ACCEPTED]: \"green\",\n [OrderStatusEnum.QUOTE_DECLINED]: \"volcano\",\n [OrderStatusEnum.QUOTE_EXPIRED]: \"gray\",\n};\n\nexport const PURCHASE_ORDER_STATUSES: OrderStatusEnum[] = [\n OrderStatusEnum.CREATED, OrderStatusEnum.RECEIVED, OrderStatusEnum.PENDING,\n OrderStatusEnum.CONFIRMED, OrderStatusEnum.PROCESSING, OrderStatusEnum.SHIPPED,\n OrderStatusEnum.DELIVERED, OrderStatusEnum.CANCELED, OrderStatusEnum.FAILED,\n OrderStatusEnum.REFUNDED, OrderStatusEnum.PARTIALLY_REFUNDED, OrderStatusEnum.ARCHIVED,\n OrderStatusEnum.RETURNED,\n];\n\nexport const QUOTE_ORDER_STATUSES: OrderStatusEnum[] = [\n OrderStatusEnum.QUOTE_REQUESTED, OrderStatusEnum.QUOTED, OrderStatusEnum.QUOTE_ACCEPTED,\n OrderStatusEnum.QUOTE_DECLINED, OrderStatusEnum.QUOTE_EXPIRED, OrderStatusEnum.CANCELED,\n];\n\nexport interface IOrder extends BaseEntity {\n orderId: string;\n orderItems: IOrderItem[];\n customer: ICustomer;\n coupon: ICoupon;\n store: IStore;\n status: OrderStatusEnum;\n type?: SaleType;\n sourceQuote?: IOrder | string;\n convertedOrder?: IOrder | string;\n quoteValidUntil?: Date;\n paymentStatus: PaymentStatusEnum;\n paymentMethod: PaymentMethodEnum;\n paymentGateway: PaymentGatewayEnum;\n shippingAddress: IAddress;\n billingAddress: IAddress;\n shippingMethod: string;\n acceptedTermsAt: Date;\n customerNote: string;\n metaData: Metadata;\n orderTransactions: IOrderTransaction[];\n refundTransactions: IRefundTransaction[];\n pricing: ISummaryPricing;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { Metadata } from \"../common\";\nimport type { IOrder } from \"../order\";\n\nexport const OrderLogTypeEnum = {\n ORDER_PLACED: \"ORDER_PLACED\",\n PAYMENT_PENDING: \"PAYMENT_PENDING\",\n PAYMENT_SUCCEEDED: \"PAYMENT_SUCCEEDED\",\n PAYMENT_FAILED: \"PAYMENT_FAILED\",\n PAYMENT_CANCELLED: \"PAYMENT_CANCELLED\",\n ORDER_STATUS: \"ORDER_STATUS\",\n REFUND: \"REFUND\",\n EMAIL: \"EMAIL\",\n NOTE: \"NOTE\",\n} as const;\n\nexport type OrderLogTypeEnum = (typeof OrderLogTypeEnum)[keyof typeof OrderLogTypeEnum];\nexport const ORDER_LOG_TYPE_VALUES = Object.values(OrderLogTypeEnum);\n\nexport const orderLogTypeColorMap: Record<OrderLogTypeEnum, string> = {\n [OrderLogTypeEnum.ORDER_PLACED]: \"blue\",\n [OrderLogTypeEnum.PAYMENT_PENDING]: \"gold\",\n [OrderLogTypeEnum.PAYMENT_SUCCEEDED]: \"green\",\n [OrderLogTypeEnum.PAYMENT_FAILED]: \"red\",\n [OrderLogTypeEnum.PAYMENT_CANCELLED]: \"volcano\",\n [OrderLogTypeEnum.ORDER_STATUS]: \"cyan\",\n [OrderLogTypeEnum.REFUND]: \"purple\",\n [OrderLogTypeEnum.EMAIL]: \"geekblue\",\n [OrderLogTypeEnum.NOTE]: \"default\",\n};\n\nexport interface IOrderLog extends BaseEntity {\n order: IOrder | string;\n type: OrderLogTypeEnum;\n message: string;\n actor?: string;\n meta?: Metadata;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { IOrder } from \"../order\";\nimport type { PaymentGatewayEnum } from \"../transaction\";\n\nexport const PaymentLinkStatusEnum = {\n PENDING: \"PENDING\",\n PAID: \"PAID\",\n EXPIRED: \"EXPIRED\",\n CANCELLED: \"CANCELLED\",\n} as const;\n\nexport type PaymentLinkStatusEnum = (typeof PaymentLinkStatusEnum)[keyof typeof PaymentLinkStatusEnum];\nexport const PAYMENT_LINK_STATUS_VALUES = Object.values(PaymentLinkStatusEnum);\n\nexport const paymentLinkStatusColorMap: Record<PaymentLinkStatusEnum, string> = {\n [PaymentLinkStatusEnum.PENDING]: \"gold\",\n [PaymentLinkStatusEnum.PAID]: \"green\",\n [PaymentLinkStatusEnum.EXPIRED]: \"default\",\n [PaymentLinkStatusEnum.CANCELLED]: \"volcano\",\n};\n\nexport interface IPaymentLink extends BaseEntity {\n order: IOrder | string;\n token: string;\n amount: number;\n currencyCode: string;\n gateway: PaymentGatewayEnum;\n status: PaymentLinkStatusEnum;\n expiresAt?: string | Date;\n paidAt?: string | Date;\n transaction?: string;\n createdBy?: string;\n baseUrl: string;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { ISummaryPricing, Metadata } from \"../common\";\nimport type { ICoupon } from \"../coupon\";\nimport type { ICustomer } from \"../customer\";\nimport type { IStore } from \"../store\";\nimport type { ICartItem } from \"../cartItem\";\nimport type { IOrder } from \"../order\";\nimport type { IShippingRate } from \"../shipping\";\nimport type { SaleType } from \"../saleType\";\n\n\nexport const CartStatusEnum = {\n ACTIVE: \"ACTIVE\",\n CONVERTED: \"CONVERTED\",\n QUOTED: \"QUOTED\",\n ABANDONED: \"ABANDONED\",\n} as const;\n\nexport type CartStatusEnum = (typeof CartStatusEnum)[keyof typeof CartStatusEnum];\nexport const CART_STATUS_VALUES = Object.values(CartStatusEnum);\nexport const RETIRED_CART_STATUSES: CartStatusEnum[] = [\n CartStatusEnum.CONVERTED,\n CartStatusEnum.QUOTED,\n CartStatusEnum.ABANDONED,\n];\n\n\nexport interface ICart extends BaseEntity {\n cartId: string;\n cartItems: ICartItem[];\n user?: ICustomer;\n coupon?: ICoupon;\n store: IStore;\n metaData: Metadata;\n optionalFees?: Record<string, boolean>;\n pricing: ISummaryPricing;\n selectedShippingRate?: IShippingRate;\n status: CartStatusEnum;\n type: SaleType;\n order?: IOrder | string;\n convertedAt?: Date;\n quoteToken?: string;\n quotedAt?: Date;\n quoteEmail?: string;\n sourceCart?: ICart | string;\n}\n\nexport const CartIssueTypes = {\n ITEM_UNAVAILABLE: \"ITEM_UNAVAILABLE\",\n OUT_OF_STOCK: \"OUT_OF_STOCK\",\n INSUFFICIENT_STOCK: \"INSUFFICIENT_STOCK\",\n COUPON_INVALID: \"COUPON_INVALID\",\n} as const;\n\nexport type CartIssueType = (typeof CartIssueTypes)[keyof typeof CartIssueTypes];\nexport interface CartIssue {\n type: CartIssueType;\n itemId?: string;\n name?: string;\n available?: number;\n requested?: number;\n message: string;\n}\n\nexport interface CartValidation {\n ok: boolean;\n issues: CartIssue[];\n}\n","export interface StockDemandLine {\n key: string;\n quantity: number;\n}\n\nexport const demandByKey = (lines: StockDemandLine[]): Map<string, number> => {\n const totals = new Map<string, number>();\n for (const line of lines) {\n if (!line.key) continue;\n const quantity = Number(line.quantity);\n if (!Number.isFinite(quantity) || quantity <= 0) continue;\n totals.set(line.key, (totals.get(line.key) ?? 0) + quantity);\n }\n return totals;\n};\n\nexport const StockVerdictEnum = {\n OK: \"OK\",\n OUT_OF_STOCK: \"OUT_OF_STOCK\",\n INSUFFICIENT_STOCK: \"INSUFFICIENT_STOCK\",\n} as const;\n\nexport type StockVerdict =\n | { type: typeof StockVerdictEnum.OK }\n | { type: typeof StockVerdictEnum.OUT_OF_STOCK; available: 0; requested: number }\n | { type: typeof StockVerdictEnum.INSUFFICIENT_STOCK; available: number; requested: number };\n\nexport const stockVerdict = (available: number, requested: number): StockVerdict => {\n const stock = Number.isFinite(available) ? Math.max(0, Math.floor(available)) : 0;\n const wanted = Number.isFinite(requested) ? Math.max(0, Math.floor(requested)) : 0;\n if (stock <= 0) return { type: StockVerdictEnum.OUT_OF_STOCK, available: 0, requested: wanted };\n if (wanted > stock) return { type: StockVerdictEnum.INSUFFICIENT_STOCK, available: stock, requested: wanted };\n return { type: StockVerdictEnum.OK };\n};\n","import type { BaseEntity } from \"../base\";\nimport type { ICustomer } from \"../customer\";\nimport type { IStore } from \"../store\";\n\nexport const SubscriptionChannelEnum = {\n EMAIL: \"EMAIL\",\n SMS: \"SMS\",\n PUSH: \"PUSH\",\n} as const;\n\nexport type SubscriptionChannelEnum = (typeof SubscriptionChannelEnum)[keyof typeof SubscriptionChannelEnum];\nexport const SUBSCRIPTION_CHANNEL_VALUES = Object.values(SubscriptionChannelEnum);\n\nexport const ACTIVE_SUBSCRIPTION_CHANNELS: SubscriptionChannelEnum[] = [SubscriptionChannelEnum.EMAIL];\n\nexport const SubscriptionTopicEnum = {\n PROMOTIONAL: \"PROMOTIONAL\",\n NEWSLETTER: \"NEWSLETTER\",\n BACK_IN_STOCK: \"BACK_IN_STOCK\",\n PRICE_DROP: \"PRICE_DROP\",\n} as const;\n\nexport type SubscriptionTopicEnum = (typeof SubscriptionTopicEnum)[keyof typeof SubscriptionTopicEnum];\nexport const SUBSCRIPTION_TOPIC_VALUES = Object.values(SubscriptionTopicEnum);\n\nexport const SUBSCRIPTION_TOPIC_LABELS: Record<SubscriptionTopicEnum, string> = {\n [SubscriptionTopicEnum.PROMOTIONAL]: \"Promotional\",\n [SubscriptionTopicEnum.NEWSLETTER]: \"Newsletter\",\n [SubscriptionTopicEnum.BACK_IN_STOCK]: \"Back in stock\",\n [SubscriptionTopicEnum.PRICE_DROP]: \"Price drop\",\n};\n\nexport const DEFAULT_SUBSCRIPTION_TOPICS: SubscriptionTopicEnum[] = [\n SubscriptionTopicEnum.PROMOTIONAL,\n SubscriptionTopicEnum.NEWSLETTER,\n];\n\nexport interface ISubscription {\n channel: SubscriptionChannelEnum;\n topic: SubscriptionTopicEnum;\n subscribed: boolean;\n source?: string;\n updatedAt?: Date | string;\n}\n\nexport interface ISubscriberConsent {\n source?: string;\n ip?: string;\n at?: Date | string;\n}\n\nexport interface ISubscriber extends BaseEntity {\n email: string;\n phone?: string;\n customer?: ICustomer | string;\n firstName?: string;\n lastName?: string;\n stores?: (IStore | string)[];\n subscriptions: ISubscription[];\n consent?: ISubscriberConsent;\n unsubscribeToken?: string;\n status: boolean;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { IStore } from \"../store\";\nimport type { ISubscriber } from \"../subscriber\";\nimport type { SubscriptionChannelEnum, SubscriptionTopicEnum } from \"../subscriber\";\n\nexport const CampaignStatusEnum = {\n SENDING: \"SENDING\",\n SENT: \"SENT\",\n FAILED: \"FAILED\",\n} as const;\n\nexport type CampaignStatusEnum = (typeof CampaignStatusEnum)[keyof typeof CampaignStatusEnum];\nexport const CAMPAIGN_STATUS_VALUES = Object.values(CampaignStatusEnum);\n\nexport const CampaignRecipientStatusEnum = {\n QUEUED: \"QUEUED\",\n SENT: \"SENT\",\n DELIVERED: \"DELIVERED\",\n OPENED: \"OPENED\",\n CLICKED: \"CLICKED\",\n BOUNCED: \"BOUNCED\",\n COMPLAINED: \"COMPLAINED\",\n FAILED: \"FAILED\",\n} as const;\n\nexport type CampaignRecipientStatusEnum = (typeof CampaignRecipientStatusEnum)[keyof typeof CampaignRecipientStatusEnum];\nexport const CAMPAIGN_RECIPIENT_STATUS_VALUES = Object.values(CampaignRecipientStatusEnum);\n\nexport interface ICampaignStats {\n sent: number;\n delivered: number;\n opened: number;\n clicked: number;\n bounced: number;\n complained: number;\n failed: number;\n}\n\nexport interface ICampaign extends BaseEntity {\n headline: string;\n body: string;\n ctaLabel?: string;\n ctaUrl?: string;\n channel: SubscriptionChannelEnum;\n topic: SubscriptionTopicEnum;\n store?: IStore | string;\n status: CampaignStatusEnum;\n recipientCount: number;\n stats: ICampaignStats;\n createdBy?: string;\n sentAt?: Date | string;\n}\n\nexport interface ICampaignRecipient extends BaseEntity {\n campaign: ICampaign | string;\n subscriber?: ISubscriber | string;\n email: string;\n resendEmailId?: string;\n status: CampaignRecipientStatusEnum;\n openedAt?: Date | string;\n clickedAt?: Date | string;\n lastEventAt?: Date | string;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { IProduct } from \"../product\";\nimport type { IStore } from \"../store\";\nimport type { IVariant } from \"../variant\";\n\nexport const StockStatusEnum = {\n IN_STOCK: \"IN_STOCK\",\n LOW_STOCK: \"LOW_STOCK\",\n OUT_OF_STOCK: \"OUT_OF_STOCK\",\n} as const;\n\nexport type StockStatus = (typeof StockStatusEnum)[keyof typeof StockStatusEnum];\nexport interface IStock extends BaseEntity {\n sku: string;\n product: IProduct;\n variant?: IVariant | null;\n store?: IStore | string | null;\n\n quantity: number;\n reserved: number;\n available: number;\n\n status: StockStatus;\n lowStockThreshold: number;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { IStore } from \"../store\";\nimport type { Metadata } from \"../common\";\nimport type { IOrder } from \"../order\";\nimport type { ICurrency } from \"../currency\";\n\nexport const PaymentStatusEnum = {\n INITIATED: 'INITIATED',\n PENDING: 'PENDING',\n PROCESSING: 'PROCESSING',\n FAILED: 'FAILED',\n CANCELLED: 'CANCELLED',\n PENDING_CAPTURE: 'PENDING_CAPTURE',\n COMPLETED: 'COMPLETED',\n VOIDED: 'VOIDED',\n REDIRECTED_TO_GATEWAY: 'REDIRECTED_TO_GATEWAY',\n UNKNOWN: 'UNKNOWN',\n REFUNDED: 'REFUNDED',\n PARTIALLY_REFUNDED: 'PARTIALLY_REFUNDED',\n NOT_REQUIRED: 'NOT_REQUIRED',\n} as const;\n\nexport type PaymentStatusEnum = (typeof PaymentStatusEnum)[keyof typeof PaymentStatusEnum];\nexport const PAYMENT_STATUS_VALUES = Object.values(PaymentStatusEnum);\n\nexport const paymentStatusColorMap: Record<PaymentStatusEnum, string> = {\n [PaymentStatusEnum.INITIATED]: 'default',\n [PaymentStatusEnum.PENDING]: 'gold',\n [PaymentStatusEnum.PROCESSING]: 'cyan',\n [PaymentStatusEnum.FAILED]: 'red',\n [PaymentStatusEnum.CANCELLED]: 'volcano',\n [PaymentStatusEnum.PENDING_CAPTURE]: 'blue',\n [PaymentStatusEnum.COMPLETED]: 'green',\n [PaymentStatusEnum.VOIDED]: 'magenta',\n [PaymentStatusEnum.REDIRECTED_TO_GATEWAY]: 'purple',\n [PaymentStatusEnum.UNKNOWN]: 'gray',\n [PaymentStatusEnum.REFUNDED]: 'orange',\n [PaymentStatusEnum.PARTIALLY_REFUNDED]: 'magenta',\n [PaymentStatusEnum.NOT_REQUIRED]: 'default',\n};\n\nexport const PaymentMethodEnum = {\n CREDIT_CARD: 'CREDIT_CARD',\n PAYPAL: 'PAYPAL',\n STRIPE: 'STRIPE',\n CHECK: 'CHECK',\n APPLE_PAY: 'APPLE_PAY',\n PURCHASE_ORDER: 'PURCHASE_ORDER',\n} as const;\n\nexport type PaymentMethodEnum = (typeof PaymentMethodEnum)[keyof typeof PaymentMethodEnum];\nexport const PAYMENT_METHOD_VALUES = Object.values(PaymentMethodEnum);\n\nexport const paymentMethodColorMap: Record<PaymentMethodEnum, string> = {\n [PaymentMethodEnum.CREDIT_CARD]: 'blue',\n [PaymentMethodEnum.PAYPAL]: 'geekblue',\n [PaymentMethodEnum.STRIPE]: 'purple',\n [PaymentMethodEnum.CHECK]: 'orange',\n [PaymentMethodEnum.APPLE_PAY]: 'black',\n [PaymentMethodEnum.PURCHASE_ORDER]: 'gold',\n};\n\nexport const PaymentGatewayEnum = {\n STRIPE: 'STRIPE',\n PAYPAL: 'PAYPAL',\n BRAINTREE: 'BRAINTREE',\n MANUAL: 'MANUAL',\n} as const;\n\nexport type PaymentGatewayEnum = (typeof PaymentGatewayEnum)[keyof typeof PaymentGatewayEnum];\nexport const PAYMENT_GATEWAY_VALUES = Object.values(PaymentGatewayEnum);\n\nexport const TransactionTypeEnum = {\n ORDER: \"ORDER\",\n REFUND: \"REFUND\",\n} as const;\n\nexport type TransactionTypeEnum = (typeof TransactionTypeEnum)[keyof typeof TransactionTypeEnum];\n\nexport const TRANSACTION_TYPE_VALUES = Object.values(TransactionTypeEnum);\n\nexport const typeColorMap: Record<TransactionTypeEnum, string> = {\n [TransactionTypeEnum.ORDER]: \"blue\",\n [TransactionTypeEnum.REFUND]: \"purple\",\n};\n\nexport interface ITransactionBase extends BaseEntity {\n order: IOrder;\n store: IStore | string;\n currency: ICurrency;\n transactionId: string;\n amount: number;\n status: PaymentStatusEnum;\n paymentMethod: PaymentMethodEnum;\n gateway: PaymentGatewayEnum;\n gatewayId?: string;\n metaData: Metadata;\n comment?: string;\n isPaymentLink: boolean;\n refundedAmount: number;\n proofFileId?: string;\n}\n\nexport interface IOrderTransaction extends ITransactionBase {\n type: typeof TransactionTypeEnum.ORDER;\n}\n\nexport interface IRefundTransaction extends ITransactionBase {\n type: typeof TransactionTypeEnum.REFUND;\n originalTransaction?: ITransactionBase;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { IProduct } from \"../product\";\nimport type { IStore } from \"../store\";\n\nexport const ProductEventTypeEnum = {\n VIEW: \"view\",\n ADD_TO_CART: \"add_to_cart\",\n PURCHASE: \"purchase\",\n} as const;\n\nexport type ProductEventTypeEnum = (typeof ProductEventTypeEnum)[keyof typeof ProductEventTypeEnum];\nexport interface IProductDailyStat extends BaseEntity {\n product: IProduct | string;\n store?: IStore | string | null;\n date: string;\n views: number;\n addToCarts: number;\n purchases: number;\n revenue: number;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { Metadata } from \"../common\";\nimport type { IOrder } from \"../order\";\nimport type { IStore } from \"../store\";\n\nexport const NotificationTypeEnum = {\n ORDER_RECEIVED: \"ORDER_RECEIVED\",\n PAYMENT_SUCCEEDED: \"PAYMENT_SUCCEEDED\",\n PAYMENT_FAILED: \"PAYMENT_FAILED\",\n REFUND: \"REFUND\",\n ORDER_CANCELLED: \"ORDER_CANCELLED\",\n ORDER_STATUS: \"ORDER_STATUS\",\n QUOTE_REQUESTED: \"QUOTE_REQUESTED\",\n} as const;\n\nexport type NotificationTypeEnum = (typeof NotificationTypeEnum)[keyof typeof NotificationTypeEnum];\nexport const NOTIFICATION_TYPE_VALUES = Object.values(NotificationTypeEnum);\n\nexport interface INotification extends BaseEntity {\n type: NotificationTypeEnum;\n title: string;\n message: string;\n order?: IOrder | string | null;\n store?: IStore | string | null;\n read: boolean;\n readAt?: Date | null;\n meta?: Metadata;\n}\n"],"mappings":"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","names":["idOf"]}
|
|
1
|
+
{"version":3,"sources":["../src/admin/interface.ts","../src/admin/access.ts","../src/common/objectId.ts","../src/common/validate.ts","../src/coupon/interface.ts","../src/productVariantOptions/interface.ts","../src/addonConfig/interface.ts","../src/addonConfig/resolve.ts","../src/storeFee/interface.ts","../src/emailTemplate/interface.ts","../src/configurator/interface.ts","../src/pricing/index.ts","../src/configurator/evaluate.ts","../src/inventory/interface.ts","../src/saleType/interface.ts","../src/saleType/rules.ts","../src/path/index.ts","../src/order/interface.ts","../src/orderLog/interface.ts","../src/paymentLink/interface.ts","../src/cart/interface.ts","../src/cartItem/stock.ts","../src/subscriber/interface.ts","../src/campaign/interface.ts","../src/stock/interface.ts","../src/transaction/interface.ts","../src/analytics/interface.ts","../src/notification/interface.ts"],"sourcesContent":["import type { BaseEntity } from '../base/interface';\n\nexport const ADMIN_RESOURCE_LIST = [\n { value: 'dashboard', label: 'Dashboard', group: 'Overview' },\n { value: 'metrics', label: 'Metrics', group: 'Overview' },\n { value: 'products', label: 'Products', group: 'Catalog' },\n { value: 'categories', label: 'Categories', group: 'Catalog' },\n { value: 'brands', label: 'Brands', group: 'Catalog' },\n { value: 'technical-specs', label: 'Technical Specs', group: 'Catalog' },\n { value: 'addon-configs', label: 'Addon Configs', group: 'Catalog' },\n { value: 'relation-groups', label: 'Relation Groups', group: 'Catalog' },\n { value: 'configurators', label: 'Configurators', group: 'Catalog' },\n { value: 'orders', label: 'Orders', group: 'Commerce' },\n { value: 'quotes', label: 'Quotes', group: 'Commerce' },\n { value: 'carts', label: 'Carts', group: 'Commerce' },\n { value: 'transactions', label: 'Transactions', group: 'Commerce' },\n { value: 'coupons', label: 'Coupons', group: 'Commerce' },\n { value: 'store-fees', label: 'Store Fees', group: 'Commerce' },\n { value: 'customers', label: 'Customers', group: 'People' },\n { value: 'contact-us', label: 'Contact Requests', group: 'People' },\n { value: 'subscribers', label: 'Subscribers', group: 'People' },\n { value: 'blog', label: 'Blog', group: 'Content' },\n { value: 'faqs', label: 'FAQs', group: 'Content' },\n { value: 'podcast', label: 'Podcast', group: 'Content' },\n { value: 'email-templates', label: 'Email Templates', group: 'Content' },\n { value: 'notifications', label: 'Notifications', group: 'Content' },\n { value: 'campaigns', label: 'Campaigns', group: 'Content' },\n { value: 'stores', label: 'Stores', group: 'Settings' },\n { value: 'currencies', label: 'Currencies', group: 'Settings' },\n { value: 'redirects', label: 'Redirects', group: 'Settings' },\n { value: 'cache', label: 'Cache', group: 'Settings' },\n { value: 'admins', label: 'Admins', group: 'Settings' },\n { value: 'account', label: 'Account', group: 'Settings' },\n] as const;\n\nexport const ADMIN_RESOURCES = ADMIN_RESOURCE_LIST.map((entry) => entry.value);\n\nexport type IAdminResource = (typeof ADMIN_RESOURCE_LIST)[number]['value'];\n\nexport const ADMIN_ACTIONS = ['read', 'write', 'delete'] as const;\n\nexport type IAdminBaseAction = (typeof ADMIN_ACTIONS)[number];\n\nexport const RESOURCE_OPERATIONS: Partial<Record<IAdminResource, readonly string[]>> = {\n products: ['sync'],\n brands: ['sync'],\n categories: ['sync'],\n orders: ['charge'],\n transactions: ['refund'],\n cache: ['purge'],\n};\n\nexport type IAdminAction = IAdminBaseAction | string;\n\nexport const actionsForResource = (resource: IAdminResource): IAdminAction[] => [\n ...ADMIN_ACTIONS,\n ...(RESOURCE_OPERATIONS[resource] ?? []),\n];\n\nexport const isValidAction = (resource: IAdminResource, action: string): boolean =>\n actionsForResource(resource).includes(action);\n\nexport interface IAdminPermission {\n resource: IAdminResource;\n actions: IAdminAction[];\n}\n\nexport interface IAdminStoreAccess {\n store: string;\n role?: string | null;\n extras: IAdminPermission[];\n}\n\nexport interface IAdminRole extends BaseEntity {\n key: string;\n name: string;\n description: string;\n permissions: IAdminPermission[];\n isSuperAdmin: boolean;\n isSystem: boolean;\n}\n\nexport type IAdminRoleCreate = Omit<IAdminRole, keyof BaseEntity>;\nexport interface IAdmin extends BaseEntity {\n firstName: string;\n lastName: string;\n email: string;\n phoneNumber: string;\n status: boolean;\n password: string;\n role: string;\n access_list: string[];\n storeAccess: IAdminStoreAccess[];\n resetPasswordTokenHash?: string;\n resetPasswordTokenExpiresAt?: Date | null;\n joiningDate: Date;\n profileImage: string;\n lastLogin: Date;\n}\n\nexport type IAdminSafe = Omit<IAdmin, 'password'>;\n\nexport const ADMIN_AUDIT_ACTIONS = [\n 'role.create',\n 'role.update',\n 'role.delete',\n 'admin.create',\n 'admin.role',\n 'admin.grants',\n 'admin.status',\n 'admin.delete',\n] as const;\n\nexport type IAdminAuditAction = (typeof ADMIN_AUDIT_ACTIONS)[number];\n\nexport interface IAdminAuditLog extends BaseEntity {\n actor: IAdmin | string;\n actorName: string;\n action: IAdminAuditAction;\n targetAdmin?: IAdmin | string | null;\n targetRole?: IAdminRole | string | null;\n store?: string | null;\n summary: string;\n before?: Record<string, unknown> | null;\n after?: Record<string, unknown> | null;\n}\n","import type {\n IAdminAction,\n IAdminPermission,\n IAdminResource,\n IAdminRole,\n IAdminStoreAccess,\n} from './interface';\n\nexport interface EffectiveAccess {\n isSuperAdmin: boolean;\n permissions: Record<string, string[]>;\n}\n\nexport interface ResolveAccessInput {\n role?: string | null;\n storeAccess?: IAdminStoreAccess[];\n roles: Record<string, Pick<IAdminRole, 'permissions' | 'isSuperAdmin'>>;\n storeId?: string | null;\n}\n\nexport const EMPTY_ACCESS: EffectiveAccess = { isSuperAdmin: false, permissions: {} };\n\nconst addGrant = (into: Map<string, Set<string>>, grants: IAdminPermission[] = []): void => {\n for (const { resource, actions } of grants) {\n const bucket = into.get(resource) ?? new Set<string>();\n for (const action of actions ?? []) bucket.add(action);\n into.set(resource, bucket);\n }\n};\n\nconst idOf = (value: unknown): string => (value == null ? '' : String(value));\n\nconst rowApplies = (row: IAdminStoreAccess, storeId: string | null): boolean => {\n const rowStore = idOf(row.store);\n if (!rowStore || rowStore === '*') return true;\n if (!storeId) return true;\n return rowStore === storeId;\n};\n\nexport const resolveEffectivePermissions = (input: ResolveAccessInput): EffectiveAccess => {\n const { roles, storeAccess = [] } = input;\n const storeId = input.storeId == null ? null : idOf(input.storeId);\n\n const globalRole = input.role ? roles[input.role] : undefined;\n if (globalRole?.isSuperAdmin) {\n return { isSuperAdmin: true, permissions: {} };\n }\n\n const merged = new Map<string, Set<string>>();\n addGrant(merged, globalRole?.permissions);\n\n for (const row of storeAccess) {\n if (!rowApplies(row, storeId)) continue;\n\n const rowRole = row.role ? roles[row.role] : undefined;\n if (rowRole?.isSuperAdmin) {\n return { isSuperAdmin: true, permissions: {} };\n }\n\n addGrant(merged, rowRole?.permissions);\n addGrant(merged, row.extras);\n }\n\n const permissions: Record<string, string[]> = {};\n for (const [resource, actions] of merged) {\n if (actions.size > 0) permissions[resource] = [...actions].sort();\n }\n\n return { isSuperAdmin: false, permissions };\n};\n\nexport const can = (\n access: EffectiveAccess,\n resource: IAdminResource,\n action: IAdminAction\n): boolean => {\n if (access.isSuperAdmin) return true;\n return access.permissions[resource]?.includes(action) === true;\n};\n\nexport const canAny = (access: EffectiveAccess, resource: IAdminResource): boolean => {\n if (access.isSuperAdmin) return true;\n return (access.permissions[resource]?.length ?? 0) > 0;\n};\n\nexport const grantedPermissions = (access: EffectiveAccess): IAdminPermission[] =>\n Object.entries(access.permissions).map(([resource, actions]) => ({\n resource: resource as IAdminResource,\n actions: actions as IAdminAction[],\n }));\n\nexport const missingGrants = (\n actor: EffectiveAccess,\n requested: IAdminPermission[]\n): string[] => {\n if (actor.isSuperAdmin) return [];\n\n const missing: string[] = [];\n for (const { resource, actions } of requested) {\n for (const action of actions ?? []) {\n if (!can(actor, resource, action)) missing.push(`${resource}:${action}`);\n }\n }\n return missing;\n};\n\nexport const ALL_STORES = '*';\n\nexport interface StoreScopeInput {\n role?: string | null;\n storeAccess?: IAdminStoreAccess[];\n roles: Record<string, Pick<IAdminRole, 'permissions' | 'isSuperAdmin'>>;\n}\n\nexport const resolveStoreScope = (input: StoreScopeInput): string[] | null => {\n const { roles, storeAccess = [] } = input;\n\n if (input.role && roles[input.role]?.isSuperAdmin) return null;\n\n const scoped: string[] = [];\n for (const row of storeAccess) {\n const store = idOf(row.store);\n if (!store || store === ALL_STORES) return null;\n scoped.push(store);\n }\n\n return scoped;\n};\n\nexport interface StoreAccessCheckInput extends StoreScopeInput {\n storeId?: string | null;\n}\n\nexport const hasStoreAccess = (input: StoreAccessCheckInput): boolean => {\n const scope = resolveStoreScope(input);\n if (scope === null) return true;\n\n const storeId = idOf(input.storeId);\n if (!storeId) return false;\n\n return scope.includes(storeId);\n};\n","export const toIdString = (value: unknown): string => {\n if (!value) return \"\";\n if (typeof value === \"string\") return value;\n\n if (typeof value === \"object\") {\n const candidate = value as { toHexString?: unknown; _id?: unknown };\n\n if (typeof candidate.toHexString === \"function\") {\n return (candidate.toHexString as () => string)();\n }\n\n if (\"_id\" in candidate && candidate._id !== value) {\n return toIdString(candidate._id);\n }\n }\n\n return String(value);\n};\n","export const isNonEmptyString = (value: unknown): value is string =>\n typeof value === 'string' && value.trim().length > 0;\n\nexport const normalizeNumber = (value: unknown, fallback = 0): number => {\n if (typeof value === 'number') return Number.isFinite(value) ? value : fallback;\n if (typeof value === 'string' && value.trim() !== '') {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n }\n return fallback;\n};\n\nexport const isValidEmail = (email: unknown): email is string =>\n typeof email === 'string' && /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email.trim());\n","import type { BaseEntity } from \"../base\";\nimport type { IStore } from \"../store\";\n\nexport const DiscountTypeEnum = {\n PERCENTAGE: \"PERCENTAGE\",\n FIXED: \"FIXED\",\n} as const;\n\nexport type DiscountTypeEnum = (typeof DiscountTypeEnum)[keyof typeof DiscountTypeEnum];\n\nexport interface IDiscountType {\n type: DiscountTypeEnum;\n value: number;\n}\n\nexport interface ICoupon extends BaseEntity {\n title: string;\n couponCode: string;\n startTime: Date;\n endTime: Date;\n discountType: IDiscountType;\n minimumAmount: number;\n isPromotional: boolean;\n status: boolean;\n stores: IStore[];\n}\n","export type VariantOptionMode = \"OPTION_BACKED\" | \"MANUAL\";\n\nexport const ProductVariantTypeEnum = {\n SINGLE: \"SINGLE\",\n OPTION_BACKED: \"OPTION_BACKED\",\n MANUAL: \"MANUAL\",\n} as const;\n\nexport type ProductVariantType = (typeof ProductVariantTypeEnum)[keyof typeof ProductVariantTypeEnum];\n\nexport const PRODUCT_VARIANT_TYPE_VALUES = Object.values(ProductVariantTypeEnum);\n\nexport interface IProductVariantOptionValue {\n id?: string;\n valueKey: string;\n label: string;\n sortOrder: number;\n}\n\nexport interface IProductVariantOptionGroup {\n id?: string;\n optionKey: string;\n name: string;\n sortOrder: number;\n values: IProductVariantOptionValue[];\n}\n\nexport interface IProductVariantOptionMatrix {\n groups: IProductVariantOptionGroup[];\n optionSignatures: string[];\n}\n\nexport interface IVariantOptionSelection {\n id?: string;\n group?: string;\n value?: string;\n optionKey: string;\n optionName: string;\n valueKey: string;\n valueLabel: string;\n sortOrder: number;\n}\n\n","import type { BaseEntity } from \"../base\";\nimport type { IStore } from \"../store\";\n\nexport const PricingTypeEnum = {\n PERCENTAGE: \"PERCENTAGE\",\n FIXED: \"FIXED\",\n} as const;\n\nexport type PricingType = (typeof PricingTypeEnum)[keyof typeof PricingTypeEnum];\nexport const PRICING_TYPE_VALUES = Object.values(PricingTypeEnum);\n\nexport interface IAddonConfig extends BaseEntity {\n name: string;\n key: string;\n description: string;\n stores: (IStore | string)[];\n price: number;\n pricingType: PricingType;\n quantity: number;\n sortOrder: number;\n applyToAll: boolean;\n isDefault: boolean;\n isVisible: boolean;\n status: boolean;\n}\n\nexport interface IAddonGroup extends BaseEntity {\n name: string;\n key: string;\n description: string;\n addons: IAddonConfig[];\n sortOrder: number;\n isVisible: boolean;\n status: boolean;\n}\n","import type { IStore } from \"../store\";\nimport type { IAddonConfig, IAddonGroup } from \"./interface\";\n\nexport interface ProductAddonScope {\n storeId?: string;\n productAddonIds?: string[];\n}\n\nconst idOf = (value: unknown): string => {\n if (!value) return \"\";\n if (typeof value === \"string\") return value;\n const record = value as { _id?: unknown };\n return String(record._id ?? value);\n};\n\nconst isLive = (entity: { status?: boolean; isVisible?: boolean }): boolean =>\n entity.status !== false && entity.isVisible !== false;\n\nconst appliesToStore = (stores: (IStore | string)[] | undefined, storeId: string | undefined): boolean => {\n const list = stores ?? [];\n return list.length === 0 || (!!storeId && list.some((store) => idOf(store) === storeId));\n};\n\nconst appliesToProduct = (addon: IAddonConfig, attachedIds: string[]): boolean =>\n addon.applyToAll !== false || attachedIds.includes(idOf(addon._id));\n\nexport const resolveProductAddonGroups = (\n groups: IAddonGroup[],\n scope: ProductAddonScope = {},\n): IAddonGroup[] => {\n const addonIds = scope.productAddonIds ?? [];\n\n return groups\n .filter(isLive)\n .map((group) => ({\n ...group,\n addons: (group.addons ?? []).filter((addon: IAddonConfig) => (\n isLive(addon)\n && appliesToStore(addon.stores, scope.storeId)\n && appliesToProduct(addon, addonIds)\n )),\n }))\n .filter((group) => group.addons.length > 0);\n};\n\nexport const groupHasDefaultAddon = (group: IAddonGroup): boolean =>\n (group.addons ?? []).some((addon) => addon.isDefault && isLive(addon));\n\nexport interface AddonSelectionRef {\n groupKey: string;\n addonKey: string;\n}\n\nexport interface ResolvedAddonSelection extends AddonSelectionRef {\n addon: IAddonConfig;\n}\n\nexport const resolveAddonSelections = (\n groups: IAddonGroup[],\n selections: AddonSelectionRef[],\n): ResolvedAddonSelection[] => {\n const allowed = new Map<string, IAddonConfig>();\n const pickOne = new Set<string>();\n\n for (const group of groups) {\n if (groupHasDefaultAddon(group)) pickOne.add(group.key);\n for (const addon of group.addons ?? []) {\n allowed.set(`${group.key}:${addon.key}`, addon);\n }\n }\n\n const seen = new Set<string>();\n const filled = new Set<string>();\n const resolved: ResolvedAddonSelection[] = [];\n\n for (const selection of selections) {\n if (typeof selection?.groupKey !== \"string\" || typeof selection?.addonKey !== \"string\") continue;\n\n const pair = `${selection.groupKey}:${selection.addonKey}`;\n if (seen.has(pair)) continue;\n\n const addon = allowed.get(pair);\n if (!addon) continue;\n\n if (pickOne.has(selection.groupKey) && filled.has(selection.groupKey)) continue;\n\n seen.add(pair);\n filled.add(selection.groupKey);\n resolved.push({ groupKey: selection.groupKey, addonKey: selection.addonKey, addon });\n }\n\n return resolved;\n};\n","import type { BaseEntity } from \"../base\";\nimport type { PricingType } from \"../addonConfig\";\nimport type { IStore } from \"../store\";\n\nexport const FeeAppliesToEnum = {\n SUBTOTAL: \"SUBTOTAL\",\n TOTAL: \"TOTAL\",\n} as const;\n\nexport type FeeAppliesToEnum = (typeof FeeAppliesToEnum)[keyof typeof FeeAppliesToEnum];\nexport const FEE_APPLIES_TO_VALUES = Object.values(FeeAppliesToEnum);\n\nexport interface IStoreFee extends BaseEntity {\n stores: (IStore | string)[];\n name: string;\n key: string;\n description?: string;\n pricingType: PricingType;\n value: number;\n appliesTo: FeeAppliesToEnum;\n enabled: boolean;\n isVisible: boolean;\n optional: boolean;\n defaultSelected: boolean;\n sortOrder: number;\n status: boolean;\n}\n\nexport interface ISelectableFee {\n key: string;\n name: string;\n description?: string;\n pricingType: PricingType;\n value: number;\n appliesTo: FeeAppliesToEnum;\n optional: boolean;\n selected: boolean;\n amount: number;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { IStore } from \"../store\";\n\nexport const EmailTemplateEventEnum = {\n ORDER_RECEIVED: \"ORDER_RECEIVED\",\n ORDER_CANCELLED: \"ORDER_CANCELLED\",\n WELCOME: \"WELCOME\",\n PASSWORD_RESET: \"PASSWORD_RESET\",\n QUOTE: \"QUOTE\",\n QUOTE_REQUESTED: \"QUOTE_REQUESTED\",\n QUOTE_SENT: \"QUOTE_SENT\",\n QUOTE_DECLINED: \"QUOTE_DECLINED\",\n INVOICE: \"INVOICE\",\n PROMOTIONAL: \"PROMOTIONAL\",\n CONTACT_US: \"CONTACT_US\",\n NOTIFICATION: \"NOTIFICATION\",\n} as const;\n\nexport type EmailTemplateEventEnum = (typeof EmailTemplateEventEnum)[keyof typeof EmailTemplateEventEnum];\nexport const EMAIL_TEMPLATE_EVENT_VALUES = Object.values(EmailTemplateEventEnum);\n\nexport const WIRED_EMAIL_TEMPLATE_EVENTS: EmailTemplateEventEnum[] = [\n EmailTemplateEventEnum.ORDER_RECEIVED,\n EmailTemplateEventEnum.ORDER_CANCELLED,\n EmailTemplateEventEnum.QUOTE,\n EmailTemplateEventEnum.QUOTE_REQUESTED,\n EmailTemplateEventEnum.QUOTE_SENT,\n EmailTemplateEventEnum.QUOTE_DECLINED,\n EmailTemplateEventEnum.INVOICE,\n EmailTemplateEventEnum.WELCOME,\n EmailTemplateEventEnum.PASSWORD_RESET,\n EmailTemplateEventEnum.CONTACT_US,\n EmailTemplateEventEnum.NOTIFICATION,\n EmailTemplateEventEnum.PROMOTIONAL,\n];\n\nexport const EMAIL_TEMPLATE_VARIABLES_BY_EVENT: Partial<Record<EmailTemplateEventEnum, string[]>> = {\n [EmailTemplateEventEnum.ORDER_RECEIVED]: [\n \"customerName\", \"orderId\", \"orderDate\", \"itemsHtml\", \"subtotal\", \"shippingHandling\",\n \"estimatedTax\", \"grandTotal\", \"shippingAddress\", \"billingAddress\", \"shippingMethod\",\n \"paymentMethod\",\n ],\n [EmailTemplateEventEnum.ORDER_CANCELLED]: [\"customerName\", \"orderId\", \"reason\", \"refundAmount\"],\n [EmailTemplateEventEnum.QUOTE]: [\n \"customerName\", \"itemCount\", \"savedDate\", \"itemsHtml\", \"subtotal\", \"discount\", \"grandTotal\", \"quoteLink\",\n ],\n [EmailTemplateEventEnum.WELCOME]: [\"name\", \"appName\", \"ctaLabel\", \"ctaUrl\"],\n [EmailTemplateEventEnum.PASSWORD_RESET]: [\"name\", \"resetUrl\", \"expiryLabel\"],\n [EmailTemplateEventEnum.CONTACT_US]: [\"customerName\", \"caseNumber\", \"department\", \"subjectSummary\"],\n [EmailTemplateEventEnum.INVOICE]: [\n \"customerName\", \"orderId\", \"orderDate\", \"itemsHtml\", \"subtotal\", \"shippingHandling\",\n \"estimatedTax\", \"grandTotal\", \"amountDue\", \"shippingAddress\", \"billingAddress\", \"paymentLink\",\n ],\n [EmailTemplateEventEnum.QUOTE_REQUESTED]: [\n \"customerName\", \"quoteId\", \"requestDate\", \"itemCount\", \"customerNote\", \"itemsHtml\", \"shippingAddress\",\n ],\n [EmailTemplateEventEnum.QUOTE_SENT]: [\n \"customerName\", \"quoteId\", \"quoteDate\", \"itemsHtml\", \"subtotal\", \"shipping\", \"discount\",\n \"estimatedTax\", \"feesHtml\", \"grandTotal\", \"validUntil\", \"shippingAddress\", \"customerNote\",\n ],\n [EmailTemplateEventEnum.QUOTE_DECLINED]: [\"customerName\", \"quoteId\", \"reason\"],\n [EmailTemplateEventEnum.NOTIFICATION]: [\"recipientName\", \"title\", \"message\", \"ctaLabel\", \"ctaUrl\"],\n [EmailTemplateEventEnum.PROMOTIONAL]: [\"recipientName\", \"headline\", \"body\", \"ctaLabel\", \"ctaUrl\", \"unsubscribeUrl\"],\n};\n\nexport interface IEmailTemplate extends BaseEntity {\n stores: (IStore | string)[];\n name: string;\n key: string;\n event: EmailTemplateEventEnum;\n subject: string;\n headerHtml: string;\n bodyHtml: string;\n footerHtml: string;\n variables: string[];\n isVisible: boolean;\n status: boolean;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { PricingType } from \"../addonConfig\";\nimport type { IStore } from \"../store\";\n\nexport const ConfiguratorSelectModeEnum = {\n SINGLE: \"SINGLE\",\n MULTI: \"MULTI\",\n} as const;\n\nexport type ConfiguratorSelectModeEnum =\n (typeof ConfiguratorSelectModeEnum)[keyof typeof ConfiguratorSelectModeEnum];\nexport const CONFIGURATOR_SELECT_MODE_VALUES = Object.values(ConfiguratorSelectModeEnum);\n\nexport const ConfiguratorSourceEnum = {\n PICKED: \"PICKED\",\n QUERY: \"QUERY\",\n} as const;\n\nexport type ConfiguratorSourceEnum =\n (typeof ConfiguratorSourceEnum)[keyof typeof ConfiguratorSourceEnum];\nexport const CONFIGURATOR_SOURCE_VALUES = Object.values(ConfiguratorSourceEnum);\n\nexport const ConfiguratorConditionTypeEnum = {\n SELECTED: \"SELECTED\",\n ALL: \"ALL\",\n ANY: \"ANY\",\n NOT: \"NOT\",\n} as const;\n\nexport type ConfiguratorConditionTypeEnum =\n (typeof ConfiguratorConditionTypeEnum)[keyof typeof ConfiguratorConditionTypeEnum];\nexport const CONFIGURATOR_CONDITION_TYPE_VALUES = Object.values(ConfiguratorConditionTypeEnum);\n\nexport const ConfiguratorEffectTypeEnum = {\n SHOW: \"SHOW\",\n HIDE: \"HIDE\",\n REQUIRE: \"REQUIRE\",\n OPTIONAL: \"OPTIONAL\",\n SELECT: \"SELECT\",\n DESELECT: \"DESELECT\",\n PRICE_ADJUST: \"PRICE_ADJUST\",\n} as const;\n\nexport type ConfiguratorEffectTypeEnum =\n (typeof ConfiguratorEffectTypeEnum)[keyof typeof ConfiguratorEffectTypeEnum];\nexport const CONFIGURATOR_EFFECT_TYPE_VALUES = Object.values(ConfiguratorEffectTypeEnum);\n\nexport const ConfiguratorErrorCodeEnum = {\n REQUIRED_SECTION_EMPTY: \"REQUIRED_SECTION_EMPTY\",\n OPTION_NOT_AVAILABLE: \"OPTION_NOT_AVAILABLE\",\n SECTION_NOT_AVAILABLE: \"SECTION_NOT_AVAILABLE\",\n UNKNOWN_SECTION: \"UNKNOWN_SECTION\",\n SINGLE_SELECT_OVERFILLED: \"SINGLE_SELECT_OVERFILLED\",\n RULES_UNSTABLE: \"RULES_UNSTABLE\",\n} as const;\n\nexport type ConfiguratorErrorCodeEnum =\n (typeof ConfiguratorErrorCodeEnum)[keyof typeof ConfiguratorErrorCodeEnum];\nexport interface IConfiguratorQuery {\n search?: string;\n categories?: string[];\n brands?: string[];\n types?: string[];\n minPrice?: number;\n maxPrice?: number;\n inStock?: boolean;\n limit?: number;\n}\n\nexport interface IConfiguratorFacetValue {\n key: string;\n label: string;\n tags?: string[];\n query?: IConfiguratorQuery;\n isDefault?: boolean;\n}\n\nexport interface IConfiguratorFacet {\n key: string;\n label: string;\n values: IConfiguratorFacetValue[];\n}\n\nexport interface IConfiguratorOption {\n key: string;\n sku: string;\n tags?: string[];\n sortOrder?: number;\n}\n\nexport interface IConfiguratorSection {\n key: string;\n title: string;\n description?: string;\n selectMode: ConfiguratorSelectModeEnum;\n required: boolean;\n source: ConfiguratorSourceEnum;\n options?: IConfiguratorOption[];\n query?: IConfiguratorQuery;\n facets?: IConfiguratorFacet[];\n contentHtml?: string;\n sortOrder?: number;\n}\n\nexport interface IConfiguratorStep {\n key: string;\n title: string;\n description?: string;\n sections: IConfiguratorSection[];\n sortOrder?: number;\n}\n\nexport interface IConfiguratorTarget {\n sectionKey: string;\n optionKey?: string;\n tag?: string;\n}\n\nexport type IConfiguratorCondition =\n | {\n type: typeof ConfiguratorConditionTypeEnum.SELECTED;\n sectionKey: string;\n optionKeys?: string[];\n }\n | {\n type: typeof ConfiguratorConditionTypeEnum.ALL | typeof ConfiguratorConditionTypeEnum.ANY;\n conditions: IConfiguratorCondition[];\n }\n | {\n type: typeof ConfiguratorConditionTypeEnum.NOT;\n condition: IConfiguratorCondition;\n };\n\nexport interface IConfiguratorEffect {\n type: ConfiguratorEffectTypeEnum;\n target: IConfiguratorTarget;\n mode?: PricingType;\n amount?: number;\n}\n\nexport interface IConfiguratorPriceAdjustment {\n sectionKey: string;\n optionKey?: string;\n mode: PricingType;\n amount: number;\n}\n\nexport interface IConfiguratorRule {\n key: string;\n description?: string;\n when: IConfiguratorCondition;\n then: IConfiguratorEffect[];\n}\n\nexport interface IConfigurator extends BaseEntity {\n name: string;\n key: string;\n description: string;\n images?: string[];\n stores: (IStore | string)[];\n steps: IConfiguratorStep[];\n rules: IConfiguratorRule[];\n sortOrder: number;\n isVisible: boolean;\n status: boolean;\n}\n\nexport type ConfiguratorSelections = Record<string, string[]>;\n","import { PricingTypeEnum, type PricingType } from \"../addonConfig\";\nimport { FeeAppliesToEnum } from \"../storeFee\";\nimport type { IAppliedFee } from \"../common\";\n\nexport const roundMoney = (amount: number): number => {\n if (!Number.isFinite(amount)) return 0;\n return Math.round((amount + Number.EPSILON) * 100) / 100;\n};\n\nconst moneyFormatters = new Map<string, Intl.NumberFormat>();\n\nconst moneyFormatter = (currencyCode: string): Intl.NumberFormat => {\n let formatter = moneyFormatters.get(currencyCode);\n if (!formatter) {\n formatter = new Intl.NumberFormat(\"en-US\", { style: \"currency\", currency: currencyCode });\n moneyFormatters.set(currencyCode, formatter);\n }\n return formatter;\n};\n\nexport const formatMoney = (value: number, currencyCode: string = \"USD\"): string =>\n moneyFormatter(currencyCode).format(value ?? 0);\n\nexport const normalizeLineQuantity = (quantity: number): number =>\n Math.max(1, Math.floor(Number(quantity)) || 1);\n\nexport interface AddonAmountInput {\n price: number;\n pricingType: PricingType;\n quantity: number;\n}\n\nexport const addonUnitAmount = (addon: AddonAmountInput, baseUnitPrice: number): number => {\n const value = Number.isFinite(addon.price) ? addon.price : 0;\n const quantity = Number.isFinite(addon.quantity) ? addon.quantity : 1;\n const amount = addon.pricingType === PricingTypeEnum.PERCENTAGE ? baseUnitPrice * (value / 100) : value;\n return roundMoney(amount * quantity);\n};\n\nexport const addonsUnitAmount = (addons: AddonAmountInput[], baseUnitPrice: number): number =>\n roundMoney(addons.reduce((sum, addon) => sum + addonUnitAmount(addon, baseUnitPrice), 0));\n\nexport interface PricedLineLike {\n pricing?: { baseUnitPrice?: number; unitPrice?: number };\n metaData?: unknown;\n}\n\nexport const addonsOfLine = (line: PricedLineLike): AddonAmountInput[] => {\n const raw = (line.metaData as { addons?: unknown } | undefined)?.addons;\n if (!Array.isArray(raw)) return [];\n return (raw as { price?: number; pricingType?: PricingType; quantity?: number }[]).map((addon) => ({\n price: Number(addon.price ?? 0),\n pricingType: addon.pricingType === PricingTypeEnum.PERCENTAGE ? PricingTypeEnum.PERCENTAGE : PricingTypeEnum.FIXED,\n quantity: Number(addon.quantity ?? 1),\n }));\n};\n\nexport const baseUnitPriceOfLine = (line: PricedLineLike): number | null => {\n const stored = line.pricing?.baseUnitPrice;\n if (typeof stored === \"number\") return stored;\n return addonsOfLine(line).length === 0 ? line.pricing?.unitPrice ?? 0 : null;\n};\n\nexport const feeHint = (fee: IAppliedFee): string => {\n const basis = fee.pricingType === PricingTypeEnum.PERCENTAGE && fee.value != null\n ? `${fee.value}% of ${fee.appliesTo === FeeAppliesToEnum.TOTAL ? \"order total\" : \"subtotal\"}`\n : \"Flat fee\";\n return fee.description ? `${basis} — ${fee.description}` : basis;\n};\n","import { roundMoney } from \"../pricing\";\nimport { PricingTypeEnum } from \"../addonConfig\";\nimport {\n ConfiguratorConditionTypeEnum,\n ConfiguratorEffectTypeEnum,\n ConfiguratorErrorCodeEnum,\n ConfiguratorSelectModeEnum,\n type ConfiguratorSelections,\n type IConfigurator,\n type IConfiguratorCondition,\n type IConfiguratorPriceAdjustment,\n type IConfiguratorSection,\n} from \"./interface\";\n\nexport interface ConfiguratorEvalContext {\n optionKeysBySection?: Record<string, string[]>;\n}\n\nexport interface ConfiguratorEvalError {\n code: ConfiguratorErrorCodeEnum;\n sectionKey: string;\n optionKey?: string;\n}\n\nexport interface ConfiguratorEvalResult {\n selections: ConfiguratorSelections;\n hiddenSections: string[];\n hiddenOptions: string[];\n requiredSections: string[];\n errors: ConfiguratorEvalError[];\n priceAdjustments: IConfiguratorPriceAdjustment[];\n stable: boolean;\n hiddenBy: Record<string, string>;\n selectedBy: Record<string, string>;\n}\n\nconst MAX_PASSES = 10;\n\nconst optionId = (sectionKey: string, optionKey: string): string => `${sectionKey}:${optionKey}`;\n\nconst targetOptionKeys = (\n target: { optionKey?: string; tag?: string } | undefined,\n section: IConfiguratorSection,\n): string[] => {\n if (target?.optionKey) return [target.optionKey];\n if (!target?.tag) return [];\n return (section.options ?? [])\n .filter((option) => (option.tags ?? []).includes(target.tag as string))\n .map((option) => option.key);\n};\n\nconst collectSections = (config: IConfigurator): Map<string, IConfiguratorSection> => {\n const sections = new Map<string, IConfiguratorSection>();\n for (const step of config.steps ?? []) {\n for (const section of step.sections ?? []) {\n if (section?.key) sections.set(section.key, section);\n }\n }\n return sections;\n};\n\nconst collectOptionKeys = (\n sections: Map<string, IConfiguratorSection>,\n override: Record<string, string[]> | undefined,\n): Map<string, Set<string> | null> => {\n const universe = new Map<string, Set<string> | null>();\n for (const [key, section] of sections) {\n const supplied = override?.[key];\n if (supplied) {\n universe.set(key, new Set(supplied));\n } else if (section.options?.length) {\n universe.set(key, new Set(section.options.map((option) => option.key)));\n } else {\n universe.set(key, null);\n }\n }\n return universe;\n};\n\nexport const conditionHolds = (\n condition: IConfiguratorCondition | undefined,\n selections: ConfiguratorSelections,\n): boolean => {\n if (!condition) return false;\n\n switch (condition.type) {\n case ConfiguratorConditionTypeEnum.SELECTED: {\n const chosen = selections[condition.sectionKey] ?? [];\n const wanted = condition.optionKeys ?? [];\n if (wanted.length === 0) return chosen.length > 0;\n return wanted.some((key) => chosen.includes(key));\n }\n case ConfiguratorConditionTypeEnum.ALL:\n return (condition.conditions ?? []).every((child) => conditionHolds(child, selections));\n case ConfiguratorConditionTypeEnum.ANY:\n return (condition.conditions ?? []).some((child) => conditionHolds(child, selections));\n case ConfiguratorConditionTypeEnum.NOT:\n return !conditionHolds(condition.condition, selections);\n default:\n return false;\n }\n};\n\nconst sameSelections = (a: ConfiguratorSelections, b: ConfiguratorSelections): boolean => {\n const keys = new Set([...Object.keys(a), ...Object.keys(b)]);\n for (const key of keys) {\n const left = a[key] ?? [];\n const right = b[key] ?? [];\n if (left.length !== right.length) return false;\n if (left.some((value, index) => value !== right[index])) return false;\n }\n return true;\n};\n\nconst sameSet = (a: Set<string>, b: Set<string>): boolean =>\n a.size === b.size && [...a].every((value) => b.has(value));\n\nexport const evaluateConfigurator = (\n config: IConfigurator,\n selections: ConfiguratorSelections,\n context: ConfiguratorEvalContext = {},\n): ConfiguratorEvalResult => {\n const sections = collectSections(config);\n const universe = collectOptionKeys(sections, context.optionKeysBySection);\n const rules = config.rules ?? [];\n\n let current: ConfiguratorSelections = {};\n for (const [sectionKey, chosen] of Object.entries(selections ?? {})) {\n current[sectionKey] = [...(chosen ?? [])];\n }\n\n let hiddenSections = new Set<string>();\n let hiddenOptions = new Set<string>();\n let requiredSections = new Set<string>();\n let errors: ConfiguratorEvalError[] = [];\n let stable = false;\n\n for (let pass = 0; pass < MAX_PASSES; pass++) {\n const nextHiddenSections = new Set<string>();\n const nextHiddenOptions = new Set<string>();\n const nextRequired = new Set<string>();\n for (const [key, section] of sections) {\n if (section.required) nextRequired.add(key);\n }\n\n const working: ConfiguratorSelections = {};\n for (const [sectionKey, chosen] of Object.entries(current)) {\n working[sectionKey] = [...chosen];\n }\n\n for (const rule of rules) {\n if (!conditionHolds(rule?.when, current)) continue;\n\n for (const effect of rule.then ?? []) {\n const sectionKey = effect?.target?.sectionKey;\n if (!sectionKey || !sections.has(sectionKey)) continue;\n const section = sections.get(sectionKey) as IConfiguratorSection;\n const targeted = targetOptionKeys(effect.target, section);\n const optionKey = targeted[0];\n\n switch (effect.type) {\n case ConfiguratorEffectTypeEnum.HIDE:\n if (effect.target.tag && targeted.length === 0) break;\n if (targeted.length) {\n for (const key of targeted) nextHiddenOptions.add(optionId(sectionKey, key));\n } else nextHiddenSections.add(sectionKey);\n break;\n case ConfiguratorEffectTypeEnum.SHOW:\n if (effect.target.tag && targeted.length === 0) break;\n if (targeted.length) {\n for (const key of targeted) nextHiddenOptions.delete(optionId(sectionKey, key));\n } else nextHiddenSections.delete(sectionKey);\n break;\n case ConfiguratorEffectTypeEnum.REQUIRE:\n nextRequired.add(sectionKey);\n break;\n case ConfiguratorEffectTypeEnum.OPTIONAL:\n nextRequired.delete(sectionKey);\n break;\n case ConfiguratorEffectTypeEnum.SELECT: {\n if (!optionKey) break;\n if (section.selectMode === ConfiguratorSelectModeEnum.SINGLE) {\n working[sectionKey] = [optionKey];\n break;\n }\n const chosen = working[sectionKey] ?? [];\n const added = targeted.filter((key) => !chosen.includes(key));\n if (added.length) working[sectionKey] = [...chosen, ...added];\n break;\n }\n case ConfiguratorEffectTypeEnum.PRICE_ADJUST:\n break;\n case ConfiguratorEffectTypeEnum.DESELECT: {\n if (!targeted.length) break;\n working[sectionKey] = (working[sectionKey] ?? []).filter((key) => !targeted.includes(key));\n break;\n }\n default:\n break;\n }\n }\n }\n\n const pruned: ConfiguratorSelections = {};\n\n for (const [sectionKey, chosen] of Object.entries(working)) {\n const section = sections.get(sectionKey);\n if (!section) continue;\n\n if (nextHiddenSections.has(sectionKey)) {\n pruned[sectionKey] = [];\n continue;\n }\n\n const known = universe.get(sectionKey) ?? null;\n const kept = chosen.filter((optionKey) => (\n (known === null || known.has(optionKey))\n && !nextHiddenOptions.has(optionId(sectionKey, optionKey))\n ));\n\n pruned[sectionKey] = section.selectMode === ConfiguratorSelectModeEnum.SINGLE && kept.length > 1\n ? kept.slice(-1)\n : kept;\n }\n\n const settled =\n sameSelections(pruned, current)\n && sameSet(nextHiddenSections, hiddenSections)\n && sameSet(nextHiddenOptions, hiddenOptions)\n && sameSet(nextRequired, requiredSections)\n && pass > 0;\n\n current = pruned;\n hiddenSections = nextHiddenSections;\n hiddenOptions = nextHiddenOptions;\n requiredSections = nextRequired;\n\n if (settled) {\n stable = true;\n break;\n }\n }\n\n if (!stable) {\n errors.push({ code: ConfiguratorErrorCodeEnum.RULES_UNSTABLE, sectionKey: \"\" });\n }\n\n for (const [sectionKey, chosen] of Object.entries(selections ?? {})) {\n const submitted = chosen ?? [];\n if (submitted.length === 0) continue;\n\n const section = sections.get(sectionKey);\n if (!section) {\n errors.push({ code: ConfiguratorErrorCodeEnum.UNKNOWN_SECTION, sectionKey });\n continue;\n }\n\n if (hiddenSections.has(sectionKey)) {\n for (const optionKey of submitted) {\n errors.push({ code: ConfiguratorErrorCodeEnum.SECTION_NOT_AVAILABLE, sectionKey, optionKey });\n }\n continue;\n }\n\n const known = universe.get(sectionKey) ?? null;\n const survivors = current[sectionKey] ?? [];\n const overfilled = section.selectMode === ConfiguratorSelectModeEnum.SINGLE && submitted.length > 1;\n\n for (const optionKey of submitted) {\n if (known !== null && !known.has(optionKey)) {\n errors.push({ code: ConfiguratorErrorCodeEnum.OPTION_NOT_AVAILABLE, sectionKey, optionKey });\n } else if (hiddenOptions.has(optionId(sectionKey, optionKey))) {\n errors.push({ code: ConfiguratorErrorCodeEnum.OPTION_NOT_AVAILABLE, sectionKey, optionKey });\n } else if (overfilled && !survivors.includes(optionKey)) {\n errors.push({ code: ConfiguratorErrorCodeEnum.SINGLE_SELECT_OVERFILLED, sectionKey, optionKey });\n }\n }\n }\n\n const priceAdjustments: IConfiguratorPriceAdjustment[] = [];\n for (const rule of rules) {\n if (!conditionHolds(rule?.when, current)) continue;\n for (const effect of rule.then ?? []) {\n if (effect?.type !== ConfiguratorEffectTypeEnum.PRICE_ADJUST) continue;\n\n const sectionKey = effect.target?.sectionKey;\n const amount = Number(effect.amount);\n if (!sectionKey || !sections.has(sectionKey) || !Number.isFinite(amount) || amount === 0) continue;\n if (hiddenSections.has(sectionKey)) continue;\n\n const section = sections.get(sectionKey) as IConfiguratorSection;\n const targeted = targetOptionKeys(effect.target, section);\n const chosen = current[sectionKey] ?? [];\n const mode = effect.mode === PricingTypeEnum.PERCENTAGE ? PricingTypeEnum.PERCENTAGE : PricingTypeEnum.FIXED;\n\n if (targeted.length) {\n for (const optionKey of targeted) {\n if (!chosen.includes(optionKey)) continue;\n priceAdjustments.push({ sectionKey, optionKey, mode, amount });\n }\n continue;\n }\n if (effect.target.tag || chosen.length === 0) continue;\n\n priceAdjustments.push({ sectionKey, mode, amount });\n }\n }\n\n const hiddenBy: Record<string, string> = {};\n const selectedBy: Record<string, string> = {};\n for (const rule of rules) {\n if (!conditionHolds(rule?.when, current)) continue;\n for (const effect of rule.then ?? []) {\n const sectionKey = effect?.target?.sectionKey;\n if (!sectionKey || !sections.has(sectionKey)) continue;\n if (effect.type !== ConfiguratorEffectTypeEnum.HIDE && effect.type !== ConfiguratorEffectTypeEnum.SELECT) continue;\n\n const section = sections.get(sectionKey) as IConfiguratorSection;\n const targeted = targetOptionKeys(effect.target, section);\n const note = rule.description?.trim()\n || (effect.type === ConfiguratorEffectTypeEnum.HIDE\n ? \"Not compatible with your current build.\"\n : \"Included with your build.\");\n const into = effect.type === ConfiguratorEffectTypeEnum.HIDE ? hiddenBy : selectedBy;\n\n if (targeted.length === 0) {\n if (!effect.target.tag && effect.type === ConfiguratorEffectTypeEnum.HIDE) into[sectionKey] = note;\n continue;\n }\n for (const optionKey of targeted) into[optionId(sectionKey, optionKey)] = note;\n }\n }\n\n for (const sectionKey of requiredSections) {\n if (hiddenSections.has(sectionKey)) continue;\n if ((current[sectionKey] ?? []).length === 0) {\n errors.push({ code: ConfiguratorErrorCodeEnum.REQUIRED_SECTION_EMPTY, sectionKey });\n }\n }\n\n return {\n selections: current,\n hiddenSections: [...hiddenSections],\n hiddenOptions: [...hiddenOptions],\n requiredSections: [...requiredSections],\n errors,\n priceAdjustments,\n stable,\n hiddenBy,\n selectedBy,\n };\n};\n\nexport const applyPriceAdjustments = (\n baseUnitPrice: number,\n adjustments: IConfiguratorPriceAdjustment[],\n): number => {\n if (adjustments.length === 0) return roundMoney(baseUnitPrice);\n\n let delta = 0;\n for (const adjustment of adjustments) {\n delta += adjustment.mode === PricingTypeEnum.PERCENTAGE\n ? (baseUnitPrice * adjustment.amount) / 100\n : adjustment.amount;\n }\n return roundMoney(Math.max(0, baseUnitPrice + delta));\n};\n\nexport const adjustmentsFor = (\n adjustments: IConfiguratorPriceAdjustment[],\n sectionKey: string,\n optionKey: string,\n): IConfiguratorPriceAdjustment[] =>\n adjustments.filter((adjustment) => (\n adjustment.sectionKey === sectionKey\n && (!adjustment.optionKey || adjustment.optionKey === optionKey)\n ));\n\nexport const isConfigurationValid = (result: ConfiguratorEvalResult): boolean =>\n result.stable && result.errors.length === 0;\n","export const InventoryPolicyEnum = {\n DENY: \"deny\",\n CONTINUE: \"continue\",\n} as const;\n\nexport type InventoryPolicy = (typeof InventoryPolicyEnum)[keyof typeof InventoryPolicyEnum];\n\nexport const INVENTORY_POLICY_VALUES: InventoryPolicy[] = Object.values(InventoryPolicyEnum);\n","export const SaleTypeEnum = {\n DIRECT: \"DIRECT\",\n QUOTE: \"QUOTE\",\n} as const;\n\nexport type SaleType = (typeof SaleTypeEnum)[keyof typeof SaleTypeEnum];\n\nexport const SALE_TYPE_VALUES: SaleType[] = Object.values(SaleTypeEnum);\n","import { SaleTypeEnum, type SaleType } from \"./interface\";\n\nexport interface SaleTypedLike {\n saleType?: SaleType;\n metaData?: unknown;\n price?: { price?: number } | null;\n}\n\nexport const saleTypeOf = (item: SaleTypedLike | null | undefined): SaleType => {\n if (item?.saleType) return item.saleType;\n const flagged = (item?.metaData as { quoteOnly?: boolean } | undefined)?.quoteOnly === true;\n const price = Number(item?.price?.price ?? 0);\n return flagged || !Number.isFinite(price) || price <= 0 ? SaleTypeEnum.QUOTE : SaleTypeEnum.DIRECT;\n};\n\nexport const isQuoteOnlyItem = (item: SaleTypedLike | null | undefined): boolean =>\n saleTypeOf(item) === SaleTypeEnum.QUOTE;\n","export const normalizePath = (input: string): string => {\n if (!input || typeof input !== \"string\") return \"/\";\n\n let path = input.trim();\n\n if (/^https?:\\/\\//i.test(path)) {\n try {\n path = new URL(path).pathname;\n } catch {\n }\n }\n\n path = path.split(\"?\")[0].split(\"#\")[0];\n\n try {\n path = decodeURIComponent(path);\n } catch {\n }\n\n if (!path.startsWith(\"/\")) path = `/${path}`;\n path = path.replace(/\\/{2,}/g, \"/\").toLowerCase();\n\n if (path.length > 1) path = path.replace(/\\/+$/, \"\");\n\n return path || \"/\";\n};\n\nexport const canonicalizeSlug = (input: string): string => {\n if (!input || typeof input !== \"string\") return \"\";\n return input\n .trim()\n .toLowerCase()\n .replace(/\\s+/g, \"-\")\n .replace(/-{2,}/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n};\n\nexport const canonicalizePath = (input: string): string => {\n if (!input || typeof input !== \"string\") return \"/\";\n\n let path = input.trim();\n\n if (/^https?:\\/\\//i.test(path)) {\n try {\n path = new URL(path).pathname;\n } catch {\n }\n }\n\n path = path.split(\"?\")[0].split(\"#\")[0];\n\n try {\n path = decodeURIComponent(path);\n } catch {\n }\n\n if (!path.startsWith(\"/\")) path = `/${path}`;\n\n const hadTrailingSlash = path.length > 1 && path.endsWith(\"/\");\n\n const segments = path\n .split(\"/\")\n .map((segment) => (segment ? canonicalizeSlug(segment) : segment))\n .filter((segment, index) => segment !== \"\" || index === 0);\n\n let out = segments.join(\"/\") || \"/\";\n if (!out.startsWith(\"/\")) out = `/${out}`;\n if (hadTrailingSlash && out !== \"/\") out += \"/\";\n\n return out;\n};\n","import type { BaseEntity } from \"../base\";\nimport type { IAddress } from \"../address\";\nimport type { ISummaryPricing, Metadata } from \"../common\";\nimport type { ICoupon } from \"../coupon\";\nimport type { ICustomer } from \"../customer\";\nimport type { IOrderItem } from \"../orderItem\";\nimport type { IStore } from \"../store\";\nimport type { IOrderTransaction, IRefundTransaction } from \"../transaction\";\nimport type { PaymentGatewayEnum, PaymentMethodEnum, PaymentStatusEnum } from \"../transaction\";\nimport type { SaleType } from \"../saleType\";\n\nexport const OrderStatusEnum = {\n CREATED: \"CREATED\",\n RECEIVED: \"RECEIVED\",\n PENDING: \"PENDING\",\n CONFIRMED: \"CONFIRMED\",\n PROCESSING: \"PROCESSING\",\n SHIPPED: \"SHIPPED\",\n DELIVERED: \"DELIVERED\",\n CANCELED: \"CANCELED\",\n FAILED: \"FAILED\",\n REFUNDED: \"REFUNDED\",\n PARTIALLY_REFUNDED: \"PARTIALLY_REFUNDED\",\n ARCHIVED: \"ARCHIVED\",\n RETURNED: \"RETURNED\",\n\n QUOTE_REQUESTED: \"QUOTE_REQUESTED\",\n QUOTED: \"QUOTED\",\n QUOTE_ACCEPTED: \"QUOTE_ACCEPTED\",\n QUOTE_DECLINED: \"QUOTE_DECLINED\",\n QUOTE_EXPIRED: \"QUOTE_EXPIRED\",\n} as const;\n\nexport type OrderStatusEnum = (typeof OrderStatusEnum)[keyof typeof OrderStatusEnum];\nexport const ORDER_STATUS_VALUES = Object.values(OrderStatusEnum);\n\nexport const statusColors: Record<OrderStatusEnum, string> = {\n [OrderStatusEnum.CREATED]: \"default\",\n [OrderStatusEnum.RECEIVED]: \"cyan\",\n [OrderStatusEnum.PENDING]: \"gold\",\n [OrderStatusEnum.CONFIRMED]: \"blue\",\n [OrderStatusEnum.PROCESSING]: \"cyan\",\n [OrderStatusEnum.SHIPPED]: \"purple\",\n [OrderStatusEnum.DELIVERED]: \"green\",\n [OrderStatusEnum.CANCELED]: \"volcano\",\n [OrderStatusEnum.FAILED]: \"red\",\n [OrderStatusEnum.REFUNDED]: \"orange\",\n [OrderStatusEnum.PARTIALLY_REFUNDED]: \"magenta\",\n [OrderStatusEnum.ARCHIVED]: \"gray\",\n [OrderStatusEnum.RETURNED]: \"purple\",\n [OrderStatusEnum.QUOTE_REQUESTED]: \"gold\",\n [OrderStatusEnum.QUOTED]: \"blue\",\n [OrderStatusEnum.QUOTE_ACCEPTED]: \"green\",\n [OrderStatusEnum.QUOTE_DECLINED]: \"volcano\",\n [OrderStatusEnum.QUOTE_EXPIRED]: \"gray\",\n};\n\nexport const PURCHASE_ORDER_STATUSES: OrderStatusEnum[] = [\n OrderStatusEnum.CREATED, OrderStatusEnum.RECEIVED, OrderStatusEnum.PENDING,\n OrderStatusEnum.CONFIRMED, OrderStatusEnum.PROCESSING, OrderStatusEnum.SHIPPED,\n OrderStatusEnum.DELIVERED, OrderStatusEnum.CANCELED, OrderStatusEnum.FAILED,\n OrderStatusEnum.REFUNDED, OrderStatusEnum.PARTIALLY_REFUNDED, OrderStatusEnum.ARCHIVED,\n OrderStatusEnum.RETURNED,\n];\n\nexport const OPEN_ORDER_STATUSES: OrderStatusEnum[] = [\n OrderStatusEnum.CREATED, OrderStatusEnum.RECEIVED, OrderStatusEnum.PENDING,\n OrderStatusEnum.CONFIRMED, OrderStatusEnum.PROCESSING, OrderStatusEnum.SHIPPED,\n];\n\nexport const QUOTE_ORDER_STATUSES: OrderStatusEnum[] = [\n OrderStatusEnum.QUOTE_REQUESTED, OrderStatusEnum.QUOTED, OrderStatusEnum.QUOTE_ACCEPTED,\n OrderStatusEnum.QUOTE_DECLINED, OrderStatusEnum.QUOTE_EXPIRED, OrderStatusEnum.CANCELED,\n];\n\nexport interface IOrder extends BaseEntity {\n orderId: string;\n orderItems: IOrderItem[];\n customer: ICustomer;\n coupon: ICoupon;\n store: IStore;\n status: OrderStatusEnum;\n type?: SaleType;\n sourceQuote?: IOrder | string;\n convertedOrder?: IOrder | string;\n quoteValidUntil?: Date;\n paymentStatus: PaymentStatusEnum;\n paymentMethod: PaymentMethodEnum;\n paymentGateway: PaymentGatewayEnum;\n shippingAddress: IAddress;\n billingAddress: IAddress;\n shippingMethod: string;\n acceptedTermsAt: Date;\n customerNote: string;\n metaData: Metadata;\n orderTransactions: IOrderTransaction[];\n refundTransactions: IRefundTransaction[];\n pricing: ISummaryPricing;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { Metadata } from \"../common\";\nimport type { IOrder } from \"../order\";\n\nexport const OrderLogTypeEnum = {\n ORDER_PLACED: \"ORDER_PLACED\",\n PAYMENT_PENDING: \"PAYMENT_PENDING\",\n PAYMENT_SUCCEEDED: \"PAYMENT_SUCCEEDED\",\n PAYMENT_FAILED: \"PAYMENT_FAILED\",\n PAYMENT_CANCELLED: \"PAYMENT_CANCELLED\",\n ORDER_STATUS: \"ORDER_STATUS\",\n REFUND: \"REFUND\",\n EMAIL: \"EMAIL\",\n NOTE: \"NOTE\",\n} as const;\n\nexport type OrderLogTypeEnum = (typeof OrderLogTypeEnum)[keyof typeof OrderLogTypeEnum];\nexport const ORDER_LOG_TYPE_VALUES = Object.values(OrderLogTypeEnum);\n\nexport const orderLogTypeColorMap: Record<OrderLogTypeEnum, string> = {\n [OrderLogTypeEnum.ORDER_PLACED]: \"blue\",\n [OrderLogTypeEnum.PAYMENT_PENDING]: \"gold\",\n [OrderLogTypeEnum.PAYMENT_SUCCEEDED]: \"green\",\n [OrderLogTypeEnum.PAYMENT_FAILED]: \"red\",\n [OrderLogTypeEnum.PAYMENT_CANCELLED]: \"volcano\",\n [OrderLogTypeEnum.ORDER_STATUS]: \"cyan\",\n [OrderLogTypeEnum.REFUND]: \"purple\",\n [OrderLogTypeEnum.EMAIL]: \"geekblue\",\n [OrderLogTypeEnum.NOTE]: \"default\",\n};\n\nexport interface IOrderLog extends BaseEntity {\n order: IOrder | string;\n type: OrderLogTypeEnum;\n message: string;\n actor?: string;\n meta?: Metadata;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { IOrder } from \"../order\";\nimport type { PaymentGatewayEnum } from \"../transaction\";\n\nexport const PaymentLinkStatusEnum = {\n PENDING: \"PENDING\",\n PAID: \"PAID\",\n EXPIRED: \"EXPIRED\",\n CANCELLED: \"CANCELLED\",\n} as const;\n\nexport type PaymentLinkStatusEnum = (typeof PaymentLinkStatusEnum)[keyof typeof PaymentLinkStatusEnum];\nexport const PAYMENT_LINK_STATUS_VALUES = Object.values(PaymentLinkStatusEnum);\n\nexport const paymentLinkStatusColorMap: Record<PaymentLinkStatusEnum, string> = {\n [PaymentLinkStatusEnum.PENDING]: \"gold\",\n [PaymentLinkStatusEnum.PAID]: \"green\",\n [PaymentLinkStatusEnum.EXPIRED]: \"default\",\n [PaymentLinkStatusEnum.CANCELLED]: \"volcano\",\n};\n\nexport interface IPaymentLink extends BaseEntity {\n order: IOrder | string;\n token: string;\n amount: number;\n currencyCode: string;\n gateway: PaymentGatewayEnum;\n status: PaymentLinkStatusEnum;\n expiresAt?: string | Date;\n paidAt?: string | Date;\n transaction?: string;\n createdBy?: string;\n baseUrl: string;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { ISummaryPricing, Metadata } from \"../common\";\nimport type { ICoupon } from \"../coupon\";\nimport type { ICustomer } from \"../customer\";\nimport type { IStore } from \"../store\";\nimport type { ICartItem } from \"../cartItem\";\nimport type { IOrder } from \"../order\";\nimport type { IShippingRate } from \"../shipping\";\nimport type { SaleType } from \"../saleType\";\n\n\nexport const CartStatusEnum = {\n ACTIVE: \"ACTIVE\",\n CONVERTED: \"CONVERTED\",\n QUOTED: \"QUOTED\",\n ABANDONED: \"ABANDONED\",\n} as const;\n\nexport type CartStatusEnum = (typeof CartStatusEnum)[keyof typeof CartStatusEnum];\nexport const CART_STATUS_VALUES = Object.values(CartStatusEnum);\nexport const RETIRED_CART_STATUSES: CartStatusEnum[] = [\n CartStatusEnum.CONVERTED,\n CartStatusEnum.QUOTED,\n CartStatusEnum.ABANDONED,\n];\n\n\nexport interface ICart extends BaseEntity {\n cartId: string;\n cartItems: ICartItem[];\n user?: ICustomer;\n coupon?: ICoupon;\n store: IStore;\n metaData: Metadata;\n optionalFees?: Record<string, boolean>;\n pricing: ISummaryPricing;\n selectedShippingRate?: IShippingRate;\n status: CartStatusEnum;\n type: SaleType;\n order?: IOrder | string;\n convertedAt?: Date;\n quoteToken?: string;\n quotedAt?: Date;\n quoteEmail?: string;\n sourceCart?: ICart | string;\n}\n\nexport const CartIssueTypes = {\n ITEM_UNAVAILABLE: \"ITEM_UNAVAILABLE\",\n OUT_OF_STOCK: \"OUT_OF_STOCK\",\n INSUFFICIENT_STOCK: \"INSUFFICIENT_STOCK\",\n COUPON_INVALID: \"COUPON_INVALID\",\n} as const;\n\nexport type CartIssueType = (typeof CartIssueTypes)[keyof typeof CartIssueTypes];\nexport interface CartIssue {\n type: CartIssueType;\n itemId?: string;\n name?: string;\n available?: number;\n requested?: number;\n message: string;\n}\n\nexport interface CartValidation {\n ok: boolean;\n issues: CartIssue[];\n}\n","export interface StockDemandLine {\n key: string;\n quantity: number;\n}\n\nexport const demandByKey = (lines: StockDemandLine[]): Map<string, number> => {\n const totals = new Map<string, number>();\n for (const line of lines) {\n if (!line.key) continue;\n const quantity = Number(line.quantity);\n if (!Number.isFinite(quantity) || quantity <= 0) continue;\n totals.set(line.key, (totals.get(line.key) ?? 0) + quantity);\n }\n return totals;\n};\n\nexport const StockVerdictEnum = {\n OK: \"OK\",\n OUT_OF_STOCK: \"OUT_OF_STOCK\",\n INSUFFICIENT_STOCK: \"INSUFFICIENT_STOCK\",\n} as const;\n\nexport type StockVerdict =\n | { type: typeof StockVerdictEnum.OK }\n | { type: typeof StockVerdictEnum.OUT_OF_STOCK; available: 0; requested: number }\n | { type: typeof StockVerdictEnum.INSUFFICIENT_STOCK; available: number; requested: number };\n\nexport const stockVerdict = (available: number, requested: number): StockVerdict => {\n const stock = Number.isFinite(available) ? Math.max(0, Math.floor(available)) : 0;\n const wanted = Number.isFinite(requested) ? Math.max(0, Math.floor(requested)) : 0;\n if (stock <= 0) return { type: StockVerdictEnum.OUT_OF_STOCK, available: 0, requested: wanted };\n if (wanted > stock) return { type: StockVerdictEnum.INSUFFICIENT_STOCK, available: stock, requested: wanted };\n return { type: StockVerdictEnum.OK };\n};\n","import type { BaseEntity } from \"../base\";\nimport type { ICustomer } from \"../customer\";\nimport type { IStore } from \"../store\";\n\nexport const SubscriptionChannelEnum = {\n EMAIL: \"EMAIL\",\n SMS: \"SMS\",\n PUSH: \"PUSH\",\n} as const;\n\nexport type SubscriptionChannelEnum = (typeof SubscriptionChannelEnum)[keyof typeof SubscriptionChannelEnum];\nexport const SUBSCRIPTION_CHANNEL_VALUES = Object.values(SubscriptionChannelEnum);\n\nexport const ACTIVE_SUBSCRIPTION_CHANNELS: SubscriptionChannelEnum[] = [SubscriptionChannelEnum.EMAIL];\n\nexport const SubscriptionTopicEnum = {\n PROMOTIONAL: \"PROMOTIONAL\",\n NEWSLETTER: \"NEWSLETTER\",\n BACK_IN_STOCK: \"BACK_IN_STOCK\",\n PRICE_DROP: \"PRICE_DROP\",\n} as const;\n\nexport type SubscriptionTopicEnum = (typeof SubscriptionTopicEnum)[keyof typeof SubscriptionTopicEnum];\nexport const SUBSCRIPTION_TOPIC_VALUES = Object.values(SubscriptionTopicEnum);\n\nexport const SUBSCRIPTION_TOPIC_LABELS: Record<SubscriptionTopicEnum, string> = {\n [SubscriptionTopicEnum.PROMOTIONAL]: \"Promotional\",\n [SubscriptionTopicEnum.NEWSLETTER]: \"Newsletter\",\n [SubscriptionTopicEnum.BACK_IN_STOCK]: \"Back in stock\",\n [SubscriptionTopicEnum.PRICE_DROP]: \"Price drop\",\n};\n\nexport const DEFAULT_SUBSCRIPTION_TOPICS: SubscriptionTopicEnum[] = [\n SubscriptionTopicEnum.PROMOTIONAL,\n SubscriptionTopicEnum.NEWSLETTER,\n];\n\nexport interface ISubscription {\n channel: SubscriptionChannelEnum;\n topic: SubscriptionTopicEnum;\n subscribed: boolean;\n source?: string;\n updatedAt?: Date | string;\n}\n\nexport interface ISubscriberConsent {\n source?: string;\n ip?: string;\n at?: Date | string;\n}\n\nexport interface ISubscriber extends BaseEntity {\n email: string;\n phone?: string;\n customer?: ICustomer | string;\n firstName?: string;\n lastName?: string;\n stores?: (IStore | string)[];\n subscriptions: ISubscription[];\n consent?: ISubscriberConsent;\n unsubscribeToken?: string;\n status: boolean;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { IStore } from \"../store\";\nimport type { ISubscriber } from \"../subscriber\";\nimport type { SubscriptionChannelEnum, SubscriptionTopicEnum } from \"../subscriber\";\n\nexport const CampaignStatusEnum = {\n SENDING: \"SENDING\",\n SENT: \"SENT\",\n FAILED: \"FAILED\",\n} as const;\n\nexport type CampaignStatusEnum = (typeof CampaignStatusEnum)[keyof typeof CampaignStatusEnum];\nexport const CAMPAIGN_STATUS_VALUES = Object.values(CampaignStatusEnum);\n\nexport const CampaignRecipientStatusEnum = {\n QUEUED: \"QUEUED\",\n SENT: \"SENT\",\n DELIVERED: \"DELIVERED\",\n OPENED: \"OPENED\",\n CLICKED: \"CLICKED\",\n BOUNCED: \"BOUNCED\",\n COMPLAINED: \"COMPLAINED\",\n FAILED: \"FAILED\",\n} as const;\n\nexport type CampaignRecipientStatusEnum = (typeof CampaignRecipientStatusEnum)[keyof typeof CampaignRecipientStatusEnum];\nexport const CAMPAIGN_RECIPIENT_STATUS_VALUES = Object.values(CampaignRecipientStatusEnum);\n\nexport interface ICampaignStats {\n sent: number;\n delivered: number;\n opened: number;\n clicked: number;\n bounced: number;\n complained: number;\n failed: number;\n}\n\nexport interface ICampaign extends BaseEntity {\n headline: string;\n body: string;\n ctaLabel?: string;\n ctaUrl?: string;\n channel: SubscriptionChannelEnum;\n topic: SubscriptionTopicEnum;\n store?: IStore | string;\n status: CampaignStatusEnum;\n recipientCount: number;\n stats: ICampaignStats;\n createdBy?: string;\n sentAt?: Date | string;\n}\n\nexport interface ICampaignRecipient extends BaseEntity {\n campaign: ICampaign | string;\n subscriber?: ISubscriber | string;\n email: string;\n resendEmailId?: string;\n status: CampaignRecipientStatusEnum;\n openedAt?: Date | string;\n clickedAt?: Date | string;\n lastEventAt?: Date | string;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { IProduct } from \"../product\";\nimport type { IStore } from \"../store\";\nimport type { IVariant } from \"../variant\";\n\nexport const StockStatusEnum = {\n IN_STOCK: \"IN_STOCK\",\n LOW_STOCK: \"LOW_STOCK\",\n OUT_OF_STOCK: \"OUT_OF_STOCK\",\n} as const;\n\nexport type StockStatus = (typeof StockStatusEnum)[keyof typeof StockStatusEnum];\nexport interface IStock extends BaseEntity {\n sku: string;\n product: IProduct;\n variant?: IVariant | null;\n store?: IStore | string | null;\n\n quantity: number;\n reserved: number;\n available: number;\n\n status: StockStatus;\n lowStockThreshold: number;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { IStore } from \"../store\";\nimport type { Metadata } from \"../common\";\nimport type { IOrder } from \"../order\";\nimport type { ICurrency } from \"../currency\";\n\nexport const PaymentStatusEnum = {\n INITIATED: 'INITIATED',\n PENDING: 'PENDING',\n PROCESSING: 'PROCESSING',\n FAILED: 'FAILED',\n CANCELLED: 'CANCELLED',\n PENDING_CAPTURE: 'PENDING_CAPTURE',\n COMPLETED: 'COMPLETED',\n VOIDED: 'VOIDED',\n REDIRECTED_TO_GATEWAY: 'REDIRECTED_TO_GATEWAY',\n UNKNOWN: 'UNKNOWN',\n REFUNDED: 'REFUNDED',\n PARTIALLY_REFUNDED: 'PARTIALLY_REFUNDED',\n NOT_REQUIRED: 'NOT_REQUIRED',\n} as const;\n\nexport type PaymentStatusEnum = (typeof PaymentStatusEnum)[keyof typeof PaymentStatusEnum];\nexport const PAYMENT_STATUS_VALUES = Object.values(PaymentStatusEnum);\n\nexport const AWAITING_PAYMENT_STATUSES: PaymentStatusEnum[] = [\n PaymentStatusEnum.INITIATED,\n PaymentStatusEnum.PENDING,\n PaymentStatusEnum.PROCESSING,\n PaymentStatusEnum.PENDING_CAPTURE,\n PaymentStatusEnum.REDIRECTED_TO_GATEWAY,\n PaymentStatusEnum.FAILED,\n PaymentStatusEnum.UNKNOWN,\n];\n\nexport const paymentStatusColorMap: Record<PaymentStatusEnum, string> = {\n [PaymentStatusEnum.INITIATED]: 'default',\n [PaymentStatusEnum.PENDING]: 'gold',\n [PaymentStatusEnum.PROCESSING]: 'cyan',\n [PaymentStatusEnum.FAILED]: 'red',\n [PaymentStatusEnum.CANCELLED]: 'volcano',\n [PaymentStatusEnum.PENDING_CAPTURE]: 'blue',\n [PaymentStatusEnum.COMPLETED]: 'green',\n [PaymentStatusEnum.VOIDED]: 'magenta',\n [PaymentStatusEnum.REDIRECTED_TO_GATEWAY]: 'purple',\n [PaymentStatusEnum.UNKNOWN]: 'gray',\n [PaymentStatusEnum.REFUNDED]: 'orange',\n [PaymentStatusEnum.PARTIALLY_REFUNDED]: 'magenta',\n [PaymentStatusEnum.NOT_REQUIRED]: 'default',\n};\n\nexport const PaymentMethodEnum = {\n CREDIT_CARD: 'CREDIT_CARD',\n PAYPAL: 'PAYPAL',\n STRIPE: 'STRIPE',\n CHECK: 'CHECK',\n APPLE_PAY: 'APPLE_PAY',\n PURCHASE_ORDER: 'PURCHASE_ORDER',\n} as const;\n\nexport type PaymentMethodEnum = (typeof PaymentMethodEnum)[keyof typeof PaymentMethodEnum];\nexport const PAYMENT_METHOD_VALUES = Object.values(PaymentMethodEnum);\n\nexport const paymentMethodColorMap: Record<PaymentMethodEnum, string> = {\n [PaymentMethodEnum.CREDIT_CARD]: 'blue',\n [PaymentMethodEnum.PAYPAL]: 'geekblue',\n [PaymentMethodEnum.STRIPE]: 'purple',\n [PaymentMethodEnum.CHECK]: 'orange',\n [PaymentMethodEnum.APPLE_PAY]: 'black',\n [PaymentMethodEnum.PURCHASE_ORDER]: 'gold',\n};\n\nexport const PaymentGatewayEnum = {\n STRIPE: 'STRIPE',\n PAYPAL: 'PAYPAL',\n BRAINTREE: 'BRAINTREE',\n MANUAL: 'MANUAL',\n} as const;\n\nexport type PaymentGatewayEnum = (typeof PaymentGatewayEnum)[keyof typeof PaymentGatewayEnum];\nexport const PAYMENT_GATEWAY_VALUES = Object.values(PaymentGatewayEnum);\n\nexport const TransactionTypeEnum = {\n ORDER: \"ORDER\",\n REFUND: \"REFUND\",\n} as const;\n\nexport type TransactionTypeEnum = (typeof TransactionTypeEnum)[keyof typeof TransactionTypeEnum];\n\nexport const TRANSACTION_TYPE_VALUES = Object.values(TransactionTypeEnum);\n\nexport const typeColorMap: Record<TransactionTypeEnum, string> = {\n [TransactionTypeEnum.ORDER]: \"blue\",\n [TransactionTypeEnum.REFUND]: \"purple\",\n};\n\nexport interface ITransactionBase extends BaseEntity {\n order: IOrder;\n store: IStore | string;\n currency: ICurrency;\n transactionId: string;\n amount: number;\n status: PaymentStatusEnum;\n paymentMethod: PaymentMethodEnum;\n gateway: PaymentGatewayEnum;\n gatewayId?: string;\n metaData: Metadata;\n comment?: string;\n isPaymentLink: boolean;\n refundedAmount: number;\n proofFileId?: string;\n}\n\nexport interface IOrderTransaction extends ITransactionBase {\n type: typeof TransactionTypeEnum.ORDER;\n}\n\nexport interface IRefundTransaction extends ITransactionBase {\n type: typeof TransactionTypeEnum.REFUND;\n originalTransaction?: ITransactionBase;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { IProduct } from \"../product\";\nimport type { IStore } from \"../store\";\n\nexport const ProductEventTypeEnum = {\n VIEW: \"view\",\n ADD_TO_CART: \"add_to_cart\",\n PURCHASE: \"purchase\",\n} as const;\n\nexport type ProductEventTypeEnum = (typeof ProductEventTypeEnum)[keyof typeof ProductEventTypeEnum];\nexport interface IProductDailyStat extends BaseEntity {\n product: IProduct | string;\n store?: IStore | string | null;\n date: string;\n views: number;\n addToCarts: number;\n purchases: number;\n revenue: number;\n}\n","import type { BaseEntity } from \"../base\";\nimport type { Metadata } from \"../common\";\nimport type { IOrder } from \"../order\";\nimport type { IStore } from \"../store\";\n\nexport const NotificationTypeEnum = {\n ORDER_RECEIVED: \"ORDER_RECEIVED\",\n PAYMENT_SUCCEEDED: \"PAYMENT_SUCCEEDED\",\n PAYMENT_FAILED: \"PAYMENT_FAILED\",\n REFUND: \"REFUND\",\n ORDER_CANCELLED: \"ORDER_CANCELLED\",\n ORDER_STATUS: \"ORDER_STATUS\",\n QUOTE_REQUESTED: \"QUOTE_REQUESTED\",\n} as const;\n\nexport type NotificationTypeEnum = (typeof NotificationTypeEnum)[keyof typeof NotificationTypeEnum];\nexport const NOTIFICATION_TYPE_VALUES = Object.values(NotificationTypeEnum);\n\nexport interface INotification extends BaseEntity {\n type: NotificationTypeEnum;\n title: string;\n message: string;\n order?: IOrder | string | null;\n store?: IStore | string | null;\n read: boolean;\n readAt?: Date | null;\n meta?: Metadata;\n}\n"],"mappings":"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","names":["idOf"]}
|
package/package.json
CHANGED