@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.
Files changed (773) hide show
  1. package/CHANGELOG.md +180 -0
  2. package/README.md +564 -6
  3. package/dist/catalog/activeSkuSelection.d.ts +2 -0
  4. package/dist/catalog/activeSkuSelection.js +20 -0
  5. package/dist/catalog/adminBindings.d.ts +72 -0
  6. package/dist/catalog/adminBindings.js +1 -0
  7. package/dist/catalog/adminBundleHandler.d.ts +26 -0
  8. package/dist/catalog/adminBundleHandler.js +111 -0
  9. package/dist/catalog/adminBundleReadHandler.d.ts +20 -0
  10. package/dist/catalog/adminBundleReadHandler.js +185 -0
  11. package/dist/catalog/adminBundleWritePort.d.ts +85 -0
  12. package/dist/catalog/adminBundleWritePort.js +1 -0
  13. package/dist/catalog/bundleAvailability.d.ts +63 -0
  14. package/dist/catalog/bundleAvailability.js +78 -0
  15. package/dist/catalog/bundleAvailabilityService.d.ts +65 -0
  16. package/dist/catalog/bundleAvailabilityService.js +89 -0
  17. package/dist/catalog/bundleBindings.d.ts +33 -0
  18. package/dist/catalog/bundleBindings.js +1 -0
  19. package/dist/catalog/bundleCatalogQueries.d.ts +28 -0
  20. package/dist/catalog/bundleCatalogQueries.js +84 -0
  21. package/dist/catalog/bundleCatalogReadPort.d.ts +166 -0
  22. package/dist/catalog/bundleCatalogReadPort.js +36 -0
  23. package/dist/catalog/bundleCatalogStore.d.ts +3 -0
  24. package/dist/catalog/bundleCatalogStore.js +152 -0
  25. package/dist/catalog/bundleRuleCodes.d.ts +41 -0
  26. package/dist/catalog/bundleRuleCodes.js +110 -0
  27. package/dist/catalog/bundleRules.d.ts +69 -0
  28. package/dist/catalog/bundleRules.js +102 -0
  29. package/dist/catalog/catalogDraftStore.d.ts +4 -0
  30. package/dist/catalog/catalogDraftStore.js +63 -0
  31. package/dist/catalog/catalogSkuEnvelope.d.ts +7 -0
  32. package/dist/catalog/catalogSkuEnvelope.js +142 -0
  33. package/dist/catalog/catalogSkuEnvelopeMapper.d.ts +38 -0
  34. package/dist/catalog/catalogSkuEnvelopeMapper.js +88 -0
  35. package/dist/catalog/contracts/bundleAdmin.d.ts +143 -0
  36. package/dist/catalog/contracts/bundleAdmin.js +1 -0
  37. package/dist/catalog/contracts/bundleAvailability.d.ts +61 -0
  38. package/dist/catalog/contracts/bundleAvailability.js +1 -0
  39. package/dist/catalog/contracts/bundleRead.d.ts +223 -0
  40. package/dist/catalog/contracts/bundleRead.js +1 -0
  41. package/dist/catalog/contracts/draft.d.ts +79 -0
  42. package/dist/catalog/contracts/draft.js +47 -0
  43. package/dist/catalog/contracts/foundation.d.ts +78 -0
  44. package/dist/catalog/contracts/foundation.js +53 -0
  45. package/dist/catalog/contracts/index.d.ts +14 -0
  46. package/dist/catalog/contracts/index.js +6 -0
  47. package/dist/catalog/contracts/lifecycle.d.ts +77 -0
  48. package/dist/catalog/contracts/lifecycle.js +1 -0
  49. package/dist/catalog/contracts/productMediaContracts.d.ts +77 -0
  50. package/dist/catalog/contracts/productMediaContracts.js +149 -0
  51. package/dist/catalog/contracts/productTypes.d.ts +54 -0
  52. package/dist/catalog/contracts/productTypes.js +16 -0
  53. package/dist/catalog/contracts/resolveProductMedia.d.ts +3 -0
  54. package/dist/catalog/contracts/resolveProductMedia.js +78 -0
  55. package/dist/catalog/contracts/sellable.d.ts +23 -0
  56. package/dist/catalog/contracts/sellable.js +1 -0
  57. package/dist/catalog/draftHandler.d.ts +25 -0
  58. package/dist/catalog/draftHandler.js +118 -0
  59. package/dist/catalog/draftPorts.d.ts +18 -0
  60. package/dist/catalog/draftPorts.js +8 -0
  61. package/dist/catalog/draftSchemas.d.ts +423 -0
  62. package/dist/catalog/draftSchemas.js +89 -0
  63. package/dist/catalog/draftValidation.d.ts +21 -0
  64. package/dist/catalog/draftValidation.js +125 -0
  65. package/dist/catalog/foundationSchemas.d.ts +98 -0
  66. package/dist/catalog/foundationSchemas.js +110 -0
  67. package/dist/catalog/index.d.ts +43 -0
  68. package/dist/catalog/index.js +25 -0
  69. package/dist/catalog/mediaSourcePack.d.ts +51 -0
  70. package/dist/catalog/mediaSourcePack.js +247 -0
  71. package/dist/catalog/productTypeSchemas.d.ts +46 -0
  72. package/dist/catalog/productTypeSchemas.js +72 -0
  73. package/dist/catalog/publicationPorts.d.ts +42 -0
  74. package/dist/catalog/publicationPorts.js +1 -0
  75. package/dist/catalog/readPorts.d.ts +51 -0
  76. package/dist/catalog/readPorts.js +1 -0
  77. package/dist/catalog/referenceCatalogHandler.d.ts +7 -0
  78. package/dist/catalog/referenceCatalogHandler.js +27 -0
  79. package/dist/catalog/resolvedSkuProjection.d.ts +88 -0
  80. package/dist/catalog/resolvedSkuProjection.js +60 -0
  81. package/dist/catalog/sellableBundleHandler.d.ts +46 -0
  82. package/dist/catalog/sellableBundleHandler.js +84 -0
  83. package/dist/catalog/sellableSchemas.d.ts +46 -0
  84. package/dist/catalog/sellableSchemas.js +27 -0
  85. package/dist/catalog/sql.d.ts +46 -0
  86. package/dist/catalog/sql.js +13 -0
  87. package/dist/catalog/validation.d.ts +2 -0
  88. package/dist/catalog/validation.js +3 -0
  89. package/dist/communications/accountingDocumentDelivery.d.ts +35 -0
  90. package/dist/communications/accountingDocumentDelivery.js +33 -0
  91. package/dist/communications/authEmailError.d.ts +5 -0
  92. package/dist/communications/authEmailError.js +8 -0
  93. package/dist/communications/authEmailPorts.d.ts +2 -0
  94. package/dist/communications/authEmailPorts.js +1 -0
  95. package/dist/communications/authSendEmailHook.d.ts +35 -0
  96. package/dist/communications/authSendEmailHook.js +250 -0
  97. package/dist/communications/capturedTransactionalDelivery.d.ts +13 -0
  98. package/dist/communications/capturedTransactionalDelivery.js +14 -0
  99. package/dist/communications/communicationSync.d.ts +11 -0
  100. package/dist/communications/communicationSync.js +79 -0
  101. package/dist/communications/communicationSyncWorker.d.ts +68 -0
  102. package/dist/communications/communicationSyncWorker.js +218 -0
  103. package/dist/communications/consentPolicy.d.ts +19 -0
  104. package/dist/communications/consentPolicy.js +43 -0
  105. package/dist/communications/consentPurposeRegistry.d.ts +4 -0
  106. package/dist/communications/consentPurposeRegistry.js +24 -0
  107. package/dist/communications/contracts/abandonedCart.d.ts +27 -0
  108. package/dist/communications/contracts/abandonedCart.js +25 -0
  109. package/dist/communications/contracts/authEmail.d.ts +62 -0
  110. package/dist/communications/contracts/authEmail.js +1 -0
  111. package/dist/communications/contracts/backInStock.d.ts +28 -0
  112. package/dist/communications/contracts/backInStock.js +28 -0
  113. package/dist/communications/contracts/blocks.d.ts +24 -0
  114. package/dist/communications/contracts/blocks.js +23 -0
  115. package/dist/communications/contracts/checkoutExpired.d.ts +22 -0
  116. package/dist/communications/contracts/checkoutExpired.js +25 -0
  117. package/dist/communications/contracts/checkoutRecovery.d.ts +26 -0
  118. package/dist/communications/contracts/checkoutRecovery.js +37 -0
  119. package/dist/communications/contracts/commerceEmailContent.d.ts +176 -0
  120. package/dist/communications/contracts/commerceEmailContent.js +1 -0
  121. package/dist/communications/contracts/commerceEngagementEmailContent.d.ts +95 -0
  122. package/dist/communications/contracts/commerceEngagementEmailContent.js +1 -0
  123. package/dist/communications/contracts/consent.d.ts +12 -0
  124. package/dist/communications/contracts/consent.js +1 -0
  125. package/dist/communications/contracts/email.d.ts +182 -0
  126. package/dist/communications/contracts/email.js +1 -0
  127. package/dist/communications/contracts/guideCard.d.ts +3 -0
  128. package/dist/communications/contracts/guideCard.js +26 -0
  129. package/dist/communications/contracts/index.d.ts +52 -0
  130. package/dist/communications/contracts/index.js +42 -0
  131. package/dist/communications/contracts/inquiryContent.d.ts +32 -0
  132. package/dist/communications/contracts/inquiryContent.js +33 -0
  133. package/dist/communications/contracts/invoiceDocumentContent.d.ts +26 -0
  134. package/dist/communications/contracts/invoiceDocumentContent.js +36 -0
  135. package/dist/communications/contracts/marketingAutomation.d.ts +52 -0
  136. package/dist/communications/contracts/marketingAutomation.js +1 -0
  137. package/dist/communications/contracts/marketingSync.d.ts +194 -0
  138. package/dist/communications/contracts/marketingSync.js +1 -0
  139. package/dist/communications/contracts/newsletter.d.ts +63 -0
  140. package/dist/communications/contracts/newsletter.js +1 -0
  141. package/dist/communications/contracts/newsletterWebhook.d.ts +26 -0
  142. package/dist/communications/contracts/newsletterWebhook.js +1 -0
  143. package/dist/communications/contracts/optOutContent.d.ts +11 -0
  144. package/dist/communications/contracts/optOutContent.js +17 -0
  145. package/dist/communications/contracts/orderCanceled.d.ts +25 -0
  146. package/dist/communications/contracts/orderCanceled.js +27 -0
  147. package/dist/communications/contracts/orderDraft.d.ts +46 -0
  148. package/dist/communications/contracts/orderDraft.js +46 -0
  149. package/dist/communications/contracts/orderPaid.d.ts +53 -0
  150. package/dist/communications/contracts/orderPaid.js +71 -0
  151. package/dist/communications/contracts/orderRefunded.d.ts +24 -0
  152. package/dist/communications/contracts/orderRefunded.js +27 -0
  153. package/dist/communications/contracts/paymentFailed.d.ts +24 -0
  154. package/dist/communications/contracts/paymentFailed.js +24 -0
  155. package/dist/communications/contracts/publicIntake.d.ts +49 -0
  156. package/dist/communications/contracts/publicIntake.js +1 -0
  157. package/dist/communications/contracts/render.d.ts +2 -0
  158. package/dist/communications/contracts/render.js +229 -0
  159. package/dist/communications/contracts/reorderReminder.d.ts +24 -0
  160. package/dist/communications/contracts/reorderReminder.js +24 -0
  161. package/dist/communications/contracts/returnEmails.d.ts +25 -0
  162. package/dist/communications/contracts/returnEmails.js +62 -0
  163. package/dist/communications/contracts/reviewEffects.d.ts +26 -0
  164. package/dist/communications/contracts/reviewEffects.js +25 -0
  165. package/dist/communications/contracts/reviewRequest.d.ts +26 -0
  166. package/dist/communications/contracts/reviewRequest.js +24 -0
  167. package/dist/communications/contracts/roleNotificationContent.d.ts +25 -0
  168. package/dist/communications/contracts/roleNotificationContent.js +46 -0
  169. package/dist/communications/contracts/shipmentDelivered.d.ts +23 -0
  170. package/dist/communications/contracts/shipmentDelivered.js +24 -0
  171. package/dist/communications/contracts/shipmentDispatched.d.ts +27 -0
  172. package/dist/communications/contracts/shipmentDispatched.js +35 -0
  173. package/dist/communications/contracts/shipmentException.d.ts +21 -0
  174. package/dist/communications/contracts/shipmentException.js +26 -0
  175. package/dist/communications/contracts/subscriptionActivationActionRequired.d.ts +17 -0
  176. package/dist/communications/contracts/subscriptionActivationActionRequired.js +22 -0
  177. package/dist/communications/contracts/subscriptionAddressChanged.d.ts +19 -0
  178. package/dist/communications/contracts/subscriptionAddressChanged.js +25 -0
  179. package/dist/communications/contracts/subscriptionCancelled.d.ts +19 -0
  180. package/dist/communications/contracts/subscriptionCancelled.js +25 -0
  181. package/dist/communications/contracts/subscriptionCycleSkipped.d.ts +25 -0
  182. package/dist/communications/contracts/subscriptionCycleSkipped.js +40 -0
  183. package/dist/communications/contracts/subscriptionDeliveryRescheduled.d.ts +25 -0
  184. package/dist/communications/contracts/subscriptionDeliveryRescheduled.js +39 -0
  185. package/dist/communications/contracts/subscriptionEmailContent.d.ts +145 -0
  186. package/dist/communications/contracts/subscriptionEmailContent.js +1 -0
  187. package/dist/communications/contracts/subscriptionPackageChanged.d.ts +20 -0
  188. package/dist/communications/contracts/subscriptionPackageChanged.js +26 -0
  189. package/dist/communications/contracts/subscriptionPauseReminder.d.ts +23 -0
  190. package/dist/communications/contracts/subscriptionPauseReminder.js +29 -0
  191. package/dist/communications/contracts/subscriptionPaused.d.ts +21 -0
  192. package/dist/communications/contracts/subscriptionPaused.js +25 -0
  193. package/dist/communications/contracts/subscriptionPaymentExpired.d.ts +34 -0
  194. package/dist/communications/contracts/subscriptionPaymentExpired.js +37 -0
  195. package/dist/communications/contracts/subscriptionPaymentFailed.d.ts +49 -0
  196. package/dist/communications/contracts/subscriptionPaymentFailed.js +56 -0
  197. package/dist/communications/contracts/subscriptionPaymentRecovered.d.ts +19 -0
  198. package/dist/communications/contracts/subscriptionPaymentRecovered.js +22 -0
  199. package/dist/communications/contracts/subscriptionRenewalAtRisk.d.ts +36 -0
  200. package/dist/communications/contracts/subscriptionRenewalAtRisk.js +36 -0
  201. package/dist/communications/contracts/subscriptionRenewalUpcoming.d.ts +49 -0
  202. package/dist/communications/contracts/subscriptionRenewalUpcoming.js +43 -0
  203. package/dist/communications/contracts/subscriptionResumed.d.ts +23 -0
  204. package/dist/communications/contracts/subscriptionResumed.js +25 -0
  205. package/dist/communications/contracts/subscriptionWelcome.d.ts +44 -0
  206. package/dist/communications/contracts/subscriptionWelcome.js +45 -0
  207. package/dist/communications/contracts/subscriptionWinback.d.ts +21 -0
  208. package/dist/communications/contracts/subscriptionWinback.js +28 -0
  209. package/dist/communications/contracts/transactionalDelivery.d.ts +42 -0
  210. package/dist/communications/contracts/transactionalDelivery.js +1 -0
  211. package/dist/communications/contracts/types.d.ts +46 -0
  212. package/dist/communications/contracts/types.js +1 -0
  213. package/dist/communications/contribution.d.ts +10 -0
  214. package/dist/communications/contribution.js +24 -0
  215. package/dist/communications/deliveryReconciliation.d.ts +64 -0
  216. package/dist/communications/deliveryReconciliation.js +60 -0
  217. package/dist/communications/emailEgress.d.ts +38 -0
  218. package/dist/communications/emailEgress.js +100 -0
  219. package/dist/communications/emailHealthAssessment.d.ts +39 -0
  220. package/dist/communications/emailHealthAssessment.js +59 -0
  221. package/dist/communications/emailHealthMetricsPort.d.ts +17 -0
  222. package/dist/communications/emailHealthMetricsPort.js +1 -0
  223. package/dist/communications/emailNotificationControl.d.ts +27 -0
  224. package/dist/communications/emailNotificationControl.js +10 -0
  225. package/dist/communications/emailObservation.d.ts +28 -0
  226. package/dist/communications/emailObservation.js +23 -0
  227. package/dist/communications/emailTransport.d.ts +82 -0
  228. package/dist/communications/emailTransport.js +95 -0
  229. package/dist/communications/errors.d.ts +15 -0
  230. package/dist/communications/errors.js +30 -0
  231. package/dist/communications/index.d.ts +47 -0
  232. package/dist/communications/index.js +38 -0
  233. package/dist/communications/integrationEventSignature.d.ts +15 -0
  234. package/dist/communications/integrationEventSignature.js +37 -0
  235. package/dist/communications/klaviyo/consentPush.d.ts +51 -0
  236. package/dist/communications/klaviyo/consentPush.js +19 -0
  237. package/dist/communications/klaviyo/index.d.ts +110 -0
  238. package/dist/communications/klaviyo/index.js +860 -0
  239. package/dist/communications/managedTransactionalDeliveryStore.d.ts +12 -0
  240. package/dist/communications/managedTransactionalDeliveryStore.js +49 -0
  241. package/dist/communications/nativeOperations.d.ts +79 -0
  242. package/dist/communications/nativeOperations.js +3 -0
  243. package/dist/communications/newsletterIntegrationContracts.d.ts +130 -0
  244. package/dist/communications/newsletterIntegrationContracts.js +128 -0
  245. package/dist/communications/newsletterWebhookPort.d.ts +11 -0
  246. package/dist/communications/newsletterWebhookPort.js +84 -0
  247. package/dist/communications/newsletterWebhookProcessing.d.ts +17 -0
  248. package/dist/communications/newsletterWebhookProcessing.js +71 -0
  249. package/dist/communications/originPolicy.d.ts +40 -0
  250. package/dist/communications/originPolicy.js +100 -0
  251. package/dist/communications/postgresCommunicationSync.d.ts +79 -0
  252. package/dist/communications/postgresCommunicationSync.js +111 -0
  253. package/dist/communications/postgresConsentEvaluator.d.ts +19 -0
  254. package/dist/communications/postgresConsentEvaluator.js +43 -0
  255. package/dist/communications/postgresDeliveryReconciliation.d.ts +3 -0
  256. package/dist/communications/postgresDeliveryReconciliation.js +113 -0
  257. package/dist/communications/postgresNativeOperations.d.ts +13 -0
  258. package/dist/communications/postgresNativeOperations.js +63 -0
  259. package/dist/communications/postgresNotificationRecipients.d.ts +37 -0
  260. package/dist/communications/postgresNotificationRecipients.js +60 -0
  261. package/dist/communications/postgresTransactionalDeliveryStore.d.ts +7 -0
  262. package/dist/communications/postgresTransactionalDeliveryStore.js +55 -0
  263. package/dist/communications/preferencesToken.d.ts +10 -0
  264. package/dist/communications/preferencesToken.js +40 -0
  265. package/dist/communications/publicPreferenceToken.d.ts +24 -0
  266. package/dist/communications/publicPreferenceToken.js +53 -0
  267. package/dist/communications/resend/index.d.ts +40 -0
  268. package/dist/communications/resend/index.js +310 -0
  269. package/dist/communications/shipmentNotifications.d.ts +34 -0
  270. package/dist/communications/shipmentNotifications.js +61 -0
  271. package/dist/communications/sql.d.ts +26 -0
  272. package/dist/communications/sql.js +7 -0
  273. package/dist/communications/standardWebhooks.d.ts +14 -0
  274. package/dist/communications/standardWebhooks.js +73 -0
  275. package/dist/communications/status.d.ts +11 -0
  276. package/dist/communications/status.js +36 -0
  277. package/dist/communications/transactionalDelivery.d.ts +19 -0
  278. package/dist/communications/transactionalDelivery.js +96 -0
  279. package/dist/communications/transactionalDeliveryIdentifier.d.ts +3 -0
  280. package/dist/communications/transactionalDeliveryIdentifier.js +6 -0
  281. package/dist/communications/unsubscribeToken.d.ts +77 -0
  282. package/dist/communications/unsubscribeToken.js +150 -0
  283. package/dist/communications/validation.d.ts +2 -0
  284. package/dist/communications/validation.js +3 -0
  285. package/dist/composition/catalogContribution.d.ts +18 -0
  286. package/dist/composition/catalogContribution.js +21 -0
  287. package/dist/composition/index.d.ts +1 -0
  288. package/dist/composition/index.js +1 -0
  289. package/dist/http/index.d.ts +1 -0
  290. package/dist/http/index.js +1 -0
  291. package/dist/http/webhookSignature.d.ts +42 -0
  292. package/dist/http/webhookSignature.js +86 -0
  293. package/dist/identity/customerContracts.d.ts +2 -2
  294. package/dist/inventory/adminInventory.d.ts +13 -0
  295. package/dist/inventory/adminInventory.js +214 -0
  296. package/dist/inventory/contracts/forecast.d.ts +86 -0
  297. package/dist/inventory/contracts/forecast.js +1 -0
  298. package/dist/inventory/contracts/index.d.ts +4 -0
  299. package/dist/inventory/contracts/index.js +1 -0
  300. package/dist/inventory/contracts/inventory.d.ts +157 -0
  301. package/dist/inventory/contracts/inventory.js +1 -0
  302. package/dist/inventory/contracts/newPurchaseStock.d.ts +20 -0
  303. package/dist/inventory/contracts/newPurchaseStock.js +1 -0
  304. package/dist/inventory/contracts/reservation.d.ts +18 -0
  305. package/dist/inventory/contracts/reservation.js +1 -0
  306. package/dist/inventory/forecast.d.ts +24 -0
  307. package/dist/inventory/forecast.js +200 -0
  308. package/dist/inventory/index.d.ts +13 -0
  309. package/dist/inventory/index.js +10 -0
  310. package/dist/inventory/inventoryHandlers.d.ts +53 -0
  311. package/dist/inventory/inventoryHandlers.js +151 -0
  312. package/dist/inventory/newPurchaseStockAvailability.d.ts +47 -0
  313. package/dist/inventory/newPurchaseStockAvailability.js +75 -0
  314. package/dist/inventory/ports.d.ts +21 -0
  315. package/dist/inventory/ports.js +16 -0
  316. package/dist/inventory/renewalReservation.d.ts +27 -0
  317. package/dist/inventory/renewalReservation.js +61 -0
  318. package/dist/inventory/reservationPolicy.d.ts +6 -0
  319. package/dist/inventory/reservationPolicy.js +19 -0
  320. package/dist/inventory/schemas.d.ts +137 -0
  321. package/dist/inventory/schemas.js +112 -0
  322. package/dist/inventory/sql.d.ts +14 -0
  323. package/dist/inventory/sql.js +5 -0
  324. package/dist/inventory/subscriptionForecastCalculation.d.ts +4 -0
  325. package/dist/inventory/subscriptionForecastCalculation.js +133 -0
  326. package/dist/pricing/acquisitionFinancialPolicy.d.ts +26 -0
  327. package/dist/pricing/acquisitionFinancialPolicy.js +1 -0
  328. package/dist/pricing/acquisitionOfferPricing.d.ts +27 -0
  329. package/dist/pricing/acquisitionOfferPricing.js +25 -0
  330. package/dist/pricing/acquisitionOfferPricingHandler.d.ts +20 -0
  331. package/dist/pricing/acquisitionOfferPricingHandler.js +105 -0
  332. package/dist/pricing/acquisitionOfferPricingSchemas.d.ts +31 -0
  333. package/dist/pricing/acquisitionOfferPricingSchemas.js +33 -0
  334. package/dist/pricing/acquisitionQuoteBinding.d.ts +12 -0
  335. package/dist/pricing/acquisitionQuoteBinding.js +12 -0
  336. package/dist/pricing/acquisitionReadiness.d.ts +31 -0
  337. package/dist/pricing/acquisitionReadiness.js +117 -0
  338. package/dist/pricing/acquisitionTerms.d.ts +19 -0
  339. package/dist/pricing/acquisitionTerms.js +126 -0
  340. package/dist/pricing/acquisitionTermsSchemas.d.ts +59 -0
  341. package/dist/pricing/acquisitionTermsSchemas.js +42 -0
  342. package/dist/pricing/catalogFactsProvenance.d.ts +33 -0
  343. package/dist/pricing/catalogFactsProvenance.js +64 -0
  344. package/dist/pricing/catalogFactsSchemas.d.ts +45 -0
  345. package/dist/pricing/catalogFactsSchemas.js +58 -0
  346. package/dist/pricing/commerceOfferPricing.d.ts +25 -0
  347. package/dist/pricing/commerceOfferPricing.js +139 -0
  348. package/dist/pricing/commerceOfferPricingCache.d.ts +10 -0
  349. package/dist/pricing/commerceOfferPricingCache.js +44 -0
  350. package/dist/pricing/commerceOfferPricingHandler.d.ts +21 -0
  351. package/dist/pricing/commerceOfferPricingHandler.js +78 -0
  352. package/dist/pricing/commercePriceAuthority.d.ts +26 -0
  353. package/dist/pricing/commercePriceAuthority.js +79 -0
  354. package/dist/pricing/commercePricingPolicyErrors.d.ts +40 -0
  355. package/dist/pricing/commercePricingPolicyErrors.js +67 -0
  356. package/dist/pricing/commerceQuoteBatchHandler.d.ts +37 -0
  357. package/dist/pricing/commerceQuoteBatchHandler.js +83 -0
  358. package/dist/pricing/commerceQuoteCatalogReadPort.d.ts +27 -0
  359. package/dist/pricing/commerceQuoteCatalogReadPort.js +8 -0
  360. package/dist/pricing/commerceQuoteHandler.d.ts +31 -0
  361. package/dist/pricing/commerceQuoteHandler.js +110 -0
  362. package/dist/pricing/commerceQuoteSnapshotExpect.d.ts +9 -0
  363. package/dist/pricing/commerceQuoteSnapshotExpect.js +22 -0
  364. package/dist/pricing/contracts/acquisitionTerms.d.ts +32 -0
  365. package/dist/pricing/contracts/acquisitionTerms.js +2 -0
  366. package/dist/pricing/contracts/authority.d.ts +27 -0
  367. package/dist/pricing/contracts/authority.js +1 -0
  368. package/dist/pricing/contracts/evidence.d.ts +33 -0
  369. package/dist/pricing/contracts/evidence.js +1 -0
  370. package/dist/pricing/contracts/index.d.ts +17 -0
  371. package/dist/pricing/contracts/index.js +7 -0
  372. package/dist/pricing/contracts/money.d.ts +27 -0
  373. package/dist/pricing/contracts/money.js +1 -0
  374. package/dist/pricing/contracts/offer.d.ts +52 -0
  375. package/dist/pricing/contracts/offer.js +4 -0
  376. package/dist/pricing/contracts/offerPolicy.d.ts +16 -0
  377. package/dist/pricing/contracts/offerPolicy.js +5 -0
  378. package/dist/pricing/contracts/policy.d.ts +22 -0
  379. package/dist/pricing/contracts/policy.js +3 -0
  380. package/dist/pricing/contracts/provenance.d.ts +24 -0
  381. package/dist/pricing/contracts/provenance.js +2 -0
  382. package/dist/pricing/contracts/quote.d.ts +94 -0
  383. package/dist/pricing/contracts/quote.js +1 -0
  384. package/dist/pricing/dbBackedCommerceQuoteHelpers.d.ts +78 -0
  385. package/dist/pricing/dbBackedCommerceQuoteHelpers.js +146 -0
  386. package/dist/pricing/dbBackedCommerceQuotePort.d.ts +66 -0
  387. package/dist/pricing/dbBackedCommerceQuotePort.js +206 -0
  388. package/dist/pricing/dbBackedCommerceQuoteSnapshotVerifier.d.ts +4 -0
  389. package/dist/pricing/dbBackedCommerceQuoteSnapshotVerifier.js +25 -0
  390. package/dist/pricing/index.d.ts +51 -0
  391. package/dist/pricing/index.js +36 -0
  392. package/dist/pricing/offerPolicyReadiness.d.ts +21 -0
  393. package/dist/pricing/offerPolicyReadiness.js +79 -0
  394. package/dist/pricing/offerPolicySchemas.d.ts +25 -0
  395. package/dist/pricing/offerPolicySchemas.js +15 -0
  396. package/dist/pricing/offerPricingSchemas.d.ts +315 -0
  397. package/dist/pricing/offerPricingSchemas.js +65 -0
  398. package/dist/pricing/ports.d.ts +13 -0
  399. package/dist/pricing/ports.js +9 -0
  400. package/dist/pricing/pricingPolicyToken.d.ts +39 -0
  401. package/dist/pricing/pricingPolicyToken.js +84 -0
  402. package/dist/pricing/quoteAcquisitionTerms.d.ts +2 -0
  403. package/dist/pricing/quoteAcquisitionTerms.js +4 -0
  404. package/dist/pricing/quoteCodeRejectionDetails.d.ts +20 -0
  405. package/dist/pricing/quoteCodeRejectionDetails.js +22 -0
  406. package/dist/pricing/quotePorts.d.ts +30 -0
  407. package/dist/pricing/quotePorts.js +20 -0
  408. package/dist/pricing/quotePrimitives.d.ts +13 -0
  409. package/dist/pricing/quotePrimitives.js +18 -0
  410. package/dist/pricing/quotePromotionEvidence.d.ts +39 -0
  411. package/dist/pricing/quotePromotionEvidence.js +73 -0
  412. package/dist/pricing/quoteSchemas.d.ts +1176 -0
  413. package/dist/pricing/quoteSchemas.js +196 -0
  414. package/dist/pricing/subscriptionPricePolicy.d.ts +52 -0
  415. package/dist/pricing/subscriptionPricePolicy.js +96 -0
  416. package/dist/pricing/taxProfileGuard.d.ts +2 -0
  417. package/dist/pricing/taxProfileGuard.js +24 -0
  418. package/dist/pricing/validation.d.ts +2 -0
  419. package/dist/pricing/validation.js +3 -0
  420. package/dist/promotions/adminBindings.d.ts +72 -0
  421. package/dist/promotions/adminBindings.js +1 -0
  422. package/dist/promotions/adminPromotionCodesContracts.d.ts +498 -0
  423. package/dist/promotions/adminPromotionCodesContracts.js +211 -0
  424. package/dist/promotions/adminPromotionCodesDataPort.d.ts +47 -0
  425. package/dist/promotions/adminPromotionCodesDataPort.js +1 -0
  426. package/dist/promotions/adminPromotionCodesHandler.d.ts +14 -0
  427. package/dist/promotions/adminPromotionCodesHandler.js +194 -0
  428. package/dist/promotions/adminPromotionsContracts.d.ts +235 -0
  429. package/dist/promotions/adminPromotionsContracts.js +99 -0
  430. package/dist/promotions/adminPromotionsDataPort.d.ts +42 -0
  431. package/dist/promotions/adminPromotionsDataPort.js +1 -0
  432. package/dist/promotions/adminPromotionsHandler.d.ts +16 -0
  433. package/dist/promotions/adminPromotionsHandler.js +47 -0
  434. package/dist/promotions/contracts/index.d.ts +387 -0
  435. package/dist/promotions/contracts/index.js +1 -0
  436. package/dist/promotions/index.d.ts +22 -0
  437. package/dist/promotions/index.js +21 -0
  438. package/dist/promotions/promoDataPort.d.ts +47 -0
  439. package/dist/promotions/promoDataPort.js +14 -0
  440. package/dist/promotions/promotionAcceptanceTelemetry.d.ts +29 -0
  441. package/dist/promotions/promotionAcceptanceTelemetry.js +45 -0
  442. package/dist/promotions/promotionBenefitDefinition.d.ts +37 -0
  443. package/dist/promotions/promotionBenefitDefinition.js +33 -0
  444. package/dist/promotions/promotionClaimSweepPort.d.ts +14 -0
  445. package/dist/promotions/promotionClaimSweepPort.js +8 -0
  446. package/dist/promotions/promotionClaims.d.ts +5 -0
  447. package/dist/promotions/promotionClaims.js +57 -0
  448. package/dist/promotions/promotionCodePreview.d.ts +11 -0
  449. package/dist/promotions/promotionCodePreview.js +154 -0
  450. package/dist/promotions/promotionCodeQuotePort.d.ts +25 -0
  451. package/dist/promotions/promotionCodeQuotePort.js +1 -0
  452. package/dist/promotions/promotionQuoteAcceptance.d.ts +65 -0
  453. package/dist/promotions/promotionQuoteAcceptance.js +202 -0
  454. package/dist/promotions/promotionQuoteBinding.d.ts +71 -0
  455. package/dist/promotions/promotionQuoteBinding.js +85 -0
  456. package/dist/promotions/quoteAutomaticPromotions.d.ts +24 -0
  457. package/dist/promotions/quoteAutomaticPromotions.js +36 -0
  458. package/dist/promotions/quotePromoDiscounts.d.ts +32 -0
  459. package/dist/promotions/quotePromoDiscounts.js +140 -0
  460. package/dist/promotions/quotePromotionCodeAdjustments.d.ts +27 -0
  461. package/dist/promotions/quotePromotionCodeAdjustments.js +223 -0
  462. package/dist/promotions/quotePromotionV2.d.ts +29 -0
  463. package/dist/promotions/quotePromotionV2.js +174 -0
  464. package/dist/promotions/sql.d.ts +14 -0
  465. package/dist/promotions/sql.js +5 -0
  466. package/dist/promotions/validation.d.ts +2 -0
  467. package/dist/promotions/validation.js +3 -0
  468. package/dist/shipping/addressCanonLookupHandler.d.ts +7 -0
  469. package/dist/shipping/addressCanonLookupHandler.js +105 -0
  470. package/dist/shipping/addressCanonical.d.ts +2 -0
  471. package/dist/shipping/addressCanonical.js +26 -0
  472. package/dist/shipping/addressPorts.d.ts +39 -0
  473. package/dist/shipping/addressPorts.js +1 -0
  474. package/dist/shipping/addressSchemas.d.ts +30 -0
  475. package/dist/shipping/addressSchemas.js +1 -0
  476. package/dist/shipping/adminShippingRateHandler.d.ts +4 -0
  477. package/dist/shipping/adminShippingRateHandler.js +64 -0
  478. package/dist/shipping/contracts/address.d.ts +144 -0
  479. package/dist/shipping/contracts/address.js +1 -0
  480. package/dist/shipping/contracts/delivery.d.ts +110 -0
  481. package/dist/shipping/contracts/delivery.js +1 -0
  482. package/dist/shipping/contracts/index.d.ts +3 -0
  483. package/dist/shipping/contracts/index.js +1 -0
  484. package/dist/shipping/contracts/shippingRate.d.ts +11 -0
  485. package/dist/shipping/contracts/shippingRate.js +1 -0
  486. package/dist/shipping/customerAddressesHandler.d.ts +5 -0
  487. package/dist/shipping/customerAddressesHandler.js +80 -0
  488. package/dist/shipping/customerSelfServiceAddressModels.d.ts +27 -0
  489. package/dist/shipping/customerSelfServiceAddressModels.js +101 -0
  490. package/dist/shipping/deliverySelectionHandler.d.ts +10 -0
  491. package/dist/shipping/deliverySelectionHandler.js +77 -0
  492. package/dist/shipping/deliverySelectionPort.d.ts +8 -0
  493. package/dist/shipping/deliverySelectionPort.js +1 -0
  494. package/dist/shipping/deliverySelectionSummary.d.ts +2 -0
  495. package/dist/shipping/deliverySelectionSummary.js +53 -0
  496. package/dist/shipping/handlerSchemas.d.ts +21 -0
  497. package/dist/shipping/handlerSchemas.js +1 -0
  498. package/dist/shipping/index.d.ts +17 -0
  499. package/dist/shipping/index.js +8 -0
  500. package/dist/shipping/pickupPointSearchPort.d.ts +4 -0
  501. package/dist/shipping/pickupPointSearchPort.js +1 -0
  502. package/dist/shipping/readDeliverySelectionEvidence.d.ts +2 -0
  503. package/dist/shipping/readDeliverySelectionEvidence.js +44 -0
  504. package/dist/shipping/shippingRatePorts.d.ts +52 -0
  505. package/dist/shipping/shippingRatePorts.js +1 -0
  506. package/package.json +72 -2
  507. package/release-gates.json +249 -8
  508. package/sql/20260807140000_read_parity_catalog.sql +94 -0
  509. package/sql/20260807190000_comms_outbox_rail.sql +329 -0
  510. package/sql/20260810120000_storefront_catalog_attributes.sql +51 -0
  511. package/sql/20260810120001_transactional_delivery_receipts.sql +209 -0
  512. package/sql/20260812140000_sellable_bundle_catalog.sql +124 -0
  513. package/sql/20260812210000_bundle_operator_write_boundary.sql +567 -0
  514. package/sql/20260813120000_communications_control_plane.sql +568 -0
  515. package/sql/20260814000000_fulfillment_stock_evidence.sql +239 -0
  516. package/sql/20260815120000_automatic_subscription_renewal.sql +1083 -0
  517. package/sql/20260817180000_promotion_claim_lifecycle.sql +591 -0
  518. package/sql/20260817180100_promotion_claim_lifecycle_validation.sql +23 -0
  519. package/sql/20260827220000_catalog_document_revision_foundation.sql +226 -0
  520. package/sql/20260827220001_catalog_document_revision_foundation_validate.sql +10 -0
  521. package/sql/20260908100000_catalog_draft_foundation.sql +217 -0
  522. package/sql/20261019200000_communications_native_operations.sql +68 -0
  523. package/src/catalog/activeSkuSelection.ts +20 -0
  524. package/src/catalog/adminBindings.ts +59 -0
  525. package/src/catalog/adminBundleHandler.ts +165 -0
  526. package/src/catalog/adminBundleReadHandler.ts +261 -0
  527. package/src/catalog/adminBundleWritePort.ts +102 -0
  528. package/src/catalog/bundleAvailability.ts +129 -0
  529. package/src/catalog/bundleAvailabilityService.ts +171 -0
  530. package/src/catalog/bundleBindings.ts +29 -0
  531. package/src/catalog/bundleCatalogQueries.ts +98 -0
  532. package/src/catalog/bundleCatalogReadPort.ts +177 -0
  533. package/src/catalog/bundleCatalogStore.ts +269 -0
  534. package/src/catalog/bundleRuleCodes.ts +134 -0
  535. package/src/catalog/bundleRules.ts +153 -0
  536. package/src/catalog/catalogDraftStore.ts +71 -0
  537. package/src/catalog/catalogSkuEnvelope.ts +214 -0
  538. package/src/catalog/catalogSkuEnvelopeMapper.ts +160 -0
  539. package/src/catalog/contracts/bundleAdmin.ts +20 -0
  540. package/src/catalog/contracts/bundleAvailability.ts +5 -0
  541. package/src/catalog/contracts/bundleRead.ts +13 -0
  542. package/src/catalog/contracts/draft.ts +69 -0
  543. package/src/catalog/contracts/foundation.ts +104 -0
  544. package/src/catalog/contracts/index.ts +14 -0
  545. package/src/catalog/contracts/lifecycle.ts +74 -0
  546. package/src/catalog/contracts/productMediaContracts.ts +170 -0
  547. package/src/catalog/contracts/productTypes.ts +35 -0
  548. package/src/catalog/contracts/resolveProductMedia.ts +85 -0
  549. package/src/catalog/contracts/sellable.ts +12 -0
  550. package/src/catalog/draftHandler.ts +105 -0
  551. package/src/catalog/draftPorts.ts +18 -0
  552. package/src/catalog/draftSchemas.ts +88 -0
  553. package/src/catalog/draftValidation.ts +100 -0
  554. package/src/catalog/foundationSchemas.ts +123 -0
  555. package/src/catalog/index.ts +43 -0
  556. package/src/catalog/mediaSourcePack.ts +219 -0
  557. package/src/catalog/productTypeSchemas.ts +70 -0
  558. package/src/catalog/publicationPorts.ts +44 -0
  559. package/src/catalog/readPorts.ts +61 -0
  560. package/src/catalog/referenceCatalogHandler.ts +39 -0
  561. package/src/catalog/resolvedSkuProjection.ts +76 -0
  562. package/src/catalog/sellableBundleHandler.ts +133 -0
  563. package/src/catalog/sellableSchemas.ts +33 -0
  564. package/src/catalog/sql.ts +14 -0
  565. package/src/catalog/validation.ts +3 -0
  566. package/src/communications/accountingDocumentDelivery.ts +63 -0
  567. package/src/communications/authEmailError.ts +10 -0
  568. package/src/communications/authEmailPorts.ts +2 -0
  569. package/src/communications/authSendEmailHook.ts +310 -0
  570. package/src/communications/capturedTransactionalDelivery.ts +29 -0
  571. package/src/communications/communicationSync.ts +96 -0
  572. package/src/communications/communicationSyncWorker.ts +302 -0
  573. package/src/communications/consentPolicy.ts +82 -0
  574. package/src/communications/consentPurposeRegistry.ts +31 -0
  575. package/src/communications/contracts/abandonedCart.ts +64 -0
  576. package/src/communications/contracts/authEmail.ts +73 -0
  577. package/src/communications/contracts/backInStock.ts +69 -0
  578. package/src/communications/contracts/blocks.ts +47 -0
  579. package/src/communications/contracts/checkoutExpired.ts +62 -0
  580. package/src/communications/contracts/checkoutRecovery.ts +68 -0
  581. package/src/communications/contracts/commerceEmailContent.ts +189 -0
  582. package/src/communications/contracts/commerceEngagementEmailContent.ts +106 -0
  583. package/src/communications/contracts/consent.ts +13 -0
  584. package/src/communications/contracts/email.ts +210 -0
  585. package/src/communications/contracts/guideCard.ts +34 -0
  586. package/src/communications/contracts/index.ts +52 -0
  587. package/src/communications/contracts/inquiryContent.ts +53 -0
  588. package/src/communications/contracts/invoiceDocumentContent.ts +57 -0
  589. package/src/communications/contracts/marketingAutomation.ts +45 -0
  590. package/src/communications/contracts/marketingSync.ts +109 -0
  591. package/src/communications/contracts/newsletter.ts +78 -0
  592. package/src/communications/contracts/newsletterWebhook.ts +23 -0
  593. package/src/communications/contracts/optOutContent.ts +23 -0
  594. package/src/communications/contracts/orderCanceled.ts +64 -0
  595. package/src/communications/contracts/orderDraft.ts +112 -0
  596. package/src/communications/contracts/orderPaid.ts +147 -0
  597. package/src/communications/contracts/orderRefunded.ts +63 -0
  598. package/src/communications/contracts/paymentFailed.ts +59 -0
  599. package/src/communications/contracts/publicIntake.ts +53 -0
  600. package/src/communications/contracts/render.ts +271 -0
  601. package/src/communications/contracts/reorderReminder.ts +59 -0
  602. package/src/communications/contracts/returnEmails.ts +113 -0
  603. package/src/communications/contracts/reviewEffects.ts +60 -0
  604. package/src/communications/contracts/reviewRequest.ts +59 -0
  605. package/src/communications/contracts/roleNotificationContent.ts +65 -0
  606. package/src/communications/contracts/shipmentDelivered.ts +59 -0
  607. package/src/communications/contracts/shipmentDispatched.ts +77 -0
  608. package/src/communications/contracts/shipmentException.ts +62 -0
  609. package/src/communications/contracts/subscriptionActivationActionRequired.ts +37 -0
  610. package/src/communications/contracts/subscriptionAddressChanged.ts +56 -0
  611. package/src/communications/contracts/subscriptionCancelled.ts +57 -0
  612. package/src/communications/contracts/subscriptionCycleSkipped.ts +80 -0
  613. package/src/communications/contracts/subscriptionDeliveryRescheduled.ts +79 -0
  614. package/src/communications/contracts/subscriptionEmailContent.ts +163 -0
  615. package/src/communications/contracts/subscriptionPackageChanged.ts +59 -0
  616. package/src/communications/contracts/subscriptionPauseReminder.ts +63 -0
  617. package/src/communications/contracts/subscriptionPaused.ts +58 -0
  618. package/src/communications/contracts/subscriptionPaymentExpired.ts +83 -0
  619. package/src/communications/contracts/subscriptionPaymentFailed.ts +117 -0
  620. package/src/communications/contracts/subscriptionPaymentRecovered.ts +50 -0
  621. package/src/communications/contracts/subscriptionRenewalAtRisk.ts +85 -0
  622. package/src/communications/contracts/subscriptionRenewalUpcoming.ts +103 -0
  623. package/src/communications/contracts/subscriptionResumed.ts +60 -0
  624. package/src/communications/contracts/subscriptionWelcome.ts +102 -0
  625. package/src/communications/contracts/subscriptionWinback.ts +62 -0
  626. package/src/communications/contracts/transactionalDelivery.ts +43 -0
  627. package/src/communications/contracts/types.ts +58 -0
  628. package/src/communications/contribution.ts +33 -0
  629. package/src/communications/deliveryReconciliation.ts +108 -0
  630. package/src/communications/emailEgress.ts +111 -0
  631. package/src/communications/emailHealthAssessment.ts +106 -0
  632. package/src/communications/emailHealthMetricsPort.ts +17 -0
  633. package/src/communications/emailNotificationControl.ts +28 -0
  634. package/src/communications/emailObservation.ts +43 -0
  635. package/src/communications/emailTransport.ts +167 -0
  636. package/src/communications/errors.ts +34 -0
  637. package/src/communications/index.ts +47 -0
  638. package/src/communications/integrationEventSignature.ts +49 -0
  639. package/src/communications/klaviyo/consentPush.ts +19 -0
  640. package/src/communications/klaviyo/index.ts +649 -0
  641. package/src/communications/managedTransactionalDeliveryStore.ts +59 -0
  642. package/src/communications/nativeOperations.ts +40 -0
  643. package/src/communications/newsletterIntegrationContracts.ts +154 -0
  644. package/src/communications/newsletterWebhookPort.ts +104 -0
  645. package/src/communications/newsletterWebhookProcessing.ts +102 -0
  646. package/src/communications/originPolicy.ts +151 -0
  647. package/src/communications/postgresCommunicationSync.ts +127 -0
  648. package/src/communications/postgresConsentEvaluator.ts +49 -0
  649. package/src/communications/postgresDeliveryReconciliation.ts +101 -0
  650. package/src/communications/postgresNativeOperations.ts +55 -0
  651. package/src/communications/postgresNotificationRecipients.ts +57 -0
  652. package/src/communications/postgresTransactionalDeliveryStore.ts +79 -0
  653. package/src/communications/preferencesToken.ts +62 -0
  654. package/src/communications/publicPreferenceToken.ts +68 -0
  655. package/src/communications/resend/index.ts +350 -0
  656. package/src/communications/shipmentNotifications.ts +78 -0
  657. package/src/communications/sql.ts +7 -0
  658. package/src/communications/standardWebhooks.ts +84 -0
  659. package/src/communications/status.ts +51 -0
  660. package/src/communications/transactionalDelivery.ts +114 -0
  661. package/src/communications/transactionalDeliveryIdentifier.ts +9 -0
  662. package/src/communications/unsubscribeToken.ts +186 -0
  663. package/src/communications/validation.ts +3 -0
  664. package/src/composition/catalogContribution.ts +32 -0
  665. package/src/composition/index.ts +1 -0
  666. package/src/http/index.ts +1 -0
  667. package/src/http/webhookSignature.ts +96 -0
  668. package/src/inventory/adminInventory.ts +251 -0
  669. package/src/inventory/contracts/forecast.ts +96 -0
  670. package/src/inventory/contracts/index.ts +18 -0
  671. package/src/inventory/contracts/inventory.ts +14 -0
  672. package/src/inventory/contracts/newPurchaseStock.ts +23 -0
  673. package/src/inventory/contracts/reservation.ts +20 -0
  674. package/src/inventory/forecast.ts +239 -0
  675. package/src/inventory/index.ts +21 -0
  676. package/src/inventory/inventoryHandlers.ts +215 -0
  677. package/src/inventory/newPurchaseStockAvailability.ts +120 -0
  678. package/src/inventory/ports.ts +46 -0
  679. package/src/inventory/renewalReservation.ts +88 -0
  680. package/src/inventory/reservationPolicy.ts +27 -0
  681. package/src/inventory/schemas.ts +128 -0
  682. package/src/inventory/sql.ts +5 -0
  683. package/src/inventory/subscriptionForecastCalculation.ts +157 -0
  684. package/src/pricing/acquisitionFinancialPolicy.ts +26 -0
  685. package/src/pricing/acquisitionOfferPricing.ts +38 -0
  686. package/src/pricing/acquisitionOfferPricingHandler.ts +157 -0
  687. package/src/pricing/acquisitionOfferPricingSchemas.ts +35 -0
  688. package/src/pricing/acquisitionQuoteBinding.ts +12 -0
  689. package/src/pricing/acquisitionReadiness.ts +148 -0
  690. package/src/pricing/acquisitionTerms.ts +125 -0
  691. package/src/pricing/acquisitionTermsSchemas.ts +52 -0
  692. package/src/pricing/catalogFactsProvenance.ts +102 -0
  693. package/src/pricing/catalogFactsSchemas.ts +69 -0
  694. package/src/pricing/commerceOfferPricing.ts +224 -0
  695. package/src/pricing/commerceOfferPricingCache.ts +53 -0
  696. package/src/pricing/commerceOfferPricingHandler.ts +137 -0
  697. package/src/pricing/commercePriceAuthority.ts +104 -0
  698. package/src/pricing/commercePricingPolicyErrors.ts +88 -0
  699. package/src/pricing/commerceQuoteBatchHandler.ts +129 -0
  700. package/src/pricing/commerceQuoteCatalogReadPort.ts +42 -0
  701. package/src/pricing/commerceQuoteHandler.ts +184 -0
  702. package/src/pricing/commerceQuoteSnapshotExpect.ts +48 -0
  703. package/src/pricing/contracts/acquisitionTerms.ts +26 -0
  704. package/src/pricing/contracts/authority.ts +44 -0
  705. package/src/pricing/contracts/evidence.ts +25 -0
  706. package/src/pricing/contracts/index.ts +17 -0
  707. package/src/pricing/contracts/money.ts +32 -0
  708. package/src/pricing/contracts/offer.ts +42 -0
  709. package/src/pricing/contracts/offerPolicy.ts +17 -0
  710. package/src/pricing/contracts/policy.ts +26 -0
  711. package/src/pricing/contracts/provenance.ts +19 -0
  712. package/src/pricing/contracts/quote.ts +106 -0
  713. package/src/pricing/dbBackedCommerceQuoteHelpers.ts +256 -0
  714. package/src/pricing/dbBackedCommerceQuotePort.ts +260 -0
  715. package/src/pricing/dbBackedCommerceQuoteSnapshotVerifier.ts +49 -0
  716. package/src/pricing/index.ts +52 -0
  717. package/src/pricing/offerPolicyReadiness.ts +110 -0
  718. package/src/pricing/offerPolicySchemas.ts +23 -0
  719. package/src/pricing/offerPricingSchemas.ts +92 -0
  720. package/src/pricing/ports.ts +17 -0
  721. package/src/pricing/pricingPolicyToken.ts +119 -0
  722. package/src/pricing/quoteAcquisitionTerms.ts +10 -0
  723. package/src/pricing/quoteCodeRejectionDetails.ts +23 -0
  724. package/src/pricing/quotePorts.ts +58 -0
  725. package/src/pricing/quotePrimitives.ts +21 -0
  726. package/src/pricing/quotePromotionEvidence.ts +82 -0
  727. package/src/pricing/quoteSchemas.ts +230 -0
  728. package/src/pricing/subscriptionPricePolicy.ts +113 -0
  729. package/src/pricing/taxProfileGuard.ts +33 -0
  730. package/src/pricing/validation.ts +3 -0
  731. package/src/promotions/adminBindings.ts +53 -0
  732. package/src/promotions/adminPromotionCodesContracts.ts +244 -0
  733. package/src/promotions/adminPromotionCodesDataPort.ts +56 -0
  734. package/src/promotions/adminPromotionCodesHandler.ts +254 -0
  735. package/src/promotions/adminPromotionsContracts.ts +121 -0
  736. package/src/promotions/adminPromotionsDataPort.ts +48 -0
  737. package/src/promotions/adminPromotionsHandler.ts +72 -0
  738. package/src/promotions/contracts/index.ts +387 -0
  739. package/src/promotions/index.ts +22 -0
  740. package/src/promotions/promoDataPort.ts +65 -0
  741. package/src/promotions/promotionAcceptanceTelemetry.ts +73 -0
  742. package/src/promotions/promotionBenefitDefinition.ts +48 -0
  743. package/src/promotions/promotionClaimSweepPort.ts +23 -0
  744. package/src/promotions/promotionClaims.ts +70 -0
  745. package/src/promotions/promotionCodePreview.ts +183 -0
  746. package/src/promotions/promotionCodeQuotePort.ts +35 -0
  747. package/src/promotions/promotionQuoteAcceptance.ts +284 -0
  748. package/src/promotions/promotionQuoteBinding.ts +158 -0
  749. package/src/promotions/quoteAutomaticPromotions.ts +58 -0
  750. package/src/promotions/quotePromoDiscounts.ts +185 -0
  751. package/src/promotions/quotePromotionCodeAdjustments.ts +277 -0
  752. package/src/promotions/quotePromotionV2.ts +223 -0
  753. package/src/promotions/sql.ts +5 -0
  754. package/src/promotions/validation.ts +3 -0
  755. package/src/shipping/addressCanonLookupHandler.ts +114 -0
  756. package/src/shipping/addressCanonical.ts +31 -0
  757. package/src/shipping/addressPorts.ts +48 -0
  758. package/src/shipping/addressSchemas.ts +28 -0
  759. package/src/shipping/adminShippingRateHandler.ts +72 -0
  760. package/src/shipping/contracts/address.ts +71 -0
  761. package/src/shipping/contracts/delivery.ts +114 -0
  762. package/src/shipping/contracts/index.ts +18 -0
  763. package/src/shipping/contracts/shippingRate.ts +7 -0
  764. package/src/shipping/customerAddressesHandler.ts +100 -0
  765. package/src/shipping/customerSelfServiceAddressModels.ts +124 -0
  766. package/src/shipping/deliverySelectionHandler.ts +94 -0
  767. package/src/shipping/deliverySelectionPort.ts +10 -0
  768. package/src/shipping/deliverySelectionSummary.ts +56 -0
  769. package/src/shipping/handlerSchemas.ts +19 -0
  770. package/src/shipping/index.ts +23 -0
  771. package/src/shipping/pickupPointSearchPort.ts +8 -0
  772. package/src/shipping/readDeliverySelectionEvidence.ts +51 -0
  773. package/src/shipping/shippingRatePorts.ts +36 -0
