@openlup/platform 0.16.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (773) hide show
  1. package/CHANGELOG.md +180 -0
  2. package/README.md +564 -6
  3. package/dist/catalog/activeSkuSelection.d.ts +2 -0
  4. package/dist/catalog/activeSkuSelection.js +20 -0
  5. package/dist/catalog/adminBindings.d.ts +72 -0
  6. package/dist/catalog/adminBindings.js +1 -0
  7. package/dist/catalog/adminBundleHandler.d.ts +26 -0
  8. package/dist/catalog/adminBundleHandler.js +111 -0
  9. package/dist/catalog/adminBundleReadHandler.d.ts +20 -0
  10. package/dist/catalog/adminBundleReadHandler.js +185 -0
  11. package/dist/catalog/adminBundleWritePort.d.ts +85 -0
  12. package/dist/catalog/adminBundleWritePort.js +1 -0
  13. package/dist/catalog/bundleAvailability.d.ts +63 -0
  14. package/dist/catalog/bundleAvailability.js +78 -0
  15. package/dist/catalog/bundleAvailabilityService.d.ts +65 -0
  16. package/dist/catalog/bundleAvailabilityService.js +89 -0
  17. package/dist/catalog/bundleBindings.d.ts +33 -0
  18. package/dist/catalog/bundleBindings.js +1 -0
  19. package/dist/catalog/bundleCatalogQueries.d.ts +28 -0
  20. package/dist/catalog/bundleCatalogQueries.js +84 -0
  21. package/dist/catalog/bundleCatalogReadPort.d.ts +166 -0
  22. package/dist/catalog/bundleCatalogReadPort.js +36 -0
  23. package/dist/catalog/bundleCatalogStore.d.ts +3 -0
  24. package/dist/catalog/bundleCatalogStore.js +152 -0
  25. package/dist/catalog/bundleRuleCodes.d.ts +41 -0
  26. package/dist/catalog/bundleRuleCodes.js +110 -0
  27. package/dist/catalog/bundleRules.d.ts +69 -0
  28. package/dist/catalog/bundleRules.js +102 -0
  29. package/dist/catalog/catalogDraftStore.d.ts +4 -0
  30. package/dist/catalog/catalogDraftStore.js +63 -0
  31. package/dist/catalog/catalogSkuEnvelope.d.ts +7 -0
  32. package/dist/catalog/catalogSkuEnvelope.js +142 -0
  33. package/dist/catalog/catalogSkuEnvelopeMapper.d.ts +38 -0
  34. package/dist/catalog/catalogSkuEnvelopeMapper.js +88 -0
  35. package/dist/catalog/contracts/bundleAdmin.d.ts +143 -0
  36. package/dist/catalog/contracts/bundleAdmin.js +1 -0
  37. package/dist/catalog/contracts/bundleAvailability.d.ts +61 -0
  38. package/dist/catalog/contracts/bundleAvailability.js +1 -0
  39. package/dist/catalog/contracts/bundleRead.d.ts +223 -0
  40. package/dist/catalog/contracts/bundleRead.js +1 -0
  41. package/dist/catalog/contracts/draft.d.ts +79 -0
  42. package/dist/catalog/contracts/draft.js +47 -0
  43. package/dist/catalog/contracts/foundation.d.ts +78 -0
  44. package/dist/catalog/contracts/foundation.js +53 -0
  45. package/dist/catalog/contracts/index.d.ts +14 -0
  46. package/dist/catalog/contracts/index.js +6 -0
  47. package/dist/catalog/contracts/lifecycle.d.ts +77 -0
  48. package/dist/catalog/contracts/lifecycle.js +1 -0
  49. package/dist/catalog/contracts/productMediaContracts.d.ts +77 -0
  50. package/dist/catalog/contracts/productMediaContracts.js +149 -0
  51. package/dist/catalog/contracts/productTypes.d.ts +54 -0
  52. package/dist/catalog/contracts/productTypes.js +16 -0
  53. package/dist/catalog/contracts/resolveProductMedia.d.ts +3 -0
  54. package/dist/catalog/contracts/resolveProductMedia.js +78 -0
  55. package/dist/catalog/contracts/sellable.d.ts +23 -0
  56. package/dist/catalog/contracts/sellable.js +1 -0
  57. package/dist/catalog/draftHandler.d.ts +25 -0
  58. package/dist/catalog/draftHandler.js +118 -0
  59. package/dist/catalog/draftPorts.d.ts +18 -0
  60. package/dist/catalog/draftPorts.js +8 -0
  61. package/dist/catalog/draftSchemas.d.ts +423 -0
  62. package/dist/catalog/draftSchemas.js +89 -0
  63. package/dist/catalog/draftValidation.d.ts +21 -0
  64. package/dist/catalog/draftValidation.js +125 -0
  65. package/dist/catalog/foundationSchemas.d.ts +98 -0
  66. package/dist/catalog/foundationSchemas.js +110 -0
  67. package/dist/catalog/index.d.ts +43 -0
  68. package/dist/catalog/index.js +25 -0
  69. package/dist/catalog/mediaSourcePack.d.ts +51 -0
  70. package/dist/catalog/mediaSourcePack.js +247 -0
  71. package/dist/catalog/productTypeSchemas.d.ts +46 -0
  72. package/dist/catalog/productTypeSchemas.js +72 -0
  73. package/dist/catalog/publicationPorts.d.ts +42 -0
  74. package/dist/catalog/publicationPorts.js +1 -0
  75. package/dist/catalog/readPorts.d.ts +51 -0
  76. package/dist/catalog/readPorts.js +1 -0
  77. package/dist/catalog/referenceCatalogHandler.d.ts +7 -0
  78. package/dist/catalog/referenceCatalogHandler.js +27 -0
  79. package/dist/catalog/resolvedSkuProjection.d.ts +88 -0
  80. package/dist/catalog/resolvedSkuProjection.js +60 -0
  81. package/dist/catalog/sellableBundleHandler.d.ts +46 -0
  82. package/dist/catalog/sellableBundleHandler.js +84 -0
  83. package/dist/catalog/sellableSchemas.d.ts +46 -0
  84. package/dist/catalog/sellableSchemas.js +27 -0
  85. package/dist/catalog/sql.d.ts +46 -0
  86. package/dist/catalog/sql.js +13 -0
  87. package/dist/catalog/validation.d.ts +2 -0
  88. package/dist/catalog/validation.js +3 -0
  89. package/dist/communications/accountingDocumentDelivery.d.ts +35 -0
  90. package/dist/communications/accountingDocumentDelivery.js +33 -0
  91. package/dist/communications/authEmailError.d.ts +5 -0
  92. package/dist/communications/authEmailError.js +8 -0
  93. package/dist/communications/authEmailPorts.d.ts +2 -0
  94. package/dist/communications/authEmailPorts.js +1 -0
  95. package/dist/communications/authSendEmailHook.d.ts +35 -0
  96. package/dist/communications/authSendEmailHook.js +250 -0
  97. package/dist/communications/capturedTransactionalDelivery.d.ts +13 -0
  98. package/dist/communications/capturedTransactionalDelivery.js +14 -0
  99. package/dist/communications/communicationSync.d.ts +11 -0
  100. package/dist/communications/communicationSync.js +79 -0
  101. package/dist/communications/communicationSyncWorker.d.ts +68 -0
  102. package/dist/communications/communicationSyncWorker.js +218 -0
  103. package/dist/communications/consentPolicy.d.ts +19 -0
  104. package/dist/communications/consentPolicy.js +43 -0
  105. package/dist/communications/consentPurposeRegistry.d.ts +4 -0
  106. package/dist/communications/consentPurposeRegistry.js +24 -0
  107. package/dist/communications/contracts/abandonedCart.d.ts +27 -0
  108. package/dist/communications/contracts/abandonedCart.js +25 -0
  109. package/dist/communications/contracts/authEmail.d.ts +62 -0
  110. package/dist/communications/contracts/authEmail.js +1 -0
  111. package/dist/communications/contracts/backInStock.d.ts +28 -0
  112. package/dist/communications/contracts/backInStock.js +28 -0
  113. package/dist/communications/contracts/blocks.d.ts +24 -0
  114. package/dist/communications/contracts/blocks.js +23 -0
  115. package/dist/communications/contracts/checkoutExpired.d.ts +22 -0
  116. package/dist/communications/contracts/checkoutExpired.js +25 -0
  117. package/dist/communications/contracts/checkoutRecovery.d.ts +26 -0
  118. package/dist/communications/contracts/checkoutRecovery.js +37 -0
  119. package/dist/communications/contracts/commerceEmailContent.d.ts +176 -0
  120. package/dist/communications/contracts/commerceEmailContent.js +1 -0
  121. package/dist/communications/contracts/commerceEngagementEmailContent.d.ts +95 -0
  122. package/dist/communications/contracts/commerceEngagementEmailContent.js +1 -0
  123. package/dist/communications/contracts/consent.d.ts +12 -0
  124. package/dist/communications/contracts/consent.js +1 -0
  125. package/dist/communications/contracts/email.d.ts +182 -0
  126. package/dist/communications/contracts/email.js +1 -0
  127. package/dist/communications/contracts/guideCard.d.ts +3 -0
  128. package/dist/communications/contracts/guideCard.js +26 -0
  129. package/dist/communications/contracts/index.d.ts +52 -0
  130. package/dist/communications/contracts/index.js +42 -0
  131. package/dist/communications/contracts/inquiryContent.d.ts +32 -0
  132. package/dist/communications/contracts/inquiryContent.js +33 -0
  133. package/dist/communications/contracts/invoiceDocumentContent.d.ts +26 -0
  134. package/dist/communications/contracts/invoiceDocumentContent.js +36 -0
  135. package/dist/communications/contracts/marketingAutomation.d.ts +52 -0
  136. package/dist/communications/contracts/marketingAutomation.js +1 -0
  137. package/dist/communications/contracts/marketingSync.d.ts +194 -0
  138. package/dist/communications/contracts/marketingSync.js +1 -0
  139. package/dist/communications/contracts/newsletter.d.ts +63 -0
  140. package/dist/communications/contracts/newsletter.js +1 -0
  141. package/dist/communications/contracts/newsletterWebhook.d.ts +26 -0
  142. package/dist/communications/contracts/newsletterWebhook.js +1 -0
  143. package/dist/communications/contracts/optOutContent.d.ts +11 -0
  144. package/dist/communications/contracts/optOutContent.js +17 -0
  145. package/dist/communications/contracts/orderCanceled.d.ts +25 -0
  146. package/dist/communications/contracts/orderCanceled.js +27 -0
  147. package/dist/communications/contracts/orderDraft.d.ts +46 -0
  148. package/dist/communications/contracts/orderDraft.js +46 -0
  149. package/dist/communications/contracts/orderPaid.d.ts +53 -0
  150. package/dist/communications/contracts/orderPaid.js +71 -0
  151. package/dist/communications/contracts/orderRefunded.d.ts +24 -0
  152. package/dist/communications/contracts/orderRefunded.js +27 -0
  153. package/dist/communications/contracts/paymentFailed.d.ts +24 -0
  154. package/dist/communications/contracts/paymentFailed.js +24 -0
  155. package/dist/communications/contracts/publicIntake.d.ts +49 -0
  156. package/dist/communications/contracts/publicIntake.js +1 -0
  157. package/dist/communications/contracts/render.d.ts +2 -0
  158. package/dist/communications/contracts/render.js +229 -0
  159. package/dist/communications/contracts/reorderReminder.d.ts +24 -0
  160. package/dist/communications/contracts/reorderReminder.js +24 -0
  161. package/dist/communications/contracts/returnEmails.d.ts +25 -0
  162. package/dist/communications/contracts/returnEmails.js +62 -0
  163. package/dist/communications/contracts/reviewEffects.d.ts +26 -0
  164. package/dist/communications/contracts/reviewEffects.js +25 -0
  165. package/dist/communications/contracts/reviewRequest.d.ts +26 -0
  166. package/dist/communications/contracts/reviewRequest.js +24 -0
  167. package/dist/communications/contracts/roleNotificationContent.d.ts +25 -0
  168. package/dist/communications/contracts/roleNotificationContent.js +46 -0
  169. package/dist/communications/contracts/shipmentDelivered.d.ts +23 -0
  170. package/dist/communications/contracts/shipmentDelivered.js +24 -0
  171. package/dist/communications/contracts/shipmentDispatched.d.ts +27 -0
  172. package/dist/communications/contracts/shipmentDispatched.js +35 -0
  173. package/dist/communications/contracts/shipmentException.d.ts +21 -0
  174. package/dist/communications/contracts/shipmentException.js +26 -0
  175. package/dist/communications/contracts/subscriptionActivationActionRequired.d.ts +17 -0
  176. package/dist/communications/contracts/subscriptionActivationActionRequired.js +22 -0
  177. package/dist/communications/contracts/subscriptionAddressChanged.d.ts +19 -0
  178. package/dist/communications/contracts/subscriptionAddressChanged.js +25 -0
  179. package/dist/communications/contracts/subscriptionCancelled.d.ts +19 -0
  180. package/dist/communications/contracts/subscriptionCancelled.js +25 -0
  181. package/dist/communications/contracts/subscriptionCycleSkipped.d.ts +25 -0
  182. package/dist/communications/contracts/subscriptionCycleSkipped.js +40 -0
  183. package/dist/communications/contracts/subscriptionDeliveryRescheduled.d.ts +25 -0
  184. package/dist/communications/contracts/subscriptionDeliveryRescheduled.js +39 -0
  185. package/dist/communications/contracts/subscriptionEmailContent.d.ts +145 -0
  186. package/dist/communications/contracts/subscriptionEmailContent.js +1 -0
  187. package/dist/communications/contracts/subscriptionPackageChanged.d.ts +20 -0
  188. package/dist/communications/contracts/subscriptionPackageChanged.js +26 -0
  189. package/dist/communications/contracts/subscriptionPauseReminder.d.ts +23 -0
  190. package/dist/communications/contracts/subscriptionPauseReminder.js +29 -0
  191. package/dist/communications/contracts/subscriptionPaused.d.ts +21 -0
  192. package/dist/communications/contracts/subscriptionPaused.js +25 -0
  193. package/dist/communications/contracts/subscriptionPaymentExpired.d.ts +34 -0
  194. package/dist/communications/contracts/subscriptionPaymentExpired.js +37 -0
  195. package/dist/communications/contracts/subscriptionPaymentFailed.d.ts +49 -0
  196. package/dist/communications/contracts/subscriptionPaymentFailed.js +56 -0
  197. package/dist/communications/contracts/subscriptionPaymentRecovered.d.ts +19 -0
  198. package/dist/communications/contracts/subscriptionPaymentRecovered.js +22 -0
  199. package/dist/communications/contracts/subscriptionRenewalAtRisk.d.ts +36 -0
  200. package/dist/communications/contracts/subscriptionRenewalAtRisk.js +36 -0
  201. package/dist/communications/contracts/subscriptionRenewalUpcoming.d.ts +49 -0
  202. package/dist/communications/contracts/subscriptionRenewalUpcoming.js +43 -0
  203. package/dist/communications/contracts/subscriptionResumed.d.ts +23 -0
  204. package/dist/communications/contracts/subscriptionResumed.js +25 -0
  205. package/dist/communications/contracts/subscriptionWelcome.d.ts +44 -0
  206. package/dist/communications/contracts/subscriptionWelcome.js +45 -0
  207. package/dist/communications/contracts/subscriptionWinback.d.ts +21 -0
  208. package/dist/communications/contracts/subscriptionWinback.js +28 -0
  209. package/dist/communications/contracts/transactionalDelivery.d.ts +42 -0
  210. package/dist/communications/contracts/transactionalDelivery.js +1 -0
  211. package/dist/communications/contracts/types.d.ts +46 -0
  212. package/dist/communications/contracts/types.js +1 -0
  213. package/dist/communications/contribution.d.ts +10 -0
  214. package/dist/communications/contribution.js +24 -0
  215. package/dist/communications/deliveryReconciliation.d.ts +64 -0
  216. package/dist/communications/deliveryReconciliation.js +60 -0
  217. package/dist/communications/emailEgress.d.ts +38 -0
  218. package/dist/communications/emailEgress.js +100 -0
  219. package/dist/communications/emailHealthAssessment.d.ts +39 -0
  220. package/dist/communications/emailHealthAssessment.js +59 -0
  221. package/dist/communications/emailHealthMetricsPort.d.ts +17 -0
  222. package/dist/communications/emailHealthMetricsPort.js +1 -0
  223. package/dist/communications/emailNotificationControl.d.ts +27 -0
  224. package/dist/communications/emailNotificationControl.js +10 -0
  225. package/dist/communications/emailObservation.d.ts +28 -0
  226. package/dist/communications/emailObservation.js +23 -0
  227. package/dist/communications/emailTransport.d.ts +82 -0
  228. package/dist/communications/emailTransport.js +95 -0
  229. package/dist/communications/errors.d.ts +15 -0
  230. package/dist/communications/errors.js +30 -0
  231. package/dist/communications/index.d.ts +47 -0
  232. package/dist/communications/index.js +38 -0
  233. package/dist/communications/integrationEventSignature.d.ts +15 -0
  234. package/dist/communications/integrationEventSignature.js +37 -0
  235. package/dist/communications/klaviyo/consentPush.d.ts +51 -0
  236. package/dist/communications/klaviyo/consentPush.js +19 -0
  237. package/dist/communications/klaviyo/index.d.ts +110 -0
  238. package/dist/communications/klaviyo/index.js +860 -0
  239. package/dist/communications/managedTransactionalDeliveryStore.d.ts +12 -0
  240. package/dist/communications/managedTransactionalDeliveryStore.js +49 -0
  241. package/dist/communications/nativeOperations.d.ts +79 -0
  242. package/dist/communications/nativeOperations.js +3 -0
  243. package/dist/communications/newsletterIntegrationContracts.d.ts +130 -0
  244. package/dist/communications/newsletterIntegrationContracts.js +128 -0
  245. package/dist/communications/newsletterWebhookPort.d.ts +11 -0
  246. package/dist/communications/newsletterWebhookPort.js +84 -0
  247. package/dist/communications/newsletterWebhookProcessing.d.ts +17 -0
  248. package/dist/communications/newsletterWebhookProcessing.js +71 -0
  249. package/dist/communications/originPolicy.d.ts +40 -0
  250. package/dist/communications/originPolicy.js +100 -0
  251. package/dist/communications/postgresCommunicationSync.d.ts +79 -0
  252. package/dist/communications/postgresCommunicationSync.js +111 -0
  253. package/dist/communications/postgresConsentEvaluator.d.ts +19 -0
  254. package/dist/communications/postgresConsentEvaluator.js +43 -0
  255. package/dist/communications/postgresDeliveryReconciliation.d.ts +3 -0
  256. package/dist/communications/postgresDeliveryReconciliation.js +113 -0
  257. package/dist/communications/postgresNativeOperations.d.ts +13 -0
  258. package/dist/communications/postgresNativeOperations.js +63 -0
  259. package/dist/communications/postgresNotificationRecipients.d.ts +37 -0
  260. package/dist/communications/postgresNotificationRecipients.js +60 -0
  261. package/dist/communications/postgresTransactionalDeliveryStore.d.ts +7 -0
  262. package/dist/communications/postgresTransactionalDeliveryStore.js +55 -0
  263. package/dist/communications/preferencesToken.d.ts +10 -0
  264. package/dist/communications/preferencesToken.js +40 -0
  265. package/dist/communications/publicPreferenceToken.d.ts +24 -0
  266. package/dist/communications/publicPreferenceToken.js +53 -0
  267. package/dist/communications/resend/index.d.ts +40 -0
  268. package/dist/communications/resend/index.js +310 -0
  269. package/dist/communications/shipmentNotifications.d.ts +34 -0
  270. package/dist/communications/shipmentNotifications.js +61 -0
  271. package/dist/communications/sql.d.ts +26 -0
  272. package/dist/communications/sql.js +7 -0
  273. package/dist/communications/standardWebhooks.d.ts +14 -0
  274. package/dist/communications/standardWebhooks.js +73 -0
  275. package/dist/communications/status.d.ts +11 -0
  276. package/dist/communications/status.js +36 -0
  277. package/dist/communications/transactionalDelivery.d.ts +19 -0
  278. package/dist/communications/transactionalDelivery.js +96 -0
  279. package/dist/communications/transactionalDeliveryIdentifier.d.ts +3 -0
  280. package/dist/communications/transactionalDeliveryIdentifier.js +6 -0
  281. package/dist/communications/unsubscribeToken.d.ts +77 -0
  282. package/dist/communications/unsubscribeToken.js +150 -0
  283. package/dist/communications/validation.d.ts +2 -0
  284. package/dist/communications/validation.js +3 -0
  285. package/dist/composition/catalogContribution.d.ts +18 -0
  286. package/dist/composition/catalogContribution.js +21 -0
  287. package/dist/composition/index.d.ts +1 -0
  288. package/dist/composition/index.js +1 -0
  289. package/dist/http/index.d.ts +1 -0
  290. package/dist/http/index.js +1 -0
  291. package/dist/http/webhookSignature.d.ts +42 -0
  292. package/dist/http/webhookSignature.js +86 -0
  293. package/dist/identity/customerContracts.d.ts +2 -2
  294. package/dist/inventory/adminInventory.d.ts +13 -0
  295. package/dist/inventory/adminInventory.js +214 -0
  296. package/dist/inventory/contracts/forecast.d.ts +86 -0
  297. package/dist/inventory/contracts/forecast.js +1 -0
  298. package/dist/inventory/contracts/index.d.ts +4 -0
  299. package/dist/inventory/contracts/index.js +1 -0
  300. package/dist/inventory/contracts/inventory.d.ts +157 -0
  301. package/dist/inventory/contracts/inventory.js +1 -0
  302. package/dist/inventory/contracts/newPurchaseStock.d.ts +20 -0
  303. package/dist/inventory/contracts/newPurchaseStock.js +1 -0
  304. package/dist/inventory/contracts/reservation.d.ts +18 -0
  305. package/dist/inventory/contracts/reservation.js +1 -0
  306. package/dist/inventory/forecast.d.ts +24 -0
  307. package/dist/inventory/forecast.js +200 -0
  308. package/dist/inventory/index.d.ts +13 -0
  309. package/dist/inventory/index.js +10 -0
  310. package/dist/inventory/inventoryHandlers.d.ts +53 -0
  311. package/dist/inventory/inventoryHandlers.js +151 -0
  312. package/dist/inventory/newPurchaseStockAvailability.d.ts +47 -0
  313. package/dist/inventory/newPurchaseStockAvailability.js +75 -0
  314. package/dist/inventory/ports.d.ts +21 -0
  315. package/dist/inventory/ports.js +16 -0
  316. package/dist/inventory/renewalReservation.d.ts +27 -0
  317. package/dist/inventory/renewalReservation.js +61 -0
  318. package/dist/inventory/reservationPolicy.d.ts +6 -0
  319. package/dist/inventory/reservationPolicy.js +19 -0
  320. package/dist/inventory/schemas.d.ts +137 -0
  321. package/dist/inventory/schemas.js +112 -0
  322. package/dist/inventory/sql.d.ts +14 -0
  323. package/dist/inventory/sql.js +5 -0
  324. package/dist/inventory/subscriptionForecastCalculation.d.ts +4 -0
  325. package/dist/inventory/subscriptionForecastCalculation.js +133 -0
  326. package/dist/pricing/acquisitionFinancialPolicy.d.ts +26 -0
  327. package/dist/pricing/acquisitionFinancialPolicy.js +1 -0
  328. package/dist/pricing/acquisitionOfferPricing.d.ts +27 -0
  329. package/dist/pricing/acquisitionOfferPricing.js +25 -0
  330. package/dist/pricing/acquisitionOfferPricingHandler.d.ts +20 -0
  331. package/dist/pricing/acquisitionOfferPricingHandler.js +105 -0
  332. package/dist/pricing/acquisitionOfferPricingSchemas.d.ts +31 -0
  333. package/dist/pricing/acquisitionOfferPricingSchemas.js +33 -0
  334. package/dist/pricing/acquisitionQuoteBinding.d.ts +12 -0
  335. package/dist/pricing/acquisitionQuoteBinding.js +12 -0
  336. package/dist/pricing/acquisitionReadiness.d.ts +31 -0
  337. package/dist/pricing/acquisitionReadiness.js +117 -0
  338. package/dist/pricing/acquisitionTerms.d.ts +19 -0
  339. package/dist/pricing/acquisitionTerms.js +126 -0
  340. package/dist/pricing/acquisitionTermsSchemas.d.ts +59 -0
  341. package/dist/pricing/acquisitionTermsSchemas.js +42 -0
  342. package/dist/pricing/catalogFactsProvenance.d.ts +33 -0
  343. package/dist/pricing/catalogFactsProvenance.js +64 -0
  344. package/dist/pricing/catalogFactsSchemas.d.ts +45 -0
  345. package/dist/pricing/catalogFactsSchemas.js +58 -0
  346. package/dist/pricing/commerceOfferPricing.d.ts +25 -0
  347. package/dist/pricing/commerceOfferPricing.js +139 -0
  348. package/dist/pricing/commerceOfferPricingCache.d.ts +10 -0
  349. package/dist/pricing/commerceOfferPricingCache.js +44 -0
  350. package/dist/pricing/commerceOfferPricingHandler.d.ts +21 -0
  351. package/dist/pricing/commerceOfferPricingHandler.js +78 -0
  352. package/dist/pricing/commercePriceAuthority.d.ts +26 -0
  353. package/dist/pricing/commercePriceAuthority.js +79 -0
  354. package/dist/pricing/commercePricingPolicyErrors.d.ts +40 -0
  355. package/dist/pricing/commercePricingPolicyErrors.js +67 -0
  356. package/dist/pricing/commerceQuoteBatchHandler.d.ts +37 -0
  357. package/dist/pricing/commerceQuoteBatchHandler.js +83 -0
  358. package/dist/pricing/commerceQuoteCatalogReadPort.d.ts +27 -0
  359. package/dist/pricing/commerceQuoteCatalogReadPort.js +8 -0
  360. package/dist/pricing/commerceQuoteHandler.d.ts +31 -0
  361. package/dist/pricing/commerceQuoteHandler.js +110 -0
  362. package/dist/pricing/commerceQuoteSnapshotExpect.d.ts +9 -0
  363. package/dist/pricing/commerceQuoteSnapshotExpect.js +22 -0
  364. package/dist/pricing/contracts/acquisitionTerms.d.ts +32 -0
  365. package/dist/pricing/contracts/acquisitionTerms.js +2 -0
  366. package/dist/pricing/contracts/authority.d.ts +27 -0
  367. package/dist/pricing/contracts/authority.js +1 -0
  368. package/dist/pricing/contracts/evidence.d.ts +33 -0
  369. package/dist/pricing/contracts/evidence.js +1 -0
  370. package/dist/pricing/contracts/index.d.ts +17 -0
  371. package/dist/pricing/contracts/index.js +7 -0
  372. package/dist/pricing/contracts/money.d.ts +27 -0
  373. package/dist/pricing/contracts/money.js +1 -0
  374. package/dist/pricing/contracts/offer.d.ts +52 -0
  375. package/dist/pricing/contracts/offer.js +4 -0
  376. package/dist/pricing/contracts/offerPolicy.d.ts +16 -0
  377. package/dist/pricing/contracts/offerPolicy.js +5 -0
  378. package/dist/pricing/contracts/policy.d.ts +22 -0
  379. package/dist/pricing/contracts/policy.js +3 -0
  380. package/dist/pricing/contracts/provenance.d.ts +24 -0
  381. package/dist/pricing/contracts/provenance.js +2 -0
  382. package/dist/pricing/contracts/quote.d.ts +94 -0
  383. package/dist/pricing/contracts/quote.js +1 -0
  384. package/dist/pricing/dbBackedCommerceQuoteHelpers.d.ts +78 -0
  385. package/dist/pricing/dbBackedCommerceQuoteHelpers.js +146 -0
  386. package/dist/pricing/dbBackedCommerceQuotePort.d.ts +66 -0
  387. package/dist/pricing/dbBackedCommerceQuotePort.js +206 -0
  388. package/dist/pricing/dbBackedCommerceQuoteSnapshotVerifier.d.ts +4 -0
  389. package/dist/pricing/dbBackedCommerceQuoteSnapshotVerifier.js +25 -0
  390. package/dist/pricing/index.d.ts +51 -0
  391. package/dist/pricing/index.js +36 -0
  392. package/dist/pricing/offerPolicyReadiness.d.ts +21 -0
  393. package/dist/pricing/offerPolicyReadiness.js +79 -0
  394. package/dist/pricing/offerPolicySchemas.d.ts +25 -0
  395. package/dist/pricing/offerPolicySchemas.js +15 -0
  396. package/dist/pricing/offerPricingSchemas.d.ts +315 -0
  397. package/dist/pricing/offerPricingSchemas.js +65 -0
  398. package/dist/pricing/ports.d.ts +13 -0
  399. package/dist/pricing/ports.js +9 -0
  400. package/dist/pricing/pricingPolicyToken.d.ts +39 -0
  401. package/dist/pricing/pricingPolicyToken.js +84 -0
  402. package/dist/pricing/quoteAcquisitionTerms.d.ts +2 -0
  403. package/dist/pricing/quoteAcquisitionTerms.js +4 -0
  404. package/dist/pricing/quoteCodeRejectionDetails.d.ts +20 -0
  405. package/dist/pricing/quoteCodeRejectionDetails.js +22 -0
  406. package/dist/pricing/quotePorts.d.ts +30 -0
  407. package/dist/pricing/quotePorts.js +20 -0
  408. package/dist/pricing/quotePrimitives.d.ts +13 -0
  409. package/dist/pricing/quotePrimitives.js +18 -0
  410. package/dist/pricing/quotePromotionEvidence.d.ts +39 -0
  411. package/dist/pricing/quotePromotionEvidence.js +73 -0
  412. package/dist/pricing/quoteSchemas.d.ts +1176 -0
  413. package/dist/pricing/quoteSchemas.js +196 -0
  414. package/dist/pricing/subscriptionPricePolicy.d.ts +52 -0
  415. package/dist/pricing/subscriptionPricePolicy.js +96 -0
  416. package/dist/pricing/taxProfileGuard.d.ts +2 -0
  417. package/dist/pricing/taxProfileGuard.js +24 -0
  418. package/dist/pricing/validation.d.ts +2 -0
  419. package/dist/pricing/validation.js +3 -0
  420. package/dist/promotions/adminBindings.d.ts +72 -0
  421. package/dist/promotions/adminBindings.js +1 -0
  422. package/dist/promotions/adminPromotionCodesContracts.d.ts +498 -0
  423. package/dist/promotions/adminPromotionCodesContracts.js +211 -0
  424. package/dist/promotions/adminPromotionCodesDataPort.d.ts +47 -0
  425. package/dist/promotions/adminPromotionCodesDataPort.js +1 -0
  426. package/dist/promotions/adminPromotionCodesHandler.d.ts +14 -0
  427. package/dist/promotions/adminPromotionCodesHandler.js +194 -0
  428. package/dist/promotions/adminPromotionsContracts.d.ts +235 -0
  429. package/dist/promotions/adminPromotionsContracts.js +99 -0
  430. package/dist/promotions/adminPromotionsDataPort.d.ts +42 -0
  431. package/dist/promotions/adminPromotionsDataPort.js +1 -0
  432. package/dist/promotions/adminPromotionsHandler.d.ts +16 -0
  433. package/dist/promotions/adminPromotionsHandler.js +47 -0
  434. package/dist/promotions/contracts/index.d.ts +387 -0
  435. package/dist/promotions/contracts/index.js +1 -0
  436. package/dist/promotions/index.d.ts +22 -0
  437. package/dist/promotions/index.js +21 -0
  438. package/dist/promotions/promoDataPort.d.ts +47 -0
  439. package/dist/promotions/promoDataPort.js +14 -0
  440. package/dist/promotions/promotionAcceptanceTelemetry.d.ts +29 -0
  441. package/dist/promotions/promotionAcceptanceTelemetry.js +45 -0
  442. package/dist/promotions/promotionBenefitDefinition.d.ts +37 -0
  443. package/dist/promotions/promotionBenefitDefinition.js +33 -0
  444. package/dist/promotions/promotionClaimSweepPort.d.ts +14 -0
  445. package/dist/promotions/promotionClaimSweepPort.js +8 -0
  446. package/dist/promotions/promotionClaims.d.ts +5 -0
  447. package/dist/promotions/promotionClaims.js +57 -0
  448. package/dist/promotions/promotionCodePreview.d.ts +11 -0
  449. package/dist/promotions/promotionCodePreview.js +154 -0
  450. package/dist/promotions/promotionCodeQuotePort.d.ts +25 -0
  451. package/dist/promotions/promotionCodeQuotePort.js +1 -0
  452. package/dist/promotions/promotionQuoteAcceptance.d.ts +65 -0
  453. package/dist/promotions/promotionQuoteAcceptance.js +202 -0
  454. package/dist/promotions/promotionQuoteBinding.d.ts +71 -0
  455. package/dist/promotions/promotionQuoteBinding.js +85 -0
  456. package/dist/promotions/quoteAutomaticPromotions.d.ts +24 -0
  457. package/dist/promotions/quoteAutomaticPromotions.js +36 -0
  458. package/dist/promotions/quotePromoDiscounts.d.ts +32 -0
  459. package/dist/promotions/quotePromoDiscounts.js +140 -0
  460. package/dist/promotions/quotePromotionCodeAdjustments.d.ts +27 -0
  461. package/dist/promotions/quotePromotionCodeAdjustments.js +223 -0
  462. package/dist/promotions/quotePromotionV2.d.ts +29 -0
  463. package/dist/promotions/quotePromotionV2.js +174 -0
  464. package/dist/promotions/sql.d.ts +14 -0
  465. package/dist/promotions/sql.js +5 -0
  466. package/dist/promotions/validation.d.ts +2 -0
  467. package/dist/promotions/validation.js +3 -0
  468. package/dist/shipping/addressCanonLookupHandler.d.ts +7 -0
  469. package/dist/shipping/addressCanonLookupHandler.js +105 -0
  470. package/dist/shipping/addressCanonical.d.ts +2 -0
  471. package/dist/shipping/addressCanonical.js +26 -0
  472. package/dist/shipping/addressPorts.d.ts +39 -0
  473. package/dist/shipping/addressPorts.js +1 -0
  474. package/dist/shipping/addressSchemas.d.ts +30 -0
  475. package/dist/shipping/addressSchemas.js +1 -0
  476. package/dist/shipping/adminShippingRateHandler.d.ts +4 -0
  477. package/dist/shipping/adminShippingRateHandler.js +64 -0
  478. package/dist/shipping/contracts/address.d.ts +144 -0
  479. package/dist/shipping/contracts/address.js +1 -0
  480. package/dist/shipping/contracts/delivery.d.ts +110 -0
  481. package/dist/shipping/contracts/delivery.js +1 -0
  482. package/dist/shipping/contracts/index.d.ts +3 -0
  483. package/dist/shipping/contracts/index.js +1 -0
  484. package/dist/shipping/contracts/shippingRate.d.ts +11 -0
  485. package/dist/shipping/contracts/shippingRate.js +1 -0
  486. package/dist/shipping/customerAddressesHandler.d.ts +5 -0
  487. package/dist/shipping/customerAddressesHandler.js +80 -0
  488. package/dist/shipping/customerSelfServiceAddressModels.d.ts +27 -0
  489. package/dist/shipping/customerSelfServiceAddressModels.js +101 -0
  490. package/dist/shipping/deliverySelectionHandler.d.ts +10 -0
  491. package/dist/shipping/deliverySelectionHandler.js +77 -0
  492. package/dist/shipping/deliverySelectionPort.d.ts +8 -0
  493. package/dist/shipping/deliverySelectionPort.js +1 -0
  494. package/dist/shipping/deliverySelectionSummary.d.ts +2 -0
  495. package/dist/shipping/deliverySelectionSummary.js +53 -0
  496. package/dist/shipping/handlerSchemas.d.ts +21 -0
  497. package/dist/shipping/handlerSchemas.js +1 -0
  498. package/dist/shipping/index.d.ts +17 -0
  499. package/dist/shipping/index.js +8 -0
  500. package/dist/shipping/pickupPointSearchPort.d.ts +4 -0
  501. package/dist/shipping/pickupPointSearchPort.js +1 -0
  502. package/dist/shipping/readDeliverySelectionEvidence.d.ts +2 -0
  503. package/dist/shipping/readDeliverySelectionEvidence.js +44 -0
  504. package/dist/shipping/shippingRatePorts.d.ts +52 -0
  505. package/dist/shipping/shippingRatePorts.js +1 -0
  506. package/package.json +72 -2
  507. package/release-gates.json +249 -8
  508. package/sql/20260807140000_read_parity_catalog.sql +94 -0
  509. package/sql/20260807190000_comms_outbox_rail.sql +329 -0
  510. package/sql/20260810120000_storefront_catalog_attributes.sql +51 -0
  511. package/sql/20260810120001_transactional_delivery_receipts.sql +209 -0
  512. package/sql/20260812140000_sellable_bundle_catalog.sql +124 -0
  513. package/sql/20260812210000_bundle_operator_write_boundary.sql +567 -0
  514. package/sql/20260813120000_communications_control_plane.sql +568 -0
  515. package/sql/20260814000000_fulfillment_stock_evidence.sql +239 -0
  516. package/sql/20260815120000_automatic_subscription_renewal.sql +1083 -0
  517. package/sql/20260817180000_promotion_claim_lifecycle.sql +591 -0
  518. package/sql/20260817180100_promotion_claim_lifecycle_validation.sql +23 -0
  519. package/sql/20260827220000_catalog_document_revision_foundation.sql +226 -0
  520. package/sql/20260827220001_catalog_document_revision_foundation_validate.sql +10 -0
  521. package/sql/20260908100000_catalog_draft_foundation.sql +217 -0
  522. package/sql/20261019200000_communications_native_operations.sql +68 -0
  523. package/src/catalog/activeSkuSelection.ts +20 -0
  524. package/src/catalog/adminBindings.ts +59 -0
  525. package/src/catalog/adminBundleHandler.ts +165 -0
  526. package/src/catalog/adminBundleReadHandler.ts +261 -0
  527. package/src/catalog/adminBundleWritePort.ts +102 -0
  528. package/src/catalog/bundleAvailability.ts +129 -0
  529. package/src/catalog/bundleAvailabilityService.ts +171 -0
  530. package/src/catalog/bundleBindings.ts +29 -0
  531. package/src/catalog/bundleCatalogQueries.ts +98 -0
  532. package/src/catalog/bundleCatalogReadPort.ts +177 -0
  533. package/src/catalog/bundleCatalogStore.ts +269 -0
  534. package/src/catalog/bundleRuleCodes.ts +134 -0
  535. package/src/catalog/bundleRules.ts +153 -0
  536. package/src/catalog/catalogDraftStore.ts +71 -0
  537. package/src/catalog/catalogSkuEnvelope.ts +214 -0
  538. package/src/catalog/catalogSkuEnvelopeMapper.ts +160 -0
  539. package/src/catalog/contracts/bundleAdmin.ts +20 -0
  540. package/src/catalog/contracts/bundleAvailability.ts +5 -0
  541. package/src/catalog/contracts/bundleRead.ts +13 -0
  542. package/src/catalog/contracts/draft.ts +69 -0
  543. package/src/catalog/contracts/foundation.ts +104 -0
  544. package/src/catalog/contracts/index.ts +14 -0
  545. package/src/catalog/contracts/lifecycle.ts +74 -0
  546. package/src/catalog/contracts/productMediaContracts.ts +170 -0
  547. package/src/catalog/contracts/productTypes.ts +35 -0
  548. package/src/catalog/contracts/resolveProductMedia.ts +85 -0
  549. package/src/catalog/contracts/sellable.ts +12 -0
  550. package/src/catalog/draftHandler.ts +105 -0
  551. package/src/catalog/draftPorts.ts +18 -0
  552. package/src/catalog/draftSchemas.ts +88 -0
  553. package/src/catalog/draftValidation.ts +100 -0
  554. package/src/catalog/foundationSchemas.ts +123 -0
  555. package/src/catalog/index.ts +43 -0
  556. package/src/catalog/mediaSourcePack.ts +219 -0
  557. package/src/catalog/productTypeSchemas.ts +70 -0
  558. package/src/catalog/publicationPorts.ts +44 -0
  559. package/src/catalog/readPorts.ts +61 -0
  560. package/src/catalog/referenceCatalogHandler.ts +39 -0
  561. package/src/catalog/resolvedSkuProjection.ts +76 -0
  562. package/src/catalog/sellableBundleHandler.ts +133 -0
  563. package/src/catalog/sellableSchemas.ts +33 -0
  564. package/src/catalog/sql.ts +14 -0
  565. package/src/catalog/validation.ts +3 -0
  566. package/src/communications/accountingDocumentDelivery.ts +63 -0
  567. package/src/communications/authEmailError.ts +10 -0
  568. package/src/communications/authEmailPorts.ts +2 -0
  569. package/src/communications/authSendEmailHook.ts +310 -0
  570. package/src/communications/capturedTransactionalDelivery.ts +29 -0
  571. package/src/communications/communicationSync.ts +96 -0
  572. package/src/communications/communicationSyncWorker.ts +302 -0
  573. package/src/communications/consentPolicy.ts +82 -0
  574. package/src/communications/consentPurposeRegistry.ts +31 -0
  575. package/src/communications/contracts/abandonedCart.ts +64 -0
  576. package/src/communications/contracts/authEmail.ts +73 -0
  577. package/src/communications/contracts/backInStock.ts +69 -0
  578. package/src/communications/contracts/blocks.ts +47 -0
  579. package/src/communications/contracts/checkoutExpired.ts +62 -0
  580. package/src/communications/contracts/checkoutRecovery.ts +68 -0
  581. package/src/communications/contracts/commerceEmailContent.ts +189 -0
  582. package/src/communications/contracts/commerceEngagementEmailContent.ts +106 -0
  583. package/src/communications/contracts/consent.ts +13 -0
  584. package/src/communications/contracts/email.ts +210 -0
  585. package/src/communications/contracts/guideCard.ts +34 -0
  586. package/src/communications/contracts/index.ts +52 -0
  587. package/src/communications/contracts/inquiryContent.ts +53 -0
  588. package/src/communications/contracts/invoiceDocumentContent.ts +57 -0
  589. package/src/communications/contracts/marketingAutomation.ts +45 -0
  590. package/src/communications/contracts/marketingSync.ts +109 -0
  591. package/src/communications/contracts/newsletter.ts +78 -0
  592. package/src/communications/contracts/newsletterWebhook.ts +23 -0
  593. package/src/communications/contracts/optOutContent.ts +23 -0
  594. package/src/communications/contracts/orderCanceled.ts +64 -0
  595. package/src/communications/contracts/orderDraft.ts +112 -0
  596. package/src/communications/contracts/orderPaid.ts +147 -0
  597. package/src/communications/contracts/orderRefunded.ts +63 -0
  598. package/src/communications/contracts/paymentFailed.ts +59 -0
  599. package/src/communications/contracts/publicIntake.ts +53 -0
  600. package/src/communications/contracts/render.ts +271 -0
  601. package/src/communications/contracts/reorderReminder.ts +59 -0
  602. package/src/communications/contracts/returnEmails.ts +113 -0
  603. package/src/communications/contracts/reviewEffects.ts +60 -0
  604. package/src/communications/contracts/reviewRequest.ts +59 -0
  605. package/src/communications/contracts/roleNotificationContent.ts +65 -0
  606. package/src/communications/contracts/shipmentDelivered.ts +59 -0
  607. package/src/communications/contracts/shipmentDispatched.ts +77 -0
  608. package/src/communications/contracts/shipmentException.ts +62 -0
  609. package/src/communications/contracts/subscriptionActivationActionRequired.ts +37 -0
  610. package/src/communications/contracts/subscriptionAddressChanged.ts +56 -0
  611. package/src/communications/contracts/subscriptionCancelled.ts +57 -0
  612. package/src/communications/contracts/subscriptionCycleSkipped.ts +80 -0
  613. package/src/communications/contracts/subscriptionDeliveryRescheduled.ts +79 -0
  614. package/src/communications/contracts/subscriptionEmailContent.ts +163 -0
  615. package/src/communications/contracts/subscriptionPackageChanged.ts +59 -0
  616. package/src/communications/contracts/subscriptionPauseReminder.ts +63 -0
  617. package/src/communications/contracts/subscriptionPaused.ts +58 -0
  618. package/src/communications/contracts/subscriptionPaymentExpired.ts +83 -0
  619. package/src/communications/contracts/subscriptionPaymentFailed.ts +117 -0
  620. package/src/communications/contracts/subscriptionPaymentRecovered.ts +50 -0
  621. package/src/communications/contracts/subscriptionRenewalAtRisk.ts +85 -0
  622. package/src/communications/contracts/subscriptionRenewalUpcoming.ts +103 -0
  623. package/src/communications/contracts/subscriptionResumed.ts +60 -0
  624. package/src/communications/contracts/subscriptionWelcome.ts +102 -0
  625. package/src/communications/contracts/subscriptionWinback.ts +62 -0
  626. package/src/communications/contracts/transactionalDelivery.ts +43 -0
  627. package/src/communications/contracts/types.ts +58 -0
  628. package/src/communications/contribution.ts +33 -0
  629. package/src/communications/deliveryReconciliation.ts +108 -0
  630. package/src/communications/emailEgress.ts +111 -0
  631. package/src/communications/emailHealthAssessment.ts +106 -0
  632. package/src/communications/emailHealthMetricsPort.ts +17 -0
  633. package/src/communications/emailNotificationControl.ts +28 -0
  634. package/src/communications/emailObservation.ts +43 -0
  635. package/src/communications/emailTransport.ts +167 -0
  636. package/src/communications/errors.ts +34 -0
  637. package/src/communications/index.ts +47 -0
  638. package/src/communications/integrationEventSignature.ts +49 -0
  639. package/src/communications/klaviyo/consentPush.ts +19 -0
  640. package/src/communications/klaviyo/index.ts +649 -0
  641. package/src/communications/managedTransactionalDeliveryStore.ts +59 -0
  642. package/src/communications/nativeOperations.ts +40 -0
  643. package/src/communications/newsletterIntegrationContracts.ts +154 -0
  644. package/src/communications/newsletterWebhookPort.ts +104 -0
  645. package/src/communications/newsletterWebhookProcessing.ts +102 -0
  646. package/src/communications/originPolicy.ts +151 -0
  647. package/src/communications/postgresCommunicationSync.ts +127 -0
  648. package/src/communications/postgresConsentEvaluator.ts +49 -0
  649. package/src/communications/postgresDeliveryReconciliation.ts +101 -0
  650. package/src/communications/postgresNativeOperations.ts +55 -0
  651. package/src/communications/postgresNotificationRecipients.ts +57 -0
  652. package/src/communications/postgresTransactionalDeliveryStore.ts +79 -0
  653. package/src/communications/preferencesToken.ts +62 -0
  654. package/src/communications/publicPreferenceToken.ts +68 -0
  655. package/src/communications/resend/index.ts +350 -0
  656. package/src/communications/shipmentNotifications.ts +78 -0
  657. package/src/communications/sql.ts +7 -0
  658. package/src/communications/standardWebhooks.ts +84 -0
  659. package/src/communications/status.ts +51 -0
  660. package/src/communications/transactionalDelivery.ts +114 -0
  661. package/src/communications/transactionalDeliveryIdentifier.ts +9 -0
  662. package/src/communications/unsubscribeToken.ts +186 -0
  663. package/src/communications/validation.ts +3 -0
  664. package/src/composition/catalogContribution.ts +32 -0
  665. package/src/composition/index.ts +1 -0
  666. package/src/http/index.ts +1 -0
  667. package/src/http/webhookSignature.ts +96 -0
  668. package/src/inventory/adminInventory.ts +251 -0
  669. package/src/inventory/contracts/forecast.ts +96 -0
  670. package/src/inventory/contracts/index.ts +18 -0
  671. package/src/inventory/contracts/inventory.ts +14 -0
  672. package/src/inventory/contracts/newPurchaseStock.ts +23 -0
  673. package/src/inventory/contracts/reservation.ts +20 -0
  674. package/src/inventory/forecast.ts +239 -0
  675. package/src/inventory/index.ts +21 -0
  676. package/src/inventory/inventoryHandlers.ts +215 -0
  677. package/src/inventory/newPurchaseStockAvailability.ts +120 -0
  678. package/src/inventory/ports.ts +46 -0
  679. package/src/inventory/renewalReservation.ts +88 -0
  680. package/src/inventory/reservationPolicy.ts +27 -0
  681. package/src/inventory/schemas.ts +128 -0
  682. package/src/inventory/sql.ts +5 -0
  683. package/src/inventory/subscriptionForecastCalculation.ts +157 -0
  684. package/src/pricing/acquisitionFinancialPolicy.ts +26 -0
  685. package/src/pricing/acquisitionOfferPricing.ts +38 -0
  686. package/src/pricing/acquisitionOfferPricingHandler.ts +157 -0
  687. package/src/pricing/acquisitionOfferPricingSchemas.ts +35 -0
  688. package/src/pricing/acquisitionQuoteBinding.ts +12 -0
  689. package/src/pricing/acquisitionReadiness.ts +148 -0
  690. package/src/pricing/acquisitionTerms.ts +125 -0
  691. package/src/pricing/acquisitionTermsSchemas.ts +52 -0
  692. package/src/pricing/catalogFactsProvenance.ts +102 -0
  693. package/src/pricing/catalogFactsSchemas.ts +69 -0
  694. package/src/pricing/commerceOfferPricing.ts +224 -0
  695. package/src/pricing/commerceOfferPricingCache.ts +53 -0
  696. package/src/pricing/commerceOfferPricingHandler.ts +137 -0
  697. package/src/pricing/commercePriceAuthority.ts +104 -0
  698. package/src/pricing/commercePricingPolicyErrors.ts +88 -0
  699. package/src/pricing/commerceQuoteBatchHandler.ts +129 -0
  700. package/src/pricing/commerceQuoteCatalogReadPort.ts +42 -0
  701. package/src/pricing/commerceQuoteHandler.ts +184 -0
  702. package/src/pricing/commerceQuoteSnapshotExpect.ts +48 -0
  703. package/src/pricing/contracts/acquisitionTerms.ts +26 -0
  704. package/src/pricing/contracts/authority.ts +44 -0
  705. package/src/pricing/contracts/evidence.ts +25 -0
  706. package/src/pricing/contracts/index.ts +17 -0
  707. package/src/pricing/contracts/money.ts +32 -0
  708. package/src/pricing/contracts/offer.ts +42 -0
  709. package/src/pricing/contracts/offerPolicy.ts +17 -0
  710. package/src/pricing/contracts/policy.ts +26 -0
  711. package/src/pricing/contracts/provenance.ts +19 -0
  712. package/src/pricing/contracts/quote.ts +106 -0
  713. package/src/pricing/dbBackedCommerceQuoteHelpers.ts +256 -0
  714. package/src/pricing/dbBackedCommerceQuotePort.ts +260 -0
  715. package/src/pricing/dbBackedCommerceQuoteSnapshotVerifier.ts +49 -0
  716. package/src/pricing/index.ts +52 -0
  717. package/src/pricing/offerPolicyReadiness.ts +110 -0
  718. package/src/pricing/offerPolicySchemas.ts +23 -0
  719. package/src/pricing/offerPricingSchemas.ts +92 -0
  720. package/src/pricing/ports.ts +17 -0
  721. package/src/pricing/pricingPolicyToken.ts +119 -0
  722. package/src/pricing/quoteAcquisitionTerms.ts +10 -0
  723. package/src/pricing/quoteCodeRejectionDetails.ts +23 -0
  724. package/src/pricing/quotePorts.ts +58 -0
  725. package/src/pricing/quotePrimitives.ts +21 -0
  726. package/src/pricing/quotePromotionEvidence.ts +82 -0
  727. package/src/pricing/quoteSchemas.ts +230 -0
  728. package/src/pricing/subscriptionPricePolicy.ts +113 -0
  729. package/src/pricing/taxProfileGuard.ts +33 -0
  730. package/src/pricing/validation.ts +3 -0
  731. package/src/promotions/adminBindings.ts +53 -0
  732. package/src/promotions/adminPromotionCodesContracts.ts +244 -0
  733. package/src/promotions/adminPromotionCodesDataPort.ts +56 -0
  734. package/src/promotions/adminPromotionCodesHandler.ts +254 -0
  735. package/src/promotions/adminPromotionsContracts.ts +121 -0
  736. package/src/promotions/adminPromotionsDataPort.ts +48 -0
  737. package/src/promotions/adminPromotionsHandler.ts +72 -0
  738. package/src/promotions/contracts/index.ts +387 -0
  739. package/src/promotions/index.ts +22 -0
  740. package/src/promotions/promoDataPort.ts +65 -0
  741. package/src/promotions/promotionAcceptanceTelemetry.ts +73 -0
  742. package/src/promotions/promotionBenefitDefinition.ts +48 -0
  743. package/src/promotions/promotionClaimSweepPort.ts +23 -0
  744. package/src/promotions/promotionClaims.ts +70 -0
  745. package/src/promotions/promotionCodePreview.ts +183 -0
  746. package/src/promotions/promotionCodeQuotePort.ts +35 -0
  747. package/src/promotions/promotionQuoteAcceptance.ts +284 -0
  748. package/src/promotions/promotionQuoteBinding.ts +158 -0
  749. package/src/promotions/quoteAutomaticPromotions.ts +58 -0
  750. package/src/promotions/quotePromoDiscounts.ts +185 -0
  751. package/src/promotions/quotePromotionCodeAdjustments.ts +277 -0
  752. package/src/promotions/quotePromotionV2.ts +223 -0
  753. package/src/promotions/sql.ts +5 -0
  754. package/src/promotions/validation.ts +3 -0
  755. package/src/shipping/addressCanonLookupHandler.ts +114 -0
  756. package/src/shipping/addressCanonical.ts +31 -0
  757. package/src/shipping/addressPorts.ts +48 -0
  758. package/src/shipping/addressSchemas.ts +28 -0
  759. package/src/shipping/adminShippingRateHandler.ts +72 -0
  760. package/src/shipping/contracts/address.ts +71 -0
  761. package/src/shipping/contracts/delivery.ts +114 -0
  762. package/src/shipping/contracts/index.ts +18 -0
  763. package/src/shipping/contracts/shippingRate.ts +7 -0
  764. package/src/shipping/customerAddressesHandler.ts +100 -0
  765. package/src/shipping/customerSelfServiceAddressModels.ts +124 -0
  766. package/src/shipping/deliverySelectionHandler.ts +94 -0
  767. package/src/shipping/deliverySelectionPort.ts +10 -0
  768. package/src/shipping/deliverySelectionSummary.ts +56 -0
  769. package/src/shipping/handlerSchemas.ts +19 -0
  770. package/src/shipping/index.ts +23 -0
  771. package/src/shipping/pickupPointSearchPort.ts +8 -0
  772. package/src/shipping/readDeliverySelectionEvidence.ts +51 -0
  773. package/src/shipping/shippingRatePorts.ts +36 -0
