@openlup/platform 0.15.0 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +124 -0
- package/README.md +633 -6
- package/dist/communications/accountingDocumentDelivery.d.ts +35 -0
- package/dist/communications/accountingDocumentDelivery.js +33 -0
- package/dist/communications/authEmailError.d.ts +5 -0
- package/dist/communications/authEmailError.js +8 -0
- package/dist/communications/authEmailPorts.d.ts +2 -0
- package/dist/communications/authEmailPorts.js +1 -0
- package/dist/communications/authSendEmailHook.d.ts +35 -0
- package/dist/communications/authSendEmailHook.js +250 -0
- package/dist/communications/capturedTransactionalDelivery.d.ts +13 -0
- package/dist/communications/capturedTransactionalDelivery.js +14 -0
- package/dist/communications/communicationSync.d.ts +11 -0
- package/dist/communications/communicationSync.js +79 -0
- package/dist/communications/communicationSyncWorker.d.ts +68 -0
- package/dist/communications/communicationSyncWorker.js +218 -0
- package/dist/communications/consentPolicy.d.ts +19 -0
- package/dist/communications/consentPolicy.js +43 -0
- package/dist/communications/consentPurposeRegistry.d.ts +4 -0
- package/dist/communications/consentPurposeRegistry.js +24 -0
- package/dist/communications/contracts/abandonedCart.d.ts +27 -0
- package/dist/communications/contracts/abandonedCart.js +25 -0
- package/dist/communications/contracts/authEmail.d.ts +62 -0
- package/dist/communications/contracts/authEmail.js +1 -0
- package/dist/communications/contracts/backInStock.d.ts +28 -0
- package/dist/communications/contracts/backInStock.js +28 -0
- package/dist/communications/contracts/blocks.d.ts +24 -0
- package/dist/communications/contracts/blocks.js +23 -0
- package/dist/communications/contracts/checkoutExpired.d.ts +22 -0
- package/dist/communications/contracts/checkoutExpired.js +25 -0
- package/dist/communications/contracts/checkoutRecovery.d.ts +26 -0
- package/dist/communications/contracts/checkoutRecovery.js +37 -0
- package/dist/communications/contracts/commerceEmailContent.d.ts +176 -0
- package/dist/communications/contracts/commerceEmailContent.js +1 -0
- package/dist/communications/contracts/commerceEngagementEmailContent.d.ts +95 -0
- package/dist/communications/contracts/commerceEngagementEmailContent.js +1 -0
- package/dist/communications/contracts/consent.d.ts +12 -0
- package/dist/communications/contracts/consent.js +1 -0
- package/dist/communications/contracts/email.d.ts +182 -0
- package/dist/communications/contracts/email.js +1 -0
- package/dist/communications/contracts/guideCard.d.ts +3 -0
- package/dist/communications/contracts/guideCard.js +26 -0
- package/dist/communications/contracts/index.d.ts +51 -0
- package/dist/communications/contracts/index.js +42 -0
- package/dist/communications/contracts/inquiryContent.d.ts +32 -0
- package/dist/communications/contracts/inquiryContent.js +33 -0
- package/dist/communications/contracts/invoiceDocumentContent.d.ts +26 -0
- package/dist/communications/contracts/invoiceDocumentContent.js +36 -0
- package/dist/communications/contracts/marketingAutomation.d.ts +52 -0
- package/dist/communications/contracts/marketingAutomation.js +1 -0
- package/dist/communications/contracts/newsletter.d.ts +63 -0
- package/dist/communications/contracts/newsletter.js +1 -0
- package/dist/communications/contracts/newsletterWebhook.d.ts +26 -0
- package/dist/communications/contracts/newsletterWebhook.js +1 -0
- package/dist/communications/contracts/optOutContent.d.ts +11 -0
- package/dist/communications/contracts/optOutContent.js +17 -0
- package/dist/communications/contracts/orderCanceled.d.ts +25 -0
- package/dist/communications/contracts/orderCanceled.js +27 -0
- package/dist/communications/contracts/orderDraft.d.ts +46 -0
- package/dist/communications/contracts/orderDraft.js +46 -0
- package/dist/communications/contracts/orderPaid.d.ts +53 -0
- package/dist/communications/contracts/orderPaid.js +71 -0
- package/dist/communications/contracts/orderRefunded.d.ts +24 -0
- package/dist/communications/contracts/orderRefunded.js +27 -0
- package/dist/communications/contracts/paymentFailed.d.ts +24 -0
- package/dist/communications/contracts/paymentFailed.js +24 -0
- package/dist/communications/contracts/publicIntake.d.ts +49 -0
- package/dist/communications/contracts/publicIntake.js +1 -0
- package/dist/communications/contracts/render.d.ts +2 -0
- package/dist/communications/contracts/render.js +229 -0
- package/dist/communications/contracts/reorderReminder.d.ts +24 -0
- package/dist/communications/contracts/reorderReminder.js +24 -0
- package/dist/communications/contracts/returnEmails.d.ts +25 -0
- package/dist/communications/contracts/returnEmails.js +62 -0
- package/dist/communications/contracts/reviewEffects.d.ts +26 -0
- package/dist/communications/contracts/reviewEffects.js +25 -0
- package/dist/communications/contracts/reviewRequest.d.ts +26 -0
- package/dist/communications/contracts/reviewRequest.js +24 -0
- package/dist/communications/contracts/roleNotificationContent.d.ts +25 -0
- package/dist/communications/contracts/roleNotificationContent.js +46 -0
- package/dist/communications/contracts/shipmentDelivered.d.ts +23 -0
- package/dist/communications/contracts/shipmentDelivered.js +24 -0
- package/dist/communications/contracts/shipmentDispatched.d.ts +27 -0
- package/dist/communications/contracts/shipmentDispatched.js +35 -0
- package/dist/communications/contracts/shipmentException.d.ts +21 -0
- package/dist/communications/contracts/shipmentException.js +26 -0
- package/dist/communications/contracts/subscriptionActivationActionRequired.d.ts +17 -0
- package/dist/communications/contracts/subscriptionActivationActionRequired.js +22 -0
- package/dist/communications/contracts/subscriptionAddressChanged.d.ts +19 -0
- package/dist/communications/contracts/subscriptionAddressChanged.js +25 -0
- package/dist/communications/contracts/subscriptionCancelled.d.ts +19 -0
- package/dist/communications/contracts/subscriptionCancelled.js +25 -0
- package/dist/communications/contracts/subscriptionCycleSkipped.d.ts +25 -0
- package/dist/communications/contracts/subscriptionCycleSkipped.js +40 -0
- package/dist/communications/contracts/subscriptionDeliveryRescheduled.d.ts +25 -0
- package/dist/communications/contracts/subscriptionDeliveryRescheduled.js +39 -0
- package/dist/communications/contracts/subscriptionEmailContent.d.ts +145 -0
- package/dist/communications/contracts/subscriptionEmailContent.js +1 -0
- package/dist/communications/contracts/subscriptionPackageChanged.d.ts +20 -0
- package/dist/communications/contracts/subscriptionPackageChanged.js +26 -0
- package/dist/communications/contracts/subscriptionPauseReminder.d.ts +23 -0
- package/dist/communications/contracts/subscriptionPauseReminder.js +29 -0
- package/dist/communications/contracts/subscriptionPaused.d.ts +21 -0
- package/dist/communications/contracts/subscriptionPaused.js +25 -0
- package/dist/communications/contracts/subscriptionPaymentExpired.d.ts +34 -0
- package/dist/communications/contracts/subscriptionPaymentExpired.js +37 -0
- package/dist/communications/contracts/subscriptionPaymentFailed.d.ts +49 -0
- package/dist/communications/contracts/subscriptionPaymentFailed.js +56 -0
- package/dist/communications/contracts/subscriptionPaymentRecovered.d.ts +19 -0
- package/dist/communications/contracts/subscriptionPaymentRecovered.js +22 -0
- package/dist/communications/contracts/subscriptionRenewalAtRisk.d.ts +36 -0
- package/dist/communications/contracts/subscriptionRenewalAtRisk.js +36 -0
- package/dist/communications/contracts/subscriptionRenewalUpcoming.d.ts +49 -0
- package/dist/communications/contracts/subscriptionRenewalUpcoming.js +43 -0
- package/dist/communications/contracts/subscriptionResumed.d.ts +23 -0
- package/dist/communications/contracts/subscriptionResumed.js +25 -0
- package/dist/communications/contracts/subscriptionWelcome.d.ts +44 -0
- package/dist/communications/contracts/subscriptionWelcome.js +45 -0
- package/dist/communications/contracts/subscriptionWinback.d.ts +21 -0
- package/dist/communications/contracts/subscriptionWinback.js +28 -0
- package/dist/communications/contracts/transactionalDelivery.d.ts +42 -0
- package/dist/communications/contracts/transactionalDelivery.js +1 -0
- package/dist/communications/contracts/types.d.ts +46 -0
- package/dist/communications/contracts/types.js +1 -0
- package/dist/communications/contribution.d.ts +10 -0
- package/dist/communications/contribution.js +24 -0
- package/dist/communications/deliveryReconciliation.d.ts +64 -0
- package/dist/communications/deliveryReconciliation.js +60 -0
- package/dist/communications/emailEgress.d.ts +38 -0
- package/dist/communications/emailEgress.js +100 -0
- package/dist/communications/emailHealthAssessment.d.ts +39 -0
- package/dist/communications/emailHealthAssessment.js +59 -0
- package/dist/communications/emailHealthMetricsPort.d.ts +17 -0
- package/dist/communications/emailHealthMetricsPort.js +1 -0
- package/dist/communications/emailNotificationControl.d.ts +27 -0
- package/dist/communications/emailNotificationControl.js +10 -0
- package/dist/communications/emailObservation.d.ts +28 -0
- package/dist/communications/emailObservation.js +23 -0
- package/dist/communications/emailTransport.d.ts +82 -0
- package/dist/communications/emailTransport.js +95 -0
- package/dist/communications/errors.d.ts +15 -0
- package/dist/communications/errors.js +30 -0
- package/dist/communications/index.d.ts +46 -0
- package/dist/communications/index.js +38 -0
- package/dist/communications/integrationEventSignature.d.ts +15 -0
- package/dist/communications/integrationEventSignature.js +37 -0
- package/dist/communications/managedTransactionalDeliveryStore.d.ts +12 -0
- package/dist/communications/managedTransactionalDeliveryStore.js +49 -0
- package/dist/communications/nativeOperations.d.ts +79 -0
- package/dist/communications/nativeOperations.js +3 -0
- package/dist/communications/newsletterIntegrationContracts.d.ts +130 -0
- package/dist/communications/newsletterIntegrationContracts.js +128 -0
- package/dist/communications/newsletterWebhookPort.d.ts +11 -0
- package/dist/communications/newsletterWebhookPort.js +84 -0
- package/dist/communications/newsletterWebhookProcessing.d.ts +17 -0
- package/dist/communications/newsletterWebhookProcessing.js +71 -0
- package/dist/communications/originPolicy.d.ts +40 -0
- package/dist/communications/originPolicy.js +100 -0
- package/dist/communications/postgresCommunicationSync.d.ts +79 -0
- package/dist/communications/postgresCommunicationSync.js +111 -0
- package/dist/communications/postgresConsentEvaluator.d.ts +19 -0
- package/dist/communications/postgresConsentEvaluator.js +43 -0
- package/dist/communications/postgresDeliveryReconciliation.d.ts +3 -0
- package/dist/communications/postgresDeliveryReconciliation.js +113 -0
- package/dist/communications/postgresNativeOperations.d.ts +13 -0
- package/dist/communications/postgresNativeOperations.js +63 -0
- package/dist/communications/postgresNotificationRecipients.d.ts +37 -0
- package/dist/communications/postgresNotificationRecipients.js +60 -0
- package/dist/communications/postgresTransactionalDeliveryStore.d.ts +7 -0
- package/dist/communications/postgresTransactionalDeliveryStore.js +55 -0
- package/dist/communications/preferencesToken.d.ts +10 -0
- package/dist/communications/preferencesToken.js +40 -0
- package/dist/communications/publicPreferenceToken.d.ts +24 -0
- package/dist/communications/publicPreferenceToken.js +53 -0
- package/dist/communications/shipmentNotifications.d.ts +34 -0
- package/dist/communications/shipmentNotifications.js +61 -0
- package/dist/communications/sql.d.ts +26 -0
- package/dist/communications/sql.js +7 -0
- package/dist/communications/standardWebhooks.d.ts +14 -0
- package/dist/communications/standardWebhooks.js +73 -0
- package/dist/communications/status.d.ts +11 -0
- package/dist/communications/status.js +36 -0
- package/dist/communications/transactionalDelivery.d.ts +19 -0
- package/dist/communications/transactionalDelivery.js +96 -0
- package/dist/communications/transactionalDeliveryIdentifier.d.ts +3 -0
- package/dist/communications/transactionalDeliveryIdentifier.js +6 -0
- package/dist/communications/unsubscribeToken.d.ts +77 -0
- package/dist/communications/unsubscribeToken.js +150 -0
- package/dist/communications/validation.d.ts +2 -0
- package/dist/communications/validation.js +3 -0
- package/dist/http/index.d.ts +1 -0
- package/dist/http/index.js +1 -0
- package/dist/http/webhookSignature.d.ts +42 -0
- package/dist/http/webhookSignature.js +86 -0
- package/dist/identity/adminAuthBinding.d.ts +28 -0
- package/dist/identity/adminAuthBinding.js +66 -0
- package/dist/identity/adminAuthorization.d.ts +34 -0
- package/dist/identity/adminAuthorization.js +72 -0
- package/dist/identity/adminContracts.d.ts +70 -0
- package/dist/identity/adminContracts.js +43 -0
- package/dist/identity/adminMagicLinkHandler.d.ts +39 -0
- package/dist/identity/adminMagicLinkHandler.js +94 -0
- package/dist/identity/adminMeHandler.d.ts +15 -0
- package/dist/identity/adminMeHandler.js +49 -0
- package/dist/identity/adminPreflight.d.ts +16 -0
- package/dist/identity/adminPreflight.js +38 -0
- package/dist/identity/adminUserActionPorts.d.ts +31 -0
- package/dist/identity/adminUserActionPorts.js +51 -0
- package/dist/identity/adminUserHandlers.d.ts +38 -0
- package/dist/identity/adminUserHandlers.js +140 -0
- package/dist/identity/authVerifyUrl.d.ts +6 -0
- package/dist/identity/authVerifyUrl.js +54 -0
- package/dist/identity/contracts/contracts.d.ts +8 -0
- package/dist/identity/contracts/contracts.js +2 -0
- package/dist/identity/contracts/emailTrust.d.ts +3 -0
- package/dist/identity/contracts/emailTrust.js +4 -0
- package/dist/identity/contracts/index.d.ts +8 -0
- package/dist/identity/contracts/index.js +8 -0
- package/dist/identity/contracts/oidc.d.ts +3 -0
- package/dist/identity/contracts/oidc.js +9 -0
- package/dist/identity/contracts/operatorAuth.d.ts +35 -0
- package/dist/identity/contracts/operatorAuth.js +53 -0
- package/dist/identity/contracts/operatorInvitations.d.ts +37 -0
- package/dist/identity/contracts/operatorInvitations.js +1 -0
- package/dist/identity/contracts/ports.d.ts +22 -0
- package/dist/identity/contracts/ports.js +1 -0
- package/dist/identity/contracts/privacy.d.ts +62 -0
- package/dist/identity/contracts/privacy.js +99 -0
- package/dist/identity/contracts/providerList.d.ts +3 -0
- package/dist/identity/contracts/providerList.js +11 -0
- package/dist/identity/contracts/types.d.ts +16 -0
- package/dist/identity/contracts/types.js +4 -0
- package/dist/identity/contribution.d.ts +8 -0
- package/dist/identity/contribution.js +22 -0
- package/dist/identity/customerAuth.d.ts +8 -0
- package/dist/identity/customerAuth.js +1 -0
- package/dist/identity/customerAuthorization.d.ts +5 -0
- package/dist/identity/customerAuthorization.js +22 -0
- package/dist/identity/customerContracts.d.ts +42 -0
- package/dist/identity/customerContracts.js +43 -0
- package/dist/identity/customerIdentityBinding.d.ts +44 -0
- package/dist/identity/customerIdentityBinding.js +60 -0
- package/dist/identity/customerIdentityVerifier.d.ts +8 -0
- package/dist/identity/customerIdentityVerifier.js +101 -0
- package/dist/identity/customerMagicLinkHandler.d.ts +38 -0
- package/dist/identity/customerMagicLinkHandler.js +115 -0
- package/dist/identity/customerMeHandler.d.ts +11 -0
- package/dist/identity/customerMeHandler.js +46 -0
- package/dist/identity/customerPorts.d.ts +4 -0
- package/dist/identity/customerPorts.js +1 -0
- package/dist/identity/customerSessionBinding.d.ts +38 -0
- package/dist/identity/customerSessionBinding.js +80 -0
- package/dist/identity/customerSessionIssuer.d.ts +10 -0
- package/dist/identity/customerSessionIssuer.js +57 -0
- package/dist/identity/customerVerifyOtpHandler.d.ts +8 -0
- package/dist/identity/customerVerifyOtpHandler.js +41 -0
- package/dist/identity/directOperatorInvitationStore.d.ts +19 -0
- package/dist/identity/directOperatorInvitationStore.js +193 -0
- package/dist/identity/emailTrustPolicy.d.ts +14 -0
- package/dist/identity/emailTrustPolicy.js +16 -0
- package/dist/identity/identityPersonalDataContributor.d.ts +7 -0
- package/dist/identity/identityPersonalDataContributor.js +46 -0
- package/dist/identity/identityReadiness.d.ts +10 -0
- package/dist/identity/identityReadiness.js +25 -0
- package/dist/identity/index.d.ts +67 -0
- package/dist/identity/index.js +66 -0
- package/dist/identity/inviteAdminUserUseCase.d.ts +89 -0
- package/dist/identity/inviteAdminUserUseCase.js +75 -0
- package/dist/identity/jwtLibrary.d.ts +54 -0
- package/dist/identity/jwtLibrary.js +1 -0
- package/dist/identity/machineActorWriteFence.d.ts +4 -0
- package/dist/identity/machineActorWriteFence.js +13 -0
- package/dist/identity/magicLinkPorts.d.ts +28 -0
- package/dist/identity/magicLinkPorts.js +1 -0
- package/dist/identity/managedAccountLinkStore.d.ts +2 -0
- package/dist/identity/managedAccountLinkStore.js +93 -0
- package/dist/identity/managedAdminAuthVerifier.d.ts +7 -0
- package/dist/identity/managedAdminAuthVerifier.js +27 -0
- package/dist/identity/managedAdminUserGateways.d.ts +123 -0
- package/dist/identity/managedAdminUserGateways.js +127 -0
- package/dist/identity/managedClient.d.ts +90 -0
- package/dist/identity/managedClient.js +10 -0
- package/dist/identity/managedClientAuthLink.d.ts +3 -0
- package/dist/identity/managedClientAuthLink.js +115 -0
- package/dist/identity/managedCustomerMe.d.ts +13 -0
- package/dist/identity/managedCustomerMe.js +30 -0
- package/dist/identity/managedEmailTrustPolicy.d.ts +11 -0
- package/dist/identity/managedEmailTrustPolicy.js +105 -0
- package/dist/identity/managedIdentityVerifier.d.ts +2 -0
- package/dist/identity/managedIdentityVerifier.js +16 -0
- package/dist/identity/managedPrivacy.d.ts +4 -0
- package/dist/identity/managedPrivacy.js +39 -0
- package/dist/identity/messages.d.ts +29 -0
- package/dist/identity/messages.js +39 -0
- package/dist/identity/oidcIdentityVerifier.d.ts +45 -0
- package/dist/identity/oidcIdentityVerifier.js +309 -0
- package/dist/identity/oidcPrincipal.d.ts +2 -0
- package/dist/identity/oidcPrincipal.js +10 -0
- package/dist/identity/operatorAdminAuth.d.ts +6 -0
- package/dist/identity/operatorAdminAuth.js +13 -0
- package/dist/identity/operatorAuthHandlers.d.ts +18 -0
- package/dist/identity/operatorAuthHandlers.js +71 -0
- package/dist/identity/operatorIdentityVerifier.d.ts +8 -0
- package/dist/identity/operatorIdentityVerifier.js +19 -0
- package/dist/identity/operatorInvitationLifecycle.d.ts +7 -0
- package/dist/identity/operatorInvitationLifecycle.js +15 -0
- package/dist/identity/operatorInvitationPorts.d.ts +31 -0
- package/dist/identity/operatorInvitationPorts.js +1 -0
- package/dist/identity/operatorPorts.d.ts +37 -0
- package/dist/identity/operatorPorts.js +1 -0
- package/dist/identity/operatorSession.d.ts +13 -0
- package/dist/identity/operatorSession.js +31 -0
- package/dist/identity/operatorTokenAdminAuth.d.ts +15 -0
- package/dist/identity/operatorTokenAdminAuth.js +50 -0
- package/dist/identity/personalDataRegistry.d.ts +4 -0
- package/dist/identity/personalDataRegistry.js +11 -0
- package/dist/identity/platformAdminAuth.d.ts +15 -0
- package/dist/identity/platformAdminAuth.js +1 -0
- package/dist/identity/ports.d.ts +127 -0
- package/dist/identity/ports.js +38 -0
- package/dist/identity/postgresAccountLinkStore.d.ts +7 -0
- package/dist/identity/postgresAccountLinkStore.js +52 -0
- package/dist/identity/postgresCustomerMe.d.ts +3 -0
- package/dist/identity/postgresCustomerMe.js +21 -0
- package/dist/identity/postgresCustomerRecovery.d.ts +11 -0
- package/dist/identity/postgresCustomerRecovery.js +57 -0
- package/dist/identity/postgresOperatorIdentity.d.ts +5 -0
- package/dist/identity/postgresOperatorIdentity.js +137 -0
- package/dist/identity/postgresPrivacy.d.ts +7 -0
- package/dist/identity/postgresPrivacy.js +126 -0
- package/dist/identity/privacyHandlers.d.ts +10 -0
- package/dist/identity/privacyHandlers.js +35 -0
- package/dist/identity/privacyPorts.d.ts +72 -0
- package/dist/identity/privacyPorts.js +8 -0
- package/dist/identity/privacyUseCases.d.ts +5 -0
- package/dist/identity/privacyUseCases.js +55 -0
- package/dist/identity/reconcileAccountForPrincipal.d.ts +20 -0
- package/dist/identity/reconcileAccountForPrincipal.js +66 -0
- package/dist/identity/reconcileAccountHandler.d.ts +11 -0
- package/dist/identity/reconcileAccountHandler.js +30 -0
- package/dist/identity/removeAdminUserUseCase.d.ts +31 -0
- package/dist/identity/removeAdminUserUseCase.js +60 -0
- package/dist/identity/response.d.ts +3 -0
- package/dist/identity/response.js +2 -0
- package/dist/identity/sql.d.ts +44 -0
- package/dist/identity/sql.js +10 -0
- package/package.json +22 -2
- package/release-gates.json +63 -8
- package/sql/20260807190000_comms_outbox_rail.sql +329 -0
- package/sql/20260810120001_transactional_delivery_receipts.sql +209 -0
- package/sql/20260810180001_self_host_actor_auth.sql +40 -0
- package/sql/20260810204057_customer_identity_read.sql +31 -0
- package/sql/20260813120000_communications_control_plane.sql +568 -0
- package/sql/20260814090000_customer_selfservice_recovery.sql +477 -0
- package/sql/20260901143000_admin_membership_authority_foundation.sql +234 -0
- package/sql/20261018120000_identity_operator_invitations.sql +42 -0
- package/sql/20261018180000_identity_operator_challenges.sql +56 -0
- package/sql/20261018190000_identity_privacy_erasures.sql +15 -0
- package/sql/20261019200000_communications_native_operations.sql +68 -0
- package/src/communications/accountingDocumentDelivery.ts +63 -0
- package/src/communications/authEmailError.ts +10 -0
- package/src/communications/authEmailPorts.ts +2 -0
- package/src/communications/authSendEmailHook.ts +310 -0
- package/src/communications/capturedTransactionalDelivery.ts +29 -0
- package/src/communications/communicationSync.ts +96 -0
- package/src/communications/communicationSyncWorker.ts +302 -0
- package/src/communications/consentPolicy.ts +82 -0
- package/src/communications/consentPurposeRegistry.ts +31 -0
- package/src/communications/contracts/abandonedCart.ts +64 -0
- package/src/communications/contracts/authEmail.ts +73 -0
- package/src/communications/contracts/backInStock.ts +69 -0
- package/src/communications/contracts/blocks.ts +47 -0
- package/src/communications/contracts/checkoutExpired.ts +62 -0
- package/src/communications/contracts/checkoutRecovery.ts +68 -0
- package/src/communications/contracts/commerceEmailContent.ts +189 -0
- package/src/communications/contracts/commerceEngagementEmailContent.ts +106 -0
- package/src/communications/contracts/consent.ts +13 -0
- package/src/communications/contracts/email.ts +210 -0
- package/src/communications/contracts/guideCard.ts +34 -0
- package/src/communications/contracts/index.ts +51 -0
- package/src/communications/contracts/inquiryContent.ts +53 -0
- package/src/communications/contracts/invoiceDocumentContent.ts +57 -0
- package/src/communications/contracts/marketingAutomation.ts +45 -0
- package/src/communications/contracts/newsletter.ts +78 -0
- package/src/communications/contracts/newsletterWebhook.ts +23 -0
- package/src/communications/contracts/optOutContent.ts +23 -0
- package/src/communications/contracts/orderCanceled.ts +64 -0
- package/src/communications/contracts/orderDraft.ts +112 -0
- package/src/communications/contracts/orderPaid.ts +147 -0
- package/src/communications/contracts/orderRefunded.ts +63 -0
- package/src/communications/contracts/paymentFailed.ts +59 -0
- package/src/communications/contracts/publicIntake.ts +53 -0
- package/src/communications/contracts/render.ts +271 -0
- package/src/communications/contracts/reorderReminder.ts +59 -0
- package/src/communications/contracts/returnEmails.ts +113 -0
- package/src/communications/contracts/reviewEffects.ts +60 -0
- package/src/communications/contracts/reviewRequest.ts +59 -0
- package/src/communications/contracts/roleNotificationContent.ts +65 -0
- package/src/communications/contracts/shipmentDelivered.ts +59 -0
- package/src/communications/contracts/shipmentDispatched.ts +77 -0
- package/src/communications/contracts/shipmentException.ts +62 -0
- package/src/communications/contracts/subscriptionActivationActionRequired.ts +37 -0
- package/src/communications/contracts/subscriptionAddressChanged.ts +56 -0
- package/src/communications/contracts/subscriptionCancelled.ts +57 -0
- package/src/communications/contracts/subscriptionCycleSkipped.ts +80 -0
- package/src/communications/contracts/subscriptionDeliveryRescheduled.ts +79 -0
- package/src/communications/contracts/subscriptionEmailContent.ts +163 -0
- package/src/communications/contracts/subscriptionPackageChanged.ts +59 -0
- package/src/communications/contracts/subscriptionPauseReminder.ts +63 -0
- package/src/communications/contracts/subscriptionPaused.ts +58 -0
- package/src/communications/contracts/subscriptionPaymentExpired.ts +83 -0
- package/src/communications/contracts/subscriptionPaymentFailed.ts +117 -0
- package/src/communications/contracts/subscriptionPaymentRecovered.ts +50 -0
- package/src/communications/contracts/subscriptionRenewalAtRisk.ts +85 -0
- package/src/communications/contracts/subscriptionRenewalUpcoming.ts +103 -0
- package/src/communications/contracts/subscriptionResumed.ts +60 -0
- package/src/communications/contracts/subscriptionWelcome.ts +102 -0
- package/src/communications/contracts/subscriptionWinback.ts +62 -0
- package/src/communications/contracts/transactionalDelivery.ts +43 -0
- package/src/communications/contracts/types.ts +58 -0
- package/src/communications/contribution.ts +33 -0
- package/src/communications/deliveryReconciliation.ts +108 -0
- package/src/communications/emailEgress.ts +111 -0
- package/src/communications/emailHealthAssessment.ts +106 -0
- package/src/communications/emailHealthMetricsPort.ts +17 -0
- package/src/communications/emailNotificationControl.ts +28 -0
- package/src/communications/emailObservation.ts +43 -0
- package/src/communications/emailTransport.ts +167 -0
- package/src/communications/errors.ts +34 -0
- package/src/communications/index.ts +46 -0
- package/src/communications/integrationEventSignature.ts +49 -0
- package/src/communications/managedTransactionalDeliveryStore.ts +59 -0
- package/src/communications/nativeOperations.ts +40 -0
- package/src/communications/newsletterIntegrationContracts.ts +154 -0
- package/src/communications/newsletterWebhookPort.ts +104 -0
- package/src/communications/newsletterWebhookProcessing.ts +102 -0
- package/src/communications/originPolicy.ts +151 -0
- package/src/communications/postgresCommunicationSync.ts +127 -0
- package/src/communications/postgresConsentEvaluator.ts +49 -0
- package/src/communications/postgresDeliveryReconciliation.ts +101 -0
- package/src/communications/postgresNativeOperations.ts +55 -0
- package/src/communications/postgresNotificationRecipients.ts +57 -0
- package/src/communications/postgresTransactionalDeliveryStore.ts +79 -0
- package/src/communications/preferencesToken.ts +62 -0
- package/src/communications/publicPreferenceToken.ts +68 -0
- package/src/communications/shipmentNotifications.ts +78 -0
- package/src/communications/sql.ts +7 -0
- package/src/communications/standardWebhooks.ts +84 -0
- package/src/communications/status.ts +51 -0
- package/src/communications/transactionalDelivery.ts +114 -0
- package/src/communications/transactionalDeliveryIdentifier.ts +9 -0
- package/src/communications/unsubscribeToken.ts +186 -0
- package/src/communications/validation.ts +3 -0
- package/src/http/index.ts +1 -0
- package/src/http/webhookSignature.ts +96 -0
- package/src/identity/adminAuthBinding.ts +76 -0
- package/src/identity/adminAuthorization.ts +106 -0
- package/src/identity/adminContracts.ts +52 -0
- package/src/identity/adminMagicLinkHandler.ts +132 -0
- package/src/identity/adminMeHandler.ts +64 -0
- package/src/identity/adminPreflight.ts +46 -0
- package/src/identity/adminUserActionPorts.ts +78 -0
- package/src/identity/adminUserHandlers.ts +174 -0
- package/src/identity/authVerifyUrl.ts +56 -0
- package/src/identity/contracts/contracts.ts +15 -0
- package/src/identity/contracts/emailTrust.ts +5 -0
- package/src/identity/contracts/index.ts +8 -0
- package/src/identity/contracts/oidc.ts +10 -0
- package/src/identity/contracts/operatorAuth.ts +61 -0
- package/src/identity/contracts/operatorInvitations.ts +32 -0
- package/src/identity/contracts/ports.ts +25 -0
- package/src/identity/contracts/privacy.ts +86 -0
- package/src/identity/contracts/providerList.ts +13 -0
- package/src/identity/contracts/types.ts +25 -0
- package/src/identity/contribution.ts +29 -0
- package/src/identity/customerAuth.ts +3 -0
- package/src/identity/customerAuthorization.ts +38 -0
- package/src/identity/customerContracts.ts +52 -0
- package/src/identity/customerIdentityBinding.ts +125 -0
- package/src/identity/customerIdentityVerifier.ts +141 -0
- package/src/identity/customerMagicLinkHandler.ts +171 -0
- package/src/identity/customerMeHandler.ts +64 -0
- package/src/identity/customerPorts.ts +2 -0
- package/src/identity/customerSessionBinding.ts +114 -0
- package/src/identity/customerSessionIssuer.ts +71 -0
- package/src/identity/customerVerifyOtpHandler.ts +44 -0
- package/src/identity/directOperatorInvitationStore.ts +178 -0
- package/src/identity/emailTrustPolicy.ts +16 -0
- package/src/identity/identityPersonalDataContributor.ts +48 -0
- package/src/identity/identityReadiness.ts +26 -0
- package/src/identity/index.ts +69 -0
- package/src/identity/inviteAdminUserUseCase.ts +134 -0
- package/src/identity/jwtLibrary.ts +24 -0
- package/src/identity/machineActorWriteFence.ts +19 -0
- package/src/identity/magicLinkPorts.ts +7 -0
- package/src/identity/managedAccountLinkStore.ts +105 -0
- package/src/identity/managedAdminAuthVerifier.ts +40 -0
- package/src/identity/managedAdminUserGateways.ts +164 -0
- package/src/identity/managedClient.ts +58 -0
- package/src/identity/managedClientAuthLink.ts +120 -0
- package/src/identity/managedCustomerMe.ts +52 -0
- package/src/identity/managedEmailTrustPolicy.ts +90 -0
- package/src/identity/managedIdentityVerifier.ts +20 -0
- package/src/identity/managedPrivacy.ts +37 -0
- package/src/identity/messages.ts +41 -0
- package/src/identity/oidcIdentityVerifier.ts +229 -0
- package/src/identity/oidcPrincipal.ts +10 -0
- package/src/identity/operatorAdminAuth.ts +14 -0
- package/src/identity/operatorAuthHandlers.ts +52 -0
- package/src/identity/operatorIdentityVerifier.ts +19 -0
- package/src/identity/operatorInvitationLifecycle.ts +14 -0
- package/src/identity/operatorInvitationPorts.ts +11 -0
- package/src/identity/operatorPorts.ts +11 -0
- package/src/identity/operatorSession.ts +30 -0
- package/src/identity/operatorTokenAdminAuth.ts +79 -0
- package/src/identity/personalDataRegistry.ts +8 -0
- package/src/identity/platformAdminAuth.ts +7 -0
- package/src/identity/ports.ts +158 -0
- package/src/identity/postgresAccountLinkStore.ts +49 -0
- package/src/identity/postgresCustomerMe.ts +33 -0
- package/src/identity/postgresCustomerRecovery.ts +72 -0
- package/src/identity/postgresOperatorIdentity.ts +123 -0
- package/src/identity/postgresPrivacy.ts +117 -0
- package/src/identity/privacyHandlers.ts +33 -0
- package/src/identity/privacyPorts.ts +52 -0
- package/src/identity/privacyUseCases.ts +48 -0
- package/src/identity/reconcileAccountForPrincipal.ts +99 -0
- package/src/identity/reconcileAccountHandler.ts +36 -0
- package/src/identity/removeAdminUserUseCase.ts +85 -0
- package/src/identity/response.ts +3 -0
- package/src/identity/sql.ts +10 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { guideCardBlock } from "./guideCard.js";
|
|
2
|
+
import { heading, paragraph, } from "./blocks.js";
|
|
3
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
4
|
+
export function createShipmentDeliveredContentFactory(input) {
|
|
5
|
+
const { commerceEmailContent, formatCustomerOrderReference } = input;
|
|
6
|
+
function shipmentDeliveredEmailContent(locale, vars, signoff) {
|
|
7
|
+
const copy = commerceEmailContent.shipmentDelivered[locale];
|
|
8
|
+
const orderRef = formatCustomerOrderReference(vars.orderId, commerceEmailContent.orderRefPrefix);
|
|
9
|
+
const blocks = [
|
|
10
|
+
heading(copy.heading),
|
|
11
|
+
paragraph(copy.greeting(vars.firstName)),
|
|
12
|
+
paragraph(copy.intro(orderRef, vars.contextName ?? null)),
|
|
13
|
+
guideCardBlock(copy.startGuide, vars.siteOrigin, vars.contextName ?? null),
|
|
14
|
+
];
|
|
15
|
+
blocks.push(paragraph(copy.outro));
|
|
16
|
+
blocks.push(paragraph(signoff));
|
|
17
|
+
return {
|
|
18
|
+
subject: copy.subject(orderRef),
|
|
19
|
+
preheader: copy.preheader,
|
|
20
|
+
blocks,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
return { shipmentDeliveredEmailContent };
|
|
24
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { CommerceEmailContent } from "./commerceEmailContent.js";
|
|
2
|
+
import type { Locale } from "./email.js";
|
|
3
|
+
import { type EmailBlock } from "./blocks.js";
|
|
4
|
+
export interface ShipmentDispatchedEmailVars {
|
|
5
|
+
firstName: string | null;
|
|
6
|
+
orderId: string;
|
|
7
|
+
/** Opaque carrier tracking number, or null when none is available. */
|
|
8
|
+
trackingNumber: string | null;
|
|
9
|
+
/** Absolute tracking URL (carrier page); rendered as a "track parcel" link. */
|
|
10
|
+
trackingUrl?: string | null;
|
|
11
|
+
/** Site origin (absolute, no trailing slash) the guide links are built on. */
|
|
12
|
+
siteOrigin: string;
|
|
13
|
+
/** Optional deployment-specific context consumed by the selected copy pack. */
|
|
14
|
+
contextName?: string | null;
|
|
15
|
+
}
|
|
16
|
+
export interface ShipmentDispatchedEmailContent {
|
|
17
|
+
subject: string;
|
|
18
|
+
preheader: string;
|
|
19
|
+
blocks: EmailBlock[];
|
|
20
|
+
}
|
|
21
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
22
|
+
export declare function createShipmentDispatchedContentFactory(input: {
|
|
23
|
+
commerceEmailContent: Pick<CommerceEmailContent, "shipmentDispatched" | "orderRefPrefix">;
|
|
24
|
+
formatCustomerOrderReference: (orderId: string, prefix: string) => string;
|
|
25
|
+
}): {
|
|
26
|
+
shipmentDispatchedEmailContent: (locale: Locale, vars: ShipmentDispatchedEmailVars, signoff: string) => ShipmentDispatchedEmailContent;
|
|
27
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { guideCardBlock } from "./guideCard.js";
|
|
2
|
+
import { accentBox, dataTable, heading, linkParagraph, paragraph, } from "./blocks.js";
|
|
3
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
4
|
+
export function createShipmentDispatchedContentFactory(input) {
|
|
5
|
+
const { commerceEmailContent, formatCustomerOrderReference } = input;
|
|
6
|
+
function shipmentDispatchedEmailContent(locale, vars, signoff) {
|
|
7
|
+
const copy = commerceEmailContent.shipmentDispatched[locale];
|
|
8
|
+
const orderRef = formatCustomerOrderReference(vars.orderId, commerceEmailContent.orderRefPrefix);
|
|
9
|
+
const blocks = [
|
|
10
|
+
heading(copy.heading),
|
|
11
|
+
paragraph(copy.greeting(vars.firstName)),
|
|
12
|
+
paragraph(copy.intro(orderRef)),
|
|
13
|
+
];
|
|
14
|
+
// Tracking is the job-to-be-done of this message: the number and the
|
|
15
|
+
// carrier page share one box, and the guide card is the only button.
|
|
16
|
+
const trackLink = vars.trackingUrl ? { label: copy.trackParcel, href: vars.trackingUrl } : undefined;
|
|
17
|
+
if (vars.trackingNumber) {
|
|
18
|
+
blocks.push(dataTable([{ label: copy.trackingLabel, value: vars.trackingNumber }], { link: trackLink }));
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
blocks.push(accentBox(copy.noTracking, { label: copy.noTrackingLabel }));
|
|
22
|
+
if (trackLink)
|
|
23
|
+
blocks.push(linkParagraph(trackLink.label, trackLink.href));
|
|
24
|
+
}
|
|
25
|
+
blocks.push(guideCardBlock(copy.accountGuide, vars.siteOrigin, vars.contextName ?? null));
|
|
26
|
+
blocks.push(paragraph(copy.outro(vars.contextName ?? null)));
|
|
27
|
+
blocks.push(paragraph(signoff));
|
|
28
|
+
return {
|
|
29
|
+
subject: copy.subject(orderRef),
|
|
30
|
+
preheader: copy.preheader,
|
|
31
|
+
blocks,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return { shipmentDispatchedEmailContent };
|
|
35
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { CommerceEmailContent } from "./commerceEmailContent.js";
|
|
2
|
+
import type { Locale } from "./email.js";
|
|
3
|
+
import { type EmailBlock } from "./blocks.js";
|
|
4
|
+
export interface ShipmentExceptionEmailVars {
|
|
5
|
+
firstName: string | null;
|
|
6
|
+
orderId: string;
|
|
7
|
+
/** Absolute URL to the customer's order/account page; null/absent → no button. */
|
|
8
|
+
ctaUrl?: string | null;
|
|
9
|
+
}
|
|
10
|
+
export interface ShipmentExceptionEmailContent {
|
|
11
|
+
subject: string;
|
|
12
|
+
preheader: string;
|
|
13
|
+
blocks: EmailBlock[];
|
|
14
|
+
}
|
|
15
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
16
|
+
export declare function createShipmentExceptionContentFactory(input: {
|
|
17
|
+
commerceEmailContent: Pick<CommerceEmailContent, "shipmentException" | "orderRefPrefix">;
|
|
18
|
+
formatCustomerOrderReference: (orderId: string, prefix: string) => string;
|
|
19
|
+
}): {
|
|
20
|
+
shipmentExceptionEmailContent: (locale: Locale, vars: ShipmentExceptionEmailVars, signoff: string) => ShipmentExceptionEmailContent;
|
|
21
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { accentBox, button, heading, paragraph, } from "./blocks.js";
|
|
2
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
3
|
+
export function createShipmentExceptionContentFactory(input) {
|
|
4
|
+
const { commerceEmailContent, formatCustomerOrderReference } = input;
|
|
5
|
+
function shipmentExceptionEmailContent(locale, vars, signoff) {
|
|
6
|
+
const copy = commerceEmailContent.shipmentException[locale];
|
|
7
|
+
const orderRef = formatCustomerOrderReference(vars.orderId, commerceEmailContent.orderRefPrefix);
|
|
8
|
+
const blocks = [
|
|
9
|
+
heading(copy.heading),
|
|
10
|
+
paragraph(copy.greeting(vars.firstName)),
|
|
11
|
+
paragraph(copy.intro(orderRef)),
|
|
12
|
+
accentBox(copy.reassurance, { label: copy.reassuranceLabel }),
|
|
13
|
+
];
|
|
14
|
+
if (vars.ctaUrl) {
|
|
15
|
+
blocks.push(button(copy.cta, vars.ctaUrl));
|
|
16
|
+
}
|
|
17
|
+
blocks.push(paragraph(copy.outro));
|
|
18
|
+
blocks.push(paragraph(signoff));
|
|
19
|
+
return {
|
|
20
|
+
subject: copy.subject(orderRef),
|
|
21
|
+
preheader: copy.preheader,
|
|
22
|
+
blocks,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
return { shipmentExceptionEmailContent };
|
|
26
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { SubscriptionEmailContent } from "./subscriptionEmailContent.js";
|
|
2
|
+
import type { Locale } from "./email.js";
|
|
3
|
+
import { type EmailBlock } from "./blocks.js";
|
|
4
|
+
export interface SubscriptionActivationActionRequiredVars {
|
|
5
|
+
firstName: string | null;
|
|
6
|
+
ctaUrl: string;
|
|
7
|
+
}
|
|
8
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
9
|
+
export declare function createSubscriptionActivationActionRequiredContentFactory(input: {
|
|
10
|
+
subscriptionEmailContent: Pick<SubscriptionEmailContent, "activationActionRequired">;
|
|
11
|
+
}): {
|
|
12
|
+
subscriptionActivationActionRequiredEmailContent: (locale: Locale, vars: SubscriptionActivationActionRequiredVars, signoff: string) => {
|
|
13
|
+
subject: string;
|
|
14
|
+
preheader: string;
|
|
15
|
+
blocks: EmailBlock[];
|
|
16
|
+
};
|
|
17
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { accentBox, button, heading, paragraph } from "./blocks.js";
|
|
2
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
3
|
+
export function createSubscriptionActivationActionRequiredContentFactory(input) {
|
|
4
|
+
const { subscriptionEmailContent } = input;
|
|
5
|
+
function subscriptionActivationActionRequiredEmailContent(locale, vars, signoff) {
|
|
6
|
+
const copy = subscriptionEmailContent.activationActionRequired[locale];
|
|
7
|
+
return {
|
|
8
|
+
subject: copy.subject,
|
|
9
|
+
preheader: copy.preheader,
|
|
10
|
+
blocks: [
|
|
11
|
+
heading(copy.heading),
|
|
12
|
+
paragraph(copy.greeting(vars.firstName)),
|
|
13
|
+
paragraph(copy.intro),
|
|
14
|
+
accentBox(copy.facts),
|
|
15
|
+
button(copy.cta, vars.ctaUrl),
|
|
16
|
+
paragraph(copy.outro),
|
|
17
|
+
paragraph(signoff),
|
|
18
|
+
],
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
return { subscriptionActivationActionRequiredEmailContent };
|
|
22
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { SubscriptionEmailContent } from "./subscriptionEmailContent.js";
|
|
2
|
+
import type { Locale } from "./email.js";
|
|
3
|
+
import { type EmailBlock } from "./blocks.js";
|
|
4
|
+
export interface SubscriptionAddressChangedEmailVars {
|
|
5
|
+
firstName: string | null;
|
|
6
|
+
/** Absolute CTA URL (manage subscription); null/absent → no button. */
|
|
7
|
+
ctaUrl?: string | null;
|
|
8
|
+
}
|
|
9
|
+
export interface SubscriptionAddressChangedEmailContent {
|
|
10
|
+
subject: string;
|
|
11
|
+
preheader: string;
|
|
12
|
+
blocks: EmailBlock[];
|
|
13
|
+
}
|
|
14
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
15
|
+
export declare function createSubscriptionAddressChangedContentFactory(input: {
|
|
16
|
+
subscriptionEmailContent: Pick<SubscriptionEmailContent, "addressChanged">;
|
|
17
|
+
}): {
|
|
18
|
+
subscriptionAddressChangedEmailContent: (locale: Locale, vars: SubscriptionAddressChangedEmailVars, signoff: string) => SubscriptionAddressChangedEmailContent;
|
|
19
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { accentBox, button, heading, paragraph, } from "./blocks.js";
|
|
2
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
3
|
+
export function createSubscriptionAddressChangedContentFactory(input) {
|
|
4
|
+
const { subscriptionEmailContent } = input;
|
|
5
|
+
function subscriptionAddressChangedEmailContent(locale, vars, signoff) {
|
|
6
|
+
const copy = subscriptionEmailContent.addressChanged[locale];
|
|
7
|
+
const blocks = [
|
|
8
|
+
heading(copy.heading),
|
|
9
|
+
paragraph(copy.greeting(vars.firstName)),
|
|
10
|
+
paragraph(copy.intro),
|
|
11
|
+
accentBox(copy.reassurance),
|
|
12
|
+
];
|
|
13
|
+
if (vars.ctaUrl) {
|
|
14
|
+
blocks.push(button(copy.cta, vars.ctaUrl));
|
|
15
|
+
}
|
|
16
|
+
blocks.push(paragraph(copy.outro));
|
|
17
|
+
blocks.push(paragraph(signoff));
|
|
18
|
+
return {
|
|
19
|
+
subject: copy.subject,
|
|
20
|
+
preheader: copy.preheader,
|
|
21
|
+
blocks,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
return { subscriptionAddressChangedEmailContent };
|
|
25
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { SubscriptionEmailContent } from "./subscriptionEmailContent.js";
|
|
2
|
+
import type { Locale } from "./email.js";
|
|
3
|
+
import { type EmailBlock } from "./blocks.js";
|
|
4
|
+
export interface SubscriptionCancelledEmailVars {
|
|
5
|
+
firstName: string | null;
|
|
6
|
+
/** Absolute CTA URL (back to shop / re-subscribe); null/absent → no button. */
|
|
7
|
+
ctaUrl?: string | null;
|
|
8
|
+
}
|
|
9
|
+
export interface SubscriptionCancelledEmailContent {
|
|
10
|
+
subject: string;
|
|
11
|
+
preheader: string;
|
|
12
|
+
blocks: EmailBlock[];
|
|
13
|
+
}
|
|
14
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
15
|
+
export declare function createSubscriptionCancelledContentFactory(input: {
|
|
16
|
+
subscriptionEmailContent: Pick<SubscriptionEmailContent, "cancelled">;
|
|
17
|
+
}): {
|
|
18
|
+
subscriptionCancelledEmailContent: (locale: Locale, vars: SubscriptionCancelledEmailVars, signoff: string) => SubscriptionCancelledEmailContent;
|
|
19
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { accentBox, button, heading, paragraph, } from "./blocks.js";
|
|
2
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
3
|
+
export function createSubscriptionCancelledContentFactory(input) {
|
|
4
|
+
const { subscriptionEmailContent } = input;
|
|
5
|
+
function subscriptionCancelledEmailContent(locale, vars, signoff) {
|
|
6
|
+
const copy = subscriptionEmailContent.cancelled[locale];
|
|
7
|
+
const blocks = [
|
|
8
|
+
heading(copy.heading),
|
|
9
|
+
paragraph(copy.greeting(vars.firstName)),
|
|
10
|
+
paragraph(copy.intro),
|
|
11
|
+
accentBox(copy.reassurance),
|
|
12
|
+
];
|
|
13
|
+
blocks.push(paragraph(copy.outro));
|
|
14
|
+
if (vars.ctaUrl) {
|
|
15
|
+
blocks.push(button(copy.cta, vars.ctaUrl));
|
|
16
|
+
}
|
|
17
|
+
blocks.push(paragraph(signoff));
|
|
18
|
+
return {
|
|
19
|
+
subject: copy.subject,
|
|
20
|
+
preheader: copy.preheader,
|
|
21
|
+
blocks,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
return { subscriptionCancelledEmailContent };
|
|
25
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SubscriptionEmailContent } from "./subscriptionEmailContent.js";
|
|
2
|
+
import type { Locale } from "./email.js";
|
|
3
|
+
import { type EmailBlock } from "./blocks.js";
|
|
4
|
+
export interface SubscriptionCycleSkippedEmailVars {
|
|
5
|
+
firstName: string | null;
|
|
6
|
+
/** Localized next CHARGE date after the skip, or null when unavailable. */
|
|
7
|
+
chargeDateLabel?: string | null;
|
|
8
|
+
/** Localized estimated delivery window after the skip, or null when unavailable. */
|
|
9
|
+
deliveryWindowLabel?: string | null;
|
|
10
|
+
/** Localized holiday caveat; present ONLY when a holiday moved the window. */
|
|
11
|
+
holidayNote?: string | null;
|
|
12
|
+
/** Absolute CTA URL (manage subscription); null/absent → no button. */
|
|
13
|
+
ctaUrl?: string | null;
|
|
14
|
+
}
|
|
15
|
+
export interface SubscriptionCycleSkippedEmailContent {
|
|
16
|
+
subject: string;
|
|
17
|
+
preheader: string;
|
|
18
|
+
blocks: EmailBlock[];
|
|
19
|
+
}
|
|
20
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
21
|
+
export declare function createSubscriptionCycleSkippedContentFactory(input: {
|
|
22
|
+
subscriptionEmailContent: Pick<SubscriptionEmailContent, "cycleSkipped">;
|
|
23
|
+
}): {
|
|
24
|
+
subscriptionCycleSkippedEmailContent: (locale: Locale, vars: SubscriptionCycleSkippedEmailVars, signoff: string) => SubscriptionCycleSkippedEmailContent;
|
|
25
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { accentBox, button, dataTable, heading, paragraph, } from "./blocks.js";
|
|
2
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
3
|
+
export function createSubscriptionCycleSkippedContentFactory(input) {
|
|
4
|
+
const { subscriptionEmailContent } = input;
|
|
5
|
+
function subscriptionCycleSkippedEmailContent(locale, vars, signoff) {
|
|
6
|
+
const copy = subscriptionEmailContent.cycleSkipped[locale];
|
|
7
|
+
const hasSchedule = Boolean(vars.chargeDateLabel && vars.deliveryWindowLabel);
|
|
8
|
+
const blocks = [
|
|
9
|
+
heading(copy.heading),
|
|
10
|
+
paragraph(copy.greeting(vars.firstName)),
|
|
11
|
+
paragraph(hasSchedule ? copy.intro : copy.introWithoutDates),
|
|
12
|
+
];
|
|
13
|
+
if (locale === "pl" && hasSchedule) {
|
|
14
|
+
blocks.push(dataTable([
|
|
15
|
+
{ label: copy.deliveryLabel, value: vars.deliveryWindowLabel },
|
|
16
|
+
{ label: copy.chargeLabel, value: vars.chargeDateLabel },
|
|
17
|
+
]));
|
|
18
|
+
}
|
|
19
|
+
const reassurance = [
|
|
20
|
+
...(locale !== "pl" && hasSchedule
|
|
21
|
+
? [copy.dateLine(vars.deliveryWindowLabel, vars.chargeDateLabel)]
|
|
22
|
+
: []),
|
|
23
|
+
...(vars.holidayNote ? [vars.holidayNote] : []),
|
|
24
|
+
...copy.reassurance,
|
|
25
|
+
];
|
|
26
|
+
blocks.push(accentBox(reassurance));
|
|
27
|
+
blocks.push(paragraph(copy.manageLine));
|
|
28
|
+
if (vars.ctaUrl) {
|
|
29
|
+
blocks.push(button(copy.cta, vars.ctaUrl));
|
|
30
|
+
}
|
|
31
|
+
blocks.push(paragraph(copy.outro));
|
|
32
|
+
blocks.push(paragraph(signoff));
|
|
33
|
+
return {
|
|
34
|
+
subject: hasSchedule ? copy.subject : copy.subjectWithoutDates,
|
|
35
|
+
preheader: copy.preheader,
|
|
36
|
+
blocks,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return { subscriptionCycleSkippedEmailContent };
|
|
40
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SubscriptionEmailContent } from "./subscriptionEmailContent.js";
|
|
2
|
+
import type { Locale } from "./email.js";
|
|
3
|
+
import { type EmailBlock } from "./blocks.js";
|
|
4
|
+
export interface SubscriptionDeliveryRescheduledEmailVars {
|
|
5
|
+
firstName: string | null;
|
|
6
|
+
/** Localized new CHARGE date (the date the customer picked), or null. */
|
|
7
|
+
chargeDateLabel?: string | null;
|
|
8
|
+
/** Localized estimated delivery window derived from the new charge date, or null. */
|
|
9
|
+
deliveryWindowLabel?: string | null;
|
|
10
|
+
/** Localized holiday caveat; present ONLY when a holiday moved the window. */
|
|
11
|
+
holidayNote?: string | null;
|
|
12
|
+
/** Absolute CTA URL (manage subscription); null/absent → no button. */
|
|
13
|
+
ctaUrl?: string | null;
|
|
14
|
+
}
|
|
15
|
+
export interface SubscriptionDeliveryRescheduledEmailContent {
|
|
16
|
+
subject: string;
|
|
17
|
+
preheader: string;
|
|
18
|
+
blocks: EmailBlock[];
|
|
19
|
+
}
|
|
20
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
21
|
+
export declare function createSubscriptionDeliveryRescheduledContentFactory(input: {
|
|
22
|
+
subscriptionEmailContent: Pick<SubscriptionEmailContent, "deliveryRescheduled">;
|
|
23
|
+
}): {
|
|
24
|
+
subscriptionDeliveryRescheduledEmailContent: (locale: Locale, vars: SubscriptionDeliveryRescheduledEmailVars, signoff: string) => SubscriptionDeliveryRescheduledEmailContent;
|
|
25
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { accentBox, button, dataTable, heading, paragraph, } from "./blocks.js";
|
|
2
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
3
|
+
export function createSubscriptionDeliveryRescheduledContentFactory(input) {
|
|
4
|
+
const { subscriptionEmailContent } = input;
|
|
5
|
+
function subscriptionDeliveryRescheduledEmailContent(locale, vars, signoff) {
|
|
6
|
+
const copy = subscriptionEmailContent.deliveryRescheduled[locale];
|
|
7
|
+
const hasSchedule = Boolean(vars.chargeDateLabel && vars.deliveryWindowLabel);
|
|
8
|
+
const blocks = [
|
|
9
|
+
heading(copy.heading),
|
|
10
|
+
paragraph(copy.greeting(vars.firstName)),
|
|
11
|
+
paragraph(hasSchedule ? copy.intro : copy.introWithoutDates),
|
|
12
|
+
];
|
|
13
|
+
if (locale === "pl" && hasSchedule) {
|
|
14
|
+
blocks.push(dataTable([
|
|
15
|
+
{ label: copy.deliveryLabel, value: vars.deliveryWindowLabel },
|
|
16
|
+
{ label: copy.chargeLabel, value: vars.chargeDateLabel },
|
|
17
|
+
]));
|
|
18
|
+
}
|
|
19
|
+
const reassurance = [
|
|
20
|
+
...(locale !== "pl" && hasSchedule
|
|
21
|
+
? [copy.dateLine(vars.deliveryWindowLabel, vars.chargeDateLabel)]
|
|
22
|
+
: []),
|
|
23
|
+
...(vars.holidayNote ? [vars.holidayNote] : []),
|
|
24
|
+
...copy.reassurance,
|
|
25
|
+
];
|
|
26
|
+
blocks.push(accentBox(reassurance));
|
|
27
|
+
if (vars.ctaUrl) {
|
|
28
|
+
blocks.push(button(copy.cta, vars.ctaUrl));
|
|
29
|
+
}
|
|
30
|
+
blocks.push(paragraph(copy.outro));
|
|
31
|
+
blocks.push(paragraph(signoff));
|
|
32
|
+
return {
|
|
33
|
+
subject: hasSchedule ? copy.subject : copy.subjectWithoutDates,
|
|
34
|
+
preheader: copy.preheader,
|
|
35
|
+
blocks,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
return { subscriptionDeliveryRescheduledEmailContent };
|
|
39
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import type { Locale } from "./email.js";
|
|
2
|
+
type Localized<T> = Readonly<Record<Locale, T>>;
|
|
3
|
+
export interface SubscriptionBaseCopy {
|
|
4
|
+
subject: string;
|
|
5
|
+
preheader: string;
|
|
6
|
+
heading: string;
|
|
7
|
+
greeting: (firstName: string | null) => string;
|
|
8
|
+
}
|
|
9
|
+
export interface SubscriptionActionCopy extends SubscriptionBaseCopy {
|
|
10
|
+
intro: string;
|
|
11
|
+
reassurance: string[];
|
|
12
|
+
cta: string;
|
|
13
|
+
outro: string;
|
|
14
|
+
}
|
|
15
|
+
export interface SubscriptionActivationCopy extends SubscriptionBaseCopy {
|
|
16
|
+
intro: string;
|
|
17
|
+
facts: string[];
|
|
18
|
+
cta: string;
|
|
19
|
+
outro: string;
|
|
20
|
+
}
|
|
21
|
+
export interface SubscriptionScheduleCopy extends SubscriptionBaseCopy {
|
|
22
|
+
subjectWithoutDates: string;
|
|
23
|
+
intro: string;
|
|
24
|
+
introWithoutDates: string;
|
|
25
|
+
deliveryLabel: string;
|
|
26
|
+
chargeLabel: string;
|
|
27
|
+
dateLine: (window: string, chargeDate: string) => string;
|
|
28
|
+
reassurance: string[];
|
|
29
|
+
cta: string;
|
|
30
|
+
outro: string;
|
|
31
|
+
}
|
|
32
|
+
export interface SubscriptionPackageChangedCopy extends SubscriptionBaseCopy {
|
|
33
|
+
intro: (actionLabel: string | null) => string;
|
|
34
|
+
reassurance: string[];
|
|
35
|
+
actionLabels: Readonly<Record<string, string>>;
|
|
36
|
+
cta: string;
|
|
37
|
+
outro: string;
|
|
38
|
+
}
|
|
39
|
+
export interface SubscriptionPauseReminderCopy extends SubscriptionBaseCopy {
|
|
40
|
+
intro: (brandName: string) => string;
|
|
41
|
+
resume: (resumeDate: string) => string;
|
|
42
|
+
reassurance: string[];
|
|
43
|
+
cta: string;
|
|
44
|
+
outro: string;
|
|
45
|
+
}
|
|
46
|
+
export interface SubscriptionPausedCopy extends SubscriptionBaseCopy {
|
|
47
|
+
intro: string;
|
|
48
|
+
reassurance: (brandName: string) => string[];
|
|
49
|
+
cta: string;
|
|
50
|
+
outro: string;
|
|
51
|
+
}
|
|
52
|
+
export interface SubscriptionRenewalUpcomingCopy extends SubscriptionBaseCopy {
|
|
53
|
+
intro: (contextName: string | null) => string;
|
|
54
|
+
dateLine: (label: string) => string;
|
|
55
|
+
deliveryLine: (window: string) => string;
|
|
56
|
+
editCutoffLine: (label: string) => string;
|
|
57
|
+
noDateLine: string;
|
|
58
|
+
amountLine: (label: string) => string;
|
|
59
|
+
starterGraduationLine: (units: number, cadenceDays: number, detail?: string | null) => string;
|
|
60
|
+
detailsLabel: string;
|
|
61
|
+
manageLine: string;
|
|
62
|
+
cta: string;
|
|
63
|
+
}
|
|
64
|
+
export interface SubscriptionResumedCopy extends SubscriptionBaseCopy {
|
|
65
|
+
intro: (contextName: string | null) => string;
|
|
66
|
+
reassurance: (brandName: string) => string[];
|
|
67
|
+
cta: string;
|
|
68
|
+
outro: string;
|
|
69
|
+
}
|
|
70
|
+
export interface SubscriptionWelcomeCopy extends SubscriptionBaseCopy {
|
|
71
|
+
intro: string;
|
|
72
|
+
cadenceLine: (days: number) => string;
|
|
73
|
+
deliveryLine: (window: string, chargeDate: string) => string;
|
|
74
|
+
editCutoffLine: (label: string) => string;
|
|
75
|
+
fallbackLine: string;
|
|
76
|
+
starterDelivery2Line: (amount: string) => string;
|
|
77
|
+
starterSteadyLine: (units: number, cadenceDays: number, detail?: string | null) => string;
|
|
78
|
+
detailsLabel: string;
|
|
79
|
+
manageLine: string;
|
|
80
|
+
cta: string;
|
|
81
|
+
outro: string;
|
|
82
|
+
}
|
|
83
|
+
export interface SubscriptionWinbackCopy extends SubscriptionBaseCopy {
|
|
84
|
+
intro: string;
|
|
85
|
+
reasonsLabel?: (brandName: string) => string;
|
|
86
|
+
reasons: string[];
|
|
87
|
+
cta: string;
|
|
88
|
+
outro: string;
|
|
89
|
+
}
|
|
90
|
+
export interface SubscriptionPaymentExpiredCopy extends SubscriptionBaseCopy {
|
|
91
|
+
preheaderWithCta: string;
|
|
92
|
+
intro: string;
|
|
93
|
+
detail: (amountLabel: string | null) => string[];
|
|
94
|
+
ctaDetail: string;
|
|
95
|
+
cta: string;
|
|
96
|
+
outro: string;
|
|
97
|
+
}
|
|
98
|
+
export interface SubscriptionPaymentFailedCopy extends SubscriptionBaseCopy {
|
|
99
|
+
intro: string;
|
|
100
|
+
amountLine: (amountLabel: string) => string;
|
|
101
|
+
noAmountLine: string;
|
|
102
|
+
noAmountLineNoRetry: string;
|
|
103
|
+
methodLine: (scheme: string, lastDigits: string) => string;
|
|
104
|
+
reassurance: (attempt: number, dateLabel: string | null) => string;
|
|
105
|
+
noRetryAction: string;
|
|
106
|
+
cta: string;
|
|
107
|
+
outro: string;
|
|
108
|
+
}
|
|
109
|
+
export interface SubscriptionPaymentRecoveredCopy extends SubscriptionBaseCopy {
|
|
110
|
+
intro: string;
|
|
111
|
+
detail: (amountLabel: string | null) => string[];
|
|
112
|
+
outro: string;
|
|
113
|
+
}
|
|
114
|
+
export interface SubscriptionRenewalAtRiskCopy extends SubscriptionBaseCopy {
|
|
115
|
+
intro: (renewalDateLabel: string | null) => string;
|
|
116
|
+
consequence: string;
|
|
117
|
+
cta: string;
|
|
118
|
+
outro: string;
|
|
119
|
+
}
|
|
120
|
+
export interface SubscriptionLifecycleEmailContent {
|
|
121
|
+
activationActionRequired: Localized<SubscriptionActivationCopy>;
|
|
122
|
+
addressChanged: Localized<SubscriptionActionCopy>;
|
|
123
|
+
cancelled: Localized<SubscriptionActionCopy>;
|
|
124
|
+
cycleSkipped: Localized<SubscriptionScheduleCopy & {
|
|
125
|
+
manageLine: string;
|
|
126
|
+
}>;
|
|
127
|
+
deliveryRescheduled: Localized<SubscriptionScheduleCopy>;
|
|
128
|
+
packageChanged: Localized<SubscriptionPackageChangedCopy>;
|
|
129
|
+
pauseReminder: Localized<SubscriptionPauseReminderCopy>;
|
|
130
|
+
paused: Localized<SubscriptionPausedCopy>;
|
|
131
|
+
renewalUpcoming: Localized<SubscriptionRenewalUpcomingCopy>;
|
|
132
|
+
resumed: Localized<SubscriptionResumedCopy>;
|
|
133
|
+
welcome: Localized<SubscriptionWelcomeCopy>;
|
|
134
|
+
winback: Localized<SubscriptionWinbackCopy>;
|
|
135
|
+
}
|
|
136
|
+
export interface SubscriptionDunningEmailContent {
|
|
137
|
+
paymentExpired: Localized<SubscriptionPaymentExpiredCopy>;
|
|
138
|
+
paymentFailed: Localized<SubscriptionPaymentFailedCopy>;
|
|
139
|
+
paymentRecovered: Localized<SubscriptionPaymentRecoveredCopy>;
|
|
140
|
+
renewalAtRisk: Localized<SubscriptionRenewalAtRiskCopy>;
|
|
141
|
+
}
|
|
142
|
+
export interface SubscriptionEmailContent extends SubscriptionLifecycleEmailContent, SubscriptionDunningEmailContent {
|
|
143
|
+
id: "example" | "deployment-overlay";
|
|
144
|
+
}
|
|
145
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { SubscriptionEmailContent } from "./subscriptionEmailContent.js";
|
|
2
|
+
import type { Locale } from "./email.js";
|
|
3
|
+
import { type EmailBlock } from "./blocks.js";
|
|
4
|
+
export interface SubscriptionPackageChangedEmailVars {
|
|
5
|
+
firstName: string | null;
|
|
6
|
+
action?: string | null;
|
|
7
|
+
/** Absolute CTA URL (manage subscription); null/absent → no button. */
|
|
8
|
+
ctaUrl?: string | null;
|
|
9
|
+
}
|
|
10
|
+
export interface SubscriptionPackageChangedEmailContent {
|
|
11
|
+
subject: string;
|
|
12
|
+
preheader: string;
|
|
13
|
+
blocks: EmailBlock[];
|
|
14
|
+
}
|
|
15
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
16
|
+
export declare function createSubscriptionPackageChangedContentFactory(input: {
|
|
17
|
+
subscriptionEmailContent: Pick<SubscriptionEmailContent, "packageChanged">;
|
|
18
|
+
}): {
|
|
19
|
+
subscriptionPackageChangedEmailContent: (locale: Locale, vars: SubscriptionPackageChangedEmailVars, signoff: string) => SubscriptionPackageChangedEmailContent;
|
|
20
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { accentBox, button, heading, paragraph, } from "./blocks.js";
|
|
2
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
3
|
+
export function createSubscriptionPackageChangedContentFactory(input) {
|
|
4
|
+
const { subscriptionEmailContent } = input;
|
|
5
|
+
function subscriptionPackageChangedEmailContent(locale, vars, signoff) {
|
|
6
|
+
const copy = subscriptionEmailContent.packageChanged[locale];
|
|
7
|
+
const actionLabel = vars.action ? copy.actionLabels[vars.action] ?? null : null;
|
|
8
|
+
const blocks = [
|
|
9
|
+
heading(copy.heading),
|
|
10
|
+
paragraph(copy.greeting(vars.firstName)),
|
|
11
|
+
paragraph(copy.intro(actionLabel)),
|
|
12
|
+
accentBox(copy.reassurance),
|
|
13
|
+
];
|
|
14
|
+
if (vars.ctaUrl) {
|
|
15
|
+
blocks.push(button(copy.cta, vars.ctaUrl));
|
|
16
|
+
}
|
|
17
|
+
blocks.push(paragraph(copy.outro));
|
|
18
|
+
blocks.push(paragraph(signoff));
|
|
19
|
+
return {
|
|
20
|
+
subject: copy.subject,
|
|
21
|
+
preheader: copy.preheader,
|
|
22
|
+
blocks,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
return { subscriptionPackageChangedEmailContent };
|
|
26
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { SubscriptionEmailContent } from "./subscriptionEmailContent.js";
|
|
2
|
+
import type { Locale } from "./email.js";
|
|
3
|
+
import { type EmailBlock } from "./blocks.js";
|
|
4
|
+
export interface SubscriptionPauseReminderEmailVars {
|
|
5
|
+
firstName: string | null;
|
|
6
|
+
/** Consumer-facing brand label injected by the app/composition root. */
|
|
7
|
+
brandName: string;
|
|
8
|
+
/** Pre-formatted resume date, or null when unknown. */
|
|
9
|
+
resumeDateLabel: string | null;
|
|
10
|
+
/** Absolute CTA URL to manage the subscription. */
|
|
11
|
+
ctaUrl: string;
|
|
12
|
+
}
|
|
13
|
+
export interface SubscriptionPauseReminderEmailContent {
|
|
14
|
+
subject: string;
|
|
15
|
+
preheader: string;
|
|
16
|
+
blocks: EmailBlock[];
|
|
17
|
+
}
|
|
18
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
19
|
+
export declare function createSubscriptionPauseReminderContentFactory(input: {
|
|
20
|
+
subscriptionEmailContent: Pick<SubscriptionEmailContent, "pauseReminder">;
|
|
21
|
+
}): {
|
|
22
|
+
subscriptionPauseReminderEmailContent: (locale: Locale, vars: SubscriptionPauseReminderEmailVars, signoff: string) => SubscriptionPauseReminderEmailContent;
|
|
23
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { accentBox, button, heading, paragraph, } from "./blocks.js";
|
|
2
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
3
|
+
export function createSubscriptionPauseReminderContentFactory(input) {
|
|
4
|
+
const { subscriptionEmailContent } = input;
|
|
5
|
+
function subscriptionPauseReminderEmailContent(locale, vars, signoff) {
|
|
6
|
+
const copy = subscriptionEmailContent.pauseReminder[locale];
|
|
7
|
+
const resumeDate = vars.resumeDateLabel
|
|
8
|
+
? locale === "en"
|
|
9
|
+
? ` on ${vars.resumeDateLabel}`
|
|
10
|
+
: ` ${vars.resumeDateLabel}`
|
|
11
|
+
: "";
|
|
12
|
+
const blocks = [
|
|
13
|
+
heading(copy.heading),
|
|
14
|
+
paragraph(copy.greeting(vars.firstName)),
|
|
15
|
+
paragraph(copy.intro(vars.brandName)),
|
|
16
|
+
paragraph(copy.resume(resumeDate)),
|
|
17
|
+
accentBox(copy.reassurance),
|
|
18
|
+
button(copy.cta, vars.ctaUrl),
|
|
19
|
+
paragraph(copy.outro),
|
|
20
|
+
paragraph(signoff),
|
|
21
|
+
];
|
|
22
|
+
return {
|
|
23
|
+
subject: copy.subject,
|
|
24
|
+
preheader: copy.preheader,
|
|
25
|
+
blocks,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
return { subscriptionPauseReminderEmailContent };
|
|
29
|
+
}
|