@@ -0,0 +1,117 @@
1
+ import type { SubscriptionEmailContent } from "./subscriptionEmailContent.js";
2
+ import type { PaymentFailureCustomerCause } from "@openlup/core/payment";
3
+ import type { Locale } from "./email.js";
4
+ import {
5
+ accentBox,
6
+ button,
7
+ heading,
8
+ paragraph,
9
+ type EmailBlock,
10
+ } from "./blocks.js";
11
+
12
+ export interface SubscriptionPaymentFailedEmailVars {
13
+ firstName: string | null;
14
+ /** Formatted gross amount that failed, e.g. "129,99 zł", or null when unknown. */
15
+ amountLabel: string | null;
16
+ /** Dunning retry attempt: 1 (gentle), 2 (reminder), 3+ (final retry announced). */
17
+ retryAttempt: number;
18
+ /** Absolute recovery URL (localized); null/absent → no button. */
19
+ recoveryUrl?: string | null;
20
+ /**
21
+ * Pre-formatted calendar day of the scheduled next charge, in the merchant's
22
+ * zone (e.g. "11.08.2026"). The dunning row that selects THIS template always
23
+ * carries a scheduled retry, so in production this is present; null keeps the
24
+ * pre-date sentence rather than printing a placeholder date.
25
+ */
26
+ nextRetryDateLabel?: string | null;
27
+ /** Card scheme as stored on the method's consent snapshot, e.g. "visa". */
28
+ methodScheme?: string | null;
29
+ /** Trailing digits of the stored method, e.g. "4242". */
30
+ methodLastDigits?: string | null;
31
+ /**
32
+ * Why the charge was refused, in the payer-facing vocabulary. Absent or
33
+ * `unknown` renders no cause sentence at all — see `subscriptionPaymentCauseCopy`.
34
+ */
35
+ cause?: PaymentFailureCustomerCause | null;
36
+ /**
37
+ * Whether the ladder scheduled a further charge for this cycle. Absent or
38
+ * `true` is today's rail and today's copy. `false` states that no further
39
+ * attempt is coming and leaves the CTA as the only remedy; any
40
+ * `nextRetryDateLabel` supplied alongside it is ignored rather than printed,
41
+ * because a date is only ever printed as part of a retry promise.
42
+ */
43
+ retryScheduled?: boolean;
44
+ }
45
+
46
+ export interface SubscriptionPaymentFailedEmailContent {
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 createSubscriptionPaymentFailedContentFactory(input: {
54
+ subscriptionEmailContent: Pick<SubscriptionEmailContent, "paymentFailed">;
55
+ subscriptionPaymentCauseSentence: (locale: Locale, cause: PaymentFailureCustomerCause) => string | null;
56
+ }) {
57
+ const { subscriptionEmailContent, subscriptionPaymentCauseSentence } = input;
58
+
59
+ function subscriptionPaymentFailedEmailContent(
60
+ locale: Locale,
61
+ vars: SubscriptionPaymentFailedEmailVars,
62
+ signoff: string,
63
+ ): SubscriptionPaymentFailedEmailContent {
64
+ const copy = subscriptionEmailContent.paymentFailed[locale];
65
+ // Method facts are additive and BOTH halves must be present: "karta Visa ••••"
66
+ // with no digits identifies nothing, and bare digits with no scheme is worse.
67
+ // Absent facts drop the sentence rather than render a placeholder.
68
+ const scheme = vars.methodScheme?.trim() || null;
69
+ const lastDigits = vars.methodLastDigits?.trim() || null;
70
+ // The cause leads the box: it is the answer to the question the subject line
71
+ // just raised, and the amount means little until the reader knows why. It is
72
+ // also why it is PREPENDED and never appended — the retry sentence must stay
73
+ // last (see below).
74
+ const causeSentence = subscriptionPaymentCauseSentence(locale, vars.cause ?? "unknown");
75
+ // Only an explicit `false` turns the promises off. Absent means "no producer
76
+ // told us", and the only rail that exists always schedules a retry, so absent
77
+ // must keep rendering today's copy rather than the safer-sounding new copy:
78
+ // telling a customer no attempt is coming when one is would push them to
79
+ // cancel a subscription that was about to recover on its own.
80
+ const retryScheduled = vars.retryScheduled !== false;
81
+ const detail = [
82
+ ...(causeSentence ? [causeSentence] : []),
83
+ vars.amountLabel
84
+ ? copy.amountLine(vars.amountLabel)
85
+ : retryScheduled
86
+ ? copy.noAmountLine
87
+ : copy.noAmountLineNoRetry,
88
+ ...(scheme && lastDigits ? [copy.methodLine(scheme, lastDigits)] : []),
89
+ // Kept LAST in the box on purpose: the retry sentence is the one the
90
+ // characterization pins read off the end of `accentBox.lines`. Its
91
+ // no-retry replacement takes the same position for the same reason.
92
+ retryScheduled
93
+ ? copy.reassurance(vars.retryAttempt, vars.nextRetryDateLabel?.trim() || null)
94
+ : copy.noRetryAction,
95
+ ];
96
+ const blocks: EmailBlock[] = [
97
+ heading(copy.heading),
98
+ paragraph(copy.greeting(vars.firstName)),
99
+ paragraph(copy.intro),
100
+ accentBox(detail),
101
+ ];
102
+
103
+ if (vars.recoveryUrl) {
104
+ blocks.push(button(copy.cta, vars.recoveryUrl));
105
+ }
106
+
107
+ blocks.push(paragraph(copy.outro));
108
+ blocks.push(paragraph(signoff));
109
+
110
+ return {
111
+ subject: copy.subject,
112
+ preheader: copy.preheader,
113
+ blocks,
114
+ };
115
+ }
116
+ return { subscriptionPaymentFailedEmailContent };
117
+ }
@@ -0,0 +1,50 @@
1
+ import type { SubscriptionEmailContent } from "./subscriptionEmailContent.js";
2
+ import type { Locale } from "./email.js";
3
+ import {
4
+ accentBox,
5
+ heading,
6
+ paragraph,
7
+ type EmailBlock,
8
+ } from "./blocks.js";
9
+
10
+ export interface SubscriptionPaymentRecoveredEmailVars {
11
+ firstName: string | null;
12
+ /** Formatted gross amount of the recovered cycle, e.g. "129,99 zł", or null. */
13
+ amountLabel: string | null;
14
+ }
15
+
16
+ export interface SubscriptionPaymentRecoveredEmailContent {
17
+ subject: string;
18
+ preheader: string;
19
+ blocks: EmailBlock[];
20
+ }
21
+
22
+ /** Bind host-selected copy and pure helpers without provider or environment access. */
23
+ export function createSubscriptionPaymentRecoveredContentFactory(input: {
24
+ subscriptionEmailContent: Pick<SubscriptionEmailContent, "paymentRecovered">;
25
+ }) {
26
+ const { subscriptionEmailContent } = input;
27
+
28
+ function subscriptionPaymentRecoveredEmailContent(
29
+ locale: Locale,
30
+ vars: SubscriptionPaymentRecoveredEmailVars,
31
+ signoff: string,
32
+ ): SubscriptionPaymentRecoveredEmailContent {
33
+ const copy = subscriptionEmailContent.paymentRecovered[locale];
34
+ const blocks: EmailBlock[] = [
35
+ heading(copy.heading),
36
+ paragraph(copy.greeting(vars.firstName)),
37
+ paragraph(copy.intro),
38
+ accentBox(copy.detail(vars.amountLabel)),
39
+ paragraph(copy.outro),
40
+ paragraph(signoff),
41
+ ];
42
+
43
+ return {
44
+ subject: copy.subject,
45
+ preheader: copy.preheader,
46
+ blocks,
47
+ };
48
+ }
49
+ return { subscriptionPaymentRecoveredEmailContent };
50
+ }
@@ -0,0 +1,85 @@
1
+ import type { SubscriptionEmailContent } from "./subscriptionEmailContent.js";
2
+ import type { PaymentFailureCustomerCause } from "@openlup/core/payment";
3
+ import type { Locale } from "./email.js";
4
+ import {
5
+ accentBox,
6
+ button,
7
+ heading,
8
+ paragraph,
9
+ type EmailBlock,
10
+ } from "./blocks.js";
11
+
12
+ /**
13
+ * Which of the two unchargeable states produced this notice.
14
+ *
15
+ * ⛔ THESE TWO TOKENS ARE LEDGER IDENTITY, NOT COPY KEYS. The producer's dedupe
16
+ * key AND its two-send cap are one string, `<subscriptionId>:<cause>:<day>`, and
17
+ * the cap is read back by matching this token as a LIKE prefix. Renaming either
18
+ * value — including "aligning" it with the shared cause vocabulary below —
19
+ * silently resets every cap ever recorded, because the new prefix matches
20
+ * nothing. The mapping to the shared vocabulary therefore happens at RENDER
21
+ * time, here, and never in the producer.
22
+ */
23
+ export type SubscriptionRenewalAtRiskCause = "mandate" | "missing";
24
+
25
+ export interface SubscriptionRenewalAtRiskEmailVars {
26
+ firstName: string | null;
27
+ /** Calendar day of the scheduled renewal in the merchant zone, or null. */
28
+ renewalDateLabel: string | null;
29
+ cause: SubscriptionRenewalAtRiskCause;
30
+ /** Account payments deep link; the same one the activation-gap email uses. */
31
+ ctaUrl: string;
32
+ }
33
+
34
+ export interface SubscriptionRenewalAtRiskEmailContent {
35
+ subject: string;
36
+ preheader: string;
37
+ blocks: EmailBlock[];
38
+ }
39
+
40
+ /** Bind host-selected copy and pure helpers without provider or environment access. */
41
+ export function createSubscriptionRenewalAtRiskContentFactory(input: {
42
+ subscriptionEmailContent: Pick<SubscriptionEmailContent, "renewalAtRisk">;
43
+ subscriptionPaymentCauseSentence: (locale: Locale, cause: PaymentFailureCustomerCause) => string | null;
44
+ }) {
45
+ const { subscriptionEmailContent, subscriptionPaymentCauseSentence } = input;
46
+
47
+ /** Render-time only. See the ⛔ above before touching either side of this map. */
48
+ const SHARED_CAUSE: Record<SubscriptionRenewalAtRiskCause, PaymentFailureCustomerCause> = {
49
+ mandate: "method_cannot_recur",
50
+ missing: "method_missing",
51
+ };
52
+
53
+ /**
54
+ * Both of this rail's causes state something about the stored method, so both
55
+ * have a shared sentence and neither can be `unknown`. The non-null assertion is
56
+ * carried by the `SHARED_CAUSE` map's exhaustive typing, not by an assumption.
57
+ */
58
+ function causeSentence(locale: Locale, cause: SubscriptionRenewalAtRiskCause): string {
59
+ return subscriptionPaymentCauseSentence(locale, SHARED_CAUSE[cause]) ?? "";
60
+ }
61
+
62
+ function subscriptionRenewalAtRiskEmailContent(
63
+ locale: Locale,
64
+ vars: SubscriptionRenewalAtRiskEmailVars,
65
+ signoff: string,
66
+ ): SubscriptionRenewalAtRiskEmailContent {
67
+ const copy = subscriptionEmailContent.renewalAtRisk[locale];
68
+ const blocks: EmailBlock[] = [
69
+ heading(copy.heading),
70
+ paragraph(copy.greeting(vars.firstName)),
71
+ paragraph(copy.intro(vars.renewalDateLabel)),
72
+ accentBox([causeSentence(locale, vars.cause), copy.consequence]),
73
+ button(copy.cta, vars.ctaUrl),
74
+ paragraph(copy.outro),
75
+ paragraph(signoff),
76
+ ];
77
+
78
+ return {
79
+ subject: copy.subject,
80
+ preheader: copy.preheader,
81
+ blocks,
82
+ };
83
+ }
84
+ return { subscriptionRenewalAtRiskEmailContent };
85
+ }
@@ -0,0 +1,103 @@
1
+ import type { SubscriptionEmailContent } from "./subscriptionEmailContent.js";
2
+ import type { Locale } from "./email.js";
3
+ import type { SubscriptionRenewalUpcomingCopy } from "./subscriptionEmailContent.js";
4
+ import {
5
+ accentBox,
6
+ button,
7
+ heading,
8
+ paragraph,
9
+ type EmailBlock,
10
+ } from "./blocks.js";
11
+
12
+ export interface SubscriptionRenewalUpcomingEmailVars {
13
+ firstName: string | null;
14
+ /** Pre-formatted renewal CHARGE date (locale-formatted by the worker). */
15
+ renewalDateLabel: string | null;
16
+ /** Pre-formatted estimated delivery window, 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
+ /**
21
+ * Pre-formatted composition edit deadline. Null when unknown OR when the
22
+ * deadline has already passed at send time — see the module header.
23
+ */
24
+ editCutoffLabel?: string | null;
25
+ /** Formatted gross amount of the upcoming charge, e.g. "129,99 zł", or null. */
26
+ amountLabel: string | null;
27
+ /**
28
+ * Starter-pack acquisition stage of the delivery being announced, or null for
29
+ * an ordinary renewal. `"graduation"` means the NEXT delivery switches to the
30
+ * steady package — a size and rhythm change the customer agreed to at checkout
31
+ * but has not seen since, so it gets its own paragraph rather than a detail
32
+ * line. `"delivery2"` only marks the discounted repeat; its amount already
33
+ * rides on `amountLabel`.
34
+ */
35
+ starterStage?: "delivery2" | "graduation" | null;
36
+ /** Units per delivery from the graduation on; renders only with `"graduation"`. */
37
+ starterSteadyUnitCount?: number | null;
38
+ /** Days between deliveries from the graduation on; renders only with `"graduation"`. */
39
+ starterSteadyCadenceDays?: number | null;
40
+ /** Adopter-formatted steady package, already localized; renders only with `"graduation"`. */
41
+ starterSteadyDetail?: string | null;
42
+ /** Absolute "manage subscription" URL; null/absent → no button. */
43
+ ctaUrl?: string | null;
44
+ /** Optional consumer context label; absent/null uses the selected pack's fallback. */
45
+ contextName?: string | null;
46
+ }
47
+
48
+ export interface SubscriptionRenewalUpcomingEmailContent {
49
+ subject: string;
50
+ preheader: string;
51
+ blocks: EmailBlock[];
52
+ }
53
+
54
+ /** Bind host-selected copy and pure helpers without provider or environment access. */
55
+ export function createSubscriptionRenewalUpcomingContentFactory(input: {
56
+ subscriptionEmailContent: Pick<SubscriptionEmailContent, "renewalUpcoming">;
57
+ }) {
58
+ const { subscriptionEmailContent } = input;
59
+
60
+ function subscriptionRenewalUpcomingEmailContent(
61
+ locale: Locale,
62
+ vars: SubscriptionRenewalUpcomingEmailVars,
63
+ signoff: string,
64
+ ): SubscriptionRenewalUpcomingEmailContent {
65
+ const copy: SubscriptionRenewalUpcomingCopy = subscriptionEmailContent.renewalUpcoming[locale];
66
+ const details: string[] = [
67
+ vars.renewalDateLabel ? copy.dateLine(vars.renewalDateLabel) : copy.noDateLine,
68
+ ];
69
+ if (vars.deliveryWindowLabel) details.push(copy.deliveryLine(vars.deliveryWindowLabel));
70
+ if (vars.holidayNote) details.push(vars.holidayNote);
71
+ if (vars.amountLabel) details.push(copy.amountLine(vars.amountLabel));
72
+ // Null when already past — the caller, not this renderer, owns that decision.
73
+ if (vars.editCutoffLabel) details.push(copy.editCutoffLine(vars.editCutoffLabel));
74
+
75
+ const blocks: EmailBlock[] = [
76
+ heading(copy.heading),
77
+ paragraph(copy.greeting(vars.firstName)),
78
+ paragraph(copy.intro(vars.contextName ?? null)),
79
+ accentBox(details, { label: copy.detailsLabel }),
80
+ ];
81
+
82
+ // The package-size change is the one thing in this email a customer could be
83
+ // surprised by, so it gets its own paragraph ABOVE the generic self-service
84
+ // line, and it names moving the delivery first.
85
+ if (vars.starterStage === "graduation" && vars.starterSteadyUnitCount && vars.starterSteadyCadenceDays) {
86
+ blocks.push(paragraph(copy.starterGraduationLine(vars.starterSteadyUnitCount, vars.starterSteadyCadenceDays, vars.starterSteadyDetail)));
87
+ }
88
+ blocks.push(paragraph(copy.manageLine));
89
+
90
+ if (vars.ctaUrl) {
91
+ blocks.push(button(copy.cta, vars.ctaUrl));
92
+ }
93
+
94
+ blocks.push(paragraph(signoff));
95
+
96
+ return {
97
+ subject: copy.subject,
98
+ preheader: copy.preheader,
99
+ blocks,
100
+ };
101
+ }
102
+ return { subscriptionRenewalUpcomingEmailContent };
103
+ }
@@ -0,0 +1,60 @@
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 SubscriptionResumedEmailVars {
12
+ firstName: string | null;
13
+ /** Consumer-facing brand label injected by the app/composition root. */
14
+ brandName: string;
15
+ /** Absolute CTA URL (manage subscription); null/absent → no button. */
16
+ ctaUrl?: string | null;
17
+ /** Optional consumer context label; absent/null uses the selected pack's fallback. */
18
+ contextName?: string | null;
19
+ }
20
+
21
+ export interface SubscriptionResumedEmailContent {
22
+ subject: string;
23
+ preheader: string;
24
+ blocks: EmailBlock[];
25
+ }
26
+
27
+ /** Bind host-selected copy and pure helpers without provider or environment access. */
28
+ export function createSubscriptionResumedContentFactory(input: {
29
+ subscriptionEmailContent: Pick<SubscriptionEmailContent, "resumed">;
30
+ }) {
31
+ const { subscriptionEmailContent } = input;
32
+
33
+ function subscriptionResumedEmailContent(
34
+ locale: Locale,
35
+ vars: SubscriptionResumedEmailVars,
36
+ signoff: string,
37
+ ): SubscriptionResumedEmailContent {
38
+ const copy = subscriptionEmailContent.resumed[locale];
39
+ const blocks: EmailBlock[] = [
40
+ heading(copy.heading),
41
+ paragraph(copy.greeting(vars.firstName)),
42
+ paragraph(copy.intro(vars.contextName ?? null)),
43
+ accentBox(copy.reassurance(vars.brandName)),
44
+ ];
45
+
46
+ if (vars.ctaUrl) {
47
+ blocks.push(button(copy.cta, vars.ctaUrl));
48
+ }
49
+
50
+ blocks.push(paragraph(copy.outro));
51
+ blocks.push(paragraph(signoff));
52
+
53
+ return {
54
+ subject: copy.subject,
55
+ preheader: copy.preheader,
56
+ blocks,
57
+ };
58
+ }
59
+ return { subscriptionResumedEmailContent };
60
+ }
@@ -0,0 +1,102 @@
1
+ import type { SubscriptionEmailContent } from "./subscriptionEmailContent.js";
2
+ import type { Locale } from "./email.js";
3
+ import type { SubscriptionWelcomeCopy } from "./subscriptionEmailContent.js";
4
+ import {
5
+ accentBox,
6
+ button,
7
+ heading,
8
+ paragraph,
9
+ type EmailBlock,
10
+ } from "./blocks.js";
11
+
12
+ export interface SubscriptionWelcomeEmailVars {
13
+ firstName: string | null;
14
+ cadenceDays: number | null;
15
+ /** Pre-formatted renewal CHARGE date (locale-formatted by the handler), or null. */
16
+ chargeDateLabel: string | null;
17
+ /** Pre-formatted estimated delivery window, e.g. "04.08.2026 – 05.08.2026", or null. */
18
+ deliveryWindowLabel: string | null;
19
+ /** Pre-formatted composition edit deadline, or null when unknown/already passed. */
20
+ editCutoffLabel?: string | null;
21
+ /**
22
+ * Localized holiday caveat, supplied by the handler ONLY when a public holiday
23
+ * actually moved the estimated window. Null/absent is the normal case and must
24
+ * render nothing — a standing "we account for holidays" line is noise.
25
+ */
26
+ holidayNote?: string | null;
27
+ /** Absolute "manage subscription" URL; null/absent → no button. */
28
+ ctaUrl?: string | null;
29
+ /**
30
+ * Starter-pack acquisition facts, present only for a subscription that carries
31
+ * an acquisition marker. `starterAmountLabel` is the DELIVERY-2 amount — the
32
+ * discounted repeat that lands on the date already stated above — and the
33
+ * steady pair describes what delivery 3 onwards looks like. The whole block is
34
+ * dropped when any of it is unknown; a half-stated plan is worse than none.
35
+ */
36
+ starterAmountLabel?: string | null;
37
+ starterSteadyUnitCount?: number | null;
38
+ starterSteadyCadenceDays?: number | null;
39
+ /** Adopter-formatted steady package, already localized; the steady line's third argument. */
40
+ starterSteadyDetail?: string | null;
41
+ }
42
+
43
+ export interface SubscriptionWelcomeEmailContent {
44
+ subject: string;
45
+ preheader: string;
46
+ blocks: EmailBlock[];
47
+ }
48
+
49
+ /** Bind host-selected copy and pure helpers without provider or environment access. */
50
+ export function createSubscriptionWelcomeContentFactory(input: {
51
+ subscriptionEmailContent: Pick<SubscriptionEmailContent, "welcome">;
52
+ }) {
53
+ const { subscriptionEmailContent } = input;
54
+
55
+ function subscriptionWelcomeEmailContent(
56
+ locale: Locale,
57
+ vars: SubscriptionWelcomeEmailVars,
58
+ signoff: string,
59
+ ): SubscriptionWelcomeEmailContent {
60
+ const copy: SubscriptionWelcomeCopy = subscriptionEmailContent.welcome[locale];
61
+ const details: string[] = [];
62
+ if (vars.cadenceDays && vars.cadenceDays > 0) details.push(copy.cadenceLine(vars.cadenceDays));
63
+ // Both labels are derived from the same `next_cycle_at`, so they are present or
64
+ // absent together; the fallback keeps the pre-existing "we'll confirm" promise.
65
+ details.push(
66
+ vars.chargeDateLabel && vars.deliveryWindowLabel
67
+ ? copy.deliveryLine(vars.deliveryWindowLabel, vars.chargeDateLabel)
68
+ : copy.fallbackLine,
69
+ );
70
+ if (vars.holidayNote) details.push(vars.holidayNote);
71
+ // Acquisition plan: the delivery-2 amount and the steady rhythm, stated once at
72
+ // the only moment the customer is actually reading about their plan.
73
+ if (vars.starterAmountLabel) details.push(copy.starterDelivery2Line(vars.starterAmountLabel));
74
+ if (vars.starterSteadyUnitCount && vars.starterSteadyCadenceDays) {
75
+ details.push(copy.starterSteadyLine(vars.starterSteadyUnitCount, vars.starterSteadyCadenceDays, vars.starterSteadyDetail));
76
+ }
77
+ if (vars.editCutoffLabel) details.push(copy.editCutoffLine(vars.editCutoffLabel));
78
+
79
+ const blocks: EmailBlock[] = [
80
+ heading(copy.heading),
81
+ paragraph(copy.greeting(vars.firstName)),
82
+ paragraph(copy.intro),
83
+ accentBox(details, { label: copy.detailsLabel }),
84
+ ];
85
+
86
+ blocks.push(paragraph(copy.manageLine));
87
+
88
+ if (vars.ctaUrl) {
89
+ blocks.push(button(copy.cta, vars.ctaUrl));
90
+ }
91
+
92
+ blocks.push(paragraph(copy.outro));
93
+ blocks.push(paragraph(signoff));
94
+
95
+ return {
96
+ subject: copy.subject,
97
+ preheader: copy.preheader,
98
+ blocks,
99
+ };
100
+ }
101
+ return { subscriptionWelcomeEmailContent };
102
+ }
@@ -0,0 +1,62 @@
1
+ import type { SubscriptionEmailContent } from "./subscriptionEmailContent.js";
2
+ import type { Locale } from "./email.js";
3
+ import type { SubscriptionWinbackCopy } from "./subscriptionEmailContent.js";
4
+ import {
5
+ accentBox,
6
+ button,
7
+ heading,
8
+ paragraph,
9
+ type EmailBlock,
10
+ } from "./blocks.js";
11
+
12
+ export interface SubscriptionWinbackEmailVars {
13
+ firstName: string | null;
14
+ /** Consumer-facing brand label injected by the app/composition root. */
15
+ brandName: string;
16
+ /** Absolute CTA URL (the customer account / "Wznów" button); null/absent → no button. */
17
+ ctaUrl?: string | null;
18
+ }
19
+
20
+ export interface SubscriptionWinbackEmailContent {
21
+ subject: string;
22
+ preheader: string;
23
+ blocks: EmailBlock[];
24
+ }
25
+
26
+ /** Bind host-selected copy and pure helpers without provider or environment access. */
27
+ export function createSubscriptionWinbackContentFactory(input: {
28
+ subscriptionEmailContent: Pick<SubscriptionEmailContent, "winback">;
29
+ }) {
30
+ const { subscriptionEmailContent } = input;
31
+
32
+ function subscriptionWinbackEmailContent(
33
+ locale: Locale,
34
+ vars: SubscriptionWinbackEmailVars,
35
+ signoff: string,
36
+ ): SubscriptionWinbackEmailContent {
37
+ const copy: SubscriptionWinbackCopy = subscriptionEmailContent.winback[locale];
38
+ const blocks: EmailBlock[] = [
39
+ heading(copy.heading),
40
+ paragraph(copy.greeting(vars.firstName)),
41
+ paragraph(copy.intro),
42
+ ];
43
+ if (copy.reasonsLabel) {
44
+ blocks.push(paragraph(copy.reasonsLabel(vars.brandName)));
45
+ }
46
+ blocks.push(accentBox(copy.reasons));
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,
57
+ preheader: copy.preheader,
58
+ blocks,
59
+ };
60
+ }
61
+ return { subscriptionWinbackEmailContent };
62
+ }
@@ -0,0 +1,43 @@
1
+ export interface TransactionalDeliveryCommand {
2
+ readonly idempotencyKey: string;
3
+ /** Opaque recipient reference; never persisted outside the command fingerprint. */
4
+ readonly recipientReference: string;
5
+ /** Opaque template reference; never persisted outside the command fingerprint. */
6
+ readonly templateReference: string;
7
+ /** Optional bounded reference to an expiring/revocable access grant. */
8
+ readonly accessGrantReference?: string;
9
+ }
10
+
11
+ export type TransactionalDeliveryReceipt = {
12
+ readonly idempotencyKey: string;
13
+ readonly commandFingerprint: string;
14
+ readonly state: "accepted";
15
+ readonly deliveryReference: string;
16
+ readonly errorCode: null;
17
+ readonly attemptCount: number;
18
+ } | {
19
+ readonly idempotencyKey: string;
20
+ readonly commandFingerprint: string;
21
+ readonly state: "failed";
22
+ readonly deliveryReference: null;
23
+ readonly errorCode: string;
24
+ readonly attemptCount: number;
25
+ };
26
+
27
+ export interface TransactionalDeliveryReceiptStore {
28
+ readReceipt(idempotencyKey: string): Promise<TransactionalDeliveryReceipt | null>;
29
+ recordAccepted(input: {
30
+ idempotencyKey: string;
31
+ commandFingerprint: string;
32
+ deliveryReference: string;
33
+ }): Promise<TransactionalDeliveryReceipt>;
34
+ recordFailed(input: {
35
+ idempotencyKey: string;
36
+ commandFingerprint: string;
37
+ errorCode: string;
38
+ }): Promise<TransactionalDeliveryReceipt>;
39
+ }
40
+
41
+ export interface CapturedTransactionalDeliveryPort {
42
+ deliver(command: TransactionalDeliveryCommand): Promise<{ deliveryReference: string }>;
43
+ }
@@ -0,0 +1,58 @@
1
+ type COMMUNICATION_CHANNEL = "email";
2
+
3
+ type EMAIL_SEND_STATUSES = "queued" | "sent" | "delivered" | "bounced" | "complained" | "failed" | "skipped";
4
+
5
+ type EMAIL_SEND_SKIP_REASONS = "sequence_paused" | "already_sent" | "template_unavailable" | "race_lost" | "policy_blocked" | "admin_disabled";
6
+
7
+
8
+ export type CommunicationChannel = COMMUNICATION_CHANNEL;
9
+ /** The host supplies its persisted provider vocabulary. */
10
+ export type CommunicationProvider<Provider extends string = string> = Provider;
11
+ export type EmailSendStatus = EMAIL_SEND_STATUSES;
12
+ export type EmailSendSkipReason = EMAIL_SEND_SKIP_REASONS;
13
+
14
+ type COMMUNICATION_PURPOSES = "transactional" | "tester_program" | "marketing_launch_offer" | "marketing_newsletter" | "subscription_dunning" | "admin_notification";
15
+
16
+ type COMMUNICATION_PERMISSION_STATES = "unknown" | "granted" | "denied" | "suppressed";
17
+
18
+ type COMMUNICATION_POLICY_DECISIONS = "allowed" | "blocked";
19
+
20
+ export type CommunicationPurpose = COMMUNICATION_PURPOSES;
21
+ export type CommunicationPermissionState = COMMUNICATION_PERMISSION_STATES;
22
+ export type CommunicationPolicyDecision = COMMUNICATION_POLICY_DECISIONS;
23
+
24
+ export interface CommunicationRecipientRef {
25
+ system: "supabase";
26
+ table: "testers";
27
+ id: string;
28
+ email: string | null;
29
+ }
30
+
31
+ export interface EmailTemplateRef {
32
+ slug: string;
33
+ locale: string | null;
34
+ }
35
+
36
+ export interface EmailSendDedupeKeyInput {
37
+ recipientId: string;
38
+ templateSlug: string;
39
+ }
40
+
41
+ export type EmailSendDecision =
42
+ | { outcome: "send" }
43
+ | {
44
+ outcome: "skip";
45
+ reason: EmailSendSkipReason;
46
+ existingMessageId: string | null;
47
+ };
48
+
49
+ export interface EmailMessageReadModel<Provider extends string = string> {
50
+ id: string;
51
+ channel: CommunicationChannel;
52
+ recipientId: string;
53
+ templateSlug: string;
54
+ status: EmailSendStatus;
55
+ provider: CommunicationProvider<Provider> | null;
56
+ providerMessageId: string | null;
57
+ skippedReason: EmailSendSkipReason | null;
58
+ }