@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,40 @@
1
+ /** The server cannot assign a policy right now. Caller-independent: retrying an
2
+ * identical request only succeeds once production configuration changes. */
3
+ export declare class CommercePricingPolicyUnavailableError extends Error {
4
+ readonly reason: string;
5
+ constructor(reason: string);
6
+ }
7
+ /**
8
+ * Every reason a caller-side refusal can carry. ⛔ Each one answers `400`, which
9
+ * puts it outside every 5xx monitor, so each one owes a dedicated monitor of its
10
+ * own; a host's observability check can read this tuple and fail when a reason
11
+ * has none. Adding a member here without adding a monitor is the regression this
12
+ * tuple exists to prevent: reclassifying `v2_capability_required` from `503` to
13
+ * `400` once silently removed the only alert on a site-wide unpriceable-quote
14
+ * outage.
15
+ */
16
+ export declare const PRICING_POLICY_REQUEST_REASONS: readonly ["v2_capability_required", "v2_visitor_id_required"];
17
+ export type PricingPolicyRequestReason = (typeof PRICING_POLICY_REQUEST_REASONS)[number];
18
+ /** The request itself lacks the context a v2 assignment needs. Caller-fixable,
19
+ * and never evidence that pricing is down. The reason is typed off
20
+ * PRICING_POLICY_REQUEST_REASONS so a new one cannot skip its monitor. */
21
+ export declare class CommercePricingPolicyRequestError extends Error {
22
+ readonly reason: PricingPolicyRequestReason;
23
+ constructor(reason: PricingPolicyRequestReason);
24
+ }
25
+ export type SafePricingPolicyReason = "v2_capability_required" | "v2_visitor_id_required" | "signing_secret_unavailable" | "v1_assignment_rejected" | "v2_assignment_config_invalid" | "v2_readiness_not_ready" | "other";
26
+ export interface PricingPolicyFailureMapping {
27
+ code: "BAD_REQUEST" | "UPSTREAM_UNAVAILABLE";
28
+ details: {
29
+ reason: "pricing_policy_request_invalid" | "pricing_policy_unavailable";
30
+ stage: "pricing_policy";
31
+ policyReason: SafePricingPolicyReason;
32
+ };
33
+ }
34
+ /**
35
+ * Single owner of the status a pricing-policy refusal earns, shared by every
36
+ * route that resolves one. A caller-attributable gap answers `400`; only a
37
+ * server that genuinely cannot price answers `503`, so a `503` on these routes
38
+ * stays a truthful outage signal.
39
+ */
40
+ export declare function mapPricingPolicyFailure(error: unknown): PricingPolicyFailureMapping | null;
@@ -0,0 +1,67 @@
1
+ /** The server cannot assign a policy right now. Caller-independent: retrying an
2
+ * identical request only succeeds once production configuration changes. */
3
+ export class CommercePricingPolicyUnavailableError extends Error {
4
+ reason;
5
+ constructor(reason) {
6
+ super("commerce_pricing_policy_v2_unavailable");
7
+ this.reason = reason;
8
+ this.name = "CommercePricingPolicyUnavailableError";
9
+ }
10
+ }
11
+ /**
12
+ * Every reason a caller-side refusal can carry. ⛔ Each one answers `400`, which
13
+ * puts it outside every 5xx monitor, so each one owes a dedicated monitor of its
14
+ * own; a host's observability check can read this tuple and fail when a reason
15
+ * has none. Adding a member here without adding a monitor is the regression this
16
+ * tuple exists to prevent: reclassifying `v2_capability_required` from `503` to
17
+ * `400` once silently removed the only alert on a site-wide unpriceable-quote
18
+ * outage.
19
+ */
20
+ export const PRICING_POLICY_REQUEST_REASONS = [
21
+ "v2_capability_required",
22
+ "v2_visitor_id_required",
23
+ ];
24
+ /** The request itself lacks the context a v2 assignment needs. Caller-fixable,
25
+ * and never evidence that pricing is down. The reason is typed off
26
+ * PRICING_POLICY_REQUEST_REASONS so a new one cannot skip its monitor. */
27
+ export class CommercePricingPolicyRequestError extends Error {
28
+ reason;
29
+ constructor(reason) {
30
+ super("commerce_pricing_policy_v2_request_invalid");
31
+ this.reason = reason;
32
+ this.name = "CommercePricingPolicyRequestError";
33
+ }
34
+ }
35
+ const SAFE_PRICING_POLICY_REASONS = new Set([
36
+ "v2_capability_required",
37
+ "v2_visitor_id_required",
38
+ "signing_secret_unavailable", // gitleaks:allow — closed-set diagnostic code, never a credential
39
+ "v1_assignment_rejected",
40
+ "v2_assignment_config_invalid",
41
+ "v2_readiness_not_ready",
42
+ "other",
43
+ ]);
44
+ /**
45
+ * Single owner of the status a pricing-policy refusal earns, shared by every
46
+ * route that resolves one. A caller-attributable gap answers `400`; only a
47
+ * server that genuinely cannot price answers `503`, so a `503` on these routes
48
+ * stays a truthful outage signal.
49
+ */
50
+ export function mapPricingPolicyFailure(error) {
51
+ const caller = error instanceof CommercePricingPolicyRequestError;
52
+ if (!caller && !(error instanceof CommercePricingPolicyUnavailableError))
53
+ return null;
54
+ return {
55
+ code: caller ? "BAD_REQUEST" : "UPSTREAM_UNAVAILABLE",
56
+ details: {
57
+ reason: caller ? "pricing_policy_request_invalid" : "pricing_policy_unavailable",
58
+ stage: "pricing_policy",
59
+ policyReason: safePricingPolicyReason(error.reason),
60
+ },
61
+ };
62
+ }
63
+ function safePricingPolicyReason(value) {
64
+ return SAFE_PRICING_POLICY_REASONS.has(value)
65
+ ? value
66
+ : "other";
67
+ }
@@ -0,0 +1,37 @@
1
+ import type { ResolvedAcquisitionTerms } from "./contracts/acquisitionTerms.js";
2
+ import type { HttpRequest, HttpResponse } from "../http/index.js";
3
+ import type { BffResponder } from "../bff/index.js";
4
+ import type { z } from "zod";
5
+ import { type CreateQuoteRequest, type CreateQuoteResponse } from "./contracts/quote.js";
6
+ import { COMMERCE_CONTRACT_VERSION } from "./contracts/index.js";
7
+ import { type CommerceQuotePort } from "./quotePorts.js";
8
+ import type { PricingPolicySnapshot } from "./contracts/offerPolicy.js";
9
+ export interface CommerceQuoteBatchHandlerDeps<Request extends CreateQuoteRequest = CreateQuoteRequest, Response extends CreateQuoteResponse = CreateQuoteResponse> {
10
+ responder: BffResponder;
11
+ acquisition?: {
12
+ terms(quote: Response["quote"]): ResolvedAcquisitionTerms | undefined;
13
+ };
14
+ createQuoteBatchRequestSchema: z.ZodType<{
15
+ quotes: Request[];
16
+ }>;
17
+ publicCreateQuoteBatchResponseSchema: z.ZodType<{
18
+ contractVersion: typeof COMMERCE_CONTRACT_VERSION;
19
+ quotes: Response["quote"][];
20
+ }>;
21
+ quotePort: CommerceQuotePort<Request, Response>;
22
+ resolveCustomerEligibility?: (request: Request) => Promise<{
23
+ clientId: string | null;
24
+ source: "anonymous" | "resolved_client";
25
+ }>;
26
+ resolvePricingPolicy?: (request: Request) => PricingPolicySnapshot | undefined | Promise<PricingPolicySnapshot | undefined>;
27
+ }
28
+ /**
29
+ * Batch quote BFF handler: prices N independent quotes in one request so the
30
+ * configurator stops fanning out one HTTP call per length tile. The injected
31
+ * `quotePort` is expected to share its catalog + active price-list reads across
32
+ * the batch (single `atTime` + memoized catalog), so this is one DB warm-up, not
33
+ * N. Output is identical to calling the single-quote endpoint N times, and order
34
+ * is preserved (`quotes[i]` ⇔ the i-th request). A failure in any quote fails
35
+ * the whole batch, mirroring the single-endpoint error mapping.
36
+ */
37
+ export declare function createCommerceQuoteBatchHandler<Request extends CreateQuoteRequest, Response extends CreateQuoteResponse>({ responder, createQuoteBatchRequestSchema, publicCreateQuoteBatchResponseSchema, quotePort, acquisition, resolveCustomerEligibility, resolvePricingPolicy, }: CommerceQuoteBatchHandlerDeps<Request, Response>): (req: HttpRequest, res: HttpResponse) => Promise<void>;
@@ -0,0 +1,83 @@
1
+ import { mapAcquisitionTermsFailure } from "./acquisitionQuoteBinding.js";
2
+ import { COMMERCE_CONTRACT_VERSION } from "./contracts/index.js";
3
+ import { CommerceQuoteError, } from "./quotePorts.js";
4
+ import { CommerceQuoteCatalogReadError } from "./commerceQuoteCatalogReadPort.js";
5
+ import { mapPricingPolicyFailure } from "./commercePricingPolicyErrors.js";
6
+ /**
7
+ * Batch quote BFF handler: prices N independent quotes in one request so the
8
+ * configurator stops fanning out one HTTP call per length tile. The injected
9
+ * `quotePort` is expected to share its catalog + active price-list reads across
10
+ * the batch (single `atTime` + memoized catalog), so this is one DB warm-up, not
11
+ * N. Output is identical to calling the single-quote endpoint N times, and order
12
+ * is preserved (`quotes[i]` ⇔ the i-th request). A failure in any quote fails
13
+ * the whole batch, mirroring the single-endpoint error mapping.
14
+ */
15
+ export function createCommerceQuoteBatchHandler({ responder, createQuoteBatchRequestSchema, publicCreateQuoteBatchResponseSchema, quotePort, acquisition, resolveCustomerEligibility, resolvePricingPolicy, }) {
16
+ const { sendBffError, sendBffSuccess, sendMethodNotAllowed } = responder;
17
+ return async function handler(req, res) {
18
+ if (req.method !== "POST") {
19
+ sendMethodNotAllowed(res, ["POST"]);
20
+ return;
21
+ }
22
+ const request = createQuoteBatchRequestSchema.safeParse(req.body);
23
+ if (!request.success) {
24
+ sendBffError(res, "BAD_REQUEST", "Invalid commerce quote batch request", {
25
+ details: request.error.flatten(),
26
+ });
27
+ return;
28
+ }
29
+ try {
30
+ const results = await Promise.all(request.data.quotes.map(async (quote) => {
31
+ const eligibility = resolveCustomerEligibility
32
+ ? await resolveCustomerEligibility(quote)
33
+ : { clientId: null, source: "anonymous" };
34
+ const pricingPolicy = await resolvePricingPolicy?.(quote);
35
+ return quotePort.createQuote(quote, {
36
+ clientId: eligibility.clientId,
37
+ ...(pricingPolicy ? { pricingPolicy } : {}),
38
+ });
39
+ }));
40
+ const payload = {
41
+ contractVersion: COMMERCE_CONTRACT_VERSION,
42
+ quotes: results.map((result) => result.quote),
43
+ };
44
+ const response = publicCreateQuoteBatchResponseSchema.safeParse(payload);
45
+ if (!response.success) {
46
+ sendBffError(res, "INVALID_RESPONSE", "Commerce quote batch returned invalid response");
47
+ return;
48
+ }
49
+ sendBffSuccess(res, response.data, {
50
+ contractVersion: COMMERCE_CONTRACT_VERSION,
51
+ });
52
+ }
53
+ catch (error) {
54
+ const acquisitionFailure = acquisition ? mapAcquisitionTermsFailure(error) : null;
55
+ if (acquisitionFailure) {
56
+ sendBffError(res, acquisitionFailure.code, "Acquisition terms unavailable", { details: acquisitionFailure.details });
57
+ return;
58
+ }
59
+ if (error instanceof CommerceQuoteCatalogReadError) {
60
+ sendBffError(res, "UPSTREAM_UNAVAILABLE", "Commerce catalog is unavailable", {
61
+ details: { reason: "catalog_unavailable", refusalCode: error.code },
62
+ });
63
+ return;
64
+ }
65
+ if (error instanceof CommerceQuoteError) {
66
+ sendBffError(res, error.code === "UNKNOWN_SKU" ? "BAD_REQUEST" : "CONFLICT", error.message, { details: error.details });
67
+ return;
68
+ }
69
+ // Without this the batch route answered every pricing-policy refusal with
70
+ // a detail-free 503, so the one route the configurator actually fans out
71
+ // to said the least about why it refused.
72
+ const policyFailure = mapPricingPolicyFailure(error);
73
+ if (policyFailure) {
74
+ console.error("[commerce-quote-batch] pricing policy refused:", JSON.stringify(policyFailure.details));
75
+ sendBffError(res, policyFailure.code, policyFailure.code === "BAD_REQUEST"
76
+ ? "Commerce quote batch request is missing offer policy context"
77
+ : "Commerce quote batch failed", { details: policyFailure.details });
78
+ return;
79
+ }
80
+ sendBffError(res, "UPSTREAM_UNAVAILABLE", "Commerce quote batch failed");
81
+ }
82
+ };
83
+ }
@@ -0,0 +1,27 @@
1
+ /** Quote-only facts: no copy, route, price, or inventory authority. */
2
+ export interface CommerceQuoteCatalogItem {
3
+ skuId: string;
4
+ skuCode: string;
5
+ variantId: string;
6
+ productSlug: string;
7
+ netWeightG: number;
8
+ /** Identifies the product primary SKU for offer selection; secondary SKUs are excluded. */
9
+ isPrimarySku?: boolean;
10
+ isAddon: boolean;
11
+ sellability: {
12
+ oneTime: boolean;
13
+ subscription: boolean;
14
+ };
15
+ documentRevision: {
16
+ id: string | null;
17
+ digest: string | null;
18
+ };
19
+ }
20
+ export interface CommerceQuoteCatalogReadPort {
21
+ listQuoteCatalogItems(): Promise<CommerceQuoteCatalogItem[]>;
22
+ }
23
+ export type CommerceQuoteCatalogReadRefusalCode = "catalog_read_not_configured" | "catalog_authority_unavailable" | "catalog_authority_changed" | "catalog_revision_invalid" | "catalog_document_schema_invalid" | "catalog_document_digest_mismatch" | "catalog_primary_trade_item_invalid" | "catalog_cursor_invalid" | "catalog_cardinality_exceeded";
24
+ export declare class CommerceQuoteCatalogReadError extends Error {
25
+ readonly code: CommerceQuoteCatalogReadRefusalCode;
26
+ constructor(code: CommerceQuoteCatalogReadRefusalCode);
27
+ }
@@ -0,0 +1,8 @@
1
+ export class CommerceQuoteCatalogReadError extends Error {
2
+ code;
3
+ constructor(code) {
4
+ super(code);
5
+ this.code = code;
6
+ this.name = "CommerceQuoteCatalogReadError";
7
+ }
8
+ }
@@ -0,0 +1,35 @@
1
+ import type { ShippingTerms } from "../shipping/index.js";
2
+ import type { ResolvedAcquisitionTerms } from "./contracts/acquisitionTerms.js";
3
+ import type { HttpRequest, HttpResponse } from "../http/index.js";
4
+ import type { BffResponder } from "../bff/index.js";
5
+ import type { z } from "zod";
6
+ import { type CreateQuoteRequest, type CreateQuoteResponse } from "./contracts/quote.js";
7
+ import { type CommerceQuotePort } from "./quotePorts.js";
8
+ import type { PricingPolicySnapshot } from "./contracts/offerPolicy.js";
9
+ export interface CommerceQuoteHandlerDeps<Request extends CreateQuoteRequest = CreateQuoteRequest, Response extends CreateQuoteResponse = CreateQuoteResponse> {
10
+ responder: BffResponder;
11
+ shipping?: {
12
+ terms(quote: Response["quote"]): ShippingTerms | undefined;
13
+ };
14
+ acquisition?: {
15
+ terms(quote: Response["quote"]): ResolvedAcquisitionTerms | undefined;
16
+ };
17
+ createQuoteRequestSchema: z.ZodType<Request>;
18
+ createQuoteResponseSchema: z.ZodType<Response>;
19
+ publicCreateQuoteRequestSchema: z.ZodType<Request & {
20
+ promotionAcceptanceToken?: string;
21
+ }>;
22
+ publicCreateQuoteResponseSchema: z.ZodType<Response & {
23
+ promotionAcceptanceToken?: string;
24
+ }>;
25
+ quotePort: CommerceQuotePort<Request, Response>;
26
+ fallbackQuotePort?: CommerceQuotePort<Request, Response>;
27
+ resolveCustomerEligibility?: (request: Request) => Promise<{
28
+ clientId: string | null;
29
+ source: "anonymous" | "resolved_client";
30
+ }>;
31
+ resolvePricingPolicy?: (request: Request) => PricingPolicySnapshot | undefined | Promise<PricingPolicySnapshot | undefined>;
32
+ createPromotionAcceptance?: (request: Request, quote: Awaited<ReturnType<CommerceQuotePort<Request, Response>["createQuote"]>>["quote"], acquisitionTerms?: ResolvedAcquisitionTerms, shippingTerms?: ShippingTerms) => string | null;
33
+ honorPromotionAcceptance?: (token: string, request: Request, quote: Awaited<ReturnType<CommerceQuotePort<Request, Response>["createQuote"]>>["quote"], acquisitionTerms?: ResolvedAcquisitionTerms, shippingTerms?: ShippingTerms) => boolean;
34
+ }
35
+ export declare function createCommerceQuoteHandler<Request extends CreateQuoteRequest, Response extends CreateQuoteResponse>({ responder, createQuoteRequestSchema, createQuoteResponseSchema, publicCreateQuoteRequestSchema, publicCreateQuoteResponseSchema, quotePort, acquisition, shipping, fallbackQuotePort, resolveCustomerEligibility, resolvePricingPolicy, createPromotionAcceptance, honorPromotionAcceptance, }: CommerceQuoteHandlerDeps<Request, Response>): (req: HttpRequest, res: HttpResponse) => Promise<void>;
@@ -0,0 +1,122 @@
1
+ import { mapAcquisitionTermsFailure } from "./acquisitionQuoteBinding.js";
2
+ import { COMMERCE_CONTRACT_VERSION } from "./contracts/index.js";
3
+ import { CommerceQuoteError, } from "./quotePorts.js";
4
+ import { mapPricingPolicyFailure } from "./commercePricingPolicyErrors.js";
5
+ import { CommerceQuoteCatalogReadError } from "./commerceQuoteCatalogReadPort.js";
6
+ function commerceQuoteFailureDetails(stage) {
7
+ return { reason: "quote_dependency_failed", stage };
8
+ }
9
+ export function createCommerceQuoteHandler({ responder, createQuoteRequestSchema, createQuoteResponseSchema, publicCreateQuoteRequestSchema, publicCreateQuoteResponseSchema, quotePort, acquisition, shipping, fallbackQuotePort, resolveCustomerEligibility, resolvePricingPolicy, createPromotionAcceptance, honorPromotionAcceptance, }) {
10
+ const { sendBffError, sendBffSuccess, sendMethodNotAllowed } = responder;
11
+ return async function handler(req, res) {
12
+ if (req.method !== "POST") {
13
+ sendMethodNotAllowed(res, ["POST"]);
14
+ return;
15
+ }
16
+ const publicRequest = publicCreateQuoteRequestSchema.safeParse(req.body);
17
+ if (!publicRequest.success) {
18
+ sendBffError(res, "BAD_REQUEST", "Invalid commerce quote request", {
19
+ details: publicRequest.error.flatten(),
20
+ });
21
+ return;
22
+ }
23
+ const { promotionAcceptanceToken, ...canonicalInput } = publicRequest.data;
24
+ const request = createQuoteRequestSchema.safeParse(canonicalInput);
25
+ if (!request.success) {
26
+ sendBffError(res, "BAD_REQUEST", "Invalid commerce quote request");
27
+ return;
28
+ }
29
+ let stage = "customer_eligibility";
30
+ try {
31
+ const eligibility = resolveCustomerEligibility
32
+ ? await resolveCustomerEligibility(request.data)
33
+ : { clientId: null, source: "anonymous" };
34
+ console.info("commerce_quote_promo_eligibility_context", JSON.stringify({ promoEligibilityContext: eligibility.source }));
35
+ stage = "pricing_policy";
36
+ const pricingPolicy = await resolvePricingPolicy?.(request.data);
37
+ stage = "quote_evaluation";
38
+ const rawQuote = await quotePort.createQuote(request.data, {
39
+ clientId: eligibility.clientId,
40
+ ...(pricingPolicy ? { pricingPolicy } : {}),
41
+ });
42
+ const canonicalQuote = createQuoteResponseSchema.safeParse(rawQuote);
43
+ if (!canonicalQuote.success) {
44
+ sendBffError(res, "INVALID_RESPONSE", "Commerce quote returned invalid response");
45
+ return;
46
+ }
47
+ let quote = canonicalQuote.data;
48
+ stage = "promotion_acceptance";
49
+ const acquisitionTerms = acquisition?.terms(quote.quote);
50
+ const shippingTerms = shipping?.terms(quote.quote);
51
+ const honoredToken = promotionAcceptanceToken && (shipping
52
+ ? honorPromotionAcceptance?.(promotionAcceptanceToken, request.data, quote.quote, acquisitionTerms, shippingTerms)
53
+ : honorPromotionAcceptance?.(promotionAcceptanceToken, request.data, quote.quote, acquisitionTerms))
54
+ ? promotionAcceptanceToken : undefined;
55
+ const issuedToken = honoredToken ?? (shipping
56
+ ? createPromotionAcceptance?.(request.data, quote.quote, acquisitionTerms, shippingTerms)
57
+ : createPromotionAcceptance?.(request.data, quote.quote, acquisitionTerms)) ?? undefined;
58
+ const containsV2Promotion = quote.quote.discounts.some((discount) => discount.promotionEngineVersion === "promotion-engine.v2");
59
+ if (shippingTerms && !issuedToken) {
60
+ sendBffError(res, "CONFLICT", "Shipping quote must be refreshed", {
61
+ details: { feature: "quote", reason: "promotion_acceptance_refresh_required" },
62
+ });
63
+ return;
64
+ }
65
+ if ((containsV2Promotion || acquisitionTerms) && !issuedToken) {
66
+ stage = "promotion_fallback";
67
+ const fallback = fallbackQuotePort
68
+ ? createQuoteResponseSchema.safeParse(await fallbackQuotePort.createQuote(request.data, {
69
+ clientId: eligibility.clientId,
70
+ ...(pricingPolicy ? { pricingPolicy } : {}),
71
+ }))
72
+ : null;
73
+ if (!fallback?.success || shipping?.terms(fallback.data.quote) || acquisition?.terms(fallback.data.quote) || fallback.data.quote.discounts.some((discount) => discount.promotionEngineVersion === "promotion-engine.v2")) {
74
+ sendBffError(res, "CONFLICT", "Promotion quote must be refreshed", {
75
+ details: { feature: "quote", reason: "promotion_acceptance_refresh_required" },
76
+ });
77
+ return;
78
+ }
79
+ quote = fallback.data;
80
+ }
81
+ const response = publicCreateQuoteResponseSchema.safeParse({
82
+ ...quote,
83
+ promotionAcceptanceToken: quote === canonicalQuote.data ? issuedToken : undefined,
84
+ });
85
+ if (!response.success) {
86
+ sendBffError(res, "INVALID_RESPONSE", "Commerce quote returned invalid response");
87
+ return;
88
+ }
89
+ sendBffSuccess(res, response.data, {
90
+ contractVersion: COMMERCE_CONTRACT_VERSION,
91
+ });
92
+ }
93
+ catch (error) {
94
+ const acquisitionFailure = acquisition ? mapAcquisitionTermsFailure(error) : null;
95
+ if (acquisitionFailure) {
96
+ sendBffError(res, acquisitionFailure.code, "Acquisition terms unavailable", { details: acquisitionFailure.details });
97
+ return;
98
+ }
99
+ if (error instanceof CommerceQuoteCatalogReadError) {
100
+ sendBffError(res, "UPSTREAM_UNAVAILABLE", "Commerce catalog is unavailable", {
101
+ details: { reason: "catalog_unavailable", refusalCode: error.code },
102
+ });
103
+ return;
104
+ }
105
+ if (error instanceof CommerceQuoteError) {
106
+ sendBffError(res, error.code === "UNKNOWN_SKU" ? "BAD_REQUEST" : "CONFLICT", error.message, { details: error.details });
107
+ return;
108
+ }
109
+ const policyFailure = stage === "pricing_policy" ? mapPricingPolicyFailure(error) : null;
110
+ if (policyFailure) {
111
+ console.error("[commerce-quote] pricing policy refused:", JSON.stringify(policyFailure.details));
112
+ sendBffError(res, policyFailure.code, policyFailure.code === "BAD_REQUEST"
113
+ ? "Commerce quote request is missing offer policy context"
114
+ : "Commerce quote failed", { details: policyFailure.details });
115
+ return;
116
+ }
117
+ const details = commerceQuoteFailureDetails(stage);
118
+ console.error("[commerce-quote] dependency failed:", JSON.stringify(details));
119
+ sendBffError(res, "UPSTREAM_UNAVAILABLE", "Commerce quote failed", { details });
120
+ }
121
+ };
122
+ }
@@ -0,0 +1,9 @@
1
+ import type { z } from "zod";
2
+ import { type CommerceQuotePort } from "./quotePorts.js";
3
+ export interface QuoteSnapshotExpectMessages {
4
+ /** Thrown when the re-quoted response fails schema validation. */
5
+ invalidResponseMessage: string;
6
+ /** Thrown when re-quoting raises a CommerceQuoteError (pricing changed). */
7
+ catalogMismatchMessage: string;
8
+ }
9
+ export declare function createExpectedQuote<Request, Response>(quotePort: CommerceQuotePort<Request, Response>, request: Request, messages: QuoteSnapshotExpectMessages, createQuoteResponseSchema: z.ZodType<Response>): Promise<Response>;
@@ -0,0 +1,22 @@
1
+ import { CommerceQuoteError, CommerceQuoteSnapshotError, } from "./quotePorts.js";
2
+ export async function createExpectedQuote(quotePort, request, messages, createQuoteResponseSchema) {
3
+ try {
4
+ const expected = await quotePort.createQuote(request);
5
+ const parsed = createQuoteResponseSchema.safeParse(expected);
6
+ if (!parsed.success) {
7
+ throw new CommerceQuoteSnapshotError("QUOTE_SNAPSHOT_MISMATCH", messages.invalidResponseMessage, { reason: "invalid_expected_quote" });
8
+ }
9
+ return parsed.data;
10
+ }
11
+ catch (error) {
12
+ if (error instanceof CommerceQuoteSnapshotError)
13
+ throw error;
14
+ if (error instanceof CommerceQuoteError) {
15
+ throw new CommerceQuoteSnapshotError("QUOTE_SNAPSHOT_MISMATCH", messages.catalogMismatchMessage, {
16
+ reason: error.code,
17
+ ...error.details,
18
+ });
19
+ }
20
+ throw error;
21
+ }
22
+ }
@@ -0,0 +1,32 @@
1
+ /** Opt-in protocol identity; financial schedules belong to the injected policy. */
2
+ export declare const ACQUISITION_TERMS_CAPABILITY: "subscription-acquisition.v1";
3
+ export type AcquisitionCapability = typeof ACQUISITION_TERMS_CAPABILITY;
4
+ export interface AcquisitionTermsMetadata {
5
+ schemaVersion: AcquisitionCapability;
6
+ revision: string;
7
+ delivery2DiscountBps: number;
8
+ }
9
+ export interface AcquisitionTerms extends AcquisitionTermsMetadata {
10
+ initialDiscountBps: number;
11
+ effectiveFrom: string;
12
+ effectiveTo: string | null;
13
+ }
14
+ export interface ResolvedAcquisitionTerms extends AcquisitionTerms {
15
+ sourcePromotionId: string;
16
+ }
17
+ export interface AcquisitionTermsExpectation {
18
+ revision: string;
19
+ delivery2DiscountBps: number;
20
+ }
21
+ import type { CreateQuoteRequest, CommerceQuoteContext, CommerceQuote } from "./quote.js";
22
+ /** Separate opt-in DTOs; incumbent request/response admission is unchanged. */
23
+ export interface AcquisitionQuoteRequest extends CreateQuoteRequest {
24
+ acquisitionCapability?: AcquisitionCapability;
25
+ }
26
+ export interface AcquisitionQuoteContext extends CommerceQuoteContext {
27
+ acquisitionCapability?: AcquisitionCapability;
28
+ atTime?: string;
29
+ }
30
+ export interface AcquisitionQuote extends CommerceQuote {
31
+ acquisitionTerms?: ResolvedAcquisitionTerms;
32
+ }
@@ -0,0 +1,2 @@
1
+ /** Opt-in protocol identity; financial schedules belong to the injected policy. */
2
+ export const ACQUISITION_TERMS_CAPABILITY = "subscription-acquisition.v1";
@@ -0,0 +1,27 @@
1
+ import type { ResolvedPrice } from "@openlup/core/pricing";
2
+ import type { SubscriptionPricePolicyRevision } from "./policy.js";
3
+ /** Exact settlement context for a current quote price; tiers and open-mode fallbacks are excluded. */
4
+ export interface CommercePriceAuthorityQuery {
5
+ variantId: string;
6
+ mode: "one_time" | "subscription";
7
+ regionCode: string;
8
+ currency: string;
9
+ channel: string;
10
+ atTime?: string;
11
+ }
12
+ export interface CommerceBasePriceObservation {
13
+ /** The sole active/effective `one_time`, `min_qty=1` entry. */
14
+ base: ResolvedPrice;
15
+ unitPriceMinor: number;
16
+ }
17
+ export type CommercePriceAuthorityResult = (CommerceBasePriceObservation & {
18
+ kind: "one_time";
19
+ }) | (CommerceBasePriceObservation & {
20
+ kind: "subscription_policy";
21
+ policy: SubscriptionPricePolicyRevision;
22
+ }) | (CommerceBasePriceObservation & {
23
+ /** Explicit compatibility observation allowed only before this context has policy history. */
24
+ kind: "subscription_legacy";
25
+ legacyResolved: ResolvedPrice;
26
+ });
27
+ export type CommercePriceAuthorityRefusal = "active_price_list_not_found" | "active_price_list_ambiguous" | "base_price_not_found" | "base_price_ambiguous" | "base_price_amount_kind_invalid" | "legacy_subscription_price_not_found" | "legacy_subscription_price_ambiguous" | "subscription_price_policy_not_effective" | "subscription_price_policy_ambiguous" | "subscription_price_policy_invalid" | "subscription_price_policy_digest_mismatch";
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,33 @@
1
+ /** UI-safe, additive explanation for a frozen `codeRejections` item. */
2
+ export type CommerceCodeRejectionDetail = {
3
+ code: string;
4
+ reason: "scope_not_applicable";
5
+ allowedScopes: Array<"one_time" | "subscription_initial">;
6
+ } | {
7
+ code: string;
8
+ reason: "minimum_not_met";
9
+ minimumReferenceMinor: number;
10
+ } | {
11
+ code: string;
12
+ reason: "not_yet_active";
13
+ validFrom: string;
14
+ } | {
15
+ code: string;
16
+ reason: "global_limit_reached";
17
+ };
18
+ export interface QuotePromotionEvidence {
19
+ promotionId: string;
20
+ code?: string | null;
21
+ reasonCode: string;
22
+ promotionEngineVersion?: "promotion-engine.v2";
23
+ promotionCodeId?: string;
24
+ promotionCodeRevision?: number;
25
+ promotionDefinitionFingerprint?: string;
26
+ promotionCodeScopes?: Array<"one_time" | "subscription_initial">;
27
+ promotionMinimumReferenceMinor?: number;
28
+ promotionCodeValidTo?: string | null;
29
+ promotionBenefitKind?: "target_percentage" | "percentage" | "fixed_amount" | "free_shipping";
30
+ promotionBenefitValueBps?: number;
31
+ promotionBenefitValueMinor?: number;
32
+ floorApplied?: boolean;
33
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,17 @@
1
+ export type { CommercePriceAuthorityQuery, CommerceBasePriceObservation, CommercePriceAuthorityResult, CommercePriceAuthorityRefusal } from "./authority.js";
2
+ export { SUBSCRIPTION_PRICE_POLICY_SCHEMA_VERSION, SUBSCRIPTION_PRICE_POLICY_DEFAULT_DISCOUNT_BPS, SUBSCRIPTION_PRICE_POLICY_DEFAULT_QUANTUM_MINOR } from "./policy.js";
3
+ export type { SubscriptionPricePolicySemantics, SubscriptionPricePolicyCanonicalInput, SubscriptionPricePolicyRevision, SubscriptionPricePolicyDigestRefusal } from "./policy.js";
4
+ export { OFFER_POLICY_V1, OFFER_POLICY_V2, PROMOTION_ENGINE_V1, PROMOTION_ENGINE_V2, OFFER_POLICY_V2_CAPABILITY } from "./offerPolicy.js";
5
+ export type { OfferPolicyVersion, PromotionEngineVersion, PricingPolicyRequest, PricingPolicySnapshot } from "./offerPolicy.js";
6
+ export type { CommerceCurrency, CommerceTaxCountry, CommerceTaxCategory, CommerceTaxLegalBasis, CommerceMoney, CartLineInput, CommerceTaxProfile, CommerceTaxBreakdown } from "./money.js";
7
+ export { COMMERCE_CONTRACT_VERSION } from "./quote.js";
8
+ export type { CommerceQuotePricingComponent, CommerceQuoteContext, CommerceQuoteLine, CommercePromotionCustomerSemantic, CommerceQuoteDiscount, CommerceCodeRejectionReason, CommerceCodeRejection, CommerceQuote, CreateQuoteRequest, CreateQuoteResponse } from "./quote.js";
9
+ export type { QuotePromotionEvidence, CommerceCodeRejectionDetail } from "./evidence.js";
10
+ export { CATALOG_FACTS_PROVENANCE_VERSION, CATALOG_FACTS_POLICY_PROVENANCE_VERSION } from "./provenance.js";
11
+ export type { CatalogFactsProvenance } from "./provenance.js";
12
+ export { COMMERCE_OFFER_PRICING_CONTRACT_VERSION, COMMERCE_OFFER_PRICING_V2_CONTRACT_VERSION } from "./offer.js";
13
+ export type { CommerceOfferPrice, CommerceProductOfferPricing, CommerceOfferPricingResponse } from "./offer.js";
14
+ export { ACQUISITION_TERMS_CAPABILITY } from "./acquisitionTerms.js";
15
+ export type { AcquisitionQuoteRequest, AcquisitionQuoteContext, AcquisitionQuote, AcquisitionCapability, AcquisitionTermsMetadata, AcquisitionTerms, ResolvedAcquisitionTerms, AcquisitionTermsExpectation } from "./acquisitionTerms.js";
16
+ export { COMMERCE_OFFER_PRICING_V3_CONTRACT_VERSION } from "./offer.js";
17
+ export type { AcquisitionOfferPricingResponse } from "./offer.js";
@@ -0,0 +1,7 @@
1
+ export { SUBSCRIPTION_PRICE_POLICY_SCHEMA_VERSION, SUBSCRIPTION_PRICE_POLICY_DEFAULT_DISCOUNT_BPS, SUBSCRIPTION_PRICE_POLICY_DEFAULT_QUANTUM_MINOR } from "./policy.js";
2
+ export { OFFER_POLICY_V1, OFFER_POLICY_V2, PROMOTION_ENGINE_V1, PROMOTION_ENGINE_V2, OFFER_POLICY_V2_CAPABILITY } from "./offerPolicy.js";
3
+ export { COMMERCE_CONTRACT_VERSION } from "./quote.js";
4
+ export { CATALOG_FACTS_PROVENANCE_VERSION, CATALOG_FACTS_POLICY_PROVENANCE_VERSION } from "./provenance.js";
5
+ export { COMMERCE_OFFER_PRICING_CONTRACT_VERSION, COMMERCE_OFFER_PRICING_V2_CONTRACT_VERSION } from "./offer.js";
6
+ export { ACQUISITION_TERMS_CAPABILITY } from "./acquisitionTerms.js";
7
+ export { COMMERCE_OFFER_PRICING_V3_CONTRACT_VERSION } from "./offer.js";
@@ -0,0 +1,27 @@
1
+ export type CommerceCurrency = string;
2
+ export type CommerceTaxCountry = string;
3
+ export type CommerceTaxCategory = string;
4
+ export type CommerceTaxLegalBasis = string;
5
+ export interface CommerceMoney {
6
+ amountMinor: number;
7
+ currency: CommerceCurrency;
8
+ }
9
+ export interface CartLineInput {
10
+ sku: string;
11
+ quantity: number;
12
+ variantId?: string;
13
+ modeAtLine?: "one_time" | "subscription";
14
+ isAddon?: boolean;
15
+ }
16
+ export interface CommerceTaxProfile {
17
+ included: true;
18
+ country: CommerceTaxCountry;
19
+ category: CommerceTaxCategory;
20
+ vatRateBps: number;
21
+ legalBasis: CommerceTaxLegalBasis;
22
+ }
23
+ export interface CommerceTaxBreakdown extends CommerceTaxProfile {
24
+ netAmount: CommerceMoney;
25
+ vatAmount: CommerceMoney;
26
+ grossAmount: CommerceMoney;
27
+ }
@@ -0,0 +1 @@
1
+ export {};