@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,59 @@
|
|
|
1
|
+
import type { CommerceEmailContent } from "./commerceEmailContent.js";
|
|
2
|
+
import type { Locale } from "./email.js";
|
|
3
|
+
import {
|
|
4
|
+
button,
|
|
5
|
+
heading,
|
|
6
|
+
paragraph,
|
|
7
|
+
type EmailBlock,
|
|
8
|
+
} from "./blocks.js";
|
|
9
|
+
|
|
10
|
+
export interface ReviewRequestEmailVars {
|
|
11
|
+
firstName: string | null;
|
|
12
|
+
/** Consumer-facing brand label injected by the app/composition root. */
|
|
13
|
+
brandName: string;
|
|
14
|
+
/** Absolute CTA URL to the review form (baseUrl + locale review path + token). */
|
|
15
|
+
reviewUrl: string;
|
|
16
|
+
/** Absolute signed unsubscribe URL (purpose = 'marketing_newsletter'). */
|
|
17
|
+
unsubscribeUrl: string;
|
|
18
|
+
/** Optional product, service, or other review context label. */
|
|
19
|
+
contextName?: string | null;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface ReviewRequestEmailContent {
|
|
23
|
+
subject: string;
|
|
24
|
+
preheader: string;
|
|
25
|
+
blocks: EmailBlock[];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
29
|
+
export function createReviewRequestContentFactory(input: {
|
|
30
|
+
commerceEmailContent: Pick<CommerceEmailContent, "reviewRequest">;
|
|
31
|
+
marketingUnsubscribeFooter: (locale: Locale, unsubscribeUrl: string) => EmailBlock[];
|
|
32
|
+
}) {
|
|
33
|
+
const { commerceEmailContent, marketingUnsubscribeFooter } = input;
|
|
34
|
+
|
|
35
|
+
function reviewRequestEmailContent(
|
|
36
|
+
locale: Locale,
|
|
37
|
+
vars: ReviewRequestEmailVars,
|
|
38
|
+
signoff: string,
|
|
39
|
+
): ReviewRequestEmailContent {
|
|
40
|
+
const copy = commerceEmailContent.reviewRequest[locale];
|
|
41
|
+
const blocks: EmailBlock[] = [
|
|
42
|
+
heading(copy.heading),
|
|
43
|
+
paragraph(copy.greeting(vars.firstName)),
|
|
44
|
+
paragraph(copy.intro(vars.contextName ?? null)),
|
|
45
|
+
paragraph(copy.body),
|
|
46
|
+
button(copy.cta, vars.reviewUrl),
|
|
47
|
+
paragraph(copy.outro),
|
|
48
|
+
paragraph(signoff),
|
|
49
|
+
...marketingUnsubscribeFooter(locale, vars.unsubscribeUrl),
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
return {
|
|
53
|
+
subject: copy.subject,
|
|
54
|
+
preheader: copy.preheader.split("{{brand}}").join(vars.brandName),
|
|
55
|
+
blocks,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
return { reviewRequestEmailContent };
|
|
59
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { Locale } from "./email.js";
|
|
2
|
+
import { button, heading, paragraph, type EmailBlock } from "./blocks.js";
|
|
3
|
+
|
|
4
|
+
export interface RoleNotificationVars {
|
|
5
|
+
role: "admin" | "distributor";
|
|
6
|
+
operatorUrl: string;
|
|
7
|
+
/** Absent means active membership; present means a pending invitation. */
|
|
8
|
+
expiresAt?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface RoleNotificationCopy {
|
|
11
|
+
subject: string;
|
|
12
|
+
heading: string;
|
|
13
|
+
status: string;
|
|
14
|
+
body: string;
|
|
15
|
+
button: string;
|
|
16
|
+
footer: string;
|
|
17
|
+
}
|
|
18
|
+
export type RoleNotificationCopyFactory = (role: RoleNotificationVars["role"], expiresAt?: string) => RoleNotificationCopy;
|
|
19
|
+
|
|
20
|
+
function defaultCopy(locale: Locale, role: RoleNotificationVars["role"], expiresAt?: string): RoleNotificationCopy {
|
|
21
|
+
return expiresAt === undefined ? (locale === "pl" ? {
|
|
22
|
+
subject: `Uprawnienia operatora: ${role}`,
|
|
23
|
+
heading: "Uprawnienia operatora",
|
|
24
|
+
status: "Twoje uprawnienia operatora są aktywne.",
|
|
25
|
+
body: `Przyznano Ci rolę ${role}. Otwórz panel operatora, aby się zalogować.`,
|
|
26
|
+
button: "Otwórz panel operatora",
|
|
27
|
+
footer: "Jeśli nie oczekujesz tych uprawnień, skontaktuj się z zespołem aplikacji.",
|
|
28
|
+
} : {
|
|
29
|
+
subject: `Operator membership: ${role}`,
|
|
30
|
+
heading: "Operator membership",
|
|
31
|
+
status: "Your operator membership is active.",
|
|
32
|
+
body: `You have the ${role} role. Open the operator panel to sign in.`,
|
|
33
|
+
button: "Open operator panel",
|
|
34
|
+
footer: "If you did not expect this membership, contact the application team.",
|
|
35
|
+
}) : locale === "pl" ? {
|
|
36
|
+
subject: `Zaproszenie operatora: ${role}`,
|
|
37
|
+
heading: "Zaproszenie operatora",
|
|
38
|
+
status: `Zaproszenie oczekuje na przyjęcie do ${expiresAt}.`,
|
|
39
|
+
body: `Zaproszono Cię do roli ${role}. Dostęp rozpocznie się po wejściu do panelu operatora ze zweryfikowanym kontem.`,
|
|
40
|
+
button: "Otwórz panel operatora",
|
|
41
|
+
footer: "Jeśli nie oczekujesz tego zaproszenia, skontaktuj się z zespołem aplikacji.",
|
|
42
|
+
} : {
|
|
43
|
+
subject: `Operator invitation: ${role}`,
|
|
44
|
+
heading: "Operator invitation",
|
|
45
|
+
status: `Your invitation is pending until ${expiresAt}.`,
|
|
46
|
+
body: `You are invited as ${role}. Access begins when you enter the operator panel with your verified account.`,
|
|
47
|
+
button: "Open operator panel",
|
|
48
|
+
footer: "If you did not expect this invitation, contact the application team.",
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
const defaults: Record<Locale, RoleNotificationCopyFactory> = {
|
|
52
|
+
pl: (role, expiresAt) => defaultCopy("pl", role, expiresAt),
|
|
53
|
+
en: (role, expiresAt) => defaultCopy("en", role, expiresAt),
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/** Pure defaults with the same active/pending semantics in both locales. */
|
|
57
|
+
export function createRoleNotificationContentFactory(copy: Record<Locale, RoleNotificationCopyFactory> = defaults) {
|
|
58
|
+
function roleNotificationEmailContent(locale: Locale, vars: RoleNotificationVars): { subject: string; preheader: string; blocks: EmailBlock[] } {
|
|
59
|
+
const c = copy[locale](vars.role, vars.expiresAt);
|
|
60
|
+
return { subject: c.subject, preheader: c.status,
|
|
61
|
+
blocks: [heading(c.heading), paragraph(c.status), paragraph(c.body),
|
|
62
|
+
button(c.button, vars.operatorUrl), paragraph(c.footer, { muted: true })] };
|
|
63
|
+
}
|
|
64
|
+
return { roleNotificationEmailContent };
|
|
65
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { CommerceEmailContent } from "./commerceEmailContent.js";
|
|
2
|
+
import type { Locale } from "./email.js";
|
|
3
|
+
import { guideCardBlock } from "./guideCard.js";
|
|
4
|
+
import {
|
|
5
|
+
heading,
|
|
6
|
+
paragraph,
|
|
7
|
+
type EmailBlock,
|
|
8
|
+
} from "./blocks.js";
|
|
9
|
+
|
|
10
|
+
export interface ShipmentDeliveredEmailVars {
|
|
11
|
+
firstName: string | null;
|
|
12
|
+
orderId: string;
|
|
13
|
+
/** Site origin (absolute, no trailing slash) the guide links are built on. */
|
|
14
|
+
siteOrigin: string;
|
|
15
|
+
/** Optional deployment-specific context consumed by the selected copy pack. */
|
|
16
|
+
contextName?: string | null;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface ShipmentDeliveredEmailContent {
|
|
20
|
+
subject: string;
|
|
21
|
+
preheader: string;
|
|
22
|
+
blocks: EmailBlock[];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
26
|
+
export function createShipmentDeliveredContentFactory(input: {
|
|
27
|
+
commerceEmailContent: Pick<CommerceEmailContent, "shipmentDelivered" | "orderRefPrefix">;
|
|
28
|
+
formatCustomerOrderReference: (orderId: string, prefix: string) => string;
|
|
29
|
+
}) {
|
|
30
|
+
const { commerceEmailContent, formatCustomerOrderReference } = input;
|
|
31
|
+
|
|
32
|
+
function shipmentDeliveredEmailContent(
|
|
33
|
+
locale: Locale,
|
|
34
|
+
vars: ShipmentDeliveredEmailVars,
|
|
35
|
+
signoff: string,
|
|
36
|
+
): ShipmentDeliveredEmailContent {
|
|
37
|
+
const copy = commerceEmailContent.shipmentDelivered[locale];
|
|
38
|
+
const orderRef = formatCustomerOrderReference(
|
|
39
|
+
vars.orderId,
|
|
40
|
+
commerceEmailContent.orderRefPrefix,
|
|
41
|
+
);
|
|
42
|
+
const blocks: EmailBlock[] = [
|
|
43
|
+
heading(copy.heading),
|
|
44
|
+
paragraph(copy.greeting(vars.firstName)),
|
|
45
|
+
paragraph(copy.intro(orderRef, vars.contextName ?? null)),
|
|
46
|
+
guideCardBlock(copy.startGuide, vars.siteOrigin, vars.contextName ?? null),
|
|
47
|
+
];
|
|
48
|
+
|
|
49
|
+
blocks.push(paragraph(copy.outro));
|
|
50
|
+
blocks.push(paragraph(signoff));
|
|
51
|
+
|
|
52
|
+
return {
|
|
53
|
+
subject: copy.subject(orderRef),
|
|
54
|
+
preheader: copy.preheader,
|
|
55
|
+
blocks,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
return { shipmentDeliveredEmailContent };
|
|
59
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { CommerceEmailContent } from "./commerceEmailContent.js";
|
|
2
|
+
import type { Locale } from "./email.js";
|
|
3
|
+
import { guideCardBlock } from "./guideCard.js";
|
|
4
|
+
import {
|
|
5
|
+
accentBox,
|
|
6
|
+
dataTable,
|
|
7
|
+
heading,
|
|
8
|
+
linkParagraph,
|
|
9
|
+
paragraph,
|
|
10
|
+
type EmailBlock,
|
|
11
|
+
} from "./blocks.js";
|
|
12
|
+
|
|
13
|
+
export interface ShipmentDispatchedEmailVars {
|
|
14
|
+
firstName: string | null;
|
|
15
|
+
orderId: string;
|
|
16
|
+
/** Opaque carrier tracking number, or null when none is available. */
|
|
17
|
+
trackingNumber: string | null;
|
|
18
|
+
/** Absolute tracking URL (carrier page); rendered as a "track parcel" link. */
|
|
19
|
+
trackingUrl?: string | null;
|
|
20
|
+
/** Site origin (absolute, no trailing slash) the guide links are built on. */
|
|
21
|
+
siteOrigin: string;
|
|
22
|
+
/** Optional deployment-specific context consumed by the selected copy pack. */
|
|
23
|
+
contextName?: string | null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface ShipmentDispatchedEmailContent {
|
|
27
|
+
subject: string;
|
|
28
|
+
preheader: string;
|
|
29
|
+
blocks: EmailBlock[];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
33
|
+
export function createShipmentDispatchedContentFactory(input: {
|
|
34
|
+
commerceEmailContent: Pick<CommerceEmailContent, "shipmentDispatched" | "orderRefPrefix">;
|
|
35
|
+
formatCustomerOrderReference: (orderId: string, prefix: string) => string;
|
|
36
|
+
}) {
|
|
37
|
+
const { commerceEmailContent, formatCustomerOrderReference } = input;
|
|
38
|
+
|
|
39
|
+
function shipmentDispatchedEmailContent(
|
|
40
|
+
locale: Locale,
|
|
41
|
+
vars: ShipmentDispatchedEmailVars,
|
|
42
|
+
signoff: string,
|
|
43
|
+
): ShipmentDispatchedEmailContent {
|
|
44
|
+
const copy = commerceEmailContent.shipmentDispatched[locale];
|
|
45
|
+
const orderRef = formatCustomerOrderReference(
|
|
46
|
+
vars.orderId,
|
|
47
|
+
commerceEmailContent.orderRefPrefix,
|
|
48
|
+
);
|
|
49
|
+
const blocks: EmailBlock[] = [
|
|
50
|
+
heading(copy.heading),
|
|
51
|
+
paragraph(copy.greeting(vars.firstName)),
|
|
52
|
+
paragraph(copy.intro(orderRef)),
|
|
53
|
+
];
|
|
54
|
+
|
|
55
|
+
// Tracking is the job-to-be-done of this message: the number and the
|
|
56
|
+
// carrier page share one box, and the guide card is the only button.
|
|
57
|
+
const trackLink = vars.trackingUrl ? { label: copy.trackParcel, href: vars.trackingUrl } : undefined;
|
|
58
|
+
if (vars.trackingNumber) {
|
|
59
|
+
blocks.push(dataTable([{ label: copy.trackingLabel, value: vars.trackingNumber }], { link: trackLink }));
|
|
60
|
+
} else {
|
|
61
|
+
blocks.push(accentBox(copy.noTracking, { label: copy.noTrackingLabel }));
|
|
62
|
+
if (trackLink) blocks.push(linkParagraph(trackLink.label, trackLink.href));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
blocks.push(guideCardBlock(copy.accountGuide, vars.siteOrigin, vars.contextName ?? null));
|
|
66
|
+
|
|
67
|
+
blocks.push(paragraph(copy.outro(vars.contextName ?? null)));
|
|
68
|
+
blocks.push(paragraph(signoff));
|
|
69
|
+
|
|
70
|
+
return {
|
|
71
|
+
subject: copy.subject(orderRef),
|
|
72
|
+
preheader: copy.preheader,
|
|
73
|
+
blocks,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
return { shipmentDispatchedEmailContent };
|
|
77
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { CommerceEmailContent } from "./commerceEmailContent.js";
|
|
2
|
+
import type { Locale } from "./email.js";
|
|
3
|
+
import {
|
|
4
|
+
accentBox,
|
|
5
|
+
button,
|
|
6
|
+
heading,
|
|
7
|
+
paragraph,
|
|
8
|
+
type EmailBlock,
|
|
9
|
+
} from "./blocks.js";
|
|
10
|
+
|
|
11
|
+
export interface ShipmentExceptionEmailVars {
|
|
12
|
+
firstName: string | null;
|
|
13
|
+
orderId: string;
|
|
14
|
+
/** Absolute URL to the customer's order/account page; null/absent → no button. */
|
|
15
|
+
ctaUrl?: string | null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface ShipmentExceptionEmailContent {
|
|
19
|
+
subject: string;
|
|
20
|
+
preheader: string;
|
|
21
|
+
blocks: EmailBlock[];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
25
|
+
export function createShipmentExceptionContentFactory(input: {
|
|
26
|
+
commerceEmailContent: Pick<CommerceEmailContent, "shipmentException" | "orderRefPrefix">;
|
|
27
|
+
formatCustomerOrderReference: (orderId: string, prefix: string) => string;
|
|
28
|
+
}) {
|
|
29
|
+
const { commerceEmailContent, formatCustomerOrderReference } = input;
|
|
30
|
+
|
|
31
|
+
function shipmentExceptionEmailContent(
|
|
32
|
+
locale: Locale,
|
|
33
|
+
vars: ShipmentExceptionEmailVars,
|
|
34
|
+
signoff: string,
|
|
35
|
+
): ShipmentExceptionEmailContent {
|
|
36
|
+
const copy = commerceEmailContent.shipmentException[locale];
|
|
37
|
+
const orderRef = formatCustomerOrderReference(
|
|
38
|
+
vars.orderId,
|
|
39
|
+
commerceEmailContent.orderRefPrefix,
|
|
40
|
+
);
|
|
41
|
+
const blocks: EmailBlock[] = [
|
|
42
|
+
heading(copy.heading),
|
|
43
|
+
paragraph(copy.greeting(vars.firstName)),
|
|
44
|
+
paragraph(copy.intro(orderRef)),
|
|
45
|
+
accentBox(copy.reassurance, { label: copy.reassuranceLabel }),
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
if (vars.ctaUrl) {
|
|
49
|
+
blocks.push(button(copy.cta, vars.ctaUrl));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
blocks.push(paragraph(copy.outro));
|
|
53
|
+
blocks.push(paragraph(signoff));
|
|
54
|
+
|
|
55
|
+
return {
|
|
56
|
+
subject: copy.subject(orderRef),
|
|
57
|
+
preheader: copy.preheader,
|
|
58
|
+
blocks,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return { shipmentExceptionEmailContent };
|
|
62
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { SubscriptionEmailContent } from "./subscriptionEmailContent.js";
|
|
2
|
+
import type { Locale } from "./email.js";
|
|
3
|
+
import { accentBox, button, heading, paragraph, type EmailBlock } from "./blocks.js";
|
|
4
|
+
|
|
5
|
+
export interface SubscriptionActivationActionRequiredVars {
|
|
6
|
+
firstName: string | null;
|
|
7
|
+
ctaUrl: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
11
|
+
export function createSubscriptionActivationActionRequiredContentFactory(input: {
|
|
12
|
+
subscriptionEmailContent: Pick<SubscriptionEmailContent, "activationActionRequired">;
|
|
13
|
+
}) {
|
|
14
|
+
const { subscriptionEmailContent } = input;
|
|
15
|
+
|
|
16
|
+
function subscriptionActivationActionRequiredEmailContent(
|
|
17
|
+
locale: Locale,
|
|
18
|
+
vars: SubscriptionActivationActionRequiredVars,
|
|
19
|
+
signoff: string,
|
|
20
|
+
): { subject: string; preheader: string; blocks: EmailBlock[] } {
|
|
21
|
+
const copy = subscriptionEmailContent.activationActionRequired[locale];
|
|
22
|
+
return {
|
|
23
|
+
subject: copy.subject,
|
|
24
|
+
preheader: copy.preheader,
|
|
25
|
+
blocks: [
|
|
26
|
+
heading(copy.heading),
|
|
27
|
+
paragraph(copy.greeting(vars.firstName)),
|
|
28
|
+
paragraph(copy.intro),
|
|
29
|
+
accentBox(copy.facts),
|
|
30
|
+
button(copy.cta, vars.ctaUrl),
|
|
31
|
+
paragraph(copy.outro),
|
|
32
|
+
paragraph(signoff),
|
|
33
|
+
],
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return { subscriptionActivationActionRequiredEmailContent };
|
|
37
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { SubscriptionEmailContent } from "./subscriptionEmailContent.js";
|
|
2
|
+
import type { Locale } from "./email.js";
|
|
3
|
+
import {
|
|
4
|
+
accentBox,
|
|
5
|
+
button,
|
|
6
|
+
heading,
|
|
7
|
+
paragraph,
|
|
8
|
+
type EmailBlock,
|
|
9
|
+
} from "./blocks.js";
|
|
10
|
+
|
|
11
|
+
export interface SubscriptionAddressChangedEmailVars {
|
|
12
|
+
firstName: string | null;
|
|
13
|
+
/** Absolute CTA URL (manage subscription); null/absent → no button. */
|
|
14
|
+
ctaUrl?: string | null;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface SubscriptionAddressChangedEmailContent {
|
|
18
|
+
subject: string;
|
|
19
|
+
preheader: string;
|
|
20
|
+
blocks: EmailBlock[];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
24
|
+
export function createSubscriptionAddressChangedContentFactory(input: {
|
|
25
|
+
subscriptionEmailContent: Pick<SubscriptionEmailContent, "addressChanged">;
|
|
26
|
+
}) {
|
|
27
|
+
const { subscriptionEmailContent } = input;
|
|
28
|
+
|
|
29
|
+
function subscriptionAddressChangedEmailContent(
|
|
30
|
+
locale: Locale,
|
|
31
|
+
vars: SubscriptionAddressChangedEmailVars,
|
|
32
|
+
signoff: string,
|
|
33
|
+
): SubscriptionAddressChangedEmailContent {
|
|
34
|
+
const copy = subscriptionEmailContent.addressChanged[locale];
|
|
35
|
+
const blocks: EmailBlock[] = [
|
|
36
|
+
heading(copy.heading),
|
|
37
|
+
paragraph(copy.greeting(vars.firstName)),
|
|
38
|
+
paragraph(copy.intro),
|
|
39
|
+
accentBox(copy.reassurance),
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
if (vars.ctaUrl) {
|
|
43
|
+
blocks.push(button(copy.cta, vars.ctaUrl));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
blocks.push(paragraph(copy.outro));
|
|
47
|
+
blocks.push(paragraph(signoff));
|
|
48
|
+
|
|
49
|
+
return {
|
|
50
|
+
subject: copy.subject,
|
|
51
|
+
preheader: copy.preheader,
|
|
52
|
+
blocks,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return { subscriptionAddressChangedEmailContent };
|
|
56
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { SubscriptionEmailContent } from "./subscriptionEmailContent.js";
|
|
2
|
+
import type { Locale } from "./email.js";
|
|
3
|
+
import {
|
|
4
|
+
accentBox,
|
|
5
|
+
button,
|
|
6
|
+
heading,
|
|
7
|
+
paragraph,
|
|
8
|
+
type EmailBlock,
|
|
9
|
+
} from "./blocks.js";
|
|
10
|
+
|
|
11
|
+
export interface SubscriptionCancelledEmailVars {
|
|
12
|
+
firstName: string | null;
|
|
13
|
+
/** Absolute CTA URL (back to shop / re-subscribe); null/absent → no button. */
|
|
14
|
+
ctaUrl?: string | null;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface SubscriptionCancelledEmailContent {
|
|
18
|
+
subject: string;
|
|
19
|
+
preheader: string;
|
|
20
|
+
blocks: EmailBlock[];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
24
|
+
export function createSubscriptionCancelledContentFactory(input: {
|
|
25
|
+
subscriptionEmailContent: Pick<SubscriptionEmailContent, "cancelled">;
|
|
26
|
+
}) {
|
|
27
|
+
const { subscriptionEmailContent } = input;
|
|
28
|
+
|
|
29
|
+
function subscriptionCancelledEmailContent(
|
|
30
|
+
locale: Locale,
|
|
31
|
+
vars: SubscriptionCancelledEmailVars,
|
|
32
|
+
signoff: string,
|
|
33
|
+
): SubscriptionCancelledEmailContent {
|
|
34
|
+
const copy = subscriptionEmailContent.cancelled[locale];
|
|
35
|
+
const blocks: EmailBlock[] = [
|
|
36
|
+
heading(copy.heading),
|
|
37
|
+
paragraph(copy.greeting(vars.firstName)),
|
|
38
|
+
paragraph(copy.intro),
|
|
39
|
+
accentBox(copy.reassurance),
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
blocks.push(paragraph(copy.outro));
|
|
43
|
+
|
|
44
|
+
if (vars.ctaUrl) {
|
|
45
|
+
blocks.push(button(copy.cta, vars.ctaUrl));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
blocks.push(paragraph(signoff));
|
|
49
|
+
|
|
50
|
+
return {
|
|
51
|
+
subject: copy.subject,
|
|
52
|
+
preheader: copy.preheader,
|
|
53
|
+
blocks,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return { subscriptionCancelledEmailContent };
|
|
57
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { SubscriptionEmailContent } from "./subscriptionEmailContent.js";
|
|
2
|
+
import type { Locale } from "./email.js";
|
|
3
|
+
import {
|
|
4
|
+
accentBox,
|
|
5
|
+
button,
|
|
6
|
+
dataTable,
|
|
7
|
+
heading,
|
|
8
|
+
paragraph,
|
|
9
|
+
type EmailBlock,
|
|
10
|
+
} from "./blocks.js";
|
|
11
|
+
|
|
12
|
+
export interface SubscriptionCycleSkippedEmailVars {
|
|
13
|
+
firstName: string | null;
|
|
14
|
+
/** Localized next CHARGE date after the skip, or null when unavailable. */
|
|
15
|
+
chargeDateLabel?: string | null;
|
|
16
|
+
/** Localized estimated delivery window after the skip, or null when unavailable. */
|
|
17
|
+
deliveryWindowLabel?: string | null;
|
|
18
|
+
/** Localized holiday caveat; present ONLY when a holiday moved the window. */
|
|
19
|
+
holidayNote?: string | null;
|
|
20
|
+
/** Absolute CTA URL (manage subscription); null/absent → no button. */
|
|
21
|
+
ctaUrl?: string | null;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface SubscriptionCycleSkippedEmailContent {
|
|
25
|
+
subject: string;
|
|
26
|
+
preheader: string;
|
|
27
|
+
blocks: EmailBlock[];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
31
|
+
export function createSubscriptionCycleSkippedContentFactory(input: {
|
|
32
|
+
subscriptionEmailContent: Pick<SubscriptionEmailContent, "cycleSkipped">;
|
|
33
|
+
}) {
|
|
34
|
+
const { subscriptionEmailContent } = input;
|
|
35
|
+
|
|
36
|
+
function subscriptionCycleSkippedEmailContent(
|
|
37
|
+
locale: Locale,
|
|
38
|
+
vars: SubscriptionCycleSkippedEmailVars,
|
|
39
|
+
signoff: string,
|
|
40
|
+
): SubscriptionCycleSkippedEmailContent {
|
|
41
|
+
const copy = subscriptionEmailContent.cycleSkipped[locale];
|
|
42
|
+
const hasSchedule = Boolean(vars.chargeDateLabel && vars.deliveryWindowLabel);
|
|
43
|
+
const blocks: EmailBlock[] = [
|
|
44
|
+
heading(copy.heading),
|
|
45
|
+
paragraph(copy.greeting(vars.firstName)),
|
|
46
|
+
paragraph(hasSchedule ? copy.intro : copy.introWithoutDates),
|
|
47
|
+
];
|
|
48
|
+
|
|
49
|
+
if (locale === "pl" && hasSchedule) {
|
|
50
|
+
blocks.push(dataTable([
|
|
51
|
+
{ label: copy.deliveryLabel, value: vars.deliveryWindowLabel! },
|
|
52
|
+
{ label: copy.chargeLabel, value: vars.chargeDateLabel! },
|
|
53
|
+
]));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const reassurance = [
|
|
57
|
+
...(locale !== "pl" && hasSchedule
|
|
58
|
+
? [copy.dateLine(vars.deliveryWindowLabel!, vars.chargeDateLabel!)]
|
|
59
|
+
: []),
|
|
60
|
+
...(vars.holidayNote ? [vars.holidayNote] : []),
|
|
61
|
+
...copy.reassurance,
|
|
62
|
+
];
|
|
63
|
+
blocks.push(accentBox(reassurance));
|
|
64
|
+
blocks.push(paragraph(copy.manageLine));
|
|
65
|
+
|
|
66
|
+
if (vars.ctaUrl) {
|
|
67
|
+
blocks.push(button(copy.cta, vars.ctaUrl));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
blocks.push(paragraph(copy.outro));
|
|
71
|
+
blocks.push(paragraph(signoff));
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
subject: hasSchedule ? copy.subject : copy.subjectWithoutDates,
|
|
75
|
+
preheader: copy.preheader,
|
|
76
|
+
blocks,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
return { subscriptionCycleSkippedEmailContent };
|
|
80
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { SubscriptionEmailContent } from "./subscriptionEmailContent.js";
|
|
2
|
+
import type { Locale } from "./email.js";
|
|
3
|
+
import {
|
|
4
|
+
accentBox,
|
|
5
|
+
button,
|
|
6
|
+
dataTable,
|
|
7
|
+
heading,
|
|
8
|
+
paragraph,
|
|
9
|
+
type EmailBlock,
|
|
10
|
+
} from "./blocks.js";
|
|
11
|
+
|
|
12
|
+
export interface SubscriptionDeliveryRescheduledEmailVars {
|
|
13
|
+
firstName: string | null;
|
|
14
|
+
/** Localized new CHARGE date (the date the customer picked), or null. */
|
|
15
|
+
chargeDateLabel?: string | null;
|
|
16
|
+
/** Localized estimated delivery window derived from the new charge date, or null. */
|
|
17
|
+
deliveryWindowLabel?: string | null;
|
|
18
|
+
/** Localized holiday caveat; present ONLY when a holiday moved the window. */
|
|
19
|
+
holidayNote?: string | null;
|
|
20
|
+
/** Absolute CTA URL (manage subscription); null/absent → no button. */
|
|
21
|
+
ctaUrl?: string | null;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface SubscriptionDeliveryRescheduledEmailContent {
|
|
25
|
+
subject: string;
|
|
26
|
+
preheader: string;
|
|
27
|
+
blocks: EmailBlock[];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
31
|
+
export function createSubscriptionDeliveryRescheduledContentFactory(input: {
|
|
32
|
+
subscriptionEmailContent: Pick<SubscriptionEmailContent, "deliveryRescheduled">;
|
|
33
|
+
}) {
|
|
34
|
+
const { subscriptionEmailContent } = input;
|
|
35
|
+
|
|
36
|
+
function subscriptionDeliveryRescheduledEmailContent(
|
|
37
|
+
locale: Locale,
|
|
38
|
+
vars: SubscriptionDeliveryRescheduledEmailVars,
|
|
39
|
+
signoff: string,
|
|
40
|
+
): SubscriptionDeliveryRescheduledEmailContent {
|
|
41
|
+
const copy = subscriptionEmailContent.deliveryRescheduled[locale];
|
|
42
|
+
const hasSchedule = Boolean(vars.chargeDateLabel && vars.deliveryWindowLabel);
|
|
43
|
+
const blocks: EmailBlock[] = [
|
|
44
|
+
heading(copy.heading),
|
|
45
|
+
paragraph(copy.greeting(vars.firstName)),
|
|
46
|
+
paragraph(hasSchedule ? copy.intro : copy.introWithoutDates),
|
|
47
|
+
];
|
|
48
|
+
|
|
49
|
+
if (locale === "pl" && hasSchedule) {
|
|
50
|
+
blocks.push(dataTable([
|
|
51
|
+
{ label: copy.deliveryLabel, value: vars.deliveryWindowLabel! },
|
|
52
|
+
{ label: copy.chargeLabel, value: vars.chargeDateLabel! },
|
|
53
|
+
]));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const reassurance = [
|
|
57
|
+
...(locale !== "pl" && hasSchedule
|
|
58
|
+
? [copy.dateLine(vars.deliveryWindowLabel!, vars.chargeDateLabel!)]
|
|
59
|
+
: []),
|
|
60
|
+
...(vars.holidayNote ? [vars.holidayNote] : []),
|
|
61
|
+
...copy.reassurance,
|
|
62
|
+
];
|
|
63
|
+
blocks.push(accentBox(reassurance));
|
|
64
|
+
|
|
65
|
+
if (vars.ctaUrl) {
|
|
66
|
+
blocks.push(button(copy.cta, vars.ctaUrl));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
blocks.push(paragraph(copy.outro));
|
|
70
|
+
blocks.push(paragraph(signoff));
|
|
71
|
+
|
|
72
|
+
return {
|
|
73
|
+
subject: hasSchedule ? copy.subject : copy.subjectWithoutDates,
|
|
74
|
+
preheader: copy.preheader,
|
|
75
|
+
blocks,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
return { subscriptionDeliveryRescheduledEmailContent };
|
|
79
|
+
}
|