@openlup/platform 0.17.0 → 0.19.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 (525) hide show
  1. package/CHANGELOG.md +143 -0
  2. package/README.md +299 -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 +21 -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 +173 -0
  22. package/dist/catalog/bundleCatalogReadPort.js +36 -0
  23. package/dist/catalog/bundleCatalogStore.d.ts +5 -0
  24. package/dist/catalog/bundleCatalogStore.js +156 -0
  25. package/dist/catalog/bundlePriceSelection.d.ts +13 -0
  26. package/dist/catalog/bundlePriceSelection.js +26 -0
  27. package/dist/catalog/bundleRuleCodes.d.ts +41 -0
  28. package/dist/catalog/bundleRuleCodes.js +110 -0
  29. package/dist/catalog/bundleRules.d.ts +69 -0
  30. package/dist/catalog/bundleRules.js +102 -0
  31. package/dist/catalog/catalogDraftStore.d.ts +4 -0
  32. package/dist/catalog/catalogDraftStore.js +63 -0
  33. package/dist/catalog/catalogSkuEnvelope.d.ts +7 -0
  34. package/dist/catalog/catalogSkuEnvelope.js +142 -0
  35. package/dist/catalog/catalogSkuEnvelopeMapper.d.ts +38 -0
  36. package/dist/catalog/catalogSkuEnvelopeMapper.js +88 -0
  37. package/dist/catalog/contracts/bundleAdmin.d.ts +143 -0
  38. package/dist/catalog/contracts/bundleAdmin.js +1 -0
  39. package/dist/catalog/contracts/bundleAvailability.d.ts +61 -0
  40. package/dist/catalog/contracts/bundleAvailability.js +1 -0
  41. package/dist/catalog/contracts/bundleRead.d.ts +241 -0
  42. package/dist/catalog/contracts/bundleRead.js +1 -0
  43. package/dist/catalog/contracts/draft.d.ts +79 -0
  44. package/dist/catalog/contracts/draft.js +47 -0
  45. package/dist/catalog/contracts/foundation.d.ts +78 -0
  46. package/dist/catalog/contracts/foundation.js +53 -0
  47. package/dist/catalog/contracts/index.d.ts +14 -0
  48. package/dist/catalog/contracts/index.js +6 -0
  49. package/dist/catalog/contracts/lifecycle.d.ts +77 -0
  50. package/dist/catalog/contracts/lifecycle.js +1 -0
  51. package/dist/catalog/contracts/productMediaContracts.d.ts +77 -0
  52. package/dist/catalog/contracts/productMediaContracts.js +149 -0
  53. package/dist/catalog/contracts/productTypes.d.ts +54 -0
  54. package/dist/catalog/contracts/productTypes.js +16 -0
  55. package/dist/catalog/contracts/resolveProductMedia.d.ts +3 -0
  56. package/dist/catalog/contracts/resolveProductMedia.js +78 -0
  57. package/dist/catalog/contracts/sellable.d.ts +23 -0
  58. package/dist/catalog/contracts/sellable.js +1 -0
  59. package/dist/catalog/draftHandler.d.ts +25 -0
  60. package/dist/catalog/draftHandler.js +118 -0
  61. package/dist/catalog/draftPorts.d.ts +18 -0
  62. package/dist/catalog/draftPorts.js +8 -0
  63. package/dist/catalog/draftSchemas.d.ts +423 -0
  64. package/dist/catalog/draftSchemas.js +89 -0
  65. package/dist/catalog/draftValidation.d.ts +21 -0
  66. package/dist/catalog/draftValidation.js +125 -0
  67. package/dist/catalog/effectiveBundleCatalogQueries.d.ts +8 -0
  68. package/dist/catalog/effectiveBundleCatalogQueries.js +79 -0
  69. package/dist/catalog/effectiveBundleCatalogStore.d.ts +4 -0
  70. package/dist/catalog/effectiveBundleCatalogStore.js +156 -0
  71. package/dist/catalog/foundationSchemas.d.ts +98 -0
  72. package/dist/catalog/foundationSchemas.js +110 -0
  73. package/dist/catalog/index.d.ts +44 -0
  74. package/dist/catalog/index.js +26 -0
  75. package/dist/catalog/mediaSourcePack.d.ts +51 -0
  76. package/dist/catalog/mediaSourcePack.js +247 -0
  77. package/dist/catalog/productTypeSchemas.d.ts +46 -0
  78. package/dist/catalog/productTypeSchemas.js +72 -0
  79. package/dist/catalog/publicationPorts.d.ts +42 -0
  80. package/dist/catalog/publicationPorts.js +1 -0
  81. package/dist/catalog/readPorts.d.ts +51 -0
  82. package/dist/catalog/readPorts.js +1 -0
  83. package/dist/catalog/referenceCatalogHandler.d.ts +7 -0
  84. package/dist/catalog/referenceCatalogHandler.js +27 -0
  85. package/dist/catalog/resolvedSkuProjection.d.ts +88 -0
  86. package/dist/catalog/resolvedSkuProjection.js +60 -0
  87. package/dist/catalog/sellableBundleHandler.d.ts +46 -0
  88. package/dist/catalog/sellableBundleHandler.js +84 -0
  89. package/dist/catalog/sellableSchemas.d.ts +46 -0
  90. package/dist/catalog/sellableSchemas.js +27 -0
  91. package/dist/catalog/sql.d.ts +46 -0
  92. package/dist/catalog/sql.js +13 -0
  93. package/dist/catalog/validation.d.ts +2 -0
  94. package/dist/catalog/validation.js +3 -0
  95. package/dist/communications/contracts/index.d.ts +1 -0
  96. package/dist/communications/contracts/marketingSync.d.ts +194 -0
  97. package/dist/communications/contracts/marketingSync.js +1 -0
  98. package/dist/communications/index.d.ts +1 -0
  99. package/dist/communications/klaviyo/consentPush.d.ts +51 -0
  100. package/dist/communications/klaviyo/consentPush.js +19 -0
  101. package/dist/communications/klaviyo/index.d.ts +110 -0
  102. package/dist/communications/klaviyo/index.js +860 -0
  103. package/dist/communications/newsletterIntegrationContracts.d.ts +3 -3
  104. package/dist/communications/resend/index.d.ts +40 -0
  105. package/dist/communications/resend/index.js +310 -0
  106. package/dist/composition/catalogContribution.d.ts +18 -0
  107. package/dist/composition/catalogContribution.js +21 -0
  108. package/dist/composition/index.d.ts +3 -0
  109. package/dist/composition/index.js +3 -0
  110. package/dist/composition/inventoryContribution.d.ts +16 -0
  111. package/dist/composition/inventoryContribution.js +17 -0
  112. package/dist/composition/shippingContribution.d.ts +16 -0
  113. package/dist/composition/shippingContribution.js +17 -0
  114. package/dist/identity/customerContracts.d.ts +2 -2
  115. package/dist/inventory/adminInventory.d.ts +13 -0
  116. package/dist/inventory/adminInventory.js +214 -0
  117. package/dist/inventory/bindings.d.ts +35 -0
  118. package/dist/inventory/bindings.js +45 -0
  119. package/dist/inventory/contracts/forecast.d.ts +86 -0
  120. package/dist/inventory/contracts/forecast.js +1 -0
  121. package/dist/inventory/contracts/index.d.ts +4 -0
  122. package/dist/inventory/contracts/index.js +1 -0
  123. package/dist/inventory/contracts/inventory.d.ts +157 -0
  124. package/dist/inventory/contracts/inventory.js +1 -0
  125. package/dist/inventory/contracts/newPurchaseStock.d.ts +20 -0
  126. package/dist/inventory/contracts/newPurchaseStock.js +1 -0
  127. package/dist/inventory/contracts/reservation.d.ts +18 -0
  128. package/dist/inventory/contracts/reservation.js +1 -0
  129. package/dist/inventory/forecast.d.ts +24 -0
  130. package/dist/inventory/forecast.js +200 -0
  131. package/dist/inventory/index.d.ts +14 -0
  132. package/dist/inventory/index.js +11 -0
  133. package/dist/inventory/inventoryHandlers.d.ts +53 -0
  134. package/dist/inventory/inventoryHandlers.js +151 -0
  135. package/dist/inventory/newPurchaseStockAvailability.d.ts +47 -0
  136. package/dist/inventory/newPurchaseStockAvailability.js +75 -0
  137. package/dist/inventory/ports.d.ts +21 -0
  138. package/dist/inventory/ports.js +16 -0
  139. package/dist/inventory/renewalReservation.d.ts +27 -0
  140. package/dist/inventory/renewalReservation.js +61 -0
  141. package/dist/inventory/reservationPolicy.d.ts +6 -0
  142. package/dist/inventory/reservationPolicy.js +19 -0
  143. package/dist/inventory/schemas.d.ts +137 -0
  144. package/dist/inventory/schemas.js +112 -0
  145. package/dist/inventory/sql.d.ts +14 -0
  146. package/dist/inventory/sql.js +5 -0
  147. package/dist/inventory/subscriptionForecastCalculation.d.ts +4 -0
  148. package/dist/inventory/subscriptionForecastCalculation.js +133 -0
  149. package/dist/pricing/acquisitionFinancialPolicy.d.ts +26 -0
  150. package/dist/pricing/acquisitionFinancialPolicy.js +1 -0
  151. package/dist/pricing/acquisitionOfferPricing.d.ts +27 -0
  152. package/dist/pricing/acquisitionOfferPricing.js +25 -0
  153. package/dist/pricing/acquisitionOfferPricingHandler.d.ts +20 -0
  154. package/dist/pricing/acquisitionOfferPricingHandler.js +105 -0
  155. package/dist/pricing/acquisitionOfferPricingSchemas.d.ts +31 -0
  156. package/dist/pricing/acquisitionOfferPricingSchemas.js +33 -0
  157. package/dist/pricing/acquisitionQuoteBinding.d.ts +12 -0
  158. package/dist/pricing/acquisitionQuoteBinding.js +12 -0
  159. package/dist/pricing/acquisitionReadiness.d.ts +31 -0
  160. package/dist/pricing/acquisitionReadiness.js +117 -0
  161. package/dist/pricing/acquisitionTerms.d.ts +19 -0
  162. package/dist/pricing/acquisitionTerms.js +126 -0
  163. package/dist/pricing/acquisitionTermsSchemas.d.ts +59 -0
  164. package/dist/pricing/acquisitionTermsSchemas.js +42 -0
  165. package/dist/pricing/catalogFactsProvenance.d.ts +33 -0
  166. package/dist/pricing/catalogFactsProvenance.js +64 -0
  167. package/dist/pricing/catalogFactsSchemas.d.ts +45 -0
  168. package/dist/pricing/catalogFactsSchemas.js +58 -0
  169. package/dist/pricing/commerceOfferPricing.d.ts +25 -0
  170. package/dist/pricing/commerceOfferPricing.js +139 -0
  171. package/dist/pricing/commerceOfferPricingCache.d.ts +10 -0
  172. package/dist/pricing/commerceOfferPricingCache.js +44 -0
  173. package/dist/pricing/commerceOfferPricingHandler.d.ts +21 -0
  174. package/dist/pricing/commerceOfferPricingHandler.js +78 -0
  175. package/dist/pricing/commercePriceAuthority.d.ts +28 -0
  176. package/dist/pricing/commercePriceAuthority.js +140 -0
  177. package/dist/pricing/commercePricingPolicyErrors.d.ts +40 -0
  178. package/dist/pricing/commercePricingPolicyErrors.js +67 -0
  179. package/dist/pricing/commerceQuoteBatchHandler.d.ts +37 -0
  180. package/dist/pricing/commerceQuoteBatchHandler.js +83 -0
  181. package/dist/pricing/commerceQuoteCatalogReadPort.d.ts +27 -0
  182. package/dist/pricing/commerceQuoteCatalogReadPort.js +8 -0
  183. package/dist/pricing/commerceQuoteHandler.d.ts +35 -0
  184. package/dist/pricing/commerceQuoteHandler.js +122 -0
  185. package/dist/pricing/commerceQuoteSnapshotExpect.d.ts +9 -0
  186. package/dist/pricing/commerceQuoteSnapshotExpect.js +22 -0
  187. package/dist/pricing/contracts/acquisitionTerms.d.ts +32 -0
  188. package/dist/pricing/contracts/acquisitionTerms.js +2 -0
  189. package/dist/pricing/contracts/authority.d.ts +27 -0
  190. package/dist/pricing/contracts/authority.js +1 -0
  191. package/dist/pricing/contracts/evidence.d.ts +33 -0
  192. package/dist/pricing/contracts/evidence.js +1 -0
  193. package/dist/pricing/contracts/index.d.ts +17 -0
  194. package/dist/pricing/contracts/index.js +7 -0
  195. package/dist/pricing/contracts/money.d.ts +27 -0
  196. package/dist/pricing/contracts/money.js +1 -0
  197. package/dist/pricing/contracts/offer.d.ts +52 -0
  198. package/dist/pricing/contracts/offer.js +4 -0
  199. package/dist/pricing/contracts/offerPolicy.d.ts +16 -0
  200. package/dist/pricing/contracts/offerPolicy.js +5 -0
  201. package/dist/pricing/contracts/policy.d.ts +22 -0
  202. package/dist/pricing/contracts/policy.js +3 -0
  203. package/dist/pricing/contracts/provenance.d.ts +24 -0
  204. package/dist/pricing/contracts/provenance.js +2 -0
  205. package/dist/pricing/contracts/quote.d.ts +94 -0
  206. package/dist/pricing/contracts/quote.js +1 -0
  207. package/dist/pricing/dbBackedCommerceQuoteHelpers.d.ts +78 -0
  208. package/dist/pricing/dbBackedCommerceQuoteHelpers.js +146 -0
  209. package/dist/pricing/dbBackedCommerceQuotePort.d.ts +74 -0
  210. package/dist/pricing/dbBackedCommerceQuotePort.js +223 -0
  211. package/dist/pricing/dbBackedCommerceQuoteSnapshotVerifier.d.ts +4 -0
  212. package/dist/pricing/dbBackedCommerceQuoteSnapshotVerifier.js +25 -0
  213. package/dist/pricing/index.d.ts +52 -0
  214. package/dist/pricing/index.js +36 -0
  215. package/dist/pricing/offerPolicyReadiness.d.ts +21 -0
  216. package/dist/pricing/offerPolicyReadiness.js +79 -0
  217. package/dist/pricing/offerPolicySchemas.d.ts +25 -0
  218. package/dist/pricing/offerPolicySchemas.js +15 -0
  219. package/dist/pricing/offerPricingSchemas.d.ts +315 -0
  220. package/dist/pricing/offerPricingSchemas.js +65 -0
  221. package/dist/pricing/ports.d.ts +13 -0
  222. package/dist/pricing/ports.js +9 -0
  223. package/dist/pricing/pricingPolicyToken.d.ts +39 -0
  224. package/dist/pricing/pricingPolicyToken.js +84 -0
  225. package/dist/pricing/quoteAcquisitionTerms.d.ts +2 -0
  226. package/dist/pricing/quoteAcquisitionTerms.js +4 -0
  227. package/dist/pricing/quoteCodeRejectionDetails.d.ts +20 -0
  228. package/dist/pricing/quoteCodeRejectionDetails.js +22 -0
  229. package/dist/pricing/quotePorts.d.ts +30 -0
  230. package/dist/pricing/quotePorts.js +20 -0
  231. package/dist/pricing/quotePrimitives.d.ts +13 -0
  232. package/dist/pricing/quotePrimitives.js +18 -0
  233. package/dist/pricing/quotePromotionEvidence.d.ts +39 -0
  234. package/dist/pricing/quotePromotionEvidence.js +73 -0
  235. package/dist/pricing/quoteSchemas.d.ts +1176 -0
  236. package/dist/pricing/quoteSchemas.js +196 -0
  237. package/dist/pricing/quoteShippingPromotions.d.ts +20 -0
  238. package/dist/pricing/quoteShippingPromotions.js +1 -0
  239. package/dist/pricing/subscriptionPricePolicy.d.ts +52 -0
  240. package/dist/pricing/subscriptionPricePolicy.js +96 -0
  241. package/dist/pricing/taxProfileGuard.d.ts +2 -0
  242. package/dist/pricing/taxProfileGuard.js +24 -0
  243. package/dist/pricing/validation.d.ts +2 -0
  244. package/dist/pricing/validation.js +3 -0
  245. package/dist/promotions/adminBindings.d.ts +72 -0
  246. package/dist/promotions/adminBindings.js +1 -0
  247. package/dist/promotions/adminPromotionCodesContracts.d.ts +498 -0
  248. package/dist/promotions/adminPromotionCodesContracts.js +211 -0
  249. package/dist/promotions/adminPromotionCodesDataPort.d.ts +47 -0
  250. package/dist/promotions/adminPromotionCodesDataPort.js +1 -0
  251. package/dist/promotions/adminPromotionCodesHandler.d.ts +14 -0
  252. package/dist/promotions/adminPromotionCodesHandler.js +194 -0
  253. package/dist/promotions/adminPromotionsContracts.d.ts +235 -0
  254. package/dist/promotions/adminPromotionsContracts.js +99 -0
  255. package/dist/promotions/adminPromotionsDataPort.d.ts +42 -0
  256. package/dist/promotions/adminPromotionsDataPort.js +1 -0
  257. package/dist/promotions/adminPromotionsHandler.d.ts +16 -0
  258. package/dist/promotions/adminPromotionsHandler.js +47 -0
  259. package/dist/promotions/commerceQuoteReadPreparation.d.ts +3 -0
  260. package/dist/promotions/commerceQuoteReadPreparation.js +27 -0
  261. package/dist/promotions/contracts/index.d.ts +387 -0
  262. package/dist/promotions/contracts/index.js +1 -0
  263. package/dist/promotions/index.d.ts +25 -0
  264. package/dist/promotions/index.js +22 -0
  265. package/dist/promotions/promoDataPort.d.ts +47 -0
  266. package/dist/promotions/promoDataPort.js +14 -0
  267. package/dist/promotions/promotionAcceptanceTelemetry.d.ts +29 -0
  268. package/dist/promotions/promotionAcceptanceTelemetry.js +45 -0
  269. package/dist/promotions/promotionBenefitDefinition.d.ts +37 -0
  270. package/dist/promotions/promotionBenefitDefinition.js +33 -0
  271. package/dist/promotions/promotionClaimSweepPort.d.ts +14 -0
  272. package/dist/promotions/promotionClaimSweepPort.js +8 -0
  273. package/dist/promotions/promotionClaims.d.ts +5 -0
  274. package/dist/promotions/promotionClaims.js +57 -0
  275. package/dist/promotions/promotionCodePreview.d.ts +11 -0
  276. package/dist/promotions/promotionCodePreview.js +154 -0
  277. package/dist/promotions/promotionCodeQuotePort.d.ts +25 -0
  278. package/dist/promotions/promotionCodeQuotePort.js +1 -0
  279. package/dist/promotions/promotionQuoteAcceptance.d.ts +70 -0
  280. package/dist/promotions/promotionQuoteAcceptance.js +202 -0
  281. package/dist/promotions/promotionQuoteBinding.d.ts +73 -0
  282. package/dist/promotions/promotionQuoteBinding.js +87 -0
  283. package/dist/promotions/quoteAcquisitionBinding.d.ts +6 -0
  284. package/dist/promotions/quoteAcquisitionBinding.js +1 -0
  285. package/dist/promotions/quoteAutomaticPromotions.d.ts +26 -0
  286. package/dist/promotions/quoteAutomaticPromotions.js +60 -0
  287. package/dist/promotions/quotePromoDiscounts.d.ts +36 -0
  288. package/dist/promotions/quotePromoDiscounts.js +146 -0
  289. package/dist/promotions/quotePromotionCodeAdjustments.d.ts +27 -0
  290. package/dist/promotions/quotePromotionCodeAdjustments.js +223 -0
  291. package/dist/promotions/quotePromotionV2.d.ts +30 -0
  292. package/dist/promotions/quotePromotionV2.js +186 -0
  293. package/dist/promotions/quoteShippingPolicy.d.ts +23 -0
  294. package/dist/promotions/quoteShippingPolicy.js +47 -0
  295. package/dist/promotions/sql.d.ts +14 -0
  296. package/dist/promotions/sql.js +5 -0
  297. package/dist/promotions/validation.d.ts +2 -0
  298. package/dist/promotions/validation.js +3 -0
  299. package/dist/shipping/addressCanonLookupHandler.d.ts +7 -0
  300. package/dist/shipping/addressCanonLookupHandler.js +105 -0
  301. package/dist/shipping/addressCanonical.d.ts +2 -0
  302. package/dist/shipping/addressCanonical.js +26 -0
  303. package/dist/shipping/addressPorts.d.ts +39 -0
  304. package/dist/shipping/addressPorts.js +1 -0
  305. package/dist/shipping/addressSchemas.d.ts +30 -0
  306. package/dist/shipping/addressSchemas.js +1 -0
  307. package/dist/shipping/adminShippingRateHandler.d.ts +4 -0
  308. package/dist/shipping/adminShippingRateHandler.js +64 -0
  309. package/dist/shipping/bindings.d.ts +57 -0
  310. package/dist/shipping/bindings.js +46 -0
  311. package/dist/shipping/contracts/address.d.ts +144 -0
  312. package/dist/shipping/contracts/address.js +1 -0
  313. package/dist/shipping/contracts/delivery.d.ts +110 -0
  314. package/dist/shipping/contracts/delivery.js +1 -0
  315. package/dist/shipping/contracts/index.d.ts +4 -0
  316. package/dist/shipping/contracts/index.js +1 -0
  317. package/dist/shipping/contracts/shippingRate.d.ts +11 -0
  318. package/dist/shipping/contracts/shippingRate.js +1 -0
  319. package/dist/shipping/contracts/threshold.d.ts +22 -0
  320. package/dist/shipping/contracts/threshold.js +1 -0
  321. package/dist/shipping/customerAddressesHandler.d.ts +5 -0
  322. package/dist/shipping/customerAddressesHandler.js +80 -0
  323. package/dist/shipping/customerSelfServiceAddressModels.d.ts +27 -0
  324. package/dist/shipping/customerSelfServiceAddressModels.js +101 -0
  325. package/dist/shipping/deliverySelectionHandler.d.ts +10 -0
  326. package/dist/shipping/deliverySelectionHandler.js +77 -0
  327. package/dist/shipping/deliverySelectionPort.d.ts +8 -0
  328. package/dist/shipping/deliverySelectionPort.js +1 -0
  329. package/dist/shipping/deliverySelectionSummary.d.ts +2 -0
  330. package/dist/shipping/deliverySelectionSummary.js +53 -0
  331. package/dist/shipping/handlerSchemas.d.ts +21 -0
  332. package/dist/shipping/handlerSchemas.js +1 -0
  333. package/dist/shipping/index.d.ts +20 -0
  334. package/dist/shipping/index.js +10 -0
  335. package/dist/shipping/pickupPointSearchPort.d.ts +4 -0
  336. package/dist/shipping/pickupPointSearchPort.js +1 -0
  337. package/dist/shipping/readDeliverySelectionEvidence.d.ts +2 -0
  338. package/dist/shipping/readDeliverySelectionEvidence.js +44 -0
  339. package/dist/shipping/shippingRatePorts.d.ts +52 -0
  340. package/dist/shipping/shippingRatePorts.js +1 -0
  341. package/dist/shipping/thresholdPolicy.d.ts +42 -0
  342. package/dist/shipping/thresholdPolicy.js +60 -0
  343. package/package.json +62 -2
  344. package/release-gates.json +263 -53
  345. package/sql/20260807140000_read_parity_catalog.sql +94 -0
  346. package/sql/20260810120000_storefront_catalog_attributes.sql +51 -0
  347. package/sql/20260812140000_sellable_bundle_catalog.sql +124 -0
  348. package/sql/20260812210000_bundle_operator_write_boundary.sql +567 -0
  349. package/sql/20260814000000_fulfillment_stock_evidence.sql +239 -0
  350. package/sql/20260815120000_automatic_subscription_renewal.sql +1083 -0
  351. package/sql/20260817180000_promotion_claim_lifecycle.sql +591 -0
  352. package/sql/20260817180100_promotion_claim_lifecycle_validation.sql +23 -0
  353. package/sql/20260827220000_catalog_document_revision_foundation.sql +226 -0
  354. package/sql/20260827220001_catalog_document_revision_foundation_validate.sql +10 -0
  355. package/sql/20260908100000_catalog_draft_foundation.sql +217 -0
  356. package/src/catalog/activeSkuSelection.ts +20 -0
  357. package/src/catalog/adminBindings.ts +59 -0
  358. package/src/catalog/adminBundleHandler.ts +165 -0
  359. package/src/catalog/adminBundleReadHandler.ts +263 -0
  360. package/src/catalog/adminBundleWritePort.ts +102 -0
  361. package/src/catalog/bundleAvailability.ts +129 -0
  362. package/src/catalog/bundleAvailabilityService.ts +171 -0
  363. package/src/catalog/bundleBindings.ts +29 -0
  364. package/src/catalog/bundleCatalogQueries.ts +98 -0
  365. package/src/catalog/bundleCatalogReadPort.ts +181 -0
  366. package/src/catalog/bundleCatalogStore.ts +274 -0
  367. package/src/catalog/bundlePriceSelection.ts +25 -0
  368. package/src/catalog/bundleRuleCodes.ts +134 -0
  369. package/src/catalog/bundleRules.ts +153 -0
  370. package/src/catalog/catalogDraftStore.ts +71 -0
  371. package/src/catalog/catalogSkuEnvelope.ts +214 -0
  372. package/src/catalog/catalogSkuEnvelopeMapper.ts +160 -0
  373. package/src/catalog/contracts/bundleAdmin.ts +20 -0
  374. package/src/catalog/contracts/bundleAvailability.ts +5 -0
  375. package/src/catalog/contracts/bundleRead.ts +13 -0
  376. package/src/catalog/contracts/draft.ts +69 -0
  377. package/src/catalog/contracts/foundation.ts +104 -0
  378. package/src/catalog/contracts/index.ts +14 -0
  379. package/src/catalog/contracts/lifecycle.ts +74 -0
  380. package/src/catalog/contracts/productMediaContracts.ts +170 -0
  381. package/src/catalog/contracts/productTypes.ts +35 -0
  382. package/src/catalog/contracts/resolveProductMedia.ts +85 -0
  383. package/src/catalog/contracts/sellable.ts +12 -0
  384. package/src/catalog/draftHandler.ts +105 -0
  385. package/src/catalog/draftPorts.ts +18 -0
  386. package/src/catalog/draftSchemas.ts +88 -0
  387. package/src/catalog/draftValidation.ts +100 -0
  388. package/src/catalog/effectiveBundleCatalogQueries.ts +80 -0
  389. package/src/catalog/effectiveBundleCatalogStore.ts +208 -0
  390. package/src/catalog/foundationSchemas.ts +123 -0
  391. package/src/catalog/index.ts +44 -0
  392. package/src/catalog/mediaSourcePack.ts +219 -0
  393. package/src/catalog/productTypeSchemas.ts +70 -0
  394. package/src/catalog/publicationPorts.ts +44 -0
  395. package/src/catalog/readPorts.ts +61 -0
  396. package/src/catalog/referenceCatalogHandler.ts +39 -0
  397. package/src/catalog/resolvedSkuProjection.ts +76 -0
  398. package/src/catalog/sellableBundleHandler.ts +133 -0
  399. package/src/catalog/sellableSchemas.ts +33 -0
  400. package/src/catalog/sql.ts +14 -0
  401. package/src/catalog/validation.ts +3 -0
  402. package/src/communications/contracts/index.ts +1 -0
  403. package/src/communications/contracts/marketingSync.ts +109 -0
  404. package/src/communications/index.ts +1 -0
  405. package/src/communications/klaviyo/consentPush.ts +19 -0
  406. package/src/communications/klaviyo/index.ts +649 -0
  407. package/src/communications/resend/index.ts +350 -0
  408. package/src/composition/catalogContribution.ts +32 -0
  409. package/src/composition/index.ts +3 -0
  410. package/src/composition/inventoryContribution.ts +24 -0
  411. package/src/composition/shippingContribution.ts +24 -0
  412. package/src/inventory/adminInventory.ts +251 -0
  413. package/src/inventory/bindings.ts +61 -0
  414. package/src/inventory/contracts/forecast.ts +96 -0
  415. package/src/inventory/contracts/index.ts +18 -0
  416. package/src/inventory/contracts/inventory.ts +14 -0
  417. package/src/inventory/contracts/newPurchaseStock.ts +23 -0
  418. package/src/inventory/contracts/reservation.ts +20 -0
  419. package/src/inventory/forecast.ts +239 -0
  420. package/src/inventory/index.ts +22 -0
  421. package/src/inventory/inventoryHandlers.ts +215 -0
  422. package/src/inventory/newPurchaseStockAvailability.ts +120 -0
  423. package/src/inventory/ports.ts +46 -0
  424. package/src/inventory/renewalReservation.ts +88 -0
  425. package/src/inventory/reservationPolicy.ts +27 -0
  426. package/src/inventory/schemas.ts +128 -0
  427. package/src/inventory/sql.ts +5 -0
  428. package/src/inventory/subscriptionForecastCalculation.ts +157 -0
  429. package/src/pricing/acquisitionFinancialPolicy.ts +26 -0
  430. package/src/pricing/acquisitionOfferPricing.ts +38 -0
  431. package/src/pricing/acquisitionOfferPricingHandler.ts +157 -0
  432. package/src/pricing/acquisitionOfferPricingSchemas.ts +35 -0
  433. package/src/pricing/acquisitionQuoteBinding.ts +12 -0
  434. package/src/pricing/acquisitionReadiness.ts +148 -0
  435. package/src/pricing/acquisitionTerms.ts +125 -0
  436. package/src/pricing/acquisitionTermsSchemas.ts +52 -0
  437. package/src/pricing/catalogFactsProvenance.ts +102 -0
  438. package/src/pricing/catalogFactsSchemas.ts +69 -0
  439. package/src/pricing/commerceOfferPricing.ts +224 -0
  440. package/src/pricing/commerceOfferPricingCache.ts +53 -0
  441. package/src/pricing/commerceOfferPricingHandler.ts +137 -0
  442. package/src/pricing/commercePriceAuthority.ts +169 -0
  443. package/src/pricing/commercePricingPolicyErrors.ts +88 -0
  444. package/src/pricing/commerceQuoteBatchHandler.ts +129 -0
  445. package/src/pricing/commerceQuoteCatalogReadPort.ts +42 -0
  446. package/src/pricing/commerceQuoteHandler.ts +199 -0
  447. package/src/pricing/commerceQuoteSnapshotExpect.ts +48 -0
  448. package/src/pricing/contracts/acquisitionTerms.ts +26 -0
  449. package/src/pricing/contracts/authority.ts +44 -0
  450. package/src/pricing/contracts/evidence.ts +25 -0
  451. package/src/pricing/contracts/index.ts +17 -0
  452. package/src/pricing/contracts/money.ts +32 -0
  453. package/src/pricing/contracts/offer.ts +42 -0
  454. package/src/pricing/contracts/offerPolicy.ts +17 -0
  455. package/src/pricing/contracts/policy.ts +26 -0
  456. package/src/pricing/contracts/provenance.ts +19 -0
  457. package/src/pricing/contracts/quote.ts +106 -0
  458. package/src/pricing/dbBackedCommerceQuoteHelpers.ts +256 -0
  459. package/src/pricing/dbBackedCommerceQuotePort.ts +280 -0
  460. package/src/pricing/dbBackedCommerceQuoteSnapshotVerifier.ts +49 -0
  461. package/src/pricing/index.ts +53 -0
  462. package/src/pricing/offerPolicyReadiness.ts +110 -0
  463. package/src/pricing/offerPolicySchemas.ts +23 -0
  464. package/src/pricing/offerPricingSchemas.ts +92 -0
  465. package/src/pricing/ports.ts +17 -0
  466. package/src/pricing/pricingPolicyToken.ts +119 -0
  467. package/src/pricing/quoteAcquisitionTerms.ts +10 -0
  468. package/src/pricing/quoteCodeRejectionDetails.ts +23 -0
  469. package/src/pricing/quotePorts.ts +58 -0
  470. package/src/pricing/quotePrimitives.ts +21 -0
  471. package/src/pricing/quotePromotionEvidence.ts +82 -0
  472. package/src/pricing/quoteSchemas.ts +230 -0
  473. package/src/pricing/quoteShippingPromotions.ts +21 -0
  474. package/src/pricing/subscriptionPricePolicy.ts +113 -0
  475. package/src/pricing/taxProfileGuard.ts +33 -0
  476. package/src/pricing/validation.ts +3 -0
  477. package/src/promotions/adminBindings.ts +53 -0
  478. package/src/promotions/adminPromotionCodesContracts.ts +244 -0
  479. package/src/promotions/adminPromotionCodesDataPort.ts +56 -0
  480. package/src/promotions/adminPromotionCodesHandler.ts +254 -0
  481. package/src/promotions/adminPromotionsContracts.ts +121 -0
  482. package/src/promotions/adminPromotionsDataPort.ts +48 -0
  483. package/src/promotions/adminPromotionsHandler.ts +72 -0
  484. package/src/promotions/commerceQuoteReadPreparation.ts +29 -0
  485. package/src/promotions/contracts/index.ts +387 -0
  486. package/src/promotions/index.ts +25 -0
  487. package/src/promotions/promoDataPort.ts +65 -0
  488. package/src/promotions/promotionAcceptanceTelemetry.ts +73 -0
  489. package/src/promotions/promotionBenefitDefinition.ts +48 -0
  490. package/src/promotions/promotionClaimSweepPort.ts +23 -0
  491. package/src/promotions/promotionClaims.ts +70 -0
  492. package/src/promotions/promotionCodePreview.ts +183 -0
  493. package/src/promotions/promotionCodeQuotePort.ts +35 -0
  494. package/src/promotions/promotionQuoteAcceptance.ts +291 -0
  495. package/src/promotions/promotionQuoteBinding.ts +163 -0
  496. package/src/promotions/quoteAcquisitionBinding.ts +7 -0
  497. package/src/promotions/quoteAutomaticPromotions.ts +84 -0
  498. package/src/promotions/quotePromoDiscounts.ts +194 -0
  499. package/src/promotions/quotePromotionCodeAdjustments.ts +277 -0
  500. package/src/promotions/quotePromotionV2.ts +239 -0
  501. package/src/promotions/quoteShippingPolicy.ts +61 -0
  502. package/src/promotions/sql.ts +5 -0
  503. package/src/promotions/validation.ts +3 -0
  504. package/src/shipping/addressCanonLookupHandler.ts +114 -0
  505. package/src/shipping/addressCanonical.ts +31 -0
  506. package/src/shipping/addressPorts.ts +48 -0
  507. package/src/shipping/addressSchemas.ts +28 -0
  508. package/src/shipping/adminShippingRateHandler.ts +72 -0
  509. package/src/shipping/bindings.ts +74 -0
  510. package/src/shipping/contracts/address.ts +71 -0
  511. package/src/shipping/contracts/delivery.ts +114 -0
  512. package/src/shipping/contracts/index.ts +19 -0
  513. package/src/shipping/contracts/shippingRate.ts +7 -0
  514. package/src/shipping/contracts/threshold.ts +22 -0
  515. package/src/shipping/customerAddressesHandler.ts +100 -0
  516. package/src/shipping/customerSelfServiceAddressModels.ts +124 -0
  517. package/src/shipping/deliverySelectionHandler.ts +94 -0
  518. package/src/shipping/deliverySelectionPort.ts +10 -0
  519. package/src/shipping/deliverySelectionSummary.ts +56 -0
  520. package/src/shipping/handlerSchemas.ts +19 -0
  521. package/src/shipping/index.ts +26 -0
  522. package/src/shipping/pickupPointSearchPort.ts +8 -0
  523. package/src/shipping/readDeliverySelectionEvidence.ts +51 -0
  524. package/src/shipping/shippingRatePorts.ts +36 -0
  525. package/src/shipping/thresholdPolicy.ts +65 -0
