@openlup/platform 0.16.0 → 0.18.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 +180 -0
- package/README.md +564 -6
- package/dist/catalog/activeSkuSelection.d.ts +2 -0
- package/dist/catalog/activeSkuSelection.js +20 -0
- package/dist/catalog/adminBindings.d.ts +72 -0
- package/dist/catalog/adminBindings.js +1 -0
- package/dist/catalog/adminBundleHandler.d.ts +26 -0
- package/dist/catalog/adminBundleHandler.js +111 -0
- package/dist/catalog/adminBundleReadHandler.d.ts +20 -0
- package/dist/catalog/adminBundleReadHandler.js +185 -0
- package/dist/catalog/adminBundleWritePort.d.ts +85 -0
- package/dist/catalog/adminBundleWritePort.js +1 -0
- package/dist/catalog/bundleAvailability.d.ts +63 -0
- package/dist/catalog/bundleAvailability.js +78 -0
- package/dist/catalog/bundleAvailabilityService.d.ts +65 -0
- package/dist/catalog/bundleAvailabilityService.js +89 -0
- package/dist/catalog/bundleBindings.d.ts +33 -0
- package/dist/catalog/bundleBindings.js +1 -0
- package/dist/catalog/bundleCatalogQueries.d.ts +28 -0
- package/dist/catalog/bundleCatalogQueries.js +84 -0
- package/dist/catalog/bundleCatalogReadPort.d.ts +166 -0
- package/dist/catalog/bundleCatalogReadPort.js +36 -0
- package/dist/catalog/bundleCatalogStore.d.ts +3 -0
- package/dist/catalog/bundleCatalogStore.js +152 -0
- package/dist/catalog/bundleRuleCodes.d.ts +41 -0
- package/dist/catalog/bundleRuleCodes.js +110 -0
- package/dist/catalog/bundleRules.d.ts +69 -0
- package/dist/catalog/bundleRules.js +102 -0
- package/dist/catalog/catalogDraftStore.d.ts +4 -0
- package/dist/catalog/catalogDraftStore.js +63 -0
- package/dist/catalog/catalogSkuEnvelope.d.ts +7 -0
- package/dist/catalog/catalogSkuEnvelope.js +142 -0
- package/dist/catalog/catalogSkuEnvelopeMapper.d.ts +38 -0
- package/dist/catalog/catalogSkuEnvelopeMapper.js +88 -0
- package/dist/catalog/contracts/bundleAdmin.d.ts +143 -0
- package/dist/catalog/contracts/bundleAdmin.js +1 -0
- package/dist/catalog/contracts/bundleAvailability.d.ts +61 -0
- package/dist/catalog/contracts/bundleAvailability.js +1 -0
- package/dist/catalog/contracts/bundleRead.d.ts +223 -0
- package/dist/catalog/contracts/bundleRead.js +1 -0
- package/dist/catalog/contracts/draft.d.ts +79 -0
- package/dist/catalog/contracts/draft.js +47 -0
- package/dist/catalog/contracts/foundation.d.ts +78 -0
- package/dist/catalog/contracts/foundation.js +53 -0
- package/dist/catalog/contracts/index.d.ts +14 -0
- package/dist/catalog/contracts/index.js +6 -0
- package/dist/catalog/contracts/lifecycle.d.ts +77 -0
- package/dist/catalog/contracts/lifecycle.js +1 -0
- package/dist/catalog/contracts/productMediaContracts.d.ts +77 -0
- package/dist/catalog/contracts/productMediaContracts.js +149 -0
- package/dist/catalog/contracts/productTypes.d.ts +54 -0
- package/dist/catalog/contracts/productTypes.js +16 -0
- package/dist/catalog/contracts/resolveProductMedia.d.ts +3 -0
- package/dist/catalog/contracts/resolveProductMedia.js +78 -0
- package/dist/catalog/contracts/sellable.d.ts +23 -0
- package/dist/catalog/contracts/sellable.js +1 -0
- package/dist/catalog/draftHandler.d.ts +25 -0
- package/dist/catalog/draftHandler.js +118 -0
- package/dist/catalog/draftPorts.d.ts +18 -0
- package/dist/catalog/draftPorts.js +8 -0
- package/dist/catalog/draftSchemas.d.ts +423 -0
- package/dist/catalog/draftSchemas.js +89 -0
- package/dist/catalog/draftValidation.d.ts +21 -0
- package/dist/catalog/draftValidation.js +125 -0
- package/dist/catalog/foundationSchemas.d.ts +98 -0
- package/dist/catalog/foundationSchemas.js +110 -0
- package/dist/catalog/index.d.ts +43 -0
- package/dist/catalog/index.js +25 -0
- package/dist/catalog/mediaSourcePack.d.ts +51 -0
- package/dist/catalog/mediaSourcePack.js +247 -0
- package/dist/catalog/productTypeSchemas.d.ts +46 -0
- package/dist/catalog/productTypeSchemas.js +72 -0
- package/dist/catalog/publicationPorts.d.ts +42 -0
- package/dist/catalog/publicationPorts.js +1 -0
- package/dist/catalog/readPorts.d.ts +51 -0
- package/dist/catalog/readPorts.js +1 -0
- package/dist/catalog/referenceCatalogHandler.d.ts +7 -0
- package/dist/catalog/referenceCatalogHandler.js +27 -0
- package/dist/catalog/resolvedSkuProjection.d.ts +88 -0
- package/dist/catalog/resolvedSkuProjection.js +60 -0
- package/dist/catalog/sellableBundleHandler.d.ts +46 -0
- package/dist/catalog/sellableBundleHandler.js +84 -0
- package/dist/catalog/sellableSchemas.d.ts +46 -0
- package/dist/catalog/sellableSchemas.js +27 -0
- package/dist/catalog/sql.d.ts +46 -0
- package/dist/catalog/sql.js +13 -0
- package/dist/catalog/validation.d.ts +2 -0
- package/dist/catalog/validation.js +3 -0
- 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 +52 -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/marketingSync.d.ts +194 -0
- package/dist/communications/contracts/marketingSync.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 +47 -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/klaviyo/consentPush.d.ts +51 -0
- package/dist/communications/klaviyo/consentPush.js +19 -0
- package/dist/communications/klaviyo/index.d.ts +110 -0
- package/dist/communications/klaviyo/index.js +860 -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/resend/index.d.ts +40 -0
- package/dist/communications/resend/index.js +310 -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/composition/catalogContribution.d.ts +18 -0
- package/dist/composition/catalogContribution.js +21 -0
- package/dist/composition/index.d.ts +1 -0
- package/dist/composition/index.js +1 -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/customerContracts.d.ts +2 -2
- package/dist/inventory/adminInventory.d.ts +13 -0
- package/dist/inventory/adminInventory.js +214 -0
- package/dist/inventory/contracts/forecast.d.ts +86 -0
- package/dist/inventory/contracts/forecast.js +1 -0
- package/dist/inventory/contracts/index.d.ts +4 -0
- package/dist/inventory/contracts/index.js +1 -0
- package/dist/inventory/contracts/inventory.d.ts +157 -0
- package/dist/inventory/contracts/inventory.js +1 -0
- package/dist/inventory/contracts/newPurchaseStock.d.ts +20 -0
- package/dist/inventory/contracts/newPurchaseStock.js +1 -0
- package/dist/inventory/contracts/reservation.d.ts +18 -0
- package/dist/inventory/contracts/reservation.js +1 -0
- package/dist/inventory/forecast.d.ts +24 -0
- package/dist/inventory/forecast.js +200 -0
- package/dist/inventory/index.d.ts +13 -0
- package/dist/inventory/index.js +10 -0
- package/dist/inventory/inventoryHandlers.d.ts +53 -0
- package/dist/inventory/inventoryHandlers.js +151 -0
- package/dist/inventory/newPurchaseStockAvailability.d.ts +47 -0
- package/dist/inventory/newPurchaseStockAvailability.js +75 -0
- package/dist/inventory/ports.d.ts +21 -0
- package/dist/inventory/ports.js +16 -0
- package/dist/inventory/renewalReservation.d.ts +27 -0
- package/dist/inventory/renewalReservation.js +61 -0
- package/dist/inventory/reservationPolicy.d.ts +6 -0
- package/dist/inventory/reservationPolicy.js +19 -0
- package/dist/inventory/schemas.d.ts +137 -0
- package/dist/inventory/schemas.js +112 -0
- package/dist/inventory/sql.d.ts +14 -0
- package/dist/inventory/sql.js +5 -0
- package/dist/inventory/subscriptionForecastCalculation.d.ts +4 -0
- package/dist/inventory/subscriptionForecastCalculation.js +133 -0
- package/dist/pricing/acquisitionFinancialPolicy.d.ts +26 -0
- package/dist/pricing/acquisitionFinancialPolicy.js +1 -0
- package/dist/pricing/acquisitionOfferPricing.d.ts +27 -0
- package/dist/pricing/acquisitionOfferPricing.js +25 -0
- package/dist/pricing/acquisitionOfferPricingHandler.d.ts +20 -0
- package/dist/pricing/acquisitionOfferPricingHandler.js +105 -0
- package/dist/pricing/acquisitionOfferPricingSchemas.d.ts +31 -0
- package/dist/pricing/acquisitionOfferPricingSchemas.js +33 -0
- package/dist/pricing/acquisitionQuoteBinding.d.ts +12 -0
- package/dist/pricing/acquisitionQuoteBinding.js +12 -0
- package/dist/pricing/acquisitionReadiness.d.ts +31 -0
- package/dist/pricing/acquisitionReadiness.js +117 -0
- package/dist/pricing/acquisitionTerms.d.ts +19 -0
- package/dist/pricing/acquisitionTerms.js +126 -0
- package/dist/pricing/acquisitionTermsSchemas.d.ts +59 -0
- package/dist/pricing/acquisitionTermsSchemas.js +42 -0
- package/dist/pricing/catalogFactsProvenance.d.ts +33 -0
- package/dist/pricing/catalogFactsProvenance.js +64 -0
- package/dist/pricing/catalogFactsSchemas.d.ts +45 -0
- package/dist/pricing/catalogFactsSchemas.js +58 -0
- package/dist/pricing/commerceOfferPricing.d.ts +25 -0
- package/dist/pricing/commerceOfferPricing.js +139 -0
- package/dist/pricing/commerceOfferPricingCache.d.ts +10 -0
- package/dist/pricing/commerceOfferPricingCache.js +44 -0
- package/dist/pricing/commerceOfferPricingHandler.d.ts +21 -0
- package/dist/pricing/commerceOfferPricingHandler.js +78 -0
- package/dist/pricing/commercePriceAuthority.d.ts +26 -0
- package/dist/pricing/commercePriceAuthority.js +79 -0
- package/dist/pricing/commercePricingPolicyErrors.d.ts +40 -0
- package/dist/pricing/commercePricingPolicyErrors.js +67 -0
- package/dist/pricing/commerceQuoteBatchHandler.d.ts +37 -0
- package/dist/pricing/commerceQuoteBatchHandler.js +83 -0
- package/dist/pricing/commerceQuoteCatalogReadPort.d.ts +27 -0
- package/dist/pricing/commerceQuoteCatalogReadPort.js +8 -0
- package/dist/pricing/commerceQuoteHandler.d.ts +31 -0
- package/dist/pricing/commerceQuoteHandler.js +110 -0
- package/dist/pricing/commerceQuoteSnapshotExpect.d.ts +9 -0
- package/dist/pricing/commerceQuoteSnapshotExpect.js +22 -0
- package/dist/pricing/contracts/acquisitionTerms.d.ts +32 -0
- package/dist/pricing/contracts/acquisitionTerms.js +2 -0
- package/dist/pricing/contracts/authority.d.ts +27 -0
- package/dist/pricing/contracts/authority.js +1 -0
- package/dist/pricing/contracts/evidence.d.ts +33 -0
- package/dist/pricing/contracts/evidence.js +1 -0
- package/dist/pricing/contracts/index.d.ts +17 -0
- package/dist/pricing/contracts/index.js +7 -0
- package/dist/pricing/contracts/money.d.ts +27 -0
- package/dist/pricing/contracts/money.js +1 -0
- package/dist/pricing/contracts/offer.d.ts +52 -0
- package/dist/pricing/contracts/offer.js +4 -0
- package/dist/pricing/contracts/offerPolicy.d.ts +16 -0
- package/dist/pricing/contracts/offerPolicy.js +5 -0
- package/dist/pricing/contracts/policy.d.ts +22 -0
- package/dist/pricing/contracts/policy.js +3 -0
- package/dist/pricing/contracts/provenance.d.ts +24 -0
- package/dist/pricing/contracts/provenance.js +2 -0
- package/dist/pricing/contracts/quote.d.ts +94 -0
- package/dist/pricing/contracts/quote.js +1 -0
- package/dist/pricing/dbBackedCommerceQuoteHelpers.d.ts +78 -0
- package/dist/pricing/dbBackedCommerceQuoteHelpers.js +146 -0
- package/dist/pricing/dbBackedCommerceQuotePort.d.ts +66 -0
- package/dist/pricing/dbBackedCommerceQuotePort.js +206 -0
- package/dist/pricing/dbBackedCommerceQuoteSnapshotVerifier.d.ts +4 -0
- package/dist/pricing/dbBackedCommerceQuoteSnapshotVerifier.js +25 -0
- package/dist/pricing/index.d.ts +51 -0
- package/dist/pricing/index.js +36 -0
- package/dist/pricing/offerPolicyReadiness.d.ts +21 -0
- package/dist/pricing/offerPolicyReadiness.js +79 -0
- package/dist/pricing/offerPolicySchemas.d.ts +25 -0
- package/dist/pricing/offerPolicySchemas.js +15 -0
- package/dist/pricing/offerPricingSchemas.d.ts +315 -0
- package/dist/pricing/offerPricingSchemas.js +65 -0
- package/dist/pricing/ports.d.ts +13 -0
- package/dist/pricing/ports.js +9 -0
- package/dist/pricing/pricingPolicyToken.d.ts +39 -0
- package/dist/pricing/pricingPolicyToken.js +84 -0
- package/dist/pricing/quoteAcquisitionTerms.d.ts +2 -0
- package/dist/pricing/quoteAcquisitionTerms.js +4 -0
- package/dist/pricing/quoteCodeRejectionDetails.d.ts +20 -0
- package/dist/pricing/quoteCodeRejectionDetails.js +22 -0
- package/dist/pricing/quotePorts.d.ts +30 -0
- package/dist/pricing/quotePorts.js +20 -0
- package/dist/pricing/quotePrimitives.d.ts +13 -0
- package/dist/pricing/quotePrimitives.js +18 -0
- package/dist/pricing/quotePromotionEvidence.d.ts +39 -0
- package/dist/pricing/quotePromotionEvidence.js +73 -0
- package/dist/pricing/quoteSchemas.d.ts +1176 -0
- package/dist/pricing/quoteSchemas.js +196 -0
- package/dist/pricing/subscriptionPricePolicy.d.ts +52 -0
- package/dist/pricing/subscriptionPricePolicy.js +96 -0
- package/dist/pricing/taxProfileGuard.d.ts +2 -0
- package/dist/pricing/taxProfileGuard.js +24 -0
- package/dist/pricing/validation.d.ts +2 -0
- package/dist/pricing/validation.js +3 -0
- package/dist/promotions/adminBindings.d.ts +72 -0
- package/dist/promotions/adminBindings.js +1 -0
- package/dist/promotions/adminPromotionCodesContracts.d.ts +498 -0
- package/dist/promotions/adminPromotionCodesContracts.js +211 -0
- package/dist/promotions/adminPromotionCodesDataPort.d.ts +47 -0
- package/dist/promotions/adminPromotionCodesDataPort.js +1 -0
- package/dist/promotions/adminPromotionCodesHandler.d.ts +14 -0
- package/dist/promotions/adminPromotionCodesHandler.js +194 -0
- package/dist/promotions/adminPromotionsContracts.d.ts +235 -0
- package/dist/promotions/adminPromotionsContracts.js +99 -0
- package/dist/promotions/adminPromotionsDataPort.d.ts +42 -0
- package/dist/promotions/adminPromotionsDataPort.js +1 -0
- package/dist/promotions/adminPromotionsHandler.d.ts +16 -0
- package/dist/promotions/adminPromotionsHandler.js +47 -0
- package/dist/promotions/contracts/index.d.ts +387 -0
- package/dist/promotions/contracts/index.js +1 -0
- package/dist/promotions/index.d.ts +22 -0
- package/dist/promotions/index.js +21 -0
- package/dist/promotions/promoDataPort.d.ts +47 -0
- package/dist/promotions/promoDataPort.js +14 -0
- package/dist/promotions/promotionAcceptanceTelemetry.d.ts +29 -0
- package/dist/promotions/promotionAcceptanceTelemetry.js +45 -0
- package/dist/promotions/promotionBenefitDefinition.d.ts +37 -0
- package/dist/promotions/promotionBenefitDefinition.js +33 -0
- package/dist/promotions/promotionClaimSweepPort.d.ts +14 -0
- package/dist/promotions/promotionClaimSweepPort.js +8 -0
- package/dist/promotions/promotionClaims.d.ts +5 -0
- package/dist/promotions/promotionClaims.js +57 -0
- package/dist/promotions/promotionCodePreview.d.ts +11 -0
- package/dist/promotions/promotionCodePreview.js +154 -0
- package/dist/promotions/promotionCodeQuotePort.d.ts +25 -0
- package/dist/promotions/promotionCodeQuotePort.js +1 -0
- package/dist/promotions/promotionQuoteAcceptance.d.ts +65 -0
- package/dist/promotions/promotionQuoteAcceptance.js +202 -0
- package/dist/promotions/promotionQuoteBinding.d.ts +71 -0
- package/dist/promotions/promotionQuoteBinding.js +85 -0
- package/dist/promotions/quoteAutomaticPromotions.d.ts +24 -0
- package/dist/promotions/quoteAutomaticPromotions.js +36 -0
- package/dist/promotions/quotePromoDiscounts.d.ts +32 -0
- package/dist/promotions/quotePromoDiscounts.js +140 -0
- package/dist/promotions/quotePromotionCodeAdjustments.d.ts +27 -0
- package/dist/promotions/quotePromotionCodeAdjustments.js +223 -0
- package/dist/promotions/quotePromotionV2.d.ts +29 -0
- package/dist/promotions/quotePromotionV2.js +174 -0
- package/dist/promotions/sql.d.ts +14 -0
- package/dist/promotions/sql.js +5 -0
- package/dist/promotions/validation.d.ts +2 -0
- package/dist/promotions/validation.js +3 -0
- package/dist/shipping/addressCanonLookupHandler.d.ts +7 -0
- package/dist/shipping/addressCanonLookupHandler.js +105 -0
- package/dist/shipping/addressCanonical.d.ts +2 -0
- package/dist/shipping/addressCanonical.js +26 -0
- package/dist/shipping/addressPorts.d.ts +39 -0
- package/dist/shipping/addressPorts.js +1 -0
- package/dist/shipping/addressSchemas.d.ts +30 -0
- package/dist/shipping/addressSchemas.js +1 -0
- package/dist/shipping/adminShippingRateHandler.d.ts +4 -0
- package/dist/shipping/adminShippingRateHandler.js +64 -0
- package/dist/shipping/contracts/address.d.ts +144 -0
- package/dist/shipping/contracts/address.js +1 -0
- package/dist/shipping/contracts/delivery.d.ts +110 -0
- package/dist/shipping/contracts/delivery.js +1 -0
- package/dist/shipping/contracts/index.d.ts +3 -0
- package/dist/shipping/contracts/index.js +1 -0
- package/dist/shipping/contracts/shippingRate.d.ts +11 -0
- package/dist/shipping/contracts/shippingRate.js +1 -0
- package/dist/shipping/customerAddressesHandler.d.ts +5 -0
- package/dist/shipping/customerAddressesHandler.js +80 -0
- package/dist/shipping/customerSelfServiceAddressModels.d.ts +27 -0
- package/dist/shipping/customerSelfServiceAddressModels.js +101 -0
- package/dist/shipping/deliverySelectionHandler.d.ts +10 -0
- package/dist/shipping/deliverySelectionHandler.js +77 -0
- package/dist/shipping/deliverySelectionPort.d.ts +8 -0
- package/dist/shipping/deliverySelectionPort.js +1 -0
- package/dist/shipping/deliverySelectionSummary.d.ts +2 -0
- package/dist/shipping/deliverySelectionSummary.js +53 -0
- package/dist/shipping/handlerSchemas.d.ts +21 -0
- package/dist/shipping/handlerSchemas.js +1 -0
- package/dist/shipping/index.d.ts +17 -0
- package/dist/shipping/index.js +8 -0
- package/dist/shipping/pickupPointSearchPort.d.ts +4 -0
- package/dist/shipping/pickupPointSearchPort.js +1 -0
- package/dist/shipping/readDeliverySelectionEvidence.d.ts +2 -0
- package/dist/shipping/readDeliverySelectionEvidence.js +44 -0
- package/dist/shipping/shippingRatePorts.d.ts +52 -0
- package/dist/shipping/shippingRatePorts.js +1 -0
- package/package.json +72 -2
- package/release-gates.json +249 -8
- package/sql/20260807140000_read_parity_catalog.sql +94 -0
- package/sql/20260807190000_comms_outbox_rail.sql +329 -0
- package/sql/20260810120000_storefront_catalog_attributes.sql +51 -0
- package/sql/20260810120001_transactional_delivery_receipts.sql +209 -0
- package/sql/20260812140000_sellable_bundle_catalog.sql +124 -0
- package/sql/20260812210000_bundle_operator_write_boundary.sql +567 -0
- package/sql/20260813120000_communications_control_plane.sql +568 -0
- package/sql/20260814000000_fulfillment_stock_evidence.sql +239 -0
- package/sql/20260815120000_automatic_subscription_renewal.sql +1083 -0
- package/sql/20260817180000_promotion_claim_lifecycle.sql +591 -0
- package/sql/20260817180100_promotion_claim_lifecycle_validation.sql +23 -0
- package/sql/20260827220000_catalog_document_revision_foundation.sql +226 -0
- package/sql/20260827220001_catalog_document_revision_foundation_validate.sql +10 -0
- package/sql/20260908100000_catalog_draft_foundation.sql +217 -0
- package/sql/20261019200000_communications_native_operations.sql +68 -0
- package/src/catalog/activeSkuSelection.ts +20 -0
- package/src/catalog/adminBindings.ts +59 -0
- package/src/catalog/adminBundleHandler.ts +165 -0
- package/src/catalog/adminBundleReadHandler.ts +261 -0
- package/src/catalog/adminBundleWritePort.ts +102 -0
- package/src/catalog/bundleAvailability.ts +129 -0
- package/src/catalog/bundleAvailabilityService.ts +171 -0
- package/src/catalog/bundleBindings.ts +29 -0
- package/src/catalog/bundleCatalogQueries.ts +98 -0
- package/src/catalog/bundleCatalogReadPort.ts +177 -0
- package/src/catalog/bundleCatalogStore.ts +269 -0
- package/src/catalog/bundleRuleCodes.ts +134 -0
- package/src/catalog/bundleRules.ts +153 -0
- package/src/catalog/catalogDraftStore.ts +71 -0
- package/src/catalog/catalogSkuEnvelope.ts +214 -0
- package/src/catalog/catalogSkuEnvelopeMapper.ts +160 -0
- package/src/catalog/contracts/bundleAdmin.ts +20 -0
- package/src/catalog/contracts/bundleAvailability.ts +5 -0
- package/src/catalog/contracts/bundleRead.ts +13 -0
- package/src/catalog/contracts/draft.ts +69 -0
- package/src/catalog/contracts/foundation.ts +104 -0
- package/src/catalog/contracts/index.ts +14 -0
- package/src/catalog/contracts/lifecycle.ts +74 -0
- package/src/catalog/contracts/productMediaContracts.ts +170 -0
- package/src/catalog/contracts/productTypes.ts +35 -0
- package/src/catalog/contracts/resolveProductMedia.ts +85 -0
- package/src/catalog/contracts/sellable.ts +12 -0
- package/src/catalog/draftHandler.ts +105 -0
- package/src/catalog/draftPorts.ts +18 -0
- package/src/catalog/draftSchemas.ts +88 -0
- package/src/catalog/draftValidation.ts +100 -0
- package/src/catalog/foundationSchemas.ts +123 -0
- package/src/catalog/index.ts +43 -0
- package/src/catalog/mediaSourcePack.ts +219 -0
- package/src/catalog/productTypeSchemas.ts +70 -0
- package/src/catalog/publicationPorts.ts +44 -0
- package/src/catalog/readPorts.ts +61 -0
- package/src/catalog/referenceCatalogHandler.ts +39 -0
- package/src/catalog/resolvedSkuProjection.ts +76 -0
- package/src/catalog/sellableBundleHandler.ts +133 -0
- package/src/catalog/sellableSchemas.ts +33 -0
- package/src/catalog/sql.ts +14 -0
- package/src/catalog/validation.ts +3 -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 +52 -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/marketingSync.ts +109 -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 +47 -0
- package/src/communications/integrationEventSignature.ts +49 -0
- package/src/communications/klaviyo/consentPush.ts +19 -0
- package/src/communications/klaviyo/index.ts +649 -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/resend/index.ts +350 -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/composition/catalogContribution.ts +32 -0
- package/src/composition/index.ts +1 -0
- package/src/http/index.ts +1 -0
- package/src/http/webhookSignature.ts +96 -0
- package/src/inventory/adminInventory.ts +251 -0
- package/src/inventory/contracts/forecast.ts +96 -0
- package/src/inventory/contracts/index.ts +18 -0
- package/src/inventory/contracts/inventory.ts +14 -0
- package/src/inventory/contracts/newPurchaseStock.ts +23 -0
- package/src/inventory/contracts/reservation.ts +20 -0
- package/src/inventory/forecast.ts +239 -0
- package/src/inventory/index.ts +21 -0
- package/src/inventory/inventoryHandlers.ts +215 -0
- package/src/inventory/newPurchaseStockAvailability.ts +120 -0
- package/src/inventory/ports.ts +46 -0
- package/src/inventory/renewalReservation.ts +88 -0
- package/src/inventory/reservationPolicy.ts +27 -0
- package/src/inventory/schemas.ts +128 -0
- package/src/inventory/sql.ts +5 -0
- package/src/inventory/subscriptionForecastCalculation.ts +157 -0
- package/src/pricing/acquisitionFinancialPolicy.ts +26 -0
- package/src/pricing/acquisitionOfferPricing.ts +38 -0
- package/src/pricing/acquisitionOfferPricingHandler.ts +157 -0
- package/src/pricing/acquisitionOfferPricingSchemas.ts +35 -0
- package/src/pricing/acquisitionQuoteBinding.ts +12 -0
- package/src/pricing/acquisitionReadiness.ts +148 -0
- package/src/pricing/acquisitionTerms.ts +125 -0
- package/src/pricing/acquisitionTermsSchemas.ts +52 -0
- package/src/pricing/catalogFactsProvenance.ts +102 -0
- package/src/pricing/catalogFactsSchemas.ts +69 -0
- package/src/pricing/commerceOfferPricing.ts +224 -0
- package/src/pricing/commerceOfferPricingCache.ts +53 -0
- package/src/pricing/commerceOfferPricingHandler.ts +137 -0
- package/src/pricing/commercePriceAuthority.ts +104 -0
- package/src/pricing/commercePricingPolicyErrors.ts +88 -0
- package/src/pricing/commerceQuoteBatchHandler.ts +129 -0
- package/src/pricing/commerceQuoteCatalogReadPort.ts +42 -0
- package/src/pricing/commerceQuoteHandler.ts +184 -0
- package/src/pricing/commerceQuoteSnapshotExpect.ts +48 -0
- package/src/pricing/contracts/acquisitionTerms.ts +26 -0
- package/src/pricing/contracts/authority.ts +44 -0
- package/src/pricing/contracts/evidence.ts +25 -0
- package/src/pricing/contracts/index.ts +17 -0
- package/src/pricing/contracts/money.ts +32 -0
- package/src/pricing/contracts/offer.ts +42 -0
- package/src/pricing/contracts/offerPolicy.ts +17 -0
- package/src/pricing/contracts/policy.ts +26 -0
- package/src/pricing/contracts/provenance.ts +19 -0
- package/src/pricing/contracts/quote.ts +106 -0
- package/src/pricing/dbBackedCommerceQuoteHelpers.ts +256 -0
- package/src/pricing/dbBackedCommerceQuotePort.ts +260 -0
- package/src/pricing/dbBackedCommerceQuoteSnapshotVerifier.ts +49 -0
- package/src/pricing/index.ts +52 -0
- package/src/pricing/offerPolicyReadiness.ts +110 -0
- package/src/pricing/offerPolicySchemas.ts +23 -0
- package/src/pricing/offerPricingSchemas.ts +92 -0
- package/src/pricing/ports.ts +17 -0
- package/src/pricing/pricingPolicyToken.ts +119 -0
- package/src/pricing/quoteAcquisitionTerms.ts +10 -0
- package/src/pricing/quoteCodeRejectionDetails.ts +23 -0
- package/src/pricing/quotePorts.ts +58 -0
- package/src/pricing/quotePrimitives.ts +21 -0
- package/src/pricing/quotePromotionEvidence.ts +82 -0
- package/src/pricing/quoteSchemas.ts +230 -0
- package/src/pricing/subscriptionPricePolicy.ts +113 -0
- package/src/pricing/taxProfileGuard.ts +33 -0
- package/src/pricing/validation.ts +3 -0
- package/src/promotions/adminBindings.ts +53 -0
- package/src/promotions/adminPromotionCodesContracts.ts +244 -0
- package/src/promotions/adminPromotionCodesDataPort.ts +56 -0
- package/src/promotions/adminPromotionCodesHandler.ts +254 -0
- package/src/promotions/adminPromotionsContracts.ts +121 -0
- package/src/promotions/adminPromotionsDataPort.ts +48 -0
- package/src/promotions/adminPromotionsHandler.ts +72 -0
- package/src/promotions/contracts/index.ts +387 -0
- package/src/promotions/index.ts +22 -0
- package/src/promotions/promoDataPort.ts +65 -0
- package/src/promotions/promotionAcceptanceTelemetry.ts +73 -0
- package/src/promotions/promotionBenefitDefinition.ts +48 -0
- package/src/promotions/promotionClaimSweepPort.ts +23 -0
- package/src/promotions/promotionClaims.ts +70 -0
- package/src/promotions/promotionCodePreview.ts +183 -0
- package/src/promotions/promotionCodeQuotePort.ts +35 -0
- package/src/promotions/promotionQuoteAcceptance.ts +284 -0
- package/src/promotions/promotionQuoteBinding.ts +158 -0
- package/src/promotions/quoteAutomaticPromotions.ts +58 -0
- package/src/promotions/quotePromoDiscounts.ts +185 -0
- package/src/promotions/quotePromotionCodeAdjustments.ts +277 -0
- package/src/promotions/quotePromotionV2.ts +223 -0
- package/src/promotions/sql.ts +5 -0
- package/src/promotions/validation.ts +3 -0
- package/src/shipping/addressCanonLookupHandler.ts +114 -0
- package/src/shipping/addressCanonical.ts +31 -0
- package/src/shipping/addressPorts.ts +48 -0
- package/src/shipping/addressSchemas.ts +28 -0
- package/src/shipping/adminShippingRateHandler.ts +72 -0
- package/src/shipping/contracts/address.ts +71 -0
- package/src/shipping/contracts/delivery.ts +114 -0
- package/src/shipping/contracts/index.ts +18 -0
- package/src/shipping/contracts/shippingRate.ts +7 -0
- package/src/shipping/customerAddressesHandler.ts +100 -0
- package/src/shipping/customerSelfServiceAddressModels.ts +124 -0
- package/src/shipping/deliverySelectionHandler.ts +94 -0
- package/src/shipping/deliverySelectionPort.ts +10 -0
- package/src/shipping/deliverySelectionSummary.ts +56 -0
- package/src/shipping/handlerSchemas.ts +19 -0
- package/src/shipping/index.ts +23 -0
- package/src/shipping/pickupPointSearchPort.ts +8 -0
- package/src/shipping/readDeliverySelectionEvidence.ts +51 -0
- package/src/shipping/shippingRatePorts.ts +36 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export type * from "./authEmail.js";
|
|
2
|
+
export type * from "./email.js";
|
|
3
|
+
export type * from "./newsletter.js";
|
|
4
|
+
export type * from "./newsletterWebhook.js";
|
|
5
|
+
export type * from "./publicIntake.js";
|
|
6
|
+
export type * from "./transactionalDelivery.js";
|
|
7
|
+
export type * from "./types.js";
|
|
8
|
+
export type * from "./consent.js";
|
|
9
|
+
export type * from "./marketingAutomation.js";
|
|
10
|
+
export * from "./render.js";
|
|
11
|
+
export * from "./blocks.js";
|
|
12
|
+
export * from "./commerceEmailContent.js";
|
|
13
|
+
export * from "./commerceEngagementEmailContent.js";
|
|
14
|
+
export * from "./subscriptionEmailContent.js";
|
|
15
|
+
export * from "./guideCard.js";
|
|
16
|
+
export * from "./abandonedCart.js";
|
|
17
|
+
export * from "./backInStock.js";
|
|
18
|
+
export * from "./checkoutExpired.js";
|
|
19
|
+
export * from "./checkoutRecovery.js";
|
|
20
|
+
export * from "./orderCanceled.js";
|
|
21
|
+
export * from "./orderDraft.js";
|
|
22
|
+
export * from "./orderPaid.js";
|
|
23
|
+
export * from "./orderRefunded.js";
|
|
24
|
+
export * from "./paymentFailed.js";
|
|
25
|
+
export * from "./reorderReminder.js";
|
|
26
|
+
export * from "./returnEmails.js";
|
|
27
|
+
export * from "./reviewEffects.js";
|
|
28
|
+
export * from "./reviewRequest.js";
|
|
29
|
+
export * from "./shipmentDelivered.js";
|
|
30
|
+
export * from "./shipmentDispatched.js";
|
|
31
|
+
export * from "./shipmentException.js";
|
|
32
|
+
export * from "./subscriptionActivationActionRequired.js";
|
|
33
|
+
export * from "./subscriptionAddressChanged.js";
|
|
34
|
+
export * from "./subscriptionCancelled.js";
|
|
35
|
+
export * from "./subscriptionCycleSkipped.js";
|
|
36
|
+
export * from "./subscriptionDeliveryRescheduled.js";
|
|
37
|
+
export * from "./subscriptionPackageChanged.js";
|
|
38
|
+
export * from "./subscriptionPauseReminder.js";
|
|
39
|
+
export * from "./subscriptionPaused.js";
|
|
40
|
+
export * from "./subscriptionPaymentExpired.js";
|
|
41
|
+
export * from "./subscriptionPaymentFailed.js";
|
|
42
|
+
export * from "./subscriptionPaymentRecovered.js";
|
|
43
|
+
export * from "./subscriptionRenewalAtRisk.js";
|
|
44
|
+
export * from "./subscriptionRenewalUpcoming.js";
|
|
45
|
+
export * from "./subscriptionResumed.js";
|
|
46
|
+
export * from "./subscriptionWelcome.js";
|
|
47
|
+
export * from "./subscriptionWinback.js";
|
|
48
|
+
export * from "./invoiceDocumentContent.js";
|
|
49
|
+
export * from "./roleNotificationContent.js";
|
|
50
|
+
export * from "./inquiryContent.js";
|
|
51
|
+
export * from "./optOutContent.js";
|
|
52
|
+
export type * from "./marketingSync.js";
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { Locale } from "./email.js";
|
|
2
|
+
import { button, dataTable, heading, paragraph, type DataRow, type EmailBlock } from "./blocks.js";
|
|
3
|
+
|
|
4
|
+
export interface InquiryVars {
|
|
5
|
+
displayName: string;
|
|
6
|
+
contact: string;
|
|
7
|
+
/** Host-resolved labels and values; omit optional rows rather than inventing them. */
|
|
8
|
+
details: DataRow[];
|
|
9
|
+
operatorUrl: string;
|
|
10
|
+
}
|
|
11
|
+
export interface InquiryCopy {
|
|
12
|
+
receiptSubject: string;
|
|
13
|
+
receiptGreeting: (name: string) => string;
|
|
14
|
+
receiptBody: string;
|
|
15
|
+
noticeSubject: string;
|
|
16
|
+
noticeBody: string;
|
|
17
|
+
nameLabel: string;
|
|
18
|
+
contactLabel: string;
|
|
19
|
+
cta: string;
|
|
20
|
+
}
|
|
21
|
+
const defaults: Record<Locale, InquiryCopy> = {
|
|
22
|
+
pl: {
|
|
23
|
+
receiptSubject: "Otrzymaliśmy Twoje zapytanie",
|
|
24
|
+
receiptGreeting: name => `Dziękujemy za kontakt, ${name}.`,
|
|
25
|
+
receiptBody: "Potwierdzamy otrzymanie Twojego zapytania.",
|
|
26
|
+
noticeSubject: "Nowe zapytanie", noticeBody: "Otrzymano nowe zapytanie.",
|
|
27
|
+
nameLabel: "Imię i nazwisko", contactLabel: "Kontakt", cta: "Otwórz zapytanie",
|
|
28
|
+
},
|
|
29
|
+
en: {
|
|
30
|
+
receiptSubject: "We've received your inquiry",
|
|
31
|
+
receiptGreeting: name => `Thank you for contacting us, ${name}.`,
|
|
32
|
+
receiptBody: "We confirm receipt of your inquiry.",
|
|
33
|
+
noticeSubject: "New inquiry", noticeBody: "A new inquiry has been received.",
|
|
34
|
+
nameLabel: "Name", contactLabel: "Contact", cta: "Open inquiry",
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/** Presentation only: no recipient, sender, response-time promise or country policy. */
|
|
39
|
+
export function createInquiryContentFactory(copy: Record<Locale, InquiryCopy> = defaults) {
|
|
40
|
+
function inquiryReceiptEmailContent(locale: Locale, vars: InquiryVars, signoff: string): { subject: string; preheader: string; blocks: EmailBlock[] } {
|
|
41
|
+
const c = copy[locale];
|
|
42
|
+
return { subject: c.receiptSubject, preheader: c.receiptBody,
|
|
43
|
+
blocks: [heading(c.receiptSubject), paragraph(c.receiptGreeting(vars.displayName)), paragraph(c.receiptBody), paragraph(signoff)] };
|
|
44
|
+
}
|
|
45
|
+
function inquiryNoticeEmailContent(locale: Locale, vars: InquiryVars, signoff: string): { subject: string; preheader: string; blocks: EmailBlock[] } {
|
|
46
|
+
const c = copy[locale];
|
|
47
|
+
return { subject: c.noticeSubject, preheader: c.noticeBody,
|
|
48
|
+
blocks: [heading(c.noticeSubject), paragraph(c.noticeBody),
|
|
49
|
+
dataTable([{ label: c.nameLabel, value: vars.displayName }, { label: c.contactLabel, value: vars.contact }, ...vars.details]),
|
|
50
|
+
button(c.cta, vars.operatorUrl), paragraph(signoff)] };
|
|
51
|
+
}
|
|
52
|
+
return { inquiryReceiptEmailContent, inquiryNoticeEmailContent };
|
|
53
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { Locale } from "./email.js";
|
|
2
|
+
import { button, dataTable, heading, paragraph, type EmailBlock } from "./blocks.js";
|
|
3
|
+
|
|
4
|
+
export interface InvoiceDocumentVars {
|
|
5
|
+
orderRef: string;
|
|
6
|
+
documentNumber: string;
|
|
7
|
+
kind: "invoice" | "correction";
|
|
8
|
+
accountDocumentsUrl: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface InvoiceDocumentCopy {
|
|
12
|
+
subject: (orderRef: string, correction: boolean) => string;
|
|
13
|
+
preheader: (correction: boolean) => string;
|
|
14
|
+
heading: (correction: boolean) => string;
|
|
15
|
+
attachment: (correction: boolean) => string;
|
|
16
|
+
orderLabel: string;
|
|
17
|
+
documentLabel: (correction: boolean) => string;
|
|
18
|
+
cta: string;
|
|
19
|
+
availability: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const defaults: Record<Locale, InvoiceDocumentCopy> = {
|
|
23
|
+
pl: {
|
|
24
|
+
subject: (ref, correction) => `${correction ? "Korekta faktury" : "Faktura"} do zamówienia ${ref}`,
|
|
25
|
+
preheader: correction => `${correction ? "Korektę" : "Dokument"} znajdziesz w załączniku i na swoim koncie.`,
|
|
26
|
+
heading: correction => correction ? "Korekta faktury jest gotowa" : "Twoja faktura jest gotowa",
|
|
27
|
+
attachment: correction => correction ? "Korektę faktury przesyłamy w załączniku PDF." : "Fakturę przesyłamy w załączniku PDF.",
|
|
28
|
+
orderLabel: "Zamówienie",
|
|
29
|
+
documentLabel: correction => correction ? "Korekta" : "Faktura",
|
|
30
|
+
cta: "Zobacz dokumenty na koncie",
|
|
31
|
+
availability: "Dokument pozostaje dostępny na Twoim koncie niezależnie od dostarczenia tej wiadomości.",
|
|
32
|
+
},
|
|
33
|
+
en: {
|
|
34
|
+
subject: (ref, correction) => `${correction ? "Invoice correction" : "Invoice"} for order ${ref}`,
|
|
35
|
+
preheader: correction => `The ${correction ? "correction" : "document"} is attached and available in your account.`,
|
|
36
|
+
heading: correction => correction ? "Your invoice correction is ready" : "Your invoice is ready",
|
|
37
|
+
attachment: correction => correction ? "Your invoice correction is attached as a PDF." : "Your invoice is attached as a PDF.",
|
|
38
|
+
orderLabel: "Order",
|
|
39
|
+
documentLabel: correction => correction ? "Correction" : "Invoice",
|
|
40
|
+
cta: "View documents in your account",
|
|
41
|
+
availability: "The document remains available in your account regardless of delivery of this message.",
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/** Pure defaults; hosts may replace the complete bilingual copy. */
|
|
46
|
+
export function createInvoiceDocumentContentFactory(copy: Record<Locale, InvoiceDocumentCopy> = defaults) {
|
|
47
|
+
function invoiceDocumentEmailContent(locale: Locale, vars: InvoiceDocumentVars): { subject: string; preheader: string; blocks: EmailBlock[] } {
|
|
48
|
+
const c = copy[locale], correction = vars.kind === "correction";
|
|
49
|
+
return {
|
|
50
|
+
subject: c.subject(vars.orderRef, correction), preheader: c.preheader(correction),
|
|
51
|
+
blocks: [heading(c.heading(correction)), paragraph(c.attachment(correction)),
|
|
52
|
+
dataTable([{ label: c.orderLabel, value: vars.orderRef }, { label: c.documentLabel(correction), value: vars.documentNumber }]),
|
|
53
|
+
button(c.cta, vars.accountDocumentsUrl), paragraph(c.availability, { muted: true })],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return { invoiceDocumentEmailContent };
|
|
57
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/** Scope is selected by the host. Remote account state is never local consent authority. */
|
|
2
|
+
export interface MarketingAutomationScope {
|
|
3
|
+
readonly bindingId: string;
|
|
4
|
+
readonly accountReference: string;
|
|
5
|
+
readonly audienceReference: string;
|
|
6
|
+
}
|
|
7
|
+
export interface MarketingAutomationClaim {
|
|
8
|
+
readonly scope: MarketingAutomationScope;
|
|
9
|
+
readonly effectId: string;
|
|
10
|
+
readonly idempotencyKey: string;
|
|
11
|
+
readonly claimToken: string;
|
|
12
|
+
readonly generation: number;
|
|
13
|
+
readonly deadlineMs: number;
|
|
14
|
+
readonly attempt: number;
|
|
15
|
+
/** Opaque host reference; no email, profile attributes, tokens or payload bodies. */
|
|
16
|
+
readonly subjectReference: string;
|
|
17
|
+
}
|
|
18
|
+
export type MarketingAutomationObservation = {
|
|
19
|
+
readonly effectId: string;
|
|
20
|
+
readonly generation: number;
|
|
21
|
+
readonly observedAtMs: number;
|
|
22
|
+
} & (
|
|
23
|
+
| { readonly status: "accepted"; readonly remoteReference: string }
|
|
24
|
+
| { readonly status: "ambiguous"; readonly retryAfterMs: number }
|
|
25
|
+
| { readonly status: "throttled"; readonly retryAfterMs: number }
|
|
26
|
+
| { readonly status: "refused"; readonly reason: "restricted" | "unsupported" | "deadline" | "scope" }
|
|
27
|
+
);
|
|
28
|
+
export interface MarketingAutomationProviderPort {
|
|
29
|
+
readonly scope: MarketingAutomationScope;
|
|
30
|
+
/** Admission is explicit and short lived; scope, deadline and idempotency fences apply at effect time too. */
|
|
31
|
+
admit(claim: MarketingAutomationClaim, nowMs: number): Promise<"admitted" | "refused">;
|
|
32
|
+
/** Acknowledgement needs an observation; acceptance does not mean delivery or grant consent. */
|
|
33
|
+
apply(claim: MarketingAutomationClaim, nowMs: number): Promise<MarketingAutomationObservation>;
|
|
34
|
+
/** Reconcile ambiguity before retrying an effect that might already have been accepted. */
|
|
35
|
+
observe(claim: MarketingAutomationClaim, nowMs: number): Promise<MarketingAutomationObservation | null>;
|
|
36
|
+
}
|
|
37
|
+
export interface MarketingAutomationStorePort {
|
|
38
|
+
/** Unsupported/no-trigger work is not claimed. No runner or schedule is installed by this contract. */
|
|
39
|
+
claim(scope: MarketingAutomationScope, nowMs: number): Promise<MarketingAutomationClaim | null>;
|
|
40
|
+
/** Atomic scope + current token + generation + deadline check before provider admission. */
|
|
41
|
+
isCurrent(claim: MarketingAutomationClaim, nowMs: number): Promise<boolean>;
|
|
42
|
+
/** Persist observation/history with the same fences; stale workers cannot settle newer work. */
|
|
43
|
+
settle(claim: MarketingAutomationClaim, observation: MarketingAutomationObservation, nowMs: number): Promise<boolean>;
|
|
44
|
+
history(scope: MarketingAutomationScope, effectId: string): Promise<readonly MarketingAutomationObservation[]>;
|
|
45
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// Private helpers/symbols, never exported. Brands are not serialization authority.
|
|
2
|
+
declare const subjectBrand: unique symbol, feedbackBrand: unique symbol,
|
|
3
|
+
receiptBrand: unique symbol, readBrand: unique symbol;
|
|
4
|
+
type Operation = "profile.sync" | "consent.read" | "erasure.request" | "erasure.read";
|
|
5
|
+
type Mutation = "profile.sync" | "erasure.request";
|
|
6
|
+
type SubjectReference = string & { readonly [subjectBrand]: "opaque-subject" };
|
|
7
|
+
export type SyncBinding = Readonly<{ account: string; environment: string; namespace: string; mappingVersion: string }>;
|
|
8
|
+
export type SyncAudience = Readonly<{ kind: "account-wide" } | { kind: "audience"; reference: string }>;
|
|
9
|
+
export type ProfileProjection = Readonly<{
|
|
10
|
+
email: string; externalReference: string;
|
|
11
|
+
fields: Readonly<Partial<Record<"givenName" | "familyName" | "locale", string>>>;
|
|
12
|
+
properties: Readonly<Record<string, string | number | boolean>>;
|
|
13
|
+
}>;
|
|
14
|
+
type Payload = {
|
|
15
|
+
"profile.sync": { projection: ProfileProjection; consentEvidenceReference: string };
|
|
16
|
+
"consent.read": Readonly<Record<string, never>>;
|
|
17
|
+
"erasure.request": { caseReference: string; authorityReference: string };
|
|
18
|
+
"erasure.read": { receipt: SyncReceipt<"erasure.request"> };
|
|
19
|
+
};
|
|
20
|
+
export type SyncRequest<O extends Operation = Operation> = { [K in O]: Readonly<{
|
|
21
|
+
binding: SyncBinding; audience: SyncAudience; subjectReference: SubjectReference;
|
|
22
|
+
requestId: string; generation: number; deadlineMs: number; authorizationReference: string;
|
|
23
|
+
operation: K; payload: Readonly<Payload[K]>;
|
|
24
|
+
}> }[O];
|
|
25
|
+
export type NegativeFeedback = Readonly<{
|
|
26
|
+
[feedbackBrand]: "provider-negative"; sourceReference: string; occurredAtMs: number | null; audience: SyncAudience;
|
|
27
|
+
}> & Readonly<
|
|
28
|
+
| { kind: "unsubscribe" | "complaint" | "manual_block"; outcome: "deny_permission" }
|
|
29
|
+
| { kind: "hard_bounce" | "invalid_address"; outcome: "deny_delivery" }
|
|
30
|
+
>;
|
|
31
|
+
export type ConsentReadback = Readonly<{
|
|
32
|
+
audience: SyncAudience; observedAtMs: number;
|
|
33
|
+
remoteConsent: "subscribed" | "unsubscribed" | "pending" | "never_subscribed" | "unknown";
|
|
34
|
+
feedback: readonly NegativeFeedback[];
|
|
35
|
+
// Coverage describes this current-state observation only; never historical completeness.
|
|
36
|
+
coverage: "complete" | "partial" | "unsupported";
|
|
37
|
+
}>;
|
|
38
|
+
export type SyncFailure<O extends Operation = Operation> =
|
|
39
|
+
| { kind: "refused"; reason: "invalid_request" | "binding" | "provenance" | "stale" | "deadline" |
|
|
40
|
+
"unsupported" | "verification_pending" | "restricted" | "identity_conflict" | "provider_refusal" }
|
|
41
|
+
| { kind: "retryable"; reason: "cooling" | "host" | "provider"; afterSeconds: number }
|
|
42
|
+
| ({ kind: "unknown"; reason: "dispatch_unresolved" | "acceptance_ambiguous" | "record_failed" } &
|
|
43
|
+
(O extends Mutation ? { receipt?: SyncReceipt<O> } : { receipt?: never }));
|
|
44
|
+
// Receipt identifies the original admitted mutation; status lives only in the result union.
|
|
45
|
+
export type SyncReceipt<O extends Mutation> = Readonly<{
|
|
46
|
+
[receiptBrand]: O; operation: O; request: SyncRequest<O>;
|
|
47
|
+
}>;
|
|
48
|
+
type MutationSuccess<O extends Mutation> =
|
|
49
|
+
{ kind: "accepted" | "acknowledged"; receipt: SyncReceipt<O>; journal: "confirmed" | "unknown" };
|
|
50
|
+
type Success = {
|
|
51
|
+
"profile.sync": MutationSuccess<"profile.sync">;
|
|
52
|
+
"consent.read": { kind: "completed"; value: ConsentReadback; journal: "confirmed" | "unknown" };
|
|
53
|
+
"erasure.request": MutationSuccess<"erasure.request">;
|
|
54
|
+
"erasure.read": MutationSuccess<"erasure.request"> | {
|
|
55
|
+
kind: "completed"; receipt: SyncReceipt<"erasure.request">; journal: "confirmed" | "unknown";
|
|
56
|
+
evidence: Readonly<{ [readBrand]: "provider-read"; readRequestId: string; observedAtMs: number;
|
|
57
|
+
evidenceReference: string; assurance: "provider_record_deleted" | "provider_erasure_confirmed" }>;
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
export type SyncResult<O extends Operation = Operation> = { [K in O]:
|
|
61
|
+
Readonly<Pick<SyncRequest<K>, "binding" | "operation" | "subjectReference" | "requestId" | "generation">> &
|
|
62
|
+
Readonly<Success[K] | SyncFailure<K>>
|
|
63
|
+
}[O];
|
|
64
|
+
export type SyncCapabilities = Readonly<{ binding: SyncBinding; audience: SyncAudience; operations: Readonly<Record<Operation,
|
|
65
|
+
{ state: "supported"; evidenceReference: string; maxRequestBytes: number; maxFeedbackItems: number } |
|
|
66
|
+
{ state: "unsupported" | "verification_pending" }>> }>;
|
|
67
|
+
export interface ProfileSyncPort {
|
|
68
|
+
sync(request: SyncRequest<"profile.sync">): Promise<SyncResult<"profile.sync">>;
|
|
69
|
+
}
|
|
70
|
+
export interface ConsentReadPort {
|
|
71
|
+
read(request: SyncRequest<"consent.read">): Promise<SyncResult<"consent.read">>;
|
|
72
|
+
}
|
|
73
|
+
export interface ErasurePort {
|
|
74
|
+
request(request: SyncRequest<"erasure.request">): Promise<SyncResult<"erasure.request">>;
|
|
75
|
+
read(request: SyncRequest<"erasure.read">): Promise<SyncResult<"erasure.read">>;
|
|
76
|
+
}
|
|
77
|
+
export interface MarketingSyncProvider {
|
|
78
|
+
readonly capabilities: SyncCapabilities;
|
|
79
|
+
readonly profiles: ProfileSyncPort; readonly consent: ConsentReadPort; readonly erasure: ErasurePort;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export type ConsentPushRequest = Readonly<
|
|
83
|
+
Omit<SyncRequest<"profile.sync">, "operation" | "audience" | "payload"> & {
|
|
84
|
+
operation: "consent.push";
|
|
85
|
+
} & (
|
|
86
|
+
{ audience: Extract<SyncAudience, { kind: "audience" }>;
|
|
87
|
+
payload: Readonly<{ action: "grant"; consentEvidenceReference: string }> } |
|
|
88
|
+
{ audience: SyncAudience;
|
|
89
|
+
payload: Readonly<{ action: "withdraw"; consentEvidenceReference: string }> }
|
|
90
|
+
)>;
|
|
91
|
+
declare const pushReceiptBrand: unique symbol; // private, same receipt style
|
|
92
|
+
type PushReceipt = Readonly<{ [pushReceiptBrand]: "consent.push";
|
|
93
|
+
operation: "consent.push"; request: ConsentPushRequest }>;
|
|
94
|
+
type PushFailure = Exclude<SyncFailure, { kind: "unknown" }> |
|
|
95
|
+
(Omit<Extract<SyncFailure, { kind: "unknown" }>, "receipt"> & { receipt?: PushReceipt });
|
|
96
|
+
export type ConsentPushResult = Readonly<Pick<ConsentPushRequest,
|
|
97
|
+
"binding" | "operation" | "subjectReference" | "requestId" | "generation">> & Readonly<
|
|
98
|
+
{ kind: "accepted" | "acknowledged"; receipt: PushReceipt;
|
|
99
|
+
journal: "confirmed" | "unknown"; reconcileRequired: boolean } | PushFailure>;
|
|
100
|
+
export interface ConsentPushPort {
|
|
101
|
+
readonly capabilities: SyncCapabilities & Readonly<{
|
|
102
|
+
operations: SyncCapabilities["operations"] & Readonly<{
|
|
103
|
+
"consent.push": SyncCapabilities["operations"]["profile.sync"] & Readonly<{
|
|
104
|
+
grantEffect: "audience" | "account-wide";
|
|
105
|
+
}>;
|
|
106
|
+
}>;
|
|
107
|
+
}>;
|
|
108
|
+
push(request: ConsentPushRequest): Promise<ConsentPushResult>;
|
|
109
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
export type NewsletterProviderKind = string;
|
|
2
|
+
export type NewsletterMarketingPurpose = "marketing_launch_offer" | "marketing_newsletter";
|
|
3
|
+
export type NewsletterSyncEventType = "subscribe" | "update" | "unsubscribe" | "suppress";
|
|
4
|
+
export type NewsletterWebhookEventType = "subscribe" | "update" | "unsubscribe" | "suppress" | "complaint" | "bounce" | "email_change" | "profile_update" | "ignored";
|
|
5
|
+
export type NewsletterProviderCapabilityKey =
|
|
6
|
+
"subscribe" | "unsubscribe" | "suppress" | "unsuppress" | "doubleOptIn" | "emailChange" | "listMembership" | "webhookIdempotency" | "retryAfter";
|
|
7
|
+
|
|
8
|
+
export type NewsletterProviderCapabilities = Record<NewsletterProviderCapabilityKey, boolean>;
|
|
9
|
+
|
|
10
|
+
export interface NewsletterWebhookEvent<Purpose extends string = NewsletterMarketingPurpose> {
|
|
11
|
+
providerKind: NewsletterProviderKind;
|
|
12
|
+
providerEventId: string;
|
|
13
|
+
eventType: NewsletterWebhookEventType;
|
|
14
|
+
email: string | null;
|
|
15
|
+
remoteProfileId: string | null;
|
|
16
|
+
remoteListId: string | null;
|
|
17
|
+
purpose: Purpose | null;
|
|
18
|
+
explicitOptInEvidence: boolean;
|
|
19
|
+
doubleOptInStatus: "confirmed" | "pending" | "unknown";
|
|
20
|
+
occurredAt: string | null;
|
|
21
|
+
rawPayload: Record<string, unknown>;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
export interface NewsletterSyncEvent<Purpose extends string = NewsletterMarketingPurpose> {
|
|
26
|
+
id: string;
|
|
27
|
+
claimToken: string;
|
|
28
|
+
contactId: string;
|
|
29
|
+
normalizedEmail: string;
|
|
30
|
+
eventType: NewsletterSyncEventType;
|
|
31
|
+
purpose: Purpose;
|
|
32
|
+
payload: Record<string, unknown>;
|
|
33
|
+
attemptCount: number;
|
|
34
|
+
originProviderKind?: NewsletterProviderKind | null;
|
|
35
|
+
originProviderEventId?: string | null;
|
|
36
|
+
remoteProfileId?: string | null;
|
|
37
|
+
remoteListId?: string | null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
export type NewsletterSyncOutcome =
|
|
42
|
+
| {
|
|
43
|
+
status: "sent";
|
|
44
|
+
remoteProfileId?: string | null;
|
|
45
|
+
responseSummary?: Record<string, unknown>;
|
|
46
|
+
}
|
|
47
|
+
| {
|
|
48
|
+
status: "skipped";
|
|
49
|
+
reason: string;
|
|
50
|
+
responseSummary?: Record<string, unknown>;
|
|
51
|
+
}
|
|
52
|
+
| {
|
|
53
|
+
status: "retry";
|
|
54
|
+
reason: string;
|
|
55
|
+
retryAfterSeconds?: number;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export interface NewsletterSyncProviderPort<Purpose extends string = NewsletterMarketingPurpose> {
|
|
59
|
+
readonly providerKind: string;
|
|
60
|
+
readonly capabilities: NewsletterProviderCapabilities;
|
|
61
|
+
sync(event: NewsletterSyncEvent<Purpose>): Promise<NewsletterSyncOutcome>;
|
|
62
|
+
reconcile?(): Promise<NewsletterSyncReconcileOutcome>;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export type NewsletterSyncReconcileOutcome =
|
|
66
|
+
| {
|
|
67
|
+
status: "skipped";
|
|
68
|
+
reason: string;
|
|
69
|
+
responseSummary?: Record<string, unknown>;
|
|
70
|
+
}
|
|
71
|
+
| {
|
|
72
|
+
status: "checked";
|
|
73
|
+
checked: number;
|
|
74
|
+
updated: number;
|
|
75
|
+
failures: number;
|
|
76
|
+
responseSummary?: Record<string, unknown>;
|
|
77
|
+
};
|
|
78
|
+
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { NewsletterMarketingPurpose, NewsletterWebhookEvent } from "./newsletter.js";
|
|
2
|
+
export type NormalizedNewsletterWebhookEvent<Purpose extends string = NewsletterMarketingPurpose> = NewsletterWebhookEvent<Purpose>;
|
|
3
|
+
export interface NewsletterWebhookPort<Purpose extends string = NewsletterMarketingPurpose> {
|
|
4
|
+
recordProviderEvent(input: NewsletterWebhookEvent<Purpose> & {
|
|
5
|
+
state: "unknown" | "granted" | "denied" | "suppressed" | null;
|
|
6
|
+
processingStatus: "received" | "ignored";
|
|
7
|
+
}): Promise<{ providerEventId: string; contactId: string | null; inserted: boolean }>;
|
|
8
|
+
recordPermission(input: {
|
|
9
|
+
contactId: string;
|
|
10
|
+
providerKind: string;
|
|
11
|
+
providerEventId: string;
|
|
12
|
+
purpose: Purpose;
|
|
13
|
+
state: "granted" | "suppressed";
|
|
14
|
+
reason: string;
|
|
15
|
+
metadata: Record<string, unknown>;
|
|
16
|
+
}): Promise<void>;
|
|
17
|
+
markProviderEvent(input: {
|
|
18
|
+
providerEventId: string;
|
|
19
|
+
status: "processed" | "ignored" | "failed";
|
|
20
|
+
metadata: Record<string, unknown>;
|
|
21
|
+
}): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Locale } from "./email.js";
|
|
2
|
+
|
|
3
|
+
export type OptOutOutcome = "invalid_link" | "marketing_applied" | "missing_information" | "not_found" | "legacy_applied" | "legacy_replay" | "error";
|
|
4
|
+
export interface OptOutContent { title: string; message: string }
|
|
5
|
+
export type OptOutCopy = Record<OptOutOutcome, Record<Locale, OptOutContent>>;
|
|
6
|
+
const defaults: OptOutCopy = {
|
|
7
|
+
invalid_link: { pl: {"title": "Link nieprawidłowy lub wygasł", "message": "Nie udało się przetworzyć tej prośby. Skopiuj pełny link z wiadomości lub napisz na {supportEmail}."}, en: {"title": "Invalid or expired link", "message": "We couldn't process this request. Copy the full link from the email or email {supportEmail}."} },
|
|
8
|
+
marketing_applied: { pl: {"title": "Wypisano", "message": "Nie będziesz już otrzymywać tych wiadomości marketingowych. Wiadomości potrzebne do obsługi konta, zamówień, płatności i subskrypcji mogą nadal przychodzić."}, en: {"title": "You're unsubscribed", "message": "You won't receive these marketing emails anymore. Messages needed to manage your account, orders, payments and subscriptions may still arrive."} },
|
|
9
|
+
missing_information: { pl: {"title": "Brakuje danych", "message": "Nieprawidłowy link do wypisania."}, en: {"title": "Missing information", "message": "This unsubscribe link is incomplete."} },
|
|
10
|
+
not_found: { pl: {"title": "Nie znaleziono", "message": "Nie znaleziono takiego zgłoszenia."}, en: {"title": "Not found", "message": "We couldn't find this request."} },
|
|
11
|
+
legacy_applied: { pl: {"title": "Wypisano", "message": "Zapisaliśmy Twoją rezygnację z wybranych wiadomości. Wiadomości potrzebne do obsługi konta, zamówień, płatności i subskrypcji mogą nadal przychodzić."}, en: {"title": "You're unsubscribed", "message": "We've recorded your opt-out from the selected messages. Messages needed to manage your account, orders, payments and subscriptions may still arrive."} },
|
|
12
|
+
legacy_replay: { pl: {"title": "Już wypisano", "message": "Twoja rezygnacja z wybranych wiadomości jest już zapisana. Wiadomości potrzebne do obsługi konta, zamówień, płatności i subskrypcji mogą nadal przychodzić."}, en: {"title": "Already unsubscribed", "message": "Your opt-out from the selected messages is already recorded. Messages needed to manage your account, orders, payments and subscriptions may still arrive."} },
|
|
13
|
+
error: { pl: {"title": "Błąd", "message": "Coś poszło nie tak. Spróbuj ponownie później."}, en: {"title": "Error", "message": "Something went wrong. Try again later."} },
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
/** Display only; the caller independently verifies and durably records opt-out. */
|
|
17
|
+
export function createOptOutContentFactory(copy: OptOutCopy = defaults) {
|
|
18
|
+
function optOutContent(locale: Locale, outcome: OptOutOutcome, supportEmail: string): OptOutContent {
|
|
19
|
+
const c = copy[outcome][locale];
|
|
20
|
+
return { title: c.title, message: c.message.split("{supportEmail}").join(supportEmail) };
|
|
21
|
+
}
|
|
22
|
+
return { optOutContent };
|
|
23
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
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 OrderCanceledEmailVars {
|
|
12
|
+
firstName: string | null;
|
|
13
|
+
orderId: string;
|
|
14
|
+
/** Formatted gross total, e.g. "129,99 zł", or null when unknown. */
|
|
15
|
+
amountLabel: string | null;
|
|
16
|
+
/** Absolute CTA URL (back to shop); null/absent → no button. */
|
|
17
|
+
ctaUrl?: string | null;
|
|
18
|
+
/** Optional context name for the selected return note. */
|
|
19
|
+
contextName?: string | null;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface OrderCanceledEmailContent {
|
|
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 createOrderCanceledContentFactory(input: {
|
|
30
|
+
commerceEmailContent: Pick<CommerceEmailContent, "orderCanceled" | "orderRefPrefix">;
|
|
31
|
+
formatCustomerOrderReference: (orderId: string, prefix: string) => string;
|
|
32
|
+
}) {
|
|
33
|
+
const { commerceEmailContent, formatCustomerOrderReference } = input;
|
|
34
|
+
|
|
35
|
+
function orderCanceledEmailContent(
|
|
36
|
+
locale: Locale,
|
|
37
|
+
vars: OrderCanceledEmailVars,
|
|
38
|
+
signoff: string,
|
|
39
|
+
): OrderCanceledEmailContent {
|
|
40
|
+
const copy = commerceEmailContent.orderCanceled[locale];
|
|
41
|
+
const orderRef = formatCustomerOrderReference(vars.orderId, commerceEmailContent.orderRefPrefix);
|
|
42
|
+
const blocks: EmailBlock[] = [
|
|
43
|
+
heading(copy.heading),
|
|
44
|
+
paragraph(copy.greeting(vars.firstName)),
|
|
45
|
+
paragraph(copy.intro(orderRef)),
|
|
46
|
+
accentBox(copy.details(vars.amountLabel), { label: copy.detailsLabel }),
|
|
47
|
+
paragraph(copy.returnNote(vars.contextName ?? null)),
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
if (vars.ctaUrl) {
|
|
51
|
+
blocks.push(button(copy.cta, vars.ctaUrl));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
blocks.push(paragraph(copy.outro));
|
|
55
|
+
blocks.push(paragraph(signoff));
|
|
56
|
+
|
|
57
|
+
return {
|
|
58
|
+
subject: copy.subject(orderRef),
|
|
59
|
+
preheader: copy.preheader,
|
|
60
|
+
blocks,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
return { orderCanceledEmailContent };
|
|
64
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import type { CommerceEmailContent } from "./commerceEmailContent.js";
|
|
2
|
+
import type { Locale } from "./email.js";
|
|
3
|
+
import {
|
|
4
|
+
button,
|
|
5
|
+
dataTable,
|
|
6
|
+
heading,
|
|
7
|
+
list,
|
|
8
|
+
paragraph,
|
|
9
|
+
type EmailBlock,
|
|
10
|
+
} from "./blocks.js";
|
|
11
|
+
|
|
12
|
+
export interface OrderDraftLineItem {
|
|
13
|
+
/** Resolved, localized product name (or slug/sku fallback). */
|
|
14
|
+
name: string;
|
|
15
|
+
quantity: number;
|
|
16
|
+
/** Formatted gross line total, e.g. "129,98 zł"; "" when price unknown. */
|
|
17
|
+
lineTotalLabel: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface OrderDraftTotals {
|
|
21
|
+
/** null → omit the subtotal row (value unknown); never alias the grand total. */
|
|
22
|
+
subtotalLabel: string | null;
|
|
23
|
+
/** Already sign-prefixed, e.g. "-20,00 zł"; null → no discount row. */
|
|
24
|
+
discountLabel: string | null;
|
|
25
|
+
totalLabel: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface OrderDraftEmailVars {
|
|
29
|
+
firstName: string | null;
|
|
30
|
+
/** Technical order id from outbox, e.g. "order_<uuid>". */
|
|
31
|
+
orderId: string;
|
|
32
|
+
/** Itemized order lines (name × qty + line total). */
|
|
33
|
+
items: OrderDraftLineItem[];
|
|
34
|
+
/** Money breakdown, or null when totals are unknown. */
|
|
35
|
+
totals: OrderDraftTotals | null;
|
|
36
|
+
/** Absolute CTA URL back to the configurator; null/absent → no button. */
|
|
37
|
+
ctaUrl?: string | null;
|
|
38
|
+
/**
|
|
39
|
+
* Dog's name from the owner's survey, when known. Drives an optional warm
|
|
40
|
+
* closing line. Absent/null (e.g. anonymous drafts) → the line is omitted.
|
|
41
|
+
* Never inflect the copy by gender: the name doesn't reveal it.
|
|
42
|
+
*/
|
|
43
|
+
contextName?: string | null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface OrderDraftEmailContent {
|
|
47
|
+
subject: string;
|
|
48
|
+
preheader: string;
|
|
49
|
+
blocks: EmailBlock[];
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Bind host-selected copy and pure helpers without provider or environment access. */
|
|
53
|
+
export function createOrderDraftContentFactory(input: {
|
|
54
|
+
commerceEmailContent: Pick<CommerceEmailContent, "orderDraft" | "orderRefPrefix">;
|
|
55
|
+
formatCustomerOrderReference: (orderId: string, prefix: string) => string;
|
|
56
|
+
}) {
|
|
57
|
+
const { commerceEmailContent, formatCustomerOrderReference } = input;
|
|
58
|
+
|
|
59
|
+
function itemLine(item: OrderDraftLineItem): string {
|
|
60
|
+
const base = `${item.quantity}× ${item.name}`;
|
|
61
|
+
return item.lineTotalLabel ? `${base} – ${item.lineTotalLabel}` : base;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function orderDraftEmailContent(
|
|
65
|
+
locale: Locale,
|
|
66
|
+
vars: OrderDraftEmailVars,
|
|
67
|
+
signoff: string,
|
|
68
|
+
): OrderDraftEmailContent {
|
|
69
|
+
const copy = commerceEmailContent.orderDraft[locale];
|
|
70
|
+
const orderRef = formatCustomerOrderReference(vars.orderId, commerceEmailContent.orderRefPrefix);
|
|
71
|
+
const blocks: EmailBlock[] = [
|
|
72
|
+
heading(copy.heading),
|
|
73
|
+
paragraph(copy.greeting(vars.firstName)),
|
|
74
|
+
paragraph(copy.intro(orderRef)),
|
|
75
|
+
];
|
|
76
|
+
|
|
77
|
+
blocks.push(
|
|
78
|
+
vars.items.length > 0
|
|
79
|
+
? list(vars.items.map(itemLine))
|
|
80
|
+
: paragraph(copy.noItems),
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
if (vars.totals) {
|
|
84
|
+
const rows: Array<{ label: string; value: string }> = [];
|
|
85
|
+
if (vars.totals.subtotalLabel) {
|
|
86
|
+
rows.push({ label: copy.subtotalLabel, value: vars.totals.subtotalLabel });
|
|
87
|
+
}
|
|
88
|
+
if (vars.totals.discountLabel) {
|
|
89
|
+
rows.push({ label: copy.discountRowLabel, value: vars.totals.discountLabel });
|
|
90
|
+
}
|
|
91
|
+
rows.push({ label: copy.totalLabel, value: vars.totals.totalLabel });
|
|
92
|
+
blocks.push(dataTable(rows));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (vars.ctaUrl) {
|
|
96
|
+
blocks.push(button(copy.cta, vars.ctaUrl));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
blocks.push(paragraph(copy.outro));
|
|
100
|
+
if (vars.contextName) {
|
|
101
|
+
blocks.push(paragraph(copy.personalizedClosing(vars.contextName)));
|
|
102
|
+
}
|
|
103
|
+
blocks.push(paragraph(signoff));
|
|
104
|
+
|
|
105
|
+
return {
|
|
106
|
+
subject: copy.subject(orderRef),
|
|
107
|
+
preheader: copy.preheader,
|
|
108
|
+
blocks,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
return { orderDraftEmailContent };
|
|
112
|
+
}
|