@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,196 @@
1
+ import { z } from "zod";
2
+ import { COMMERCE_CONTRACT_VERSION } from "./contracts/quote.js";
3
+ import { createCommerceQuotePrimitives } from "./quotePrimitives.js";
4
+ import { catalogFactsProvenanceSchema, rejectCatalogFactsFromPublicQuote } from "./catalogFactsSchemas.js";
5
+ import { quoteDiscountSchema } from "./quotePromotionEvidence.js";
6
+ import { quoteCodeRejectionDetailSchema } from "./quoteCodeRejectionDetails.js";
7
+ /** Split gross tax-included money into net/VAT using an explicit tax rate. */
8
+ export function splitIncludedVat(grossMinor, vatRateBps) {
9
+ const netMinor = Math.round((grossMinor * 10_000) / (10_000 + vatRateBps));
10
+ const vatMinor = grossMinor - netMinor;
11
+ return { netMinor, vatMinor };
12
+ }
13
+ /** Backstop: every Money in a quote must use the quote's own currency. */
14
+ export function quoteMoneyCurrenciesMatch(quote) {
15
+ const monies = [
16
+ quote.subtotalGross,
17
+ quote.discountTotalGross,
18
+ ...(quote.shippingGross ? [quote.shippingGross] : []),
19
+ ...(quote.shippingDiscountGross ? [quote.shippingDiscountGross] : []),
20
+ quote.totalGross,
21
+ quote.netTotal,
22
+ quote.taxTotal,
23
+ ...quote.lines.flatMap((line) => [
24
+ line.unitPriceGross,
25
+ line.lineSubtotalGross,
26
+ line.tax.netAmount,
27
+ line.tax.vatAmount,
28
+ line.tax.grossAmount,
29
+ ]),
30
+ ];
31
+ return monies.every((money) => money.currency === quote.currency);
32
+ }
33
+ /** Preserve quote validation while hosts bind currency, product identifiers and context. */
34
+ export function createCommerceQuoteSchemas(input) {
35
+ const { commerceCurrencySchema, commerceMoneySchema, commerceSkuSchema, commerceTaxCategorySchema, commerceTaxCountrySchema, commerceTaxLegalBasisSchema } = createCommerceQuotePrimitives(input.currencySchema);
36
+ const commerceProductSlugSchema = input.productSlugSchema;
37
+ const quoteContextSchema = input.contextSchema;
38
+ const quotePricingComponentSchema = z
39
+ .object({
40
+ scope: z.enum(["line", "order"]),
41
+ componentType: z.enum(["base_unit", "mode_discount", "qty_tier", "promo", "loyalty", "shipping", "bundle"]),
42
+ amountMinor: z.number().int(),
43
+ reasonCode: z.string().trim().min(1).max(120),
44
+ reasonPayload: z.record(z.string(), z.unknown()).default({}),
45
+ })
46
+ .strict();
47
+ const cartLineInputSchema = z.object({
48
+ sku: commerceSkuSchema,
49
+ quantity: z.number().int().min(1).max(99),
50
+ variantId: z.string().trim().min(1).max(120).optional(),
51
+ modeAtLine: z.enum(["one_time", "subscription"]).optional(),
52
+ isAddon: z.boolean().optional(),
53
+ });
54
+ const commerceTaxBreakdownSchema = z
55
+ .object({
56
+ included: z.literal(true),
57
+ country: commerceTaxCountrySchema,
58
+ category: commerceTaxCategorySchema,
59
+ vatRateBps: z.number().int().min(0).max(10_000),
60
+ legalBasis: commerceTaxLegalBasisSchema,
61
+ netAmount: commerceMoneySchema,
62
+ vatAmount: commerceMoneySchema,
63
+ grossAmount: commerceMoneySchema,
64
+ })
65
+ .refine((tax) => tax.netAmount.currency === tax.vatAmount.currency &&
66
+ tax.netAmount.currency === tax.grossAmount.currency &&
67
+ tax.netAmount.amountMinor + tax.vatAmount.amountMinor === tax.grossAmount.amountMinor, {
68
+ message: "tax net and VAT amounts must add up to gross amount",
69
+ path: ["grossAmount"],
70
+ });
71
+ const quoteLineSchema = z
72
+ .object({
73
+ sku: commerceSkuSchema,
74
+ productSlug: commerceProductSlugSchema,
75
+ quantity: z.number().int().min(1).max(99),
76
+ unitPriceGross: commerceMoneySchema,
77
+ lineSubtotalGross: commerceMoneySchema,
78
+ tax: commerceTaxBreakdownSchema,
79
+ pricingComponents: z.array(quotePricingComponentSchema).optional(),
80
+ catalogFacts: catalogFactsProvenanceSchema.optional(),
81
+ })
82
+ .refine((line) => line.unitPriceGross.currency === line.lineSubtotalGross.currency &&
83
+ line.lineSubtotalGross.currency === line.tax.grossAmount.currency &&
84
+ line.unitPriceGross.amountMinor * line.quantity === line.lineSubtotalGross.amountMinor, {
85
+ message: "quote line subtotal must match unit price and quantity",
86
+ path: ["lineSubtotalGross"],
87
+ });
88
+ const quoteCodeRejectionSchema = z
89
+ .object({
90
+ code: z.string().trim().min(1).max(80),
91
+ reason: z.enum([
92
+ "not_recognized",
93
+ "already_used",
94
+ "not_eligible",
95
+ "expired",
96
+ "better_price_exists",
97
+ "scope_not_applicable",
98
+ ]),
99
+ })
100
+ .strict();
101
+ const commerceQuoteSchema = z
102
+ .object({
103
+ currency: commerceCurrencySchema,
104
+ taxIncluded: z.literal(true),
105
+ lines: z.array(quoteLineSchema).min(1).max(50),
106
+ discounts: z.array(quoteDiscountSchema).max(20),
107
+ codeRejections: z.array(quoteCodeRejectionSchema).max(20).optional(),
108
+ codeRejectionDetails: z.array(quoteCodeRejectionDetailSchema).max(20).optional(),
109
+ pricingComponents: z.array(quotePricingComponentSchema).optional(),
110
+ context: quoteContextSchema.optional(),
111
+ subtotalGross: commerceMoneySchema,
112
+ discountTotalGross: commerceMoneySchema,
113
+ // Shipping/discount tax split uses one quote rate; mixed-tax allocation is out of scope.
114
+ shippingGross: commerceMoneySchema.optional(),
115
+ shippingDiscountGross: commerceMoneySchema.optional(),
116
+ totalGross: commerceMoneySchema,
117
+ netTotal: commerceMoneySchema,
118
+ taxTotal: commerceMoneySchema,
119
+ })
120
+ .refine((quote) => quote.lines.every((line) => line.tax.vatRateBps === quote.lines[0]?.tax.vatRateBps), {
121
+ message: "mixed VAT rates are not supported by quote discount and shipping tax allocation",
122
+ path: ["lines"],
123
+ })
124
+ .refine((quote) => {
125
+ const subtotal = sumAmounts(quote.lines.map((line) => line.lineSubtotalGross));
126
+ const lineNet = sumAmounts(quote.lines.map((line) => line.tax.netAmount));
127
+ const lineVat = sumAmounts(quote.lines.map((line) => line.tax.vatAmount));
128
+ const vatRateBps = quote.lines[0]?.tax.vatRateBps ?? 0;
129
+ const singleTaxRate = quote.lines.every((line) => line.tax.vatRateBps === vatRateBps);
130
+ const discountTotal = quote.discountTotalGross.amountMinor;
131
+ const orderDiscountSum = quote.discounts
132
+ .filter((discount) => discount.appliesTo !== "shipping")
133
+ .reduce((sum, discount) => sum + discount.amountOffMinor, 0);
134
+ const shippingDiscountSum = quote.discounts
135
+ .filter((discount) => discount.appliesTo === "shipping")
136
+ .reduce((sum, discount) => sum + discount.amountOffMinor, 0);
137
+ const shippingGross = quote.shippingGross?.amountMinor ?? 0;
138
+ const shippingDiscount = quote.shippingDiscountGross?.amountMinor ?? 0;
139
+ const { netMinor: discountNet, vatMinor: discountVat } = splitIncludedVat(discountTotal, vatRateBps);
140
+ const { netMinor: shipNet, vatMinor: shipVat } = splitIncludedVat(shippingGross, vatRateBps);
141
+ const { netMinor: shipDiscNet, vatMinor: shipDiscVat } = splitIncludedVat(shippingDiscount, vatRateBps);
142
+ return (singleTaxRate &&
143
+ quote.subtotalGross.amountMinor === subtotal &&
144
+ discountTotal >= 0 &&
145
+ discountTotal <= subtotal &&
146
+ orderDiscountSum === discountTotal &&
147
+ shippingGross >= 0 &&
148
+ shippingDiscount >= 0 &&
149
+ shippingDiscount <= shippingGross &&
150
+ shippingDiscountSum === shippingDiscount &&
151
+ quote.totalGross.amountMinor === subtotal - discountTotal + shippingGross - shippingDiscount &&
152
+ quote.netTotal.amountMinor === lineNet - discountNet + shipNet - shipDiscNet &&
153
+ quote.taxTotal.amountMinor === lineVat - discountVat + shipVat - shipDiscVat &&
154
+ quote.netTotal.amountMinor + quote.taxTotal.amountMinor === quote.totalGross.amountMinor);
155
+ }, {
156
+ message: "quote totals must match quote lines, discounts and shipping",
157
+ path: ["totalGross"],
158
+ })
159
+ // The currency backstop reads the validated money fields.
160
+ .refine((quote) => quoteMoneyCurrenciesMatch(quote), {
161
+ message: "all quote money amounts must use the quote currency",
162
+ path: ["currency"],
163
+ });
164
+ const createQuoteRequestSchema = z.object({
165
+ mode: z.enum(["one_time", "subscription"]).default("one_time"),
166
+ lines: z.array(cartLineInputSchema).min(1).max(50),
167
+ cadenceDays: z.number().int().positive().max(120).nullable().optional(),
168
+ promoCodes: z.array(z.string().trim().min(1).max(80)).max(20).default([]),
169
+ }).superRefine(validateQuoteRequest);
170
+ const createQuoteResponseSchema = z.object({
171
+ contractVersion: z.literal(COMMERCE_CONTRACT_VERSION), quote: commerceQuoteSchema,
172
+ }).strict();
173
+ const publicCreateQuoteResponseSchema = createQuoteResponseSchema.extend({
174
+ promotionAcceptanceToken: z.string().min(1).max(8_300).optional(),
175
+ }).superRefine(rejectCatalogFactsFromPublicQuote);
176
+ const createQuoteBatchResponseSchema = z.object({
177
+ contractVersion: z.literal(COMMERCE_CONTRACT_VERSION), quotes: z.array(commerceQuoteSchema),
178
+ });
179
+ const publicCreateQuoteBatchResponseSchema = createQuoteBatchResponseSchema
180
+ .superRefine((response, ctx) => response.quotes.forEach((quote, index) => rejectCatalogFactsFromPublicQuote({ quote }, ctx, ["quotes", index])));
181
+ return { createQuoteRequestSchema, quotePricingComponentSchema, cartLineInputSchema, commerceTaxBreakdownSchema, quoteLineSchema,
182
+ quoteCodeRejectionSchema, commerceQuoteSchema, createQuoteResponseSchema, publicCreateQuoteResponseSchema,
183
+ createQuoteBatchResponseSchema, publicCreateQuoteBatchResponseSchema };
184
+ }
185
+ function sumAmounts(amounts) {
186
+ return amounts.reduce((sum, amount) => sum + (amount.amountMinor ?? 0), 0);
187
+ }
188
+ function validateQuoteRequest(request, ctx) {
189
+ if (request.mode === "subscription" && !request.cadenceDays) {
190
+ ctx.addIssue({
191
+ code: z.ZodIssueCode.custom,
192
+ message: "subscription quote requires cadenceDays",
193
+ path: ["cadenceDays"],
194
+ });
195
+ }
196
+ }
@@ -0,0 +1,20 @@
1
+ import type { ShippingTerms } from "../shipping/index.js";
2
+ import type { ResolvedAcquisitionTerms } from "./contracts/acquisitionTerms.js";
3
+ import type { CreateQuoteRequest } from "./contracts/quote.js";
4
+ import type { CreateQuoteOptions } from "./quotePorts.js";
5
+ import type { QuotePromotionResult } from "./dbBackedCommerceQuotePort.js";
6
+ export interface QuoteShippingPromotionInput<Request extends CreateQuoteRequest> {
7
+ request: Request;
8
+ options?: CreateQuoteOptions;
9
+ regionCode: string;
10
+ currency: string;
11
+ referenceProductMinor: number;
12
+ subtotalGrossMinor: number;
13
+ atTime: string;
14
+ }
15
+ export interface QuoteShippingPromotionResult extends QuotePromotionResult {
16
+ shippingGrossMinor: number;
17
+ hasShipping: boolean;
18
+ shippingTerms?: ShippingTerms;
19
+ acquisitionTerms?: ResolvedAcquisitionTerms;
20
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,52 @@
1
+ import { type SubscriptionPricePolicySemantics, type SubscriptionPricePolicyCanonicalInput, type SubscriptionPricePolicyRevision, type SubscriptionPricePolicyDigestRefusal } from "./contracts/index.js";
2
+ import { z } from "./validation.js";
3
+ export declare const subscriptionPricePolicySemanticsSchema: z.ZodObject<{
4
+ discountBps: z.ZodNumber;
5
+ roundingQuantumMinor: z.ZodNumber;
6
+ roundingRule: z.ZodEnum<{
7
+ FLOOR_TO_QUANTUM: "FLOOR_TO_QUANTUM";
8
+ }>;
9
+ }, z.core.$strict>;
10
+ export declare const subscriptionPricePolicyCanonicalInputSchema: z.ZodObject<{
11
+ discountBps: z.ZodNumber;
12
+ roundingQuantumMinor: z.ZodNumber;
13
+ roundingRule: z.ZodEnum<{
14
+ FLOOR_TO_QUANTUM: "FLOOR_TO_QUANTUM";
15
+ }>;
16
+ id: z.ZodGUID;
17
+ revisionNo: z.ZodNumber;
18
+ priceListId: z.ZodGUID;
19
+ regionCode: z.ZodString;
20
+ currency: z.ZodString;
21
+ channel: z.ZodString;
22
+ effectiveFrom: z.ZodString;
23
+ effectiveTo: z.ZodNullable<z.ZodString>;
24
+ }, z.core.$strict>;
25
+ export declare const subscriptionPricePolicyRevisionSchema: z.ZodObject<{
26
+ discountBps: z.ZodNumber;
27
+ roundingQuantumMinor: z.ZodNumber;
28
+ roundingRule: z.ZodEnum<{
29
+ FLOOR_TO_QUANTUM: "FLOOR_TO_QUANTUM";
30
+ }>;
31
+ id: z.ZodGUID;
32
+ revisionNo: z.ZodNumber;
33
+ priceListId: z.ZodGUID;
34
+ regionCode: z.ZodString;
35
+ currency: z.ZodString;
36
+ channel: z.ZodString;
37
+ effectiveFrom: z.ZodString;
38
+ effectiveTo: z.ZodNullable<z.ZodString>;
39
+ digest: z.ZodString;
40
+ }, z.core.$strict>;
41
+ export declare class SubscriptionPricePolicyDigestError extends Error {
42
+ readonly code: SubscriptionPricePolicyDigestRefusal;
43
+ constructor(code: SubscriptionPricePolicyDigestRefusal);
44
+ }
45
+ /** The exact tuple whose canonical digest is persisted with a policy revision. */
46
+ export declare function canonicalSubscriptionPricePolicyTuple(policy: SubscriptionPricePolicyCanonicalInput | SubscriptionPricePolicyRevision): string;
47
+ /** Hashes application-owned canonical UTF-8 bytes; never a database JSON rendering. */
48
+ export declare function digestSubscriptionPricePolicy(policy: SubscriptionPricePolicyCanonicalInput | SubscriptionPricePolicyRevision): Promise<string>;
49
+ /** Parses a persisted revision and refuses a digest outside its canonical UTF-8 tuple. */
50
+ export declare function assertSubscriptionPricePolicyDigest(value: unknown): Promise<SubscriptionPricePolicyRevision>;
51
+ /** Resolves a subscription unit price from a base unit price and a policy revision. */
52
+ export declare function deriveSubscriptionUnitPrice(baseUnitAmountMinor: number, semantics: SubscriptionPricePolicySemantics | SubscriptionPricePolicyCanonicalInput | SubscriptionPricePolicyRevision): number;
@@ -0,0 +1,96 @@
1
+ import { SUBSCRIPTION_PRICE_POLICY_SCHEMA_VERSION } from "./contracts/index.js";
2
+ import { z } from "./validation.js";
3
+ const uuidSchema = z.guid();
4
+ const sha256DigestSchema = z.string().regex(/^[a-f0-9]{64}$/u);
5
+ const currencySchema = z.string().regex(/^[A-Z]{3}$/u);
6
+ const channelSchema = z.string().trim().min(1).max(64).regex(/^[A-Za-z0-9._:-]+$/);
7
+ export const subscriptionPricePolicySemanticsSchema = z.object({
8
+ discountBps: z.number().int().min(0).max(10_000),
9
+ roundingQuantumMinor: z.number().int().positive().refine(Number.isSafeInteger, "rounding quantum must be a safe integer"),
10
+ roundingRule: z.enum(["FLOOR_TO_QUANTUM"]),
11
+ }).strict();
12
+ const subscriptionPricePolicyRevisionFields = {
13
+ id: uuidSchema,
14
+ revisionNo: z.number().int().positive(),
15
+ priceListId: uuidSchema,
16
+ regionCode: z.string().regex(/^[A-Z]{2,3}$/u),
17
+ currency: currencySchema,
18
+ channel: channelSchema,
19
+ effectiveFrom: z.string().datetime({ offset: true }),
20
+ effectiveTo: z.string().datetime({ offset: true }).nullable(),
21
+ ...subscriptionPricePolicySemanticsSchema.shape,
22
+ };
23
+ export const subscriptionPricePolicyCanonicalInputSchema = z.object(subscriptionPricePolicyRevisionFields).strict().superRefine((policy, context) => {
24
+ if (policy.effectiveTo && policy.effectiveTo <= policy.effectiveFrom) {
25
+ context.addIssue({ code: z.ZodIssueCode.custom, path: ["effectiveTo"], message: "effectiveTo must be later than effectiveFrom" });
26
+ }
27
+ });
28
+ export const subscriptionPricePolicyRevisionSchema = subscriptionPricePolicyCanonicalInputSchema.extend({
29
+ digest: sha256DigestSchema,
30
+ }).strict();
31
+ export class SubscriptionPricePolicyDigestError extends Error {
32
+ code;
33
+ constructor(code) {
34
+ super(code);
35
+ this.code = code;
36
+ this.name = "SubscriptionPricePolicyDigestError";
37
+ }
38
+ }
39
+ /** The exact tuple whose canonical digest is persisted with a policy revision. */
40
+ export function canonicalSubscriptionPricePolicyTuple(policy) {
41
+ const value = parseCanonicalPolicyInput(policy);
42
+ return JSON.stringify({
43
+ schemaVersion: SUBSCRIPTION_PRICE_POLICY_SCHEMA_VERSION,
44
+ id: value.id,
45
+ revisionNo: value.revisionNo,
46
+ priceListId: value.priceListId,
47
+ regionCode: value.regionCode,
48
+ currency: value.currency,
49
+ channel: value.channel,
50
+ effectiveFrom: value.effectiveFrom,
51
+ effectiveTo: value.effectiveTo,
52
+ discountBps: value.discountBps,
53
+ roundingQuantumMinor: value.roundingQuantumMinor,
54
+ roundingRule: value.roundingRule,
55
+ });
56
+ }
57
+ /** Hashes application-owned canonical UTF-8 bytes; never a database JSON rendering. */
58
+ export async function digestSubscriptionPricePolicy(policy) {
59
+ const bytes = new TextEncoder().encode(canonicalSubscriptionPricePolicyTuple(policy));
60
+ const crypto = globalThis.crypto;
61
+ if (!crypto?.subtle)
62
+ throw new Error("Web Crypto SHA-256 is unavailable");
63
+ const digest = await crypto.subtle.digest("SHA-256", bytes);
64
+ return Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, "0")).join("");
65
+ }
66
+ /** Parses a persisted revision and refuses a digest outside its canonical UTF-8 tuple. */
67
+ export async function assertSubscriptionPricePolicyDigest(value) {
68
+ const revision = subscriptionPricePolicyRevisionSchema.parse(value);
69
+ const actual = await digestSubscriptionPricePolicy(revision);
70
+ if (actual !== revision.digest) {
71
+ throw new SubscriptionPricePolicyDigestError("subscription_price_policy_digest_mismatch");
72
+ }
73
+ return revision;
74
+ }
75
+ /** Resolves a subscription unit price from a base unit price and a policy revision. */
76
+ export function deriveSubscriptionUnitPrice(baseUnitAmountMinor, semantics) {
77
+ if (!Number.isSafeInteger(baseUnitAmountMinor) || baseUnitAmountMinor < 0) {
78
+ throw new RangeError("baseUnitAmountMinor must be a non-negative safe integer");
79
+ }
80
+ const policy = subscriptionPricePolicySemanticsSchema.parse({
81
+ discountBps: semantics.discountBps,
82
+ roundingQuantumMinor: semantics.roundingQuantumMinor,
83
+ roundingRule: semantics.roundingRule,
84
+ });
85
+ const discounted = (BigInt(baseUnitAmountMinor) * BigInt(10_000 - policy.discountBps)) / 10000n;
86
+ const quantum = BigInt(policy.roundingQuantumMinor);
87
+ const resolved = (discounted / quantum) * quantum;
88
+ if (resolved > BigInt(Number.MAX_SAFE_INTEGER)) {
89
+ throw new RangeError("resolved subscription price exceeds Number.MAX_SAFE_INTEGER");
90
+ }
91
+ return Number(resolved);
92
+ }
93
+ function parseCanonicalPolicyInput(value) {
94
+ const persisted = subscriptionPricePolicyRevisionSchema.safeParse(value);
95
+ return persisted.success ? persisted.data : subscriptionPricePolicyCanonicalInputSchema.parse(value);
96
+ }
@@ -0,0 +1,2 @@
1
+ import type { CommerceTaxProfile } from "./contracts/money.js";
2
+ export declare function assertSupportedCommerceTaxProfile(taxProfile: CommerceTaxProfile, supportedTaxProfiles: readonly CommerceTaxProfile[]): void;
@@ -0,0 +1,24 @@
1
+ import { CommerceQuoteError } from "./quotePorts.js";
2
+ export function assertSupportedCommerceTaxProfile(taxProfile, supportedTaxProfiles) {
3
+ if (!Number.isInteger(taxProfile.vatRateBps) ||
4
+ taxProfile.vatRateBps < 0 ||
5
+ taxProfile.vatRateBps > 10_000) {
6
+ throw new CommerceQuoteError("UNSUPPORTED_TAX_PROFILE", "Unsupported commerce tax profile", {
7
+ reason: "vatRateBps must be an integer between 0 and 10000",
8
+ vatRateBps: taxProfile.vatRateBps,
9
+ });
10
+ }
11
+ const supported = supportedTaxProfiles.some((candidate) => candidate.included === taxProfile.included &&
12
+ candidate.country === taxProfile.country &&
13
+ candidate.category === taxProfile.category &&
14
+ candidate.vatRateBps === taxProfile.vatRateBps &&
15
+ candidate.legalBasis === taxProfile.legalBasis);
16
+ if (!supported) {
17
+ throw new CommerceQuoteError("UNSUPPORTED_TAX_PROFILE", "Unsupported commerce tax profile", {
18
+ country: taxProfile.country,
19
+ category: taxProfile.category,
20
+ vatRateBps: taxProfile.vatRateBps,
21
+ reason: "taxProfile must be declared in supportedTaxProfiles",
22
+ });
23
+ }
24
+ }
@@ -0,0 +1,2 @@
1
+ import { z } from "zod";
2
+ export { z };
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+ z.config({ jitless: true });
3
+ export { z };
@@ -0,0 +1,72 @@
1
+ import type { z } from "zod";
2
+ import type { HttpRequest, HttpResponse } from "../http/index.js";
3
+ import type { BffResponder } from "../bff/index.js";
4
+ import type { createPromotionCodePreview } from "./promotionCodePreview.js";
5
+ /** Structural inputs to the existing host admin kit; no kit implementation lives here. */
6
+ export type AdminAuthorization = {
7
+ ok: true;
8
+ userId: string;
9
+ role: "admin" | "distributor";
10
+ isMachineActor: boolean;
11
+ } | {
12
+ ok: false;
13
+ code: "UNAUTHORIZED" | "FORBIDDEN";
14
+ message: string;
15
+ identityCode?: string;
16
+ };
17
+ export type AuthorizeAdmin = () => Promise<AdminAuthorization>;
18
+ export interface AgentDomainQuerySpec<T> {
19
+ readonly key: string;
20
+ readonly requestSchema: z.ZodType<T, unknown>;
21
+ readonly gate: "read";
22
+ readonly allowedActorKinds: readonly ("human" | "machine")[];
23
+ }
24
+ export interface AgentDomainMutationSpec<T> extends Omit<AgentDomainQuerySpec<T>, "gate"> {
25
+ readonly gate: "mutation";
26
+ readonly lifecycleMarkers: readonly never[];
27
+ }
28
+ type Handler = (req: HttpRequest, res: HttpResponse) => Promise<void>;
29
+ type ErrorMapper = (res: HttpResponse, error: unknown, failureMessage: string) => void;
30
+ interface ReadOptions<T> {
31
+ readonly authorizeAdmin: AuthorizeAdmin;
32
+ readonly toResponse: (value: T) => Record<string, unknown>;
33
+ readonly responseSchema: {
34
+ safeParse(value: unknown): {
35
+ success: boolean;
36
+ data?: unknown;
37
+ };
38
+ };
39
+ readonly invalidResponseMessage: string;
40
+ readonly failureMessage: string;
41
+ }
42
+ interface MutationOptions<Request, Result> extends Omit<ReadOptions<Result>, "responseSchema" | "invalidResponseMessage"> {
43
+ readonly mutation: AgentDomainMutationSpec<Request>;
44
+ readonly invoke: (actorId: string, request: Request) => Promise<Result>;
45
+ readonly responseSchema?: ReadOptions<Result>["responseSchema"];
46
+ readonly invalidResponseMessage?: string;
47
+ readonly invalidRequestMessage: string;
48
+ readonly mapError?: ErrorMapper;
49
+ }
50
+ interface QueryOptions<Request, Result> extends ReadOptions<Result> {
51
+ readonly query: AgentDomainQuerySpec<Request>;
52
+ readonly load: (actorId: string, request: Request) => Promise<Result>;
53
+ readonly invalidRequestMessage: string;
54
+ readonly mapError?: ErrorMapper;
55
+ }
56
+ export interface PromotionAdminBindings extends BffResponder, Pick<ReturnType<typeof createPromotionCodePreview>, "generatePromotionCode" | "normalizePromotionCode" | "previewPromotionCode" | "verifyPromotionPreviewProof"> {
57
+ createAdminMutationHandler<Request, Result>(options: MutationOptions<Request, Result>): Handler;
58
+ createAdminReadHandler<Result>(options: ReadOptions<Result> & {
59
+ load(): Promise<Result>;
60
+ }): Handler;
61
+ createAdminParameterizedReadHandler<Request, Result>(options: QueryOptions<Request, Result>): Handler;
62
+ mapRpcError: ErrorMapper;
63
+ resolveAdmin(authorize: AuthorizeAdmin, res: HttpResponse): Promise<Omit<Extract<AdminAuthorization, {
64
+ ok: true;
65
+ }>, "ok"> | null>;
66
+ /** The host constructor is passed by identity, preserving instanceof and SQLSTATE mapping. */
67
+ DomainRpcError: new (sqlstate: string | undefined, pgMessage: string) => Error & {
68
+ sqlstate: string | undefined;
69
+ pgMessage: string;
70
+ };
71
+ }
72
+ export {};
@@ -0,0 +1 @@
1
+ export {};