@openlup/platform 0.26.0 → 0.27.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 (520) hide show
  1. package/CHANGELOG.md +138 -218
  2. package/README.md +229 -16
  3. package/dist/commerce/adapters/managed/commerceOmsControlPlane.d.ts +3 -0
  4. package/dist/commerce/adapters/managed/commerceOmsControlPlane.js +71 -0
  5. package/dist/commerce/adapters/managed/commerceOmsMutations.d.ts +10 -0
  6. package/dist/commerce/adapters/managed/commerceOmsMutations.js +119 -0
  7. package/dist/commerce/adapters/managed/commerceOmsPort.d.ts +28 -0
  8. package/dist/commerce/adapters/managed/commerceOmsPort.js +101 -0
  9. package/dist/commerce/adapters/managed/oms/accounting.d.ts +3 -0
  10. package/dist/commerce/adapters/managed/oms/accounting.js +13 -0
  11. package/dist/commerce/adapters/managed/oms/fulfillmentReads.d.ts +17 -0
  12. package/dist/commerce/adapters/managed/oms/fulfillmentReads.js +81 -0
  13. package/dist/commerce/adapters/managed/oms/inboundEvents.d.ts +9 -0
  14. package/dist/commerce/adapters/managed/oms/inboundEvents.js +40 -0
  15. package/dist/commerce/adapters/managed/oms/outboxEvents.d.ts +2 -0
  16. package/dist/commerce/adapters/managed/oms/outboxEvents.js +23 -0
  17. package/dist/commerce/adapters/managed/oms/paymentAttempts.d.ts +3 -0
  18. package/dist/commerce/adapters/managed/oms/paymentAttempts.js +15 -0
  19. package/dist/commerce/adapters/managed/oms/queueSelection.d.ts +12 -0
  20. package/dist/commerce/adapters/managed/oms/queueSelection.js +109 -0
  21. package/dist/commerce/adapters/managed/oms/readProjections.d.ts +18 -0
  22. package/dist/commerce/adapters/managed/oms/readProjections.js +13 -0
  23. package/dist/commerce/adapters/managed/oms/readQueries.d.ts +16 -0
  24. package/dist/commerce/adapters/managed/oms/readQueries.js +276 -0
  25. package/dist/commerce/adapters/managed/oms/types.d.ts +2 -0
  26. package/dist/commerce/adapters/managed/oms/types.js +7 -0
  27. package/dist/commerce/checkoutCommandSchemas.d.ts +89 -0
  28. package/dist/commerce/checkoutCommandSchemas.js +70 -0
  29. package/dist/commerce/checkoutHelpers.d.ts +21 -0
  30. package/dist/commerce/checkoutHelpers.js +29 -0
  31. package/dist/commerce/checkoutResumeSchemas.d.ts +158 -0
  32. package/dist/commerce/checkoutResumeSchemas.js +145 -0
  33. package/dist/commerce/checkoutSchemas.d.ts +158 -0
  34. package/dist/commerce/checkoutSchemas.js +161 -0
  35. package/dist/commerce/commerceReturnsPort.d.ts +97 -0
  36. package/dist/commerce/commerceReturnsPort.js +39 -0
  37. package/dist/commerce/configuratorIntentPersistenceSchemas.d.ts +20 -0
  38. package/dist/commerce/configuratorIntentPersistenceSchemas.js +21 -0
  39. package/dist/commerce/configuratorIntentSchemas.d.ts +63 -0
  40. package/dist/commerce/configuratorIntentSchemas.js +43 -0
  41. package/dist/commerce/contractPrimitives.d.ts +50 -0
  42. package/dist/commerce/contractPrimitives.js +25 -0
  43. package/dist/commerce/contracts/availability.d.ts +23 -0
  44. package/dist/commerce/contracts/availability.js +1 -0
  45. package/dist/commerce/contracts/fulfillmentRecovery.d.ts +25 -0
  46. package/dist/commerce/contracts/fulfillmentRecovery.js +1 -0
  47. package/dist/commerce/contracts/index.d.ts +13 -0
  48. package/dist/commerce/contracts/index.js +1 -0
  49. package/dist/commerce/contracts/intent.d.ts +86 -0
  50. package/dist/commerce/contracts/intent.js +1 -0
  51. package/dist/commerce/contracts/omsTypes.d.ts +1216 -0
  52. package/dist/commerce/contracts/omsTypes.js +1 -0
  53. package/dist/commerce/contracts/order.d.ts +39 -0
  54. package/dist/commerce/contracts/order.js +1 -0
  55. package/dist/commerce/contracts/orderMoney.d.ts +52 -0
  56. package/dist/commerce/contracts/orderMoney.js +1 -0
  57. package/dist/commerce/contracts/ports.d.ts +113 -0
  58. package/dist/commerce/contracts/ports.js +1 -0
  59. package/dist/commerce/contracts/recovery.d.ts +11 -0
  60. package/dist/commerce/contracts/recovery.js +1 -0
  61. package/dist/commerce/contracts/runtimePorts.d.ts +196 -0
  62. package/dist/commerce/contracts/runtimePorts.js +1 -0
  63. package/dist/commerce/contracts/state.d.ts +26 -0
  64. package/dist/commerce/contracts/state.js +43 -0
  65. package/dist/commerce/customerDefaultsSnapshotSchemas.d.ts +51 -0
  66. package/dist/commerce/customerDefaultsSnapshotSchemas.js +106 -0
  67. package/dist/commerce/errors.d.ts +18 -0
  68. package/dist/commerce/errors.js +36 -0
  69. package/dist/commerce/fulfillmentEligibility.d.ts +6 -0
  70. package/dist/commerce/fulfillmentEligibility.js +31 -0
  71. package/dist/commerce/index.d.ts +72 -0
  72. package/dist/commerce/index.js +67 -0
  73. package/dist/commerce/model/customerFulfillmentRecovery.d.ts +40 -0
  74. package/dist/commerce/model/customerFulfillmentRecovery.js +144 -0
  75. package/dist/commerce/model/fulfillmentCancellationEligibility.d.ts +7 -0
  76. package/dist/commerce/model/fulfillmentCancellationEligibility.js +9 -0
  77. package/dist/commerce/model/omsAccountingVisibility.d.ts +12 -0
  78. package/dist/commerce/model/omsAccountingVisibility.js +118 -0
  79. package/dist/commerce/model/omsBillingInvoiceBuyer.d.ts +2 -0
  80. package/dist/commerce/model/omsBillingInvoiceBuyer.js +15 -0
  81. package/dist/commerce/model/omsCurrency.d.ts +4 -0
  82. package/dist/commerce/model/omsCurrency.js +5 -0
  83. package/dist/commerce/model/omsFulfillmentDebug.d.ts +20 -0
  84. package/dist/commerce/model/omsFulfillmentDebug.js +122 -0
  85. package/dist/commerce/model/omsFulfillmentSummary.d.ts +16 -0
  86. package/dist/commerce/model/omsFulfillmentSummary.js +189 -0
  87. package/dist/commerce/model/omsListTotals.d.ts +13 -0
  88. package/dist/commerce/model/omsListTotals.js +32 -0
  89. package/dist/commerce/model/omsOperationalLadder.d.ts +51 -0
  90. package/dist/commerce/model/omsOperationalLadder.js +158 -0
  91. package/dist/commerce/model/omsOrderLineMoney.d.ts +4 -0
  92. package/dist/commerce/model/omsOrderLineMoney.js +25 -0
  93. package/dist/commerce/model/omsPaymentMethodSummary.d.ts +5 -0
  94. package/dist/commerce/model/omsPaymentMethodSummary.js +11 -0
  95. package/dist/commerce/model/omsReadModel.d.ts +43 -0
  96. package/dist/commerce/model/omsReadModel.js +211 -0
  97. package/dist/commerce/model/omsReadModelCommunication.d.ts +3 -0
  98. package/dist/commerce/model/omsReadModelCommunication.js +29 -0
  99. package/dist/commerce/model/omsReadModelHelpers.d.ts +125 -0
  100. package/dist/commerce/model/omsReadModelHelpers.js +212 -0
  101. package/dist/commerce/model/omsReadModelList.d.ts +33 -0
  102. package/dist/commerce/model/omsReadModelList.js +50 -0
  103. package/dist/commerce/model/omsReadModelListSummary.d.ts +3 -0
  104. package/dist/commerce/model/omsReadModelListSummary.js +13 -0
  105. package/dist/commerce/model/omsReadModelPricing.d.ts +5 -0
  106. package/dist/commerce/model/omsReadModelPricing.js +36 -0
  107. package/dist/commerce/model/omsReadModelProjections.d.ts +1 -0
  108. package/dist/commerce/model/omsReadModelProjections.js +1 -0
  109. package/dist/commerce/model/omsReadModelRowCore.d.ts +79 -0
  110. package/dist/commerce/model/omsReadModelRowCore.js +149 -0
  111. package/dist/commerce/model/omsReadModelRows.d.ts +1 -0
  112. package/dist/commerce/model/omsReadModelRows.js +6 -0
  113. package/dist/commerce/offerAvailability.d.ts +18 -0
  114. package/dist/commerce/offerAvailability.js +53 -0
  115. package/dist/commerce/offerAvailabilitySchemas.d.ts +43 -0
  116. package/dist/commerce/offerAvailabilitySchemas.js +42 -0
  117. package/dist/commerce/offerEvidenceSchemas.d.ts +7 -0
  118. package/dist/commerce/offerEvidenceSchemas.js +13 -0
  119. package/dist/commerce/oms/omsContractBase.d.ts +130 -0
  120. package/dist/commerce/oms/omsContractBase.js +86 -0
  121. package/dist/commerce/oms/omsContractReadAuxSchemas.d.ts +222 -0
  122. package/dist/commerce/oms/omsContractReadAuxSchemas.js +123 -0
  123. package/dist/commerce/oms/omsContractReadSchemas.d.ts +2266 -0
  124. package/dist/commerce/oms/omsContractReadSchemas.js +277 -0
  125. package/dist/commerce/oms/omsContractRequests.d.ts +196 -0
  126. package/dist/commerce/oms/omsContractRequests.js +118 -0
  127. package/dist/commerce/oms/omsContracts.d.ts +5 -0
  128. package/dist/commerce/oms/omsContracts.js +4 -0
  129. package/dist/commerce/oms/omsControlPlane.d.ts +275 -0
  130. package/dist/commerce/oms/omsControlPlane.js +72 -0
  131. package/dist/commerce/oms/omsFulfillmentContractSchemas.d.ts +203 -0
  132. package/dist/commerce/oms/omsFulfillmentContractSchemas.js +94 -0
  133. package/dist/commerce/oms/omsFulfillmentDebugSchemas.d.ts +69 -0
  134. package/dist/commerce/oms/omsFulfillmentDebugSchemas.js +33 -0
  135. package/dist/commerce/oms/omsFulfillmentHealthSchemas.d.ts +67 -0
  136. package/dist/commerce/oms/omsFulfillmentHealthSchemas.js +44 -0
  137. package/dist/commerce/oms/omsPorts.d.ts +84 -0
  138. package/dist/commerce/oms/omsPorts.js +148 -0
  139. package/dist/commerce/oms/omsPrimitives.d.ts +5 -0
  140. package/dist/commerce/oms/omsPrimitives.js +3 -0
  141. package/dist/commerce/oms/omsProviderEvidenceSchemas.d.ts +15 -0
  142. package/dist/commerce/oms/omsProviderEvidenceSchemas.js +12 -0
  143. package/dist/commerce/orderDraftErrors.d.ts +13 -0
  144. package/dist/commerce/orderDraftErrors.js +20 -0
  145. package/dist/commerce/orderEmailEligibility.d.ts +54 -0
  146. package/dist/commerce/orderEmailEligibility.js +123 -0
  147. package/dist/commerce/orderEmailLines.d.ts +12 -0
  148. package/dist/commerce/orderEmailLines.js +8 -0
  149. package/dist/commerce/orderFeedbackContracts.d.ts +41 -0
  150. package/dist/commerce/orderFeedbackContracts.js +33 -0
  151. package/dist/commerce/orderMoney.d.ts +6 -0
  152. package/dist/commerce/orderMoney.js +168 -0
  153. package/dist/commerce/orderReviewContracts.d.ts +475 -0
  154. package/dist/commerce/orderReviewContracts.js +94 -0
  155. package/dist/commerce/orderReviewPorts.d.ts +140 -0
  156. package/dist/commerce/orderReviewPorts.js +1 -0
  157. package/dist/commerce/outboxDispatchContracts.d.ts +30 -0
  158. package/dist/commerce/outboxDispatchContracts.js +1 -0
  159. package/dist/commerce/outboxEventSchemas.d.ts +162 -0
  160. package/dist/commerce/outboxEventSchemas.js +164 -0
  161. package/dist/commerce/outboxOrderDraftEmailPorts.d.ts +207 -0
  162. package/dist/commerce/outboxOrderDraftEmailPorts.js +12 -0
  163. package/dist/commerce/paymentContinuation.d.ts +4 -0
  164. package/dist/commerce/paymentContinuation.js +4 -0
  165. package/dist/commerce/ports.d.ts +8 -0
  166. package/dist/commerce/ports.js +1 -0
  167. package/dist/commerce/recoveryDestination.d.ts +3 -0
  168. package/dist/commerce/recoveryDestination.js +17 -0
  169. package/dist/commerce/runtimeErrors.d.ts +8 -0
  170. package/dist/commerce/runtimeErrors.js +16 -0
  171. package/dist/commerce/salesChannelEnvelope.d.ts +20 -0
  172. package/dist/commerce/salesChannelEnvelope.js +7 -0
  173. package/dist/commerce/schemas.d.ts +174 -0
  174. package/dist/commerce/schemas.js +84 -0
  175. package/dist/commerce/server/checkoutCompensation.d.ts +21 -0
  176. package/dist/commerce/server/checkoutCompensation.js +32 -0
  177. package/dist/commerce/server/checkoutConflictClassifiers.d.ts +17 -0
  178. package/dist/commerce/server/checkoutConflictClassifiers.js +38 -0
  179. package/dist/commerce/server/checkoutExpiredRecoveryPolicy.d.ts +38 -0
  180. package/dist/commerce/server/checkoutExpiredRecoveryPolicy.js +85 -0
  181. package/dist/commerce/server/checkoutInvoiceBuyerSnapshot.d.ts +22 -0
  182. package/dist/commerce/server/checkoutInvoiceBuyerSnapshot.js +30 -0
  183. package/dist/commerce/server/checkoutOfferPolicyPort.d.ts +33 -0
  184. package/dist/commerce/server/checkoutOfferPolicyPort.js +49 -0
  185. package/dist/commerce/server/checkoutPaymentContinuationCredential.d.ts +58 -0
  186. package/dist/commerce/server/checkoutPaymentContinuationCredential.js +154 -0
  187. package/dist/commerce/server/checkoutQuoteTypes.d.ts +19 -0
  188. package/dist/commerce/server/checkoutQuoteTypes.js +1 -0
  189. package/dist/commerce/server/checkoutRecoveryOrderPort.d.ts +42 -0
  190. package/dist/commerce/server/checkoutRecoveryOrderPort.js +1 -0
  191. package/dist/commerce/server/checkoutRecoveryToken.d.ts +40 -0
  192. package/dist/commerce/server/checkoutRecoveryToken.js +26 -0
  193. package/dist/commerce/server/checkoutRefusalContinuation.d.ts +24 -0
  194. package/dist/commerce/server/checkoutRefusalContinuation.js +18 -0
  195. package/dist/commerce/server/checkoutRuntimeTypes.d.ts +81 -0
  196. package/dist/commerce/server/checkoutRuntimeTypes.js +1 -0
  197. package/dist/commerce/server/commerceCheckoutCommandExecution.d.ts +60 -0
  198. package/dist/commerce/server/commerceCheckoutCommandExecution.js +136 -0
  199. package/dist/commerce/server/commerceCheckoutCompensation.d.ts +26 -0
  200. package/dist/commerce/server/commerceCheckoutCompensation.js +46 -0
  201. package/dist/commerce/server/commerceCheckoutContinuationTerms.d.ts +50 -0
  202. package/dist/commerce/server/commerceCheckoutContinuationTerms.js +66 -0
  203. package/dist/commerce/server/commerceCheckoutCustomerDefaults.d.ts +18 -0
  204. package/dist/commerce/server/commerceCheckoutCustomerDefaults.js +17 -0
  205. package/dist/commerce/server/commerceCheckoutFailureHandler.d.ts +51 -0
  206. package/dist/commerce/server/commerceCheckoutFailureHandler.js +90 -0
  207. package/dist/commerce/server/commerceCheckoutHandler.d.ts +213 -0
  208. package/dist/commerce/server/commerceCheckoutHandler.js +196 -0
  209. package/dist/commerce/server/commerceCheckoutHandlerAdmission.d.ts +58 -0
  210. package/dist/commerce/server/commerceCheckoutHandlerAdmission.js +94 -0
  211. package/dist/commerce/server/commerceCheckoutHandlerHelpers.d.ts +67 -0
  212. package/dist/commerce/server/commerceCheckoutHandlerHelpers.js +155 -0
  213. package/dist/commerce/server/commerceCheckoutOrchestrationError.d.ts +9 -0
  214. package/dist/commerce/server/commerceCheckoutOrchestrationError.js +14 -0
  215. package/dist/commerce/server/commerceCheckoutPromotionPriceChange.d.ts +47 -0
  216. package/dist/commerce/server/commerceCheckoutPromotionPriceChange.js +43 -0
  217. package/dist/commerce/server/commerceCheckoutProviderPayment.d.ts +34 -0
  218. package/dist/commerce/server/commerceCheckoutProviderPayment.js +37 -0
  219. package/dist/commerce/server/commerceCheckoutQuoteGuard.d.ts +62 -0
  220. package/dist/commerce/server/commerceCheckoutQuoteGuard.js +106 -0
  221. package/dist/commerce/server/commerceCheckoutResume.d.ts +29 -0
  222. package/dist/commerce/server/commerceCheckoutResume.js +81 -0
  223. package/dist/commerce/server/commerceCheckoutResumeGuard.d.ts +54 -0
  224. package/dist/commerce/server/commerceCheckoutResumeGuard.js +138 -0
  225. package/dist/commerce/server/commerceCheckoutSavedPaymentMethod.d.ts +39 -0
  226. package/dist/commerce/server/commerceCheckoutSavedPaymentMethod.js +44 -0
  227. package/dist/commerce/server/commerceCheckoutStartRuntimeFailure.d.ts +7 -0
  228. package/dist/commerce/server/commerceCheckoutStartRuntimeFailure.js +39 -0
  229. package/dist/commerce/server/commerceCheckoutTiming.d.ts +8 -0
  230. package/dist/commerce/server/commerceCheckoutTiming.js +31 -0
  231. package/dist/commerce/server/commerceDiagnostics.d.ts +6 -0
  232. package/dist/commerce/server/commerceDiagnostics.js +31 -0
  233. package/dist/commerce/server/commerceOmsCancelOrderHandler.d.ts +7 -0
  234. package/dist/commerce/server/commerceOmsCancelOrderHandler.js +22 -0
  235. package/dist/commerce/server/commerceOmsControlPlaneHandlers.d.ts +18 -0
  236. package/dist/commerce/server/commerceOmsControlPlaneHandlers.js +60 -0
  237. package/dist/commerce/server/commerceOmsHandlers.d.ts +47 -0
  238. package/dist/commerce/server/commerceOmsHandlers.js +176 -0
  239. package/dist/commerce/server/commerceOmsMarkRefundedHandler.d.ts +7 -0
  240. package/dist/commerce/server/commerceOmsMarkRefundedHandler.js +19 -0
  241. package/dist/commerce/server/commerceOrderDraft.d.ts +24 -0
  242. package/dist/commerce/server/commerceOrderDraft.js +92 -0
  243. package/dist/commerce/server/commercePaidOrderOrchestration.d.ts +131 -0
  244. package/dist/commerce/server/commercePaidOrderOrchestration.js +140 -0
  245. package/dist/commerce/server/commerceProviderAttemptFailure.d.ts +133 -0
  246. package/dist/commerce/server/commerceProviderAttemptFailure.js +175 -0
  247. package/dist/commerce/server/commerceReturnsHandlers.d.ts +41 -0
  248. package/dist/commerce/server/commerceReturnsHandlers.js +100 -0
  249. package/dist/commerce/server/commerceRuntimePort.d.ts +16 -0
  250. package/dist/commerce/server/commerceRuntimePort.js +57 -0
  251. package/dist/commerce/server/commerceRuntimeService.d.ts +98 -0
  252. package/dist/commerce/server/commerceRuntimeService.js +186 -0
  253. package/dist/commerce/server/commerceRuntimeStartResponse.d.ts +37 -0
  254. package/dist/commerce/server/commerceRuntimeStartResponse.js +56 -0
  255. package/dist/commerce/server/commerceStarterOfferGuard.d.ts +55 -0
  256. package/dist/commerce/server/commerceStarterOfferGuard.js +128 -0
  257. package/dist/commerce/server/configuratorIntentPersistence.d.ts +47 -0
  258. package/dist/commerce/server/configuratorIntentPersistence.js +85 -0
  259. package/dist/commerce/server/configuratorIntentPersistenceHandler.d.ts +14 -0
  260. package/dist/commerce/server/configuratorIntentPersistenceHandler.js +42 -0
  261. package/dist/commerce/server/emailRuntime.d.ts +47 -0
  262. package/dist/commerce/server/emailRuntime.js +1 -0
  263. package/dist/commerce/server/handlerSupport.d.ts +68 -0
  264. package/dist/commerce/server/handlerSupport.js +1 -0
  265. package/dist/commerce/server/index.d.ts +178 -0
  266. package/dist/commerce/server/index.js +127 -0
  267. package/dist/commerce/server/offerAvailability.d.ts +21 -0
  268. package/dist/commerce/server/offerAvailability.js +163 -0
  269. package/dist/commerce/server/orderDraftRpcPayload.d.ts +20 -0
  270. package/dist/commerce/server/orderDraftRpcPayload.js +21 -0
  271. package/dist/commerce/server/orderFeedbackSubmit.d.ts +20 -0
  272. package/dist/commerce/server/orderFeedbackSubmit.js +16 -0
  273. package/dist/commerce/server/orderFeedbackTokenCheck.d.ts +17 -0
  274. package/dist/commerce/server/orderFeedbackTokenCheck.js +14 -0
  275. package/dist/commerce/server/orderReviewAdminHandlers.d.ts +47 -0
  276. package/dist/commerce/server/orderReviewAdminHandlers.js +41 -0
  277. package/dist/commerce/server/orderReviewHandlers.d.ts +114 -0
  278. package/dist/commerce/server/orderReviewHandlers.js +42 -0
  279. package/dist/commerce/server/orderReviewLifecycle.d.ts +10 -0
  280. package/dist/commerce/server/orderReviewLifecycle.js +121 -0
  281. package/dist/commerce/server/orderReviewMedia.d.ts +11 -0
  282. package/dist/commerce/server/orderReviewMedia.js +172 -0
  283. package/dist/commerce/server/orderReviewRawUploadHandler.d.ts +40 -0
  284. package/dist/commerce/server/orderReviewRawUploadHandler.js +316 -0
  285. package/dist/commerce/server/outboxCheckoutExpiredEmailHandler.d.ts +14 -0
  286. package/dist/commerce/server/outboxCheckoutExpiredEmailHandler.js +57 -0
  287. package/dist/commerce/server/outboxCheckoutRecoveryEmailHandler.d.ts +13 -0
  288. package/dist/commerce/server/outboxCheckoutRecoveryEmailHandler.js +150 -0
  289. package/dist/commerce/server/outboxDispatchRegistry.d.ts +46 -0
  290. package/dist/commerce/server/outboxDispatchRegistry.js +184 -0
  291. package/dist/commerce/server/outboxDispatchRegistryComposition.d.ts +6 -0
  292. package/dist/commerce/server/outboxDispatchRegistryComposition.js +23 -0
  293. package/dist/commerce/server/outboxOrderDraftEmailHandler.d.ts +14 -0
  294. package/dist/commerce/server/outboxOrderDraftEmailHandler.js +130 -0
  295. package/dist/commerce/server/outboxOrderPaidEmailHandler.d.ts +21 -0
  296. package/dist/commerce/server/outboxOrderPaidEmailHandler.js +93 -0
  297. package/dist/commerce/server/outboxOrderPaidFulfillmentHandler.d.ts +3 -0
  298. package/dist/commerce/server/outboxOrderPaidFulfillmentHandler.js +1 -0
  299. package/dist/commerce/server/outboxOrderPaidFulfillmentPorts.d.ts +3 -0
  300. package/dist/commerce/server/outboxOrderPaidFulfillmentPorts.js +1 -0
  301. package/dist/commerce/server/outboxOrderRefundedEmailHandler.d.ts +13 -0
  302. package/dist/commerce/server/outboxOrderRefundedEmailHandler.js +42 -0
  303. package/dist/commerce/server/outboxPaymentFailedEmailHandler.d.ts +14 -0
  304. package/dist/commerce/server/outboxPaymentFailedEmailHandler.js +65 -0
  305. package/dist/commerce/server/outboxReturnEmailHandlers.d.ts +26 -0
  306. package/dist/commerce/server/outboxReturnEmailHandlers.js +53 -0
  307. package/dist/commerce/server/outboxShipmentDeliveredEmailHandler.d.ts +17 -0
  308. package/dist/commerce/server/outboxShipmentDeliveredEmailHandler.js +52 -0
  309. package/dist/commerce/server/outboxShipmentDispatchedEmailHandler.d.ts +13 -0
  310. package/dist/commerce/server/outboxShipmentDispatchedEmailHandler.js +87 -0
  311. package/dist/commerce/server/outboxShipmentExceptionEmailHandler.d.ts +13 -0
  312. package/dist/commerce/server/outboxShipmentExceptionEmailHandler.js +46 -0
  313. package/dist/commerce/server/referenceCheckoutHandler.d.ts +48 -0
  314. package/dist/commerce/server/referenceCheckoutHandler.js +68 -0
  315. package/dist/commerce/server/reservationSweepPort.d.ts +31 -0
  316. package/dist/commerce/server/reservationSweepPort.js +45 -0
  317. package/dist/commerce/server/starterTermsPort.d.ts +22 -0
  318. package/dist/commerce/server/starterTermsPort.js +1 -0
  319. package/dist/commerce/server/supabaseCommerceReturnsPort.d.ts +13 -0
  320. package/dist/commerce/server/supabaseCommerceReturnsPort.js +56 -0
  321. package/dist/communications/consentPurposeRegistry.d.ts +1 -1
  322. package/dist/communications/newsletterIntegrationContracts.d.ts +5 -5
  323. package/dist/composition/commerceContribution.d.ts +21 -0
  324. package/dist/composition/commerceContribution.js +27 -0
  325. package/dist/composition/index.d.ts +1 -0
  326. package/dist/composition/index.js +1 -0
  327. package/dist/fulfillment/handlerSchemas.d.ts +41 -41
  328. package/dist/fulfillment/index.d.ts +1 -1
  329. package/dist/fulfillment/index.js +1 -1
  330. package/dist/fulfillment/paidHandoff.d.ts +12 -1
  331. package/dist/fulfillment/paidHandoff.js +2 -2
  332. package/dist/fulfillment/providerDispatchWorker.d.ts +4 -4
  333. package/dist/identity/customerContracts.d.ts +2 -2
  334. package/dist/inventory/bindings.d.ts +3 -0
  335. package/dist/inventory/bindings.js +10 -4
  336. package/dist/inventory/index.d.ts +1 -0
  337. package/dist/inventory/index.js +1 -0
  338. package/dist/inventory/managedStockAvailability.d.ts +15 -0
  339. package/dist/inventory/managedStockAvailability.js +16 -0
  340. package/dist/inventory/postgresStockAvailability.js +2 -25
  341. package/dist/inventory/schemas.d.ts +1 -1
  342. package/dist/inventory/stockReadResponse.d.ts +4 -0
  343. package/dist/inventory/stockReadResponse.js +27 -0
  344. package/dist/pricing/browser/index.d.ts +6 -0
  345. package/dist/pricing/browser/index.js +6 -0
  346. package/dist/promotions/adminPromotionsContracts.d.ts +2 -2
  347. package/dist/subscriptions/index.d.ts +3 -2
  348. package/dist/subscriptions/index.js +3 -2
  349. package/package.json +22 -2
  350. package/release-gates.json +63 -8
  351. package/src/commerce/adapters/managed/commerceOmsControlPlane.ts +80 -0
  352. package/src/commerce/adapters/managed/commerceOmsMutations.ts +145 -0
  353. package/src/commerce/adapters/managed/commerceOmsPort.ts +158 -0
  354. package/src/commerce/adapters/managed/oms/accounting.ts +18 -0
  355. package/src/commerce/adapters/managed/oms/fulfillmentReads.ts +82 -0
  356. package/src/commerce/adapters/managed/oms/inboundEvents.ts +45 -0
  357. package/src/commerce/adapters/managed/oms/outboxEvents.ts +30 -0
  358. package/src/commerce/adapters/managed/oms/paymentAttempts.ts +19 -0
  359. package/src/commerce/adapters/managed/oms/queueSelection.ts +132 -0
  360. package/src/commerce/adapters/managed/oms/readProjections.ts +22 -0
  361. package/src/commerce/adapters/managed/oms/readQueries.ts +292 -0
  362. package/src/commerce/adapters/managed/oms/types.ts +9 -0
  363. package/src/commerce/checkoutCommandSchemas.ts +93 -0
  364. package/src/commerce/checkoutHelpers.ts +47 -0
  365. package/src/commerce/checkoutResumeSchemas.ts +164 -0
  366. package/src/commerce/checkoutSchemas.ts +182 -0
  367. package/src/commerce/commerceReturnsPort.ts +67 -0
  368. package/src/commerce/configuratorIntentPersistenceSchemas.ts +26 -0
  369. package/src/commerce/configuratorIntentSchemas.ts +47 -0
  370. package/src/commerce/contractPrimitives.ts +30 -0
  371. package/src/commerce/contracts/availability.ts +21 -0
  372. package/src/commerce/contracts/fulfillmentRecovery.ts +26 -0
  373. package/src/commerce/contracts/index.ts +17 -0
  374. package/src/commerce/contracts/intent.ts +58 -0
  375. package/src/commerce/contracts/omsTypes.ts +1217 -0
  376. package/src/commerce/contracts/order.ts +44 -0
  377. package/src/commerce/contracts/orderMoney.ts +75 -0
  378. package/src/commerce/contracts/ports.ts +124 -0
  379. package/src/commerce/contracts/recovery.ts +24 -0
  380. package/src/commerce/contracts/runtimePorts.ts +201 -0
  381. package/src/commerce/contracts/state.ts +64 -0
  382. package/src/commerce/customerDefaultsSnapshotSchemas.ts +117 -0
  383. package/src/commerce/errors.ts +53 -0
  384. package/src/commerce/fulfillmentEligibility.ts +32 -0
  385. package/src/commerce/index.ts +82 -0
  386. package/src/commerce/model/customerFulfillmentRecovery.ts +185 -0
  387. package/src/commerce/model/fulfillmentCancellationEligibility.ts +18 -0
  388. package/src/commerce/model/omsAccountingVisibility.ts +135 -0
  389. package/src/commerce/model/omsBillingInvoiceBuyer.ts +20 -0
  390. package/src/commerce/model/omsCurrency.ts +8 -0
  391. package/src/commerce/model/omsFulfillmentDebug.ts +157 -0
  392. package/src/commerce/model/omsFulfillmentSummary.ts +225 -0
  393. package/src/commerce/model/omsListTotals.ts +38 -0
  394. package/src/commerce/model/omsOperationalLadder.ts +181 -0
  395. package/src/commerce/model/omsOrderLineMoney.ts +34 -0
  396. package/src/commerce/model/omsPaymentMethodSummary.ts +19 -0
  397. package/src/commerce/model/omsReadModel.ts +302 -0
  398. package/src/commerce/model/omsReadModelCommunication.ts +32 -0
  399. package/src/commerce/model/omsReadModelHelpers.ts +279 -0
  400. package/src/commerce/model/omsReadModelList.ts +90 -0
  401. package/src/commerce/model/omsReadModelListSummary.ts +19 -0
  402. package/src/commerce/model/omsReadModelPricing.ts +57 -0
  403. package/src/commerce/model/omsReadModelProjections.ts +1 -0
  404. package/src/commerce/model/omsReadModelRowCore.ts +193 -0
  405. package/src/commerce/model/omsReadModelRows.ts +7 -0
  406. package/src/commerce/offerAvailability.ts +75 -0
  407. package/src/commerce/offerAvailabilitySchemas.ts +56 -0
  408. package/src/commerce/offerEvidenceSchemas.ts +17 -0
  409. package/src/commerce/oms/omsContractBase.ts +92 -0
  410. package/src/commerce/oms/omsContractReadAuxSchemas.ts +130 -0
  411. package/src/commerce/oms/omsContractReadSchemas.ts +303 -0
  412. package/src/commerce/oms/omsContractRequests.ts +143 -0
  413. package/src/commerce/oms/omsContracts.ts +6 -0
  414. package/src/commerce/oms/omsControlPlane.ts +85 -0
  415. package/src/commerce/oms/omsFulfillmentContractSchemas.ts +113 -0
  416. package/src/commerce/oms/omsFulfillmentDebugSchemas.ts +38 -0
  417. package/src/commerce/oms/omsFulfillmentHealthSchemas.ts +46 -0
  418. package/src/commerce/oms/omsPorts.ts +165 -0
  419. package/src/commerce/oms/omsPrimitives.ts +3 -0
  420. package/src/commerce/oms/omsProviderEvidenceSchemas.ts +13 -0
  421. package/src/commerce/orderDraftErrors.ts +28 -0
  422. package/src/commerce/orderEmailEligibility.ts +131 -0
  423. package/src/commerce/orderEmailLines.ts +22 -0
  424. package/src/commerce/orderFeedbackContracts.ts +47 -0
  425. package/src/commerce/orderMoney.ts +207 -0
  426. package/src/commerce/orderReviewContracts.ts +124 -0
  427. package/src/commerce/orderReviewPorts.ts +94 -0
  428. package/src/commerce/outboxDispatchContracts.ts +30 -0
  429. package/src/commerce/outboxEventSchemas.ts +230 -0
  430. package/src/commerce/outboxOrderDraftEmailPorts.ts +241 -0
  431. package/src/commerce/paymentContinuation.ts +5 -0
  432. package/src/commerce/ports.ts +7 -0
  433. package/src/commerce/recoveryDestination.ts +23 -0
  434. package/src/commerce/runtimeErrors.ts +19 -0
  435. package/src/commerce/salesChannelEnvelope.ts +28 -0
  436. package/src/commerce/schemas.ts +104 -0
  437. package/src/commerce/server/checkoutCompensation.ts +49 -0
  438. package/src/commerce/server/checkoutConflictClassifiers.ts +53 -0
  439. package/src/commerce/server/checkoutExpiredRecoveryPolicy.ts +107 -0
  440. package/src/commerce/server/checkoutInvoiceBuyerSnapshot.ts +36 -0
  441. package/src/commerce/server/checkoutOfferPolicyPort.ts +60 -0
  442. package/src/commerce/server/checkoutPaymentContinuationCredential.ts +222 -0
  443. package/src/commerce/server/checkoutQuoteTypes.ts +9 -0
  444. package/src/commerce/server/checkoutRecoveryOrderPort.ts +40 -0
  445. package/src/commerce/server/checkoutRecoveryToken.ts +63 -0
  446. package/src/commerce/server/checkoutRefusalContinuation.ts +29 -0
  447. package/src/commerce/server/checkoutRuntimeTypes.ts +26 -0
  448. package/src/commerce/server/commerceCheckoutCommandExecution.ts +188 -0
  449. package/src/commerce/server/commerceCheckoutCompensation.ts +66 -0
  450. package/src/commerce/server/commerceCheckoutContinuationTerms.ts +87 -0
  451. package/src/commerce/server/commerceCheckoutCustomerDefaults.ts +24 -0
  452. package/src/commerce/server/commerceCheckoutFailureHandler.ts +144 -0
  453. package/src/commerce/server/commerceCheckoutHandler.ts +269 -0
  454. package/src/commerce/server/commerceCheckoutHandlerAdmission.ts +157 -0
  455. package/src/commerce/server/commerceCheckoutHandlerHelpers.ts +223 -0
  456. package/src/commerce/server/commerceCheckoutOrchestrationError.ts +15 -0
  457. package/src/commerce/server/commerceCheckoutPromotionPriceChange.ts +83 -0
  458. package/src/commerce/server/commerceCheckoutProviderPayment.ts +45 -0
  459. package/src/commerce/server/commerceCheckoutQuoteGuard.ts +172 -0
  460. package/src/commerce/server/commerceCheckoutResume.ts +132 -0
  461. package/src/commerce/server/commerceCheckoutResumeGuard.ts +195 -0
  462. package/src/commerce/server/commerceCheckoutSavedPaymentMethod.ts +85 -0
  463. package/src/commerce/server/commerceCheckoutStartRuntimeFailure.ts +59 -0
  464. package/src/commerce/server/commerceCheckoutTiming.ts +53 -0
  465. package/src/commerce/server/commerceDiagnostics.ts +37 -0
  466. package/src/commerce/server/commerceOmsCancelOrderHandler.ts +43 -0
  467. package/src/commerce/server/commerceOmsControlPlaneHandlers.ts +71 -0
  468. package/src/commerce/server/commerceOmsHandlers.ts +275 -0
  469. package/src/commerce/server/commerceOmsMarkRefundedHandler.ts +39 -0
  470. package/src/commerce/server/commerceOrderDraft.ts +131 -0
  471. package/src/commerce/server/commercePaidOrderOrchestration.ts +275 -0
  472. package/src/commerce/server/commerceProviderAttemptFailure.ts +257 -0
  473. package/src/commerce/server/commerceReturnsHandlers.ts +143 -0
  474. package/src/commerce/server/commerceRuntimePort.ts +75 -0
  475. package/src/commerce/server/commerceRuntimeService.ts +229 -0
  476. package/src/commerce/server/commerceRuntimeStartResponse.ts +76 -0
  477. package/src/commerce/server/commerceStarterOfferGuard.ts +200 -0
  478. package/src/commerce/server/configuratorIntentPersistence.ts +161 -0
  479. package/src/commerce/server/configuratorIntentPersistenceHandler.ts +54 -0
  480. package/src/commerce/server/emailRuntime.ts +30 -0
  481. package/src/commerce/server/handlerSupport.ts +22 -0
  482. package/src/commerce/server/index.ts +181 -0
  483. package/src/commerce/server/offerAvailability.ts +275 -0
  484. package/src/commerce/server/orderDraftRpcPayload.ts +39 -0
  485. package/src/commerce/server/orderFeedbackSubmit.ts +40 -0
  486. package/src/commerce/server/orderFeedbackTokenCheck.ts +28 -0
  487. package/src/commerce/server/orderReviewAdminHandlers.ts +43 -0
  488. package/src/commerce/server/orderReviewHandlers.ts +57 -0
  489. package/src/commerce/server/orderReviewLifecycle.ts +129 -0
  490. package/src/commerce/server/orderReviewMedia.ts +170 -0
  491. package/src/commerce/server/orderReviewRawUploadHandler.ts +300 -0
  492. package/src/commerce/server/outboxCheckoutExpiredEmailHandler.ts +86 -0
  493. package/src/commerce/server/outboxCheckoutRecoveryEmailHandler.ts +188 -0
  494. package/src/commerce/server/outboxDispatchRegistry.ts +269 -0
  495. package/src/commerce/server/outboxDispatchRegistryComposition.ts +31 -0
  496. package/src/commerce/server/outboxOrderDraftEmailHandler.ts +162 -0
  497. package/src/commerce/server/outboxOrderPaidEmailHandler.ts +147 -0
  498. package/src/commerce/server/outboxOrderPaidFulfillmentHandler.ts +4 -0
  499. package/src/commerce/server/outboxOrderPaidFulfillmentPorts.ts +3 -0
  500. package/src/commerce/server/outboxOrderRefundedEmailHandler.ts +58 -0
  501. package/src/commerce/server/outboxPaymentFailedEmailHandler.ts +99 -0
  502. package/src/commerce/server/outboxReturnEmailHandlers.ts +92 -0
  503. package/src/commerce/server/outboxShipmentDeliveredEmailHandler.ts +94 -0
  504. package/src/commerce/server/outboxShipmentDispatchedEmailHandler.ts +112 -0
  505. package/src/commerce/server/outboxShipmentExceptionEmailHandler.ts +73 -0
  506. package/src/commerce/server/referenceCheckoutHandler.ts +87 -0
  507. package/src/commerce/server/reservationSweepPort.ts +67 -0
  508. package/src/commerce/server/starterTermsPort.ts +22 -0
  509. package/src/commerce/server/supabaseCommerceReturnsPort.ts +81 -0
  510. package/src/composition/commerceContribution.ts +35 -0
  511. package/src/composition/index.ts +1 -0
  512. package/src/fulfillment/index.ts +1 -1
  513. package/src/fulfillment/paidHandoff.ts +2 -2
  514. package/src/inventory/bindings.ts +12 -4
  515. package/src/inventory/index.ts +1 -0
  516. package/src/inventory/managedStockAvailability.ts +23 -0
  517. package/src/inventory/postgresStockAvailability.ts +2 -21
  518. package/src/inventory/stockReadResponse.ts +25 -0
  519. package/src/pricing/browser/index.ts +6 -0
  520. package/src/subscriptions/index.ts +3 -2