@@ -0,0 +1,105 @@
1
+ import { COMMERCE_OFFER_PRICING_V3_CONTRACT_VERSION } from "./contracts/offer.js";
2
+ import { acquisitionCapabilitySchema } from "./acquisitionTermsSchemas.js";
3
+ import { pricingPolicyRequestSchema } from "./offerPolicySchemas.js";
4
+ import { mapPricingPolicyFailure } from "./commercePricingPolicyErrors.js";
5
+ import { COMMERCE_OFFER_PRICING_ASSIGNED_CACHE_CONTROL, COMMERCE_OFFER_PRICING_CACHE_CONTROL, OFFER_POLICY_CAPABILITY_HEADER, OFFER_POLICY_TOKEN_HEADER, OFFER_POLICY_VISITOR_HEADER } from "./commerceOfferPricingHandler.js";
6
+ export const ACQUISITION_CAPABILITY_HEADER = "x-commerce-acquisition-capability";
7
+ const ROUTER_QUERY_KEYS = new Set(["path", "__bffPath"]);
8
+ export function createAcquisitionOfferPricingHandler({ responder, commerceOfferPricingResponseSchema, incumbentHandler, readOfferPricing, resolvePricingPolicy, requirePricingPolicy = false, }) {
9
+ const { sendBffError, sendBffSuccess, sendMethodNotAllowed } = responder;
10
+ return async function handler(req, res) {
11
+ if (req.headers?.[ACQUISITION_CAPABILITY_HEADER] === undefined)
12
+ return incumbentHandler(req, res);
13
+ if (req.method !== "GET") {
14
+ sendMethodNotAllowed(res, ["GET"]);
15
+ return;
16
+ }
17
+ const userQueryKeys = Object.keys(req.query ?? {}).filter((key) => !ROUTER_QUERY_KEYS.has(key));
18
+ if (userQueryKeys.length > 0) {
19
+ sendBffError(res, "BAD_REQUEST", "Commerce offer pricing does not accept query parameters");
20
+ return;
21
+ }
22
+ let failureReason = "offer_pricing_policy_unavailable";
23
+ try {
24
+ const acquisitionCapability = readAcquisitionCapability(req);
25
+ if (acquisitionCapability === null) {
26
+ sendBffError(res, "BAD_REQUEST", "Commerce acquisition capability is invalid");
27
+ return;
28
+ }
29
+ const policyRequest = readPolicyRequest(req);
30
+ if (policyRequest === null) {
31
+ sendBffError(res, "BAD_REQUEST", "Commerce offer pricing policy capability is invalid");
32
+ return;
33
+ }
34
+ if (!policyRequest && requirePricingPolicy) {
35
+ // A caller that sent no capability headers is an incomplete request,
36
+ // not an unavailable origin — the same attribution the missing-visitor
37
+ // branch above already applies.
38
+ sendBffError(res, "BAD_REQUEST", "Commerce offer pricing requires offer policy v2", {
39
+ details: {
40
+ reason: "pricing_policy_request_invalid",
41
+ stage: "pricing_policy",
42
+ policyReason: "v2_capability_required",
43
+ },
44
+ });
45
+ return;
46
+ }
47
+ const pricingPolicy = policyRequest && resolvePricingPolicy
48
+ ? await resolvePricingPolicy(policyRequest)
49
+ : undefined;
50
+ if (acquisitionCapability && pricingPolicy?.offerPolicyVersion !== "commerce.offer-policy.v2") {
51
+ sendBffError(res, "BAD_REQUEST", "Commerce acquisition pricing requires offer policy v2");
52
+ return;
53
+ }
54
+ failureReason = "offer_pricing_projection_unavailable";
55
+ const parsed = commerceOfferPricingResponseSchema.safeParse(await (acquisitionCapability ? readOfferPricing(pricingPolicy, acquisitionCapability) : readOfferPricing(pricingPolicy)));
56
+ if (!parsed.success || Boolean(acquisitionCapability) !==
57
+ (parsed.data.contractVersion === COMMERCE_OFFER_PRICING_V3_CONTRACT_VERSION)) {
58
+ sendBffError(res, "INVALID_RESPONSE", "Commerce offer pricing returned invalid response");
59
+ return;
60
+ }
61
+ res.setHeader("Vary", [ACQUISITION_CAPABILITY_HEADER, OFFER_POLICY_CAPABILITY_HEADER,
62
+ OFFER_POLICY_TOKEN_HEADER, OFFER_POLICY_VISITOR_HEADER].join(", "));
63
+ sendBffSuccess(res, parsed.data, { contractVersion: parsed.data.contractVersion }, {
64
+ cacheControl: policyRequest
65
+ ? COMMERCE_OFFER_PRICING_ASSIGNED_CACHE_CONTROL
66
+ : COMMERCE_OFFER_PRICING_CACHE_CONTROL,
67
+ });
68
+ }
69
+ catch (error) {
70
+ const policyFailure = failureReason === "offer_pricing_policy_unavailable"
71
+ ? mapPricingPolicyFailure(error) : null;
72
+ sendBffError(res, "UPSTREAM_UNAVAILABLE", "Commerce offer pricing is unavailable", {
73
+ details: {
74
+ reason: failureReason,
75
+ ...(policyFailure ? { policyReason: policyFailure.details.policyReason } : {}),
76
+ },
77
+ });
78
+ }
79
+ };
80
+ }
81
+ export function readAcquisitionCapability(req) {
82
+ const raw = req.headers?.[ACQUISITION_CAPABILITY_HEADER];
83
+ if (raw === undefined)
84
+ return undefined;
85
+ const parsed = acquisitionCapabilitySchema.safeParse(typeof raw === "string" ? raw.trim() : raw);
86
+ return parsed.success ? parsed.data : null;
87
+ }
88
+ function readPolicyRequest(req) {
89
+ const capability = singleHeader(req, OFFER_POLICY_CAPABILITY_HEADER);
90
+ const token = singleHeader(req, OFFER_POLICY_TOKEN_HEADER);
91
+ if (!capability && !token)
92
+ return undefined;
93
+ const visitorId = singleHeader(req, OFFER_POLICY_VISITOR_HEADER);
94
+ if (!visitorId || visitorId.length > 120)
95
+ return null;
96
+ const parsed = pricingPolicyRequestSchema.safeParse({
97
+ ...(capability ? { capability } : {}),
98
+ ...(token ? { token } : {}),
99
+ });
100
+ return parsed.success ? { visitorId, pricingPolicy: parsed.data } : null;
101
+ }
102
+ function singleHeader(req, name) {
103
+ const value = req.headers?.[name];
104
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
105
+ }
@@ -0,0 +1,31 @@
1
+ import { z } from "zod";
2
+ import { COMMERCE_OFFER_PRICING_V2_CONTRACT_VERSION, type AcquisitionOfferPricingResponse, type CommerceOfferPricingResponse } from "./contracts/offer.js";
3
+ export declare const ACQUISITION_PROJECTION_MAX_AGE_MS = 60000;
4
+ export declare const acquisitionProjectionFreshnessShape: {
5
+ acquisitionTerms: z.ZodObject<{
6
+ initialDiscountBps: z.ZodNumber;
7
+ effectiveFrom: z.ZodString;
8
+ effectiveTo: z.ZodNullable<z.ZodString>;
9
+ schemaVersion: z.ZodLiteral<"subscription-acquisition.v1">;
10
+ revision: z.ZodString;
11
+ delivery2DiscountBps: z.ZodNumber;
12
+ }, z.core.$strict>;
13
+ observedAt: z.ZodString;
14
+ validUntil: z.ZodString;
15
+ };
16
+ export declare const acquisitionProjectionFreshnessSchema: z.ZodObject<{
17
+ acquisitionTerms: z.ZodObject<{
18
+ initialDiscountBps: z.ZodNumber;
19
+ effectiveFrom: z.ZodString;
20
+ effectiveTo: z.ZodNullable<z.ZodString>;
21
+ schemaVersion: z.ZodLiteral<"subscription-acquisition.v1">;
22
+ revision: z.ZodString;
23
+ delivery2DiscountBps: z.ZodNumber;
24
+ }, z.core.$strict>;
25
+ observedAt: z.ZodString;
26
+ validUntil: z.ZodString;
27
+ }, z.core.$strict>;
28
+ /** Validate against the host's existing v2 scope, product and settlement schemas. */
29
+ export declare function createAcquisitionOfferPricingSchema<ScopeV2 extends string>(v2Schema: z.ZodType<Extract<CommerceOfferPricingResponse<string, ScopeV2>, {
30
+ contractVersion: typeof COMMERCE_OFFER_PRICING_V2_CONTRACT_VERSION;
31
+ }>>): z.ZodType<AcquisitionOfferPricingResponse<ScopeV2>>;
@@ -0,0 +1,33 @@
1
+ import { z } from "zod";
2
+ import { acquisitionTermsSchema } from "./acquisitionTermsSchemas.js";
3
+ import { COMMERCE_OFFER_PRICING_V2_CONTRACT_VERSION, COMMERCE_OFFER_PRICING_V3_CONTRACT_VERSION } from "./contracts/offer.js";
4
+ export const ACQUISITION_PROJECTION_MAX_AGE_MS = 60_000;
5
+ export const acquisitionProjectionFreshnessShape = {
6
+ acquisitionTerms: acquisitionTermsSchema,
7
+ observedAt: z.string().datetime({ offset: true }),
8
+ validUntil: z.string().datetime({ offset: true }),
9
+ };
10
+ export const acquisitionProjectionFreshnessSchema = z.object(acquisitionProjectionFreshnessShape).strict().refine((value) => {
11
+ const observed = Date.parse(value.observedAt);
12
+ const until = Date.parse(value.validUntil);
13
+ return until > observed && until <= observed + ACQUISITION_PROJECTION_MAX_AGE_MS
14
+ && (value.acquisitionTerms.effectiveFrom == null || Date.parse(value.acquisitionTerms.effectiveFrom) <= observed)
15
+ && (value.acquisitionTerms.effectiveTo == null || until <= Date.parse(value.acquisitionTerms.effectiveTo));
16
+ }, "acquisition projection must be current and expire by its next boundary or 60 seconds");
17
+ /** Validate against the host's existing v2 scope, product and settlement schemas. */
18
+ export function createAcquisitionOfferPricingSchema(v2Schema) {
19
+ return z.unknown().transform((value, ctx) => {
20
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
21
+ ctx.addIssue({ code: "custom", message: "Invalid acquisition offer" });
22
+ return z.NEVER;
23
+ }
24
+ const { contractVersion, acquisitionTerms, observedAt, validUntil, ...base } = value;
25
+ const pricing = v2Schema.safeParse({ ...base, contractVersion: COMMERCE_OFFER_PRICING_V2_CONTRACT_VERSION });
26
+ const freshness = acquisitionProjectionFreshnessSchema.safeParse({ acquisitionTerms, observedAt, validUntil });
27
+ if (contractVersion !== COMMERCE_OFFER_PRICING_V3_CONTRACT_VERSION || !pricing.success || !freshness.success) {
28
+ ctx.addIssue({ code: "custom", message: "Invalid acquisition offer" });
29
+ return z.NEVER;
30
+ }
31
+ return { ...pricing.data, contractVersion: COMMERCE_OFFER_PRICING_V3_CONTRACT_VERSION, ...freshness.data };
32
+ });
33
+ }
@@ -0,0 +1,12 @@
1
+ import type { ResolvedAcquisitionTerms } from "./contracts/acquisitionTerms.js";
2
+ /** Server-selected terms only. Absence contributes no property or token bytes. */
3
+ export declare function acquisitionQuoteBinding(acquisitionTerms?: ResolvedAcquisitionTerms): {
4
+ acquisitionTerms?: ResolvedAcquisitionTerms;
5
+ };
6
+ export declare function mapAcquisitionTermsFailure(error: unknown): {
7
+ code: "CONFLICT" | "UPSTREAM_UNAVAILABLE";
8
+ details: {
9
+ reason: import("./acquisitionTerms.js").AcquisitionTermsRefusal;
10
+ refreshRequired: boolean;
11
+ };
12
+ } | null;
@@ -0,0 +1,12 @@
1
+ import { AcquisitionTermsError } from "./acquisitionTerms.js";
2
+ /** Server-selected terms only. Absence contributes no property or token bytes. */
3
+ export function acquisitionQuoteBinding(acquisitionTerms) {
4
+ return acquisitionTerms ? { acquisitionTerms } : {};
5
+ }
6
+ export function mapAcquisitionTermsFailure(error) {
7
+ if (!(error instanceof AcquisitionTermsError))
8
+ return null;
9
+ const refreshRequired = error.reason === "acquisition_terms_capability_required" || error.reason === "acquisition_terms_v2_required";
10
+ return { code: refreshRequired ? "CONFLICT" : "UPSTREAM_UNAVAILABLE",
11
+ details: { reason: error.reason, refreshRequired } };
12
+ }
@@ -0,0 +1,31 @@
1
+ import { type AcquisitionTerms } from "./contracts/acquisitionTerms.js";
2
+ import type { AcquisitionFinancialPolicy } from "./acquisitionFinancialPolicy.js";
3
+ import { OFFER_POLICY_V2_READINESS_CONTRACT } from "./offerPolicyReadiness.js";
4
+ export declare const ACQUISITION_READINESS_CONTRACT = "commerce-acquisition-readiness.v1";
5
+ export interface AcquisitionReadinessEvidence extends Omit<AcquisitionTerms, "schemaVersion"> {
6
+ contractVersion: typeof ACQUISITION_READINESS_CONTRACT;
7
+ kind: "legacy_pair" | "v2_standalone";
8
+ legacyPairCount: number;
9
+ standaloneCount: number;
10
+ nextBoundaryAt: string | null;
11
+ }
12
+ export interface AcquisitionOfferPolicyReadiness {
13
+ contractVersion: typeof OFFER_POLICY_V2_READINESS_CONTRACT;
14
+ ready: boolean;
15
+ checkedAt: string;
16
+ reasons: string[];
17
+ evidence?: {
18
+ acquisition: AcquisitionReadinessEvidence | null;
19
+ };
20
+ }
21
+ import type { OfferPolicyReadinessPort } from "./offerPolicyReadiness.js";
22
+ export interface AcquisitionReadinessCache {
23
+ read(port: OfferPolicyReadinessPort): Promise<AcquisitionOfferPolicyReadiness>;
24
+ clear(): void;
25
+ }
26
+ export declare function createAcquisitionReadinessCache<Row>(input: {
27
+ policy: AcquisitionFinancialPolicy<Row>;
28
+ now?: () => number;
29
+ positiveTtlMs?: number;
30
+ negativeTtlMs?: number;
31
+ }): AcquisitionReadinessCache;
@@ -0,0 +1,117 @@
1
+ import { z } from "zod";
2
+ import { ACQUISITION_TERMS_CAPABILITY } from "./contracts/acquisitionTerms.js";
3
+ import { acquisitionTermsSchema } from "./acquisitionTermsSchemas.js";
4
+ import { AcquisitionTermsError } from "./acquisitionTerms.js";
5
+ import { OFFER_POLICY_V2_READINESS_CONTRACT } from "./offerPolicyReadiness.js";
6
+ export const ACQUISITION_READINESS_CONTRACT = "commerce-acquisition-readiness.v1";
7
+ export function createAcquisitionReadinessCache(input) {
8
+ if (!input?.policy)
9
+ throw new AcquisitionTermsError("acquisition_terms_policy_unconfigured");
10
+ const now = input.now ?? Date.now;
11
+ const positiveTtlMs = Math.min(60_000, Math.max(0, input.positiveTtlMs ?? 60_000));
12
+ const negativeTtlMs = Math.min(5_000, Math.max(0, input.negativeTtlMs ?? 5_000));
13
+ let cached = null;
14
+ let inFlight = null;
15
+ return {
16
+ read(port) {
17
+ const current = now();
18
+ if (cached && cached.expiresAtMs > current)
19
+ return Promise.resolve(cached.readiness);
20
+ if (inFlight)
21
+ return inFlight;
22
+ const startedAtMs = current;
23
+ inFlight = loadFailClosed(port)
24
+ .then(async (readiness) => {
25
+ // An RPC started before the boundary can finish after it. Re-read once;
26
+ // never lend the old green result a fresh positive cache window.
27
+ if (readiness.ready && boundaryMs(readiness) <= now())
28
+ readiness = await loadFailClosed(port);
29
+ if (readiness.ready && boundaryMs(readiness) <= now())
30
+ readiness = unavailable("readiness_acquisition_boundary_elapsed");
31
+ cached = {
32
+ readiness,
33
+ // Bound staleness from the start of the database read. A slow RPC
34
+ // must consume the TTL, not extend a green decision past 60s.
35
+ expiresAtMs: readiness.ready ? Math.min(startedAtMs + positiveTtlMs, boundaryMs(readiness))
36
+ : startedAtMs + negativeTtlMs,
37
+ };
38
+ return readiness;
39
+ })
40
+ .finally(() => {
41
+ inFlight = null;
42
+ });
43
+ return inFlight;
44
+ },
45
+ clear() {
46
+ cached = null;
47
+ inFlight = null;
48
+ },
49
+ };
50
+ }
51
+ async function loadFailClosed(port) {
52
+ try {
53
+ const parsed = parseReadiness(await port.readOfferPolicyV2Readiness());
54
+ return parsed ?? unavailable("readiness_contract_invalid");
55
+ }
56
+ catch {
57
+ return unavailable("readiness_rpc_unavailable");
58
+ }
59
+ }
60
+ function parseReadiness(value) {
61
+ if (!value || typeof value !== "object" || Array.isArray(value))
62
+ return null;
63
+ const record = value;
64
+ if (record.contractVersion !== OFFER_POLICY_V2_READINESS_CONTRACT ||
65
+ typeof record.ready !== "boolean" ||
66
+ typeof record.checkedAt !== "string" ||
67
+ !Number.isFinite(Date.parse(record.checkedAt)) ||
68
+ !Array.isArray(record.reasons) ||
69
+ !record.reasons.every((reason) => typeof reason === "string"))
70
+ return null;
71
+ const evidence = record.evidence;
72
+ let acquisition;
73
+ if (evidence && typeof evidence === "object" && !Array.isArray(evidence) && "acquisition" in evidence) {
74
+ const raw = evidence.acquisition;
75
+ acquisition = raw === null && !record.ready ? null : parseAcquisitionEvidence(raw);
76
+ if (acquisition === undefined)
77
+ return null;
78
+ if (record.ready && acquisition && (Date.parse(acquisition.effectiveFrom) > Date.parse(record.checkedAt)
79
+ || acquisition.effectiveTo !== null && Date.parse(acquisition.effectiveTo) <= Date.parse(record.checkedAt)
80
+ || acquisition.nextBoundaryAt !== null && Date.parse(acquisition.nextBoundaryAt) <= Date.parse(record.checkedAt)))
81
+ return null;
82
+ }
83
+ return {
84
+ contractVersion: OFFER_POLICY_V2_READINESS_CONTRACT,
85
+ ready: record.ready,
86
+ checkedAt: record.checkedAt,
87
+ reasons: record.reasons,
88
+ ...(acquisition !== undefined ? { evidence: { acquisition } } : {}),
89
+ };
90
+ }
91
+ function parseAcquisitionEvidence(value) {
92
+ if (!value || typeof value !== "object" || Array.isArray(value))
93
+ return undefined;
94
+ const { contractVersion, kind, legacyPairCount, standaloneCount, nextBoundaryAt, ...terms } = value;
95
+ const parsed = acquisitionTermsSchema.safeParse({ ...terms, schemaVersion: ACQUISITION_TERMS_CAPABILITY });
96
+ if (!parsed.success || contractVersion !== ACQUISITION_READINESS_CONTRACT
97
+ || !(kind === "legacy_pair" && legacyPairCount === 1 && standaloneCount === 0
98
+ || kind === "v2_standalone" && legacyPairCount === 0 && standaloneCount === 1)
99
+ || !(nextBoundaryAt === null || z.string().datetime({ offset: true }).safeParse(nextBoundaryAt).success)
100
+ || parsed.data.effectiveTo !== null && (nextBoundaryAt === null
101
+ || Date.parse(nextBoundaryAt) > Date.parse(parsed.data.effectiveTo)))
102
+ return undefined;
103
+ const { schemaVersion: _schema, ...publicTerms } = parsed.data;
104
+ return { ...publicTerms, contractVersion, kind, legacyPairCount, standaloneCount, nextBoundaryAt };
105
+ }
106
+ function boundaryMs(readiness) {
107
+ const boundary = readiness.evidence?.acquisition?.nextBoundaryAt;
108
+ return boundary ? Date.parse(boundary) : Infinity;
109
+ }
110
+ function unavailable(reason) {
111
+ return {
112
+ contractVersion: OFFER_POLICY_V2_READINESS_CONTRACT,
113
+ ready: false,
114
+ checkedAt: new Date(0).toISOString(),
115
+ reasons: [reason],
116
+ };
117
+ }
@@ -0,0 +1,19 @@
1
+ import { type ResolvedAcquisitionTerms } from "./contracts/acquisitionTerms.js";
2
+ import type { AcquisitionFinancialPolicy } from "./acquisitionFinancialPolicy.js";
3
+ export type AcquisitionTermsRefusal = "acquisition_terms_policy_unconfigured" | "acquisition_terms_invalid" | "acquisition_terms_ambiguous" | "acquisition_terms_not_effective" | "acquisition_terms_capability_required" | "acquisition_terms_v2_required";
4
+ export declare class AcquisitionTermsError extends Error {
5
+ readonly reason: AcquisitionTermsRefusal;
6
+ constructor(reason: AcquisitionTermsRefusal);
7
+ }
8
+ export interface AcquisitionTermsSelection {
9
+ kind: "legacy_pair" | "v2_standalone" | "legacy_unconfigured";
10
+ terms: ResolvedAcquisitionTerms;
11
+ sourcePromotionId: string;
12
+ legacyPromotionId?: string;
13
+ nextBoundaryAt: string | null;
14
+ }
15
+ /** Selection never falls back from a configured but malformed or incomplete schedule. */
16
+ export declare function selectAcquisitionTerms<Row>(rows: readonly Row[], atTime: string, regionCode: string, policy: AcquisitionFinancialPolicy<Row>): AcquisitionTermsSelection | null;
17
+ /** Ordinary coupon validity and inactive rows remain owned by their evaluator. */
18
+ export declare function filterAcquisitionPromotions<Row>(rows: readonly Row[], atTime: string, regionCode: string, policy: AcquisitionFinancialPolicy<Row>): Row[];
19
+ export declare function assertAcquisitionTermsCapability(selection: AcquisitionTermsSelection | null, capability: unknown, promotionEngineVersion: unknown): void;
@@ -0,0 +1,126 @@
1
+ import { ACQUISITION_TERMS_CAPABILITY } from "./contracts/acquisitionTerms.js";
2
+ import { acquisitionTermsMetadataSchema, resolvedAcquisitionTermsSchema } from "./acquisitionTermsSchemas.js";
3
+ export class AcquisitionTermsError extends Error {
4
+ reason;
5
+ constructor(reason) {
6
+ super(reason);
7
+ this.reason = reason;
8
+ this.name = "AcquisitionTermsError";
9
+ }
10
+ }
11
+ function requirePolicy(policy) {
12
+ if (!policy)
13
+ throw new AcquisitionTermsError("acquisition_terms_policy_unconfigured");
14
+ }
15
+ function effective(row, at, policy) {
16
+ const facts = policy.facts(row);
17
+ return Date.parse(facts.validFrom) <= at && (facts.validTo === null || Date.parse(facts.validTo) > at);
18
+ }
19
+ function metadata(row, policy) {
20
+ const parsed = acquisitionTermsMetadataSchema.safeParse(policy.facts(row).metadata);
21
+ if (!parsed.success)
22
+ throw new AcquisitionTermsError("acquisition_terms_invalid");
23
+ policy.validateMetadata(row, parsed.data);
24
+ return parsed.data;
25
+ }
26
+ function resolved(row, terms, policy, purpose = "resolved_target") {
27
+ const facts = policy.facts(row);
28
+ const parsed = resolvedAcquisitionTermsSchema.safeParse({ ...terms,
29
+ initialDiscountBps: policy.initialDiscountBps(row, purpose), effectiveFrom: facts.validFrom,
30
+ effectiveTo: facts.validTo, sourcePromotionId: facts.id });
31
+ if (!parsed.success)
32
+ throw new AcquisitionTermsError("acquisition_terms_invalid");
33
+ return { ...parsed.data, effectiveFrom: new Date(parsed.data.effectiveFrom).toISOString(),
34
+ effectiveTo: parsed.data.effectiveTo === null ? null : new Date(parsed.data.effectiveTo).toISOString() };
35
+ }
36
+ /** Selection never falls back from a configured but malformed or incomplete schedule. */
37
+ export function selectAcquisitionTerms(rows, atTime, regionCode, policy) {
38
+ requirePolicy(policy);
39
+ const at = Date.parse(atTime);
40
+ if (!Number.isFinite(at))
41
+ throw new AcquisitionTermsError("acquisition_terms_invalid");
42
+ const scoped = rows.filter((row) => policy.facts(row).active && policy.facts(row).regionCodes.includes(regionCode));
43
+ const tagged = scoped.filter((row) => policy.facts(row).metadataPresent);
44
+ if (tagged.length === 0) {
45
+ const legacyRows = scoped.filter((row) => policy.classify(row).unconfiguredLegacyEligible);
46
+ const knownPairs = legacyRows.flatMap((legacy) => scoped.filter((mirror) => policy.classify(mirror).target
47
+ && policy.pairMatches(legacy, mirror)).map((mirror) => ({ legacy, mirror })));
48
+ const pairs = knownPairs.filter(({ mirror }) => effective(mirror, at, policy));
49
+ if (pairs.length > 1)
50
+ throw new AcquisitionTermsError("acquisition_terms_ambiguous");
51
+ if (pairs.length === 0) {
52
+ if (knownPairs.length)
53
+ throw new AcquisitionTermsError("acquisition_terms_not_effective");
54
+ return null;
55
+ }
56
+ const { legacy, mirror } = pairs[0];
57
+ const terms = resolved(mirror, policy.unconfiguredTerms(legacy, mirror), policy);
58
+ return { kind: "legacy_unconfigured", terms, sourcePromotionId: policy.facts(mirror).id,
59
+ legacyPromotionId: policy.facts(legacy).id, nextBoundaryAt: terms.effectiveTo };
60
+ }
61
+ const grouped = new Map();
62
+ for (const row of tagged) {
63
+ const parsed = metadata(row, policy);
64
+ const group = grouped.get(parsed.revision) ?? [];
65
+ group.push(row);
66
+ grouped.set(parsed.revision, group);
67
+ }
68
+ const selections = [];
69
+ for (const group of grouped.values()) {
70
+ const mirrors = group.filter((row) => policy.classify(row).target);
71
+ const legacy = group.filter((row) => policy.classify(row).baselineLegacy);
72
+ if (mirrors.length !== 1 || legacy.length > 1 || group.length !== mirrors.length + legacy.length) {
73
+ throw new AcquisitionTermsError("acquisition_terms_ambiguous");
74
+ }
75
+ const mirror = mirrors[0];
76
+ if (legacy.length === 1 ? !policy.pairMatches(legacy[0], mirror) : policy.facts(mirror).mirrorOf != null) {
77
+ throw new AcquisitionTermsError("acquisition_terms_invalid");
78
+ }
79
+ const terms = resolved(mirror, metadata(mirror, policy), policy);
80
+ selections.push({ kind: legacy.length ? "legacy_pair" : "v2_standalone", terms,
81
+ sourcePromotionId: policy.facts(mirror).id, ...(legacy.length ? { legacyPromotionId: policy.facts(legacy[0]).id } : {}), nextBoundaryAt: null });
82
+ }
83
+ selections.sort((a, b) => Date.parse(a.terms.effectiveFrom) - Date.parse(b.terms.effectiveFrom));
84
+ for (let i = 1; i < selections.length; i++) {
85
+ const previousEnd = selections[i - 1].terms.effectiveTo;
86
+ const start = Date.parse(selections[i].terms.effectiveFrom);
87
+ if (previousEnd === null || Date.parse(previousEnd) > start)
88
+ throw new AcquisitionTermsError("acquisition_terms_ambiguous");
89
+ if (Date.parse(previousEnd) < start)
90
+ throw new AcquisitionTermsError("acquisition_terms_not_effective");
91
+ }
92
+ const current = selections.filter(({ terms }) => Date.parse(terms.effectiveFrom) <= at
93
+ && (terms.effectiveTo === null || Date.parse(terms.effectiveTo) > at));
94
+ if (current.length !== 1)
95
+ throw new AcquisitionTermsError("acquisition_terms_not_effective");
96
+ if (scoped.some((row) => !policy.facts(row).metadataPresent && policy.classify(row).canonicalRow && effective(row, at, policy))) {
97
+ throw new AcquisitionTermsError("acquisition_terms_invalid");
98
+ }
99
+ const boundaries = selections.flatMap(({ terms }) => [terms.effectiveFrom, terms.effectiveTo])
100
+ .filter((instant) => instant !== null && Date.parse(instant) > at).sort();
101
+ return { ...current[0], nextBoundaryAt: boundaries[0] ?? null };
102
+ }
103
+ /** Ordinary coupon validity and inactive rows remain owned by their evaluator. */
104
+ export function filterAcquisitionPromotions(rows, atTime, regionCode, policy) {
105
+ requirePolicy(policy);
106
+ const at = Date.parse(atTime);
107
+ if (!Number.isFinite(at))
108
+ throw new AcquisitionTermsError("acquisition_terms_invalid");
109
+ return rows.filter((row) => {
110
+ if (!policy.facts(row).regionCodes.includes(regionCode) || !policy.classify(row).canonicalRow)
111
+ return true;
112
+ if (policy.facts(row).metadataPresent) {
113
+ const parsed = metadata(row, policy);
114
+ resolved(row, parsed, policy, "filter_validation");
115
+ }
116
+ return effective(row, at, policy);
117
+ });
118
+ }
119
+ export function assertAcquisitionTermsCapability(selection, capability, promotionEngineVersion) {
120
+ if (!selection || selection.kind !== "v2_standalone")
121
+ return;
122
+ if (capability !== ACQUISITION_TERMS_CAPABILITY)
123
+ throw new AcquisitionTermsError("acquisition_terms_capability_required");
124
+ if (promotionEngineVersion !== "promotion-engine.v2")
125
+ throw new AcquisitionTermsError("acquisition_terms_v2_required");
126
+ }
@@ -0,0 +1,59 @@
1
+ import { z } from "zod";
2
+ import { type AcquisitionTerms, type ResolvedAcquisitionTerms } from "./contracts/acquisitionTerms.js";
3
+ export declare const acquisitionCapabilitySchema: z.ZodLiteral<"subscription-acquisition.v1">;
4
+ /** Only these extra terms are stored; promotion benefit and validity remain authoritative. */
5
+ export declare const acquisitionTermsMetadataSchema: z.ZodObject<{
6
+ schemaVersion: z.ZodLiteral<"subscription-acquisition.v1">;
7
+ revision: z.ZodString;
8
+ delivery2DiscountBps: z.ZodNumber;
9
+ }, z.core.$strict>;
10
+ export declare const acquisitionTermsSchema: z.ZodObject<{
11
+ initialDiscountBps: z.ZodNumber;
12
+ effectiveFrom: z.ZodString;
13
+ effectiveTo: z.ZodNullable<z.ZodString>;
14
+ schemaVersion: z.ZodLiteral<"subscription-acquisition.v1">;
15
+ revision: z.ZodString;
16
+ delivery2DiscountBps: z.ZodNumber;
17
+ }, z.core.$strict>;
18
+ export declare const resolvedAcquisitionTermsSchema: z.ZodObject<{
19
+ sourcePromotionId: z.ZodString;
20
+ initialDiscountBps: z.ZodNumber;
21
+ effectiveFrom: z.ZodString;
22
+ effectiveTo: z.ZodNullable<z.ZodString>;
23
+ schemaVersion: z.ZodLiteral<"subscription-acquisition.v1">;
24
+ revision: z.ZodString;
25
+ delivery2DiscountBps: z.ZodNumber;
26
+ }, z.core.$strict>;
27
+ export declare const acquisitionTermsExpectationSchema: z.ZodObject<{
28
+ revision: z.ZodString;
29
+ delivery2DiscountBps: z.ZodNumber;
30
+ }, z.core.$strict>;
31
+ export declare function projectAcquisitionTerms(terms: ResolvedAcquisitionTerms): AcquisitionTerms;
32
+ /** Compose only at an opted-in host boundary; preserve its existing refinements. */
33
+ export declare function createAcquisitionQuoteSchemas<Request extends z.ZodObject, Context extends z.ZodObject, Quote extends z.ZodObject>(input: {
34
+ request: Request;
35
+ context: Context;
36
+ quote: Quote;
37
+ }): {
38
+ request: z.ZodObject<{
39
+ [x: string]: any;
40
+ acquisitionCapability: z.ZodOptional<z.ZodLiteral<"subscription-acquisition.v1">>;
41
+ }, z.core.$strip>;
42
+ context: z.ZodObject<{
43
+ [x: string]: any;
44
+ acquisitionCapability: z.ZodOptional<z.ZodLiteral<"subscription-acquisition.v1">>;
45
+ atTime: z.ZodOptional<z.ZodString>;
46
+ }, z.core.$strip>;
47
+ quote: z.ZodObject<{
48
+ [x: string]: any;
49
+ acquisitionTerms: z.ZodOptional<z.ZodObject<{
50
+ sourcePromotionId: z.ZodString;
51
+ initialDiscountBps: z.ZodNumber;
52
+ effectiveFrom: z.ZodString;
53
+ effectiveTo: z.ZodNullable<z.ZodString>;
54
+ schemaVersion: z.ZodLiteral<"subscription-acquisition.v1">;
55
+ revision: z.ZodString;
56
+ delivery2DiscountBps: z.ZodNumber;
57
+ }, z.core.$strict>>;
58
+ }, z.core.$strip>;
59
+ };
@@ -0,0 +1,42 @@
1
+ import { z } from "zod";
2
+ import { ACQUISITION_TERMS_CAPABILITY } from "./contracts/acquisitionTerms.js";
3
+ export const acquisitionCapabilitySchema = z.literal(ACQUISITION_TERMS_CAPABILITY);
4
+ const revisionSchema = z.string().min(1).max(80).regex(/^[A-Za-z0-9][A-Za-z0-9._:-]*$/);
5
+ const bpsSchema = z.number().int().min(0).max(10_000);
6
+ const instantSchema = z.string().datetime({ offset: true });
7
+ /** Only these extra terms are stored; promotion benefit and validity remain authoritative. */
8
+ export const acquisitionTermsMetadataSchema = z.object({
9
+ schemaVersion: acquisitionCapabilitySchema,
10
+ revision: revisionSchema,
11
+ delivery2DiscountBps: bpsSchema,
12
+ }).strict();
13
+ const termsShape = {
14
+ ...acquisitionTermsMetadataSchema.shape,
15
+ initialDiscountBps: bpsSchema,
16
+ effectiveFrom: instantSchema,
17
+ effectiveTo: instantSchema.nullable(),
18
+ };
19
+ const validWindow = (terms) => typeof terms.effectiveFrom === "string" && (terms.effectiveTo === null
20
+ || typeof terms.effectiveTo === "string" && Date.parse(terms.effectiveTo) > Date.parse(terms.effectiveFrom));
21
+ export const acquisitionTermsSchema = z.object(termsShape).strict()
22
+ .refine(validWindow, { message: "Acquisition terms require a nonempty effective interval" });
23
+ export const resolvedAcquisitionTermsSchema = z.object({
24
+ ...termsShape,
25
+ sourcePromotionId: z.string().min(1).max(120),
26
+ }).strict().refine(validWindow, { message: "Acquisition terms require a nonempty effective interval" });
27
+ export const acquisitionTermsExpectationSchema = z.object({
28
+ revision: revisionSchema,
29
+ delivery2DiscountBps: bpsSchema,
30
+ }).strict();
31
+ export function projectAcquisitionTerms(terms) {
32
+ const { sourcePromotionId: _source, ...publicTerms } = resolvedAcquisitionTermsSchema.parse(terms);
33
+ return publicTerms;
34
+ }
35
+ /** Compose only at an opted-in host boundary; preserve its existing refinements. */
36
+ export function createAcquisitionQuoteSchemas(input) {
37
+ return {
38
+ request: input.request.safeExtend({ acquisitionCapability: acquisitionCapabilitySchema.optional() }),
39
+ context: input.context.safeExtend({ acquisitionCapability: acquisitionCapabilitySchema.optional(), atTime: instantSchema.optional() }),
40
+ quote: input.quote.safeExtend({ acquisitionTerms: resolvedAcquisitionTermsSchema.optional() }),
41
+ };
42
+ }
@@ -0,0 +1,33 @@
1
+ import type { CatalogFactsProvenance } from "./contracts/provenance.js";
2
+ import type { CreateQuoteResponse } from "./contracts/quote.js";
3
+ import type { CommerceQuoteCatalogItem } from "./commerceQuoteCatalogReadPort.js";
4
+ type ResolvedPriceObservation = {
5
+ priceEntryId: string;
6
+ unitPriceMinor: number;
7
+ };
8
+ type StrictCatalogFactsItem = CommerceQuoteCatalogItem & {
9
+ documentRevision: {
10
+ id: string;
11
+ digest: string;
12
+ };
13
+ };
14
+ type PolicyDerivedSubscriptionFacts = {
15
+ policyRevisionId: string;
16
+ policyDigest: string;
17
+ };
18
+ export declare function createCatalogFactsProvenance(input: {
19
+ item: StrictCatalogFactsItem;
20
+ resolved: ResolvedPriceObservation;
21
+ base: ResolvedPriceObservation;
22
+ mode: "one_time" | "subscription";
23
+ atTime: string;
24
+ currency: string;
25
+ resolvedUnitAmountMinor: number;
26
+ resolvedLineAmountMinor: number;
27
+ baseUnitAmountMinor: number;
28
+ policy?: PolicyDerivedSubscriptionFacts;
29
+ }): CatalogFactsProvenance;
30
+ export declare function catalogFactsForQuoteLine(enabled: boolean, item: CommerceQuoteCatalogItem, resolved: ResolvedPriceObservation, base: ResolvedPriceObservation, mode: "one_time" | "subscription", atTime: string, currency: string, resolvedUnitAmountMinor: number, resolvedLineAmountMinor: number, baseUnitAmountMinor: number, policy?: PolicyDerivedSubscriptionFacts): CatalogFactsProvenance | undefined;
31
+ /** Public responses retain every money field but never server-only catalog identifiers. */
32
+ export declare function projectPublicQuoteSnapshot<Snapshot extends CreateQuoteResponse>(snapshot: Snapshot): Snapshot;
33
+ export {};