@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
package/README.md CHANGED
@@ -4,13 +4,20 @@ Development preview. This package joins core and outbox in the publishable set f
4
4
 
5
5
  It holds the runnable server substrate an OpenLup application composes: the Node HTTP runtime, BFF dispatch, scheduling and job leases, blob storage, data gateways, the node-postgres migration runner and bundle composition. Ports and their contracts stay in `@openlup/core/platform-runtime`.
6
6
 
7
+ For the prepared `0.18.0` set, read the [adjacent-release migration and known
8
+ limitations](CHANGELOG.md#0180) before selecting M05 catalog/pricing/promotions
9
+ or A1 communications adapters. M06 in progress: inventory and shipping entries are early surfaces; module not complete.
10
+ The size gate compares this candidate with the published `0.17.0` tarball;
11
+ preparation, offline adapter evidence and a passing size cap grant no publication
12
+ or provider-account certification.
13
+
7
14
  ## Package surface
8
15
 
9
- `release-gates.json` declares kind `rail`: this foundation provides runtime infrastructure over core ports, matching the architecture's rail responsibility. Its eleven experimental entries each bind a declaration snapshot and package-owned smoke tests. The API checker reads this same inventory.
16
+ `release-gates.json` declares kind `rail`: this foundation provides runtime infrastructure over core ports, matching the architecture's rail responsibility. Its twenty-five experimental entries each bind a declaration snapshot and package-owned smoke tests. The API checker reads this same inventory.
10
17
 
11
18
  | Export | Contents |
12
19
  | --- | --- |
13
- | `./http` | Node request adaptation, deadlines, security headers and static documents, and `createNodeHttpRuntime` with its fixed request order |
20
+ | `./http` | Generic capped raw-body reader, hex HMAC and constant-time token comparison; Node request adaptation, deadlines, security headers and static documents, and `createNodeHttpRuntime` with its fixed request order |
14
21
  | `./bff` | `createBffDispatcher`, `lazyBffRoute`, the hosted router URL rewrite, the response envelope (`createBffResponder`), the observed request context and the health route |
15
22
  | `./scheduler` | Transport-neutral scheduled jobs (`ScheduledJob`, the job registry, the lease-aware runner and the authenticated HTTP cron entry), path-declared jobs from configuration, the node-cron scheduler with per-job advisory locks, hosted cron verification, the cron entrypoint guard (it compares the presented bearer token with `CRON_SECRET` in constant time) and direct job bindings |
16
23
  | `./blob` | Filesystem, S3-compatible, Supabase Storage and Vercel Blob adapters, and `bindBlobPort` |
@@ -21,6 +28,272 @@ It holds the runnable server substrate an OpenLup application composes: the Node
21
28
  | `./composition` | `createBundleComposer`, the Node HTTP binding helpers and `createNodeHost` |
22
29
  | `./identity` | Experimental capability: identity engine, authorization, profile readers, session adapters and BFF factories |
23
30
  | `./identity/contracts` | Experimental capability: browser-safe customer auth port, value types and provider parser |
31
+ | `./communications` | Experimental existing public consent/status, newsletter sync, Auth email hook, transport contracts/capture, observation/polling orchestration, standard webhook verification and delivery receipts; host-selected rendering, egress, protocol mapping and control policy |
32
+ | `./communications/contracts` | Pure renderer, block builders, copy-injected commerce/subscription factories and email/newsletter/Auth/intake/receipt types; no Zod, Node or provider runtime imports |
33
+ | `./inventory` | Experimental schemas/ports, handlers, native stores, projection, injected forecast and SQL descriptor; `./inventory/contracts` DTOs. |
34
+ | `./catalog` | Experimental neutral catalog schemas, drafts, reads, media source packs and publication ports |
35
+ | `./catalog/contracts` | Dependency-free catalog DTOs, media resolver, authority and canonicalization helpers |
36
+ | `./pricing` | Experimental price authority, quote computation/handlers, offer projection/cache, readiness and policy tokens |
37
+ | `./pricing/contracts` | Dependency-free authority, money, quote and offer DTOs and version constants |
38
+ | `./promotions` | Experimental promotion application, admin handlers, native read/sweep, SQL projections and acceptance |
39
+ | `./promotions/contracts` | Dependency-free preview and admin DTOs |
40
+ | `./shipping` | Experimental delivery ports, injected-schema handlers, summary and evidence |
41
+ | `./shipping/contracts` | Type-only delivery, pickup-point, summary and evidence DTOs |
42
+
43
+ ## Shipping
44
+
45
+ Shipping handlers require injected host schemas; contracts are type-only with opaque provider/carrier strings.
46
+ No vendor code, inventory import, activation or parity claim.
47
+
48
+ ## Inventory
49
+
50
+ `INVENTORY_MIGRATIONS` projects canonical units 27/33 byte-for-byte; install the full catalogue. Store support and pending proof: [M06 parity](../../docs/platform/plans/oss-m06-stock-reservations-delivery.md#parity-pending-rows).
51
+
52
+ ## Promotions
53
+
54
+ `./promotions` owns the existing automatic/legacy and code quote application,
55
+ benefit interpretation, advisory read ports, preview proofs, public-money binding,
56
+ acceptance tokens and passive telemetry. It calls `@openlup/core/promo`; it does
57
+ not contain another evaluator. Each factory receives the host facts it needs:
58
+ `createQuotePromoDiscounts` takes a customer classifier;
59
+ `createQuotePromotionV2` also takes the product floor and bound legacy application;
60
+ `createQuoteAutomaticPromotions` takes an email eligibility resolver and the bound
61
+ applications. `createQuotePromotionCodeAdjustments` and `createPromotionCodePreview`
62
+ require the floor. No factory supplies a default financial policy.
63
+
64
+ `createPromotionQuoteAcceptance<Request>` requires `projectRequest`, which returns
65
+ the host's exact request-binding projection; `promoCodes` also binds separately.
66
+ Its four issue/verify functions retain public-money projection, section diagnostics,
67
+ TTL and rotation. Explicit `acquisitionTerms` binds the full server-selected promise.
68
+ The pricing quote handler passes its resolved terms as the last argument to both
69
+ acceptance callbacks. A host must forward them to the acceptance helper. With no
70
+ acquisition configuration, terms are absent and historical token bytes stay equal.
71
+ This opt-in signature addition does not activate acquisition-only mounted issuance.
72
+
73
+ `recordPromotionAcceptanceOutcome` requires a recorder and swallows recorder
74
+ failure. The reference wrapper retains its existing sanitized operational recorder.
75
+ Reference wrappers also retain startup floor resolution, customer classification,
76
+ email/contact precedence and the rich request projection. Quote reads never reserve
77
+ capacity. Pricing receives application callbacks and has no import back to promotions.
78
+
79
+ `createAdminPromotionsHandlers` and `createAdminPromotionCodesHandlers` receive
80
+ the relevant members of `PromotionAdminBindings`: existing host admin-kit factories, authorization
81
+ resolver, response writers, exact RPC-error constructor/mapper and bound preview
82
+ helpers. The package does not copy or relocate that kit. The reference wrappers
83
+ bind these same objects, preserving human-only writes, required audit, signed
84
+ activation previews, validity-window checks and revision-aware replay delegation.
85
+ `createAdminPromotionSchemas` also requires the host currency schema. Its list
86
+ DTOs preserve system-managed read-only rows and valid status-only mirror handles;
87
+ the managed adapter retains the underlying write fences. Adjacent shipping,
88
+ catalog-price and subscription-band schemas and managed adapters remain reference-owned.
89
+
90
+ `createPostgresCommercePromoDataPort` and `createPostgresPromotionClaimSweepPort`
91
+ use an injected `PgQueryExecutor` from `./data`. They retain four evaluator reads
92
+ and bounded stale-claim sweep; they add no claim writer or reservation path.
93
+ `PROMOTIONS_MIGRATIONS` identifies the byte-identical projections of canonical
94
+ units 47/48 with paths, positions and hashes. These sparse units are not an
95
+ installation chain: use the complete canonical catalogue. No migration or
96
+ manifest identity changes in this move.
97
+
98
+ The server entry is classified as an adapter because its executor declaration
99
+ reaches the data entry and optional pg types. It imports at runtime without pg
100
+ and works with an injected executor; selecting the data gateway retains its
101
+ named missing-pg refusal. Its declarations compile after peer selection. The
102
+ contracts entry remains a non-adapter, imports no other module and compiles
103
+ without optional peers in NodeNext and Bundler modes.
104
+
105
+ The [promotion suites](test/promotions/) retain existing assertions. The
106
+ [real PostgreSQL witness](../../tests/postgres/promotionsNative.test.ts) installs
107
+ the full canonical chain, checks projection hashes and validated constraints,
108
+ and proves reads without durable writes, paid/released lifecycle, bounded
109
+ sweep, receipt/outbox fences, replay, lock/settlement skips and explicit invoker
110
+ grants. This is existing native lifecycle/read evidence only. Native code
111
+ candidates, mounted issue/honor, acquisition-only mounted acceptance and the
112
+ full native/managed eligibility matrix are accepted native-backend capability
113
+ gaps, without a parity claim, in the
114
+ [module ledger](../../docs/platform/plans/oss-m05-catalog-offers-pricing.md#d8-pending-outcome-ledger).
115
+
116
+ ## Pricing
117
+
118
+ `./pricing` provides the existing OpenLup strict commerce price authority,
119
+ subscription-price-policy schemas, canonical digest and integer math, signed
120
+ pricing-policy assignment tokens and safe refusal mapping. Hosts inject exact
121
+ price-list, base-entry, legacy-entry and policy-history reads. The authority
122
+ validates the base before reading history and uses the observed base's
123
+ `priceListId` for that lookup. History excludes legacy fallback even when no
124
+ revision is currently effective. Digest, interval, ambiguity and amount-kind
125
+ refusals retain their existing identities and precedence.
126
+
127
+ `./pricing/contracts` contains dependency-free authority observations, policy
128
+ DTOs and version constants; its only external type comes from the exact
129
+ `@openlup/core/pricing` entry. Zod schemas, Web Crypto hashing and Node HMAC token
130
+ operations stay in the server entry. Tokens retain assignment binding, the
131
+ 72-hour default compatibility window and rollback behavior. Secret selection,
132
+ feature flags and readiness remain reference composition responsibilities.
133
+ Reference paths use named exports of the same functions and error classes;
134
+ the browser keeps its existing policy schema binding locally.
135
+
136
+ The quote foundation also owns neutral money/tax/quote DTOs, promotion evidence
137
+ and rejection details, bounded catalog facts, provenance creation/public stripping
138
+ and the supported-tax-profile guard. `createCommerceQuoteSchemas` requires the
139
+ host's currency, product-slug and context schemas; `createCommerceQuotePrimitives`
140
+ requires currency validation. No settlement default or catalog policy is installed.
141
+ The original line, currency, VAT, discount and shipping equations and v1/v2
142
+ provenance refusals are preserved. Quote ports accept host request/response types.
143
+ The reference keeps its rich browser request/context validation and catalog bridge;
144
+ server compatibility paths export the same error classes and provenance/tax functions.
145
+ The portable schema counterparts stay server-side; binding tests compare their
146
+ results and diagnostics with browser validation.
147
+
148
+ `createDbBackedCommerceQuotePort` owns the existing quote computation and price,
149
+ tax and component helpers. Hosts supply bounded catalog/price reads, settlement
150
+ values, a flat shipping read, promotion application and context callbacks. The
151
+ reference binds `getShippingFlatMinor`, industry context and existing promotion
152
+ implementation. Shipping is read before promotion application; the original VAT
153
+ helper and both discount lanes are preserved. Snapshot comparison accepts injected
154
+ response validation and request reconstruction, so rich context stays local.
155
+
156
+ Quote, ordered batch and offer handlers take the host's schemas and BFF responder;
157
+ the reference binds its observed request context. Their error identities, refusal
158
+ mapping, promotion acceptance/fallback and public evidence refusal are unchanged.
159
+ Offer projection requires roster, representative-request, unit-count, floor and
160
+ wire-scope policy. It retains v1/v2 responses, partial degradation only for a
161
+ missing configured price, and the first successfully priced representative.
162
+ The offer cache bounds success freshness from load start and retains its separate
163
+ failure TTL; readiness keeps its 60-second positive and 5-second negative caps.
164
+ The additive experimental acquisition API is off by default. `selectAcquisitionTerms`
165
+ and `filterAcquisitionPromotions` require an `AcquisitionFinancialPolicy<Row>`:
166
+ row facts, classification, metadata validation, pair matching, initial rate and
167
+ unconfigured terms all come from the host. Omission refuses with
168
+ `acquisition_terms_policy_unconfigured`, even with no rows; no financial policy
169
+ or schedule is bundled. Selection preserves row identity, validates the whole
170
+ tagged schedule and uses half-open windows with the next future boundary.
171
+
172
+ `createAcquisitionQuoteSchemas` composes separate capability/context/resolved-terms
173
+ schemas with the host's validators. `projectAcquisitionOfferPricing` pins the
174
+ observation time and capability for every representative request; its v3 output
175
+ contains public terms and expires by the next boundary or 60 seconds.
176
+ `createAcquisitionOfferPricingSchema` retains the injected v2 settlement and scope
177
+ rules. The opt-in handler delegates absent acquisition headers to an incumbent
178
+ handler; negotiated responses require v3, paired v2 policy and private no-store
179
+ headers. The incumbent handler continues ignoring acquisition headers.
180
+ `createAcquisitionReadinessCache` requires an explicit policy configuration,
181
+ validates acquisition evidence, clamps positive cache expiry and rereads once
182
+ after crossing a boundary. The existing shared readiness cache remains unchanged.
183
+
184
+ Promise comparison is independent of money. Explicit server-selected resolved
185
+ terms can join the existing acceptance money projection and totals section;
186
+ absence contributes no property. Quote/batch refusal mapping and unsigned-terms
187
+ fallback checks require explicit acquisition configuration. Reference composition
188
+ supplies none: existing schemas, headers, reads, error details and token bytes
189
+ are preserved. Checkout admission, claims, finalization, threshold shipping,
190
+ promotion implementation, stores, SQL, routes and activation remain outside
191
+ this API.
192
+
193
+ The package witnesses in `test/pricing/` move the incumbent authority, policy,
194
+ token, quote, snapshot, handler, offer, cache and readiness assertions. Currency
195
+ fixtures use synthetic identifiers while preserving the same arithmetic and
196
+ refusals. Reference schemas, rich catalog/context policy and composition remain
197
+ in the application. The existing cold consumer exercises both entries and
198
+ compiles installed declarations without optional provider peers.
199
+
200
+ ## Catalog
201
+ The native envelope and dark draft adapters now live in this entry as
202
+ `createPostgresCatalogSkuEnvelopeReadPort` and `createPostgresCatalogDraftStore`.
203
+ They accept an injected executor and retain the existing mapping, errors and SQL
204
+ semantics. The mapper remains internal to the package. `CATALOG_MIGRATIONS`
205
+ projects canonical positions 1, 8, 58, 59 and 61 byte for byte; these assets are
206
+ sparse references, never a standalone install chain. No canonical migration or
207
+ manifest entry changes.
208
+
209
+ The composition entry adds `createCatalogContribution` and its structural input
210
+ interface. It describes actual catalog, pricing and promotions callables under
211
+ those existing module identities, with no environment discovery, client creation
212
+ or registration. It imports only readiness types: composition gains no catalog
213
+ edge, and catalog retains its existing type-only data edge. Package boundary
214
+ checks pin those imports and peer-free composition declarations. The packed
215
+ consumer exercises both new stores and the descriptor without optional peers;
216
+ its synthetic executor proves named refusal, not durable storage behavior.
217
+
218
+
219
+ `./catalog` is an experimental capability for the existing neutral catalog
220
+ foundation, installed product types, draft validation/use cases, active SKU
221
+ selection, resolved SKU projection and sellable reference reads. Hosts supply
222
+ the read/store ports, verified operator authorizer, product-type registry and
223
+ BFF responder. Draft commands retain the original canonical bytes, receipt-first
224
+ replay, actor binding and named refusals. Read projections carry opaque
225
+ product-scoped document references; they do not interpret document payloads.
226
+
227
+ Fixed-bundle application/admin now uses this same server entry: rules, read/write
228
+ ports, batched stock derivation, nine mutations, four reads/price preview and the
229
+ public sellable-feed factory. Named reference wrappers inject lifecycle and stock
230
+ helpers, existing admin kit/spec/flags, validators, responder, wire versions and
231
+ the reference-owned RPC error constructor. The read error has one package identity.
232
+ `createPostgresBundleCatalogStore` now accepts the data entry's injected
233
+ `PgQueryExecutor`; it renders the incumbent list/detail/feed/history SELECTs
234
+ without constructing a pool or switching roles. The writer, pooled transaction
235
+ binding and transport adapters remain reference-owned. `BUNDLE_MIGRATIONS`
236
+ projects canonical units 16 and 19 with their original paths, positions, hashes
237
+ and byte-identical SQL. These sparse projections are not an installation chain:
238
+ apply the complete canonical manifest. No new migration or activation is added.
239
+ Preview target selection remains the existing first active matching-mode row.
240
+
241
+ `./catalog/contracts` carries dependency-free DTOs, the shared authority error,
242
+ GTIN/authority helpers, quantity/option helpers and the existing draft JSON
243
+ canonicalizer. It imports no Zod, Node runtime or server barrel. Runtime schemas
244
+ use the server entry with jitless Zod; the reference browser keeps its sellable
245
+ schemas locally. Media manifest validation and `resolveProductMedia` are also
246
+ browser exports: declared product/variant/locale associations resolve to supplied
247
+ URLs with deterministic ordering and neutral fallback, without filename inference.
248
+ The server entry adds bounded source-pack export/validation/restore/import;
249
+ `BlobStoragePort` comes from the existing `@openlup/core/platform-runtime` entry.
250
+ Import validates every resource before uploading immutable digest keys, deduplicates
251
+ shared keys and never activates associations. No upload route is mounted.
252
+
253
+ Read and draft behavior is supplied by the existing use cases and host ports.
254
+ `publicationRead`, `publish` and `lifecycleWrite` remain explicitly unsupported
255
+ in the neutral reference binding. Lifecycle DTOs and server validation/publication
256
+ ports are types only, with an opaque publisher brand and no constructor or default
257
+ binding. A missing authority is `unsupported`; an unavailable configured authority
258
+ is `dependency_unavailable`, never an absent receipt. Successful readback requires
259
+ real publication lineage; existing active rows cannot invent a head. History pages
260
+ are bounded to 100 receipts with stable revision ordering and opaque cursors.
261
+ Existing SKU `draft`/`active`/`archived` and draft receipt `open`/`abandoned` wire
262
+ statuses remain unchanged. `withdrawn` may map from `archived` only where an
263
+ authority establishes withdrawal; abandoning a draft does not withdraw a variant.
264
+ Neither entry installs SQL. Rich application catalog interpretation remains
265
+ reference-owned. The [M05 plan](../../docs/platform/plans/oss-m05-catalog-offers-pricing.md)
266
+ records the cut, its exclusions and the witness ledger.
267
+ The moved characterization suites are under `test/catalog/`; the required cold
268
+ consumer imports both entries without optional peers and checks installed
269
+ canonicalization, authority identity, selection and unauthorized draft refusal.
270
+ Three synthetic media conformance cases and one lifecycle type case complement
271
+ those moved suites; the existing package boundary tests cover browser closure.
272
+ Bundle browser schemas remain locally defined by the reference, preserving
273
+ parse/default/strictness behavior; the package contracts add plain DTO types only.
274
+ Installed callers inject validators into server factories. Five package suites
275
+ retain 44 bundle cases; two root binding suites retain 18. Four neutral W4 cases
276
+ and one binding/browser-closure case add five required cases. The cold consumer
277
+ also checks bundle composition refusal, unknown stock and exact allocation;
278
+ catalog server is deliberately classified as an adapter because its declarations
279
+ reach optional pg types through the executor. Its runtime still imports and reads
280
+ through an injected executor with optional peers absent. Catalog contracts remains
281
+ a non-adapter and compiles without peers. Server declarations compile after peer
282
+ selection. Five real-PostgreSQL cases characterize full-chain replay, complete
283
+ ordered reads with unchanged data, whole-set rollback/refusals/dry runs, price
284
+ history, sequential key recognition and explicit invoker grants. Native routines
285
+ have no independent human-only actor-kind gate; the handler supplies that gate.
286
+ This does not close the bundle parity ledger.
287
+ The complete contracts entry measures 3,281 B minified+gzip against its 4,096 B
288
+ budget; other entry and aggregate caps are unchanged.
289
+
290
+ Moved catalog, pricing and promotion fixtures use synthetic identities, regions,
291
+ currencies and host-defined context fields. Their assertions retain the original
292
+ operators and case counts. Reference classifiers receive the legacy threshold
293
+ from their host composition; only the immutable managed baseline predicates
294
+ await an owner decision. Pricing VAT calculation retains
295
+ both exported helpers and their signatures: `calculateIncludedVat` delegates to
296
+ `splitIncludedVat` through a distinct named wrapper using the same arithmetic.
24
297
 
25
298
  ## Scheduled jobs
26
299
 
@@ -83,7 +356,7 @@ failed HEAD; use an upload or list operation to observe an S3 loading refusal.
83
356
 
84
357
  ## Verification
85
358
 
86
- This package's tests are part of the repository's required test selection; from this directory, `npm test` runs them alone. The tests rewrite the originating application's characterization with neutral names and synthetic data, and a boundary test refuses any environment read or provider import in the package source.
359
+ This package's tests are part of the repository's required test selection; from this directory, `npm test` runs them alone. The tests rewrite the originating application's characterization with neutral names and synthetic data, and a boundary test refuses environment reads and provider imports outside its explicit `pg` adapter and `@aws-sdk/client-s3` blob-client allowlist. Follow [repository testing](../../CONTRIBUTING.md#test-scope-and-diagnostics) for placement, setup and speed rules.
87
360
 
88
361
  The module-boundary proof permits one optional `./<module>/contracts` export
89
362
  only when that module declares `contracts: true` in `PLATFORM_MODULE_GRAPH` in
@@ -110,7 +383,7 @@ The job-run ledger SQL asset test verifies a readable, nonempty file within the
110
383
  package SQL directory. Its SQL parity tests bind the actual adapter calls to the
111
384
  shipped routine signatures; the asset's explanatory header may be edited freely.
112
385
 
113
- `npm run api:check` compares each of the eleven declaration entry graphs with the
386
+ `npm run api:check` compares every declared entry graph with the
114
387
  committed `api/*.api.md` reports. After building, deliberately regenerate them
115
388
  with `node --experimental-strip-types ./scripts/api-contract.ts --update` from
116
389
  this package, and review the declaration changes.
@@ -147,7 +420,7 @@ phase redirects npm to an empty temporary cache.
147
420
 
148
421
  The composition declarations describe the injected Supabase factory structurally;
149
422
  they do not import the data entry or its PostgreSQL types. The cold proof still
150
- requires all six nonadapter entries (including `./identity/contracts`) to import in fresh processes and compile
423
+ requires all declared non-adapter entries (including `./identity/contracts`) to import in fresh processes and compile
151
424
  in both resolution modes with all three optional peers absent.
152
425
 
153
426
  <!-- openlup-doc-impact {"unit":"platform-substrate","digest":"sha256-00994d288cfec0c8dc0ae9aeae2ff542e2e9af2fedcb4dd2dfeb6c99523be92d","reason":"The manifest moves to the 0.15.0 set version with the exact @openlup/core 0.15.0 peer pin. The package surface, settings and verification described here are unchanged by this preparation delta."} -->
@@ -425,7 +698,8 @@ operator/customer batches. See [identity privacy](../../docs/platform/IDENTITY.m
425
698
  for refusals, token limits and retained obligations.
426
699
 
427
700
  The complete direct conformance is included in
428
- `ai-resource-gate run --wait openlup:coverage -- npx vitest run tests/postgres/operatorIdentityUpgrade.test.ts`.
701
+ `npm test -- tests/postgres/operatorIdentityUpgrade.test.ts` from the repository
702
+ root after normal setup. A maintainer host resource broker is optional.
429
703
  For managed conformance, supply the same three `OPENLUP_MANAGED_CONFORMANCE_*`
430
704
  local disposable-stack settings described for operator invitations, with
431
705
  `OPENLUP_MANAGED_CONFORMANCE_DATABASE_URL` set to the database owner
@@ -471,3 +745,287 @@ panel. Its explicit runtime must supply actual routes and readiness admission;
471
745
  the shell refuses a missing composition. See the
472
746
  [identity reference guide](../../docs/platform/IDENTITY.md#disposable-identity-reference)
473
747
  for both-bundle commands, the committed managed grants and installation limits.
748
+
749
+ ## Communications import
750
+
751
+ For adoption from `0.16.0`, follow the [0.17.0 Migration guidance](CHANGELOG.md#0170)
752
+ for the complete package set, canonical SQL installation and host-owned bindings.
753
+
754
+ M04 P1 relocates the existing public implementation without changing its reference
755
+ outputs. The reference shims bind the existing renderer, egress resolver, origin
756
+ defaults, delivery-shaping policy and receipt transaction lane. The package does
757
+ not select a deployment, mount a route or schedule another executor.
758
+ `createCommunicationsContribution` requires the host's version and schema
759
+ inventory; supplied handlers, schedules, routes and ports describe only that
760
+ host's selection.
761
+
762
+ `COMMUNICATIONS_MIGRATIONS` projects three existing canonical units byte for byte:
763
+ comms outbox (position 2), transactional receipts (9) and communications control
764
+ plane (20). This sparse list is not a standalone migration chain. Apply the full
765
+ selected canonical prefix through its existing runner; importing the module does
766
+ not apply SQL or advertise missing managed/direct capabilities.
767
+
768
+ Browser previews retain their reference renderer, content defaults and template
769
+ policy. The Auth hook receives that same renderer through its reference shim.
770
+ The standard Auth webhook and the maintained HTTP mail provider verifiers keep their separate signature
771
+ formats and clocks; the generic helper added to `./http` replaces neither.
772
+ E2 is applied: the payment webhook module delegates these five generic helpers.
773
+ `readRawBody` is the same package function object with its original declared
774
+ `(req: VercelRequest) => Promise<string>` signature; the other four exports are
775
+ plain re-exports. The payment provider verification and its replay tolerance stay local.
776
+ The maintained mail transport, credentials, callback verification/mapping,
777
+ poll read/mapping, timeline and send-ledger adapters remain in reference source.
778
+ B1 changes only the four raw-injection guard sites in the reference delivery
779
+ adapters and the approved invoice test fixture; the concrete client and all
780
+ other vendor-directory files retain the comparison-base bytes. The neutral
781
+ `./communications` entry exposes transport/result contracts and capture without
782
+ concrete mail wiring. The platform ships opt-in vendor adapter subpaths;
783
+ default wiring includes none, and adopters choose or replace them.
784
+ The type-only `CommunicationProvider<Provider>` and `EmailMessageReadModel<Provider>`
785
+ accept host vocabulary; reference types retain their original literal.
786
+
787
+ `createGuardedEmailTransport({ providerKind, policy, send })` is the network
788
+ adapter constructor. At each send it awaits a fresh host policy, validates the
789
+ whole decision and enters the sender only for a coherent `production`,
790
+ `sandbox_direct` or `sandbox_sink` decision. The sender receives the effective
791
+ recipient and a frozen context with intended recipient, host-selected credential,
792
+ mode, reason and environment tag. It must consume that context when selecting
793
+ credentials and emitting provider metadata. The neutral entry reads no environment
794
+ and contains no provider client. Opt-in adapters consume this same guard and
795
+ host-selected context. Missing/throwing policy, unknown modes, mismatched
796
+ recipients/tags, blank credentials or unsupported fields fail with status zero,
797
+ no identifier and bounded error codes. Reasons are lower-case token codes up to
798
+ 80 characters. One unadorned `local@domain.example` recipient mailbox is required;
799
+ whitespace, lists, display names and local-only domains are refused on this new
800
+ alternate-transport policy boundary.
801
+
802
+ `blocked` returns failure; explicit `drop` returns terminal suppression with no
803
+ send, no identifier and an ineligible sent timestamp. Arbitrary injected objects
804
+ are refused by `guardEmailTransport`; a provider name or copied capture shape
805
+ cannot establish admission. Package-created capture retains its ordered envelopes
806
+ and synthetic identifiers with no network effect. Capture acceptance remains
807
+ local acceptance, never evidence of external delivery.
808
+
809
+ `admitPolicyEnforcedEmailTransport` is the trusted host bridge for a transport
810
+ that already enforces egress internally, as the maintained reference client does.
811
+ The package registry owns its identity; this bridge performs no second routing
812
+ or credential decision. It is a composition trust boundary, not a sandbox for
813
+ host code: callers must not admit an unguarded network sender. New adapters should
814
+ use the validating constructor above. The reference default retains its original
815
+ sink/drop policy, key selection, optional payload fields, headers, signal and
816
+ result/error semantics. `createAuthEmailTransport` preserves the Auth envelope
817
+ mapping and admission; raw Auth closures are refused before their send method.
818
+ Admin/control and required-audit ordering stay at their existing callers.
819
+ No egress result authorizes a subscription-state or delivery-cycle mutation.
820
+
821
+ `processEmailObservation` accepts already authenticated, decoded and environment-admitted
822
+ input. It looks up a local send, constructs evidence only when found, applies one
823
+ observation and records best-effort telemetry. Lookup and apply failures propagate.
824
+ `runDeliveryReconciliation` polls candidates sequentially, rotates every non-404
825
+ read, and delegates consecutive failed-404 abandonment at threshold three to the
826
+ store. Rotation failure is counted without dropping delivery truth; apply failure
827
+ continues the batch. Candidate-query, read and not-found-store throws propagate.
828
+ The host classifies protocol snapshots after rotation and passes recipient/evidence
829
+ through unchanged. The existing reference domain entry points use both engines;
830
+ routes and schedules remain the same.
831
+
832
+ Neither engine writes suppression or subscription state. Both callback and poll
833
+ composition retain `communication_update_email_delivery_from_provider` as the
834
+ single durable convergence/suppression writer. These ports add no in-memory
835
+ replay authority, database store or second executor. Legacy transport identifier
836
+ fields remain compatibility residue; new ports use `messageId`.
837
+
838
+ `createCommunicationPurposeRegistry` composes immutable exact identifiers with a
839
+ mandatory `marketing` or `non-marketing` classification. Its built-ins cannot be
840
+ redeclared. Existing policy, token and newsletter schema calls keep their finite
841
+ defaults. Passing a registry to policy evaluation, token verification or
842
+ `createNewsletterIntegrationSchemas` recognizes its identifiers without granting
843
+ permission. Custom marketing purposes still require a grant and respect
844
+ suppression; built-in tester pause and permission rules stay in force.
845
+
846
+ `createRegisteredPublicPreferenceTokenPort` requires an explicit host persistence
847
+ function and passes the exact purpose and frozen classification to it. It creates
848
+ no sync event. Stock managed permission and newsletter-sync tables retain their
849
+ finite CHECKs; registering a purpose does not expand those stores. Additional
850
+ persistence and schema requirements belong to the adopter. No new purpose, table,
851
+ migration, preference UI, URL or default fan-out is installed.
852
+
853
+ `processNewsletterWebhookEvent` supplies the existing event → permission →
854
+ settlement sequence behind neutral ports. Reference HTTP admission and signature
855
+ mapping stay local. Explicit registered purposes survive permission writes;
856
+ purpose-less feedback still targets exactly the two existing marketing purposes.
857
+ Verified opt-in, suppression and replay rules are unchanged. Registered dispatch
858
+ checks the batch's purposes before provider effects and retains claim tokens,
859
+ echo and capability skips, retry behavior and counters. Sync-settled and accepted
860
+ receipts are distinct from delivered evidence. Existing job admission, binding,
861
+ leases, finish-run linkage and operator readback retain their host composition.
862
+ No shared sender pipeline is added: required audit and best-effort send paths
863
+ keep their distinct ordering and failure semantics.
864
+
865
+ `MarketingAutomationProviderPort` and `MarketingAutomationStorePort` describe
866
+ explicit scope, claim/generation fences, admission/deadlines, idempotency,
867
+ observations/history and ambiguity/backoff. The synthetic substitute-provider
868
+ conformance suite is an executable contract, not an installed worker or a remote
869
+ provider certification. Evidence carries opaque references; remote feedback does
870
+ not grant local consent. No trigger catalogue, schedule or provider activation
871
+ is supplied.
872
+
873
+ The required selection retains the moved-code witnesses and neutral package
874
+ characterization tests. The package W1 hook reader witnesses the Auth composition;
875
+ provider-specific reference test paths remain in the complete suite. The
876
+ [M04 ledger](../../docs/platform/plans/oss-m04-communications-triggers.md#verification-ledger)
877
+ records counted cases, separate boundary iterations and local timing provenance.
878
+ The clean-commit artifact gate enforces all merged caps, including the owner-read, measured limit on the complete contracts entry. Artifact admission still needs a
879
+ clean supervisor commit.
880
+ See the [M04 plan](../../docs/platform/plans/oss-m04-communications-triggers.md)
881
+ for scope, later waves and verification limits.
882
+
883
+ ## Package artifact limits
884
+
885
+ The monorepo's package artifact checker enforces this package's
886
+ `release-gates.json` caps and packed content allowlist. Only
887
+ `--release-set <version>` checks compressed growth against the last released
888
+ baseline, with explanations in the new set's changelog section and release body. Its browser-safe `./identity/contracts` export also has a minified+gzip cap. See the
889
+ [package artifact policy](https://github.com/openlup/openlup/blob/main/.github/VERSIONING_AND_EOL.md#package-artifact-limits)
890
+ for measured sizes, current caps, the S1 baseline refresh and refusal remedies.
891
+ Artifact checks require a clean package directory; `--manifest-only` supplies no
892
+ artifact evidence.
893
+
894
+ ### Pure email content and browser rendering
895
+
896
+ `./communications/contracts` now exports `renderEmail`, the nine existing block
897
+ constructors, `guideCardBlock` and per-template content factories.
898
+ Each `create*ContentFactory` binds host-selected copy plus only the pure helpers
899
+ it uses: order-reference formatting, payment-cause wording or marketing footer.
900
+ Localized review routes remain in the reference helper.
901
+ In P3 no copy pack, brand, locale choice, environment reader, provider client or
902
+ sending policy moved into this entry. B2 adds the explicit neutral defaults below. The existing email DTOs remain its canonical types.
903
+ Reference `petName` compatibility inputs are translated to neutral `contextName`
904
+ by their existing facades. Complete subjects, preheaders, ordered blocks and
905
+ HTML/text remain byte-identical, including omitted and explicit optional fields.
906
+
907
+ Browser previews continue through those facades to contracts values only. Auth
908
+ uses its existing server hook factory with the same host renderer injection;
909
+ its inactive public content binding still refuses with 503. Standard Auth,
910
+ mail callback, integration-event and generic HTTP verification remain separate
911
+ policies with their existing raw-byte and replay behavior. No crypto refactor,
912
+ new entry, dependency or graph edge is part of P3.
913
+
914
+ The contracts conformance test compiles the complete entry with no Node types
915
+ and checks its value inventory and import closure. The cold consumer repeats the
916
+ exact inventory and renders with fetch forbidden and optional peers absent,
917
+ retaining all other consumer checks. Browser size measures every runtime export
918
+ of the built entry through `browserEntryBytes`; it never measures a tree-shaken
919
+ consumer subset. See the M04 ledger for the measured size, owner-read cap and
920
+ working-tree versus signed-candidate evidence limits.
921
+
922
+ P3's complete built contracts entry measures **5,992 B minified+gzip**;
923
+ the owner-read cap is **11,776 B**, rounded to the nearest 512 B at about
924
+ twice that measurement. Only this browser limit changes. Existing pack classes,
925
+ other browser limits and clean-candidate artifact checks remain binding.
926
+
927
+
928
+ M04 B2 adds four default factories in this same pure contracts entry:
929
+ `createInvoiceDocumentContentFactory`, `createRoleNotificationContentFactory`,
930
+ `createInquiryContentFactory` and `createOptOutContentFactory`. Each accepts an
931
+ optional complete bilingual copy replacement; each content call takes an explicit
932
+ `pl`/`en` locale. Invoice takes resolved order/document references, kind and account
933
+ URL; role takes role, operator URL and optional pending expiry. Inquiry builds
934
+ receipt/notice blocks from caller details, signoff and URL without sending or
935
+ promising a response time. Opt-out returns display strings for seven outcomes;
936
+ it verifies no token and writes no consent. Hosts own brand, locale selection,
937
+ URLs, policy and delivery.
938
+
939
+ The reference invoice adapter defaults to its byte-identical Polish output; explicit
940
+ construction locale EN maps to `/account?sekcja=orders`, while the production
941
+ composition still omits locale. All existing role outputs remain identical.
942
+ The reference opt-out page now selects Polish/EN throughout, escapes display values,
943
+ and uses neutral selected-communications/service-message wording. Its methods,
944
+ verification, purpose allowlist, durable RPC, headers and statuses are unchanged.
945
+ Generic inquiry is only a pure binding; the existing private-label sender stays
946
+ unchanged. Invoice/role gain Polish canon previews; no sender/registry activation.
947
+ See the [complete B2 expectation ledger](../../docs/platform/plans/oss-m04-communications-triggers.md#b2-changed-expectations-and-preservation)
948
+ and [default conformance tests](test/communications/contentDefaults.test.ts).
949
+ The measured B2 contracts entry is 8,210 B minified+gzip under the unchanged
950
+ 11,776 B cap; this is a local built-entry measurement, not release admission.
951
+
952
+ ### Native communications operations (development preview)
953
+
954
+ The server entry `@openlup/platform/communications` additionally exports
955
+ `createPostgresDeliveryReconciliationPort`, `createPostgresCommunicationSyncStore`,
956
+ `createPostgresNotificationRecipientsPort` and `createPostgresConsentEvaluator`.
957
+ Install the complete canonical manifest through position 70 before selecting
958
+ these factories. `COMMUNICATIONS_MIGRATIONS` now projects positions 2, 9, 20 and
959
+ 70; it remains a sparse inventory, not an installer. Missing schema/configuration
960
+ is an error, never an empty queue or an allow decision.
961
+
962
+ Each factory owns a capability-local, role-free transaction lane and lazy `pg`
963
+ pool, with `close()` for host cleanup. Only a trusted host may hold these owner
964
+ credentials. Effective PUBLIC/browser table, column and inherited privileges
965
+ cause refusal; the CREATE-only forward intentionally changes no old ACL or role.
966
+ Do not expose a factory or its database lane to browser callers. The directory
967
+ requires a verified active human operator, live communications authorization and
968
+ absence of machine authority in the same transaction as each operation.
969
+
970
+ A host registers `evidence: "network_accepted"` only after actual network
971
+ acceptance, with a unique source key and binding. Capture is never registered as
972
+ a network target. Polls and admitted callbacks call the same `applyObservation`
973
+ writer; observation-key replay must preserve the immutable fact. Readback keeps
974
+ acceptance, observed state, attempt/404 counts and abandonment separate. Only
975
+ three consecutive 404s abandon a candidate; abandonment is not failed/delivered.
976
+ Bounce/complaint writes the authoritative fingerprint's suppression atomically.
977
+ No subscription or renewal state is changed.
978
+
979
+ For newsletter sync, inject `rail: db => createPostgresOutboxStore(db)` from
980
+ `@openlup/outbox/postgres` in host composition. `db` is the current transaction,
981
+ so claim commits before I/O and rail ack and sidecar settlement commit together.
982
+ `registerWork` creates one existing-outbox identity for a source and target
983
+ binding. Successive preferences for one contact/target share the rail aggregate,
984
+ so newer work cannot overtake older unprocessed work. Configure a distinct
985
+ binding per target/provider, and exclude
986
+ `nativeSyncEventType(binding)` from generic dispatch registries. Invoke only
987
+ `runCommunicationSyncDispatch` with an explicit neutral membership provider.
988
+ The sidecar cannot claim work and has no lease or drainer. A membership settlement
989
+ records sync progress, never email delivery; remote exactly-once effects are not
990
+ promised across a process crash. There is no automatic backfill or activation.
991
+
992
+ Native consent evaluates registered P4 policy against the authoritative native
993
+ permission and persists the decision before returning its id. Admin notices need
994
+ an active source-bound notification recipient. Optional `testerPaused` reads
995
+ host-owned authoritative pause state inside that transaction; omitted means no
996
+ pause policy. The capability explicitly declares `managedFrequencyCaps: false`,
997
+ `legacyContactTouching: false`, `sendTimeFence: false`: managed 16-hour / 2-day /
998
+ 4-week caps and legacy contact-touching are excluded. Evaluation does not fence a
999
+ later send against changed consent. Custom-purpose persistence remains host-owned.
1000
+
1001
+ The [callable reference binding](../../server/runtime/communications/communicationsLifecycleBinding.ts)
1002
+ selects only `PLATFORM_BUNDLE=node-postgres` with `DATABASE_URL`; it closes pools
1003
+ on success/failure and supplies no network/provider default. Existing managed
1004
+ HTTP cron/UI routes retain their existing composition. See the
1005
+ [B3 expectation inventory](../../docs/platform/plans/oss-m04-communications-triggers.md#b3-native-stores)
1006
+ and [real-PG witnesses](../../tests/postgres/communicationsNative.test.ts).
1007
+
1008
+ C-compose extends the native delivery store with binding-scoped `findByMessageId`
1009
+ and bounded `listEvidence({limit})` (1–100). Existing observation/replay and polling
1010
+ methods retain their behavior. `registerPreference` on the native sync store
1011
+ commits an authoritative denied/suppressed permission and default-purpose sync
1012
+ work together; tester permission adds no marketing work. The trusted
1013
+ `registerNativeSyncWorkInTransaction` helper contains the same registration SQL
1014
+ used by `registerWork`; standalone input validation still precedes database entry.
1015
+ This helper is a trusted host transaction seam: its caller-owned executor must
1016
+ already hold the lane's safe effective privileges; the function does not check
1017
+ them. Standard native sync factory transactions check
1018
+ `public.communication_native_sync_state`, `public.outbox_events` and
1019
+ `public.communication_recipient_consents`. The caller owns the transaction and
1020
+ must commit or roll back permission, sidecar and existing-rail effects atomically.
1021
+ Use a safely admitted lane; the helper grants no claim token or provider authority.
1022
+
1023
+ Reference composition remains outside the package: actual installed factories,
1024
+ Core readiness, explicit provider ports and host-supplied schedules. Native
1025
+ readback and signed-token bridges do not promise managed frequency caps, legacy
1026
+ tester-source parity, a send-time fence or a full native network sender. The
1027
+ opt-in browser profile adds no npm entry or UI package export.
1028
+
1029
+ Source contributors record notable changes in package changelog fragments;
1030
+ release preparation assembles the shipped CHANGELOG. Follow the
1031
+ [public contribution guide](https://github.com/openlup/openlup/blob/main/CONTRIBUTING.md#development-preview-checks).
@@ -0,0 +1,2 @@
1
+ /** Shares exact-code parsing with detail reads; omission alone keeps discovery broad. */
2
+ export declare function parseCatalogActiveSkuSelection(value: unknown): readonly string[] | undefined;
@@ -0,0 +1,20 @@
1
+ import { catalogSkuEnvelopeSelectorSchema } from "./foundationSchemas.js";
2
+ /** Shares exact-code parsing with detail reads; omission alone keeps discovery broad. */
3
+ export function parseCatalogActiveSkuSelection(value) {
4
+ if (value === undefined)
5
+ return undefined;
6
+ if (!Array.isArray(value) || value.length < 1 || value.length > 100) {
7
+ throw new RangeError("catalog_active_sku_selection_invalid");
8
+ }
9
+ const codes = [];
10
+ const seen = new Set();
11
+ for (const skuCode of value) {
12
+ const parsed = catalogSkuEnvelopeSelectorSchema.safeParse({ kind: "sku_code", skuCode });
13
+ if (!parsed.success || parsed.data.kind !== "sku_code" || seen.has(parsed.data.skuCode)) {
14
+ throw new RangeError("catalog_active_sku_selection_invalid");
15
+ }
16
+ codes.push(parsed.data.skuCode);
17
+ seen.add(parsed.data.skuCode);
18
+ }
19
+ return codes;
20
+ }