@@ -0,0 +1,275 @@
1
+ import {
2
+ DEFAULT_LOW_STOCK_THRESHOLD,
3
+ deriveOfferAvailability,
4
+ } from "../offerAvailability.js";
5
+ import type {
6
+ CommerceOfferAvailability,
7
+ CommerceOfferAvailabilityRequestItem,
8
+ } from "../contracts/availability.js";
9
+ import type {
10
+ CommerceOfferAvailabilityPort,
11
+ } from "../contracts/availability.js";
12
+
13
+ export interface OfferAvailabilityQueryClient {
14
+ from(table: string): OfferAvailabilityQueryBuilder;
15
+ }
16
+
17
+ interface OfferAvailabilityQueryBuilder extends PromiseLike<OfferAvailabilityQueryResult> {
18
+ select(columns: string, options?: Record<string, unknown>): OfferAvailabilityQueryBuilder;
19
+ in(column: string, values: unknown[]): PromiseLike<OfferAvailabilityQueryResult>;
20
+ }
21
+
22
+ interface OfferAvailabilityQueryResult {
23
+ data: unknown;
24
+ error: { code?: string; message?: string } | null;
25
+ }
26
+
27
+ interface InventoryBalanceRow {
28
+ on_hand: number;
29
+ unavailable: number;
30
+ safety_stock: number;
31
+ catalog_skus?: { sku?: string } | null;
32
+ inventory_locations?: {
33
+ status?: string;
34
+ fulfillable?: boolean;
35
+ } | null;
36
+ inventory_lots?: {
37
+ status?: string | null;
38
+ expires_at?: string | null;
39
+ } | null;
40
+ }
41
+
42
+ interface ProviderStockCurrentRow {
43
+ sku: string;
44
+ provider_kind: string;
45
+ provider_for_sale_quantity: number;
46
+ last_synced_at: string;
47
+ stale_after: string;
48
+ }
49
+
50
+ interface InventoryReservationRow {
51
+ quantity: number;
52
+ status: string;
53
+ expires_at: string | null;
54
+ catalog_skus?: { sku?: string } | null;
55
+ commerce_orders?: { status?: string } | null;
56
+ }
57
+
58
+ // Orders in a terminal, non-committed state must NOT hold stock. A cancelled
59
+ // order historically stranded its `reserved` rows (no release path fired), so
60
+ // even with the release-on-cancel trigger in place we defensively exclude these
61
+ // here — legacy stranded rows can never depress sellableNow. Paid /
62
+ // fulfillment_pending / pending_payment reservations stay counted: that stock is
63
+ // legitimately committed.
64
+ const TERMINAL_ORDER_STATUSES: ReadonlySet<string> = new Set([
65
+ "cancelled",
66
+ "failed",
67
+ "expired",
68
+ ]);
69
+
70
+ export function createOfferAvailabilityPort(
71
+ client: OfferAvailabilityQueryClient,
72
+ options: { isStockProvider: (providerKind: string) => boolean; lowStockThreshold?: number; now?: () => Date },
73
+ ): CommerceOfferAvailabilityPort {
74
+ const lowStockThreshold = options.lowStockThreshold ?? DEFAULT_LOW_STOCK_THRESHOLD;
75
+ const now = options.now ?? (() => new Date());
76
+
77
+ return {
78
+ async getAvailability({ items }) {
79
+ if (items.length === 0) return [];
80
+
81
+ const skus = [...new Set(items.map((item) => item.sku))];
82
+ const [providerResult, balanceResult, reservationResult] = await Promise.all([
83
+ client
84
+ .from("fulfillment_provider_stock_current")
85
+ .select("sku, provider_kind, provider_for_sale_quantity, last_synced_at, stale_after")
86
+ .in("sku", skus),
87
+ client
88
+ .from("inventory_balances")
89
+ .select(
90
+ "on_hand, unavailable, safety_stock, catalog_skus!inventory_balances_sku_id_fkey!inner(sku), inventory_locations!inventory_balances_location_id_fkey!inner(status, fulfillable), inventory_lots!inventory_balances_lot_id_fkey(status, expires_at)",
91
+ )
92
+ .in("catalog_skus.sku", skus),
93
+ client
94
+ .from("inventory_reservations")
95
+ .select(
96
+ "quantity, status, expires_at, catalog_skus!inventory_reservations_sku_id_fkey!inner(sku), commerce_orders!inventory_reservations_order_id_fkey!inner(status)",
97
+ )
98
+ .in("catalog_skus.sku", skus),
99
+ ]);
100
+
101
+ if (providerResult.error || balanceResult.error || reservationResult.error) {
102
+ return items.map((item) => unknownAvailability(item, "inventory_read_failed"));
103
+ }
104
+
105
+ const requestedAt = now();
106
+ const activeReservedBySku = sumActiveReservedBySku(
107
+ (reservationResult.data ?? []) as InventoryReservationRow[],
108
+ requestedAt,
109
+ );
110
+ const safetyStockBySku = sumSafetyStockBySku(
111
+ (balanceResult.data ?? []) as InventoryBalanceRow[],
112
+ requestedAt,
113
+ );
114
+ const providerBySku = providerStockBySku(
115
+ (providerResult.data ?? []) as ProviderStockCurrentRow[],
116
+ options.isStockProvider,
117
+ );
118
+ if (providerBySku.size > 0) {
119
+ return items.map((item) =>
120
+ providerAvailability({
121
+ item,
122
+ provider: providerBySku.get(item.sku) ?? null,
123
+ activeReserved: activeReservedBySku.get(item.sku) ?? 0,
124
+ safetyStock: safetyStockBySku.get(item.sku) ?? 0,
125
+ requestedAt,
126
+ lowStockThreshold,
127
+ }),
128
+ );
129
+ }
130
+
131
+ const localBaseBySku = sumLocalAvailableBaseBySku(
132
+ (balanceResult.data ?? []) as InventoryBalanceRow[],
133
+ requestedAt,
134
+ );
135
+ return items.map((item) => {
136
+ const sellableNow = localBaseBySku.has(item.sku)
137
+ ? Math.max(0, (localBaseBySku.get(item.sku) ?? 0) - (activeReservedBySku.get(item.sku) ?? 0))
138
+ : null;
139
+ return deriveOfferAvailability({
140
+ ...item,
141
+ sellableNow,
142
+ lowStockThreshold,
143
+ source: "inventory",
144
+ });
145
+ });
146
+ },
147
+ };
148
+ }
149
+
150
+ function providerStockBySku(rows: readonly ProviderStockCurrentRow[], isStockProvider: (providerKind: string) => boolean): Map<string, ProviderStockCurrentRow> {
151
+ return new Map(
152
+ rows
153
+ .filter((row) => isStockProvider(row.provider_kind) && row.sku)
154
+ .map((row) => [row.sku, row]),
155
+ );
156
+ }
157
+
158
+ function providerAvailability(input: {
159
+ item: CommerceOfferAvailabilityRequestItem;
160
+ provider: ProviderStockCurrentRow | null;
161
+ activeReserved: number;
162
+ safetyStock: number;
163
+ requestedAt: Date;
164
+ lowStockThreshold: number;
165
+ }): CommerceOfferAvailability {
166
+ if (!input.provider) {
167
+ return unavailable(input.item, "provider_stock_missing");
168
+ }
169
+ if (Date.parse(input.provider.stale_after) <= input.requestedAt.getTime()) {
170
+ return unavailable(input.item, "provider_stock_stale");
171
+ }
172
+ return deriveOfferAvailability({
173
+ ...input.item,
174
+ sellableNow: Math.max(
175
+ 0,
176
+ input.provider.provider_for_sale_quantity - input.activeReserved - input.safetyStock,
177
+ ),
178
+ lowStockThreshold: input.lowStockThreshold,
179
+ source: "inventory_provider",
180
+ });
181
+ }
182
+
183
+ function sumActiveReservedBySku(
184
+ rows: readonly InventoryReservationRow[],
185
+ requestedAt: Date,
186
+ ): Map<string, number> {
187
+ const result = new Map<string, number>();
188
+ for (const row of rows) {
189
+ const sku = row.catalog_skus?.sku;
190
+ if (!sku || !reservationBlocksStock(row, requestedAt)) continue;
191
+ result.set(sku, (result.get(sku) ?? 0) + row.quantity);
192
+ }
193
+ return result;
194
+ }
195
+
196
+ function sumSafetyStockBySku(
197
+ rows: readonly InventoryBalanceRow[],
198
+ requestedAt: Date,
199
+ ): Map<string, number> {
200
+ const result = new Map<string, number>();
201
+ for (const row of rows) {
202
+ const sku = row.catalog_skus?.sku;
203
+ if (!sku || !balanceUsable(row, requestedAt)) continue;
204
+ result.set(sku, (result.get(sku) ?? 0) + row.safety_stock);
205
+ }
206
+ return result;
207
+ }
208
+
209
+ function sumLocalAvailableBaseBySku(
210
+ rows: readonly InventoryBalanceRow[],
211
+ requestedAt: Date,
212
+ ): Map<string, number> {
213
+ const result = new Map<string, number>();
214
+ for (const row of rows) {
215
+ const sku = row.catalog_skus?.sku;
216
+ if (!sku || !balanceUsable(row, requestedAt)) continue;
217
+ result.set(
218
+ sku,
219
+ (result.get(sku) ?? 0) + Math.max(0, row.on_hand - row.unavailable - row.safety_stock),
220
+ );
221
+ }
222
+ return result;
223
+ }
224
+
225
+ function balanceUsable(row: InventoryBalanceRow, requestedAt: Date): boolean {
226
+ const location = row.inventory_locations;
227
+ if (location?.status !== "active" || location.fulfillable !== true) return false;
228
+ const lotStatus = row.inventory_lots?.status;
229
+ if (lotStatus && lotStatus !== "available") return false;
230
+ const expiresAt = row.inventory_lots?.expires_at;
231
+ if (expiresAt && Date.parse(expiresAt) <= requestedAt.getTime()) return false;
232
+ return true;
233
+ }
234
+
235
+ function reservationBlocksStock(row: InventoryReservationRow, requestedAt: Date): boolean {
236
+ if (row.status !== "reserved") return false;
237
+ // A reserved row tied to a terminal (cancelled/failed/expired) order is a
238
+ // stranded hold — do not let it depress sellableNow.
239
+ const orderStatus = row.commerce_orders?.status;
240
+ if (orderStatus && TERMINAL_ORDER_STATUSES.has(orderStatus)) return false;
241
+ if (!row.expires_at) return true;
242
+ return Date.parse(row.expires_at) > requestedAt.getTime();
243
+ }
244
+
245
+ function unavailable(
246
+ item: CommerceOfferAvailabilityRequestItem,
247
+ reasonCode: string,
248
+ ): CommerceOfferAvailability {
249
+ return {
250
+ sku: item.sku,
251
+ productSlug: item.productSlug,
252
+ variantId: item.variantId,
253
+ status: "out_of_stock",
254
+ visibleInConfigurator: false,
255
+ sellableNow: 0,
256
+ reasonCode,
257
+ source: "inventory_provider",
258
+ };
259
+ }
260
+
261
+ function unknownAvailability(
262
+ item: CommerceOfferAvailabilityRequestItem,
263
+ reasonCode: string,
264
+ ): CommerceOfferAvailability {
265
+ return {
266
+ sku: item.sku,
267
+ productSlug: item.productSlug,
268
+ variantId: item.variantId,
269
+ status: "unknown",
270
+ visibleInConfigurator: true,
271
+ sellableNow: null,
272
+ reasonCode,
273
+ source: "inventory",
274
+ };
275
+ }
@@ -0,0 +1,39 @@
1
+ import { z } from "zod";
2
+ import { commerceIdempotencyKeySchema } from "../contractPrimitives.js";
3
+
4
+ export const ORDER_DRAFT_RPC_NAME = "commerce_create_order_draft_with_outbox";
5
+
6
+ // Keep the emitted declaration in Zod's public types rather than expanding its
7
+ // internal mapped output, which cannot be checked by a strict installed consumer.
8
+ type OrderDraftRpcSchema<Quote extends z.ZodType, Draft extends z.ZodType> = z.ZodObject<{
9
+ p_idempotency_key: z.ZodString;
10
+ p_quote_snapshot: Quote;
11
+ p_order_draft_snapshot: Draft;
12
+ p_client_id: z.ZodOptional<z.ZodGUID>;
13
+ }, z.core.$strict>;
14
+
15
+ export function createOrderDraftRpcPayload<Quote extends z.ZodType, Draft extends z.ZodType>(input: {
16
+ quoteSchema: Quote;
17
+ draftSchema: Draft;
18
+ createSnapshot(quote: z.output<Quote>): z.input<Draft>;
19
+ }) {
20
+ const orderDraftRpcArgsSchema: OrderDraftRpcSchema<Quote, Draft> = z.object({
21
+ p_idempotency_key: commerceIdempotencyKeySchema,
22
+ p_quote_snapshot: input.quoteSchema,
23
+ p_order_draft_snapshot: input.draftSchema,
24
+ // Omit the optional client for anonymous calls, preserving the three-argument RPC.
25
+ p_client_id: z.guid().optional(),
26
+ }).strict();
27
+ function createOrderDraftRpcArgs(
28
+ request: { idempotencyKey: string; quoteSnapshot: z.output<Quote> },
29
+ clientId: string | null = null,
30
+ ): z.output<OrderDraftRpcSchema<Quote, Draft>> {
31
+ const base = {
32
+ p_idempotency_key: request.idempotencyKey,
33
+ p_quote_snapshot: request.quoteSnapshot,
34
+ p_order_draft_snapshot: input.createSnapshot(request.quoteSnapshot),
35
+ };
36
+ return orderDraftRpcArgsSchema.parse(clientId ? { ...base, p_client_id: clientId } : base);
37
+ }
38
+ return { orderDraftRpcArgsSchema, createOrderDraftRpcArgs };
39
+ }
@@ -0,0 +1,40 @@
1
+ import {
2
+ ORDER_FEEDBACK_SUBMIT_RPC_NAME,
3
+ type OrderFeedbackSubmitRequest,
4
+ } from "../orderFeedbackContracts.js";
5
+
6
+ interface RpcError {
7
+ message?: string;
8
+ }
9
+
10
+ export interface OrderFeedbackSubmitRpcClient {
11
+ rpc(
12
+ functionName: typeof ORDER_FEEDBACK_SUBMIT_RPC_NAME,
13
+ args: {
14
+ p_token: string;
15
+ p_rating: number;
16
+ p_comment: string | null;
17
+ },
18
+ ): PromiseLike<{ data: unknown; error: RpcError | null }>;
19
+ }
20
+
21
+ export interface OrderFeedbackSubmitPort {
22
+ submit(request: OrderFeedbackSubmitRequest): Promise<unknown>;
23
+ }
24
+
25
+ /** Hosted token feedback only; the adopter must provide this RPC. Native db/platform has no binding. */
26
+ export function createSupabaseOrderFeedbackSubmitPort(
27
+ client: OrderFeedbackSubmitRpcClient,
28
+ ): OrderFeedbackSubmitPort {
29
+ return {
30
+ async submit(request) {
31
+ const { data, error } = await client.rpc(ORDER_FEEDBACK_SUBMIT_RPC_NAME, {
32
+ p_token: request.token,
33
+ p_rating: request.rating,
34
+ p_comment: request.comment ?? null,
35
+ });
36
+ if (error) throw new Error(error.message ?? "order_feedback_submit_failed");
37
+ return data;
38
+ },
39
+ };
40
+ }
@@ -0,0 +1,28 @@
1
+ import {
2
+ ORDER_FEEDBACK_CHECK_RPC_NAME,
3
+ type OrderFeedbackTokenCheckRequest,
4
+ } from "../orderFeedbackContracts.js";
5
+
6
+ interface RpcError {
7
+ message?: string;
8
+ }
9
+
10
+ export interface OrderFeedbackTokenCheckRpcClient {
11
+ rpc(
12
+ functionName: typeof ORDER_FEEDBACK_CHECK_RPC_NAME,
13
+ args: { p_token: string },
14
+ ): PromiseLike<{ data: unknown; error: RpcError | null }>;
15
+ }
16
+
17
+ /** Hosted token feedback only; the adopter must provide this RPC. Native db/platform has no binding. */
18
+ export function createSupabaseOrderFeedbackTokenCheckPort(client: OrderFeedbackTokenCheckRpcClient) {
19
+ return {
20
+ async check(request: OrderFeedbackTokenCheckRequest): Promise<unknown> {
21
+ const { data, error } = await client.rpc(ORDER_FEEDBACK_CHECK_RPC_NAME, {
22
+ p_token: request.token,
23
+ });
24
+ if (error) throw new Error(error.message ?? "order_feedback_token_check_failed");
25
+ return data;
26
+ },
27
+ };
28
+ }
@@ -0,0 +1,43 @@
1
+ import {
2
+ orderReviewAdminRevokeSchema,
3
+ orderReviewReferenceSchema,
4
+ orderReviewModerationSchema,
5
+ type OrderReviewFailure,
6
+ } from "../orderReviewContracts.js";
7
+ import { runOrderReviewCommand } from "./orderReviewHandlers.js";
8
+ import type { OrderReviewAdminReadPort, OrderReviewLifecyclePort } from "../orderReviewPorts.js";
9
+
10
+ type Result<T> = { ok: true; value: T; replayed?: boolean } | { ok: false; error: OrderReviewFailure };
11
+
12
+ /** Actor identity is supplied only by the already-authorized route composition. */
13
+ export function createOrderReviewAdminHandlers(
14
+ lifecycle: OrderReviewLifecyclePort,
15
+ readPort: OrderReviewAdminReadPort,
16
+ ) {
17
+ return {
18
+ async list(actorRef: string, input: { cursor?: string; limit?: number }): Promise<Result<Awaited<ReturnType<OrderReviewAdminReadPort["list"]>>>> {
19
+ if (!validActor(actorRef)) return unavailable();
20
+ const limit = Math.min(Math.max(input.limit ?? 25, 1), 100);
21
+ try { return { ok: true, value: await readPort.list({ actorRef, cursor: input.cursor, limit }) }; }
22
+ catch { return unavailable(); }
23
+ },
24
+ async read(actorRef: string, reviewRef: string): Promise<Result<Awaited<ReturnType<OrderReviewAdminReadPort["read"]>>>> {
25
+ if (!validActor(actorRef) || !orderReviewReferenceSchema.safeParse(reviewRef).success) return unavailable();
26
+ try {
27
+ const review = await readPort.read({ actorRef, reviewRef });
28
+ return review ? { ok: true, value: review } : unavailable();
29
+ } catch { return unavailable(); }
30
+ },
31
+ async moderate(actorRef: string, input: unknown) {
32
+ if (!validActor(actorRef)) return unavailable();
33
+ return runOrderReviewCommand(orderReviewModerationSchema.safeParse(input), (data) => lifecycle.moderate({ ...data, actorRef }), (result) => result.value);
34
+ },
35
+ async revoke(actorRef: string, input: { reviewRef?: string; idempotencyKey?: string }) {
36
+ if (!validActor(actorRef)) return unavailable();
37
+ return runOrderReviewCommand(orderReviewAdminRevokeSchema.safeParse(input), (data) => lifecycle.revoke({ ...data, actorRef }), (result) => result);
38
+ },
39
+ };
40
+ }
41
+
42
+ function validActor(value: string): boolean { return /^[A-Za-z0-9][A-Za-z0-9._:-]{0,255}$/.test(value); }
43
+ function unavailable() { return { ok: false as const, error: { kind: "unavailable" as const } }; }
@@ -0,0 +1,57 @@
1
+ import {
2
+ orderReviewFailure,
3
+ orderReviewMediaConfirmSchema,
4
+ orderReviewMediaIntentSchema,
5
+ orderReviewSubmitSchema,
6
+ type OrderReview,
7
+ type OrderReviewFailure,
8
+ type OrderReviewReadResult,
9
+ } from "../orderReviewContracts.js";
10
+ import type { OrderReviewLifecyclePort } from "../orderReviewPorts.js";
11
+
12
+ type Result<T> = { ok: true; value: T; replayed?: boolean } | { ok: false; error: OrderReviewFailure };
13
+
14
+ /** HTTP-neutral customer orchestration; route composition owns bearer extraction. */
15
+ export function createOrderReviewHandlers(port: OrderReviewLifecyclePort) {
16
+ return {
17
+ async read(grant: string): Promise<Result<OrderReviewReadResult>> {
18
+ try {
19
+ const result = await port.read(grant);
20
+ return result ? { ok: true, value: result } : { ok: false, error: { kind: "unavailable" } };
21
+ } catch (error) {
22
+ return { ok: false, error: orderReviewFailure(errorCode(error)) };
23
+ }
24
+ },
25
+ async submit(input: unknown) {
26
+ return runOrderReviewCommand(orderReviewSubmitSchema.safeParse(input), (data) => port.submit(data), (result) => result.value);
27
+ },
28
+ async createMediaIntent(input: unknown) {
29
+ return runOrderReviewCommand(orderReviewMediaIntentSchema.safeParse(input), (data) => port.createMediaIntent(data), (result) => result);
30
+ },
31
+ async confirmMedia(input: unknown) {
32
+ return runOrderReviewCommand(orderReviewMediaConfirmSchema.safeParse(input), (data) => port.confirmMedia(data), (result) => result.value);
33
+ },
34
+ };
35
+ }
36
+
37
+ /** Shared command scaffold: parse result, one port call, the value mapper, failure mapping. */
38
+ export async function runOrderReviewCommand<D, R extends { replayed?: boolean }, V>(
39
+ parsed: { success: true; data: D } | { success: false },
40
+ call: (data: D) => Promise<R>,
41
+ map: (result: R) => V,
42
+ ) {
43
+ if (parsed.success === false) return invalid();
44
+ try {
45
+ const result = await call(parsed.data);
46
+ return { ok: true as const, value: map(result), replayed: result.replayed };
47
+ } catch (error) {
48
+ return failure(error);
49
+ }
50
+ }
51
+
52
+ function invalid() { return { ok: false as const, error: { kind: "invalid" as const } }; }
53
+ function failure(error: unknown) { return { ok: false as const, error: orderReviewFailure(errorCode(error)) }; }
54
+ function errorCode(error: unknown): string | undefined {
55
+ return error && typeof error === "object" && "code" in error && typeof error.code === "string"
56
+ ? error.code : undefined;
57
+ }
@@ -0,0 +1,129 @@
1
+ import {
2
+ ORDER_REVIEW_CONTRACT_VERSION,
3
+ orderReviewAdminDetailSchema,
4
+ orderReviewMediaSchema,
5
+ orderReviewMediaIntentResultSchema,
6
+ orderReviewReadResultSchema,
7
+ orderReviewSchema,
8
+ type OrderReview,
9
+ type OrderReviewAdminDetail,
10
+ type OrderReviewMedia,
11
+ } from "../orderReviewContracts.js";
12
+ import type { OrderReviewAdminReadPort, OrderReviewLifecyclePort, Replay } from "../orderReviewPorts.js";
13
+ // Structural equivalent of the host query executor; declarations need no optional pg peer.
14
+ type PgQueryExecutor = { query(text: string, values?: unknown[]): Promise<{ rows: Record<string, unknown>[] }> };
15
+
16
+ const READ = "SELECT public.order_review_read($1::text, now()) AS response";
17
+ const SUBMIT = "SELECT public.order_review_submit($1::text,$2::integer,$3::text,$4::text,now()) AS response";
18
+ const INTENT = "SELECT public.order_review_create_media_intent($1::text,$2::text,$3::integer,$4::text,$5::text,now()) AS response";
19
+ const CONFIRM = "SELECT public.order_review_confirm_media($1::text,$2::text,$3::text,$4::text,now()) AS response";
20
+ const MODERATE = "SELECT public.order_review_moderate($1::text,$2::text,$3::text,$4::text,now()) AS response";
21
+ const REVOKE = "SELECT public.order_review_revoke_access($1::text,$2::text,$3::text,now()) AS response";
22
+ const ADMIN_LIST = "SELECT public.order_review_admin_list($1::text,$2::text,$3::integer,now()) AS response";
23
+ const ADMIN_READ = "SELECT public.order_review_admin_read($1::text,$2::text,now()) AS response";
24
+
25
+ export function createPostgresOrderReviewLifecyclePort(executor: PgQueryExecutor): OrderReviewLifecyclePort {
26
+ return {
27
+ async read(grant) {
28
+ const response = await call(executor, READ, [grant]);
29
+ if (response === null) return null;
30
+ return readResult(response);
31
+ },
32
+ async submit(input) {
33
+ return replay(review(required(await call(executor, SUBMIT, [input.grant, input.rating, input.comment ?? null, input.fingerprint]))));
34
+ },
35
+ async createMediaIntent(input) {
36
+ return mediaIntent(required(await call(executor, INTENT, [
37
+ input.grant, input.contentType, input.byteLength, input.capabilityDigest, input.commandKey,
38
+ ])));
39
+ },
40
+ async confirmMedia(input) {
41
+ return replay(media(required(await call(executor, CONFIRM, [input.grant, input.mediaRef, input.digest, input.commandKey]))));
42
+ },
43
+ async moderate(input) {
44
+ return replay(review(await call(executor, MODERATE, [
45
+ input.reviewRef, input.action, input.actorRef, input.idempotencyKey,
46
+ ])));
47
+ },
48
+ async revoke(input) {
49
+ const response = object(await call(executor, REVOKE, [input.reviewRef, input.actorRef, input.idempotencyKey]));
50
+ if (!response) throw invalid();
51
+ return { replayed: response.replayed === true };
52
+ },
53
+ };
54
+ }
55
+
56
+ /** Admin route composition authenticates the actor before invoking this adapter. */
57
+ export function createPostgresOrderReviewAdminReadPort(executor: PgQueryExecutor): OrderReviewAdminReadPort {
58
+ return {
59
+ async list(input) {
60
+ const row = object(await call(executor, ADMIN_LIST, [input.actorRef, input.cursor ?? null, input.limit]));
61
+ if (!row || !Array.isArray(row.items)) throw invalid();
62
+ const items = row.items.map((item) => review(item));
63
+ const nextCursor = row.nextCursor;
64
+ if (nextCursor !== undefined && typeof nextCursor !== "string") throw invalid();
65
+ return nextCursor === undefined ? { items } : { items, nextCursor: nextCursor as string };
66
+ },
67
+ async read(input) {
68
+ const response = await call(executor, ADMIN_READ, [input.actorRef, input.reviewRef]);
69
+ return response === null ? null : adminDetail(response);
70
+ },
71
+ };
72
+ }
73
+
74
+ async function call(executor: PgQueryExecutor, sql: string, values: unknown[]): Promise<unknown> {
75
+ const result = await executor.query(sql, values);
76
+ return object(result.rows[0])?.response ?? null;
77
+ }
78
+
79
+ function replay<T>(value: T & { replayed?: unknown }): Replay<T> {
80
+ const { replayed, ...result } = value;
81
+ return { value: result as T, replayed: replayed === true };
82
+ }
83
+ function review(value: unknown): OrderReview & { replayed?: unknown } {
84
+ const row = object(value);
85
+ if (!row) throw invalid();
86
+ const { replayed, ...payload } = row;
87
+ const parsed = orderReviewSchema.parse({
88
+ contractVersion: payload.contractVersion ?? ORDER_REVIEW_CONTRACT_VERSION,
89
+ ...payload,
90
+ comment: payload.comment ?? null,
91
+ });
92
+ return { ...parsed, ...(typeof replayed === "boolean" ? { replayed } : {}) };
93
+ }
94
+ function media(value: unknown): OrderReviewMedia & { replayed?: unknown } {
95
+ const row = object(value);
96
+ if (!row) throw invalid();
97
+ const { replayed, ...payload } = row;
98
+ const parsed = orderReviewMediaSchema.parse(payload);
99
+ return { ...parsed, ...(typeof replayed === "boolean" ? { replayed } : {}) };
100
+ }
101
+ function mediaIntent(value: unknown) {
102
+ const row = object(value);
103
+ if (!row) throw invalid();
104
+ return orderReviewMediaIntentResultSchema.parse(row);
105
+ }
106
+ function readResult(value: unknown) {
107
+ const row = object(value);
108
+ if (!row || !Array.isArray(row.media)) throw invalid();
109
+ return orderReviewReadResultSchema.parse({
110
+ review: row.review === null ? null : review(row.review),
111
+ media: row.media.map((item) => media(item)),
112
+ });
113
+ }
114
+ function adminDetail(value: unknown): OrderReviewAdminDetail {
115
+ const row = object(value);
116
+ if (!row || !Array.isArray(row.media)) throw invalid();
117
+ return orderReviewAdminDetailSchema.parse({
118
+ review: review(row.review),
119
+ media: row.media.map((item) => media(item)),
120
+ });
121
+ }
122
+ function object(value: unknown): Record<string, unknown> | null {
123
+ return value && typeof value === "object" && !Array.isArray(value) ? value as Record<string, unknown> : null;
124
+ }
125
+ function invalid() { return Object.assign(new Error("order_review_response_invalid"), { code: "order_review_invalid" }); }
126
+ function required(value: unknown): unknown {
127
+ if (value === null) throw Object.assign(new Error("order_review_unavailable"), { code: "order_review_unavailable" });
128
+ return value;
129
+ }