@@ -4,3 +4,4 @@ export { NODE_HTTP_TIMEOUT_CODE, closeInputAfterResponse, runWithHttpDeadline, t
4
4
  export { applySecurityHeaders, contentTypeFor, looksLikeAsset, serveSpaStatic, type NodeSecurityHeaderPolicy, type StaticAssetReader, } from "./security.js";
5
5
  export { createDistStaticReader } from "./staticAssets.js";
6
6
  export { createNodeHttpRuntime, createRequestHandler, type HttpEntrypointRegistration, type HttpPathEntrypoint, type NodeCsrFallback, type NodeHttpRuntimeOptions, type NodeLegacyRedirect, } from "./runtime.js";
7
+ export { MAX_WEBHOOK_BODY_BYTES, WebhookBodyTooLargeError, readRawBody, verifyHmacSignature, timingSafeStringEqual } from "./webhookSignature.js";
@@ -3,3 +3,4 @@ export { NODE_HTTP_TIMEOUT_CODE, closeInputAfterResponse, runWithHttpDeadline, }
3
3
  export { applySecurityHeaders, contentTypeFor, looksLikeAsset, serveSpaStatic, } from "./security.js";
4
4
  export { createDistStaticReader } from "./staticAssets.js";
5
5
  export { createNodeHttpRuntime, createRequestHandler, } from "./runtime.js";
6
+ export { MAX_WEBHOOK_BODY_BYTES, WebhookBodyTooLargeError, readRawBody, verifyHmacSignature, timingSafeStringEqual } from "./webhookSignature.js";
@@ -0,0 +1,42 @@
1
+ import type { HttpRequest } from "./types.js";
2
+ /** Hard cap on raw webhook body bytes — the payment provider events are well under 256 KiB. */
3
+ export declare const MAX_WEBHOOK_BODY_BYTES = 1048576;
4
+ /** Thrown by readRawBody when the streamed body exceeds MAX_WEBHOOK_BODY_BYTES. */
5
+ export declare class WebhookBodyTooLargeError extends Error {
6
+ constructor();
7
+ }
8
+ /**
9
+ * Reads the exact raw request body bytes for provider webhook signature
10
+ * verification.
11
+ *
12
+ * `@vercel/node` (v3, the builder for `/api` functions in this Vite project)
13
+ * auto-parses `application/json` request bodies into `req.body` and IGNORES the
14
+ * `export const config = { api: { bodyParser: false } }` opt-out — that opt-out
15
+ * is a Next.js Pages Router convention, not a vanilla `@vercel/node` one
16
+ * (verified empirically against the hidden-preview deploy: a JSON payload posted
17
+ * with `Content-Type: application/json` arrives parsed, the same bytes posted as
18
+ * `text/plain` arrive raw). Re-serializing the parsed object with
19
+ * `JSON.stringify` does NOT reproduce the provider's exact bytes — the payment provider signs
20
+ * pretty-printed JSON, so a compacted re-serialization breaks HMAC verification.
21
+ *
22
+ * Reading the underlying request stream FIRST — before touching `req.body`,
23
+ * whose getter triggers the parse that consumes the stream — preserves the exact
24
+ * bytes when the platform parses lazily. When `req` is not a stream (unit tests
25
+ * pass a plain `{ body }` object) or the stream yields nothing (already
26
+ * consumed), we fall back to `req.body`.
27
+ */
28
+ export declare function readRawBody(req: HttpRequest): Promise<string>;
29
+ export declare function verifyHmacSignature(input: {
30
+ rawBody: string;
31
+ signatureHeader: string | undefined;
32
+ secret: string;
33
+ }): boolean;
34
+ /**
35
+ * Constant-time comparison of two shared-secret strings.
36
+ *
37
+ * Exported because it is not payment-specific: any route holding a shared token has to compare it
38
+ * the same way, and a second hand-rolled copy of a security primitive is how one of them quietly
39
+ * stops being constant-time. The length check comes first because `timingSafeEqual` THROWS on a
40
+ * length mismatch rather than returning false, and the length of a shared token is not the secret.
41
+ */
42
+ export declare function timingSafeStringEqual(left: string, right: string): boolean;
@@ -0,0 +1,86 @@
1
+ import { createHmac, timingSafeEqual } from "node:crypto";
2
+ /** Hard cap on raw webhook body bytes — the payment provider events are well under 256 KiB. */
3
+ export const MAX_WEBHOOK_BODY_BYTES = 1_048_576;
4
+ /** Thrown by readRawBody when the streamed body exceeds MAX_WEBHOOK_BODY_BYTES. */
5
+ export class WebhookBodyTooLargeError extends Error {
6
+ constructor() {
7
+ super("Webhook body exceeds maximum size");
8
+ this.name = "WebhookBodyTooLargeError";
9
+ }
10
+ }
11
+ /**
12
+ * Reads the exact raw request body bytes for provider webhook signature
13
+ * verification.
14
+ *
15
+ * `@vercel/node` (v3, the builder for `/api` functions in this Vite project)
16
+ * auto-parses `application/json` request bodies into `req.body` and IGNORES the
17
+ * `export const config = { api: { bodyParser: false } }` opt-out — that opt-out
18
+ * is a Next.js Pages Router convention, not a vanilla `@vercel/node` one
19
+ * (verified empirically against the hidden-preview deploy: a JSON payload posted
20
+ * with `Content-Type: application/json` arrives parsed, the same bytes posted as
21
+ * `text/plain` arrive raw). Re-serializing the parsed object with
22
+ * `JSON.stringify` does NOT reproduce the provider's exact bytes — the payment provider signs
23
+ * pretty-printed JSON, so a compacted re-serialization breaks HMAC verification.
24
+ *
25
+ * Reading the underlying request stream FIRST — before touching `req.body`,
26
+ * whose getter triggers the parse that consumes the stream — preserves the exact
27
+ * bytes when the platform parses lazily. When `req` is not a stream (unit tests
28
+ * pass a plain `{ body }` object) or the stream yields nothing (already
29
+ * consumed), we fall back to `req.body`.
30
+ */
31
+ export async function readRawBody(req) {
32
+ if (isAsyncIterable(req)) {
33
+ const chunks = [];
34
+ let total = 0;
35
+ for await (const chunk of req) {
36
+ const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
37
+ total += buf.byteLength;
38
+ // Enforce the cap mid-stream so an oversized body is rejected before it is
39
+ // fully buffered into memory, not after.
40
+ if (total > MAX_WEBHOOK_BODY_BYTES)
41
+ throw new WebhookBodyTooLargeError();
42
+ chunks.push(buf);
43
+ }
44
+ if (chunks.length > 0)
45
+ return Buffer.concat(chunks).toString("utf8");
46
+ }
47
+ if (typeof req.body === "string")
48
+ return capBody(req.body);
49
+ if (Buffer.isBuffer(req.body))
50
+ return capBody(req.body.toString("utf8"));
51
+ if (req.body && typeof req.body === "object")
52
+ return capBody(JSON.stringify(req.body));
53
+ return "";
54
+ }
55
+ function capBody(body) {
56
+ if (Buffer.byteLength(body, "utf8") > MAX_WEBHOOK_BODY_BYTES) {
57
+ throw new WebhookBodyTooLargeError();
58
+ }
59
+ return body;
60
+ }
61
+ function isAsyncIterable(value) {
62
+ return (value != null &&
63
+ typeof value[Symbol.asyncIterator] ===
64
+ "function");
65
+ }
66
+ export function verifyHmacSignature(input) {
67
+ if (!input.signatureHeader || !input.secret)
68
+ return false;
69
+ return timingSafeStringEqual(input.signatureHeader, hmac(input.rawBody, input.secret));
70
+ }
71
+ function hmac(value, secret) {
72
+ return createHmac("sha256", secret).update(value).digest("hex");
73
+ }
74
+ /**
75
+ * Constant-time comparison of two shared-secret strings.
76
+ *
77
+ * Exported because it is not payment-specific: any route holding a shared token has to compare it
78
+ * the same way, and a second hand-rolled copy of a security primitive is how one of them quietly
79
+ * stops being constant-time. The length check comes first because `timingSafeEqual` THROWS on a
80
+ * length mismatch rather than returning false, and the length of a shared token is not the secret.
81
+ */
82
+ export function timingSafeStringEqual(left, right) {
83
+ const leftBuffer = Buffer.from(left);
84
+ const rightBuffer = Buffer.from(right);
85
+ return leftBuffer.length === rightBuffer.length && timingSafeEqual(leftBuffer, rightBuffer);
86
+ }
@@ -1,9 +1,9 @@
1
1
  import { z } from "zod";
2
2
  export declare const customerLifecycleStageSchema: z.ZodEnum<{
3
+ inactive: "inactive";
3
4
  lead: "lead";
4
5
  tester: "tester";
5
6
  customer: "customer";
6
- inactive: "inactive";
7
7
  }>;
8
8
  export declare const customerMeRequestSchema: z.ZodObject<{}, z.core.$strict>;
9
9
  export declare const customerMeResponseSchema: z.ZodObject<{
@@ -12,10 +12,10 @@ export declare const customerMeResponseSchema: z.ZodObject<{
12
12
  firstName: z.ZodNullable<z.ZodString>;
13
13
  lastName: z.ZodNullable<z.ZodString>;
14
14
  lifecycleStage: z.ZodEnum<{
15
+ inactive: "inactive";
15
16
  lead: "lead";
16
17
  tester: "tester";
17
18
  customer: "customer";
18
- inactive: "inactive";
19
19
  }>;
20
20
  subscriptions: z.ZodOptional<z.ZodArray<z.ZodObject<{
21
21
  subscriptionId: z.ZodGUID;
@@ -0,0 +1,13 @@
1
+ import type { z } from "zod";
2
+ import { type InventoryMutationPort, type InventoryReadPort } from "./ports.js";
3
+ interface PgQueryExecutor {
4
+ query(text: string, values?: unknown[]): Promise<{
5
+ rows: Record<string, unknown>[];
6
+ }>;
7
+ }
8
+ /** Operator readback over the same public stock and reservation rail used by renewal. */
9
+ export declare function createPostgresAdminInventoryPort(executor: PgQueryExecutor, config: {
10
+ stockMasterProvider: string;
11
+ providerSchema: z.ZodType<string>;
12
+ }, now?: () => string): InventoryReadPort & InventoryMutationPort;
13
+ export {};
@@ -0,0 +1,214 @@
1
+ import { createHash } from "node:crypto";
2
+ import { calculateInventoryAtp, availableNow, INVENTORY_CONTRACT_VERSION } from "@openlup/core/inventory";
3
+ import { createInventorySubscriptionForecastResponseSchema } from "./schemas.js";
4
+ import { InventoryPersistenceError, } from "./ports.js";
5
+ const STOCK_SQL = `SELECT sku.id AS sku_id, sku.sku, stock.source_key,
6
+ stock.for_sale_quantity AS on_hand,
7
+ COALESCE((SELECT sum(line.quantity)::integer
8
+ FROM public.fulfillment_inventory_reservation_lines line
9
+ JOIN public.fulfillment_inventory_reservations reservation ON reservation.id = line.reservation_id
10
+ WHERE line.sku = stock.sku AND reservation.source_key = stock.source_key
11
+ AND reservation.status IN ('held', 'committed')), 0) AS reserved,
12
+ stock.last_synced_at, stock.stale_after,
13
+ count(*) OVER() AS total_count
14
+ FROM public.fulfillment_stock_current stock
15
+ JOIN public.catalog_skus sku ON sku.sku = stock.sku
16
+ WHERE ($1::uuid IS NULL OR sku.id = $1::uuid)
17
+ AND ($2::boolean OR stock.for_sale_quantity > 0)
18
+ ORDER BY stock.updated_at DESC, stock.source_key, stock.sku
19
+ LIMIT $3::integer OFFSET $4::integer`;
20
+ const RESERVATIONS_SQL = `SELECT reservation.id, order_row.id AS order_id, cycle.id AS cycle_id,
21
+ CASE reservation.status
22
+ WHEN 'held' THEN 'reserved' WHEN 'committed' THEN 'reserved'
23
+ ELSE reservation.status END AS status,
24
+ reservation.expires_at, reservation.created_at,
25
+ operation.identity_key, operation.operation_fingerprint, operation.terminal_outcome,
26
+ count(*) OVER() AS total_count
27
+ FROM public.fulfillment_inventory_reservations reservation
28
+ JOIN public.subscription_renewal_operations operation ON operation.id = reservation.renewal_operation_id
29
+ LEFT JOIN public.subscription_cycles cycle ON cycle.renewal_operation_id = operation.id
30
+ LEFT JOIN public.commerce_orders order_row ON order_row.renewal_operation_id = operation.id
31
+ WHERE ($1::text IS NULL OR CASE reservation.status
32
+ WHEN 'held' THEN 'reserved' WHEN 'committed' THEN 'reserved'
33
+ ELSE reservation.status END = $1::text)
34
+ AND ($2::uuid IS NULL OR order_row.id = $2::uuid)
35
+ ORDER BY reservation.created_at DESC, reservation.id
36
+ LIMIT $3::integer OFFSET $4::integer`;
37
+ const ATP_SQL = `SELECT sku.id AS sku_id, sku.sku, stock.source_key,
38
+ stock.for_sale_quantity AS on_hand,
39
+ COALESCE((SELECT sum(line.quantity)::integer
40
+ FROM public.fulfillment_inventory_reservation_lines line
41
+ JOIN public.fulfillment_inventory_reservations reservation ON reservation.id = line.reservation_id
42
+ WHERE line.sku = stock.sku AND reservation.source_key = stock.source_key
43
+ AND reservation.status IN ('held', 'committed')), 0) AS reserved,
44
+ stock.last_synced_at, stock.stale_after, 0 AS total_count
45
+ FROM public.fulfillment_stock_current stock
46
+ JOIN public.catalog_skus sku ON sku.sku = stock.sku
47
+ WHERE sku.id = ANY($1::uuid[])
48
+ AND stock.inventory_class = 'sellable'
49
+ AND stock.stale_after > $2::timestamptz
50
+ ORDER BY stock.source_key, stock.sku`;
51
+ const FORECAST_SQL = `WITH forecast_skus AS (
52
+ SELECT line.sku
53
+ FROM public.subscription_renewal_term_lines line
54
+ JOIN public.subscriptions subscription ON subscription.id = line.subscription_id
55
+ WHERE subscription.status = 'active'
56
+ UNION
57
+ SELECT stock.sku
58
+ FROM public.fulfillment_stock_current stock
59
+ WHERE stock.inventory_class = 'sellable'
60
+ ), sellable_stock AS (
61
+ SELECT stock.sku,
62
+ sum(stock.for_sale_quantity)::integer AS for_sale_quantity,
63
+ max(stock.last_synced_at) AS last_synced_at,
64
+ min(stock.stale_after) AS stale_after
65
+ FROM public.fulfillment_stock_current stock
66
+ WHERE stock.inventory_class = 'sellable'
67
+ GROUP BY stock.sku
68
+ )
69
+ SELECT sku.id AS sku_id, sku.sku,
70
+ stock.for_sale_quantity, stock.last_synced_at, stock.stale_after,
71
+ COALESCE(reserved.quantity, 0)::integer AS reserved,
72
+ COALESCE(demand.days_30, 0)::integer AS days_30,
73
+ COALESCE(demand.days_45, 0)::integer AS days_45,
74
+ COALESCE(demand.days_60, 0)::integer AS days_60
75
+ FROM forecast_skus forecast
76
+ JOIN public.catalog_skus sku ON sku.sku = forecast.sku
77
+ LEFT JOIN sellable_stock stock ON stock.sku = forecast.sku
78
+ LEFT JOIN LATERAL (
79
+ SELECT sum(line.quantity)::integer AS quantity
80
+ FROM public.fulfillment_inventory_reservation_lines line
81
+ JOIN public.fulfillment_inventory_reservations reservation ON reservation.id = line.reservation_id
82
+ WHERE line.sku = forecast.sku
83
+ AND reservation.status IN ('held', 'committed')) reserved ON true
84
+ LEFT JOIN LATERAL (
85
+ SELECT
86
+ sum(CASE WHEN subscription.next_cycle_at <= $1::timestamptz + interval '30 days' THEN line.quantity ELSE 0 END)::integer AS days_30,
87
+ sum(CASE WHEN subscription.next_cycle_at <= $1::timestamptz + interval '45 days' THEN line.quantity ELSE 0 END)::integer AS days_45,
88
+ sum(CASE WHEN subscription.next_cycle_at <= $1::timestamptz + interval '60 days' THEN line.quantity ELSE 0 END)::integer AS days_60
89
+ FROM public.subscription_renewal_term_lines line
90
+ JOIN public.subscriptions subscription ON subscription.id = line.subscription_id
91
+ WHERE line.sku = forecast.sku AND subscription.status = 'active'
92
+ AND subscription.next_cycle_at <= $1::timestamptz + ($2::integer * interval '1 day')) demand ON true
93
+ ORDER BY sku.sku`;
94
+ const ACTIVE_SUBSCRIPTION_COUNT_SQL = `SELECT count(*)::integer AS active_subscription_count
95
+ FROM public.subscriptions WHERE status = 'active'`;
96
+ /** Operator readback over the same public stock and reservation rail used by renewal. */
97
+ export function createPostgresAdminInventoryPort(executor, config, now = () => new Date().toISOString()) {
98
+ const forecastResponseSchema = createInventorySubscriptionForecastResponseSchema(config.providerSchema);
99
+ return {
100
+ async listStock(request) {
101
+ const offset = (request.page - 1) * request.pageSize;
102
+ const result = await executor.query(STOCK_SQL, [
103
+ request.skuId ?? null, request.includeZero, request.pageSize, offset,
104
+ ]);
105
+ const stock = result.rows.map(mapStock);
106
+ return {
107
+ contractVersion: INVENTORY_CONTRACT_VERSION,
108
+ stock: stock.map((line) => ({ ...line, availableNow: availableNow(line) })),
109
+ totalCount: count(result.rows[0]), page: request.page, pageSize: request.pageSize,
110
+ };
111
+ },
112
+ async listReservations(request) {
113
+ const offset = (request.page - 1) * request.pageSize;
114
+ const result = await executor.query(RESERVATIONS_SQL, [
115
+ request.status ?? null, request.orderId ?? null, request.pageSize, offset,
116
+ ]);
117
+ return {
118
+ contractVersion: INVENTORY_CONTRACT_VERSION,
119
+ reservations: result.rows.map((row) => ({
120
+ id: text(row.id), orderId: text(row.order_id),
121
+ subscriptionCycleId: nullableText(row.cycle_id),
122
+ status: text(row.status),
123
+ kind: "subscription_retry_window",
124
+ expiresAt: timestampOrNull(row.expires_at), createdAt: timestamp(row.created_at),
125
+ })),
126
+ totalCount: count(result.rows[0]), page: request.page, pageSize: request.pageSize,
127
+ };
128
+ },
129
+ async checkAtp(request) {
130
+ const result = await executor.query(ATP_SQL, [
131
+ request.lines.map((line) => line.skuId), request.requestedAt,
132
+ ]);
133
+ return calculateInventoryAtp({ request, stock: result.rows.map(mapStock) });
134
+ },
135
+ async forecastSubscriptions(request) {
136
+ const generatedAt = now();
137
+ const result = await executor.query(FORECAST_SQL, [generatedAt, request.horizonDays]);
138
+ const activeSubscriptionResult = await executor.query(ACTIVE_SUBSCRIPTION_COUNT_SQL);
139
+ const skus = result.rows.map((row) => mapForecast(row, generatedAt, request));
140
+ return forecastResponseSchema.parse({
141
+ contractVersion: INVENTORY_CONTRACT_VERSION,
142
+ generatedAt,
143
+ // Compatibility projection required by the existing admin BFF contract;
144
+ // the public tables themselves keep source_key opaque.
145
+ stockMasterProvider: config.stockMasterProvider,
146
+ horizonDays: request.horizonDays,
147
+ protectionDays: request.protectionDays,
148
+ skus,
149
+ totals: {
150
+ activeSubscriptionCount: integer(activeSubscriptionResult.rows[0]?.active_subscription_count),
151
+ excludedSubscriptionCount: 0,
152
+ missingProviderStockSkuCount: skus.filter((sku) => sku.stockStatus === "missing").length,
153
+ staleProviderStockSkuCount: skus.filter((sku) => sku.stockStatus === "stale").length,
154
+ horizonShortageSkuCount: skus.filter((sku) => sku.horizonMissingQty > 0).length,
155
+ protectionShortageSkuCount: skus.filter((sku) => sku.protectionMissingQty > 0).length,
156
+ shortageSkuCount: skus.filter((sku) => sku.missingQty > 0).length,
157
+ recommendedProductionQty: skus.reduce((sum, sku) => sum + sku.recommendedProductionQty, 0),
158
+ },
159
+ });
160
+ },
161
+ async adjustStock() {
162
+ throw new InventoryPersistenceError("Direct stock is externally observed; use the configured stock-source adapter");
163
+ },
164
+ };
165
+ }
166
+ function mapStock(row) {
167
+ const source = text(row.source_key);
168
+ return {
169
+ skuId: text(row.sku_id), sku: text(row.sku),
170
+ locationId: stableUuid(source), locationCode: source,
171
+ locationKind: "third_party_logistics", locationStatus: "active", fulfillable: true,
172
+ lotId: null, lotCode: null, lotStatus: null, expiresAt: null,
173
+ onHand: integer(row.on_hand), reserved: integer(row.reserved), unavailable: 0,
174
+ incoming: 0, safetyStock: 0,
175
+ };
176
+ }
177
+ function mapForecast(row, generatedAt, request) {
178
+ const sellable = Math.max(0, integer(row.for_sale_quantity) - integer(row.reserved));
179
+ const horizonDemand = request.horizonDays <= 30 ? integer(row.days_30)
180
+ : request.horizonDays <= 45 ? integer(row.days_45) : integer(row.days_60);
181
+ const protectionDemand = request.protectionDays <= 30 ? integer(row.days_30)
182
+ : request.protectionDays <= 45 ? integer(row.days_45) : integer(row.days_60);
183
+ const horizonMissingQty = Math.max(0, horizonDemand - sellable);
184
+ const protectionMissingQty = Math.max(0, protectionDemand - sellable);
185
+ const staleAfter = timestampOrNull(row.stale_after);
186
+ const stockStatus = row.for_sale_quantity === null || row.for_sale_quantity === undefined
187
+ ? "missing"
188
+ : staleAfter && staleAfter <= generatedAt ? "stale" : "fresh";
189
+ return {
190
+ skuId: text(row.sku_id), sku: text(row.sku),
191
+ providerCurrentForSale: nullableInteger(row.for_sale_quantity),
192
+ providerStockLastSyncedAt: timestampOrNull(row.last_synced_at),
193
+ providerStockStaleAfter: staleAfter, stockStatus,
194
+ openHardReservations: integer(row.reserved), safetyStock: 0, sellableNow: sellable,
195
+ activeSubscriptionDemand30: integer(row.days_30),
196
+ activeSubscriptionDemand45: integer(row.days_45),
197
+ activeSubscriptionDemand60: integer(row.days_60), plannedSupply: 0,
198
+ coverageDays: null, shortageDate: null,
199
+ horizonMissingQty, protectionMissingQty,
200
+ missingQty: Math.max(horizonMissingQty, protectionMissingQty),
201
+ recommendedProductionQty: Math.max(horizonMissingQty, protectionMissingQty),
202
+ };
203
+ }
204
+ function stableUuid(value) {
205
+ const hash = createHash("sha256").update(`inventory-source:${value}`).digest("hex");
206
+ return `${hash.slice(0, 8)}-${hash.slice(8, 12)}-4${hash.slice(13, 16)}-8${hash.slice(17, 20)}-${hash.slice(20, 32)}`;
207
+ }
208
+ function text(value) { return typeof value === "string" ? value : String(value ?? ""); }
209
+ function nullableText(value) { const result = text(value).trim(); return result || null; }
210
+ function integer(value) { const result = Number(value); return Number.isSafeInteger(result) && result >= 0 ? result : 0; }
211
+ function nullableInteger(value) { return value === null || value === undefined ? null : integer(value); }
212
+ function count(row) { return row ? integer(row.total_count) : 0; }
213
+ function timestamp(value) { return value instanceof Date ? value.toISOString() : text(value); }
214
+ function timestampOrNull(value) { return value === null || value === undefined ? null : timestamp(value); }
@@ -0,0 +1,86 @@
1
+ export interface InventoryProviderStockLine {
2
+ skuId: string;
3
+ sku: string;
4
+ forSaleQuantity: number;
5
+ lastSyncedAt: string;
6
+ staleAfter: string;
7
+ }
8
+ export interface InventoryHardReservationLine {
9
+ skuId: string;
10
+ quantity: number;
11
+ }
12
+ /** Structural inputs for dated subscription stock coverage; validation belongs to the caller. */
13
+ export interface SubscriptionForecastProviderStockLine {
14
+ skuId: string;
15
+ sku: string;
16
+ forSaleQuantity: number;
17
+ lastSyncedAt: string;
18
+ staleAfter: string;
19
+ }
20
+ export interface SubscriptionForecastHardReservationLine {
21
+ skuId: string;
22
+ quantity: number;
23
+ }
24
+ export interface SubscriptionForecastStockLine {
25
+ skuId: string;
26
+ sku: string;
27
+ fulfillable: boolean;
28
+ locationStatus: string;
29
+ safetyStock: number;
30
+ }
31
+ export interface SubscriptionForecastDemandLine {
32
+ skuId: string;
33
+ sku: string;
34
+ quantity: number;
35
+ dueAt: string;
36
+ status: string;
37
+ }
38
+ export interface SubscriptionForecastSupplyLine {
39
+ skuId: string;
40
+ quantity: number;
41
+ expectedAt: string;
42
+ status: string;
43
+ }
44
+ export interface SubscriptionForecastCalculationInput {
45
+ generatedAt: string;
46
+ horizonDays: number;
47
+ protectionDays: number;
48
+ providerCurrent: SubscriptionForecastProviderStockLine[];
49
+ openHardReservations: SubscriptionForecastHardReservationLine[];
50
+ stock: SubscriptionForecastStockLine[];
51
+ demand: SubscriptionForecastDemandLine[];
52
+ supply: SubscriptionForecastSupplyLine[];
53
+ }
54
+ export interface SubscriptionForecastCounts {
55
+ activeSubscriptionCount: number;
56
+ excludedSubscriptionCount: number;
57
+ }
58
+ export interface SubscriptionForecastSku {
59
+ skuId: string;
60
+ sku: string;
61
+ providerCurrentForSale: number | null;
62
+ providerStockLastSyncedAt: string | null;
63
+ providerStockStaleAfter: string | null;
64
+ stockStatus: "missing" | "stale" | "fresh";
65
+ openHardReservations: number;
66
+ safetyStock: number;
67
+ sellableNow: number;
68
+ activeSubscriptionDemand30: number;
69
+ activeSubscriptionDemand45: number;
70
+ activeSubscriptionDemand60: number;
71
+ plannedSupply: number;
72
+ coverageDays: number | null;
73
+ shortageDate: string | null;
74
+ horizonMissingQty: number;
75
+ protectionMissingQty: number;
76
+ missingQty: number;
77
+ recommendedProductionQty: number;
78
+ }
79
+ export interface SubscriptionForecastTotals extends SubscriptionForecastCounts {
80
+ missingProviderStockSkuCount: number;
81
+ staleProviderStockSkuCount: number;
82
+ horizonShortageSkuCount: number;
83
+ protectionShortageSkuCount: number;
84
+ shortageSkuCount: number;
85
+ recommendedProductionQty: number;
86
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ export type { InventoryReservationStatus, AdminInventoryStockRequest, AdminInventoryReservationsRequest, AdminInventoryStockAdjustmentRequest, AdminInventorySubscriptionForecastRequest, InventoryStockListResponse, InventoryReservationsListResponse, InventoryStockAdjustmentResponse, InventorySubscriptionForecastResponse, InventorySubscriptionForecastSku, InventoryForecastDemandLine, InventoryForecastSupplyLine, InventoryForecastResponse, } from "./inventory.js";
2
+ export type { NewPurchaseStockRow, NewPurchaseStockMode, NewPurchaseStockAvailabilityOptions } from "./newPurchaseStock.js";
3
+ export type { ReservationPolicyInput, ReservationPolicy, AutomaticRenewalReservationResult } from "./reservation.js";
4
+ export type { InventoryProviderStockLine, InventoryHardReservationLine, SubscriptionForecastCalculationInput, SubscriptionForecastCounts, SubscriptionForecastSku, SubscriptionForecastTotals } from "./forecast.js";
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,157 @@
1
+ /** Inventory wire DTOs. Runtime validation belongs to the server entry. */
2
+ export type InventoryReservationStatus = "reserved" | "released" | "consumed" | "expired";
3
+ export type AdminInventoryStockRequest = {
4
+ page: number;
5
+ pageSize: number;
6
+ includeZero: boolean;
7
+ skuId?: string | undefined;
8
+ locationId?: string | undefined;
9
+ };
10
+ export type AdminInventoryReservationsRequest = {
11
+ page: number;
12
+ pageSize: number;
13
+ status?: "reserved" | "released" | "consumed" | "expired" | undefined;
14
+ orderId?: string | undefined;
15
+ };
16
+ export type AdminInventoryStockAdjustmentRequest = {
17
+ idempotencyKey: string;
18
+ skuId: string;
19
+ locationId: string;
20
+ quantityDelta: number;
21
+ reason: string;
22
+ lotId?: string | null | undefined;
23
+ note?: string | undefined;
24
+ };
25
+ export type AdminInventorySubscriptionForecastRequest = {
26
+ horizonDays: number;
27
+ protectionDays: number;
28
+ };
29
+ export type InventoryStockListResponse = {
30
+ contractVersion: "inventory.v0";
31
+ stock: {
32
+ skuId: string;
33
+ sku: string;
34
+ locationId: string;
35
+ locationCode: string;
36
+ locationKind: "internal_warehouse" | "third_party_logistics" | "supplier" | "quarantine" | "virtual";
37
+ locationStatus: "active" | "inactive";
38
+ fulfillable: boolean;
39
+ lotId: string | null;
40
+ lotCode: string | null;
41
+ lotStatus: "expired" | "available" | "quarantined" | "recalled" | null;
42
+ expiresAt: string | null;
43
+ onHand: number;
44
+ reserved: number;
45
+ unavailable: number;
46
+ incoming: number;
47
+ safetyStock: number;
48
+ availableNow: number;
49
+ }[];
50
+ totalCount: number;
51
+ page: number;
52
+ pageSize: number;
53
+ };
54
+ export type InventoryReservationsListResponse = {
55
+ contractVersion: "inventory.v0";
56
+ reservations: {
57
+ id: string;
58
+ orderId: string;
59
+ subscriptionCycleId: string | null;
60
+ status: "reserved" | "released" | "consumed" | "expired";
61
+ kind: "checkout_payment_window" | "subscription_retry_window" | "manual_ops";
62
+ expiresAt: string | null;
63
+ createdAt: string;
64
+ }[];
65
+ totalCount: number;
66
+ page: number;
67
+ pageSize: number;
68
+ };
69
+ export type InventoryStockAdjustmentResponse = {
70
+ contractVersion: "inventory.v0";
71
+ replayed: boolean;
72
+ };
73
+ export type InventorySubscriptionForecastResponse = {
74
+ contractVersion: "inventory.v0";
75
+ generatedAt: string;
76
+ stockMasterProvider: string;
77
+ horizonDays: number;
78
+ protectionDays: number;
79
+ skus: {
80
+ skuId: string;
81
+ sku: string;
82
+ providerCurrentForSale: number | null;
83
+ providerStockLastSyncedAt: string | null;
84
+ providerStockStaleAfter: string | null;
85
+ stockStatus: "fresh" | "stale" | "missing";
86
+ openHardReservations: number;
87
+ safetyStock: number;
88
+ sellableNow: number;
89
+ activeSubscriptionDemand30: number;
90
+ activeSubscriptionDemand45: number;
91
+ activeSubscriptionDemand60: number;
92
+ plannedSupply: number;
93
+ coverageDays: number | null;
94
+ shortageDate: string | null;
95
+ horizonMissingQty: number;
96
+ protectionMissingQty: number;
97
+ missingQty: number;
98
+ recommendedProductionQty: number;
99
+ }[];
100
+ totals: {
101
+ activeSubscriptionCount: number;
102
+ excludedSubscriptionCount: number;
103
+ missingProviderStockSkuCount: number;
104
+ staleProviderStockSkuCount: number;
105
+ horizonShortageSkuCount: number;
106
+ protectionShortageSkuCount: number;
107
+ shortageSkuCount: number;
108
+ recommendedProductionQty: number;
109
+ };
110
+ };
111
+ export type InventorySubscriptionForecastSku = {
112
+ skuId: string;
113
+ sku: string;
114
+ providerCurrentForSale: number | null;
115
+ providerStockLastSyncedAt: string | null;
116
+ providerStockStaleAfter: string | null;
117
+ stockStatus: "fresh" | "stale" | "missing";
118
+ openHardReservations: number;
119
+ safetyStock: number;
120
+ sellableNow: number;
121
+ activeSubscriptionDemand30: number;
122
+ activeSubscriptionDemand45: number;
123
+ activeSubscriptionDemand60: number;
124
+ plannedSupply: number;
125
+ coverageDays: number | null;
126
+ shortageDate: string | null;
127
+ horizonMissingQty: number;
128
+ protectionMissingQty: number;
129
+ missingQty: number;
130
+ recommendedProductionQty: number;
131
+ };
132
+ export type InventoryForecastDemandLine = {
133
+ subscriptionId: string;
134
+ subscriptionCycleId: string | null;
135
+ skuId: string;
136
+ sku: string;
137
+ quantity: number;
138
+ dueAt: string;
139
+ status: "planned" | "payment_pending" | "paid" | "retry_scheduled" | "skipped" | "cancelled";
140
+ };
141
+ export type InventoryForecastSupplyLine = {
142
+ skuId: string;
143
+ quantity: number;
144
+ expectedAt: string;
145
+ status: "planned" | "cancelled" | "received";
146
+ };
147
+ export type InventoryForecastResponse = {
148
+ contractVersion: "inventory.v0";
149
+ shortages: {
150
+ skuId: string;
151
+ sku: string;
152
+ dueAt: string;
153
+ demandQuantity: number;
154
+ availableOrExpectedQuantity: number;
155
+ missingQuantity: number;
156
+ }[];
157
+ };
@@ -0,0 +1 @@
1
+ export {};