@stacksjs/commerce 0.75.111 → 0.75.113

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 (230) hide show
  1. package/README.md +15 -0
  2. package/dist/auctions/bids/fetch.js +1 -0
  3. package/dist/auctions/bids/index.js +1 -0
  4. package/dist/auctions/bids/place.js +1 -0
  5. package/dist/auctions/engine/anti-snipe.js +1 -0
  6. package/dist/auctions/engine/increments.js +1 -0
  7. package/dist/auctions/engine/index.js +1 -0
  8. package/dist/auctions/engine/proxy.js +1 -0
  9. package/dist/auctions/engine/winners.js +1 -0
  10. package/dist/auctions/index.js +1 -0
  11. package/dist/auctions/lots/fetch.js +1 -0
  12. package/dist/auctions/lots/index.js +1 -0
  13. package/dist/auctions/lots/lifecycle.js +1 -0
  14. package/dist/auctions/notifications.js +1 -0
  15. package/dist/auctions/pledges/index.js +1 -0
  16. package/dist/auctions/realtime.js +1 -0
  17. package/dist/auctions/rules.js +1 -0
  18. package/dist/auctions/types.js +0 -0
  19. package/dist/carts/destroy.js +1 -0
  20. package/dist/carts/fetch.js +1 -0
  21. package/dist/carts/index.js +1 -0
  22. package/dist/carts/store.js +1 -0
  23. package/dist/carts/update.js +1 -0
  24. package/dist/catalog.js +1 -2
  25. package/dist/coupons/destroy.js +1 -0
  26. package/dist/coupons/fetch.js +1 -0
  27. package/dist/coupons/index.js +1 -0
  28. package/dist/coupons/store.js +1 -0
  29. package/dist/coupons/update.js +7 -0
  30. package/dist/customers/destroy.js +1 -0
  31. package/dist/customers/fetch.js +1 -0
  32. package/dist/customers/index.js +1 -0
  33. package/dist/customers/store.js +1 -0
  34. package/dist/customers/update.js +1 -0
  35. package/dist/devices/destroy.js +1 -0
  36. package/dist/devices/export.js +1 -0
  37. package/dist/devices/fetch.js +1 -0
  38. package/dist/devices/index.js +1 -0
  39. package/dist/devices/store.js +1 -0
  40. package/dist/devices/update.js +1 -0
  41. package/dist/errors/destroy.js +1 -0
  42. package/dist/errors/fetch.js +1 -0
  43. package/dist/errors/index.js +1 -0
  44. package/dist/errors/update.js +1 -0
  45. package/dist/gift-cards/destroy.js +1 -0
  46. package/dist/gift-cards/fetch.js +1 -0
  47. package/dist/gift-cards/index.js +1 -0
  48. package/dist/gift-cards/store.js +1 -0
  49. package/dist/gift-cards/update.js +10 -0
  50. package/dist/imports/account-mapping.js +1 -0
  51. package/dist/imports/account-types.js +0 -0
  52. package/dist/imports/account-writer.js +1 -0
  53. package/dist/imports/admin-http.js +1 -0
  54. package/dist/imports/credentials.js +1 -0
  55. package/dist/imports/http.js +1 -0
  56. package/dist/imports/identity.js +1 -0
  57. package/dist/imports/index.js +1 -0
  58. package/dist/imports/money.js +1 -0
  59. package/dist/imports/shopify-admin.js +1 -0
  60. package/dist/imports/shopify.js +1 -0
  61. package/dist/imports/shopware-admin.js +1 -0
  62. package/dist/imports/shopware.js +1 -0
  63. package/dist/imports/text.js +1 -0
  64. package/dist/imports/types.js +0 -0
  65. package/dist/imports/woocommerce-admin.js +1 -0
  66. package/dist/imports/woocommerce.js +1 -0
  67. package/dist/imports/writer.js +1 -0
  68. package/dist/index.d.ts +3 -0
  69. package/dist/index.js +1 -28
  70. package/dist/inventory.d.ts +2 -0
  71. package/dist/inventory.js +1 -0
  72. package/dist/money.js +1 -2
  73. package/dist/orders/destroy.js +1 -0
  74. package/dist/orders/events.js +1 -0
  75. package/dist/orders/export.js +1 -0
  76. package/dist/orders/fetch.js +1 -0
  77. package/dist/orders/guards.js +1 -0
  78. package/dist/orders/index.js +1 -0
  79. package/dist/orders/place-order.js +1 -0
  80. package/dist/orders/store.js +1 -0
  81. package/dist/orders/totals.js +1 -0
  82. package/dist/orders/transition.js +1 -0
  83. package/dist/orders/update.js +1 -0
  84. package/dist/orders/webhook.js +1 -0
  85. package/dist/payments/destroy.js +1 -0
  86. package/dist/payments/fetch.js +1 -0
  87. package/dist/payments/index.js +1 -0
  88. package/dist/payments/store.js +1 -0
  89. package/dist/payments/update.js +8 -0
  90. package/dist/product.d.ts +1 -0
  91. package/dist/product.js +0 -0
  92. package/dist/products/categories/destroy.js +1 -0
  93. package/dist/products/categories/fetch.js +1 -0
  94. package/dist/products/categories/index.js +1 -0
  95. package/dist/products/categories/store.js +1 -0
  96. package/dist/products/categories/types.js +0 -0
  97. package/dist/products/categories/update.js +1 -0
  98. package/dist/products/index.js +1 -0
  99. package/dist/products/items/destroy.js +1 -0
  100. package/dist/products/items/fetch.js +1 -0
  101. package/dist/products/items/index.d.ts +1 -0
  102. package/dist/products/items/index.js +1 -0
  103. package/dist/products/items/store.js +1 -0
  104. package/dist/products/items/update.d.ts +2 -0
  105. package/dist/products/items/update.js +1 -0
  106. package/dist/products/manufacturers/destroy.js +1 -0
  107. package/dist/products/manufacturers/fetch.js +1 -0
  108. package/dist/products/manufacturers/index.js +1 -0
  109. package/dist/products/manufacturers/store.js +1 -0
  110. package/dist/products/manufacturers/update.js +1 -0
  111. package/dist/products/reviews/destroy.js +1 -0
  112. package/dist/products/reviews/fetch.js +1 -0
  113. package/dist/products/reviews/index.js +1 -0
  114. package/dist/products/reviews/stats.js +1 -0
  115. package/dist/products/reviews/store.js +1 -0
  116. package/dist/products/reviews/update.js +1 -0
  117. package/dist/products/units/destroy.js +1 -0
  118. package/dist/products/units/fetch.js +1 -0
  119. package/dist/products/units/index.js +1 -0
  120. package/dist/products/units/store.js +1 -0
  121. package/dist/products/units/types.js +0 -0
  122. package/dist/products/units/update.js +1 -0
  123. package/dist/products/variants/destroy.js +1 -0
  124. package/dist/products/variants/fetch.js +1 -0
  125. package/dist/products/variants/index.js +1 -0
  126. package/dist/products/variants/store.js +1 -0
  127. package/dist/products/variants/update.js +1 -0
  128. package/dist/receipts/destroy.js +1 -0
  129. package/dist/receipts/export.d.ts +1 -0
  130. package/dist/receipts/export.js +0 -0
  131. package/dist/receipts/fetch.js +1 -0
  132. package/dist/receipts/index.js +1 -0
  133. package/dist/receipts/printer.d.ts +37 -0
  134. package/dist/receipts/printer.js +1 -0
  135. package/dist/receipts/store.js +1 -0
  136. package/dist/receipts/timestamp.js +1 -0
  137. package/dist/receipts/update.js +1 -0
  138. package/dist/refund-allocation.js +1 -2
  139. package/dist/register.js +1 -2
  140. package/dist/releases.js +1 -2
  141. package/dist/sales-tax.js +1 -2
  142. package/dist/shippings/couriers/destroy.js +1 -0
  143. package/dist/shippings/couriers/fetch.js +1 -0
  144. package/dist/shippings/couriers/index.js +1 -0
  145. package/dist/shippings/couriers/store.js +1 -0
  146. package/dist/shippings/couriers/update.js +1 -0
  147. package/dist/shippings/delivery-routes/destroy.js +1 -0
  148. package/dist/shippings/delivery-routes/fetch.js +1 -0
  149. package/dist/shippings/delivery-routes/index.js +1 -0
  150. package/dist/shippings/delivery-routes/store.js +1 -0
  151. package/dist/shippings/delivery-routes/update.js +1 -0
  152. package/dist/shippings/delivery-routes/validate-write.js +1 -0
  153. package/dist/shippings/digital-deliveries/destroy.js +1 -0
  154. package/dist/shippings/digital-deliveries/fetch.js +1 -0
  155. package/dist/shippings/digital-deliveries/index.js +1 -0
  156. package/dist/shippings/digital-deliveries/store.js +1 -0
  157. package/dist/shippings/digital-deliveries/update.js +1 -0
  158. package/dist/shippings/geocoding/index.js +1 -0
  159. package/dist/shippings/geocoding/nominatim.js +1 -0
  160. package/dist/shippings/geocoding/types.js +1 -0
  161. package/dist/shippings/index.js +1 -0
  162. package/dist/shippings/license-keys/destroy.js +1 -0
  163. package/dist/shippings/license-keys/fetch.js +1 -0
  164. package/dist/shippings/license-keys/index.js +1 -0
  165. package/dist/shippings/license-keys/store.js +1 -0
  166. package/dist/shippings/license-keys/update.js +1 -0
  167. package/dist/shippings/license-keys/validate-write.js +1 -0
  168. package/dist/shippings/shipping-methods/destroy.js +1 -0
  169. package/dist/shippings/shipping-methods/fetch.js +1 -0
  170. package/dist/shippings/shipping-methods/index.js +1 -0
  171. package/dist/shippings/shipping-methods/store.js +1 -0
  172. package/dist/shippings/shipping-methods/update.js +1 -0
  173. package/dist/shippings/shipping-rates/destroy.js +1 -0
  174. package/dist/shippings/shipping-rates/fetch.js +1 -0
  175. package/dist/shippings/shipping-rates/index.js +1 -0
  176. package/dist/shippings/shipping-rates/store.js +1 -0
  177. package/dist/shippings/shipping-rates/update.js +1 -0
  178. package/dist/shippings/shipping-rates/validate-write.js +1 -0
  179. package/dist/shippings/shipping-zones/destroy.js +1 -0
  180. package/dist/shippings/shipping-zones/fetch.js +1 -0
  181. package/dist/shippings/shipping-zones/index.js +1 -0
  182. package/dist/shippings/shipping-zones/store.js +1 -0
  183. package/dist/shippings/shipping-zones/update.js +1 -0
  184. package/dist/shippings/tracking/events.js +1 -0
  185. package/dist/shippings/tracking/geo.js +1 -0
  186. package/dist/shippings/tracking/index.js +1 -0
  187. package/dist/shippings/tracking/ping.js +1 -0
  188. package/dist/shippings/tracking/stops.js +1 -0
  189. package/dist/shippings/write-data.js +1 -0
  190. package/dist/tax/breakdown.js +1 -0
  191. package/dist/tax/destroy.js +1 -0
  192. package/dist/tax/fetch.js +1 -0
  193. package/dist/tax/index.js +1 -0
  194. package/dist/tax/store.js +1 -0
  195. package/dist/tax/types.js +0 -0
  196. package/dist/tax/update.js +1 -0
  197. package/dist/tax-input.d.ts +7 -0
  198. package/dist/tax-input.js +1 -0
  199. package/dist/tests/fixtures/returning-all-writes.d.ts +1 -0
  200. package/dist/tests/fixtures/returning-all-writes.js +1 -0
  201. package/dist/tests/fixtures/soft-delete-counts.d.ts +1 -0
  202. package/dist/tests/fixtures/soft-delete-counts.js +1 -0
  203. package/dist/tests/fixtures/write-counts.d.ts +1 -0
  204. package/dist/tests/fixtures/write-counts.js +8 -0
  205. package/dist/tests/setup.d.ts +5 -0
  206. package/dist/tests/setup.js +1 -0
  207. package/dist/types.js +0 -0
  208. package/dist/utils/inserted-id.js +1 -0
  209. package/dist/utils/inventory-adjustment.js +5 -0
  210. package/dist/utils/model-row.js +1 -0
  211. package/dist/utils/mutation-count.js +1 -0
  212. package/dist/utils/typed-stats.js +1 -0
  213. package/dist/waitlists/index.js +1 -0
  214. package/dist/waitlists/products/destroy.js +1 -0
  215. package/dist/waitlists/products/export.d.ts +41 -0
  216. package/dist/waitlists/products/export.js +1 -0
  217. package/dist/waitlists/products/fetch.js +1 -0
  218. package/dist/waitlists/products/index.js +1 -0
  219. package/dist/waitlists/products/store.js +1 -0
  220. package/dist/waitlists/products/update.js +1 -0
  221. package/dist/waitlists/products/write-data.js +1 -0
  222. package/dist/waitlists/restaurant/destroy.js +1 -0
  223. package/dist/waitlists/restaurant/export.d.ts +39 -0
  224. package/dist/waitlists/restaurant/export.js +1 -0
  225. package/dist/waitlists/restaurant/fetch.js +1 -0
  226. package/dist/waitlists/restaurant/index.js +1 -0
  227. package/dist/waitlists/restaurant/store.js +1 -0
  228. package/dist/waitlists/restaurant/update.js +1 -0
  229. package/dist/waitlists/restaurant/write-data.js +1 -0
  230. package/package.json +13 -12
package/dist/index.js CHANGED
@@ -1,28 +1 @@
1
- // @bun
2
- var my=Object.defineProperty;var py=(e)=>e;function fy(e,t){this[e]=py.bind(null,t)}var E=(e,t)=>{for(var r in t)my(e,r,{get:t[r],enumerable:!0,configurable:!0,set:fy.bind(t,r)})};var wy=(e,t,r)=>()=>{if(e)try{t=e(e=0)}catch(n){r=[n]}if(r)throw r[0];return t};function be(e,t){if(e===t)return!0;return Yg[e]?.includes(t)??!1}async function Qe(e,t){try{let r=await import("@stacksjs/events").catch(()=>null);if(!r)return;let n=r.dispatch;if(typeof n!=="function")return;n(e,t)}catch{}}async function Sr(e){await Qe("order:created",{order:e})}async function Ye(e,t){await Qe("order:paid",{order:e,payment:t})}async function ca(e){await Qe("order:shipped",{order:e})}async function Xg(e){await Qe("order:out_for_delivery",{order:e})}async function da(e){await Qe("order:delivered",{order:e})}async function Nt(e,t){await Qe("order:cancelled",{order:e,reason:t})}async function Ot(e,t){await Qe("order:refunded",{order:e,refundAmount:t})}async function dt(e,t){switch(e){case"PROCESSING":return Ye(t);case"SHIPPED":return ca(t);case"OUT_FOR_DELIVERY":return Xg(t);case"DELIVERED":return da(t);case"CANCELLED":return Nt(t);case"REFUNDED":return Ot(t);case"PENDING":default:}}var Yg;var Xe=wy(()=>{Yg={PENDING:["PROCESSING","CANCELLED"],PROCESSING:["SHIPPED","OUT_FOR_DELIVERY","CANCELLED","REFUNDED"],SHIPPED:["OUT_FOR_DELIVERY","DELIVERED","REFUNDED"],OUT_FOR_DELIVERY:["DELIVERED","SHIPPED","CANCELLED","REFUNDED"],DELIVERED:["REFUNDED"],CANCELLED:["PROCESSING"],REFUNDED:[]}});var ao={};E(ao,{DEFAULT_INCREMENT_LADDER:()=>xe,auctionChannel:()=>sr,auctionTotals:()=>Vn,biddersFor:()=>Nn,bids:()=>jn,bidsByBidder:()=>Mn,bidsForAuction:()=>In,bidsForItem:()=>Fn,broadcastBid:()=>$n,broadcastItemClosed:()=>Un,broadcastPledge:()=>Bn,closeAuction:()=>Qn,closeDueItems:()=>Zn,closeItem:()=>kt,closingSoon:()=>Xn,closingSoonNotification:()=>_y,currencyFor:()=>Jn,determineWinner:()=>at,effectiveCloseAt:()=>Oe,engine:()=>zn,extendedCloseAt:()=>Pt,fetchAuction:()=>pe,fetchAuctionForEvent:()=>qn,fetchCatalogue:()=>Gn,fetchItems:()=>Pe,fetchPledges:()=>no,incrementFor:()=>de,leadingBid:()=>Rt,lots:()=>eo,makePledge:()=>xs,nextMinimumBid:()=>Re,openAuction:()=>Kn,outbidNotification:()=>hy,placeBid:()=>Ln,pledgeLevels:()=>Rs,pledgeTotal:()=>ro,pledges:()=>oo,resolveBid:()=>vt,rulesFor:()=>Dt,settle:()=>St,settleAuction:()=>Yn,winnerNotification:()=>by});var jn={};E(jn,{biddersFor:()=>Nn,bidsByBidder:()=>Mn,bidsForAuction:()=>In,bidsForItem:()=>Fn,leadingBid:()=>Rt,placeBid:()=>Ln});var zn={};E(zn,{DEFAULT_INCREMENT_LADDER:()=>xe,determineWinner:()=>at,effectiveCloseAt:()=>Oe,extendedCloseAt:()=>Pt,incrementFor:()=>de,nextMinimumBid:()=>Re,resolveBid:()=>vt,settle:()=>St});var eo={};E(eo,{auctionTotals:()=>Vn,closeAuction:()=>Qn,closeDueItems:()=>Zn,closeItem:()=>kt,closingSoon:()=>Xn,fetchAuction:()=>pe,fetchAuctionForEvent:()=>qn,fetchCatalogue:()=>Gn,fetchItems:()=>Pe,openAuction:()=>Kn,settleAuction:()=>Yn});var oo={};E(oo,{fetchPledges:()=>no,makePledge:()=>xs,pledgeLevels:()=>Rs,pledgeTotal:()=>ro});var so={};E(so,{bulkDestroy:()=>Ds,bulkStore:()=>Fs,bulkUpdate:()=>Os,destroy:()=>vs,fetchAll:()=>Cs,fetchById:()=>ks,store:()=>Es,update:()=>Ns});var co={};E(co,{SIZES:()=>$s,categoryRank:()=>uo,compareCatalog:()=>vy,isLowStock:()=>Sy,matchesSearch:()=>Dy,sizeOf:()=>io});var wu={};E(wu,{ACCOUNT_CREDENTIAL_ENV:()=>wo,ACCOUNT_CREDENTIAL_HELP:()=>he,AdminCredentialError:()=>Tt,CATALOG_IMPORT_NAMESPACE:()=>eu,CatalogFetchError:()=>T,MAX_RETRIES:()=>yo,MissingCredentialsError:()=>ut,PriceFormatError:()=>I,SHOPIFY_ADMIN_API_VERSION:()=>oi,SHOPWARE_ACCESS_KEY_HELP:()=>bo,SKU_MAX:()=>Wo,UNKNOWN_COUNTRY:()=>cu,accountAdapter:()=>Pg,accountAdapters:()=>fu,addressLine:()=>je,adminRequest:()=>Ue,amountOrZero:()=>ze,catalogAdapter:()=>Rg,catalogAdapters:()=>pu,catalogUuid:()=>te,cleanName:()=>J,createDatabaseAccountRepository:()=>su,createDatabaseRepository:()=>mu,createMemoryAccountRepository:()=>fg,createMemoryRepository:()=>_g,createReadOnlyAccountRepository:()=>wg,createReadOnlyRepository:()=>xg,credentialSecrets:()=>Ge,currencyCode:()=>ie,currencyExponent:()=>U,customerRow:()=>wr,customerUuid:()=>Ke,decimalToMinor:()=>ee,decodeHtmlEntities:()=>qs,defaultSleep:()=>ei,detectShopifyCurrency:()=>Qs,detectShopwareCurrency:()=>gi,fetchJson:()=>fe,formatMinor:()=>ne,gmtTimestamp:()=>cr,importCatalog:()=>bg,importCustomers:()=>mg,importOrders:()=>pg,isoTimestamp:()=>we,lineLabel:()=>Oo,lowestPrice:()=>zo,mapShopifyCustomer:()=>ai,mapShopifyOrder:()=>ii,mapShopifyProduct:()=>Zs,mapShopwareCustomer:()=>Di,mapShopwareOrder:()=>Ci,mapShopwareProduct:()=>fi,mapWooCustomer:()=>Gi,mapWooOrder:()=>Vi,mapWooProduct:()=>Ui,minorToDecimal:()=>ve,missingAccessKeyMessage:()=>yi,nextPageInfo:()=>ui,normalizeEmail:()=>oe,normalizeStoreUrl:()=>V,numberToDecimalString:()=>zs,numberToMinor:()=>it,optionalString:()=>R,orderRow:()=>ou,personName:()=>H,phoneOf:()=>ye,productRow:()=>Lo,promotedCustomerUuid:()=>Bo,quantityOf:()=>qe,readAccountCredentials:()=>My,redactSecrets:()=>Ve,rescaleMinor:()=>st,retryAfterSeconds:()=>Bs,shopifyAccountAdapter:()=>go,shopifyAdapter:()=>po,shopifyAdminBase:()=>ci,shopifyOrderStatus:()=>si,shopwareAccessToken:()=>vo,shopwareAccountAdapter:()=>Do,shopwareAdapter:()=>xo,shopwareAdminBase:()=>Ti,shopwareBaseUrl:()=>wi,shopwareCustomerCriteria:()=>Ai,shopwareLineLabel:()=>ki,shopwareOrderCriteria:()=>Ei,shopwareOrderStatus:()=>Si,shopwareProductCriteria:()=>bi,shopwareVariantCriteria:()=>_i,signedMinor:()=>ge,storeHost:()=>Ct,totalInventory:()=>du,unitFromTotal:()=>fo,uuidV5:()=>tu,variantRow:()=>jo,variantSkus:()=>lu,wooAdminBase:()=>Hi,wooAuthorization:()=>Ki,wooCommerceAccountAdapter:()=>Fo,wooCommerceAdapter:()=>Ao,wooOrderStatus:()=>qi,wooPrices:()=>$i,wooSlug:()=>Bi});var js={};E(js,{PriceFormatError:()=>I,currencyExponent:()=>U,decimalToMinor:()=>ee,formatCurrency:()=>Us,formatMinor:()=>ne,minorToDecimal:()=>ve,minorToInput:()=>Js,minorToMajor:()=>lo,moneyInputError:()=>mo,moneyInputStep:()=>Ws,parseMoneyInput:()=>Ls,rescaleMinor:()=>st});var Go={};E(Go,{deleteCoupon:()=>yu,deleteCoupons:()=>gu,deleteExpiredCoupons:()=>hu,fetchActive:()=>Pu,fetchAll:()=>xu,fetchByCode:()=>Ru,fetchById:()=>Ze,fetchConversionRate:()=>Au,fetchCouponCounts:()=>Du,fetchCouponCountsByType:()=>Su,fetchRedemptionStats:()=>ku,fetchRedemptionTrend:()=>Tu,fetchStats:()=>vu,fetchTopRedeemedCoupons:()=>Cu,getActiveCouponsMoMChange:()=>Eu,redeem:()=>Uu,store:()=>Mu,update:()=>Bu});var Vo={};E(Vo,{bulkDestroy:()=>Lu,destroy:()=>Wu,fetchAll:()=>Qi,fetchById:()=>fr,store:()=>Xi,update:()=>zu});var Yo={};E(Yo,{bulkDestroy:()=>Vu,bulkStore:()=>sc,calculateErrorRate:()=>Qu,calculatePrinterHealth:()=>Xu,countAll:()=>Hu,countPrintsByDeviceId:()=>Zu,countTotalPrints:()=>Ku,destroy:()=>Gu,downloadPrintDevices:()=>rc,exportPrintDevices:()=>br,fetchAll:()=>hr,fetchById:()=>Se,fetchErrorsByDeviceId:()=>Yu,getPrinterStatusCounts:()=>ec,store:()=>ac,storePrintDevicesExport:()=>nc,update:()=>ic,updatePrintCount:()=>cc,updateStatus:()=>uc});var ta={};E(ta,{bulkDestroy:()=>lc,bulkUpdateStatus:()=>bc,destroy:()=>dc,destroyGroup:()=>mc,fetchAll:()=>xr,fetchByGroup:()=>wc,fetchById:()=>pc,fetchGrouped:()=>fc,fetchStats:()=>yc,fetchTimeline:()=>gc,ignoreGroup:()=>xc,resolveGroup:()=>_c,unresolveGroup:()=>Rc,update:()=>hc});var oa={};E(oa,{bulkDestroy:()=>Ic,calculateGiftCardValues:()=>Cc,checkBalance:()=>Sc,compareActiveGiftCards:()=>kc,deactivate:()=>Nc,destroy:()=>Fc,destroyExpired:()=>Mc,fetchActive:()=>vc,fetchAll:()=>Pc,fetchByCode:()=>ra,fetchById:()=>ke,fetchStats:()=>Dc,fetchTotalCurrentBalance:()=>Ac,fetchTotalValue:()=>Tc,store:()=>$c,update:()=>Lc,updateBalance:()=>jc});var xa={};E(xa,{bulkDestroy:()=>Vc,bulkSoftDelete:()=>Hc,calculateOrderMetrics:()=>ed,canTransition:()=>be,cleanupAbandonedCarts:()=>_d,compareOrdersByPeriod:()=>Xc,destroy:()=>qc,downloadOrders:()=>Kc,emitForStatus:()=>dt,emitOrderCancelled:()=>Nt,emitOrderCreated:()=>Sr,emitOrderDelivered:()=>da,emitOrderPaid:()=>Ye,emitOrderRefunded:()=>Ot,emitOrderShipped:()=>ca,exportOrders:()=>Dr,fetchAll:()=>ia,fetchById:()=>Ce,fetchDailyOrderTrends:()=>td,fetchRecent:()=>Qc,fetchStats:()=>Yc,findOrderByIdempotencyKey:()=>kr,handleCommercePaymentEvent:()=>ba,handlePaymentFailed:()=>ga,handlePaymentSucceeded:()=>ya,handleRefundSucceeded:()=>ha,placeOrder:()=>ud,receivePaymentWebhook:()=>wd,recomputeOrderTotals:()=>gd,softDelete:()=>Gc,store:()=>nd,storeOrdersExport:()=>Zc,transitionStatus:()=>$t,update:()=>ld,updateDeliveryInfo:()=>pd,updateStatus:()=>md,validateCartQuantities:()=>bd,validateCouponStacking:()=>hd,validateQuantityBounds:()=>_a});var Ra={};E(Ra,{bulkDestroy:()=>Pd,destroy:()=>Rd,fetchAll:()=>vd,fetchById:()=>et,fetchMonthlyPaymentTrends:()=>kd,fetchPaymentStats:()=>Dd,fetchPaymentStatsByMethod:()=>Sd,recordRefund:()=>Md,store:()=>Ad,update:()=>Id});var Ta={};E(Ta,{categories:()=>Fr,default:()=>Ih,items:()=>Ir,manufacturers:()=>Mr,reviews:()=>Nr,units:()=>Br,variants:()=>Ur});var Fr={};E(Fr,{bulkRemove:()=>qd,compareCategoryGrowth:()=>Wd,deactivate:()=>Vd,deactivateChildCategories:()=>Hd,fetchActive:()=>Od,fetchAll:()=>Pa,fetchByDisplayOrder:()=>Ud,fetchById:()=>Z,fetchByName:()=>Nd,fetchCategoryTree:()=>Ld,fetchChildCategories:()=>Bd,fetchRootCategories:()=>$d,fetchStats:()=>Jd,findOrCreateByName:()=>Zd,remove:()=>zd,removeChildCategories:()=>Gd,store:()=>va,update:()=>Qd,updateActiveStatus:()=>Xd,updateDisplayOrder:()=>Yd,updateParent:()=>el});var Ir={};E(Ir,{bulkDestroy:()=>ol,bulkStore:()=>ll,destroy:()=>nl,fetchAll:()=>al,fetchById:()=>Ae,fetchTopProducts:()=>il,store:()=>dl,update:()=>ml,updateAvailability:()=>pl,updateInventory:()=>fl});var Mr={};E(Mr,{bulkDestroy:()=>gl,bulkStore:()=>Cl,destroy:()=>yl,fetchAll:()=>hl,fetchByCountry:()=>Rl,fetchById:()=>bl,fetchByUuid:()=>_l,fetchFeatured:()=>xl,fetchWithProductCount:()=>Pl,store:()=>kl,update:()=>Al,updateByUuid:()=>Fl,updateFeaturedStatus:()=>El});var Nr={};E(Nr,{bulkDestroy:()=>Nl,destroy:()=>Ml,fetchAll:()=>$l,fetchApprovedByProductId:()=>Jl,fetchById:()=>Ol,fetchByProductId:()=>Bl,fetchByUserId:()=>Ul,fetchMostHelpfulByProductId:()=>Wl,fetchStats:()=>ql,fetchStatsByProductIds:()=>Gl,store:()=>Vl,update:()=>Zl,updateVotes:()=>Ql});var Br={};E(Br,{bulkDestroy:()=>em,bulkStore:()=>sm,bulkUpdate:()=>dm,destroy:()=>Xl,fetchAll:()=>nm,fetchById:()=>rm,formatUnitOptions:()=>im,getDefaultUnit:()=>um,store:()=>am,update:()=>cm,updateDefaultStatus:()=>lm});var Ur={};E(Ur,{bulkDestroy:()=>fm,bulkStore:()=>xm,bulkUpdate:()=>km,destroy:()=>pm,fetchAll:()=>gm,fetchById:()=>ym,formatVariantOptions:()=>Rm,generateVariantCombinations:()=>Pm,store:()=>_m,update:()=>Sm});var Fa={};E(Fa,{CENTS_FIELDS:()=>Mh,DEFAULT_FIELDS:()=>Fe,addToBasket:()=>Nh,basketCount:()=>Uh,basketLines:()=>Ea,basketTaxable:()=>Bh,basketTotal:()=>$h,canAdd:()=>Tm,groupsOf:()=>Wh,normalizeBasket:()=>Wr,setQuantity:()=>Oh,shelfLeft:()=>Aa,stockLabel:()=>Jh});var Ia={};E(Ia,{RELEASE_MODES:()=>Em,describeRollout:()=>qh,isReleaseMode:()=>Fm,releaseSchedule:()=>jh,rolloutFromProduct:()=>Lh,unlockAt:()=>Im,unlockedPrefix:()=>zh});var Ua={};E(Ua,{bulkDestroy:()=>Om,bulkStore:()=>qm,destroy:()=>Nm,fetchAll:()=>$m,fetchById:()=>pt,fetchPageStats:()=>Jm,fetchPrintJobStats:()=>Bm,fetchPrintTimeStats:()=>Wm,fetchPrintsPerHour:()=>Lm,fetchSuccessRate:()=>Um,store:()=>zm,update:()=>Gm,updatePrintJob:()=>Hm,updateStatus:()=>Vm});var ds={};E(ds,{couriers:()=>Yr,default:()=>gb,digital:()=>Zr,geocoding:()=>rn,licenses:()=>an,methods:()=>dn,rates:()=>wn,routes:()=>Hr,tracking:()=>Pn,zones:()=>kn});var Hr={};E(Hr,{DeliveryRouteInputError:()=>se,bulkDestroy:()=>Qm,destroy:()=>Zm,fetchActive:()=>Xm,fetchAll:()=>Ym,fetchByCourier:()=>ep,fetchById:()=>zr,store:()=>tp,update:()=>np,updateLastActive:()=>rp,updateMetrics:()=>ap,updateStops:()=>op,validateDeliveryRouteWrite:()=>ft});var Zr={};E(Zr,{bulkDestroy:()=>cp,bulkSoftDelete:()=>dp,bulkStore:()=>yp,destroy:()=>ip,fetchAll:()=>pp,fetchById:()=>mp,softDelete:()=>up,store:()=>wp,update:()=>gp,updateDeliverySettings:()=>bp,updateStatus:()=>hp});var Yr={};E(Yr,{bulkDestroy:()=>vp,bulkStore:()=>kp,destroy:()=>Pp,fetchAll:()=>xp,fetchById:()=>Qr,store:()=>Sp,update:()=>Cp,updateContact:()=>Ap,updateStatus:()=>Tp});var rn={};E(rn,{PRECISION_RANK:()=>Zt,checkCoverage:()=>rb,formatQuery:()=>wt,geocode:()=>tb,geocodingDriver:()=>Op,nominatimDriver:()=>tn,setGeocodingDriver:()=>eb});var an={};E(an,{LicenseKeyInputError:()=>q,bulkDestroy:()=>Jp,bulkSoftDelete:()=>Wp,bulkStore:()=>Kp,destroy:()=>Bp,fetchAll:()=>zp,fetchById:()=>jp,softDelete:()=>Up,store:()=>Hp,update:()=>Zp,updateExpiration:()=>Yp,updateStatus:()=>Qp,validateLicenseKeyWrite:()=>nt});var dn={};E(dn,{bulkDestroy:()=>rf,bulkSoftDelete:()=>nf,bulkStore:()=>uf,destroy:()=>ef,fetchAll:()=>of,fetchById:()=>cn,formatShippingOptions:()=>cf,getActiveShippingMethods:()=>df,softDelete:()=>tf,store:()=>sf,update:()=>lf,updatePricing:()=>pf,updateStatus:()=>mf});var wn={};E(wn,{ShippingRateInputError:()=>Y,bulkDestroy:()=>wf,bulkStore:()=>Ff,bulkUpdate:()=>Mf,destroy:()=>ff,destroyByMethod:()=>gf,destroyByZone:()=>yf,fetchAll:()=>_f,fetchById:()=>bf,formatShippingRateOptions:()=>vf,getRateByWeightAndAddress:()=>Rf,getRateByWeightAndZone:()=>es,getRatesByZone:()=>xf,getShippingRatesByMethod:()=>Df,resolveZoneForAddress:()=>mn,store:()=>Ef,update:()=>If,updateByMethod:()=>Of,updateByZone:()=>Nf,validateShippingRateWrite:()=>ot,validateZoneMatchesAddress:()=>Pf});var Pn={};E(Pn,{ARRIVAL_RADIUS_METERS:()=>as,NEARBY_RADIUS_METERS:()=>os,assignStop:()=>Bf,bearingInDegrees:()=>Xr,broadcastToChannel:()=>Me,completeStop:()=>Jf,distanceInMeters:()=>We,emitDeliveryArrived:()=>_n,emitDeliveryAssigned:()=>gn,emitDeliveryCompleted:()=>xn,emitDeliveryFailed:()=>Rn,emitDeliveryNearby:()=>bn,emitDeliveryPosition:()=>yn,emitDeliveryStarted:()=>hn,estimateSecondsRemaining:()=>en,failStop:()=>Wf,hasCoordinates:()=>Kt,isWithin:()=>Ep,orderTrackingChannel:()=>Le,recordCourierPing:()=>$f,routeTrackingChannel:()=>ns,startRoute:()=>Lf,startStop:()=>Uf});var kn={};E(kn,{bulkDestroy:()=>Vf,bulkSoftDelete:()=>Hf,bulkStore:()=>Qf,destroy:()=>qf,fetchAll:()=>Sf,fetchById:()=>pn,formatZoneOptions:()=>kf,getActiveShippingZones:()=>Cf,getZonesByCountry:()=>Tf,softDelete:()=>Gf,store:()=>Zf,update:()=>Yf,updateCountries:()=>ew,updateRegionsAndPostalCodes:()=>tw,updateStatus:()=>Xf});var ms={};E(ms,{activeTaxRates:()=>ls,breakdownFor:()=>gt,bulkDestroy:()=>sw,bulkStore:()=>pw,destroy:()=>aw,fetchAll:()=>cw,fetchById:()=>uw,store:()=>mw,taxFor:()=>nw,update:()=>fw,updateDefaultStatus:()=>gw,updateRate:()=>yw,updateStatus:()=>ww});var hs={};E(hs,{default:()=>Cb,products:()=>En,restaurant:()=>bt});var En={};E(En,{bulkDestroy:()=>bw,bulkStore:()=>Ow,destroy:()=>hw,fetchAll:()=>_w,fetchById:()=>rr,fetchCancelledBetweenDates:()=>kw,fetchConversionRates:()=>Aw,fetchCountBetweenDates:()=>Ew,fetchCountByAllQuantities:()=>vw,fetchCountByDate:()=>Rw,fetchCountByDateGrouped:()=>Fw,fetchCountByQuantity:()=>Pw,fetchCountBySource:()=>xw,fetchCountByStatus:()=>Tw,fetchNotifiedBetweenDates:()=>Dw,fetchPurchasedBetweenDates:()=>Sw,fetchWaiting:()=>Cw,store:()=>Nw,update:()=>An,updatePartySize:()=>Bw,updateStatus:()=>$w});var bt={};E(bt,{bulkDestroy:()=>Jw,bulkStore:()=>iy,destroy:()=>Uw,fetchAll:()=>Ww,fetchAverageWaitTimes:()=>Zw,fetchBetweenDates:()=>Gw,fetchById:()=>or,fetchConversionRates:()=>Kw,fetchCountByAllPartySizes:()=>qw,fetchCountByDate:()=>jw,fetchCountByPartySize:()=>zw,fetchCountByTablePreference:()=>Lw,fetchCurrentWaitTimes:()=>ry,fetchNoShowStats:()=>ty,fetchSeatedBetweenDates:()=>Vw,fetchSeatedStats:()=>ny,fetchSeatingRate:()=>ey,fetchTablesTurnedToday:()=>Xw,fetchTimeSeriesStats:()=>oy,fetchWaiting:()=>Hw,fetchWaitingWithPartySizes:()=>Yw,fetchWaitingWithQuotedTimes:()=>Qw,store:()=>sy,update:()=>ht,updatePartySize:()=>cy,updateQueuePosition:()=>ly,updateStatus:()=>uy,updateWaitTimes:()=>dy});import{db as xt}from"@stacksjs/database/runtime";async function Rt(e){return await xt.selectFrom("bids").selectAll().where("auction_item_id","=",e).where("status","=","leading").orderBy("amount","desc").executeTakeFirst()??null}async function Fn(e){return await xt.selectFrom("bids").selectAll().where("auction_item_id","=",e).orderBy("placed_at","desc").execute()??[]}async function In(e){return await xt.selectFrom("bids").selectAll().where("auction_id","=",e).orderBy("placed_at","asc").execute()??[]}async function Mn(e,t){return await xt.selectFrom("bids").selectAll().where("auction_id","=",e).where("bidder_email","=",t.toLowerCase()).orderBy("placed_at","desc").execute()??[]}async function Nn(e){let t=await xt.selectFrom("bids").select(["bidder_name","bidder_email"]).where("auction_id","=",e).execute(),r=new Map;for(let n of t??[]){let o=n.bidder_email.toLowerCase();if(!r.has(o))r.set(o,{name:n.bidder_name,email:n.bidder_email})}return[...r.values()]}var{randomUUIDv7:gy}=globalThis.Bun;import{db as Wn}from"@stacksjs/database/runtime";function Pt(e,t,r,n){if(r.antiSnipeMinutes<=0||r.extendOnBidWindowMinutes<=0)return null;if(e.extension_count>=r.maxExtensions)return null;let o=t.getTime()-n.getTime();if(o<=0)return null;if(o>r.extendOnBidWindowMinutes*60000)return null;let a=new Date(n.getTime()+r.antiSnipeMinutes*60000);return a>t?a:null}function Oe(e,t){return new Date(e.closes_at??t)}var xe=[{upTo:5000,step:200},{upTo:1e4,step:500},{upTo:25000,step:1000},{upTo:50000,step:2500},{upTo:1e5,step:5000},{upTo:250000,step:1e4},{upTo:null,step:25000}];function de(e,t=xe,r){if(r&&r>0)return r;for(let n of t)if(n.upTo===null||e<n.upTo)return n.step;return t[t.length-1]?.step??100}function Re(e,t,r=xe){if(t===null||t<=0)return e.starting_bid;return t+de(t,r,e.min_increment)}function vt(e,t,r,n=xe){let o=Math.max(r.amount,r.maxAmount??0),a=Re(e,t?t.amount:null,n);if(r.maxAmount!=null&&r.maxAmount<r.amount)return{accepted:!1,reason:"max_below_amount",message:"Your maximum bid has to be at least as much as your bid.",nextMinimumBid:a};if(o<a)return{accepted:!1,reason:"below_minimum",message:`The next bid on this lot is ${a/100}.`,nextMinimumBid:a};if(e.buy_now_price&&o>=e.buy_now_price)return{accepted:!0,buyNow:!0,leader:{bidderEmail:r.bidderEmail,bidderName:r.bidderName,amount:e.buy_now_price,maxAmount:e.buy_now_price,isChallenger:!0},challengerAmount:e.buy_now_price,outbid:t?{bidderEmail:t.bidder_email,bidderName:t.bidder_name,amount:t.amount}:void 0,nextMinimumBid:e.buy_now_price};if(!t){let d=Math.max(e.starting_bid,r.amount);return{accepted:!0,leader:{bidderEmail:r.bidderEmail,bidderName:r.bidderName,amount:d,maxAmount:r.maxAmount??null,isChallenger:!0},challengerAmount:d,nextMinimumBid:d+de(d,n,e.min_increment)}}let s=Math.max(t.amount,t.max_amount??0);if(t.bidder_email.toLowerCase()===r.bidderEmail.toLowerCase()){if(o<=s)return{accepted:!1,reason:"already_leading",message:"You are already the leading bidder at or above that amount.",nextMinimumBid:a};return{accepted:!0,leader:{bidderEmail:t.bidder_email,bidderName:t.bidder_name,amount:t.amount,maxAmount:o,isChallenger:!1},challengerAmount:t.amount,nextMinimumBid:t.amount+de(t.amount,n,e.min_increment)}}if(o>s){let d=s+de(s,n,e.min_increment),m=Math.min(o,Math.max(d,a));return{accepted:!0,leader:{bidderEmail:r.bidderEmail,bidderName:r.bidderName,amount:m,maxAmount:r.maxAmount??null,isChallenger:!0},challengerAmount:m,outbid:{bidderEmail:t.bidder_email,bidderName:t.bidder_name,amount:t.amount},nextMinimumBid:m+de(m,n,e.min_increment)}}let u=o+de(o,n,e.min_increment),c=Math.min(s,Math.max(u,o));return{accepted:!0,leader:{bidderEmail:t.bidder_email,bidderName:t.bidder_name,amount:c,maxAmount:t.max_amount??null,isChallenger:!1},challengerAmount:o,outbid:{bidderEmail:r.bidderEmail,bidderName:r.bidderName,amount:o},nextMinimumBid:c+de(c,n,e.min_increment)}}function sr(e){return`auction.${e}`}async function On(){try{let e=await import("@stacksjs/realtime");return e.emit??null}catch{return null}}async function $n(e){let t=await On();if(!t||!e.item||!e.leader)return;await t(sr(e.item.auction_id),"bid.placed",{itemId:e.item.id,lotNumber:e.item.lot_number,amount:e.leader.amount,nextMinimumBid:e.nextMinimumBid,leaderName:e.leader.bidderName,status:e.item.status,closesAt:e.item.closes_at,extended:Boolean(e.extendedTo),soldViaBuyNow:Boolean(e.buyNow)})}async function Bn(e,t){let r=await On();if(!r)return;await r(sr(e.auction_id),"pledge.made",{donorName:e.donor_name,amount:e.amount,level:e.level??null,runningTotal:t})}async function Un(e,t,r){let n=await On();if(!n)return;await n(sr(e),"item.closed",{itemId:t,...r})}import{config as yy}from"@stacksjs/config";function bs(){return yy.commerce??{}}function _s(){return bs().auction??{}}function Dt(e){let t=_s();return{increments:t.increments?.length?t.increments:xe,antiSnipeMinutes:e?.anti_snipe_minutes??t.antiSnipeMinutes??2,extendOnBidWindowMinutes:e?.extend_on_bid_window_minutes??t.extendOnBidWindowMinutes??2,maxExtensions:e?.max_extensions??t.maxExtensions??20}}function Jn(e){return e?.currency??_s().currency??bs().currency??"USD"}function ir(e){return e.toISOString().slice(0,19).replace("T"," ")}async function Ln(e){let t=e.now??new Date,r=await Wn.selectFrom("auction_items").selectAll().where("id","=",e.itemId).executeTakeFirst();if(!r)return{accepted:!1,reason:"item_not_found",message:"That lot is no longer available.",nextMinimumBid:0};let n=await Wn.selectFrom("auctions").selectAll().where("id","=",r.auction_id).executeTakeFirst(),o=Dt(n),a=await Rt(r.id),s=Re(r,a?.amount??null,o.increments);if(!n||n.status!=="open"||new Date(n.opens_at)>t)return{accepted:!1,reason:"auction_not_open",message:"Bidding is not open yet.",nextMinimumBid:s,item:r};let i=Oe(r,n.closes_at);if(r.status!=="open"||i<=t)return{accepted:!1,reason:"item_not_open",message:"Bidding on this lot has closed.",nextMinimumBid:s,item:r};let u=vt(r,a,{bidderEmail:e.bidderEmail,bidderName:e.bidderName,amount:e.amount,maxAmount:e.maxAmount},o.increments);if(!u.accepted)return{...u,item:r};let c=u.buyNow?null:Pt(r,i,o,t),d=u.leader&&!u.leader.isChallenger&&a&&a.bidder_email.toLowerCase()===e.bidderEmail.toLowerCase(),m=await Wn.transaction(async(y)=>{if(d&&a)return await y.updateTable("bids").set({max_amount:u.leader.maxAmount}).where("id","=",a.id).execute(),{...a,max_amount:u.leader.maxAmount};let g=u.leader?.isChallenger===!0,p=gy();if(await y.insertInto("bids").values({uuid:p,auction_id:r.auction_id,auction_item_id:r.id,bidder_name:e.bidderName,bidder_email:e.bidderEmail.toLowerCase(),amount:u.challengerAmount??e.amount,max_amount:e.maxAmount??null,status:g?"leading":"outbid",placed_at:ir(t)}).execute(),a){if(g)await y.updateTable("bids").set({status:"outbid"}).where("id","=",a.id).execute();else if(u.leader&&u.leader.amount!==a.amount)await y.updateTable("bids").set({amount:u.leader.amount}).where("id","=",a.id).execute()}if(u.buyNow)await y.updateTable("auction_items").set({status:"sold",closes_at:ir(t)}).where("id","=",r.id).execute();else if(c)await y.updateTable("auction_items").set({closes_at:ir(c),extension_count:r.extension_count+1}).where("id","=",r.id).execute();return await y.selectFrom("bids").selectAll().where("uuid","=",p).executeTakeFirst()}),l={...u,bid:m,item:{...r,status:u.buyNow?"sold":r.status,closes_at:c?ir(c):r.closes_at,extension_count:c?r.extension_count+1:r.extension_count},extendedTo:c??void 0};return await $n(l).catch(()=>{return}),l}function at(e,t){let r=t.filter((a)=>a.status!=="invalid");if(r.length===0)return{itemId:e.id,lotNumber:e.lot_number,title:e.title,status:"passed",amount:0,passedReason:"no_bids"};let o=[...r].sort((a,s)=>{if(s.amount!==a.amount)return s.amount-a.amount;return new Date(a.placed_at).getTime()-new Date(s.placed_at).getTime()})[0];if(e.reserve_price&&o.amount<e.reserve_price)return{itemId:e.id,lotNumber:e.lot_number,title:e.title,status:"passed",amount:o.amount,passedReason:"reserve_not_met"};return{itemId:e.id,lotNumber:e.lot_number,title:e.title,status:"sold",winningBidId:o.id,winnerName:o.bidder_name,winnerEmail:o.bidder_email,amount:o.amount}}function St(e,t,r,n){let o=t.filter((m)=>m.status==="sold"),a=t.filter((m)=>m.status==="passed"),s=o.reduce((m,l)=>m+l.amount,0),i=r.filter((m)=>m.status==="confirmed").reduce((m,l)=>m+l.amount,0),u=new Map(e.map((m)=>[m.id,m.fair_market_value??null])),c=o.reduce((m,l)=>{let y=u.get(l.itemId);return y==null?m:m+(l.amount-y)},0),d=t.length;return{auctionId:n.auctionId,currency:n.currency,totalRaised:s+i,bidRevenue:s,pledgeRevenue:i,goalAmount:n.goalAmount??null,itemsSold:o.length,itemsPassed:a.length,sellThrough:d===0?0:o.length/d,valueDelta:c,outcomes:t}}import{db as $e}from"@stacksjs/database/runtime";async function pe(e){return await $e.selectFrom("auctions").selectAll().where("id","=",e).executeTakeFirst()??null}async function qn(e){return await $e.selectFrom("auctions").selectAll().where("event_id","=",e).executeTakeFirst()??null}async function Pe(e){return await $e.selectFrom("auction_items").selectAll().where("auction_id","=",e).orderBy("lot_number","asc").execute()??[]}async function Gn(e){let[t,r]=await Promise.all([pe(e),Pe(e)]),n=Dt(t),o=await $e.selectFrom("bids").select(["auction_item_id","amount","bidder_name"]).where("auction_id","=",e).where("status","in",["leading","won"]).execute(),a=await $e.selectFrom("bids").select(["auction_item_id"]).where("auction_id","=",e).where("status","!=","invalid").execute(),s=new Map((o??[]).map((u)=>[u.auction_item_id,u])),i=new Map;for(let u of a??[])i.set(u.auction_item_id,(i.get(u.auction_item_id)??0)+1);return r.map((u)=>{let c=s.get(u.id)??null;return{...u,currentBid:c?.amount??0,bidCount:i.get(u.id)??0,nextMinimumBid:Re(u,c?.amount??null,n.increments),leaderName:c?.bidder_name??null}})}async function Vn(e){let t=await pe(e),r=await $e.selectFrom("bids").select(["auction_item_id","amount","bidder_email","status"]).where("auction_id","=",e).where("status","!=","invalid").execute(),n=await $e.selectFrom("pledges").select(["amount"]).where("auction_id","=",e).where("status","=","confirmed").execute(),o=r??[],s=o.filter((c)=>c.status==="leading"||c.status==="won").reduce((c,d)=>c+d.amount,0),i=(n??[]).reduce((c,d)=>c+d.amount,0),u=await $e.selectFrom("auction_items").where("auction_id","=",e).count();return{currentBidTotal:s,pledgeTotal:i,raised:s+i,goalAmount:t?.goal_amount??null,bidCount:o.length,bidderCount:new Set(o.map((c)=>c.bidder_email.toLowerCase())).size,lotsOffered:Number(u??0),lotsWithBids:new Set(o.map((c)=>c.auction_item_id)).size}}import{db as Be}from"@stacksjs/database/runtime";function Hn(e){return e.toISOString().slice(0,19).replace("T"," ")}async function Kn(e,t=new Date){return await Be.updateTable("auctions").set({status:"open",opens_at:Hn(t)}).where("id","=",e).execute(),await Be.updateTable("auction_items").set({status:"open"}).where("auction_id","=",e).where("status","=","closed").execute(),pe(e)}async function kt(e,t=new Date){if(e.status==="sold"||e.status==="passed")return null;let r=await Be.selectFrom("bids").selectAll().where("auction_item_id","=",e.id).execute(),n=at(e,r??[]);return await Be.transaction(async(o)=>{if(await o.updateTable("auction_items").set({status:n.status,closes_at:Hn(t)}).where("id","=",e.id).execute(),n.winningBidId)await o.updateTable("bids").set({status:"won"}).where("id","=",n.winningBidId).execute();await o.updateTable("bids").set({status:"lost"}).where("auction_item_id","=",e.id).where("status","in",["leading","outbid"]).execute()}),await Un(e.auction_id,e.id,{status:n.status,amount:n.amount,winnerName:n.winnerName}).catch(()=>{return}),n}async function Zn(e,t=new Date){let r=await pe(e);if(!r)return[];let n=await Pe(e),o=[];for(let a of n){if(a.status!=="open")continue;if(Oe(a,r.closes_at)>t)continue;let s=await kt(a,t);if(s)o.push(s)}return o}async function Qn(e,t=new Date){let r=await Pe(e),n=[];for(let o of r){let a=await kt(o,t);if(a)n.push(a)}return await Be.updateTable("auctions").set({status:"closed",closes_at:Hn(t)}).where("id","=",e).execute(),n}async function Yn(e,t={}){let r=await pe(e);if(!r)return null;let n=await Pe(e),o=await Be.selectFrom("bids").selectAll().where("auction_id","=",e).execute(),a=await Be.selectFrom("pledges").selectAll().where("auction_id","=",e).execute(),s=new Map;for(let u of o??[]){let c=s.get(u.auction_item_id)??[];c.push(u),s.set(u.auction_item_id,c)}let i=n.map((u)=>{let c=at(u,s.get(u.id)??[]);return u.status==="passed"?{...c,status:"passed"}:c});if(t.markSettled)await Be.updateTable("auctions").set({status:"settled"}).where("id","=",e).execute();return St(n,i,a??[],{auctionId:e,currency:Jn(r),goalAmount:r.goal_amount??null})}async function Xn(e,t,r=new Date){let n=await pe(e);if(!n)return[];let o=new Date(r.getTime()+t*60000);return(await Pe(e)).filter((a)=>{if(a.status!=="open")return!1;let s=Oe(a,n.closes_at);return s>r&&s<=o})}function to(e,t="USD"){return new Intl.NumberFormat("en-US",{style:"currency",currency:t,minimumFractionDigits:0}).format(e/100)}function hy(e,t="USD"){if(!e.outbid||!e.item)return null;let r=e.item;return{to:{name:e.outbid.bidderName,email:e.outbid.bidderEmail},type:"outbid",subject:`You have been outbid on lot ${r.lot_number}: ${r.title}`,body:`Someone has bid higher on "${r.title}". The next bid is ${to(e.nextMinimumBid,t)}. Bidding closes ${new Date(r.closes_at??"").toLocaleString()}.`,data:{itemId:r.id,lotNumber:r.lot_number,title:r.title,nextMinimumBid:e.nextMinimumBid,closesAt:r.closes_at}}}function by(e,t="USD"){if(e.status!=="sold"||!e.winnerEmail)return null;return{to:{name:e.winnerName??"Bidder",email:e.winnerEmail},type:"winner",subject:`You won lot ${e.lotNumber}: ${e.title}`,body:`Congratulations - you won "${e.title}" at ${to(e.amount,t)}. The school will be in touch with payment and pickup details.`,data:{itemId:e.itemId,lotNumber:e.lotNumber,title:e.title,amount:e.amount}}}function _y(e,t,r,n="USD"){return{to:t,type:"closing_soon",subject:`Closing soon: lot ${e.lot_number}, ${e.title}`,body:`"${e.title}" closes at ${new Date(e.closes_at??"").toLocaleString()}. The current bid is ${to(r,n)}.`,data:{itemId:e.id,lotNumber:e.lot_number,title:e.title,currentBid:r,closesAt:e.closes_at}}}var{randomUUIDv7:xy}=globalThis.Bun;import{db as ur}from"@stacksjs/database/runtime";async function xs(e){let t=xy();await ur.insertInto("pledges").values({uuid:t,auction_id:e.auctionId,donor_name:e.donorName,donor_email:e.donorEmail.toLowerCase(),amount:e.amount,level:e.level??null,status:e.status??"confirmed"}).execute();let r=await ur.selectFrom("pledges").selectAll().where("uuid","=",t).executeTakeFirst();return await Bn(r,await ro(e.auctionId)).catch(()=>{return}),r}async function ro(e){return(await ur.selectFrom("pledges").select(["amount"]).where("auction_id","=",e).where("status","=","confirmed").execute()??[]).reduce((r,n)=>r+n.amount,0)}async function no(e){return await ur.selectFrom("pledges").selectAll().where("auction_id","=",e).orderBy("amount","desc").execute()??[]}async function Rs(e){let t=(await no(e)).filter((n)=>n.status==="confirmed"),r=new Map;for(let n of t){let o=n.level??"other",a=r.get(o)??{amount:0,count:0};a.amount+=n.amount,a.count+=1,r.set(o,a)}return[...r.entries()].map(([n,o])=>({level:n,...o})).sort((n,o)=>o.amount-n.amount)}import{db as Ps}from"@stacksjs/database/runtime";import{mutationCount as _}from"@stacksjs/database/runtime";async function vs(e){try{let t=await Ps.deleteFrom("carts").where("id","=",e).executeTakeFirst();return _(t)>0}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete cart: ${t.message}`);throw t}}async function Ds(e){if(!e.length)return 0;try{let t=await Ps.deleteFrom("carts").where("id","in",e).executeTakeFirst();return _(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete carts: ${t.message}`);throw t}}import{db as Ss}from"@stacksjs/database/runtime";function Ry(e){return e.replace(/_([a-z0-9])/g,(t,r)=>r.toUpperCase())}function w(e){if(e===null||typeof e!=="object")return e;let t={...e};for(let[r,n]of Object.entries(t)){if(!r.includes("_"))continue;let o=Ry(r);if(!(o in t))t[o]=n}return t}function P(e){return e.map((t)=>w(t))}async function ks(e){let t=await Ss.selectFrom("carts").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function Cs(){return P(await Ss.selectFrom("carts").selectAll().execute())}var{randomUUIDv7:Ts}=globalThis.Bun;import{db as As}from"@stacksjs/database/runtime";async function Es(e){try{let t={...e,uuid:Ts()},r=await As.insertInto("carts").values(t).returningAll().executeTakeFirst();if(!r)throw Error("Failed to create cart");return w(r)}catch(t){if(t instanceof Error)throw TypeError(`Failed to create cart: ${t.message}`);throw t}}async function Fs(e){if(!e.length)return 0;let t=0;try{return await As.transaction(async(r)=>{for(let n of e){let o={...n,uuid:Ts()};await r.insertInto("carts").values(o).execute(),t++}}),t}catch(r){if(r instanceof Error)throw TypeError(`Failed to create carts in bulk: ${r.message}`);throw r}}import{db as Is,matchedRows as Py}from"@stacksjs/database/runtime";import{formatDate as Ms}from"@stacksjs/orm";async function Ns(e,t){try{let r=await Is.updateTable("carts").set({...t,updated_at:Ms(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!r)throw Error("Failed to update cart");return w(r)}catch(r){if(r instanceof Error)throw TypeError(`Failed to update cart: ${r.message}`);throw r}}async function Os(e){if(!e.length)return 0;let t=0;try{return await Is.transaction(async(r)=>{for(let n of e){if(!n.id)continue;if((await Py(r.updateTable("carts").set({...n,updated_at:Ms(new Date)}).where("id","=",n.id))).length>0)t++}}),t}catch(r){if(r instanceof Error)throw TypeError(`Failed to update carts in bulk: ${r.message}`);throw r}}var $s=["XXS","XS","S","M","L","XL","XXL","2XL","3XL","4XL"];function io(e){let t=/^(.*?)\s*[\u2014\u2013\-/]\s*(XXS|XS|S|M|L|XL|XXL|2XL|3XL|4XL)$/i.exec(String(e).trim());if(!t)return{base:String(e).trim(),size:null,rank:-1};let r=t[2].toUpperCase();return{base:t[1],size:r,rank:$s.indexOf(r)}}function uo(e,t=[]){let r=t.indexOf(String(e||""));if(r!==-1)return r;return e?t.length:t.length+1}function vy(e=[]){return(t,r)=>{let n=uo(t.category,e)-uo(r.category,e)||String(t.category||"").localeCompare(String(r.category||""));if(n)return n;let o=io(String(t.name||"")),a=io(String(r.name||""));return o.base.localeCompare(a.base)||o.rank-a.rank}}function Dy(e,t){let r=String(t||"").toLowerCase().split(/\s+/).filter(Boolean);if(!r.length)return!0;let n=e.map((o)=>String(o??"")).join(" ").toLowerCase();return r.every((o)=>n.includes(o))}function Sy(e,t,r=5){if(e===null||e===void 0)return!1;return Number(e)<=(t===null||t===void 0?r:Number(t))}import{slug as Gs}from"@stacksjs/strings";class T extends Error{url;status;body;retryAfter;constructor(e,t,r,n,o){super(t);this.url=e;this.status=r;this.body=n;this.retryAfter=o;this.name="CatalogFetchError"}}var ky=2000,Cy=30000;function V(e){let t=e.trim();if(!t)throw TypeError("A store URL is required, e.g. https://shop.example.com");let r=/^[a-z][a-z0-9+.-]*:\/\//i.test(t)?t:`https://${t}`,n;try{n=new URL(r)}catch{throw TypeError(`"${e}" is not a valid store URL`)}if(n.protocol!=="https:"&&n.protocol!=="http:")throw TypeError(`"${e}" must be an http(s) URL`);let o=n.pathname.replace(/\/+$/,"");return`${n.protocol}//${n.host.toLowerCase()}${o}`}function Ct(e){return new URL(e).host.toLowerCase()}function Bs(e,t=Date.now){let r=e?.trim();if(!r)return;if(/^\d+(?:\.\d+)?$/.test(r))return Number(r);let n=Date.parse(r);return Number.isNaN(n)?void 0:Math.max(0,(n-t())/1000)}async function fe(e,t=fetch,r="",n={}){let o=r?` ${r}`:"",a={accept:"application/json",...n.headers};if(n.json!==void 0)a["content-type"]="application/json";let s;try{s=await t(e,{method:n.method??(n.json!==void 0?"POST":"GET"),headers:a,...n.json!==void 0?{body:JSON.stringify(n.json)}:{},signal:AbortSignal.timeout(Cy)})}catch(u){let c=u instanceof Error?u.message:String(u);throw new T(e,`Could not reach ${e}: ${c}.${o}`)}if(!s.ok){let u=`${s.status}${s.statusText?` ${s.statusText}`:""}`,c=await s.text().catch(()=>"");throw new T(e,`${e} responded ${u}.${o}`,s.status,c?c.slice(0,ky):void 0,Bs(s.headers.get("retry-after")))}let i=await s.text();try{return{data:JSON.parse(i),headers:s.headers}}catch{let u=s.headers.get("content-type")||"no content-type";throw new T(e,`${e} did not return JSON (${u}).${o}`,s.status)}}class I extends Error{value;constructor(e,t){super(`Unreadable price ${JSON.stringify(e)}: ${t}`);this.value=e;this.name="PriceFormatError"}}function U(e){if(!e)return 2;try{let t=new Intl.NumberFormat("en",{style:"currency",currency:e}).resolvedOptions().maximumFractionDigits;return typeof t==="number"?t:2}catch{return 2}}function ee(e,t=2){if(e===null||e===void 0)return null;let r=String(e).trim();if(r==="")return null;let n=/^(\d*)(?:\.(\d*))?$/.exec(r);if(!n||!/\d/.test(r))throw new I(e,"expected a plain decimal such as 19.99");let o=n[1]||"0",a=n[2]??"",s;if(a.length<=t)s=BigInt(o+a.padEnd(t,"0"));else if(s=BigInt(o+a.slice(0,t)),a.charCodeAt(t)>=53)s+=1n;if(s>BigInt(Number.MAX_SAFE_INTEGER))throw new I(e,"too large to store exactly");return Number(s)}function ve(e,t=2){let r=String(e).trim();if(!/^\d+$/.test(r))throw new I(e,"expected a non-negative integer amount in minor units");if(t===0)return r.replace(/^0+(?=\d)/,"");let n=r.padStart(t+1,"0");return`${n.slice(0,-t).replace(/^0+(?=\d)/,"")}.${n.slice(-t)}`}function st(e,t,r){if(e===null||e===void 0||String(e).trim()==="")return null;if(!Number.isInteger(t)||t<0)throw new I(e,`invalid source precision ${t}`);return ee(ve(String(e),t),r)}function ne(e,t){let r=U(t),n=Math.round(Number(e)),o=Number.isSafeInteger(n)?`${n<0?"-":""}${ve(Math.abs(n),r)}`:String(e);return t?`${o} ${t}`:o}function lo(e,t){let r=Math.round(Number(e??0));if(!Number.isFinite(r))return 0;let n=ve(Math.abs(r),U(t));return r<0?-Number(n):Number(n)}function Us(e,t,r){let n=(t||"USD").toUpperCase(),o=lo(e,n);try{return new Intl.NumberFormat(r,{style:"currency",currency:n}).format(o)}catch{return ne(Math.round(Number(e??0))||0,n)}}function Js(e,t){if(e===null||e===void 0||e==="")return"";let r=Math.round(Number(e));if(!Number.isFinite(r))return"";let n=ve(Math.abs(r),U(t));return r<0?`-${n}`:n}function Ws(e){let t=U(e);return t===0?"1":`0.${"1".padStart(t,"0")}`}function mo(e,t,r={}){let n=e===null||e===void 0?"":String(e).trim(),o=U(t),a=(t||"USD").toUpperCase();if(n==="")return r.required===!1?"":"Enter an amount.";let s=/^(\d*)(?:\.(\d*))?$/.exec(n);if(!s||!/\d/.test(n))return o===0?"Enter a whole number, for example 1999.":`Enter a plain amount, for example ${ve(1999,o)}.`;if((s[2]??"").length>o)return o===0?`${a} amounts have no decimal places.`:`${a} amounts have at most ${o} decimal ${o===1?"place":"places"}.`;let u;try{u=ee(n,o)}catch{return"That amount is too large."}if(u===null)return"Enter an amount.";if(r.min!==void 0&&u<r.min)return`Enter at least ${ne(r.min,a)}.`;if(r.max!==void 0&&u>r.max)return`Enter at most ${ne(r.max,a)}.`;return""}function Ls(e,t,r={}){let n=mo(e,t,r);if(n)throw new I(e,n);return ee(e,U(t))}function zs(e){if(typeof e!=="number"||!Number.isFinite(e))throw new I(e,"expected a finite number");if(e<0)throw new I(e,"expected an amount of zero or more");let t=String(e),r=/^(\d+)(?:\.(\d+))?e([+-]\d+)$/.exec(t);if(!r)return t;let[,n,o="",a]=r,s=`${n}${o}`,i=n.length+Number(a);if(i<=0)return`0.${"0".repeat(-i)}${s}`;if(i>=s.length)return`${s}${"0".repeat(i-s.length)}`;return`${s.slice(0,i)}.${s.slice(i)}`}function it(e,t=2){if(e===null||e===void 0)return null;if(typeof e==="string")return ee(e,t);return ee(zs(e),t)}var Ty={amp:"&",lt:"<",gt:">",quot:'"',apos:"'",nbsp:"\xA0",ndash:"\u2013",mdash:"\u2014",hellip:"\u2026",lsquo:"\u2018",rsquo:"\u2019",ldquo:"\u201C",rdquo:"\u201D",laquo:"\xAB",raquo:"\xBB",trade:"\u2122",reg:"\xAE",copy:"\xA9",deg:"\xB0",times:"\xD7",frac12:"\xBD",euro:"\u20AC",pound:"\xA3",yen:"\xA5",cent:"\xA2"};function qs(e){return e.replace(/&(#x[0-9a-f]+|#\d+|[a-z][a-z0-9]*);/gi,(t,r)=>{if(r[0]==="#"){let n=r[1]==="x"||r[1]==="X"?Number.parseInt(r.slice(2),16):Number.parseInt(r.slice(1),10);return Number.isInteger(n)&&n>0&&n<=1114111?String.fromCodePoint(n):t}return Ty[r.toLowerCase()]??t})}function J(e){if(typeof e!=="string")return"";return qs(e).replace(/\s+/g," ").trim()}function R(e){if(typeof e!=="string")return null;let t=e.trim();return t===""?null:t}var Vs=250,Hs=400;function Ay(e){if(!e||e.length===0)return!0;if(e.length!==1)return!1;let[t]=e;return t?.name==="Title"&&(t.values?.length??0)<=1&&(t.values?.[0]??"Default Title")==="Default Title"}function Ey(e){return(Array.isArray(e)?e:typeof e==="string"?e.split(","):[]).map((r)=>String(r).trim()).filter(Boolean)}function Ks(e,t,r,n,o){try{return ee(e,t)}catch(a){if(!(a instanceof I))throw a;return o.push({externalId:n,message:`${r}: ${a.message}; left unpriced`}),null}}function Zs(e,t){if(e?.id===void 0||e.id===null||e.id==="")throw TypeError("Shopify product has no id");let r=String(e.id),n=[],o=(R(e.title)??"").replace(/\s+/g," ");if(!o)throw TypeError(`Shopify product ${r} has no title`);let a=R(e.handle)??Gs(o),s=U(t.currency),i=!Ay(e.options),u=i?(e.options??[]).map((l)=>R(l.name)??"").filter(Boolean):[],c=(e.variants??[]).map((l)=>{let y=String(l.id),g=Ks(l.compare_at_price,s,`variant ${y} compare-at price`,r,n);return{externalId:y,title:R(l.title)??o,sku:R(l.sku),priceMinor:Ks(l.price,s,`variant ${y} price`,r,n),compareAtMinor:g?g:null,available:l.available!==!1,inventory:typeof l.inventory_quantity==="number"?Math.max(0,Math.trunc(l.inventory_quantity)):null,optionValues:i?[l.option1,l.option2,l.option3].slice(0,u.length).map((p)=>R(p)??""):[]}});if(c.length===0)n.push({externalId:r,message:`"${o}" has no variants; imported without a price`});let d=[...e.images??[]].filter((l)=>R(l?.src)).sort((l,y)=>(l.position??0)-(y.position??0)).map((l)=>({src:R(l.src),alt:R(l.alt)})),m=R(e.product_type);return{product:{source:"shopify",externalId:r,name:o,handle:a,descriptionHtml:R(e.body_html),vendor:R(e.vendor),categories:m?[{name:m,slug:Gs(m)}]:[],tags:Ey(e.tags),currency:t.currency,images:d,optionNames:u,variants:c,hasOptions:i,url:`${t.storeUrl}/products/${a}`},warnings:n}}async function Qs(e,t=fetch){try{let{data:r}=await fe(`${e}/meta.json`,t),n=typeof r?.currency==="string"?r.currency.trim().toUpperCase():"";return/^[A-Z]{3}$/.test(n)?n:null}catch{return null}}async function*Fy(e,t={}){let r=V(e),n=t.fetch??fetch,o=t.limit,a=o&&o>0?Math.min(Vs,o):Vs,s=[],i=t.currency?.toUpperCase()??null;if(!i){if(i=await Qs(r,n),!i)s.push({message:`${r}/meta.json did not report a currency; prices read as 2-decimal amounts. Pass --currency to be sure.`})}let u=new Set,c=0;for(let d=1;d<=Hs;d++){let m=`${r}/products.json?limit=${a}&page=${d}`,{data:l}=await fe(m,n,"Is this a Shopify storefront, and is it public (no storefront password)?");if(!Array.isArray(l?.products))throw new T(m,`${m} did not return a "products" list. Is this a Shopify storefront?`);let y=l.products;if(y.length===0)return;let g=y.map((h)=>String(h?.id));if(d>1&&g.every((h)=>u.has(h)))throw new T(m,`${m} repeated products from an earlier page; the store is not paginating. Use --limit to import the first page only.`);g.forEach((h)=>u.add(h));let p=[],b=d===1?s:[];for(let h of y){if(o&&c>=o)break;try{let f=Zs(h,{storeUrl:r,currency:i});p.push(f.product),b.push(...f.warnings),c++}catch(f){b.push({externalId:h?.id===void 0?void 0:String(h.id),message:`skipped: ${f.message}`})}}if(yield{url:m,products:p,warnings:b},o&&c>=o)return}throw new T(r,`Stopped after ${Hs} pages of ${r}/products.json without reaching the end.`)}var po={name:"shopify",pages:Fy};var Iy=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;function oe(e){if(typeof e!=="string")return null;let t=e.trim().toLowerCase();return Iy.test(t)?t:null}function we(e){if(typeof e!=="string"||e.trim()==="")return null;let t=new Date(e.trim());return Number.isNaN(t.getTime())?null:t.toISOString()}function cr(e){if(typeof e!=="string"||e.trim()==="")return null;let t=e.trim();return we(/(?:Z|[+-]\d{2}:?\d{2})$/i.test(t)?t:`${t}Z`)}function H(...e){let t=e.map((r)=>J(r)).filter(Boolean).join(" ");return t===""?null:t}function ye(...e){for(let t of e){let r=R(typeof t==="number"?String(t):t);if(r)return r.slice(0,50)}return null}function je(...e){let t=e.map((r)=>J(r)).filter(Boolean).join(", ");return t===""?null:t}function ge(e,t){if(e===null||e===void 0||e==="")return null;if(typeof e==="number"){if(!Number.isFinite(e))throw new I(e,"expected a finite number");let a=it(Math.abs(e),t);return e<0?-a:a}if(typeof e!=="string")throw new I(e,"expected a decimal amount");let r=e.trim(),n=r.startsWith("-"),o=ee(n||r.startsWith("+")?r.slice(1):r,t);if(o===null)return null;return n?-o:o}function ze(e,t,r,n,o,a=0){let s;try{s=ge(e,t)}catch(i){if(!(i instanceof I))throw i;return o.push({externalId:n,message:`${r}: ${i.message}; recorded as ${a}`}),a}if(s===null)return a;if(s<0)return o.push({externalId:n,message:`${r} is negative (${String(e)}); recorded as ${a}`}),a;return s}function fo(e,t){if(t<=1)return e;return Math.floor((2*e+t)/(2*t))}function qe(e){let t=typeof e==="string"?Number(e):e;return typeof t==="number"&&Number.isInteger(t)&&t>0?t:null}function ie(e){let t=typeof e==="string"?e.trim().toUpperCase():"";return/^[A-Z]{3}$/.test(t)?t:null}var wo={shopify:["SHOPIFY_ADMIN_TOKEN"],woocommerce:["WOOCOMMERCE_CONSUMER_KEY","WOOCOMMERCE_CONSUMER_SECRET"],shopware:["SHOPWARE_CLIENT_ID","SHOPWARE_CLIENT_SECRET"]},he={shopify:"Create a custom app for the store (Shopify admin > Settings > Apps > Develop apps, or the Shopify Dev Dashboard), give it the Admin API scopes read_customers and read_orders (plus read_all_orders for orders older than 60 days), install it, and copy its Admin API access token (shpat_...).",woocommerce:"Create a key in WordPress admin > WooCommerce > Settings > Advanced > REST API > Add key, with Read permission, for a user who can manage WooCommerce. The key starts with ck_ and the secret with cs_.",shopware:"Create an integration in the Shopware Administration > Settings > System > Integrations, with a role that can read customers and orders. Its access key id (SWIA...) is the client id and its secret access key is the client secret."};class ut extends Error{constructor(e){super(e);this.name="MissingCredentialsError"}}function Ys(e,t){let r=e[t]?.trim();return r?r:void 0}function My(e,t){let r=e.trim().toLowerCase(),n=wo[r];if(!n)throw new ut(`Customers and orders can be imported from ${Object.keys(wo).join(", ")}; got "${e}".`);let o=n.filter((s)=>!Ys(t,s));if(o.length>0){let s=o.length===1?`${o[0]} is not set`:`${o.join(" and ")} are not set`;throw new ut(`Importing customers or orders from ${r} needs Admin API credentials in the environment: ${s}. They are read from env (or .env) only, never from a flag, so they stay out of shell history. ${he[r]}`)}let a=n.map((s)=>Ys(t,s));for(let[s,i]of a.entries())if(/\s/.test(i))throw new ut(`${n[s]} contains whitespace; paste the credential exactly as issued. ${he[r]}`);if(r==="shopify")return{source:"shopify",accessToken:a[0]};if(r==="woocommerce")return{source:"woocommerce",consumerKey:a[0],consumerSecret:a[1]};if(/^SWSC/i.test(a[0]))throw new ut(`SHOPWARE_CLIENT_ID looks like a sales channel access key (SWSC...), which only reads the public catalog. ${he.shopware}`);return{source:"shopware",clientId:a[0],clientSecret:a[1]}}function Ge(e){switch(e.source){case"shopify":return[e.accessToken];case"woocommerce":return[e.consumerKey,e.consumerSecret];case"shopware":return[e.clientId,e.clientSecret]}}function Ve(e,t){let r=e;for(let n of t)if(n.length>=4)r=r.split(n).join("[redacted]");return r}var yo=5,Ny=2,Oy=60,ei=(e)=>new Promise((t)=>setTimeout(t,e));class Tt extends T{constructor(e,t,r){super(e,t,r);this.name="AdminCredentialError"}}function Xs(e,t,r=""){let n=Ve(`${e.message}${r}`,t),o=e.body===void 0?void 0:Ve(e.body,t);return new T(Ve(e.url,t),n,e.status,o,e.retryAfter)}async function Ue(e,t){let{fetch:r,secrets:n,credentialHelp:o,hint:a="",sleep:s,...i}=t,u=s??ei;for(let c=0;;c++)try{return await fe(e,r,"",i)}catch(d){if(!(d instanceof T))throw d;if(d.status===429&&c<yo){let m=d.retryAfter!==void 0&&d.retryAfter>=0?d.retryAfter:Ny;await u(Math.min(m,Oy)*1000);continue}if(d.status===401||d.status===403){let m=d.status===401?"The credentials were rejected.":"The credentials were accepted but lack permission to read this.";throw new Tt(Ve(e,n),Ve(`${e} responded ${d.status}. ${m} ${o}`,n),d.status)}if(d.status===429)throw Xs(d,n,` Still rate limited after ${yo} retries; re-run later, the import resumes safely.`);throw Xs(d,n,a?` ${a}`:"")}}var oi="2026-10",ti=250,ri=4000,$y=["id","email","first_name","last_name","phone","state","total_spent","currency","created_at","default_address"],By=["id","name","order_number","email","contact_email","created_at","processed_at","cancelled_at","currency","total_price","total_tax","total_discounts","total_shipping_price_set","shipping_lines","total_tip_received","financial_status","fulfillment_status","customer","billing_address","shipping_address","line_items","note"],Uy=`Check SHOPIFY_ADMIN_TOKEN, and that the app is installed on this store with the read_customers and read_orders scopes. ${he.shopify}`;function ai(e){let t=e?.id===void 0||e.id===null?"":String(e.id),r=[],n=oe(e?.email);if(!t||!n)return r.push({externalId:t||void 0,message:"skipped: the customer has no valid email address, which Stacks customers are keyed by"}),{record:null,warnings:r};let o=ie(e.currency),a=null;try{a=ge(e.total_spent,U(o))}catch(s){if(!(s instanceof I))throw s;r.push({externalId:t,message:`total_spent: ${s.message}; not imported`})}return{record:{source:"shopify",externalId:t,email:n,name:H(e.first_name,e.last_name)??H(e.default_address?.first_name,e.default_address?.last_name)??n,phone:ye(e.phone,e.default_address?.phone),active:null,totalSpentMinor:a!==null&&a>=0?a:null,currency:o,lastOrderAt:null,avatarUrl:null,createdAt:we(e.created_at)},warnings:r}}function si(e){let t=(e.financial_status??"").toLowerCase(),r=(e.fulfillment_status??"").toLowerCase();if(t==="refunded")return{status:"REFUNDED",mapped:!0};if(e.cancelled_at||t==="voided"||r==="restocked")return{status:"CANCELLED",mapped:!0};if(r==="fulfilled")return{status:"SHIPPED",mapped:!0};if(r==="partial")return{status:"PROCESSING",mapped:!0};if(["paid","partially_paid","partially_refunded","authorized"].includes(t))return{status:"PROCESSING",mapped:!0};if(t==="pending"||t==="expired"||t==="")return{status:"PENDING",mapped:!0};return{status:"PENDING",mapped:!1}}function Jy(e){if(!e)return null;return je(H(e.first_name,e.last_name)??e.name,e.address1,e.address2,e.city,[e.province_code??e.province,e.zip].map((t)=>J(t)).filter(Boolean).join(" "),e.country_code??e.country)}function ii(e,t={}){let r=e?.id===void 0||e.id===null?"":String(e.id),n=[];if(!r)return n.push({message:"skipped: a Shopify order has no id"}),{record:null,warnings:n};let o=ie(e.currency)??ie(t.currency);if(!o)return n.push({externalId:r,message:"skipped: the order names no currency; pass --currency"}),{record:null,warnings:n};let a=U(o),s=(p,b)=>ze(p,a,b,r,n),i=e.total_shipping_price_set?.shop_money?.amount,u=i!==void 0&&i!==null?s(i,"shipping"):(e.shipping_lines??[]).reduce((p,b)=>p+s(b?.price,"shipping line"),0),c=[];for(let p of e.line_items??[]){let b=p?.id===void 0||p.id===null?"":String(p.id),h=qe(p?.quantity),f=R(p?.name)??H(p?.title,p?.variant_title)??`Line ${b}`;if(!b||h===null){n.push({externalId:r,message:`line "${f}" has no id or quantity; left out`});continue}c.push({externalId:b,productExternalId:p.product_id===void 0||p.product_id===null?null:String(p.product_id),variantExternalId:p.variant_id===void 0||p.variant_id===null?null:String(p.variant_id),name:f,sku:R(p.sku),quantity:h,unitPriceMinor:s(p.price,`line "${f}" price`)})}let{status:d,mapped:m}=si(e),l=[e.financial_status??"no payment status",e.fulfillment_status??"unfulfilled",e.cancelled_at?"cancelled":null].filter(Boolean).join(", ");if(!m)n.push({externalId:r,message:`Shopify status "${l}" has no Stacks equivalent; imported as ${d}`});let y=oe(e.customer?.email)??oe(e.email)??oe(e.contact_email),g=e.customer?.id===void 0||e.customer?.id===null?null:String(e.customer.id);return{record:{source:"shopify",externalId:r,number:R(e.name)??(e.order_number?`#${e.order_number}`:null),currency:o,status:d,sourceStatus:l,totalMinor:s(e.total_price,"total"),taxMinor:s(e.total_tax,"tax"),discountMinor:s(e.total_discounts,"discounts"),shippingMinor:u,tipMinor:s(e.total_tip_received,"tip"),customer:y||g?{externalId:g,email:y,name:H(e.customer?.first_name,e.customer?.last_name)??H(e.billing_address?.first_name,e.billing_address?.last_name),phone:ye(e.customer?.phone,e.billing_address?.phone)}:null,shippingAddress:Jy(e.shipping_address),note:R(e.note),placedAt:we(e.processed_at)??we(e.created_at),lines:c},warnings:n}}function ui(e){if(!e)return null;for(let t of e.split(",")){let r=/<([^>]+)>\s*;\s*rel="?next"?/i.exec(t);if(!r)continue;try{return new URL(r[1]).searchParams.get("page_info")}catch{return null}}return null}function ci(e,t){let r=V(t??e);if(!r.startsWith("https://"))throw TypeError(`${r} is not HTTPS. The Shopify Admin API is HTTPS only, and the access token must never travel in plain text.`);return r}async function*ni(e,t,r){if(t.credentials.source!=="shopify")throw TypeError("The Shopify importer needs Shopify credentials (SHOPIFY_ADMIN_TOKEN).");let n=ci(e,t.adminUrl),o=t.fetch??fetch,a=t.limit,s=a&&a>0?Math.min(ti,a):ti,i=`${n}/admin/api/${oi}/${r.resource}.json`,u=r.fields.join(","),c={fetch:o,headers:{"X-Shopify-Access-Token":t.credentials.accessToken},secrets:Ge(t.credentials),credentialHelp:Uy,hint:`Is ${n} the store's Admin API address? For a custom domain, pass --admin-url https://<store>.myshopify.com.`,sleep:t.sleep},d=new Set,m=0,l=`${i}?limit=${s}&fields=${u}${r.firstQuery}`;for(let y=1;y<=ri;y++){let{data:g,headers:p}=await Ue(l,c),b=g?.[r.resource];if(!Array.isArray(b))throw new T(l,`${l} did not return a "${r.resource}" list. Is this the Shopify Admin API?`);let h=b,f=h.map((F)=>String(F?.id));if(y>1&&f.length>0&&f.every((F)=>d.has(F)))throw new T(l,`${l} repeated ${r.resource} from an earlier page; stopping rather than looping.`);f.forEach((F)=>d.add(F));let x=[],D=[];for(let F of h){if(a&&m>=a)break;let k=r.map(F);if(D.push(...k.warnings),k.record)x.push(k.record),m++}yield{url:l,items:x,warnings:D};let v=ui(p.get("link"));if(!v||h.length===0||a&&m>=a)return;l=`${i}?limit=${s}&fields=${u}&page_info=${encodeURIComponent(v)}`}throw new T(i,`Stopped after ${ri} pages of ${i} without reaching the end.`)}var go={name:"shopify",customers:(e,t)=>ni(e,t,{resource:"customers",fields:$y,firstQuery:"",map:ai}),orders:(e,t)=>ni(e,t,{resource:"orders",fields:By,firstQuery:"&status=any",map:(r)=>ii(r,{currency:t.currency})})};import{slug as pi}from"@stacksjs/strings";var dr=100,lr=1000,mr="/store-api",ho="Is this a Shopware 6 store with the Store API reachable at /store-api?",bo='Find it in the Shopware Administration under Sales Channels: open the storefront or headless sales channel and copy the key from its "API access" card. A headless storefront also ships it in its page source.';function pr(e,t){if(!e)return null;let r=e,n=r.translated;return(n&&typeof n==="object"&&!Array.isArray(n)?R(n[t]):null)??R(r[t])}function He(e){return pr(e,"name")?.replace(/\s+/g," ")??null}function di(e){let t=typeof e.availableStock==="number"?e.availableStock:e.stock;return typeof t==="number"&&Number.isFinite(t)?Math.max(0,Math.trunc(t)):null}function li(e){return e.available!==!1&&e.active!==!1}function mi(e,t,r,n,o){let a=U(n.currency),s=e.calculatedPrice?.unitPrice;if(s===null||s===void 0||s==="")return o.push({externalId:r,message:`${t} has no price in ${n.currency??"the sales channel currency"}; left unpriced`}),{priceMinor:null,compareAtMinor:null};try{let i=it(s,a),u=it(e.calculatedPrice?.listPrice?.price??null,a);return{priceMinor:i,compareAtMinor:u!==null&&i!==null&&u>i?u:null}}catch(i){if(!(i instanceof I))throw i;return o.push({externalId:r,message:`${t}: ${i.message}; left unpriced`}),{priceMinor:null,compareAtMinor:null}}}function Wy(e){let t=[...e.media??[]].sort((o,a)=>(o?.position??0)-(a?.position??0));if(e.cover)t.unshift(e.cover);let r=new Set,n=[];for(let o of t){let a=R(o?.media?.url);if(!a||r.has(a))continue;r.add(a);let s=o.media;n.push({src:a,alt:pr(s,"alt")??pr(s,"title")})}return n}function Ly(e){let t=new Set,r=[];for(let n of[e.seoCategory,...e.categories??[]]){let o=He(n),a=o?pi(o):"";if(!o||!a||t.has(a))continue;t.add(a),r.push({name:o,slug:a})}return r}function jy(e){let t=new Map;for(let r of e)for(let n of r.options??[]){let o=He(n.group),a=R(n.groupId)??R(n.group?.id)??o;if(!a||!o||t.has(a))continue;t.set(a,{key:a,name:o,position:n.group?.position??0,order:t.size})}return[...t.values()].sort((r,n)=>r.position-n.position||r.order-n.order)}function zy(e,t){return(e.options??[]).find((r)=>(R(r.groupId)??R(r.group?.id)??He(r.group))===t.key)}function fi(e,t){if(!R(e?.id))throw TypeError("Shopware product has no id");let r=e.id,n=[],o=He(e);if(!o)throw TypeError(`Shopware product ${r} has no name`);let a=t.children??[],s=typeof e.childCount==="number"?e.childCount:0,i=a.length>0,u,c=[];if(i){let d=jy(a);c=d.map((l)=>l.name);let m=a.map((l)=>{let y=d.map((x)=>zy(l,x)),g=y.map((x)=>He(x)??""),p=R(l.productNumber),b=`variant ${p??l.id}`,h=mi(l,b,r,t,n);return{variant:{externalId:String(l.id),title:g.filter(Boolean).join(" / ")||He(l)||p||o,sku:p,priceMinor:h.priceMinor,compareAtMinor:h.compareAtMinor,available:li(l),inventory:di(l),optionValues:g},sortKey:y.map((x)=>x?.position??0),productNumber:p??""}});m.sort((l,y)=>{for(let g=0;g<l.sortKey.length;g++){let p=(l.sortKey[g]??0)-(y.sortKey[g]??0);if(p!==0)return p}return l.productNumber.localeCompare(y.productNumber)}),u=m.map((l)=>l.variant)}else if(s>0)n.push({externalId:r,message:`"${o}" has ${s} variant${s===1?"":"s"} in Shopware, none visible to this sales channel; imported without a price`}),u=[];else{let d=mi(e,`"${o}"`,r,t,n);u=[{externalId:r,title:o,sku:R(e.productNumber),priceMinor:d.priceMinor,compareAtMinor:d.compareAtMinor,available:li(e),inventory:di(e),optionValues:[]}]}return{product:{source:"shopware",externalId:r,name:o,handle:pi(o),descriptionHtml:pr(e,"description"),vendor:He(e.manufacturer),categories:Ly(e),tags:(e.tags??[]).map((d)=>R(d?.name)).filter((d)=>d!==null),currency:t.currency,images:Wy(e),optionNames:c,variants:u,hasOptions:i,url:`${t.storeUrl}/detail/${r}`},warnings:n}}function wi(e){return V(e).replace(/\/store-api$/i,"")}function yi(){return`Shopware's Store API needs the sales channel access key: pass --access-key <key> or set SHOPWARE_ACCESS_KEY. It is public by design and not a secret. ${bo}`}function qy(e){if(!e)return null;try{let r=JSON.parse(e)?.errors?.[0];return R(r?.detail)??R(r?.title)}catch{return null}}function Gy(e){let t=qy(e.body),r=t?` Shopware said: "${t}"`:"";if(e.status===401||e.status===403||e.status===412)return new T(e.url,`${e.message}${r} The sales channel access key looks wrong: check --access-key or SHOPWARE_ACCESS_KEY. ${bo}`,e.status,e.body);return new T(e.url,`${e.message}${r} ${ho}`,e.status,e.body)}async function _o(e,t,r,n){try{let{data:o}=await fe(e,r,"",{headers:{"sw-access-key":t},json:n});return o}catch(o){if(!(o instanceof T))throw o;throw Gy(o)}}function Vy(e){return e instanceof T&&(e.status===401||e.status===403||e.status===412)}async function gi(e,t,r=fetch){try{let n=await _o(`${e}${mr}/context`,t,r),o=typeof n?.currency?.isoCode==="string"?n.currency.isoCode.trim().toUpperCase():"";return/^[A-Z]{3}$/.test(o)?o:null}catch(n){if(Vy(n))throw n;return null}}var hi={product:["id","parentId","productNumber","name","description","translated","calculatedPrice","stock","availableStock","available","active","childCount","manufacturer","seoCategory","categories","tags","cover","media","options"],calculated_price:["unitPrice","quantity","listPrice"],cart_list_price:["price"],product_media:["position","media"],media:["url","alt","title","translated"],product_manufacturer:["name","translated"],category:["name","translated"],tag:["name"],property_group_option:["id","name","translated","position","groupId","group"],property_group:["id","name","translated","position"]};function bi(e,t){return{page:e,limit:t,"total-count-mode":"exact",filter:[{type:"equals",field:"parentId",value:null}],sort:[{field:"id",order:"ASC"}],associations:{cover:{},media:{associations:{media:{}}},manufacturer:{},categories:{},tags:{}},includes:hi}}function _i(e,t){return{page:t,limit:dr,"total-count-mode":"exact",filter:[{type:"equalsAny",field:"parentId",value:e}],sort:[{field:"id",order:"ASC"}],associations:{options:{associations:{group:{}}}},includes:hi}}function xi(e,t,r,n){if(n<r)return!0;let o=typeof e.total==="number"?e.total:Number.NaN;return Number.isInteger(o)&&t*r>=o}async function Hy(e,t,r,n){let o=new Map;if(r.length===0)return o;let a=`${e}${mr}/product`;for(let s=1;s<=lr;s++){let i=await _o(a,t,n,_i(r,s));if(!Array.isArray(i?.elements))throw new T(a,`${a} did not return a product list for the variants. ${ho}`);let u=i.elements;for(let c of u){let d=R(c?.parentId);if(!d)continue;let m=o.get(d)??[];m.push(c),o.set(d,m)}if(u.length===0||xi(i,s,dr,u.length))return o}throw new T(a,`Stopped after ${lr} pages of variants from ${a} without reaching the end.`)}async function*Ky(e,t={}){let r=t.accessKey?.trim();if(!r)throw TypeError(yi());let n=wi(e),o=t.fetch??fetch,a=t.limit,s=a&&a>0?Math.min(dr,a):dr,i=`${n}${mr}/product`,u=[],c=t.currency?.trim().toUpperCase()||null,d=await gi(n,r,o),m=d??c;if(d&&c&&d!==c)u.push({message:`--currency ${c} ignored: this sales channel prices in ${d}, and the Store API does not convert.`});if(!m)u.push({message:`${n}${mr}/context did not report a currency; prices read as 2-decimal amounts. Pass --currency to be sure.`});let l=new Set,y=0;for(let g=1;g<=lr;g++){let p=`${i} (page ${g})`,b;try{b=await _o(i,r,o,bi(g,s))}catch(S){if(S instanceof T)throw new T(S.url,S.message.replace(S.url,p),S.status,S.body);throw S}if(!Array.isArray(b?.elements))throw new T(i,`${p} did not return a product list. ${ho}`);let h=b.elements;if(h.length===0)return;let f=h.map((S)=>String(S?.id));if(g>1&&f.every((S)=>l.has(S)))throw new T(i,`${p} repeated products from an earlier page; the store is not paginating. Use --limit to import the first page only.`);f.forEach((S)=>l.add(S));let x=a?h.slice(0,Math.max(0,a-y)):h,D=g===1?u:[],v=x.filter((S)=>typeof S?.childCount==="number"&&S.childCount>0).map((S)=>String(S.id)),F=await Hy(n,r,v,o),k=[];for(let S of x)try{let C=fi(S,{storeUrl:n,currency:m,children:F.get(String(S?.id))});k.push(C.product),D.push(...C.warnings),y++}catch(C){D.push({externalId:S?.id===void 0?void 0:String(S.id),message:`skipped: ${C.message}`})}if(yield{url:p,products:k,warnings:D},a&&y>=a)return;if(xi(b,g,s,h.length))return}throw new T(i,`Stopped after ${lr} pages of ${i} without reaching the end.`)}var xo={name:"shopware",pages:Ky};var Ri=100,Pi=1e4,Zy=`Check SHOPWARE_CLIENT_ID and SHOPWARE_CLIENT_SECRET, and that the integration's role may read customers and orders. ${he.shopware}`,Ro="Is this a Shopware 6 store with the Admin API reachable at /api?";function Di(e,t={}){let r=R(e?.id)??"",n=[],o=oe(e?.email);if(!r||!o)return n.push({externalId:r||void 0,message:"skipped: the customer has no valid email address, which Stacks customers are keyed by"}),{record:null,warnings:n};let a=ie(t.currency),s=null;try{s=ge(e.orderTotalAmount??null,U(a))}catch(i){if(!(i instanceof I))throw i;n.push({externalId:r,message:`orderTotalAmount: ${i.message}; not imported`})}return{record:{source:"shopware",externalId:r,email:o,name:H(e.firstName,e.lastName)??R(e.company)??o,phone:ye(e.defaultBillingAddress?.phoneNumber),active:typeof e.active==="boolean"?e.active:null,totalSpentMinor:s!==null&&s>=0?s:null,currency:a,lastOrderAt:we(e.lastOrderDate),avatarUrl:null,createdAt:we(e.createdAt)},warnings:n}}function Po(e){return(e?.stateMachineState?.technicalName??"").toLowerCase()}function Qy(e){let t=[...e.transactions??[]].sort((r,n)=>String(r?.createdAt??"").localeCompare(String(n?.createdAt??"")));return Po(t.at(-1))}function Si(e){let t=Po(e),r=Po(e.deliveries?.[0]),n=Qy(e),o=`order ${t||"unknown"}, delivery ${r||"unknown"}, payment ${n||"unknown"}`,a=(s,i=!0)=>({status:s,mapped:i,sourceStatus:o});if(n==="refunded")return a("REFUNDED");if(t==="cancelled")return a("CANCELLED");if(t==="completed")return a("DELIVERED");if(t==="open"||t==="in_progress"){if(r==="shipped")return a("SHIPPED");if(t==="in_progress"||r==="shipped_partially"||["paid","paid_partially","authorized"].includes(n))return a("PROCESSING");return a("PENDING")}return a("PENDING",!1)}function Yy(e){if(!e||!R(e.street))return null;return je(H(e.firstName,e.lastName),e.company,e.street,e.additionalAddressLine1,[e.zipcode,e.city].map((t)=>J(t)).filter(Boolean).join(" "),e.country?.iso??e.country?.name)}function Xy(e){return e.payload&&typeof e.payload==="object"&&!Array.isArray(e.payload)?e.payload:{}}function ki(e,t){let r=Array.isArray(t)?t.map((n)=>J(n?.option)).filter(Boolean):[];return r.length>0&&!r.every((n)=>e.includes(n))?`${e} - ${r.join(", ")}`:e}function Ci(e,t={}){let r=R(e?.id)??"",n=[];if(!r)return n.push({message:"skipped: a Shopware order has no id"}),{record:null,warnings:n};let o=ie(e.currency?.isoCode)??ie(t.currency);if(!o)return n.push({externalId:r,message:"skipped: the order names no currency; pass --currency"}),{record:null,warnings:n};let a=U(o),s=(f,x)=>ze(f,a,x,r,n),i=[],u=0;for(let f of e.lineItems??[]){if(R(f?.parentId))continue;let x=R(f?.id)??"",D=J(f?.label)||`Line ${x}`,v=(f?.type??"").toLowerCase(),F=null;try{F=ge(f?.totalPrice??null,a)}catch(M){if(!(M instanceof I))throw M;n.push({externalId:r,message:`line "${D}": ${M.message}; left out`});continue}if(v==="promotion"||v==="credit"||F!==null&&F<0){u+=Math.abs(F??0);continue}let k=qe(f?.quantity);if(!x||k===null){n.push({externalId:r,message:`line "${D}" has no id or quantity; left out`});continue}let S=v==="product"&&f.productId===null,C=v==="product"&&!S?R(f.productId)??R(f.referencedId):null,O=Xy(f);i.push({externalId:x,productExternalId:R(O.parentId)??C,variantExternalId:C,name:ki(D,O.options),sku:R(O.productNumber),quantity:k,unitPriceMinor:s(f.unitPrice,`line "${D}" unit price`)})}let c=s(e.amountTotal,"total"),d=e.amountNet===null||e.amountNet===void 0?c:s(e.amountNet,"net total"),{status:m,mapped:l,sourceStatus:y}=Si(e);if(!l)n.push({externalId:r,message:`Shopware state "${y}" has no Stacks equivalent; imported as ${m}`});let g=(e.addresses??[]).find((f)=>f?.id&&f.id===e.billingAddressId),p=e.deliveries?.[0]?.shippingOrderAddress??(e.addresses??[]).find((f)=>f?.id&&f.id!==e.billingAddressId)??null,b=oe(e.orderCustomer?.email),h=R(e.orderCustomer?.customerId);return{record:{source:"shopware",externalId:r,number:R(e.orderNumber),currency:o,status:m,sourceStatus:y,totalMinor:c,taxMinor:Math.max(0,c-d),discountMinor:u,shippingMinor:s(e.shippingTotal,"shipping"),tipMinor:0,customer:b||h?{externalId:h,email:b,name:H(e.orderCustomer?.firstName,e.orderCustomer?.lastName),phone:ye(g?.phoneNumber)}:null,shippingAddress:Yy(p),note:R(e.customerComment),placedAt:we(e.orderDateTime),lines:i},warnings:n}}function Ti(e,t){let r=V(t??e).replace(/\/(?:store-)?api$/i,""),{protocol:n,hostname:o}=new URL(r),a=o==="localhost"||o==="127.0.0.1"||o==="[::1]"||o.endsWith(".localhost");if(n!=="https:"&&!a)throw TypeError(`${r} is not HTTPS. The Shopware integration secret and bearer token must never travel in plain text.`);return r}function Ai(e,t){return{page:e,limit:t,"total-count-mode":1,sort:[{field:"id",order:"ASC"}],associations:{defaultBillingAddress:{}},includes:{customer:["id","customerNumber","email","firstName","lastName","company","active","guest","orderTotalAmount","lastOrderDate","createdAt","defaultBillingAddress"],customer_address:["phoneNumber"]}}}var eg=["id","firstName","lastName","company","street","additionalAddressLine1","zipcode","city","phoneNumber","country"];function Ei(e,t){return{page:e,limit:t,"total-count-mode":1,sort:[{field:"id",order:"ASC"}],associations:{lineItems:{},addresses:{associations:{country:{}}},currency:{},stateMachineState:{},orderCustomer:{},deliveries:{associations:{stateMachineState:{},shippingOrderAddress:{associations:{country:{}}}}},transactions:{associations:{stateMachineState:{}}}},includes:{order:["id","orderNumber","orderDateTime","amountTotal","amountNet","shippingTotal","customerComment","billingAddressId","currency","stateMachineState","orderCustomer","lineItems","addresses","deliveries","transactions"],order_line_item:["id","parentId","productId","referencedId","label","quantity","unitPrice","totalPrice","type","payload"],order_customer:["customerId","email","firstName","lastName"],order_address:eg,order_delivery:["shippingOrderAddress","stateMachineState"],order_transaction:["stateMachineState","createdAt"],currency:["isoCode"],country:["iso","name"],state_machine_state:["technicalName"]}}}async function vo(e,t,r,n){let o=`${e}/api/oauth/token`,{data:a}=await Ue(o,{...n,json:{grant_type:"client_credentials",client_id:t,client_secret:r}}),s=typeof a?.access_token==="string"?a.access_token.trim():"";if(!s)throw new T(o,`${o} returned no access_token. ${Ro}`);return s}async function*vi(e,t,r,n,o){if(t.credentials.source!=="shopware")throw TypeError("The Shopware importer needs Shopware credentials (SHOPWARE_CLIENT_ID and SHOPWARE_CLIENT_SECRET).");let a=Ti(e,t.adminUrl),{clientId:s,clientSecret:i}=t.credentials,u=Ge(t.credentials),d={fetch:t.fetch??fetch,secrets:u,credentialHelp:Zy,hint:Ro,sleep:t.sleep},m=await vo(a,s,i,d),l=async(f,x)=>{let D=()=>Ue(f,{...d,secrets:[...u,m],headers:{authorization:`Bearer ${m}`},json:x});try{return await D()}catch(v){if(!(v instanceof Tt)||v.status!==401)throw v;return m=await vo(a,s,i,d),await D()}},y=`${a}/api/search/${r}`,g=t.limit,p=g&&g>0?Math.min(Ri,g):Ri,b=new Set,h=0;for(let f=1;f<=Pi;f++){let x=`${y} (page ${f})`,{data:D}=await l(y,n(f,p));if(!Array.isArray(D?.data))throw new T(y,`${x} did not return a "data" list. ${Ro}`);let v=D.data;if(v.length===0)return;let F=v.map((O)=>String(O?.id));if(f>1&&F.every((O)=>b.has(O)))throw new T(y,`${x} repeated ${r}s from an earlier page; the store is not paginating.`);F.forEach((O)=>b.add(O));let k=[],S=[];for(let O of v){if(g&&h>=g)break;let M=o(O);if(S.push(...M.warnings),M.record)k.push(M.record),h++}if(yield{url:x,items:k,warnings:S},g&&h>=g)return;let C=typeof D.total==="number"?D.total:Number.NaN;if(v.length<p||Number.isInteger(C)&&f*p>=C)return}throw new T(y,`Stopped after ${Pi} pages of ${y} without reaching the end.`)}var Do={name:"shopware",customers:(e,t)=>vi(e,t,"customer",Ai,(r)=>Di(r,{currency:t.currency})),orders:(e,t)=>vi(e,t,"order",Ei,(r)=>Ci(r,{currency:t.currency}))};import{slug as Oi}from"@stacksjs/strings";var ko=100,Co=1000,To="/wp-json/wc/store/v1/products",Fi="Is WooCommerce 6+ installed with the Store API reachable at /wp-json?";function $i(e){let t=R(e?.currency_code)?.toUpperCase()??null,r=Number(e?.currency_minor_unit),n=Number.isInteger(r)&&r>=0?r:2,o=U(t),a=st(e?.price,n,o),s=st(e?.regular_price,n,o);return{currency:t,priceMinor:a,compareAtMinor:s!==null&&a!==null&&s>a?s:null}}function Ii(e,t,r){try{return $i(e.prices)}catch(n){if(!(n instanceof I))throw n;return r.push({externalId:t,message:`${n.message}; left unpriced`}),{currency:R(e.prices?.currency_code)?.toUpperCase()??null,priceMinor:null,compareAtMinor:null}}}function So(e){return(e??[]).map((t)=>{let r=J(t?.name);return{name:r,slug:R(t?.slug)??Oi(r)}}).filter((t)=>t.name&&t.slug)}function Bi(e){let t=R(e);if(!t||!t.includes("%"))return t;try{return decodeURIComponent(t)}catch{return t}}function Mi(e){return typeof e.low_stock_remaining==="number"?Math.max(0,Math.trunc(e.low_stock_remaining)):null}function Ni(e){return e.is_in_stock!==!1&&e.is_purchasable!==!1}function Ui(e,t={}){if(e?.id===void 0||e.id===null||e.id==="")throw TypeError("WooCommerce product has no id");let r=String(e.id),n=[],o=J(e.name);if(!o)throw TypeError(`WooCommerce product ${r} has no name`);let a=Ii(e,r,n),s=e.type==="variable"&&(e.variations?.length??0)>0,i=s?(e.attributes??[]).filter((l)=>l.has_variations!==!1):[],u=i.map((l)=>J(l.name)).filter(Boolean),c,d=a.currency;if(s)c=(e.variations??[]).map((l)=>{let y=String(l.id),g=i.map((h)=>{let f=J(h.name).toLowerCase(),x=(h.taxonomy??"").toLowerCase(),D=(l.attributes??[]).find((k)=>{let S=J(k.name).toLowerCase();return S===f||x!==""&&S===x}),v=R(D?.value);if(!v)return"Any";let F=(h.terms??[]).find((k)=>k.slug===v);return F?J(F.name):J(v)}),p=t.variations?.get(y);if(!p)return n.push({externalId:r,message:`variation ${y} could not be fetched; imported without a price`}),{externalId:y,title:g.join(" / ")||o,sku:null,priceMinor:null,compareAtMinor:null,available:!1,inventory:null,optionValues:g};let b=Ii(p,y,n);return d??=b.currency,{externalId:y,title:g.join(" / ")||J(p.name)||o,sku:R(p.sku),priceMinor:b.priceMinor,compareAtMinor:b.compareAtMinor,available:Ni(p),inventory:Mi(p),optionValues:g}});else c=[{externalId:r,title:o,sku:R(e.sku),priceMinor:a.priceMinor,compareAtMinor:a.compareAtMinor,available:Ni(e),inventory:Mi(e),optionValues:[]}];let m=So(e.brands)[0];return{product:{source:"woocommerce",externalId:r,name:o,handle:Bi(e.slug)??Oi(o),descriptionHtml:R(e.description)??R(e.short_description),vendor:m?m.name:null,categories:So(e.categories),tags:So(e.tags).map((l)=>l.name),currency:d,images:(e.images??[]).filter((l)=>R(l?.src)).map((l)=>({src:R(l.src),alt:R(l.alt)})),optionNames:s?u:[],variants:c,hasOptions:s,url:R(e.permalink)},warnings:n}}async function Ji(e,t){let{data:r,headers:n}=await fe(e,t,Fi);if(!Array.isArray(r))throw new T(e,`${e} did not return a product list. ${Fi}`);let o=n.get("x-wp-totalpages")?.trim(),a=o?Number(o):Number.NaN;return{url:e,items:r,totalPages:Number.isInteger(a)&&a>=0?a:null}}async function tg(e,t,r){let n=new Map;if(t.length===0)return n;for(let o=1;o<=Co;o++){let a=`${e}${To}?type=variation&parent=${t.join(",")}&per_page=${ko}&page=${o}`,s=await Ji(a,r);for(let i of s.items)n.set(String(i.id),i);if(s.items.length===0||s.totalPages!==null&&o>=s.totalPages)break}return n}async function*rg(e,t={}){let r=V(e),n=t.fetch??fetch,o=t.limit,a=o&&o>0?Math.min(ko,o):ko,s=new Set,i=0;for(let u=1;u<=Co;u++){let c=`${r}${To}?per_page=${a}&page=${u}`,d=await Ji(c,n);if(d.items.length===0)return;let m=d.items.map((h)=>String(h?.id));if(u>1&&m.every((h)=>s.has(h)))throw new T(c,`${c} repeated products from an earlier page; the store is not paginating. Use --limit to import the first page only.`);m.forEach((h)=>s.add(h));let l=o?d.items.slice(0,Math.max(0,o-i)):d.items,y=[],g=l.filter((h)=>h?.type==="variable"&&(h.variations?.length??0)>0).map((h)=>String(h.id)),p=new Map;try{p=await tg(r,g,n)}catch(h){if(!(h instanceof T))throw h;y.push({message:`variations could not be fetched (${h.message}); variable products are imported without variant prices`})}let b=[];for(let h of l)try{let f=Ui(h,{variations:p});b.push(f.product),y.push(...f.warnings),i++}catch(f){y.push({externalId:h?.id===void 0?void 0:String(h.id),message:`skipped: ${f.message}`})}if(yield{url:c,products:b,warnings:y},o&&i>=o)return;if(d.totalPages!==null&&u>=d.totalPages)return}throw new T(r,`Stopped after ${Co} pages of ${r}${To} without reaching the end.`)}var Ao={name:"woocommerce",pages:rg};var Wi=100,Li=1e4,Eo="/wp-json/wc/v3",ng=`Check WOOCOMMERCE_CONSUMER_KEY and WOOCOMMERCE_CONSUMER_SECRET, and that the key has Read permission. If the key is right and every request is a 401, the web server may be stripping the Authorization header (common with Apache and CGI PHP). ${he.woocommerce}`,ji="Is WooCommerce installed with the REST API reachable at /wp-json/wc/v3, and pretty permalinks enabled?",og={pending:"PENDING","on-hold":"PENDING",processing:"PROCESSING",completed:"DELIVERED",cancelled:"CANCELLED",failed:"CANCELLED",refunded:"REFUNDED"},ag=new Set(["checkout-draft","auto-draft","trash"]);function qi(e){let t=og[(e??"").toLowerCase()];return t?{status:t,mapped:!0}:{status:"PENDING",mapped:!1}}function sg(e){let t=R(e);if(!t)return null;try{return new URL(t).protocol==="https:"?t:null}catch{return null}}function Gi(e){let t=e?.id===void 0||e.id===null?"":String(e.id),r=[],n=oe(e?.email)??oe(e?.billing?.email);if(!t||!n)return r.push({externalId:t||void 0,message:"skipped: the customer has no valid email address, which Stacks customers are keyed by"}),{record:null,warnings:r};return{record:{source:"woocommerce",externalId:t,email:n,name:H(e.first_name,e.last_name)??H(e.billing?.first_name,e.billing?.last_name)??n,phone:ye(e.billing?.phone,e.shipping?.phone),active:null,totalSpentMinor:null,currency:null,lastOrderAt:null,avatarUrl:sg(e.avatar_url),createdAt:cr(e.date_created_gmt)},warnings:r}}function ig(e){if(!e||!R(e.address_1))return null;return je(H(e.first_name,e.last_name),e.company,e.address_1,e.address_2,e.city,[e.state,e.postcode].map((t)=>J(t)).filter(Boolean).join(" "),e.country)}function Vi(e,t={}){let r=e?.id===void 0||e.id===null?"":String(e.id),n=[];if(!r)return n.push({message:"skipped: a WooCommerce order has no id"}),{record:null,warnings:n};let o=(e.status??"").toLowerCase();if(ag.has(o))return n.push({externalId:r,message:`skipped: status "${o}" is not a placed order`}),{record:null,warnings:n};let a=ie(e.currency)??ie(t.currency);if(!a)return n.push({externalId:r,message:"skipped: the order names no currency; pass --currency"}),{record:null,warnings:n};let s=U(a),i=(p,b)=>ze(p,s,b,r,n),u=[];for(let p of e.line_items??[]){let b=p?.id===void 0||p.id===null?"":String(p.id),h=qe(p?.quantity),f=J(p?.name)||`Line ${b}`;if(!b||h===null){n.push({externalId:r,message:`line "${f}" has no id or quantity; left out`});continue}let x=i(p.subtotal??p.total,`line "${f}" subtotal`);u.push({externalId:b,productExternalId:p.product_id?String(p.product_id):null,variantExternalId:p.variation_id?String(p.variation_id):null,name:f,sku:R(p.sku),quantity:h,unitPriceMinor:fo(x,h)})}let c=0;for(let p of e.fee_lines??[]){let b=J(p?.name)||"Fee",h=null;try{h=ge(p?.total,s)}catch(f){if(!(f instanceof I))throw f;n.push({externalId:r,message:`fee "${b}": ${f.message}; left out`})}if(h===null||h===0)continue;if(h<0){c+=-h;continue}u.push({externalId:`fee-${p?.id??u.length}`,productExternalId:null,variantExternalId:null,name:b,sku:null,quantity:1,unitPriceMinor:h})}let{status:d,mapped:m}=qi(o);if(!m)n.push({externalId:r,message:`WooCommerce status "${o||"none"}" has no Stacks equivalent; imported as ${d}`});let l=e.customer_id?String(e.customer_id):null,y=oe(e.billing?.email),g=0;for(let p of e.refunds??[])try{g+=Math.abs(ge(p?.total,s)??0)}catch(b){if(!(b instanceof I))throw b;n.push({externalId:r,message:`refund ${p?.id??""}: ${b.message}; not counted`})}return{record:{source:"woocommerce",externalId:r,number:R(e.number)?`#${R(e.number)}`:null,currency:a,status:d,sourceStatus:o||"none",totalMinor:i(e.total,"total"),taxMinor:i(e.total_tax,"tax"),discountMinor:i(e.discount_total,"discounts")+c,shippingMinor:i(e.shipping_total,"shipping"),tipMinor:0,customer:y||l?{externalId:l,email:y,name:H(e.billing?.first_name,e.billing?.last_name),phone:ye(e.billing?.phone)}:null,shippingAddress:ig(e.shipping),note:R(e.customer_note),placedAt:cr(e.date_created_gmt),lines:u,refundedMinor:g},warnings:n}}function Hi(e,t){let r=V(t??e);if(!r.startsWith("https://"))throw TypeError(`${r} is not HTTPS. WooCommerce REST API keys are sent with HTTP Basic auth, which is only safe (and only accepted by WooCommerce) over HTTPS. Use the store's https:// address.`);return r}function Ki(e,t){return`Basic ${Buffer.from(`${e}:${t}`,"utf8").toString("base64")}`}async function*zi(e,t,r,n){if(t.credentials.source!=="woocommerce")throw TypeError("The WooCommerce importer needs WooCommerce credentials (WOOCOMMERCE_CONSUMER_KEY and WOOCOMMERCE_CONSUMER_SECRET).");let o=Hi(e,t.adminUrl),{consumerKey:a,consumerSecret:s}=t.credentials,i=Ki(a,s),u={fetch:t.fetch??fetch,headers:{authorization:i},secrets:[...Ge(t.credentials),i.slice(6)],credentialHelp:ng,hint:ji,sleep:t.sleep},c=t.limit,d=c&&c>0?Math.min(Wi,c):Wi,m=new Set,l=0;for(let y=1;y<=Li;y++){let g=`${o}${Eo}/${r}?per_page=${d}&page=${y}&orderby=id&order=asc`,{data:p,headers:b}=await Ue(g,u);if(!Array.isArray(p))throw new T(g,`${g} did not return a list of ${r}. ${ji}`);let h=p;if(h.length===0)return;let f=h.map((k)=>String(k?.id));if(y>1&&f.every((k)=>m.has(k)))throw new T(g,`${g} repeated ${r} from an earlier page; the store is not paginating.`);f.forEach((k)=>m.add(k));let x=[],D=[];for(let k of h){if(c&&l>=c)break;let S=n(k);if(D.push(...S.warnings),S.record)x.push(S.record),l++}yield{url:g,items:x,warnings:D};let v=b.get("x-wp-totalpages")?.trim(),F=v?Number(v):Number.NaN;if(c&&l>=c)return;if(Number.isInteger(F)&&y>=F)return}throw new T(`${o}${Eo}/${r}`,`Stopped after ${Li} pages of ${o}${Eo}/${r} without reaching the end.`)}var Fo={name:"woocommerce",customers:(e,t)=>zi(e,t,"customers",Gi),orders:(e,t)=>zi(e,t,"orders",(r)=>Vi(r,{currency:t.currency}))};import{db as No,sqlHelpers as ru}from"@stacksjs/database/runtime";import{env as nu}from"@stacksjs/env";import{formatDate as $o}from"@stacksjs/orm";import{db as ug}from"@stacksjs/database/runtime";import{HttpError as Yi}from"@stacksjs/error-handling";import{isUniqueViolation as cg}from"@stacksjs/orm";function De(e){if(typeof e==="bigint")return Io(e);if(typeof e==="number")return Io(e);if(!e||typeof e!=="object")return;if(Array.isArray(e)){for(let r of e){let n=De(r);if(n!==void 0)return n}return}let t=e;for(let r of["lastInsertRowid","insertId","lastInsertId"]){let n=t[r];if(n===void 0||n===null)continue;let o=Io(n);if(o!==void 0)return o}return}function Io(e){let t=typeof e==="bigint"?Number(e):Number(e);if(!Number.isSafeInteger(t)||t<=0)return;return t}import{db as Zi}from"@stacksjs/database/runtime";async function fr(e){let t=await Zi.selectFrom("customers").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function Qi(){return P(await Zi.selectFrom("customers").selectAll().execute())}var Mo="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=400&fit=crop&q=60";async function Xi(e){try{let t={...e,avatar:e.avatar??Mo},r=await ug.insertInto("customers").values(t).executeTakeFirst();if(!r)throw Error("Failed to create customer");let n=De(r);if(n===void 0)throw Error("Failed to create customer: the database reported no insert id");return await fr(n)}catch(t){if(t instanceof Yi)throw t;if(cg(t))throw new Yi(409,"A customer with this email already exists");if(t instanceof Error)throw Error(`Failed to create customer: ${t.message}`);throw t}}import{createHash as dg}from"crypto";var eu="5d0c8a3e-6f1b-4c2a-9e47-b18f3d2a6c90";function tu(e,t=eu){let r=t.replace(/-/g,"");if(!/^[0-9a-f]{32}$/i.test(r))throw TypeError(`Invalid namespace UUID "${t}"`);let n=dg("sha1").update(Buffer.from(r,"hex")).update(e,"utf8").digest().subarray(0,16);n[6]=n[6]&15|80,n[8]=n[8]&63|128;let o=n.toString("hex");return`${o.slice(0,8)}-${o.slice(8,12)}-${o.slice(12,16)}-${o.slice(16,20)}-${o.slice(20)}`}function te(e,t,r,n){return tu(`${e}:${t.toLowerCase()}:${r}:${n}`)}var lg=255;function Ke(e,t,r,n){return te(e,t,"customer",r??`email:${n}`)}function Bo(e,t,r,n,o){if(!n)return null;if(r!==null&&r!==Ke(e,t,null,o))return null;return Ke(e,t,n,o)}function At(e){return e?$o(new Date(e)):null}function wr(e,t,r,n){let o={name:e.name.slice(0,lg),updated_at:r};if(n==="create")return o.uuid=t,o.email=e.email,o.phone=e.phone,o.total_spent=e.totalSpentMinor??0,o.last_order=At(e.lastOrderAt),o.status=e.active===!1?"Inactive":"Active",o.avatar=e.avatarUrl??Mo,o.created_at=At(e.createdAt)??r,o;if(e.phone!==null)o.phone=e.phone;if(e.totalSpentMinor!==null)o.total_spent=e.totalSpentMinor;if(e.lastOrderAt!==null)o.last_order=At(e.lastOrderAt);if(e.active!==null)o.status=e.active?"Active":"Inactive";return o}function Oo(e){return e.sku?`${e.name} (SKU ${e.sku})`:e.name}function ou(e,t,r,n){let o={uuid:te(e.source,t,"order",e.externalId),status:e.status,total_amount:e.totalMinor,currency:e.currency,tax_amount:e.taxMinor,discount_amount:e.discountMinor,delivery_fee:e.shippingMinor,tip_amount:e.tipMinor,order_type:e.shippingAddress?"DELIVERY":"TAKEOUT",delivery_address:e.shippingAddress,special_instructions:e.note,created_at:At(e.placedAt)??n,updated_at:n};if(r!==null)o.customer_id=r;return o}class Uo{byUuid=new Map;byEmail=new Map;uuidById=new Map;async load(e,t){let r=[...new Set(t.map((o)=>o.uuid).filter((o)=>o!==null&&!this.byUuid.has(o)))],n=[...new Set(t.map((o)=>o.email).filter((o)=>o!==null&&!this.byEmail.has(o)))];if(r.length===0&&n.length===0)return;for(let o of await e.findCustomers({uuids:r,emails:n}))this.remember(o.id,o.uuid,o.email)}remember(e,t,r){if(t){let n=this.uuidById.get(e);if(n&&n!==t)this.byUuid.delete(n);this.byUuid.set(t,e),this.uuidById.set(e,t)}if(r)this.byEmail.set(r.trim().toLowerCase(),e)}find(e,t){let r=e?this.byUuid.get(e):void 0;if(r!==void 0)return{id:r,matchedBy:"uuid"};let n=t?this.byEmail.get(t):void 0;return n!==void 0?{id:n,matchedBy:"email"}:null}uuidOf(e){return this.uuidById.get(e)??null}emailTakenByOther(e,t){let r=this.byEmail.get(e);return r!==void 0&&r!==t}}function au(e){let t=V(e.storeUrl);return{storeUrl:t,host:Ct(t),clock:e.now??(()=>new Date),fetchOptions:{credentials:e.credentials,limit:e.limit,fetch:e.fetch,currency:e.currency,adminUrl:e.adminUrl,sleep:e.sleep}}}async function mg(e){let{storeUrl:t,host:r,clock:n,fetchOptions:o}=au(e),{adapter:a,repository:s}=e,i=new Uo,u=new Set,c={source:a.name,storeUrl:t,dryRun:e.dryRun===!0,pages:[],customers:[],counts:{customers:{created:0,updated:0},merged:0},warnings:[]};async function d(m,l){let y=$o(n()),g=Ke(m.source,r,m.externalId,m.email),p=i.find(g,m.email);if(!p){let f=await l.createCustomer(wr(m,g,y,"create"));return i.remember(f,g,m.email),{action:"create",externalId:m.externalId,email:m.email,name:m.name,matchedBy:null}}let b=wr(m,g,y,"update");if(p.matchedBy==="uuid")if(i.emailTakenByOther(m.email,p.id))c.warnings.push({externalId:m.externalId??void 0,message:`email changed to ${m.email}, which another customer already has; kept the old address`});else b.email=m.email;let h=p.matchedBy==="email"?Bo(m.source,r,i.uuidOf(p.id),m.externalId,m.email):null;if(h)b.uuid=h;return await l.updateCustomer(p.id,b),i.remember(p.id,h,m.email),{action:"update",externalId:m.externalId,email:m.email,name:m.name,matchedBy:p.matchedBy}}for await(let m of a.customers(t,o)){c.pages.push(m.url),c.warnings.push(...m.warnings);let l=[];for(let y of m.items){if(u.has(y.email)){c.counts.merged++;continue}u.add(y.email),l.push(y)}await i.load(s,l.map((y)=>({uuid:Ke(y.source,r,y.externalId,y.email),email:y.email})));for(let y of l){let g=await d(y,s);c.counts.customers[g.action==="create"?"created":"updated"]++,c.customers.push(g),e.onCustomer?.(g)}}if(c.counts.merged>0)c.warnings.push({message:`${c.counts.merged} source customer${c.counts.merged===1?"":"s"} shared an email with another and ${c.counts.merged===1?"was":"were"} merged into one Stacks customer`});return c}async function pg(e){let{storeUrl:t,host:r,clock:n,fetchOptions:o}=au(e),{adapter:a,repository:s}=e,i=new Uo,u=new Set,c=new Set,d=new Set,m=[],l={source:a.name,storeUrl:t,dryRun:e.dryRun===!0,pages:[],orders:[],counts:{orders:{created:0,updated:0},customers:{created:0,updated:0},lines:{linked:0,unlinked:0,productless:0},duplicates:0,partlyRefunded:0},currencies:[],warnings:[]},y=(f,x)=>te(f.source,r,"product",x),g=(f,x)=>te(f.source,r,"variant",x);function p(f){let x=f.customer;if(x?.externalId)return Ke(f.source,r,x.externalId,x.email??"");return x?.email?Ke(f.source,r,null,x.email):null}async function b(f,x,D){let v=f.customer;if(!v)return null;let F=p(f),k=i.find(F,v.email);if(k){let C=k.matchedBy==="email"&&v.email?Bo(f.source,r,i.uuidOf(k.id),v.externalId,v.email):null;if(C)await x.updateCustomer(k.id,{uuid:C,updated_at:D}),i.remember(k.id,C,v.email);return k.id}if(!v.email)return l.warnings.push({externalId:f.externalId,message:`order ${f.number??f.externalId} has no customer email; imported without a customer`}),null;let S=await x.createCustomer(wr({source:f.source,externalId:v.externalId,email:v.email,name:v.name??v.email,phone:v.phone,active:null,totalSpentMinor:null,currency:null,lastOrderAt:f.placedAt,avatarUrl:null,createdAt:f.placedAt},F,D,"create"));return i.remember(S,F,v.email),l.counts.customers.created++,S}async function h(f,x,D){let v=$o(n()),F=await b(f,x,v),k=ou(f,r,F,v),S=D.orders.get(k.uuid),C;if(S===void 0)C=await x.createOrder(k);else{C=S;let G={...k};delete G.uuid,await x.updateOrder(C,G)}let O=0,M=0,re=f.lines.map((G)=>{let _t=(G.productExternalId?D.products.get(y(f,G.productExternalId)):void 0)??(G.variantExternalId?D.variants.get(g(f,G.variantExternalId)):void 0)??null;if(_t===null){if(!G.productExternalId&&!G.variantExternalId)M++;else if(O++,d.size<5)d.add(Oo(G))}return{order_id:C,product_id:_t,quantity:G.quantity,price:G.unitPriceMinor,special_instructions:Oo(G),created_at:v,updated_at:v}});return await x.replaceOrderItems(C,re),{action:S===void 0?"create":"update",externalId:f.externalId,number:f.number,status:f.status,sourceStatus:f.sourceStatus,totalMinor:f.totalMinor,currency:f.currency,lines:re.length,unlinkedLines:O,productlessLines:M,refundedMinor:f.refundedMinor??0,customerEmail:f.customer?.email??null,customerId:F}}for await(let f of a.orders(t,o)){l.pages.push(f.url),l.warnings.push(...f.warnings);let x=f.items.filter((C)=>{if(!u.has(C.externalId))return u.add(C.externalId),!0;return l.counts.duplicates++,!1}),D=x.map((C)=>te(C.source,r,"order",C.externalId)),v=[...new Set(x.flatMap((C)=>C.lines.flatMap((O)=>O.productExternalId?[y(C,O.productExternalId)]:[])))],F=[...new Set(x.flatMap((C)=>C.lines.flatMap((O)=>O.variantExternalId?[g(C,O.variantExternalId)]:[])))],k={orders:D.length>0?await s.findOrders(D):new Map,products:v.length>0?await s.findProducts(v):new Map,variants:F.length>0?await s.findVariantProducts(F):new Map};await i.load(s,x.map((C)=>({uuid:p(C),email:C.customer?.email??null})));let S=new Map;for(let C of x){c.add(C.currency);let{customerId:O,...M}=s.transaction?await s.transaction((G)=>h(C,G,k)):await h(C,s,k);if(l.counts.orders[M.action==="create"?"created":"updated"]++,l.counts.lines.linked+=M.lines-M.unlinkedLines-M.productlessLines,l.counts.lines.unlinked+=M.unlinkedLines,l.counts.lines.productless+=M.productlessLines,M.refundedMinor>0&&M.status!=="REFUNDED"){if(l.counts.partlyRefunded++,m.length<3)m.push(`${M.number??M.externalId}: ${ne(M.refundedMinor,M.currency)} of ${ne(M.totalMinor,M.currency)}`)}let re=At(C.placedAt);if(O!==null&&re&&re>(S.get(O)??""))S.set(O,re);l.orders.push(M),e.onOrder?.(M)}if(s.advanceLastOrder)for(let[C,O]of S)await s.advanceLastOrder(C,O)}if(l.currencies=[...c].sort(),l.counts.lines.unlinked>0){let f=[...d].map((D)=>`"${D}"`).join(", "),x=l.counts.lines.unlinked===1;l.warnings.push({message:`${l.counts.lines.unlinked} order line${x?" references a product":"s reference products"} not in Stacks (e.g. ${f}); kept with ${x?"its":"their"} label and price but no product link. Import the catalog (buddy commerce:import <url> --from ${a.name}), then re-run the order import to link ${x?"it":"them"}.`})}if(l.counts.partlyRefunded>0){let f=l.counts.partlyRefunded===1;l.warnings.push({message:`${l.counts.partlyRefunded} order${f?" was":"s were"} partly refunded at the source (${m.join("; ")}${f?"":", ..."}). Stacks orders have no refund column, so total_amount is what was charged.`})}return l}function su(e=No){async function t(o,a){let s=await e.selectFrom(o).where("uuid","=",a).select("id").executeTakeFirst();if(!s)throw Error(`Inserted a row into ${o} but could not read it back (uuid ${a})`);return Number(s.id)}async function r(o,a){let s=[];for(let i=0;i<o.length;i+=500)s.push(...await a(o.slice(i,i+500)));return s}let n={async findCustomers({uuids:o,emails:a}){let s=await r(o,(c)=>e.selectFrom("customers").where("uuid","in",c).select(["id","uuid","email"]).execute()),i=ru(nu.DB_CONNECTION||"sqlite").param,u=await r(a.map((c)=>c.trim().toLowerCase()),async(c)=>{let d=c.map((l,y)=>i(y+1)).join(", "),m=await e.unsafe(`SELECT id, uuid, email FROM customers WHERE LOWER(email) IN (${d})`,c);return Array.isArray(m)?m:[]});return[...s,...u].map((c)=>({id:Number(c.id),uuid:c.uuid??null,email:String(c.email)}))},async createCustomer(o){return await e.insertInto("customers").values(o).execute(),t("customers",o.uuid)},async updateCustomer(o,a){await e.updateTable("customers").set(a).where("id","=",o).execute()},async advanceLastOrder(o,a){let s=ru(nu.DB_CONNECTION||"sqlite").param;await e.unsafe(`UPDATE customers SET last_order = ${s(1)} WHERE id = ${s(2)} AND (last_order IS NULL OR last_order < ${s(3)})`,[a,o,a])},async findOrders(o){let a=await r(o,(s)=>e.selectFrom("orders").where("uuid","in",s).select(["id","uuid"]).execute());return new Map(a.map((s)=>[String(s.uuid),Number(s.id)]))},async createOrder(o){return await e.insertInto("orders").values(o).execute(),t("orders",o.uuid)},async updateOrder(o,a){await e.updateTable("orders").set(a).where("id","=",o).execute()},async replaceOrderItems(o,a){if(await e.deleteFrom("order_items").where("order_id","=",o).execute(),a.length>0)await e.insertInto("order_items").values(a).execute()},async findProducts(o){let a=await r(o,(s)=>e.selectFrom("products").where("uuid","in",s).select(["id","uuid"]).execute());return new Map(a.map((s)=>[String(s.uuid),Number(s.id)]))},async findVariantProducts(o){let a=await r(o,(s)=>e.selectFrom("product_variants").where("uuid","in",s).select(["uuid","product_id"]).execute());return new Map(a.filter((s)=>s.product_id!==null&&s.product_id!==void 0).map((s)=>[String(s.uuid),Number(s.product_id)]))}};if(e===No)n.transaction=(o)=>No.transaction((a)=>o(su(a)));return n}function fg(e={tables:{}}){let t=e.tables;for(let a of["customers","orders","order_items","products","product_variants"])t[a]??=[];function r(a,s){let i=t[a],u=i.reduce((c,d)=>Math.max(c,Number(d.id)),0)+1;return i.push({id:u,...s}),u}function n(a,s,i){let u=t[a].find((c)=>c.id===s);if(u)Object.assign(u,i)}let o=(a,s)=>new Map(t[a].filter((i)=>s.includes(i.uuid)).map((i)=>[i.uuid,i.id]));return{tables:t,findCustomers:async({uuids:a,emails:s})=>t.customers.filter((i)=>a.includes(i.uuid)||s.includes(String(i.email).trim().toLowerCase())).map((i)=>({id:i.id,uuid:i.uuid??null,email:i.email})),createCustomer:async(a)=>{if(t.customers.some((s)=>s.email===a.email))throw Error(`UNIQUE constraint failed: customers.email (${a.email})`);return r("customers",a)},updateCustomer:async(a,s)=>n("customers",a,s),advanceLastOrder:async(a,s)=>{let i=t.customers.find((u)=>u.id===a);if(i&&(i.last_order===null||i.last_order===void 0||String(i.last_order)<s))i.last_order=s},findOrders:async(a)=>o("orders",a),createOrder:async(a)=>r("orders",a),updateOrder:async(a,s)=>n("orders",a,s),replaceOrderItems:async(a,s)=>{t.order_items=t.order_items.filter((i)=>i.order_id!==a);for(let i of s)r("order_items",i)},findProducts:async(a)=>o("products",a),findVariantProducts:async(a)=>new Map(t.product_variants.filter((s)=>a.includes(s.uuid)).map((s)=>[s.uuid,s.product_id]))}}function wg(e){let t=-1,r=async()=>t--,n=[];return{async findCustomers(o){let a=await e.findCustomers(o),s=n.filter((i)=>i.uuid!==null&&o.uuids.includes(i.uuid)||o.emails.includes(i.email));return[...a,...s]},findOrders:e.findOrders,findProducts:e.findProducts,findVariantProducts:e.findVariantProducts,async createCustomer(o){let a=t--;return n.push({id:a,uuid:o.uuid??null,email:String(o.email??"").toLowerCase()}),a},createOrder:r,updateCustomer:async()=>{},advanceLastOrder:async()=>{},updateOrder:async()=>{},replaceOrderItems:async()=>{}}}var{randomUUIDv7:iu}=globalThis.Bun;import{db as Jo}from"@stacksjs/database/runtime";import{formatDate as yg}from"@stacksjs/orm";var cu="Unknown",gg=1,hg=50,Wo=100;function zo(e){let t=e.map((r)=>r.priceMinor).filter((r)=>r!==null);return t.length>0?Math.min(...t):null}function du(e){if(e.length===0||e.some((t)=>t.inventory===null))return null;return e.reduce((t,r)=>t+(r.inventory??0),0)}function lu(e){let t=new Map,r=[],n=new Set;for(let o of e.variants){let a=o.sku;if(a===null)t.set(o.externalId,null);else if(a.length>Wo)t.set(o.externalId,null),r.push({externalId:e.externalId,message:`"${e.name}" variant "${o.title}" has a SKU longer than ${Wo} characters; imported without it`});else if(n.has(a))t.set(o.externalId,null),r.push({externalId:e.externalId,message:`"${e.name}" variant "${o.title}" repeats SKU ${a}; imported without it`});else n.add(a),t.set(o.externalId,a)}return{skus:t,warnings:r}}function Lo(e,t,r,n,o){let a=du(e.variants),s={uuid:te(e.source,t,"product",e.externalId),name:e.name,description:e.descriptionHtml,price:zo(e.variants)??0,image_url:e.images[0]?.src??null,is_available:e.variants.some((i)=>i.available),updated_at:n};if(o==="create")s.inventory_count=a??0,s.preparation_time=gg,s.category_id=r.categoryId,s.manufacturer_id=r.manufacturerId,s.created_at=n;else{if(a!==null)s.inventory_count=a;if(r.categoryId!==null)s.category_id=r.categoryId;if(r.manufacturerId!==null)s.manufacturer_id=r.manufacturerId}return s}function jo(e,t,r,n,o,a,s=t.sku){let i={uuid:te(e.source,r,"variant",t.externalId),product_id:n,variant:t.title,type:(e.optionNames.join(" / ")||"Option").slice(0,hg),options:JSON.stringify(t.optionValues),status:t.available?"active":"inactive",price:t.priceMinor,compare_at_price:t.compareAtMinor,updated_at:o};if(a==="create")i.sku=s,i.inventory_count=t.inventory,i.created_at=o;else{if(s!==null)i.sku=s;if(t.inventory!==null)i.inventory_count=t.inventory}return i}function uu(e){let t={...e};return delete t.uuid,t}async function bg(e){let t=V(e.storeUrl),r=Ct(t),n=e.now??(()=>new Date),{adapter:o,repository:a}=e,s={source:o.name,storeUrl:t,dryRun:e.dryRun===!0,pages:[],products:[],counts:{products:{created:0,updated:0},variants:{created:0,updated:0},categories:{created:0,updated:0},manufacturers:{created:0,updated:0},duplicates:0},currencies:[],warnings:[]},i=new Map,u=new Map,c=new Map,d=new Set;async function m(p,b,h){let f=p.categories[0];if(!f)return null;let x=i.get(f.slug);if(x!==void 0)return x;let D=await b.findCategory(f.slug,f.name);if(D===void 0)D=await b.createCategory({uuid:iu(),name:f.name,slug:f.slug,description:null,image_url:null,is_active:!0,parent_category_id:null,display_order:i.size,created_at:h,updated_at:h}),s.counts.categories.created++;return i.set(f.slug,D),D}async function l(p,b,h){if(!p.vendor)return null;let f=u.get(p.vendor);if(f!==void 0)return f;let x=await b.findManufacturer(p.vendor);if(x===void 0)x=await b.createManufacturer({uuid:iu(),manufacturer:p.vendor,description:null,country:cu,featured:!1,created_at:h,updated_at:h}),s.counts.manufacturers.created++;return u.set(p.vendor,x),x}async function y(p){let b=p.map((f)=>te(f.source,r,"product",f.externalId)),h=p.filter((f)=>f.hasOptions).flatMap((f)=>f.variants.map((x)=>te(f.source,r,"variant",x.externalId)));return{products:b.length>0?await a.findProducts(b):new Map,variants:h.length>0?await a.findVariants(h):new Map}}async function g(p,b,h){let f=yg(n()),x={categoryId:await m(p,b,f),manufacturerId:await l(p,b,f)},D=te(p.source,r,"product",p.externalId),v=h.products.get(D),F=v===void 0?"create":"update",k;if(v===void 0)k=await b.createProduct(Lo(p,r,x,f,"create"));else k=v,await b.updateProduct(k,uu(Lo(p,r,x,f,"update")));let S={create:0,update:0};if(p.hasOptions){let{skus:C,warnings:O}=lu(p);s.warnings.push(...O);let M=[...C.values()].filter((re)=>re!==null);if(v!==void 0&&M.length>0)await b.releaseVariantSkus(k,M);for(let re of p.variants){let G=C.get(re.externalId)??null,_t=h.variants.get(te(p.source,r,"variant",re.externalId));if(_t===void 0)await b.createVariant(jo(p,re,r,k,f,"create",G)),S.create++;else await b.updateVariant(_t,uu(jo(p,re,r,k,f,"update",G))),S.update++}}return{action:F,externalId:p.externalId,name:p.name,handle:p.handle,priceMinor:zo(p.variants),currency:p.currency,variants:S,category:p.categories[0]?.name??null,vendor:p.vendor,imageCount:p.images.length}}for await(let p of o.pages(t,{limit:e.limit,fetch:e.fetch,currency:e.currency,accessKey:e.accessKey})){s.pages.push(p.url),s.warnings.push(...p.warnings);let b=[];for(let f of p.products){if(c.get(f.externalId)!==void 0){s.counts.duplicates++,s.warnings.push({externalId:f.externalId,message:`"${f.name}" appeared twice; imported once`});continue}c.set(f.externalId,f.handle),b.push(f)}let h=await y(b);for(let f of b){if(f.currency)d.add(f.currency);let x=a.transaction?await a.transaction((D)=>g(f,D,h)):await g(f,a,h);s.counts.products[x.action==="create"?"created":"updated"]++,s.counts.variants.created+=x.variants.create,s.counts.variants.updated+=x.variants.update,s.products.push(x),e.onProduct?.(x)}}if(s.currencies=[...d].sort(),s.currencies.length>1)s.warnings.push({message:`prices arrived in more than one currency (${s.currencies.join(", ")}); products.price has no currency column`});return s}function mu(e=Jo){async function t(a,s){let i=await e.selectFrom(a).where("uuid","=",s).select("id").executeTakeFirst();if(!i)throw Error(`Inserted a row into ${a} but could not read it back (uuid ${s})`);return Number(i.id)}async function r(a,s){let i=new Map;for(let u=0;u<s.length;u+=500){let c=await e.selectFrom(a).where("uuid","in",s.slice(u,u+500)).select(["id","uuid"]).execute();for(let d of c)i.set(d.uuid,Number(d.id))}return i}async function n(a){let s=await a.select("id").executeTakeFirst();return s?Number(s.id):void 0}let o={async findCategory(a,s){return await n(e.selectFrom("categories").where("slug","=",a))??await n(e.selectFrom("categories").where("name","=",s))},async createCategory(a){return await e.insertInto("categories").values(a).execute(),t("categories",a.uuid)},async findManufacturer(a){return n(e.selectFrom("manufacturers").where("manufacturer","=",a))},async createManufacturer(a){return await e.insertInto("manufacturers").values(a).execute(),t("manufacturers",a.uuid)},async findProducts(a){return r("products",a)},async createProduct(a){return await e.insertInto("products").values(a).execute(),t("products",a.uuid)},async updateProduct(a,s){await e.updateTable("products").set(s).where("id","=",a).execute()},async findVariants(a){return r("product_variants",a)},async createVariant(a){return await e.insertInto("product_variants").values(a).execute(),t("product_variants",a.uuid)},async updateVariant(a,s){await e.updateTable("product_variants").set(s).where("id","=",a).execute()},async releaseVariantSkus(a,s){for(let i=0;i<s.length;i+=500)await e.updateTable("product_variants").set({sku:null}).where("product_id","=",a).where("sku","in",s.slice(i,i+500)).execute()}};if(e===Jo)o.transaction=(a)=>Jo.transaction((s)=>a(mu(s)));return o}function _g(){let e={categories:[],manufacturers:[],products:[],product_variants:[]};function t(a,s){let i=e[a].length+1;return e[a].push({id:i,...s}),i}function r(a,s,i){let u=e[a].find((c)=>c.id===s);if(u)Object.assign(u,i)}let n=(a,s)=>new Map(e[a].filter((i)=>s.includes(i.uuid)).map((i)=>[i.uuid,i.id])),o=(a,s)=>e[a].find(s)?.id;return{tables:e,findCategory:async(a,s)=>o("categories",(i)=>i.slug===a)??o("categories",(i)=>i.name===s),createCategory:async(a)=>t("categories",a),findManufacturer:async(a)=>o("manufacturers",(s)=>s.manufacturer===a),createManufacturer:async(a)=>t("manufacturers",a),findProducts:async(a)=>n("products",a),createProduct:async(a)=>t("products",a),updateProduct:async(a,s)=>r("products",a,s),findVariants:async(a)=>n("product_variants",a),createVariant:async(a)=>t("product_variants",a),updateVariant:async(a,s)=>r("product_variants",a,s),releaseVariantSkus:async(a,s)=>{for(let i of e.product_variants)if(i.product_id===a&&s.includes(i.sku))i.sku=null}}}function xg(e){let t=-1,r=async()=>t--;return{findCategory:e.findCategory,findManufacturer:e.findManufacturer,findProducts:e.findProducts,findVariants:e.findVariants,createCategory:r,createManufacturer:r,createProduct:r,createVariant:r,updateProduct:async()=>{},updateVariant:async()=>{},releaseVariantSkus:async()=>{}}}var pu={shopify:po,woocommerce:Ao,shopware:xo};function Rg(e){return pu[e.trim().toLowerCase()]}var fu={shopify:go,woocommerce:Fo,shopware:Do};function Pg(e){return fu[e.trim().toLowerCase()]}import{db as qo}from"@stacksjs/database/runtime";import{formatDate as vg}from"@stacksjs/orm";async function yu(e){let t=await qo.deleteFrom("coupons").where("id","=",e).executeTakeFirst();return _(t)>0}async function gu(e){if(!e.length)return 0;return await qo.deleteFrom("coupons").where("id","in",e).execute()||0}async function hu(){let e=vg(new Date),t=await qo.deleteFrom("coupons").where("end_date","<",e).executeTakeFirst();return _(t)}import{db as A}from"@stacksjs/database/runtime";import{extractDate as bu,formatDate as _u}from"@stacksjs/orm";import{camelCase as Dg}from"@stacksjs/strings";function gr(e){let t=Object.fromEntries(Object.entries(e).map(([r,n])=>[Dg(r),n]));if(t.endDate)t.endDate=bu(new Date(t.endDate));if(t.startDate)t.startDate=bu(new Date(t.startDate));if(t.isActive!==void 0)t.isActive=Boolean(t.isActive);return t}async function xu(){let e=await A.selectFrom("coupons").selectAll().execute();return P(e).map(gr)}async function Ze(e){let t=await A.selectFrom("coupons").where("id","=",e).selectAll().executeTakeFirst();if(t)return gr(w(t));return}async function Ru(e){let t=await A.selectFrom("coupons").where("code","=",e).selectAll().executeTakeFirst();if(t)return gr(w(t));return}async function Pu(){let e=_u(new Date),t=await A.selectFrom("coupons").where("is_active","=",!0).where("start_date","<=",e).where("end_date",">=",e).selectAll().execute();return P(t).map(gr)}async function vu(){let e=await A.selectFrom("coupons").select(A.fn.count("id").as("count")).executeTakeFirst(),t=_u(new Date),r=await A.selectFrom("coupons").where("is_active","=",!0).where("start_date","<=",t).where("end_date",">=",t).select(A.fn.count("id").as("count")).executeTakeFirst(),n=await A.selectFrom("coupons").select(["discount_type",A.fn.count("id").as("count")]).groupBy("discount_type").execute(),o=await A.selectFrom("coupons").select(["id","code","discount_type","discount_value","usage_count"]).orderBy("usage_count","desc").limit(5).execute(),a=await A.selectFrom("coupons").where("is_active","=",!0).where("start_date",">",t).select(["id","code","discount_type","discount_value","start_date","end_date"]).orderBy("start_date","asc").limit(5).execute();return{total:Number(e?.count||0),active:Number(r?.count||0),by_type:n,most_used:o,upcoming:a}}async function Du(){let e=new Date,t=new Date(e);t.setDate(e.getDate()-7);let r=new Date(e);r.setMonth(e.getMonth()-1);let n=new Date(e);n.setFullYear(e.getFullYear()-1);let o=await yr(null,null,e),a=await yr(t,null,e),s=await yr(r,null,e),i=await yr(n,null,e);return{week:a,month:s,year:i,all_time:o}}async function yr(e,t,r){let n=A.selectFrom("coupons");if(e)n=n.where("created_at",">=",e.toISOString());if(t)n=n.where("created_at","<=",t.toISOString());let o=await n.select(A.fn.count("id").as("count")).executeTakeFirst(),a=A.selectFrom("coupons");if(e)a=a.where("created_at",">=",e.toISOString());if(t)a=a.where("created_at","<=",t.toISOString());a=a.where("is_active","=",!0).where("start_date","<=",r).where("end_date",">=",r);let s=await a.select(A.fn.count("id").as("count")).executeTakeFirst(),i=Number(o?.count||0),u=Number(s?.count||0),c=i-u;return{total:i,active:u,inactive:c}}async function Su(){let e=new Date,t=await A.selectFrom("coupons").select("discount_type").distinct().execute(),r={};for(let{discount_type:n}of t){let o=await A.selectFrom("coupons").where("discount_type","=",n).select(A.fn.count("id").as("count")).executeTakeFirst(),a=await A.selectFrom("coupons").where("discount_type","=",n).where("is_active","=",!0).where("start_date","<=",e).where("end_date",">=",e).select(A.fn.count("id").as("count")).executeTakeFirst(),s=Number(o?.count||0),i=Number(a?.count||0);r[n]={total:s,active:i,inactive:s-i}}return r}async function ku(){let e=await A.selectFrom("coupons").select(A.fn.sum("usage_count").as("total")).executeTakeFirst(),t=new Date,r=new Date(t);r.setDate(t.getDate()-7);let n=new Date(t);n.setMonth(t.getMonth()-1);let o=new Date(t);o.setFullYear(t.getFullYear()-1);let a=await A.selectFrom("coupons").where("updated_at",">=",r.toISOString()).select(A.fn.sum("usage_count").as("total")).executeTakeFirst(),s=await A.selectFrom("coupons").where("updated_at",">=",n.toISOString()).select(A.fn.sum("usage_count").as("total")).executeTakeFirst(),i=await A.selectFrom("coupons").where("updated_at",">=",o.toISOString()).select(A.fn.sum("usage_count").as("total")).executeTakeFirst(),u=await A.selectFrom("coupons").select(["discount_type",A.fn.sum("usage_count").as("total")]).groupBy("discount_type").execute(),c={};return u.forEach((d)=>{c[d.discount_type]=Number(d.total||0)}),{total:Number(e?.total||0),week:Number(a?.total||0),month:Number(s?.total||0),year:Number(i?.total||0),by_type:c}}async function Cu(e=5){return await A.selectFrom("coupons").select(["id","code","discount_type","discount_value","usage_count","start_date","end_date"]).where("usage_count",">",0).orderBy("usage_count","desc").limit(e).execute()}async function Tu(e=30){let t=new Date().toISOString(),r=new Date;r.setDate(r.getDate()-e);let n=await A.selectFrom("coupons").select(["id","code","updated_at","usage_count"]).where("updated_at",">=",r.toISOString()).where("updated_at","<=",t).where("usage_count",">",0).orderBy("updated_at","desc").execute(),o={};return n.forEach((a)=>{let s=a.updated_at?new Date(a.updated_at).toISOString().split("T")[0]??"unknown-date":"unknown-date";if(!o[s])o[s]=0;o[s]+=a?.usage_count||0}),Object.entries(o).map(([a,s])=>({date:a,count:s}))}async function Au(){let e=new Date,t=await A.selectFrom("coupons").where("is_active","=",!0).where("start_date","<=",e).where("end_date",">=",e).select(A.fn.count("id").as("count")).executeTakeFirst(),r=await A.selectFrom("coupons").where("usage_count",">",0).select(A.fn.count("id").as("count")).executeTakeFirst(),n=Number(t?.count||0),o=Number(r?.count||0);return{rate:n>0?o/n*100:0,total_active:n,total_redeemed:o}}async function Eu(){let e=new Date,t=new Date(e.getFullYear(),e.getMonth(),1),r=new Date(e.getFullYear(),e.getMonth()-1,1),n=new Date(e.getFullYear(),e.getMonth(),0),o=await A.selectFrom("coupons").select(A.fn.count("id").as("count")).where("is_active","=",!0).where("start_date","<=",e).where("end_date",">=",t).executeTakeFirst(),a=await A.selectFrom("coupons").select(A.fn.count("id").as("count")).where("is_active","=",!0).where("start_date","<=",n).where("end_date",">=",r).executeTakeFirst(),s=Number(o?.count||0),i=Number(a?.count||0),u=s-i,c=i!==0?u/i*100:s>0?100:0;return{current_month:s,previous_month:i,difference:u,percentage_change:c}}var{randomUUIDv7:Sg}=globalThis.Bun;import{db as Fu}from"@stacksjs/database/runtime";import{HttpError as Iu}from"@stacksjs/error-handling";import{isUniqueViolation as kg}from"@stacksjs/orm";async function Mu(e){try{let t=Sg();await Fu.insertInto("coupons").values({...e,uuid:t}).executeTakeFirst();let r=await Fu.selectFrom("coupons").where("uuid","=",t).selectAll().executeTakeFirst();return w(r,!0)}catch(t){if(t instanceof Iu)throw t;if(kg(t))throw new Iu(409,"A coupon with this code already exists");if(t instanceof Error)throw Error(`Failed to create coupon: ${t.message}`);throw t}}import{db as Ou,mutationCount as Cg,sqlHelpers as Tg}from"@stacksjs/database/runtime";import{env as Ag}from"@stacksjs/env";import{HttpError as Nu}from"@stacksjs/error-handling";import{formatDate as $u,isUniqueViolation as Eg}from"@stacksjs/orm";async function Bu(e,t){if(!await Ze(e))return;try{return await Ou.updateTable("coupons").set({...t,updated_at:$u(new Date)}).where("id","=",e).execute(),await Ze(e)}catch(n){if(n instanceof Nu)throw n;if(Eg(n))throw new Nu(409,"A coupon with this code already exists");if(n instanceof Error)throw Error(`Failed to update coupon: ${n.message}`);throw n}}async function Uu(e){let t=Tg(Ag.DB_CONNECTION||"sqlite"),r=t.param,n=$u(new Date),o=await Ou.unsafe(`UPDATE coupons
3
- SET usage_count = COALESCE(usage_count, 0) + 1, updated_at = ${r(1)}
4
- WHERE id = ${r(2)}
5
- AND (usage_limit IS NULL OR COALESCE(usage_count, 0) < usage_limit)
6
- AND is_active = ${t.boolTrue}
7
- AND (start_date IS NULL OR start_date <= ${r(3)})
8
- AND (end_date IS NULL OR end_date >= ${r(4)})`,[n,e,n,n]);if(Cg(o)>0){let u=await Ze(e);if(u)return{ok:!0,coupon:u};return{ok:!1,reason:"not-found"}}let a=await Ze(e);if(!a)return{ok:!1,reason:"not-found"};if(!a.isActive)return{ok:!1,reason:"inactive"};let s=!a.startDate||a.startDate<=n,i=!a.endDate||a.endDate>=n;if(!s||!i)return{ok:!1,reason:"expired"};return{ok:!1,reason:"limit-reached"}}import{db as Ju}from"@stacksjs/database/runtime";async function Wu(e){try{let t=await Ju.deleteFrom("customers").where("id","=",e).executeTakeFirst();return _(t)>0}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete customer: ${t.message}`);throw t}}async function Lu(e){if(!e.length)return 0;try{let t=await Ju.deleteFrom("customers").where("id","in",e).executeTakeFirst();return _(t)||0}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete customers in bulk: ${t.message}`);throw t}}import{db as Fg}from"@stacksjs/database/runtime";import{HttpError as ju}from"@stacksjs/error-handling";import{formatDate as Ig,isUniqueViolation as Mg}from"@stacksjs/orm";async function zu(e,t){try{if(!e)throw Error("Customer ID is required for update");let r=await Fg.updateTable("customers").set({...t,updated_at:Ig(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!r)return;return w(r)}catch(r){if(r instanceof ju)throw r;if(Mg(r))throw new ju(409,"A customer with this email already exists");if(r instanceof Error)throw Error(`Failed to update customer: ${r.message}`);throw r}}import{db as qu}from"@stacksjs/database/runtime";async function Gu(e){try{let t=await qu.deleteFrom("print_devices").where("id","=",e).executeTakeFirst();return _(t)>0}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete print device: ${t.message}`);throw t}}async function Vu(e){if(!e.length)return 0;try{let t=await qu.deleteFrom("print_devices").where("id","in",e).executeTakeFirst();return _(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete print devices: ${t.message}`);throw t}}import{createSpreadsheet as Ng}from"ts-spreadsheets";import{db as Q}from"@stacksjs/database/runtime";async function Se(e){let t=await Q.selectFrom("print_devices").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function hr(){return P(await Q.selectFrom("print_devices").selectAll().execute())}async function Hu(){let e=await Q.selectFrom("print_devices").select(Q.fn.count("id").as("count")).executeTakeFirst();return Number(e?.count||0)}async function Ku(){let e=await Q.selectFrom("print_devices").select(Q.fn.sum("print_count").as("total")).executeTakeFirst();return Number(e?.total||0)}async function Zu(e){let t=await Q.selectFrom("print_devices").select("print_count").where("id","=",e).executeTakeFirst();return Number(t?.print_count??0)}async function Qu(){let e=await Q.selectFrom("receipts").select([Q.fn.count("id").as("total"),Q.fn.count("id").filterWhere("status","=","failed").as("failed_count")]).executeTakeFirst();if(!e?.total||e.total===0)return 0;return Number(Number(e?.failed_count??0)/Number(e?.total??0)*100)}async function Yu(e){let t=await Q.selectFrom("receipts").where("print_device_id","=",e).where("status","=","failed").selectAll().execute();return P(t)}async function Xu(){let e=await Q.selectFrom("print_devices").select([Q.fn.count("id").as("total"),Q.fn.count("id").filterWhere("status","=","online").as("online_count")]).executeTakeFirst();if(!e?.total||e.total===0)return 0;return Number(Number(e?.online_count??0)/Number(e?.total??0)*100)}async function ec(){return(await Q.selectFrom("print_devices").select(["status",Q.fn.count("id").as("count")]).groupBy("status").execute()).reduce((t,r)=>(t[r.status]=Number(r.count||0),t),{})}function Ho(e,t,r=t){let n=e;return n[String(t)]??n[r]}function Og(e){if(e instanceof Date)return e;if(typeof e==="number")return new Date(e);if(typeof e==="string")return new Date(/^\d+$/.test(e)?Number(e):e);return new Date(Number.NaN)}function tc(e,t,r=t){let n=Ho(e,t,r);if(typeof n==="number")return n;let o=Number(n);return Number.isFinite(o)?o:0}function Et(e,t,r=t){let n=Ho(e,t,r);return n==null?"":String(n)}async function br(e="csv"){let t=await hr(),r=$g(t);return Ng(r,{type:e})}function $g(e){let t=["Device ID","Name","MAC Address","Location","Terminal","Status","Last Ping","Print Count"],r=e.map((n)=>[tc(n,"id"),Et(n,"name"),Et(n,"macAddress","mac_address"),Et(n,"location"),Et(n,"terminal"),Et(n,"status"),Og(Ho(n,"lastPing","last_ping")).toLocaleString(),tc(n,"printCount","print_count")]);return{headings:t,data:r}}async function rc(e="csv",t){let r=await br(e),n=`print_devices_export_${new Date().toISOString().split("T")[0]}.${e}`;return r.download(t||n)}async function nc(e="csv",t){let r=await br(e),n=`print_devices_export_${new Date().toISOString().split("T")[0]}.${e}`;r.store(t||n)}var{randomUUIDv7:oc}=globalThis.Bun;import{db as Ko}from"@stacksjs/database/runtime";async function ac(e){try{let t=oc(),r={last_ping:0,print_count:0,...e,uuid:t};await Ko.insertInto("print_devices").values(r).executeTakeFirst();let n=await Ko.selectFrom("print_devices").where("uuid","=",t).selectAll().executeTakeFirst();return w(n,!0)}catch(t){if(t instanceof Error)throw TypeError(`Failed to create print device: ${t.message}`);throw t}}async function sc(e){if(!e.length)return 0;let t=0;try{for(let r of e){let n={last_ping:0,print_count:0,...r,uuid:oc()};await Ko.insertInto("print_devices").values(n).execute(),t++}return t}catch(r){if(r instanceof Error)throw TypeError(`Failed to create print devices in bulk: ${r.message}`);throw r}}import{db as Zo}from"@stacksjs/database/runtime";import{formatDate as Qo}from"@stacksjs/orm";async function ic(e,t){if(!await Se(e))return;try{return await Zo.updateTable("print_devices").set({...t,updated_at:Qo(new Date)}).where("id","=",e).execute(),await Se(e)}catch(n){if(n instanceof Error)throw TypeError(`Failed to update print device: ${n.message}`);throw n}}async function uc(e,t){if(!await Se(e))throw Error(`Print device with ID ${e} not found`);try{return await Zo.updateTable("print_devices").set({status:t,updated_at:Qo(new Date)}).where("id","=",e).execute(),await Se(e)}catch(n){if(n instanceof Error)throw TypeError(`Failed to update print device status: ${n.message}`);throw n}}async function cc(e,t){if(!await Se(e))throw Error(`Print device with ID ${e} not found`);try{return await Zo.updateTable("print_devices").set({print_count:t,updated_at:Qo(new Date)}).where("id","=",e).execute(),await Se(e)}catch(n){if(n instanceof Error)throw TypeError(`Failed to update print count: ${n.message}`);throw n}}import{db as Xo}from"@stacksjs/database/runtime";import{log as ea}from"@stacksjs/logging";async function dc(e){try{return await Xo.deleteFrom("errors").where("id","=",e).execute(),!0}catch(t){return ea.error("[commerce/errors] destroy failed",{id:e,error:t}),!1}}async function lc(e){try{return await Xo.deleteFrom("errors").where("id","in",e).execute(),!0}catch(t){return ea.error("[commerce/errors] bulkDestroy failed",{count:e.length,error:t}),!1}}async function mc(e,t){try{return await Xo.deleteFrom("errors").where("type","=",e).where("message","=",t).execute(),!0}catch(r){return ea.error("[commerce/errors] destroyGroup failed",{type:e,message:t,error:r}),!1}}import{db as _r}from"@stacksjs/database/runtime";async function pc(e){return await _r.selectFrom("errors").where("id","=",e).selectAll().executeTakeFirst()}async function xr(){return await _r.selectFrom("errors").selectAll().orderBy("created_at","desc").execute()}async function fc(){let e=await _r.selectFrom("errors").selectAll().orderBy("created_at","desc").execute(),t=new Map;for(let n of e){let o=`${n.type}:${n.message}`;if(!t.has(o))t.set(o,{errors:[],firstSeen:new Date(n.created_at),lastSeen:new Date(n.created_at)});let a=t.get(o);a.errors.push(n);let s=new Date(n.created_at);if(s<a.firstSeen)a.firstSeen=s;if(s>a.lastSeen)a.lastSeen=s}let r=[];for(let[n,o]of t){let a=o.errors[0];if(!a)continue;let s=o.errors.find((u)=>u.status!==null)?.status,i="unresolved";if(s===1)i="resolved";else if(s===2)i="ignored";r.push({id:a.id,type:a.type,message:a.message,stack:a.stack,status:i,count:o.errors.length,first_seen:o.firstSeen.toISOString(),last_seen:o.lastSeen.toISOString(),error_ids:o.errors.map((u)=>u.id)})}return r.sort((n,o)=>new Date(o.last_seen).getTime()-new Date(n.last_seen).getTime()),r}async function wc(e,t){return await _r.selectFrom("errors").where("type","=",e).where("message","=",t).selectAll().orderBy("created_at","desc").execute()}async function yc(){let e=await xr(),t=new Date,r=new Date(t.getTime()-86400000),n=new Date(t.getTime()-172800000),o=e.filter((i)=>new Date(i.created_at)>=r).length,a=e.filter((i)=>{let u=new Date(i.created_at);return u>=n&&u<r}).length,s=a===0?o>0?100:0:Math.round((o-a)/a*100);return{total:e.length,unresolved:e.filter((i)=>i.status===null||i.status===0).length,resolved:e.filter((i)=>i.status===1).length,ignored:e.filter((i)=>i.status===2).length,last_24h:o,trend:s}}async function gc(){let e=await xr(),t=new Date,r=[];for(let n=23;n>=0;n--){let o=new Date(t.getTime()-n*60*60*1000);o.setMinutes(0,0,0);let a=new Date(o.getTime()+3600000),s=e.filter((i)=>{let u=new Date(i.created_at);return u>=o&&u<a}).length;r.push({hour:o.toISOString(),count:s})}return r}import{db as Ft}from"@stacksjs/database/runtime";import{sql as It}from"@stacksjs/database/runtime";import{log as Mt}from"@stacksjs/logging";async function hc(e,t){try{return await Ft.updateTable("errors").set({...t,updated_at:It.raw("CURRENT_TIMESTAMP")}).where("id","=",e).execute(),!0}catch(r){return Mt.error("[commerce/errors] update failed",{id:e,error:r}),!1}}async function bc(e,t){try{return await Ft.updateTable("errors").set({status:t,updated_at:It.raw("CURRENT_TIMESTAMP")}).where("id","in",e).execute(),!0}catch(r){return Mt.error("[commerce/errors] bulkUpdateStatus failed",{count:e.length,status:t,error:r}),!1}}async function _c(e,t){try{return await Ft.updateTable("errors").set({status:1,updated_at:It.raw("CURRENT_TIMESTAMP")}).where("type","=",e).where("message","=",t).execute(),!0}catch(r){return Mt.error("[commerce/errors] resolveGroup failed",{type:e,message:t,error:r}),!1}}async function xc(e,t){try{return await Ft.updateTable("errors").set({status:2,updated_at:It.raw("CURRENT_TIMESTAMP")}).where("type","=",e).where("message","=",t).execute(),!0}catch(r){return Mt.error("[commerce/errors] ignoreGroup failed",{type:e,message:t,error:r}),!1}}async function Rc(e,t){try{return await Ft.updateTable("errors").set({status:0,updated_at:It.raw("CURRENT_TIMESTAMP")}).where("type","=",e).where("message","=",t).execute(),!0}catch(r){return Mt.error("[commerce/errors] unresolveGroup failed",{type:e,message:t,error:r}),!1}}import{db as Rr,matchedRows as Jg}from"@stacksjs/database/runtime";import{formatDate as Ec}from"@stacksjs/orm";import{db as W,sql as ae}from"@stacksjs/database/runtime";import{formatDate as Je,toTimestamp as ct}from"@stacksjs/orm";import{aggregateFunctions as Bg,db as Ug}from"@stacksjs/database/runtime";async function ue(e,t,r){let n=Ug.selectFrom(e);if(r)n=r(n);n=n.select(Object.entries(t).map(([s,i])=>{let u=i.column??"id",c=Bg[i.kind](u);if(i.filter)c=c.filterWhere(i.filter.column,i.filter.op,i.filter.value);return c.as(s)}));let o=await n.executeTakeFirst(),a={};for(let s of Object.keys(t)){let i=o?.[s];a[s]=typeof i==="number"?i:Number(i??0)||0}return a}async function Pc(){let e=await W.selectFrom("gift_cards").selectAll().execute();return P(e)}async function ke(e){let t=await W.selectFrom("gift_cards").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function ra(e){let t=await W.selectFrom("gift_cards").where("code","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function vc(){let e=await W.selectFrom("gift_cards").where("is_active","=",!0).selectAll().execute();return P(e)}async function Dc(){let{count:e}=await ue("gift_cards",{count:{kind:"count"}}),t=ct(new Date),r=await W.selectFrom("gift_cards").where("is_active","=",!0).where("status","=","ACTIVE").whereRaw(ae`(expiry_date >= ${ae.literal(t)} OR expiry_date IS NULL)`).select(W.fn.count("id").as("count")).executeTakeFirst(),n=await W.selectFrom("gift_cards").select(["status",W.fn.count("id").as("count")]).groupBy("status").execute(),{count:o}=await ue("gift_cards",{count:{kind:"count"}},(d)=>d.whereRaw(ae`current_balance / initial_balance < 0.25`)),{count:a}=await ue("gift_cards",{count:{kind:"count"}},(d)=>d.whereRaw(ae`current_balance / initial_balance >= 0.25 AND current_balance / initial_balance <= 0.75`)),{count:s}=await ue("gift_cards",{count:{kind:"count"}},(d)=>d.whereRaw(ae`current_balance / initial_balance > 0.75`)),i=new Date;i.setDate(i.getDate()+30);let u=await W.selectFrom("gift_cards").where("is_active","=",!0).where("status","=","ACTIVE").where("expiry_date","<=",ct(i)).where("expiry_date",">=",t).selectAll().limit(5).execute(),c=await W.selectFrom("gift_cards").whereNotNull("last_used_date").selectAll().limit(5).execute();return{total:e,active:Number(r?.count||0),by_status:n.map((d)=>({status:d.status,count:Number(d.count)})),by_balance:{low:o,medium:a,high:s},expiring_soon:P(u),recently_used:P(c)}}async function Sc(e){let t=await ra(e);if(!t)return{valid:!1,message:"Gift card not found"};if(!t.isActive||t.status!=="ACTIVE")return{valid:!1,balance:t.currentBalance,currency:t.currency,message:`Gift card is ${t.status.toLowerCase()}`};if(t.expiryDate){if(new Date(t.expiryDate)<new Date)return{valid:!1,balance:t.currentBalance,currency:t.currency,message:"Gift card has expired"}}return{valid:!0,balance:t.currentBalance,currency:t.currency}}async function kc(e=30){let t=new Date,r=new Date(t);r.setDate(t.getDate()-e);let n=new Date(r);n.setDate(n.getDate()-1);let o=new Date(n);o.setDate(n.getDate()-e);let a=await W.selectFrom("gift_cards").select(W.fn.count("id").as("count")).where("is_active","=",!0).where("status","=","ACTIVE").whereRaw(ae`(expiry_date >= ${ae.literal(ct(t))} OR expiry_date IS NULL)`).where("created_at",">=",Je(r)).where("created_at","<=",Je(t)).executeTakeFirst(),s=await W.selectFrom("gift_cards").select(W.fn.count("id").as("count")).where("is_active","=",!0).where("status","=","ACTIVE").whereRaw(ae`(expiry_date >= ${ae.literal(ct(o))} OR expiry_date IS NULL)`).where("created_at",">=",Je(o)).where("created_at","<=",Je(n)).executeTakeFirst(),i=Number(a?.count||0),u=Number(s?.count||0),c=i-u,d=u!==0?c/u*100:i>0?100:0;return{current_period:i,previous_period:u,difference:c,percentage_change:d,days_range:e}}async function Cc(e=30){let t=new Date,r=new Date(t);r.setDate(t.getDate()-e);let n=new Date(r);n.setDate(n.getDate()-1);let o=new Date(n);o.setDate(n.getDate()-e);let a=await W.selectFrom("gift_cards").select([W.fn.sum("initial_balance").as("total_initial"),W.fn.sum("current_balance").as("total_balance"),W.fn.count("id").as("card_count")]).where("is_active","=",!0).where("status","=","ACTIVE").whereRaw(ae`(expiry_date >= ${ae.literal(ct(t))} OR expiry_date IS NULL)`).where("created_at",">=",Je(r)).where("created_at","<=",Je(t)).executeTakeFirst(),s=await W.selectFrom("gift_cards").select([W.fn.sum("initial_balance").as("total_initial"),W.fn.sum("current_balance").as("total_balance"),W.fn.count("id").as("card_count")]).where("is_active","=",!0).where("status","=","ACTIVE").whereRaw(ae`(expiry_date >= ${ae.literal(ct(o))} OR expiry_date IS NULL)`).where("created_at",">=",Je(o)).where("created_at","<=",Je(n)).executeTakeFirst(),i=Number(a?.total_initial||0),u=Number(a?.total_balance||0),c=Number(a?.card_count||0),d=Number(s?.total_initial||0),m=Number(s?.total_balance||0),l=Number(s?.card_count||0),y=i>0?(i-u)/i*100:0,g=d>0?(d-m)/d*100:0,p=c>0?i/c:0,b=c>0?u/c:0,h=i-d,f=u-m,x=c-l,D=d!==0?h/d*100:i>0?100:0,v=m!==0?f/m*100:u>0?100:0,F=l!==0?x/l*100:c>0?100:0;return{current_period:{total_initial_value:i,total_remaining_balance:u,utilization_rate:y,card_count:c,average_initial_value:p,average_remaining_balance:b},previous_period:{total_initial_value:d,total_remaining_balance:m,utilization_rate:g,card_count:l},comparison:{initial_value:{difference:h,percentage:Math.abs(D),is_increase:h>=0},balance:{difference:f,percentage:Math.abs(v),is_increase:f>=0},card_count:{difference:x,percentage:Math.abs(F),is_increase:x>=0}},days_range:e}}async function Tc(){let{total_value:e}=await ue("gift_cards",{total_value:{kind:"sum",column:"initial_balance"}});return{total_value:e}}async function Ac(){let{total_balance:e}=await ue("gift_cards",{total_balance:{kind:"sum",column:"current_balance"}});return{total_balance:e}}async function Fc(e){let t=await Rr.deleteFrom("gift_cards").where("id","=",e).executeTakeFirst();return _(t)>0}async function Ic(e){if(!e.length)return 0;let t=await Rr.deleteFrom("gift_cards").where("id","in",e).executeTakeFirst();return _(t)}async function Mc(){let e=Ec(new Date),t=await Rr.deleteFrom("gift_cards").where("expiry_date","<",e).executeTakeFirst();return _(t)}async function Nc(e){if(!await ke(e))throw Error(`Gift card with ID ${e} not found`);return(await Jg(Rr.updateTable("gift_cards").set({is_active:!1,status:"DEACTIVATED",updated_at:Ec(new Date)}).where("id","=",e))).length>0}var{randomUUIDv7:Wg}=globalThis.Bun;import{db as na}from"@stacksjs/database/runtime";import{HttpError as Oc}from"@stacksjs/error-handling";import{isUniqueViolation as Lg}from"@stacksjs/orm";async function $c(e){let t=e,r={...e,current_balance:t.current_balance??t.initial_balance,status:e.status||"ACTIVE",is_active:t.is_active??!0,uuid:Wg()};try{let n=await na.insertInto("gift_cards").values(r).executeTakeFirst(),o=De(n);if(o!==void 0){let s=await na.selectFrom("gift_cards").where("id","=",o).selectAll().executeTakeFirst();return w(s)}let a=await na.selectFrom("gift_cards").where("uuid","=",r.uuid).selectAll().executeTakeFirst();return w(a,!0)}catch(n){if(n instanceof Oc)throw n;if(Lg(n))throw new Oc(409,"A gift card with this code already exists");if(n instanceof Error)throw Error(`Failed to create gift card: ${n.message}`);throw n}}import{db as Jc,mutationCount as jg,parseSqlDateTime as Bc,sqlHelpers as zg}from"@stacksjs/database/runtime";import{env as qg}from"@stacksjs/env";import{HttpError as Uc}from"@stacksjs/error-handling";import{formatDate as Wc,isUniqueViolation as Gg}from"@stacksjs/orm";async function Lc(e,t){if(!await ke(e))return;try{return await Jc.updateTable("gift_cards").set({...t,updated_at:Wc(new Date)}).where("id","=",e).execute(),await ke(e)}catch(n){if(n instanceof Uc)throw n;if(Gg(n))throw new Uc(409,"A gift card with this code already exists");if(n instanceof Error)throw Error(`Failed to update gift card: ${n.message}`);throw n}}async function jc(e,t){if(!Number.isFinite(t))throw Error(`Gift card balance adjustment must be a finite number, got ${t}`);let r=zg(qg.DB_CONNECTION||"sqlite"),n=r.param,o=Wc(new Date),a=t<0,s=t>0,i=s?`(status = 'ACTIVE' OR (status = 'USED' AND is_reloadable = ${r.boolTrue}))`:"status = 'ACTIVE'",u=[],c=(p)=>(u.push(p),n(u.length)),d=await Jc.unsafe(`UPDATE gift_cards
9
- SET status = CASE WHEN current_balance + ${c(t)} = 0 THEN 'USED' WHEN 1 = 0 THEN status ELSE 'ACTIVE' END,
10
- current_balance = current_balance + ${c(t)},
11
- ${a?`last_used_date = ${c(o)},
12
- `:""}updated_at = ${c(o)}
13
- WHERE id = ${c(e)}
14
- AND is_active = ${r.boolTrue}
15
- AND ${i}
16
- AND (expiry_date IS NULL OR expiry_date >= ${c(o)})
17
- AND current_balance + ${c(t)} >= 0`,u);if(jg(d)>0)return await ke(e);let m=await ke(e);if(!m)throw Error(`Gift card with ID ${e} not found`);let l=m;if(!l.is_active&&!l.isActive)throw Error("Gift card is not active");if(m.status==="USED"&&s&&!(l.is_reloadable??l.isReloadable))throw Error("Gift card is not reloadable");if(m.status!=="ACTIVE")throw Error("Gift card is not active");let y=Bc(l.expiry_date??l.expiryDate),g=Bc(o);if(y&&g&&y.getTime()<g.getTime())throw Error("Gift card has expired");if(t===0&&Number(l.current_balance??l.currentBalance)>=0)return m;throw Error("Insufficient gift card balance")}import{db as Pr,matchedRows as zc}from"@stacksjs/database/runtime";async function qc(e){try{let t=await Pr.deleteFrom("orders").where("id","=",e).executeTakeFirst();return _(t)>0}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete order: ${t.message}`);throw t}}async function Gc(e){try{return(await zc(Pr.updateTable("orders").set({status:"CANCELED"}).where("id","=",e))).length>0}catch(t){if(t instanceof Error)throw TypeError(`Failed to soft delete order: ${t.message}`);throw t}}async function Vc(e){if(!e.length)return 0;try{let t=await Pr.deleteFrom("orders").where("id","in",e).executeTakeFirst();return _(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete orders: ${t.message}`);throw t}}async function Hc(e){if(!e.length)return 0;try{return(await zc(Pr.updateTable("orders").set({status:"CANCELED"}).where("id","in",e))).length}catch(t){if(t instanceof Error)throw TypeError(`Failed to soft delete orders: ${t.message}`);throw t}}import{db as vr}from"@stacksjs/database/runtime";import{createSpreadsheet as Vg}from"ts-spreadsheets";async function Dr(e="csv"){let t=await Kg(),r=Zg(t);return Vg(r,{type:e})}var Hg=500;function aa(e,t=Hg){let r=[];for(let n=0;n<e.length;n+=t)r.push(e.slice(n,n+t));return r}function sa(e){let t=new Set;for(let r of e){let n=Number(r);if(Number.isSafeInteger(n)&&n>0)t.add(n)}return[...t]}async function Kg(){let e=await vr.selectFrom("orders").selectAll().orderBy("id","asc").execute();if(e.length===0)return[];let t=sa(e.map((i)=>i.id)),r=sa(e.map((i)=>i.customer_id)),n=new Map;for(let i of aa(r)){let u=await vr.selectFrom("customers").where("id","in",i).select(["id","name","email"]).execute();for(let c of u)n.set(Number(c.id),c)}let o=[];for(let i of aa(t)){let u=await vr.selectFrom("order_items").where("order_id","in",i).select(["id","order_id","product_id","quantity","price"]).orderBy("id","asc").execute();o.push(...u)}let a=new Map;for(let i of aa(sa(o.map((u)=>u.product_id)))){let u=await vr.selectFrom("products").where("id","in",i).select(["id","name"]).execute();for(let c of u)a.set(Number(c.id),c)}let s=new Map;for(let i of o){let u=Number(i.order_id),c={...i,product:a.get(Number(i.product_id))},d=s.get(u);if(d)d.push(c);else s.set(u,[c])}return e.map((i)=>{let u=s.get(Number(i.id))??[],c=n.get(Number(i.customer_id));return{...i,customer:c,customer_name:c?.name??null,customer_email:c?.email??null,order_items:u,totalItems:u.reduce((d,m)=>d+Number(m.quantity??0),0),totalPrice:u.reduce((d,m)=>d+Number(m.price??0)*Number(m.quantity??0),0)}})}function Zg(e){let t=["Order ID","Customer","Date","Total","Status","Items"],r=e.map((n)=>{let o=typeof n.currency==="string"&&n.currency?n.currency:null,a=n.order_items?.map((s)=>`${s.product?.name||`Product #${s.product_id??"?"}`} (Qty: ${s.quantity}, Price: ${ne(Number(s.price??0),o)})`).join(" | ")||"No Items";return[n.id,n.customer?.name||n.customer_name||"N/A",n.created_at,ne(Number(n.total_amount??0),o),n.status,a]});return{headings:t,data:r}}async function Kc(e="csv",t){let r=await Dr(e),n=`orders_export_${new Date().toISOString().split("T")[0]}.${e}`;return r.download(t||n)}async function Zc(e="csv",t){let r=await Dr(e),n=`orders_export_${new Date().toISOString().split("T")[0]}.${e}`;r.store(t||n)}import{db as B}from"@stacksjs/database/runtime";async function ia(e){let t=B.selectFrom("orders").selectAll().orderBy("created_at","desc");if(e)t=t.limit(e);let r=P(await t.execute());return await Promise.all(r.map(async(n)=>{let o=await B.selectFrom("order_items").where("order_id","=",n.id).selectAll().execute();return{...n,items:o}}))}async function Qc(e=10){return ia(e)}async function Ce(e){let t=await B.selectFrom("orders").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function Yc(){let e=await B.selectFrom("orders").select(B.fn.count("id").as("count")).executeTakeFirst(),t=await B.selectFrom("orders").select(["status",B.fn.count("id").as("count")]).groupBy("status").execute(),r=await B.selectFrom("orders").select(["order_type",B.fn.count("id").as("count")]).groupBy("order_type").execute(),n=P(await B.selectFrom("orders").selectAll().orderBy("created_at","desc").limit(5).execute()),o=await Promise.all(n.map(async(s)=>{let i=await B.selectFrom("order_items").where("order_id","=",s.id).selectAll().execute();return{...s,items:i}})),a=await B.selectFrom("orders").select(B.fn.sum("total_amount").as("total")).executeTakeFirst();return{total:Number(e?.count||0),by_status:t,by_type:r,recent:o,revenue:Number(a?.total||0)}}async function Xc(e=30){let t=new Date,r=new Date(t);r.setDate(t.getDate()-e);let n=new Date(r);n.setDate(n.getDate()-1);let o=new Date(n);o.setDate(n.getDate()-e);let a=await B.selectFrom("orders").select(B.fn.count("id").as("count")).where("created_at",">=",r.toISOString()).where("created_at","<=",t.toISOString()).executeTakeFirst(),s=await B.selectFrom("orders").select(B.fn.count("id").as("count")).where("created_at",">=",o.toISOString()).where("created_at","<=",n.toISOString()).executeTakeFirst(),i=Number(a?.count||0),u=Number(s?.count||0),c=i-u,d=u!==0?c/u*100:i>0?100:0;return{current_period:i,previous_period:u,difference:c,percentage_change:d,days_range:e}}async function ed(e=30){let t=new Date,r=new Date(t);r.setDate(t.getDate()-e);let n=new Date(r);n.setDate(n.getDate()-1);let o=new Date(n);o.setDate(n.getDate()-e);let a=await B.selectFrom("orders").select([B.fn.count("id").as("total_orders"),B.fn.sum("total_amount").as("total_revenue")]).where("created_at",">=",r.toISOString()).where("created_at","<=",t.toISOString()).executeTakeFirst(),s=await B.selectFrom("orders").select([B.fn.count("id").as("total_orders"),B.fn.sum("total_amount").as("total_revenue")]).where("created_at",">=",o.toISOString()).where("created_at","<=",n.toISOString()).executeTakeFirst(),i=await B.selectFrom("orders").select(["status",B.fn.count("id").as("count")]).where("created_at",">=",r.toISOString()).where("created_at","<=",t.toISOString()).groupBy("status").execute(),u=await B.selectFrom("orders").select(["order_type",B.fn.count("id").as("count")]).where("created_at",">=",r.toISOString()).where("created_at","<=",t.toISOString()).groupBy("order_type").execute(),c=Number(a?.total_orders||0),d=Number(a?.total_revenue||0),m=c>0?d/c:0,l=Number(s?.total_orders||0),y=Number(s?.total_revenue||0),g=l>0?y/l:0,p=c-l,b=d-y,h=m-g,f=l!==0?p/l*100:c>0?100:0,x=y!==0?b/y*100:d>0?100:0,D=g!==0?h/g*100:m>0?100:0;return{current_period:{total_orders:c,total_revenue:d,average_order_value:m,orders_by_status:i.map((v)=>({status:v.status,count:Number(v.count)})),orders_by_type:u.map((v)=>({order_type:v.order_type,count:Number(v.count)}))},previous_period:{total_orders:l,total_revenue:y,average_order_value:g},comparison:{orders:{difference:p,percentage:Math.abs(f),is_increase:p>=0},revenue:{difference:b,percentage:Math.abs(x),is_increase:b>=0},average_order_value:{difference:h,percentage:Math.abs(D),is_increase:h>=0}},days_range:e}}async function td(e=30){let t=new Date,r=new Date(t);r.setDate(t.getDate()-e);let n=await B.selectFrom("orders").select(["created_at","total_amount"]).where("created_at",">=",r.toISOString()).where("created_at","<=",t.toISOString()).orderBy("created_at","asc").execute(),o=new Map;for(let a of n){let s=(a.created_at||"").split("T")[0]||"unknown",i=o.get(s)||{order_count:0,revenue:0};i.order_count++,i.revenue+=Number(a.total_amount||0),o.set(s,i)}return Array.from(o.entries()).map(([a,s])=>({date:a,order_count:s.order_count,revenue:s.revenue}))}var{randomUUIDv7:Qg}=globalThis.Bun;import{db as ua}from"@stacksjs/database/runtime";import{formatDate as rd}from"@stacksjs/orm";async function nd(e){let t={...e,status:e.status||"PENDING",uuid:Qg(),created_at:rd(new Date),updated_at:rd(new Date)};try{let r=await ua.insertInto("orders").values(t).executeTakeFirst(),n=De(r);if(n!==void 0){let a=await ua.selectFrom("orders").where("id","=",n).selectAll().executeTakeFirst();return w(a,!0)}let o=await ua.selectFrom("orders").where("uuid","=",t.uuid).selectAll().executeTakeFirst();return w(o,!0)}catch(r){if(r instanceof Error)throw Error(`Failed to create order: ${r.message}`);throw r}}var{randomUUIDv7:od}=globalThis.Bun;import{db as ma}from"@stacksjs/database/runtime";Xe();import{formatDate as nh,isUniqueViolation as ad}from"@stacksjs/orm";import{sqlHelpers as eh}from"@stacksjs/database/runtime";import{env as th}from"@stacksjs/env";function rh(e,t,r,n){let o=eh(e).param;return{query:`UPDATE products
18
- SET inventory_count = inventory_count + ${o(1)},
19
- updated_at = ${o(2)}
20
- WHERE id = ${o(3)}
21
- AND inventory_count + ${o(4)} >= 0`,parameters:[r,n,t,r]}}async function la(e,t,r,n){let o=rh(th.DB_CONNECTION||"sqlite",t,r,n),a=await e.unsafe(o.query,o.parameters);return _(a)}var sd=!1;function id(e){let t=e,r=t?.message??"";return t?.code==="42P01"||r.includes("no such table")||r.includes("doesn't exist")||/relation "[^"]*" does not exist/i.test(r)}async function kr(e){try{let t=await ma.selectFrom("order_idempotency").where("idempotency_key","=",e).selectAll().executeTakeFirst();if(!t)return null;return await ma.selectFrom("orders").where("id","=",t.order_id).selectAll().executeTakeFirst()??null}catch(t){if(id(t)){if(!sd)sd=!0,console.warn("[commerce/orders] order_idempotency table missing - idempotency keys are accepted but NOT enforced. Run migrations to enable dedup.");return null}throw t}}async function ud(e){if(e.idempotencyKey){let t=await kr(e.idempotencyKey);if(t)return{ok:!0,order:t}}try{let t=await ma.transaction(async(r)=>{let n=nh(new Date),o=od(),a={...e.order,status:e.order.status||"PENDING",uuid:o,created_at:n,updated_at:n};await r.insertInto("orders").values(a).executeTakeFirst();let s=w(await r.selectFrom("orders").where("uuid","=",o).selectAll().executeTakeFirst(),!0),i=Number(s?.id);if(!Number.isSafeInteger(i)||i<=0)throw Object.assign(Error("order insert could not be resolved by uuid"),{__placeFail:!0,failedAt:"order",reason:"unknown"});let u;if(e.items&&e.items.length>0){let m=e.items.map((l)=>{if(!Number.isInteger(l.productId)||l.productId<=0)throw Object.assign(Error("order item product id must be a positive integer"),{__placeFail:!0,failedAt:"items",reason:"unknown"});if(!Number.isInteger(l.quantity)||l.quantity<=0)throw Object.assign(Error("order item quantity must be a positive integer"),{__placeFail:!0,failedAt:"items",reason:"unknown"});if(!Number.isFinite(l.price)||l.price<0)throw Object.assign(Error("order item price must be a non-negative finite number"),{__placeFail:!0,failedAt:"items",reason:"unknown"});return{order_id:i,product_id:l.productId,quantity:l.quantity,price:l.price,special_instructions:l.specialInstructions||null,created_at:n,updated_at:n}});await r.insertInto("order_items").values(m).execute(),u=P(await r.selectFrom("order_items").where("order_id","=",i).selectAll().execute())}let c;if(e.payment)try{let m=od();if(await r.insertInto("payments").values({...e.payment,order_id:i,uuid:m,created_at:n,updated_at:n}).executeTakeFirst(),c=w(await r.selectFrom("payments").where("uuid","=",m).selectAll().executeTakeFirst(),!0),!c)throw Object.assign(Error("payment insert could not be resolved by uuid"),{__placeFail:!0,failedAt:"payment",reason:"unknown"})}catch(m){if(ad(m))throw Object.assign(Error("duplicate payment transaction_id"),{__placeFail:!0,failedAt:"payment",reason:"duplicate-payment"});throw Object.assign(m,{__placeFail:!0,failedAt:"payment",reason:"unknown"})}if(e.inventory&&e.inventory.length>0)for(let m=0;m<e.inventory.length;m++){let{id:l,delta:y}=e.inventory[m];if(!Number.isFinite(y)||y===0)throw Object.assign(Error("inventory delta must be a non-zero finite number"),{__placeFail:!0,failedAt:"inventory",reason:"unknown"});if(!await la(r,l,y,n))throw Object.assign(Error(`inventory adjust failed for product ${l}`),{__placeFail:!0,failedAt:"inventory",reason:"out-of-stock"})}if(e.idempotencyKey)try{await r.insertInto("order_idempotency").values({idempotency_key:e.idempotencyKey,order_id:i,created_at:n}).execute()}catch(m){if(ad(m))throw Object.assign(Error("idempotency-key collision"),{__placeFail:!0,failedAt:"idempotency",reason:"duplicate-idempotency-key"});if(!id(m))throw m}let d=w(await r.selectFrom("orders").where("id","=",i).selectAll().executeTakeFirst(),!0);if(!d)throw Object.assign(Error("order disappeared mid-transaction"),{__placeFail:!0,failedAt:"order",reason:"unknown"});return{order:d,items:u,payment:c}});if(Sr(t.order),t.payment)Ye(t.order,t.payment);return{ok:!0,order:t.order,items:t.items,payment:t.payment}}catch(t){if(t?.__placeFail){if(t.reason==="duplicate-idempotency-key"&&e.idempotencyKey){let r=await kr(e.idempotencyKey);if(r)return{ok:!0,order:r}}return{ok:!1,reason:t.reason,failedAt:t.failedAt,error:t}}throw t}}Xe();import{db as pa,enqueueAfterCommit as oh}from"@stacksjs/database/runtime";async function $t(e,t,r,n={}){if(!be(t,r))throw Error(`Illegal order transition ${t} -> ${r}`);if(t===r)return!1;return pa.transaction(async(o)=>{if(!(await pa.updateTable("orders").set({...n.values,status:r,updated_at:new Date().toISOString()}).where("id","=",e).where("status","=",t).returning("id").execute()).length)return!1;let s=await pa.selectFrom("orders").selectAll().where("id","=",e).executeTakeFirst();if(!s)throw Error(`Order ${e} disappeared during transition`);await n.apply?.(o,s);let i=()=>dt(r,s);if(!oh(i))await i();return!0})}Xe();import{db as cd}from"@stacksjs/database/runtime";import{formatDate as dd}from"@stacksjs/orm";Xe();async function ld(e,t){if(!await Ce(e))return;try{return await cd.updateTable("orders").set({...t,updated_at:dd(new Date)}).where("id","=",e).execute(),await Ce(e)}catch(n){if(n instanceof Error)throw TypeError(`Failed to update order: ${n.message}`);throw n}}async function md(e,t){let r=await Ce(e);if(!r)throw Error(`Order with ID ${e} not found`);let n=r.status??"PENDING";if(!be(n,t))throw Error(`[commerce/orders] illegal status transition ${n} \u2192 ${t}`);try{return await $t(e,n,t),await Ce(e)}catch(o){if(o instanceof Error)throw TypeError(`Failed to update order status: ${o.message}`);throw o}}async function pd(e,t,r){let n=await Ce(e);if(!n)throw Error(`Order with ID ${e} not found`);let o={updated_at:dd(new Date)};if(t!==void 0)o.delivery_address=t;if(r!==void 0)o.estimated_delivery_time=r;if(Object.keys(o).length===1)return n;try{return await cd.updateTable("orders").set(o).where("id","=",e).execute(),await Ce(e)}catch(a){if(a instanceof Error)throw TypeError(`Failed to update delivery information: ${a.message}`);throw a}}Xe();import{db as Bt}from"@stacksjs/database/runtime";import{formatDate as Cr}from"@stacksjs/orm";async function fa(e){let t=await Bt.selectFrom("payments").where("transaction_id","=",e).selectAll().executeTakeFirst();if(!t)return null;return await Bt.selectFrom("orders").where("id","=",t.order_id).selectAll().executeTakeFirst()??null}var fd=!1;async function wa(e,t){try{let r=Cr(new Date);return await t.insertInto("payment_webhook_events").values({provider:e.provider,event_id:e.id,processed_at:r,created_at:r}).execute(),!0}catch(r){if(sh(r))return!1;if(ah(r)){if(!fd)fd=!0,console.warn("[commerce/webhook] payment_webhook_events table missing - provider retries will be applied again. Run `buddy migrate` to enable dedup.");return!0}throw r}}function ah(e){let t=e,r=t?.message??"";return t?.code==="42P01"||r.includes("no such table")||r.includes("doesn't exist")||/relation "[^"]*" does not exist/i.test(r)}function sh(e){let t=e,r=t?.message??"";return t?.code==="23505"||r.includes("UNIQUE constraint")||r.includes("Duplicate entry")||/duplicate key value/i.test(r)}async function ya(e){let t=e.reference;if(!t)return;await Bt.transaction(async(n)=>{if(!await wa(e,n))return;let a=await n.selectFrom("payments").where("transaction_id","=",t).selectAll().executeTakeFirst();if(!a)return;let s=Cr(new Date);await n.updateTable("payments").set({status:"succeeded",updated_at:s}).where("id","=",a.id).execute();let i=await n.selectFrom("orders").where("id","=",a.order_id).selectAll().executeTakeFirst();if(i&&i.status==="PENDING")await n.updateTable("orders").set({status:"PROCESSING",updated_at:s}).where("id","=",i.id).execute()});let r=await fa(t);if(r)await Ye(r)}async function ga(e){let t=e.reference;if(!t)return;let r=e.reason??"payment failed";await Bt.transaction(async(o)=>{if(!await wa(e,o))return;let s=await o.selectFrom("payments").where("transaction_id","=",t).selectAll().executeTakeFirst();if(!s)return;let i=Cr(new Date);await o.updateTable("payments").set({status:"failed",failure_reason:r.slice(0,1000),updated_at:i}).where("id","=",s.id).execute();let u=await o.selectFrom("orders").where("id","=",s.order_id).selectAll().executeTakeFirst();if(u&&u.status==="PENDING")await o.updateTable("orders").set({status:"CANCELLED",updated_at:i}).where("id","=",u.id).execute()});let n=await fa(t);if(n)await Nt(n,r)}async function ha(e){let t=e.reference;if(!t)return;let r=e.refundedTotal?.amount,n=r??e.amount?.amount??0;if(!Number.isSafeInteger(n)||n<=0)return;let o=!1,a=!1,s=0;if(await Bt.transaction(async(u)=>{if(!await wa(e,u))return;let d=await u.selectFrom("payments").where("transaction_id","=",t).selectAll().executeTakeFirst();if(!d)return;let m=Number(d.refund_amount??0);if(s=r===void 0?n:r-m,s<=0)return;let l=m+s;if(l>Number(d.amount)){console.warn(`[commerce/webhook] ${e.provider} refunded ${s} of payment ${d.id}, which has ${Number(d.amount)-m} left to refund; not recorded.`);return}o=l===Number(d.amount);let y=Cr(new Date);if(await u.updateTable("payments").set({status:o?"refunded":"partiallyRefunded",refund_amount:l,updated_at:y}).where("id","=",d.id).execute(),a=!0,!o)return;let g=await u.selectFrom("orders").where("id","=",d.order_id).selectAll().executeTakeFirst();if(g&&be(g.status,"REFUNDED"))await u.updateTable("orders").set({status:"REFUNDED",updated_at:y}).where("id","=",g.id).execute()}),!a)return;let i=await fa(t);if(i&&o)await Ot(i,s)}async function ba(e){switch(e.type){case"payment.succeeded":return await ya(e),!0;case"payment.failed":return await ga(e),!0;case"refund.succeeded":return await ha(e),!0;default:return!1}}async function wd(e,t){let{paymentDriver:r,WebhookNotConfiguredError:n,WebhookSignatureError:o}=await import("@stacksjs/payments"),a=t??r(),s;try{s=await a.verifyWebhook({payload:await e.text(),headers:e.headers})}catch(i){if(i instanceof n)return Response.json({ok:!1,reason:"missing-config"},{status:401});if(i instanceof o)return Response.json({ok:!1,reason:"invalid-signature"},{status:400});throw i}for(let i of s)await ba(i);return a.acknowledgeWebhook()}import{db as yd}from"@stacksjs/database/runtime";async function ih(e){if(e.length===0)return new Map;let t=await yd.selectFrom("products").where("id","in",e).select(["id","price"]).execute(),r=new Map;for(let n of t){let o=Number(n.price);if(Number.isFinite(o))r.set(n.id,Math.round(o))}return r}async function uh(e){try{let t=await yd.selectFrom("tax_rates").where("id","=",e).select(["rate"]).executeTakeFirst(),r=Number(t?.rate??0);return Number.isFinite(r)?r:0}catch{return 0}}async function gd(e){let t=e.items.map((g)=>g.productId),r=await ih(t),n=e.taxRateId!=null?await uh(e.taxRateId):0,o=0,a=[];for(let g of e.items){let p=g.unitPriceCents??r.get(g.productId)??0,b=Math.round(p*g.quantity);o+=b,a.push({productId:g.productId,quantity:g.quantity,unitPriceCents:p,lineCents:b})}let s=Math.max(0,e.discountCents??0),i=Math.max(0,o-s),u=Math.round(i*n),c=Math.max(0,e.shippingCents??0),d=o-s+u+c,m=e.maxDriftCents??5,l=!1,y=0;if(e.clientTotalCents!=null)y=Math.abs(d-e.clientTotalCents),l=y>m;return{subtotalCents:o,discountCents:s,taxCents:u,shippingCents:c,totalCents:d,resolvedItems:a,priceChanged:l,diffCents:y}}import{db as Tr,sqlHelpers as ch}from"@stacksjs/database/runtime";import{env as dh}from"@stacksjs/env";function hd(e,t={}){let r=e.length;if(r<=1)return{ok:!0,count:r};if(!t.allowMultiple)return{ok:!1,count:r,reason:"multiple-not-allowed"};let n=t.maxStacked??Number.POSITIVE_INFINITY;if(r>n)return{ok:!1,count:r,reason:"exceeds-max-stacked"};return{ok:!0,count:r}}async function _a(e,t){if(!Number.isFinite(t)||t<=0)return{ok:!1,productId:e,quantity:t,reason:"non-positive"};let r;try{r=await Tr.selectFrom("products").where("id","=",e).select(["min_order_qty","max_order_qty"]).executeTakeFirst()}catch{return{ok:!0,productId:e,quantity:t}}if(!r)return{ok:!1,productId:e,quantity:t,reason:"product-missing"};let n=r.min_order_qty??null,o=r.max_order_qty??null;if(n!=null&&t<n)return{ok:!1,productId:e,quantity:t,reason:"below-min",bound:n};if(o!=null&&t>o)return{ok:!1,productId:e,quantity:t,reason:"above-max",bound:o};return{ok:!0,productId:e,quantity:t}}async function bd(e){for(let r of e){let n=await _a(r.productId,r.quantity);if(!n.ok)return n}let t=e[e.length-1]??{productId:0,quantity:0};return{ok:!0,productId:t.productId,quantity:t.quantity}}async function _d(e={}){let t=e.olderThanDays??30,r=e.limit??1000,o=new Date(Date.now()-t*24*60*60*1000).toISOString().slice(0,19).replace("T"," "),a=ch(dh.DB_CONNECTION||"sqlite").param;try{let s=await Tr.unsafe(`DELETE FROM carts WHERE updated_at < ${a(1)} AND id IN (SELECT id FROM carts WHERE updated_at < ${a(2)} LIMIT ${a(3)})`,[o,o,r]);return{deleted:_(s),cutoffAt:o}}catch{try{let s=await Tr.selectFrom("carts").where("updated_at","<",o).select(["id"]).limit(r).execute();if(s.length===0)return{deleted:0,cutoffAt:o};let i=s.map((c)=>c.id),u=await Tr.deleteFrom("carts").where("id","in",i).execute();return{deleted:_(u),cutoffAt:o}}catch{return{deleted:0,cutoffAt:o}}}}import{db as xd}from"@stacksjs/database/runtime";async function Rd(e){try{let t=await xd.deleteFrom("payments").where("id","=",e).executeTakeFirst();return _(t)>0}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete payment: ${t.message}`);throw t}}async function Pd(e){if(!e.length)return 0;try{let t=await xd.deleteFrom("payments").where("id","in",e).executeTakeFirst();return _(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete payments: ${t.message}`);throw t}}import{db as K}from"@stacksjs/database/runtime";import{formatDate as le}from"@stacksjs/orm";async function vd(){let e=await K.selectFrom("payments").selectAll().execute();return P(e)}async function et(e){let t=await K.selectFrom("payments").selectAll().where("id","=",e).executeTakeFirst();return w(t,!0)}async function Dd(e=30){let t=new Date,r=new Date(t);r.setDate(t.getDate()-e);let n=new Date(r);n.setDate(n.getDate()-1);let o=new Date(n);o.setDate(n.getDate()-e);let a=await K.selectFrom("payments").select([K.fn.count("id").as("transaction_count"),K.fn.sum("amount").as("total_revenue")]).where("created_at",">=",le(r)).where("created_at","<=",le(t)).where("status","=","completed").executeTakeFirst(),s=await K.selectFrom("payments").select([K.fn.count("id").as("transaction_count"),K.fn.sum("amount").as("total_revenue")]).where("created_at",">=",le(o)).where("created_at","<=",le(n)).where("status","=","completed").executeTakeFirst(),i=await K.selectFrom("payments").select(K.fn.count("id").as("count")).where("created_at",">=",le(r)).where("created_at","<=",le(t)).executeTakeFirst(),u=Number(a?.transaction_count||0),c=Number(a?.total_revenue||0),d=u>0?c/u:0,m=Number(s?.transaction_count||0),l=Number(s?.total_revenue||0),y=m>0?l/m:0,g=u-m,p=c-l,b=d-y,h=m>0?g/m*100:u>0?100:0,f=l>0?p/l*100:c>0?100:0,x=y>0?b/y*100:d>0?100:0,D=Number(i?.count||0),v=D>0?u/D*100:0;return{total_transactions:u,total_revenue:c,average_transaction:d,successful_rate:v,comparison:{transactions:{difference:g,percentage:Math.abs(h),is_increase:g>=0},revenue:{difference:p,percentage:Math.abs(f),is_increase:p>=0},average:{difference:b,percentage:Math.abs(x),is_increase:b>=0}}}}async function Sd(e=30){let t=new Date,r=new Date(t);r.setDate(t.getDate()-e);let n=await K.selectFrom("payments").select([K.fn.count("id").as("total_count"),K.fn.sum("amount").as("total_revenue")]).where("created_at",">=",le(r)).where("created_at","<=",le(t)).where("status","=","completed").executeTakeFirst(),o=Number(n?.total_count||0),a=await K.selectFrom("payments").select(["method",K.fn.count("id").as("count"),K.fn.sum("amount").as("revenue")]).where("created_at",">=",le(r)).where("created_at","<=",le(t)).where("status","=","completed").groupBy("method").execute(),s={};return a.forEach((i)=>{let u=Number(i.count||0),c=Number(i.revenue||0),d=o>0?u/o*100:0;s[i.method]={count:u,revenue:c,percentage_of_total:d}}),s}async function kd(){let e=new Date,t=new Date(e);t.setMonth(e.getMonth()-11),t.setDate(1);let r=await K.selectFrom("payments").selectAll().where("created_at",">=",le(t)).where("status","=","completed").execute(),n={};for(let a of r){let s=a.created_at?new Date(String(a.created_at)):new Date,i=s.getFullYear(),u=s.getMonth()+1,c=`${i}-${String(u).padStart(2,"0")}`;if(!n[c])n[c]={year:i,month:u,transactions:0,revenue:0};n[c].transactions++,n[c].revenue+=Number(a.amount||0)}return Object.keys(n).sort().map((a)=>{let s=n[a],{transactions:i,revenue:u}=s,c=i>0?u/i:0;return{month:new Date(s.year,s.month-1,1).toLocaleString("default",{month:"short"}),year:s.year,transactions:i,revenue:u,average:c}})}var{randomUUIDv7:lh}=globalThis.Bun;import{db as Cd}from"@stacksjs/database/runtime";import{HttpError as Td}from"@stacksjs/error-handling";import{isUniqueViolation as mh}from"@stacksjs/orm";async function Ad(e){let t=lh(),r={...e,status:e.status||"pending",currency:e.currency||"USD",uuid:t};try{await Cd.insertInto("payments").values(r).executeTakeFirst();let n=await Cd.selectFrom("payments").where("uuid","=",t).selectAll().executeTakeFirst();return w(n,!0)}catch(n){if(n instanceof Td)throw n;if(mh(n))throw new Td(409,"A payment with this transaction ID already exists");if(n instanceof Error){if(n.message.includes("Insufficient funds"))throw Error("Insufficient funds for this payment");throw Error(`Failed to create payment: ${n.message}`)}throw n}}import{db as Ed,mutationCount as ph,sqlHelpers as fh}from"@stacksjs/database/runtime";import{env as wh}from"@stacksjs/env";import{formatDate as Fd}from"@stacksjs/orm";async function Id(e,t){if(!await et(e))return;try{return await Ed.updateTable("payments").set({...t,updated_at:Fd(new Date)}).where("id","=",e).execute(),await et(e)}catch(n){if(n instanceof Error){if(n.message.includes("Duplicate entry")&&n.message.includes("transaction_id"))throw Error("A payment with this transaction ID already exists");throw Error(`Failed to update payment: ${n.message}`)}throw n}}var yh=new Set(["completed","succeeded","partiallyRefunded"]);async function Md(e,t){if(!Number.isSafeInteger(e)||e<=0)throw TypeError("Payment ID must be a positive integer");if(!Number.isSafeInteger(t)||t<=0)throw TypeError("Refund amount must be a positive integer in minor units");let n=fh(wh.DB_CONNECTION||"sqlite").param,o=Fd(new Date),a=await Ed.unsafe(`UPDATE payments
22
- SET status = CASE WHEN COALESCE(refund_amount, 0) + ${n(1)} = amount THEN 'refunded'
23
- WHEN 1 = 0 THEN status ELSE 'partiallyRefunded' END,
24
- refund_amount = COALESCE(refund_amount, 0) + ${n(2)},
25
- updated_at = ${n(3)}
26
- WHERE id = ${n(4)}
27
- AND status IN ('completed', 'succeeded', 'partiallyRefunded')
28
- AND COALESCE(refund_amount, 0) + ${n(5)} <= amount`,[t,t,o,e,t]);if(ph(a)>0){let d=await et(e);if(d)return d;throw Error(`Payment with ID ${e} disappeared during refund`)}let s=await et(e);if(!s)throw Error(`Payment with ID ${e} not found`);let i=String(s.status||"");if(!yh.has(i))throw Error(`Payment status ${i||"unknown"} cannot be refunded`);let u=s,c=Number(s.amount||0)-Number(u.refundAmount??u.refund_amount??0);throw Error(`Refund amount exceeds the remaining ${c} minor units`)}import{db as Jt,matchedRows as gh}from"@stacksjs/database/runtime";import{formatDate as jd}from"@stacksjs/orm";import{db as L}from"@stacksjs/database/runtime";import{formatDate as Ut}from"@stacksjs/orm";async function Pa(){return await L.selectFrom("categories").selectAll().execute()}async function Z(e){return await L.selectFrom("categories").where("id","=",e).selectAll().executeTakeFirst()}async function Nd(e){return await L.selectFrom("categories").where("name","=",e).selectAll().executeTakeFirst()}async function Od(){return await L.selectFrom("categories").where("is_active","=",!0).selectAll().execute()}async function $d(){return await L.selectFrom("categories").whereNull("parent_category_id").where("is_active","=",!0).selectAll().execute()}async function Bd(e){return await L.selectFrom("categories").where("parent_category_id","=",e).where("is_active","=",!0).selectAll().execute()}async function Ud(e=!0){let t=L.selectFrom("categories").where("is_active","=",!0).selectAll();if(e)return await t.orderBy("display_order","asc").execute();else return await t.orderBy("display_order","desc").execute()}async function Jd(){let e=await L.selectFrom("categories").select(L.fn.count("id").as("count")).executeTakeFirst(),t=await L.selectFrom("categories").where("is_active","=",!0).select(L.fn.count("id").as("count")).executeTakeFirst(),r=await L.selectFrom("categories").whereNull("parent_category_id").select(L.fn.count("id").as("count")).executeTakeFirst(),n=await L.selectFrom("categories").whereNotNull("image_url").select(L.fn.count("id").as("count")).executeTakeFirst(),o=new Date;o.setDate(o.getDate()-30);let a=Ut(o),s=await L.selectFrom("categories").where("created_at",">=",a).selectAll().limit(5).execute(),i=await L.selectFrom("categories as c").leftJoin("categories as parent","c.parent_category_id","=","parent.id").whereNotNull("c.parent_category_id").select(["c.parent_category_id","parent.name as parent_name",L.fn.count("c.id").as("child_count")]).groupBy(["c.parent_category_id","parent.name"]).orderBy("child_count","desc").limit(5).execute();return{total:Number(e?.count||0),active:Number(t?.count||0),root_categories:Number(r?.count||0),child_categories:Number(e?.count||0)-Number(r?.count||0),with_images:Number(n?.count||0),recently_added:s,top_parent_categories:i.map((u)=>({id:String(u.parent_category_id||""),name:String(u.parent_name||""),child_count:Number(u.child_count)}))}}async function Wd(e=30){let t=new Date,r=Ut(t),n=new Date;n.setDate(t.getDate()-e);let o=Ut(n),a=new Date(n);a.setDate(a.getDate()-1);let s=Ut(a),i=new Date(a);i.setDate(a.getDate()-e);let u=Ut(i),c=await L.selectFrom("categories").select(L.fn.count("id").as("count")).where("created_at",">=",o).where("created_at","<=",r).executeTakeFirst(),d=await L.selectFrom("categories").select(L.fn.count("id").as("count")).where("created_at",">=",u).where("created_at","<=",s).executeTakeFirst(),m=Number(c?.count||0),l=Number(d?.count||0),y=m-l,g=l!==0?y/l*100:m>0?100:0;return{current_period:m,previous_period:l,difference:y,percentage_change:g,days_range:e}}async function Ld(){let e=await Pa(),t=new Map;e.forEach((o)=>{t.set(o.id,{...o,children:[]})});let r=[];e.forEach((o)=>{let a=t.get(o.id);if(o.parent_category_id){let s=t.get(o.parent_category_id);if(s)s.children.push(a)}else r.push(a)}),r.sort((o,a)=>o.display_order-a.display_order);let n=(o)=>{o.sort((a,s)=>a.display_order-s.display_order),o.forEach((a)=>{if(a.children.length>0)n(a.children)})};return n(r),r}async function zd(e){let t=await Jt.deleteFrom("categories").where("id","=",e).executeTakeFirst();return _(t)>0}async function qd(e){if(!e.length)return 0;let t=await Jt.deleteFrom("categories").where("id","in",e).executeTakeFirst();return _(t)}async function Gd(e){let t=await Jt.deleteFrom("categories").where("parent_category_id","=",e).executeTakeFirst();return _(t)}async function Vd(e){if(!await Z(e))throw Error(`Category with ID ${e} not found`);let r=await Jt.updateTable("categories").set({is_active:!1,updated_at:jd(new Date)}).where("id","=",e).returning("id").executeTakeFirst();return Boolean(r)}async function Hd(e){return(await gh(Jt.updateTable("categories").set({is_active:!1,updated_at:jd(new Date)}).where("parent_category_id","=",e))).length}var{randomUUIDv7:hh}=globalThis.Bun;import{db as Kd}from"@stacksjs/database/runtime";import{HttpError as Ar}from"@stacksjs/error-handling";import{isUniqueViolation as bh}from"@stacksjs/orm";import{slug as _h}from"@stacksjs/strings";async function va(e){try{let t=e.parent_category_id?Number(e.parent_category_id):void 0;if(t!==void 0&&(!Number.isSafeInteger(t)||t<=0))throw new Ar(422,"Parent category ID must be a positive integer");if(t&&!await Z(t))throw new Ar(422,`Parent category with ID ${e.parent_category_id} not found`);let r={...e,uuid:hh(),is_active:e.is_active??!0,parent_category_id:e.parent_category_id||null},n=await Kd.insertInto("categories").values(r).returningAll().executeTakeFirst();if(!n)throw Error("Failed to create category");return n}catch(t){if(t instanceof Ar)throw t;if(bh(t))throw new Ar(409,"A category with this name or slug already exists");if(t instanceof Error)throw Error(`Failed to create category: ${t.message}`);throw t}}async function Zd(e){if(!e.name)throw Error("Name is required");let t=await Kd.selectFrom("categories").selectAll().where("name","=",e.name).executeTakeFirst();if(t)return t;let r={name:e.name,slug:_h(e.name),is_active:e.is_active??!0,display_order:0};return await va(r)}import{db as Wt}from"@stacksjs/database/runtime";import{HttpError as lt}from"@stacksjs/error-handling";import{formatDate as Er,isUniqueViolation as xh}from"@stacksjs/orm";async function Qd(e,t){if(!await Z(e))return;if(Object.hasOwn(t,"parent_category_id")){let n=t.parent_category_id?Number(t.parent_category_id):void 0;if(n!==void 0&&(!Number.isSafeInteger(n)||n<=0))throw new lt(422,"Parent category ID must be a positive integer");if(n===e)throw new lt(422,"A category cannot be its own parent");if(n&&!await Z(n))throw new lt(422,`Parent category with ID ${t.parent_category_id} not found`);if(n&&await tl(e,String(n)))throw new lt(422,"This operation would create a circular category hierarchy")}try{let n=Object.hasOwn(t,"parent_category_id")?{parent_category_id:t.parent_category_id||null}:{},o=await Wt.updateTable("categories").set({...t,...n,updated_at:Er(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!o)return;return o}catch(n){if(n instanceof lt)throw n;if(xh(n))throw new lt(409,"A category with this name or slug already exists");if(n instanceof Error)throw Error(`Failed to update category: ${n.message}`);throw n}}async function Yd(e,t){if(!await Z(e))throw Error(`Category with ID ${e} not found`);try{return await Wt.updateTable("categories").set({display_order:t,updated_at:Er(new Date)}).where("id","=",e).execute(),await Z(e)}catch(n){if(n instanceof Error)throw TypeError(`Failed to update category display order: ${n.message}`);throw n}}async function Xd(e,t){if(!await Z(e))throw Error(`Category with ID ${e} not found`);try{return await Wt.updateTable("categories").set({is_active:t,updated_at:Er(new Date)}).where("id","=",e).execute(),await Z(e)}catch(n){if(n instanceof Error)throw TypeError(`Failed to update category active status: ${n.message}`);throw n}}async function el(e,t){if(!await Z(e))throw Error(`Category with ID ${e} not found`);if(t){let n=Number(t);if(n===e)throw Error("A category cannot be its own parent");if(!await Z(n))throw Error(`Parent category with ID ${t} not found`);if(await tl(e,t))throw Error("This operation would create a circular reference in the category hierarchy")}try{let n={updated_at:Er(new Date)};if(t===null)await Wt.updateTable("categories").set({...n,parent_category_id:null}).where("id","=",e).execute();else await Wt.updateTable("categories").set({...n,parent_category_id:t}).where("id","=",e).execute();return await Z(e)}catch(n){if(n instanceof Error)throw TypeError(`Failed to update category parent: ${n.message}`);throw n}}async function tl(e,t){let r=Number(t),n=new Set;while(r){if(n.has(r))return!0;if(r===e)return!0;n.add(r);let o=await Z(r),a=o?.parent_category_id;if(!o||!a)return!1;r=Number(a)}return!1}import{db as rl}from"@stacksjs/database/runtime";async function nl(e){try{let t=await rl.deleteFrom("products").where("id","=",e).executeTakeFirst();return _(t)>0}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete product item: ${t.message}`);throw t}}async function ol(e){if(!e.length)return 0;try{let t=await rl.deleteFrom("products").where("id","in",e).executeTakeFirst();return _(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete product items: ${t.message}`);throw t}}import{db as Te,sql as Rh}from"@stacksjs/database/runtime";async function Ae(e){let t=await Te.selectFrom("products").where("id","=",e).selectAll().executeTakeFirst();if(t){let r=null,n=null;if(t.manufacturer_id)r=await Te.selectFrom("manufacturers").where("id","=",t.manufacturer_id).selectAll().executeTakeFirst();if(t.category_id)n=await Te.selectFrom("categories").where("id","=",t.category_id).selectAll().executeTakeFirst();return{...t,manufacturer:r,category:n}}return}async function al(){let e=await Te.selectFrom("products").selectAll().execute(),t=e.map((c)=>c.manufacturer_id).filter((c)=>c!==null&&c!==void 0),r=e.map((c)=>c.category_id).filter((c)=>c!==null&&c!==void 0),n=Te.selectFrom("manufacturers"),o=Te.selectFrom("categories");if(t.length>0)n=n.where("id","in",t);if(r.length>0)o=o.where("id","in",r);let a=await n.selectAll().execute(),s=await o.selectAll().execute(),i=a.reduce((c,d)=>(c[d.id]=d,c),{}),u=s.reduce((c,d)=>(c[d.id]=d,c),{});return e.map((c)=>({...c,manufacturer:c.manufacturer_id?i[c.manufacturer_id]:null,category:c.category_id?u[c.category_id]:null}))}async function sl(e){try{let t=await Te.selectFrom("products").selectAll().where("uuid","=",e).executeTakeFirst();return w(t,!0)}catch(t){if(t instanceof Error)throw TypeError(`Failed to get product by UUID: ${t.message}`);throw t}}async function il(e=5){try{return(await Te.selectFrom("order_items").innerJoin("products","products.id","=","order_items.product_id").select(["products.id as id","products.name as name","products.inventory_count as inventory_count",Te.fn.sum("order_items.quantity").as("units_sold"),Rh`SUM(COALESCE(order_items.price, products.price) * order_items.quantity)`.as("revenue")]).groupBy(["products.id","products.name","products.inventory_count"]).orderBy("units_sold","desc").limit(e).execute()).map((r)=>({id:Number(r.id),name:String(r.name??"Unnamed product"),units_sold:Number(r.units_sold??0),revenue:Number(r.revenue??0),inventory_count:Number(r.inventory_count??0)}))}catch(t){if(t instanceof Error)throw TypeError(`Failed to fetch top products: ${t.message}`);throw t}}var{randomUUIDv7:ul}=globalThis.Bun;import{db as cl}from"@stacksjs/database/runtime";async function dl(e){try{let t={...e,uuid:ul()},r=await cl.insertInto("products").values(t).executeTakeFirst();if(!r)throw Error("Failed to create product item");let n=De(r),o=n!==void 0?await Ae(n):await sl(t.uuid);if(!o)throw Error("Failed to create product item");return o}catch(t){if(t instanceof Error)throw TypeError(`Failed to create product item: ${t.message}`);throw t}}async function ll(e){if(!e.length)return 0;let t=0;try{return await cl.transaction(async(r)=>{for(let n of e){let o={...n,uuid:ul()};await r.insertInto("products").values(o).execute(),t++}}),t}catch(r){if(r instanceof Error)throw TypeError(`Failed to create product items in bulk: ${r.message}`);throw r}}import{db as Da,matchedRows as $S}from"@stacksjs/database/runtime";import{formatDate as Sa}from"@stacksjs/orm";async function ml(e,t){try{if(!e)throw Error("Product item ID is required for update");let r=await Da.updateTable("products").set({...t,updated_at:Sa(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!r)return;return w(r)}catch(r){if(r instanceof Error)throw TypeError(`Failed to update product item: ${r.message}`);throw r}}async function pl(e,t){if(!await Ae(e))throw Error(`Product item with ID ${e} not found`);try{return await Da.updateTable("products").set({is_available:t,updated_at:Sa(new Date)}).where("id","=",e).execute(),await Ae(e)}catch(n){if(n instanceof Error)throw TypeError(`Failed to update product item availability: ${n.message}`);throw n}}async function fl(e,t){let r=await Ae(e);if(!r)throw Error(`Product item with ID ${e} not found`);let n={updated_at:Sa(new Date)};if(t!==void 0)n.inventory_count=t;if(Object.keys(n).length===1)return r;try{return await Da.updateTable("products").set(n).where("id","=",e).execute(),await Ae(e)}catch(o){if(o instanceof Error)throw TypeError(`Failed to update inventory information: ${o.message}`);throw o}}import{db as wl}from"@stacksjs/database/runtime";async function yl(e){try{let t=await wl.deleteFrom("manufacturers").where("id","=",e).executeTakeFirst();return _(t)>0}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete order: ${t.message}`);throw t}}async function gl(e){if(!e.length)return 0;try{let t=await wl.deleteFrom("manufacturers").where("id","in",e).executeTakeFirst();return _(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete orders: ${t.message}`);throw t}}import{db as Ee}from"@stacksjs/database/runtime";async function hl(){return P(await Ee.selectFrom("manufacturers").selectAll().execute())}async function bl(e){let t=await Ee.selectFrom("manufacturers").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function _l(e){let t=await Ee.selectFrom("manufacturers").where("uuid","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function xl(e=10){let t=await Ee.selectFrom("manufacturers").where("featured","=",!0).selectAll().orderBy("manufacturer","asc").limit(e).execute();return P(t)}async function Rl(e,t={}){let r=t.page||1,n=t.limit||2,o=await Ee.selectFrom("manufacturers").select(Ee.fn.count("id").as("total")).where("country","=",e).executeTakeFirst(),a=Number(o?.total||0),s=await Ee.selectFrom("manufacturers").selectAll().where("country","=",e).limit(n).offset((r-1)*n).execute(),i=Math.ceil(a/n);return{data:P(s),paging:{total_records:a,page:r,total_pages:i},next_cursor:r<i?r+1:null}}async function Pl(e={}){let t=Ee.selectFrom("manufacturers as m").leftJoin("products as p","p.manufacturer_id","=","m.id");if(e.country)t=t.where("m.country","=",e.country);if(e.featured!==void 0)t=t.where("m.featured","=",e.featured);return t=t.select(["m.id","m.uuid","m.manufacturer","m.description","m.country","m.featured","m.created_at","m.updated_at",Ee.fn.count("p.id").as("product_count")]).groupBy("m.id"),t.execute()}var{randomUUIDv7:Dl}=globalThis.Bun;import{db as Sl}from"@stacksjs/database/runtime";import{HttpError as vl}from"@stacksjs/error-handling";import{isUniqueViolation as Ph}from"@stacksjs/orm";async function kl(e){try{let t={...e,uuid:Dl(),featured:e.featured??!1},r=await Sl.insertInto("manufacturers").values(t).returningAll().executeTakeFirst();if(!r)throw Error("Failed to create manufacturer");return w(r)}catch(t){if(t instanceof vl)throw t;if(Ph(t))throw new vl(409,"A manufacturer with this name already exists");if(t instanceof Error)throw Error(`Failed to create manufacturer: ${t.message}`);throw t}}async function Cl(e){if(!e.length)return 0;let t=0;try{for(let r of e){let n={...r,uuid:Dl(),featured:r.featured??!1};await Sl.insertInto("manufacturers").values(n).execute(),t++}return t}catch(r){if(r instanceof Error)throw TypeError(`Failed to create manufacturers in bulk: ${r.message}`);throw r}}import{db as ka}from"@stacksjs/database/runtime";import{HttpError as Tl}from"@stacksjs/error-handling";import{formatDate as Ca,isUniqueViolation as vh}from"@stacksjs/orm";async function Al(e,t){try{if(!e)throw Error("Manufacturer ID is required for update");let r=await ka.updateTable("manufacturers").set({...t,updated_at:Ca(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!r)return;return w(r)}catch(r){if(r instanceof Tl)throw r;if(vh(r))throw new Tl(409,"A manufacturer with this name already exists");if(r instanceof Error)throw Error(`Failed to update manufacturer: ${r.message}`);throw r}}async function El(e,t){try{let r=await ka.updateTable("manufacturers").set({featured:t,updated_at:Ca(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!r)throw Error("Failed to update manufacturer featured status");return w(r)}catch(r){if(r instanceof Error)throw TypeError(`Failed to update manufacturer featured status: ${r.message}`);throw r}}async function Fl(e,t){try{let r=await ka.updateTable("manufacturers").set({...t,updated_at:Ca(new Date)}).where("uuid","=",e).returningAll().executeTakeFirst();if(!r)throw Error("Failed to update manufacturer");return w(r)}catch(r){if(r instanceof Error)throw TypeError(`Failed to update manufacturer: ${r.message}`);throw r}}import{db as Il}from"@stacksjs/database/runtime";async function Ml(e){try{let t=await Il.deleteFrom("reviews").where("id","=",e).executeTakeFirst();return _(t)>0}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete review: ${t.message}`);throw t}}async function Nl(e){if(!e.length)return 0;try{let t=await Il.deleteFrom("reviews").where("id","in",e).executeTakeFirst();return _(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete reviews: ${t.message}`);throw t}}import{db as mt}from"@stacksjs/database/runtime";async function Ol(e){return w(await mt.selectFrom("reviews").where("id","=",e).selectAll().executeTakeFirst(),!0)}async function $l(){return P(await mt.selectFrom("reviews").selectAll().execute())}async function Bl(e){return P(await mt.selectFrom("reviews").where("product_id","=",e).selectAll().execute())}async function Ul(e){return P(await mt.selectFrom("reviews").where("customer_id","=",e).selectAll().execute())}async function Jl(e){return P(await mt.selectFrom("reviews").where("product_id","=",e).where("is_approved","=",!0).selectAll().execute())}async function Wl(e){return P(await mt.selectFrom("reviews").where("product_id","=",e).orderBy("helpful_votes","desc").selectAll().execute())}import{db as Ll}from"@stacksjs/database/runtime";function jl(){return{total:0,rated:0,commentsOnly:0,average:0,distribution:{1:0,2:0,3:0,4:0,5:0}}}function zl(e){let t=jl();t.total=e.length;let r=0;for(let n of e){if(n.rating===null||n.rating===void 0){t.commentsOnly++;continue}let o=Number(n.rating);if(Number.isNaN(o)){t.commentsOnly++;continue}t.rated++,r+=o;let a=Math.min(5,Math.max(1,Math.round(o)));t.distribution[a]++}if(t.rated>0)t.average=Math.round(r/t.rated*10)/10;return t}async function ql(e){let t=await Ll.selectFrom("reviews").select(["rating"]).where("product_id","=",e).where("is_approved","=",!0).execute();return zl(t)}async function Gl(e){let t=new Map;for(let o of e)t.set(o,jl());if(e.length===0)return t;let r=await Ll.selectFrom("reviews").select(["product_id","rating"]).where("product_id","in",e).where("is_approved","=",!0).execute(),n=new Map;for(let o of r){let a=n.get(o.product_id);if(a)a.push({rating:o.rating});else n.set(o.product_id,[{rating:o.rating}])}for(let[o,a]of n)t.set(o,zl(a));return t}var{randomUUIDv7:Dh}=globalThis.Bun;import{db as Sh}from"@stacksjs/database/runtime";function kh(e){let t=e.rating!==void 0&&e.rating!==null,r=typeof e.content==="string"&&e.content.trim().length>0,n=typeof e.title==="string"&&e.title.trim().length>0;return!t&&!r&&!n}async function Vl(e){try{if(kh(e))throw Error("A review needs a rating or something written: both were empty");let t={...e,uuid:Dh(),rating:e.rating??null,is_verified_purchase:e.is_verified_purchase??!1,is_approved:e.is_approved??!1,helpful_votes:e.helpful_votes??0,unhelpful_votes:e.unhelpful_votes??0,is_featured:e.is_featured??!1},r=await Sh.insertInto("reviews").values(t).returningAll().executeTakeFirst();if(!r)throw Error("Failed to create review");return w(r)}catch(t){if(t instanceof Error){if(t.message.includes("Duplicate entry"))throw Error("A review with this code already exists");throw Error(`Failed to create review: ${t.message}`)}throw t}}import{db as Hl,sqlHelpers as Ch}from"@stacksjs/database/runtime";import{env as Th}from"@stacksjs/env";import{formatDate as Kl}from"@stacksjs/orm";async function Zl(e,t){try{if(!e)throw Error("Review ID is required for update");let r=await Hl.updateTable("reviews").set({...t,updated_at:Kl(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!r)return;return w(r)}catch(r){if(r instanceof Error)throw TypeError(`Failed to update review: ${r.message}`);throw r}}async function Ql(e,t,r=!0){try{let n=t==="helpful"?"helpful_votes":"unhelpful_votes",o=r?`COALESCE("${n}", 0) + 1`:`MAX(COALESCE("${n}", 0) - 1, 0)`,{param:a}=Ch(Th.DB_CONNECTION||"sqlite"),s=await Hl.unsafe(`UPDATE "reviews" SET "${n}" = ${o}, "updated_at" = ${a(1)} WHERE "id" = ${a(2)} RETURNING *`,[Kl(new Date),e]).execute(),i=Array.isArray(s)?s[0]:s;if(!i)throw Error("Failed to update review votes");return w(i)}catch(n){if(n instanceof Error)throw TypeError(`Failed to update review votes: ${n.message}`);throw n}}import{db as Yl}from"@stacksjs/database/runtime";async function Xl(e){try{let t=await Yl.deleteFrom("product_units").where("id","=",e).executeTakeFirst();return _(t)>0}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete product unit: ${t.message}`);throw t}}async function em(e){if(!e.length)return 0;try{let t=await Yl.deleteFrom("product_units").where("id","in",e).executeTakeFirst();return _(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete product units: ${t.message}`);throw t}}import{db as tm}from"@stacksjs/database/runtime";async function rm(e){let t=await tm.selectFrom("product_units").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function nm(){return P(await tm.selectFrom("product_units").selectAll().execute())}var{randomUUIDv7:om}=globalThis.Bun;import{db as Lt}from"@stacksjs/database/runtime";async function am(e){try{return await Lt.transaction(async(t)=>{let r={...e,uuid:om()},n=await t.insertInto("product_units").values(r).returningAll().executeTakeFirst();if(!n)throw Error("Failed to create product unit");if(r.is_default&&r.type)await t.updateTable("product_units").set({is_default:!1}).where("type","=",r.type).where("id","!=",n.id).execute();return w(n)})}catch(t){if(t instanceof Error)throw TypeError(`Failed to create product unit: ${t.message}`);throw t}}async function sm(e){if(!e.length)return 0;let t=0;try{for(let r of e){let n={...r,uuid:om()},o=await Lt.insertInto("product_units").values(n).returningAll().executeTakeFirst();if(n.is_default&&n.type&&o)await Lt.updateTable("product_units").set({is_default:!1}).where("type","=",n.type).where("id","!=",o.id).execute();t++}return t}catch(r){if(r instanceof Error)throw TypeError(`Failed to create product units in bulk: ${r.message}`);throw r}}function im(e){try{let t=Lt.selectFrom("product_units").select(["id","name","abbreviation","is_default"]);if(e)t=t.where("type","=",e);return t=t.orderBy("name"),t.execute().then((r)=>r.map((n)=>({id:String(n.id),name:n.name,abbreviation:n.abbreviation,is_default:n.is_default})))}catch(t){if(t instanceof Error)throw TypeError(`Failed to format unit options: ${t.message}`);throw t}}async function um(e){try{let t=await Lt.selectFrom("product_units").selectAll().where("type","=",e).where("is_default","=",!0).executeTakeFirst();return w(t,!0)}catch(t){if(t instanceof Error)throw TypeError(`Failed to get default unit: ${t.message}`);throw t}}import{db as Or,matchedRows as Ah}from"@stacksjs/database/runtime";import{formatDate as $r}from"@stacksjs/orm";async function cm(e,t){try{if(!e)throw Error("Product unit ID is required for update");return await Or.transaction(async(r)=>{let n=await r.selectFrom("product_units").select(["type","is_default"]).where("id","=",e).executeTakeFirst();if(!n)return;let o=t.type??n.type;if((t.is_default??Boolean(n.is_default))&&o)await r.updateTable("product_units").set({is_default:!1,updated_at:$r(new Date)}).where("type","=",o).where("id","!=",e).execute();let s=await r.updateTable("product_units").set({...t,updated_at:$r(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!s)return;return w(s)})}catch(r){if(r instanceof Error)throw TypeError(`Failed to update product unit: ${r.message}`);throw r}}async function dm(e){if(!e.length)return 0;let t=0;try{for(let r of e){let n=r;if(!n.id)continue;let o=n.data&&typeof n.data==="object"?n.data:{...n};delete o.id;let a=await Ah(Or.updateTable("product_units").set({...o,updated_at:$r(new Date)}).where("id","=",n.id)),s=o;if(s.is_default===!0&&s.type)await Or.updateTable("product_units").set({is_default:!1}).where("type","=",s.type).where("id","!=",n.id).execute();if(a.length>0)t++}return t}catch(r){if(r instanceof Error)throw TypeError(`Failed to update product units in bulk: ${r.message}`);throw r}}async function lm(e,t){try{return await Or.transaction(async(r)=>{let n=await r.selectFrom("product_units").select("type").where("id","=",e).executeTakeFirst();if(!n)return!1;let o=$r(new Date);if(t&&n.type)await r.updateTable("product_units").set({is_default:!1,updated_at:o}).where("type","=",n.type).where("id","!=",e).execute();return await r.updateTable("product_units").set({is_default:t,updated_at:o}).where("id","=",e).execute(),!0})}catch(r){if(r instanceof Error)throw TypeError(`Failed to update product unit default status: ${r.message}`);throw r}}import{db as mm}from"@stacksjs/database/runtime";async function pm(e){try{let t=await mm.deleteFrom("product_variants").where("id","=",e).executeTakeFirst();return _(t)>0}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete product variant: ${t.message}`);throw t}}async function fm(e){if(!e.length)return 0;try{let t=await mm.deleteFrom("product_variants").where("id","in",e).executeTakeFirst();return _(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete product variants: ${t.message}`);throw t}}import{db as wm}from"@stacksjs/database/runtime";async function ym(e){let t=await wm.selectFrom("product_variants").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function gm(){return P(await wm.selectFrom("product_variants").selectAll().execute())}var{randomUUIDv7:hm}=globalThis.Bun;import{db as bm}from"@stacksjs/database/runtime";async function _m(e){try{let t={...e,uuid:hm()},r=await bm.insertInto("product_variants").values(t).returningAll().executeTakeFirst();if(!r)throw Error("Failed to create product variant");return w(r)}catch(t){if(t instanceof Error)throw TypeError(`Failed to create product variant: ${t.message}`);throw t}}async function xm(e){if(!e.length)return 0;let t=0;try{for(let r of e){let n={...r,uuid:hm()};await bm.insertInto("product_variants").values(n).execute(),t++}return t}catch(r){if(r instanceof Error)throw TypeError(`Failed to create product variants in bulk: ${r.message}`);throw r}}function Rm(e){if(!e||!e.length)return JSON.stringify([]);let t=e.map((r)=>r.trim()).filter(Boolean);return JSON.stringify(t)}function Pm(e){let t=Object.keys(e);if(!t.length)return[];function r(n,o){if(n===t.length)return[o];let a=t[n],s=e[a]??[],i=[];for(let u of s){let c={...o,[a]:u};i.push(...r(n+1,c))}return i}return r(0,{})}import{db as vm,matchedRows as Eh}from"@stacksjs/database/runtime";import{formatDate as Dm}from"@stacksjs/orm";async function Sm(e,t){try{let r=await vm.updateTable("product_variants").set({...t,updated_at:Dm(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!r)return;return w(r)}catch(r){if(r instanceof Error)throw TypeError(`Failed to update product variant: ${r.message}`);throw r}}async function km(e){if(!e.length)return 0;let t=0;try{for(let r of e){if(!r.id)continue;if((await Eh(vm.updateTable("product_variants").set({...r,updated_at:Dm(new Date)}).where("id","=",r.id))).length>0)t++}return t}catch(r){if(r instanceof Error)throw TypeError(`Failed to update product variants in bulk: ${r.message}`);throw r}}var Fh={categories:Fr,items:Ir,manufacturers:Mr,reviews:Nr,units:Br,variants:Ur},Ih=Fh;var Fe={id:"id",price:"price",inventory:"inventory",lowStock:"low_stock_threshold",taxable:"taxable"},Mh={id:"id",price:"price_cents",inventory:"inventory_quantity",lowStock:"low_stock_threshold",taxable:"taxable"};function Jr(e,t){return Number(e[t.id])}function Cm(e,t){let r=e[t.inventory];return r===null||r===void 0||r===""?null:Number(r)}function Wr(e){let t=new Map;for(let{productId:r,quantity:n}of e){if(!Number.isSafeInteger(r)||r<1||!Number.isSafeInteger(n)||n<1)throw Error("Basket products and quantities must be positive safe integers");let o=(t.get(r)||0)+n;if(!Number.isSafeInteger(o))throw Error("Basket quantity exceeds the safe integer range");t.set(r,o)}return[...t].map(([r,n])=>({productId:r,quantity:n}))}function Aa(e,t,r=Fe){let n=Cm(e,r);if(n===null)return null;let o=t.filter((a)=>a.productId===Jr(e,r)).reduce((a,s)=>a+s.quantity,0);return Math.max(0,n-o)}function Tm(e,t,r=Fe){let n=Aa(e,t,r);return n===null||n>0}function Nh(e,t,r=Fe){let n=Wr(e);if(!Tm(t,n,r))return e;e=n;let o=Jr(t,r);return e.some((a)=>a.productId===o)?e.map((a)=>a.productId===o?{...a,quantity:a.quantity+1}:a):[...e,{productId:o,quantity:1}]}function Oh(e,t,r,n=Fe){let o=Jr(t,n),a=Cm(t,n);e=Wr(e);let s=Math.min(Math.max(0,Math.floor(Number(r)||0)),a===null?Number.POSITIVE_INFINITY:a);if(s===0)return e.filter((i)=>i.productId!==o);return e.some((i)=>i.productId===o)?e.map((i)=>i.productId===o?{...i,quantity:s}:i):[...e,{productId:o,quantity:s}]}function Ea(e,t,r=Fe){return Wr(e).map((n)=>({...n,product:t.find((o)=>Jr(o,r)===n.productId)})).filter((n)=>!!n.product)}function $h(e,t,r=Fe){return Ea(e,t,r).reduce((n,o)=>n+Number(o.product[r.price]||0)*o.quantity,0)}function Bh(e,t,r=Fe){return Ea(e,t,r).filter((n)=>n.product[r.taxable]!==!1).reduce((n,o)=>n+Number(o.product[r.price]||0)*o.quantity,0)}function Uh(e){return e.reduce((t,r)=>t+r.quantity,0)}function Jh(e,t=[],r=Fe,n=5){let o=Aa(e,t,r);if(o===null)return null;if(o===0)return{text:"Sold out",tone:"out"};let a=e[r.lowStock]===null||e[r.lowStock]===void 0?n:Number(e[r.lowStock]);return{text:`${o} left`,tone:o<=a?"low":"ok"}}function Wh(e,t){let r=[];for(let n of e){let o=t(n);if(!r.includes(o))r.push(o)}return r}var Em=["all_at_once","drip","scheduled"];function Fm(e){return typeof e==="string"&&Em.includes(e)}function Lh(e){let t=Number(e.release_interval_days),r=Number(e.release_initial_count),n=Lr(e.release_starts_at);return{mode:Fm(e.release_mode)?e.release_mode:"all_at_once",intervalDays:Number.isInteger(t)&&t>0?t:7,initialCount:Number.isInteger(r)&&r>0?r:1,startsAt:n===null?null:new Date(n).toISOString()}}function Lr(e){if(e==null||e==="")return null;let t=new Date(String(e)).getTime();return Number.isFinite(t)?t:null}function Am(e,t){return Math.max(0,t-(e.initialCount-1))}function Im(e,t,r,n={}){let o=Lr(e.startsAt),a=Math.max(r.getTime(),o??0);if(e.mode==="scheduled"){let s=Lr(n.releaseAt);if(s!==null)return new Date(s);let i=o??r.getTime();return new Date(i+Am(e,t)*e.intervalDays*86400000)}if(e.mode==="drip"){let s=n.offsetDays;if(s!=null&&Number.isFinite(Number(s))&&Number(s)>=0)return new Date(a+Number(s)*86400000);return new Date(a+Am(e,t)*e.intervalDays*86400000)}return new Date(a)}function jh(e,t,r,n,o=[]){let a=[];for(let s=0;s<t;s++){let i=Im(e,s,r,o[s]||{});a.push({index:s,unlock_at:i.toISOString(),unlocked:i.getTime()<=n.getTime()})}return a}function zh(e){let t=0;for(let r of e){if(!r.unlocked)break;t++}return t}function qh(e,t,r,n=new Date){let o=(m)=>`${m} ${r}${m===1?"":"s"}`,a=Lr(e.startsAt),s=a!==null&&a>n.getTime()?` from ${new Date(a).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric",timeZone:"UTC"})}`:"";if(t<=0)return"";if(t===1)return`Available${s||" immediately"}.`;if(e.mode==="all_at_once"||t<=e.initialCount)return`All ${o(t)} available${s||" immediately"}.`;let i=e.intervalDays===1?"every day":e.intervalDays===7?"every week":`every ${e.intervalDays} days`,u=e.initialCount===1,c=u?`The first ${r}`:`The first ${o(e.initialCount)}`;if(e.mode==="drip")return`${c} ${u?"unlocks":"unlock"}${s||" on purchase"}, then one more ${i}.`;if(s)return`${c} ${u?"releases":"release"} on ${s.slice(6)}, then one more ${i}, on the same dates for everyone.`;return`Releasing on a shared schedule${a===null?"":` since ${new Date(a).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric",timeZone:"UTC"})}`}, one more ${r} ${i}. Join now and everything already out is yours.`}import{db as Mm}from"@stacksjs/database/runtime";async function Nm(e){try{let t=await Mm.deleteFrom("receipts").where("id","=",e).executeTakeFirst();return _(t)>0}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete print log: ${t.message}`);throw t}}async function Om(e){if(!e.length)return 0;try{let t=await Mm.deleteFrom("receipts").where("id","in",e).executeTakeFirst();return _(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete receipts: ${t.message}`);throw t}}import{db as Ma}from"@stacksjs/database/runtime";import{formatDate as Gh}from"@stacksjs/orm";function _e(e){return Gh(e)}function Vh(e){if(e instanceof Date)return Number.isNaN(e.getTime())?null:e;if(typeof e==="number"){let n=new Date(e<=2147483647?e*1000:e);return Number.isNaN(n.getTime())?null:n}let t=String(e||"").trim();if(!t)return null;if(/^\d{10}$/.test(t)){let n=new Date(Number(t)*1000);return Number.isNaN(n.getTime())?null:n}let r=new Date(t.includes("T")?t:`${t.replace(" ","T")}Z`);return Number.isNaN(r.getTime())?null:r}async function pt(e){let t=await Ma.selectFrom("receipts").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function $m(){return P(await Ma.selectFrom("receipts").selectAll().execute())}async function Bm(e,t){let r=_e(e),n=_e(t),o=await ue("receipts",{total:{kind:"count"},success:{kind:"count",filter:{column:"status",op:"=",value:"success"}},failed:{kind:"count",filter:{column:"status",op:"=",value:"failed"}},warning:{kind:"count",filter:{column:"status",op:"=",value:"warning"}},averageSize:{kind:"avg",column:"size"},averagePages:{kind:"avg",column:"pages"},averageDuration:{kind:"avg",column:"duration"}},(a)=>a.where("timestamp",">=",r).where("timestamp","<=",n));return{total:o.total,success:o.success,failed:o.failed,warning:o.warning,averageSize:Math.round(o.averageSize),averagePages:Math.round(o.averagePages),averageDuration:Math.round(o.averageDuration)}}async function Um(e,t){let r=_e(e),n=_e(t),o=await ue("receipts",{total:{kind:"count"},success:{kind:"count",filter:{column:"status",op:"=",value:"success"}},failed:{kind:"count",filter:{column:"status",op:"=",value:"failed"}},warning:{kind:"count",filter:{column:"status",op:"=",value:"warning"}}},(s)=>s.where("timestamp",">=",r).where("timestamp","<=",n));return{successRate:o.total>0?Math.round(o.success/o.total*100):0,total:o.total,success:o.success,failed:o.failed,warning:o.warning}}async function Jm(e,t){let r=_e(e),n=_e(t),o=await ue("receipts",{totalReceipts:{kind:"count"},totalPages:{kind:"sum",column:"pages"},averagePagesPerReceipt:{kind:"avg",column:"pages"}},(a)=>a.where("timestamp",">=",r).where("timestamp","<=",n));return{totalPages:o.totalPages,averagePagesPerReceipt:Math.round(o.averagePagesPerReceipt),totalReceipts:o.totalReceipts}}async function Wm(e,t){let r=_e(e),n=_e(t),o=await ue("receipts",{totalJobs:{kind:"count"},averageDuration:{kind:"avg",column:"duration"},minDuration:{kind:"min",column:"duration"},maxDuration:{kind:"max",column:"duration"}},(a)=>a.where("timestamp",">=",r).where("timestamp","<=",n));return{averageDuration:Math.round(o.averageDuration),minDuration:o.minDuration,maxDuration:o.maxDuration,totalJobs:o.totalJobs}}async function Lm(e,t){let r=typeof e==="number"?e:e.getTime(),n=typeof t==="number"?t:t.getTime(),o=_e(e),a=_e(t),s=await Ma.selectFrom("receipts").where("timestamp",">=",o).where("timestamp","<=",a).selectAll().execute(),i=s.length,u=Math.ceil((n-r)/3600000),c=u>0?Math.round(i/u):0,d=Array.from({length:24},(m,l)=>({hour:l,count:0}));return s.forEach((m)=>{let l=Vh(m.timestamp);if(!l)return;d[l.getHours()].count++}),{totalPrints:i,totalHours:u,printsPerHour:c,hourlyBreakdown:d}}var{randomUUIDv7:jm}=globalThis.Bun;import{db as Oa}from"@stacksjs/database/runtime";import{formatDate as Na}from"@stacksjs/orm";function jt(e){try{if(typeof e==="number")return Na(e<=2147483647?e*1000:e);if(typeof e==="string"&&/^\d{10}$/.test(e))return Na(Number(e)*1000);return Na(e)}catch{throw TypeError("Receipt timestamp must be a valid date")}}async function zm(e){try{let t=jm(),r={...e,timestamp:jt(e.timestamp),uuid:t};await Oa.insertInto("receipts").values(r).executeTakeFirst();let n=await Oa.selectFrom("receipts").where("uuid","=",t).selectAll().executeTakeFirst();if(!n)throw Error("Failed to create receipt");return w(n)}catch(t){if(t instanceof Error)throw TypeError(`Failed to create receipt: ${t.message}`);throw t}}async function qm(e){if(!e.length)return 0;try{let t=e.map((n)=>({...n,timestamp:jt(n.timestamp),uuid:jm()})),r=await Oa.insertInto("receipts").values(t).executeTakeFirst();return _(r)}catch(t){if(t instanceof Error)throw TypeError(`Failed to create receipts in bulk: ${t.message}`);throw t}}import{db as $a}from"@stacksjs/database/runtime";import{formatDate as Ba}from"@stacksjs/orm";async function Gm(e,t){try{if(!e)throw Error("Receipt ID is required for update");let r={...t,...t.timestamp===void 0?{}:{timestamp:jt(t.timestamp)},updated_at:Ba(new Date)};await $a.updateTable("receipts").set(r).where("id","=",e).execute();let n=await pt(e);if(!n)return;return w(n)}catch(r){if(r instanceof Error)throw TypeError(`Failed to update receipt: ${r.message}`);throw r}}async function Vm(e,t){try{await $a.updateTable("receipts").set({status:t,updated_at:Ba(new Date)}).where("id","=",e).execute();let r=await pt(e);if(!r)throw Error("Failed to update receipt status");return w(r)}catch(r){if(r instanceof Error)throw TypeError(`Failed to update receipt status: ${r.message}`);throw r}}async function Hm(e,t,r,n){try{let o={updated_at:Ba(new Date)};if(t!==void 0)o.size=t;if(r!==void 0)o.pages=r;if(n!==void 0)o.duration=n;await $a.updateTable("receipts").set(o).where("id","=",e).execute();let a=await pt(e);if(!a)throw Error("Failed to update receipt job information");return w(a)}catch(o){if(o instanceof Error)throw TypeError(`Failed to update receipt job information: ${o.message}`);throw o}}import{db as Km}from"@stacksjs/database/runtime";async function Zm(e){try{let t=await Km.deleteFrom("delivery_routes").where("id","=",e).executeTakeFirst();return _(t)>0}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete delivery route: ${t.message}`);throw t}}async function Qm(e){if(!e.length)return 0;try{let t=await Km.deleteFrom("delivery_routes").where("id","in",e).executeTakeFirst();return _(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete delivery routes: ${t.message}`);throw t}}import{db as jr}from"@stacksjs/database/runtime";async function zr(e){return await jr.selectFrom("delivery_routes").where("id","=",e).selectAll().executeTakeFirst()}async function Ym(){return await jr.selectFrom("delivery_routes").selectAll().execute()}async function Xm(){return await jr.selectFrom("delivery_routes").where("last_active",">=",Date.now()-86400000).selectAll().execute()}async function ep(e){return await jr.selectFrom("delivery_routes").where("courier","=",e).selectAll().execute()}var{randomUUIDv7:Zh}=globalThis.Bun;import{db as Ja}from"@stacksjs/database/runtime";function tt(e,t){let r={};for(let[n,o]of Object.entries(t))for(let a of o){if(!Object.prototype.hasOwnProperty.call(e,a)||e[a]===void 0)continue;r[n]=e[a];break}return r}function zt(e){return tt(e,{name:["name"],description:["description"],base_rate:["base_rate","baseRate"],free_shipping:["free_shipping","freeShipping"],status:["status"]})}function Ie(e){return tt(e,{weight_from:["weight_from","weightFrom"],weight_to:["weight_to","weightTo"],rate:["rate"],shipping_method_id:["shipping_method_id","shippingMethodId","shippingmethod_id"],shipping_zone_id:["shipping_zone_id","shippingZoneId","shippingzone_id"]})}function qt(e){return tt(e,{name:["name"],countries:["countries"],regions:["regions"],postal_codes:["postal_codes","postalCodes"],status:["status"],shipping_method_id:["shipping_method_id","shippingMethodId","shippingmethod_id"]})}function Gt(e){return tt(e,{name:["name"],description:["description"],download_limit:["download_limit","downloadLimit"],expiry_days:["expiry_days","expiryDays"],requires_login:["requires_login","requiresLogin"],automatic_delivery:["automatic_delivery","automaticDelivery"],status:["status"]})}function Vt(e){return tt(e,{key:["key"],template:["template"],expiry_date:["expiry_date","expiryDate"],status:["status"],customer_id:["customer_id","customerId"],product_id:["product_id","productId"],order_id:["order_id","orderId"]})}function Ht(e){return tt(e,{name:["name"],phone:["phone"],vehicle_number:["vehicle_number","vehicleNumber"],license:["license"],status:["status"],user_id:["user_id","userId"]})}function qr(e){return tt(e,{courier:["courier"],courier_id:["courier_id","courierId"],vehicle:["vehicle"],stops:["stops"],delivery_time:["delivery_time","deliveryTime"],total_distance:["total_distance","totalDistance"],last_active:["last_active","lastActive"]})}import{db as Hh}from"@stacksjs/database/runtime";class se extends TypeError{constructor(e){super(e);this.name="DeliveryRouteInputError"}}function Gr(e,t,r){return Number(e[r]??t?.[r])}function Kh(e,t){let r=e.last_active??t?.last_active;if(r===void 0||r===null)return Date.now();if(r instanceof Date)return r.getTime();if(typeof r==="number")return r;if(typeof r==="string"&&/^\d{10,13}$/.test(r))return Number(r);return Number.NaN}async function ft(e,t){let r=Gr(e,t,"courier_id"),n=Gr(e,t,"stops"),o=Gr(e,t,"delivery_time"),a=Gr(e,t,"total_distance"),s=Kh(e,t);if(!Number.isSafeInteger(r)||r<1)throw new se("Courier must be a positive integer.");if(!Number.isSafeInteger(n)||n<0)throw new se("Stops must be a non-negative integer.");if(!Number.isSafeInteger(o)||o<0)throw new se("Delivery time must be a non-negative integer.");if(!Number.isSafeInteger(a)||a<0)throw new se("Total distance must be a non-negative integer.");if(!Number.isSafeInteger(s)||s<0)throw new se("Last active must be a valid Unix timestamp.");let i=await Hh.selectFrom("couriers").where("id","=",r).select(["id","name","vehicle_number"]).executeTakeFirst();if(!i)throw new se(`Courier ${r} was not found.`);return{...e,courier_id:Number(i.id),courier:i.name,vehicle:i.vehicle_number,last_active:s}}async function tp(e){try{let t=Zh(),r=qr(e),o={...await ft(r),uuid:t};await Ja.insertInto("delivery_routes").values(o).executeTakeFirst();let a=await Ja.selectFrom("delivery_routes").where("uuid","=",t).selectAll().executeTakeFirst();if(!a)throw Error("Failed to create delivery route");return a}catch(t){if(t instanceof se)throw t;if(t instanceof Error)throw TypeError(`Failed to create delivery route: ${t.message}`);throw t}}async function rp(e){try{await Ja.updateTable("delivery_routes").set({last_active:Date.now(),updated_at:new Date().toISOString()}).where("id","=",e).execute();let t=await zr(e);if(!t)throw Error("Failed to update delivery route last active");return t}catch(t){if(t instanceof Error)throw TypeError(`Failed to update delivery route last active: ${t.message}`);throw t}}import{db as Vr}from"@stacksjs/database/runtime";import{formatDate as Wa}from"@stacksjs/orm";async function np(e,t){try{if(!e)throw Error("Delivery route ID is required for update");let r=await Vr.selectFrom("delivery_routes").where("id","=",e).selectAll().executeTakeFirst();if(!r)return;let n=qr(t),o=await ft(n,r),a=await Vr.updateTable("delivery_routes").set({...o,updated_at:Wa(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!a)return;return a}catch(r){if(r instanceof se)throw r;if(r instanceof Error)throw TypeError(`Failed to update delivery route: ${r.message}`);throw r}}async function op(e,t){try{let r=await Vr.updateTable("delivery_routes").set({stops:t,updated_at:Wa(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!r)throw Error("Failed to update delivery route stops");return r}catch(r){if(r instanceof Error)throw TypeError(`Failed to update delivery route stops: ${r.message}`);throw r}}async function ap(e,t,r){try{let n={updated_at:Wa(new Date)};if(t!==void 0)n.delivery_time=t;if(r!==void 0)n.total_distance=r;let o=await Vr.updateTable("delivery_routes").set(n).where("id","=",e).returningAll().executeTakeFirst();if(!o)throw Error("Failed to update delivery metrics");return o}catch(n){if(n instanceof Error)throw TypeError(`Failed to update delivery metrics: ${n.message}`);throw n}}import{db as Kr,matchedRows as sp}from"@stacksjs/database/runtime";async function ip(e){try{let t=await Kr.deleteFrom("digital_deliveries").where("id","=",e).executeTakeFirst();return _(t)>0}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete digital delivery: ${t.message}`);throw t}}async function up(e){try{return(await sp(Kr.updateTable("digital_deliveries").set({status:"inactive"}).where("id","=",e))).length>0}catch(t){if(t instanceof Error)throw TypeError(`Failed to soft delete digital delivery: ${t.message}`);throw t}}async function cp(e){if(!e.length)return 0;try{let t=await Kr.deleteFrom("digital_deliveries").where("id","in",e).executeTakeFirst();return _(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete digital deliveries: ${t.message}`);throw t}}async function dp(e){if(!e.length)return 0;try{return(await sp(Kr.updateTable("digital_deliveries").set({status:"inactive"}).where("id","in",e))).length}catch(t){if(t instanceof Error)throw TypeError(`Failed to soft delete digital deliveries: ${t.message}`);throw t}}import{db as lp}from"@stacksjs/database/runtime";async function mp(e){let t=await lp.selectFrom("digital_deliveries").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function pp(){return P(await lp.selectFrom("digital_deliveries").selectAll().execute())}var{randomUUIDv7:fp}=globalThis.Bun;import{db as La}from"@stacksjs/database/runtime";async function wp(e){try{let t=fp(),r={...Gt(e),uuid:t};await La.insertInto("digital_deliveries").values(r).executeTakeFirst();let n=await La.selectFrom("digital_deliveries").where("uuid","=",t).selectAll().executeTakeFirst();if(!n)throw Error("Failed to resolve created digital delivery");return w(n)}catch(t){if(t instanceof Error)throw TypeError(`Failed to create digital delivery: ${t.message}`);throw t}}async function yp(e){if(!e.length)return 0;try{let t=e.map((n)=>({...Gt(n),uuid:fp()})),r=await La.insertInto("digital_deliveries").values(t).executeTakeFirst();return _(r)}catch(t){if(t instanceof Error)throw TypeError(`Failed to create digital deliveries in bulk: ${t.message}`);throw t}}import{db as ja}from"@stacksjs/database/runtime";import{formatDate as za}from"@stacksjs/orm";async function gp(e,t){try{if(!e)throw Error("Digital delivery ID is required for update");let r=await ja.updateTable("digital_deliveries").set({...Gt(t),updated_at:za(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!r)return;return w(r)}catch(r){if(r instanceof Error)throw TypeError(`Failed to update digital delivery: ${r.message}`);throw r}}async function hp(e,t){try{let r=await ja.updateTable("digital_deliveries").set({status:t,updated_at:za(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!r)throw Error("Failed to update digital delivery status");return w(r)}catch(r){if(r instanceof Error)throw TypeError(`Failed to update digital delivery status: ${r.message}`);throw r}}async function bp(e,t,r,n,o){try{let a={updated_at:za(new Date)};if(t!==void 0)a.download_limit=t;if(r!==void 0)a.expiry_days=r;if(n!==void 0)a.requires_login=n;if(o!==void 0)a.automatic_delivery=o;let s=await ja.updateTable("digital_deliveries").set(a).where("id","=",e).returningAll().executeTakeFirst();if(!s)throw Error("Failed to update delivery settings");return w(s)}catch(a){if(a instanceof Error)throw TypeError(`Failed to update delivery settings: ${a.message}`);throw a}}import{db as Rp}from"@stacksjs/database/runtime";import{db as _p}from"@stacksjs/database/runtime";async function Qr(e){let t=await _p.selectFrom("couriers").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function xp(){return P(await _p.selectFrom("couriers").selectAll().execute())}async function Pp(e){try{let t=await Rp.deleteFrom("couriers").where("id","=",e).executeTakeFirst();return _(t)>0}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete courier: ${t.message}`);throw t}}async function vp(e){if(!e.length)return 0;let t=0;try{return await Rp.transaction(async(r)=>{for(let n of e)if(await Qr(n))await r.deleteFrom("couriers").where("id","=",n).execute(),t++}),t}catch(r){if(r instanceof Error)throw TypeError(`Failed to delete couriers in bulk: ${r.message}`);throw r}}var{randomUUIDv7:Dp}=globalThis.Bun;import{db as qa}from"@stacksjs/database/runtime";async function Sp(e){try{let t=Dp(),r={...Ht(e),uuid:t};await qa.insertInto("couriers").values(r).executeTakeFirst();let n=await qa.selectFrom("couriers").where("uuid","=",t).selectAll().executeTakeFirst();if(!n)throw Error("Failed to resolve created courier");return w(n)}catch(t){if(t instanceof Error)throw TypeError(`Failed to create courier: ${t.message}`);throw t}}async function kp(e){if(!e.length)return 0;try{let t=e.map((n)=>({...Ht(n),uuid:Dp()})),r=await qa.insertInto("couriers").values(t).executeTakeFirst();return _(r)}catch(t){if(t instanceof Error)throw TypeError(`Failed to create couriers in bulk: ${t.message}`);throw t}}import{db as Ga}from"@stacksjs/database/runtime";import{formatDate as Va}from"@stacksjs/orm";async function Cp(e,t){try{if(!e)throw Error("Courier ID is required for update");let r=await Ga.updateTable("couriers").set({...Ht(t),updated_at:Va(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!r)return;return w(r)}catch(r){if(r instanceof Error)throw TypeError(`Failed to update courier: ${r.message}`);throw r}}async function Tp(e,t){try{let r=await Ga.updateTable("couriers").set({status:t,updated_at:Va(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!r)throw Error("Failed to update courier status");return w(r)}catch(r){if(r instanceof Error)throw TypeError(`Failed to update courier status: ${r.message}`);throw r}}async function Ap(e,t){try{let r={updated_at:Va(new Date)};if(t!==void 0)r.phone=t;let n=await Ga.updateTable("couriers").set(r).where("id","=",e).returningAll().executeTakeFirst();if(!n)throw Error("Failed to update contact information");return w(n)}catch(r){if(r instanceof Error)throw TypeError(`Failed to update contact information: ${r.message}`);throw r}}var rt=(e)=>e*Math.PI/180;function We(e,t){let r=rt(t.latitude-e.latitude),n=rt(t.longitude-e.longitude),o=rt(e.latitude),a=rt(t.latitude),s=Math.sin(r/2)**2+Math.sin(n/2)**2*Math.cos(o)*Math.cos(a);return 12742017.6*Math.asin(Math.sqrt(s))}function Xr(e,t){let r=rt(e.latitude),n=rt(t.latitude),o=rt(t.longitude-e.longitude),a=Math.sin(o)*Math.cos(n),s=Math.cos(r)*Math.sin(n)-Math.sin(r)*Math.cos(n)*Math.cos(o);return(Math.atan2(a,s)*180/Math.PI+360)%360}function en(e,t,r={}){let n=r.detourFactor??1.35,o=r.minimumSeconds??30;if(!Number.isFinite(t)||t<=0.5)return null;let a=e*n/t;return Math.max(o,Math.round(a))}function Ep(e,t,r){return We(e,t)<=r}function Kt(e){return typeof e?.latitude==="number"&&typeof e?.longitude==="number"&&Number.isFinite(e.latitude)&&Number.isFinite(e.longitude)}var Zt={unknown:0,locality:1,postal:2,street:3,rooftop:4};function wt(e){return[e.street,e.city,e.region,e.postalCode,e.country].map((t)=>String(t??"").trim()).filter(Boolean).join(", ")}var Qh="https://nominatim.openstreetmap.org/search",Fp=1000,Ip=0,Mp=Promise.resolve();async function Yh(e){let t=Mp.then(async()=>{let r=Date.now()-Ip;if(r<Fp)await Bun.sleep(Fp-r);return Ip=Date.now(),e()});return Mp=t.then(()=>{return},()=>{return}),t}function Xh(e){let t=e.address??{},r=String(e.addresstype??""),n=String(e.type??""),o=String(e.category??e.class??"");if(t.house_number||n==="house"||n==="building"||r==="building")return"rooftop";if(t.road||o==="highway"||r==="road")return"street";if(r==="postcode"||t.postcode&&!t.road)return"postal";if(["city","town","village","suburb","neighbourhood"].includes(r))return"locality";return"unknown"}function tn(e={}){let t=e.userAgent??`${process.env.APP_NAME??"Stacks"} (${process.env.APP_URL??"stacks-app"})`,r=e.endpoint??Qh;return{name:"nominatim",async geocode(n){let o=wt(n);if(!o)return null;let a=new URL(r);if(a.searchParams.set("q",o),a.searchParams.set("format","jsonv2"),a.searchParams.set("limit","1"),a.searchParams.set("addressdetails","1"),n.country)a.searchParams.set("countrycodes",n.country.toLowerCase());let s=await Yh(()=>fetch(a,{headers:{"user-agent":t,accept:"application/json"},signal:AbortSignal.timeout(8000)}));if(!s.ok)throw Error(`Nominatim responded ${s.status}`);let u=(await s.json())?.[0];if(!u)return null;let c=Number(u.lat),d=Number(u.lon);if(!Number.isFinite(c)||!Number.isFinite(d))return null;let m=Xh(u);return{latitude:c,longitude:d,formatted:String(u.display_name??o),confidence:{rooftop:1,street:0.8,postal:0.5,locality:0.3,unknown:0.1}[m],precision:m,provider:"nominatim"}}}}var Np=null;function eb(e){Np=e}function Op(){return Np??tn()}async function tb(e,t={}){let r=t.driver??Op(),n=t.minimumPrecision??"street",o=`geocode:${r.name}:${wt(e).toLowerCase()}`,a=await nb(o);if(a!==void 0)return a;let s=await r.geocode(e),i=s&&Zt[s.precision]>=Zt[n]?s:null;return await ob(o,i,i?t.cacheSeconds??2592000:600),i}function rb(e,t,r){if(t.length===0)return null;let n=t[0],o=We(e,n);for(let a of t.slice(1)){let s=We(e,a);if(s<o)o=s,n=a}return{covered:o<=r,distanceMeters:Math.round(o),nearest:n}}async function nb(e){try{let r=(await import("@stacksjs/cache").catch(()=>null))?.cache;if(!r)return;let n=await r.get(e);if(n===null||n===void 0)return;return n==="null"?null:JSON.parse(String(n))}catch{return}}async function ob(e,t,r){try{let o=(await import("@stacksjs/cache").catch(()=>null))?.cache;if(!o)return;await o.set(e,t===null?"null":JSON.stringify(t),r)}catch{}}import{db as nn,matchedRows as $p}from"@stacksjs/database/runtime";async function Bp(e){try{let t=await nn.deleteFrom("license_keys").where("id","=",e).executeTakeFirst();return _(t)>0}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete license key: ${t.message}`);throw t}}async function Up(e){try{return(await $p(nn.updateTable("license_keys").set({status:"inactive"}).where("id","=",e))).length>0}catch(t){if(t instanceof Error)throw TypeError(`Failed to soft delete license key: ${t.message}`);throw t}}async function Jp(e){if(!e.length)return 0;try{let t=await nn.deleteFrom("license_keys").where("id","in",e).executeTakeFirst();return _(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete license keys: ${t.message}`);throw t}}async function Wp(e){if(!e.length)return 0;try{return(await $p(nn.updateTable("license_keys").set({status:"inactive"}).where("id","in",e))).length}catch(t){if(t instanceof Error)throw TypeError(`Failed to soft delete license keys: ${t.message}`);throw t}}import{db as Lp}from"@stacksjs/database/runtime";async function jp(e){let t=await Lp.selectFrom("license_keys").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function zp(){return P(await Lp.selectFrom("license_keys").selectAll().execute())}var{randomUUIDv7:Vp}=globalThis.Bun;import{db as Za}from"@stacksjs/database/runtime";import{db as Ha}from"@stacksjs/database/runtime";var qp=["Standard License","Premium License","Enterprise License"],Gp=["active","inactive","unassigned"];class q extends TypeError{constructor(e){super(e);this.name="LicenseKeyInputError"}}function Qt(e,t,r){return e[r]!==void 0?e[r]:t?.[r]}function Ka(e,t,r,n){let o=Qt(e,t,r);if(o===void 0||o===null||o==="")return null;let a=Number(o);if(!Number.isSafeInteger(a)||a<1)throw new q(`${n} must be a positive integer or null.`);return a}function ab(e){if(typeof e==="number")return e>2147483647?Math.floor(e/1000):e;if(typeof e==="string"&&/^\d{10,13}$/.test(e))return e.length===13?Math.floor(Number(e)/1000):Number(e);if(typeof e==="string"){let t=/^\d{4}-\d{2}-\d{2} \d/.test(e)?`${e.replace(" ","T")}Z`:e;return Math.floor(new Date(t).getTime()/1000)}return Number.NaN}async function nt(e,t){let r=String(Qt(e,t,"key")||"").trim().toUpperCase(),n=String(Qt(e,t,"template")||""),o=String(Qt(e,t,"status")||""),a=ab(Qt(e,t,"expiry_date")),s=Ka(e,t,"customer_id","Customer"),i=Ka(e,t,"product_id","Product"),u=Ka(e,t,"order_id","Order");if(!/^[A-Z0-9]{4}(?:-[A-Z0-9]{4}){4}$/.test(r))throw new q("License key must use five groups of four uppercase letters or numbers.");if(!qp.includes(n))throw new q(`Template must be one of: ${qp.join(", ")}.`);if(!Gp.includes(o))throw new q(`Status must be one of: ${Gp.join(", ")}.`);if(!Number.isSafeInteger(a)||a<0||a>2147483647)throw new q("Expiry date must be a Unix timestamp between 1970 and 2038.");let[c,d,m]=await Promise.all([s?Ha.selectFrom("customers").where("id","=",s).select("id").executeTakeFirst():null,i?Ha.selectFrom("products").where("id","=",i).select("id").executeTakeFirst():null,u?Ha.selectFrom("orders").where("id","=",u).select(["id","customer_id"]).executeTakeFirst():null]);if(s&&!c)throw new q(`Customer ${s} was not found.`);if(i&&!d)throw new q(`Product ${i} was not found.`);if(u&&!m)throw new q(`Order ${u} was not found.`);if(s&&m?.customer_id&&Number(m.customer_id)!==s)throw new q(`Order ${u} belongs to Customer ${m.customer_id}, not Customer ${s}.`);return{...e,key:r,template:n,expiry_date:a,status:o,customer_id:s,product_id:i,order_id:u}}async function Hp(e){try{let t=Vp(),r=Vt(e),n={...await nt(r),uuid:t};await Za.insertInto("license_keys").values(n).executeTakeFirst();let o=await Za.selectFrom("license_keys").where("uuid","=",t).selectAll().executeTakeFirst();if(!o)throw Error("Failed to resolve created license key");return w(o)}catch(t){if(t instanceof q)throw t;if(t instanceof Error){if(t.message.includes("UNIQUE constraint failed: license_keys.key"))throw new q("A license key with this value already exists.");throw TypeError(`Failed to create license key: ${t.message}`)}throw t}}async function Kp(e){if(!e.length)return 0;try{let t=await Promise.all(e.map(async(n)=>({...await nt(Vt(n)),uuid:Vp()}))),r=await Za.insertInto("license_keys").values(t).executeTakeFirst();return _(r)}catch(t){if(t instanceof q)throw t;if(t instanceof Error)throw TypeError(`Failed to create license keys in bulk: ${t.message}`);throw t}}import{db as on}from"@stacksjs/database/runtime";import{formatDate as Qa}from"@stacksjs/orm";async function Zp(e,t){try{if(!e)throw Error("License key ID is required for update");let r=await on.selectFrom("license_keys").where("id","=",e).selectAll().executeTakeFirst();if(!r)return;let n=Vt(t),o=await nt(n,r),a=await on.updateTable("license_keys").set({...o,updated_at:Qa(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!a)return;return w(a)}catch(r){if(r instanceof q)throw r;if(r instanceof Error){if(r.message.includes("UNIQUE constraint failed: license_keys.key"))throw new q("A license key with this value already exists.");throw TypeError(`Failed to update license key: ${r.message}`)}throw r}}async function Qp(e,t){try{let r=await on.updateTable("license_keys").set({status:t,updated_at:Qa(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!r)throw Error("Failed to update license key status");return w(r)}catch(r){if(r instanceof Error)throw TypeError(`Failed to update license key status: ${r.message}`);throw r}}async function Yp(e,t){try{let r={updated_at:Qa(new Date)};if(t!==void 0)r.expiry_date=t;let n=await on.updateTable("license_keys").set(r).where("id","=",e).returningAll().executeTakeFirst();if(!n)throw Error("Failed to update expiration information");return w(n)}catch(r){if(r instanceof Error)throw TypeError(`Failed to update expiration information: ${r.message}`);throw r}}import{db as sn,matchedRows as Xp}from"@stacksjs/database/runtime";async function ef(e){try{let t=await sn.deleteFrom("shipping_methods").where("id","=",e).executeTakeFirst();return _(t)>0}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete shipping method: ${t.message}`);throw t}}async function tf(e){try{return(await Xp(sn.updateTable("shipping_methods").set({status:"inactive"}).where("id","=",e))).length>0}catch(t){if(t instanceof Error)throw TypeError(`Failed to soft delete shipping method: ${t.message}`);throw t}}async function rf(e){if(!e.length)return 0;try{let t=await sn.deleteFrom("shipping_methods").where("id","in",e).executeTakeFirst();return _(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete shipping methods: ${t.message}`);throw t}}async function nf(e){if(!e.length)return 0;try{return(await Xp(sn.updateTable("shipping_methods").set({status:"inactive"}).where("id","in",e))).length}catch(t){if(t instanceof Error)throw TypeError(`Failed to soft delete shipping methods: ${t.message}`);throw t}}import{db as un}from"@stacksjs/database/runtime";async function cn(e){let t=await un.selectFrom("shipping_methods").where("id","=",e).selectAll().executeTakeFirst();if(t){let r=await un.selectFrom("shipping_zones").where("shipping_method_id","=",e).selectAll().execute();return{...t,shippingZones:r}}return}async function of(){let e=await un.selectFrom("shipping_methods").selectAll().execute();if(e.length===0)return[];let t=[...new Set(e.map((a)=>a.id))],o=(await un.selectFrom("shipping_zones").where("shipping_method_id","in",t).selectAll().execute()).reduce((a,s)=>{let i=s.shipping_method_id;if(i!==null&&i!==void 0){if(!a[i])a[i]=[];a[i].push(s)}return a},{});return e.map((a)=>({...a,shipping_zones:o[a.id]||[]}))}var{randomUUIDv7:af}=globalThis.Bun;import{db as Yt}from"@stacksjs/database/runtime";async function sf(e){try{let t=af(),r={...zt(e),uuid:t};await Yt.insertInto("shipping_methods").values(r).executeTakeFirst();let n=await Yt.selectFrom("shipping_methods").where("uuid","=",t).selectAll().executeTakeFirst();if(!n)throw Error("Failed to resolve created shipping method");return w(n)}catch(t){if(t instanceof Error)throw TypeError(`Failed to create shipping method: ${t.message}`);throw t}}async function uf(e){if(!e.length)return 0;try{let t=e.map((n)=>({...zt(n),uuid:af()})),r=await Yt.insertInto("shipping_methods").values(t).executeTakeFirst();return _(r)}catch(t){if(t instanceof Error)throw TypeError(`Failed to create shipping methods in bulk: ${t.message}`);throw t}}function cf(){try{return Yt.selectFrom("shipping_methods").select(["id","name","status","base_rate"]).orderBy("name").execute()}catch(e){if(e instanceof Error)throw TypeError(`Failed to format shipping options: ${e.message}`);throw e}}async function df(){try{let e=await Yt.selectFrom("shipping_methods").selectAll().where("status","=","active").orderBy("name").execute();return P(e)}catch(e){if(e instanceof Error)throw TypeError(`Failed to get active shipping methods: ${e.message}`);throw e}}import{db as Ya}from"@stacksjs/database/runtime";import{formatDate as Xa}from"@stacksjs/orm";async function lf(e,t){try{if(!e)throw Error("Shipping method ID is required for update");let r=await Ya.updateTable("shipping_methods").set({...zt(t),updated_at:Xa(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!r)return;return w(r)}catch(r){if(r instanceof Error)throw TypeError(`Failed to update shipping method: ${r.message}`);throw r}}async function mf(e,t){try{let r=await Ya.updateTable("shipping_methods").set({status:t,updated_at:Xa(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!r)throw Error("Failed to update shipping method status");return w(r)}catch(r){if(r instanceof Error)throw TypeError(`Failed to update shipping method status: ${r.message}`);throw r}}async function pf(e,t,r){try{let n={updated_at:Xa(new Date)};if(t!==void 0)n.base_rate=t;if(r!==void 0)n.free_shipping=r;let o=await Ya.updateTable("shipping_methods").set(n).where("id","=",e).returningAll().executeTakeFirst();if(!o)throw Error("Failed to update pricing information");return w(o)}catch(n){if(n instanceof Error)throw TypeError(`Failed to update pricing information: ${n.message}`);throw n}}import{db as ln}from"@stacksjs/database/runtime";async function ff(e){try{let t=await ln.deleteFrom("shipping_rates").where("id","=",e).executeTakeFirst();return _(t)>0}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete shipping rate: ${t.message}`);throw t}}async function wf(e){if(!e.length)return 0;try{let t=await ln.deleteFrom("shipping_rates").where("id","in",e).executeTakeFirst();return _(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete shipping rates: ${t.message}`);throw t}}async function yf(e){try{let t=await ln.deleteFrom("shipping_rates").where("shipping_zone_id","=",e).executeTakeFirst();return _(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete shipping rates by zone: ${t.message}`);throw t}}async function gf(e){try{let t=await ln.deleteFrom("shipping_rates").where("shipping_method_id","=",e).executeTakeFirst();return _(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete shipping rates by method: ${t.message}`);throw t}}import{db as me}from"@stacksjs/database/runtime";async function bf(e){let t=await me.selectFrom("shipping_rates").where("id","=",e).selectAll().executeTakeFirst();if(t){let r=null,n=null;if(t.shipping_zone_id)r=await me.selectFrom("shipping_zones").where("id","=",t.shipping_zone_id).selectAll().executeTakeFirst();if(t.shipping_method_id)n=await me.selectFrom("shipping_methods").where("id","=",t.shipping_method_id).selectAll().executeTakeFirst();return{...t,shipping_zone:r,shipping_method:n}}return}async function _f(){let e=await me.selectFrom("shipping_rates").selectAll().execute();if(e.length===0)return[];let t=[...new Set(e.map((i)=>i.shipping_zone_id).filter((i)=>i!==null&&i!==void 0))],r=[...new Set(e.map((i)=>i.shipping_method_id).filter((i)=>i!==null&&i!==void 0))],[n,o]=await Promise.all([t.length?me.selectFrom("shipping_zones").where("id","in",t).selectAll().execute():[],r.length?me.selectFrom("shipping_methods").where("id","in",r).selectAll().execute():[]]),a=n.reduce((i,u)=>(i[u.id]=u,i),{}),s=o.reduce((i,u)=>(i[u.id]=u,i),{});return e.map((i)=>({...i,shipping_zone:i.shipping_zone_id?a[i.shipping_zone_id]:[],shipping_method:i.shipping_method_id?s[i.shipping_method_id]:[]}))}async function xf(e){try{let t=await me.selectFrom("shipping_rates").selectAll().where("shipping_zone_id","=",e).orderBy("weight_from").execute();return P(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to get shipping rates by zone: ${t.message}`);throw t}}async function es(e,t){try{let r=await me.selectFrom("shipping_rates").selectAll().where("shipping_zone_id","=",t).where("weight_from","<=",e).where("weight_to",">=",e).executeTakeFirst();return w(r,!0)}catch(r){if(r instanceof Error)throw TypeError(`Failed to get shipping rate by weight and zone: ${r.message}`);throw r}}async function mn(e){if(!e?.countryCode)return null;try{let t=await me.selectFrom("shipping_zones").selectAll().where("countries","like",`%${e.countryCode}%`).where("status","=","active").execute();if(t.length===0)return null;let r=null;for(let n of t){let o=1;if(e.region&&n.regions&&hf(n.regions,e.region))o=2;if(e.postalCode&&n.postal_codes&&hf(n.postal_codes,e.postalCode))o=3;if(!r||o>r.score)r={id:n.id,score:o}}return r?.id??null}catch{return null}}async function Rf(e,t){let r=await mn(t);if(r==null)return;return es(e,r)}async function Pf(e,t){return await mn(t)===e}function hf(e,t){if(!e||!t)return!1;let r=t.trim().toUpperCase();for(let n of e.split(/[,|;]/))if(n.trim().toUpperCase()===r)return!0;return!1}async function vf(){try{return(await me.selectFrom("shipping_rates").select(["id","shipping_method_id","shipping_zone_id","rate"]).orderBy("shipping_method_id").execute()).filter((t)=>t.shipping_method_id!==null&&t.shipping_method_id!==void 0&&t.shipping_zone_id!==null&&t.shipping_zone_id!==void 0)}catch(e){if(e instanceof Error)throw TypeError(`Failed to format shipping rate options: ${e.message}`);throw e}}async function Df(e){try{let t=await me.selectFrom("shipping_rates").selectAll().where("shipping_method_id","=",e).orderBy("weight_from").execute();return P(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to get shipping rates by method: ${t.message}`);throw t}}var{randomUUIDv7:Af}=globalThis.Bun;import{db as ts}from"@stacksjs/database/runtime";import{db as Xt}from"@stacksjs/database/runtime";async function Sf(){return P(await Xt.selectFrom("shipping_zones").selectAll().execute())}async function pn(e){let t=await Xt.selectFrom("shipping_zones").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}function kf(){try{return Xt.selectFrom("shipping_zones").select(["id","name","status","countries"]).orderBy("name").execute()}catch(e){if(e instanceof Error)throw TypeError(`Failed to format shipping zone options: ${e.message}`);throw e}}async function Cf(){try{let e=await Xt.selectFrom("shipping_zones").selectAll().where("status","=","active").orderBy("name").execute();return P(e)}catch(e){if(e instanceof Error)throw TypeError(`Failed to get active shipping zones: ${e.message}`);throw e}}async function Tf(e){try{let t=await Xt.selectFrom("shipping_zones").selectAll().where("countries","like",`%${e}%`).where("status","=","active").orderBy("name").execute();return P(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to get shipping zones by country: ${t.message}`);throw t}}class Y extends TypeError{constructor(e){super(e);this.name="ShippingRateInputError"}}function er(e,t,r){return Number(e[r]??t?.[r])}async function ot(e,t){let r=er(e,t,"shipping_method_id"),n=er(e,t,"shipping_zone_id"),o=er(e,t,"weight_from"),a=er(e,t,"weight_to"),s=er(e,t,"rate");if(!Number.isSafeInteger(r)||r<1)throw new Y("Shipping method must be a positive integer.");if(!Number.isSafeInteger(n)||n<1)throw new Y("Shipping zone must be a positive integer.");if(!Number.isFinite(o)||o<0)throw new Y("Weight from must be a non-negative number.");if(!Number.isFinite(a)||a<o)throw new Y("Weight to must be greater than or equal to weight from.");if(!Number.isSafeInteger(s)||s<0)throw new Y("Rate must be a non-negative integer in minor currency units.");let[i,u]=await Promise.all([cn(r),pn(n)]);if(!i)throw new Y(`Shipping method ${r} was not found.`);if(!u)throw new Y(`Shipping zone ${n} was not found.`);if(Number(u.shipping_method_id)!==r)throw new Y(`Shipping zone ${n} is not assigned to shipping method ${r}.`)}async function Ef(e){try{let t=Ie(e),r=Number(t.shipping_method_id),n=Number(t.shipping_zone_id);await ot(t);let o=Af(),a={...t,shipping_method_id:r,shipping_zone_id:n,uuid:o};await ts.insertInto("shipping_rates").values(a).executeTakeFirst();let s=await ts.selectFrom("shipping_rates").where("uuid","=",o).selectAll().executeTakeFirst();if(!s)throw Error("Failed to resolve created shipping rate");return w(s)}catch(t){if(t instanceof Y)throw t;if(t instanceof Error)throw TypeError(`Failed to create shipping rate: ${t.message}`);throw t}}async function Ff(e){if(!e.length)return 0;try{for(let n of e){let o=Ie(n);await ot(o)}let t=e.map((n)=>({...Ie(n),uuid:Af()})),r=await ts.insertInto("shipping_rates").values(t).executeTakeFirst();return _(r)}catch(t){if(t instanceof Y)throw t;if(t instanceof Error)throw TypeError(`Failed to create shipping rates in bulk: ${t.message}`);throw t}}import{db as tr,matchedRows as rs}from"@stacksjs/database/runtime";import{formatDate as fn}from"@stacksjs/orm";async function If(e,t){try{if(!e)throw Error("Shipping rate ID is required for update");let r=await tr.selectFrom("shipping_rates").where("id","=",e).selectAll().executeTakeFirst();if(!r)return;let n=Ie(t);await ot(n,r);let o=await tr.updateTable("shipping_rates").set({...n,updated_at:fn(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!o)return;return w(o)}catch(r){if(r instanceof Y)throw r;if(r instanceof Error)throw TypeError(`Failed to update shipping rate: ${r.message}`);throw r}}async function Mf(e){if(!e.length)return 0;try{let t=0;for(let{id:r,data:n}of e)if((await rs(tr.updateTable("shipping_rates").set({...Ie(n),updated_at:fn(new Date)}).where("id","=",r))).length>0)t++;return t}catch(t){if(t instanceof Error)throw TypeError(`Failed to update shipping rates in bulk: ${t.message}`);throw t}}async function Nf(e,t){try{return(await rs(tr.updateTable("shipping_rates").set({...Ie(t),updated_at:fn(new Date)}).where("shipping_zone_id","=",e))).length}catch(r){if(r instanceof Error)throw TypeError(`Failed to update shipping rates by zone: ${r.message}`);throw r}}async function Of(e,t){try{return(await rs(tr.updateTable("shipping_rates").set({...Ie(t),updated_at:fn(new Date)}).where("shipping_method_id","=",e))).length}catch(r){if(r instanceof Error)throw TypeError(`Failed to update shipping rates by method: ${r.message}`);throw r}}function Le(e){return`order.${e}`}function ns(e){return`delivery-route.${e}`}async function yt(e,t){try{let r=await import("@stacksjs/events").catch(()=>null);if(!r)return;let n=r.dispatch;if(typeof n!=="function")return;n(e,t)}catch{}}async function Me(e,t,r){try{let n=await import("@stacksjs/realtime").catch(()=>null);if(!n)return;let o=n.channel;if(typeof o!=="function")return;await o(e).broadcast(t,r,"private")}catch{}}async function yn(e,t,r){await Promise.all([...e.map((n)=>Me(Le(n),"delivery:position",r)),t==null?Promise.resolve():Me(ns(t),"delivery:position",r)])}async function gn(e){if(await yt("delivery:assigned",{stop:e}),e.order_id!=null)await Me(Le(e.order_id),"delivery:assigned",{stop:e})}async function hn(e){if(await yt("delivery:started",{stop:e}),e.order_id!=null)await Me(Le(e.order_id),"delivery:started",{stop:e})}async function bn(e,t,r){if(await yt("delivery:nearby",{stop:e,distanceMeters:t,etaSeconds:r}),e.order_id!=null)await Me(Le(e.order_id),"delivery:nearby",{stop:e,distanceMeters:t,etaSeconds:r})}async function _n(e){if(await yt("delivery:arrived",{stop:e}),e.order_id!=null)await Me(Le(e.order_id),"delivery:arrived",{stop:e})}async function xn(e){if(await yt("delivery:completed",{stop:e}),e.order_id!=null)await Me(Le(e.order_id),"delivery:completed",{stop:e})}async function Rn(e,t){await yt("delivery:failed",{stop:e,reason:t})}var{randomUUIDv7:sb}=globalThis.Bun;import{db as Ne}from"@stacksjs/database/runtime";var os=400,as=60,ib=250;async function $f(e){let t=e.recordedAt??new Date().toISOString(),r=typeof e.accuracy!=="number"||e.accuracy<=ib,n=await Ne.selectFrom("couriers").where("id","=",e.courierId).select(["id","latitude","longitude"]).executeTakeFirst();if(!n)throw Error(`Unknown courier: ${e.courierId}`);let o=Kt(n)?{latitude:n.latitude,longitude:n.longitude}:null,a=typeof e.heading==="number"?e.heading:o?Xr(o,e):null,s=await ub(e.courierId),i=s?await cb(s.id):null,u=null,c=null,d=!1,m=!1,l=i&&Kt({latitude:i.latitude??void 0,longitude:i.longitude??void 0})?{latitude:i.latitude,longitude:i.longitude}:null;if(r&&i&&l)u=Math.round(We(e,l)),c=en(u,e.speed??0),m=u<=as&&i.arrived_at==null,d=!m&&u<=os&&i.status==="en_route"&&i.notified_nearby_at==null;let y=await db({courierId:e.courierId,routeId:s?.id??null,latitude:e.latitude,longitude:e.longitude,heading:a,speed:e.speed??null,accuracy:e.accuracy??null,recordedAt:t});if(r)await Ne.updateTable("couriers").set({latitude:e.latitude,longitude:e.longitude,heading:a,speed:e.speed??0,last_ping_at:t}).where("id","=",e.courierId).execute();if(i&&(u!=null||c!=null))await Ne.updateTable("delivery_stops").set({eta_at:c==null?i.eta_at:new Date(Date.now()+c*1000).toISOString()}).where("id","=",i.id).execute();if(r)await yn(i?.order_id==null?[]:[i.order_id],s?.id??null,{courierId:e.courierId,routeId:s?.id??null,latitude:e.latitude,longitude:e.longitude,heading:a,speed:e.speed??null,accuracy:e.accuracy??null,recordedAt:t,distanceToStopMeters:u,etaSeconds:c});if(d&&i)await Ne.updateTable("delivery_stops").set({notified_nearby_at:t}).where("id","=",i.id).execute(),await bn(i,u,c);if(m&&i)await Ne.updateTable("delivery_stops").set({status:"arrived",arrived_at:t}).where("id","=",i.id).execute(),await _n({...i,status:"arrived",arrived_at:t});return{pingId:y,routeId:s?.id??null,stopId:i?.id??null,distanceToStopMeters:u,etaSeconds:c,crossedNearby:d,crossedArrival:m}}async function ub(e){return await Ne.selectFrom("delivery_routes").where("courier_id","=",e).where("status","=","active").select(["id"]).orderBy("id","desc").executeTakeFirst()??null}async function cb(e){let t=await Ne.selectFrom("delivery_stops").where("delivery_route_id","=",e).where("status","in",["en_route","pending","arrived"]).select(["id","order_id","status","latitude","longitude","eta_at","arrived_at","notified_nearby_at"]).orderBy("sequence","asc").execute();return t.find((r)=>r.status==="en_route")??t.find((r)=>r.status==="arrived")??t[0]??null}async function db(e){let t=sb();return await Ne.insertInto("courier_pings").values({uuid:t,courier_id:e.courierId,delivery_route_id:e.routeId,latitude:e.latitude,longitude:e.longitude,heading:e.heading,speed:e.speed??0,accuracy:e.accuracy,recorded_at:e.recordedAt}).executeTakeFirst(),(await Ne.selectFrom("courier_pings").where("uuid","=",t).select(["id"]).executeTakeFirst())?.id??null}var{randomUUIDv7:lb}=globalThis.Bun;import{db as X}from"@stacksjs/database/runtime";function ss(e){return e.type==="pickup"}async function Bf(e){let t=lb(),r=e.sequence??await pb(e.deliveryRouteId);await X.insertInto("delivery_stops").values({uuid:t,delivery_route_id:e.deliveryRouteId,order_id:e.orderId??null,sequence:r,status:"pending",address:e.address,latitude:e.latitude??null,longitude:e.longitude??null,recipient_name:e.recipientName??null,recipient_phone:e.recipientPhone??null,eta_at:e.etaAt??null,type:e.type??"dropoff"}).executeTakeFirst();let n=await wb(t);if(n)await gn(n);return n??{}}async function Uf(e){await X.updateTable("delivery_stops").set({status:"en_route"}).where("id","=",e).execute();let t=await us(e);if(!t)return null;if(t.order_id!=null&&!ss(t))await is(t.order_id,"OUT_FOR_DELIVERY");return await hn(t),t}async function Jf(e,t){let r=new Date().toISOString();await X.updateTable("delivery_stops").set({status:"completed",completed_at:r,...await fb(e)?{}:{arrived_at:r},...t?{notes:t}:{}}).where("id","=",e).execute();let n=await us(e);if(!n)return null;if(n.order_id!=null)await is(n.order_id,ss(n)?"OUT_FOR_DELIVERY":"DELIVERED");return await xn(n),await jf(n.delivery_route_id),n}async function Wf(e,t){await X.updateTable("delivery_stops").set({status:"failed",notes:t}).where("id","=",e).execute();let r=await us(e);if(!r)return null;if(r.order_id!=null&&!ss(r))await is(r.order_id,"SHIPPED");return await Rn(r,t),await jf(r.delivery_route_id),r}async function Lf(e){await X.updateTable("delivery_routes").set({status:"active",started_at:new Date().toISOString()}).where("id","=",e).execute()}async function jf(e){if(e==null)return;if(await X.selectFrom("delivery_stops").where("delivery_route_id","=",e).where("status","in",["pending","en_route","arrived"]).select(["id"]).executeTakeFirst())return;let r=await X.selectFrom("delivery_routes").where("id","=",e).select(["courier_id"]).executeTakeFirst();if(await X.updateTable("delivery_routes").set({status:"completed",completed_at:new Date().toISOString()}).where("id","=",e).execute(),r?.courier_id!=null)await X.updateTable("couriers").set({status:"active"}).where("id","=",r.courier_id).execute()}async function is(e,t){let r=await X.selectFrom("orders").where("id","=",e).select(["id","status"]).executeTakeFirst();if(!r)return;let n=await Promise.resolve().then(() => (Xe(),{}));let s=mb(r.status,t,be);if(s.length===0){let{log:i}=await import("@stacksjs/logging").catch(()=>({log:null}));i?.warn(`[delivery] refused to move order ${e} from ${r.status} to ${t}: no legal transition`);return}for(let i of s)await X.updateTable("orders").set({status:i}).where("id","=",e).execute(),await dt(i,{...r,status:i})}function mb(e,t,r){if(e===t)return[];if(r(e,t))return[t];for(let n of["PROCESSING","SHIPPED"]){if(n===e||n===t)continue;if(r(e,n)&&r(n,t))return[n,t]}return[]}async function pb(e){return(await X.selectFrom("delivery_stops").where("delivery_route_id","=",e).select(["sequence"]).execute()).reduce((r,n)=>Math.max(r,n.sequence??0),0)+1}async function fb(e){return(await X.selectFrom("delivery_stops").where("id","=",e).select(["arrived_at"]).executeTakeFirst())?.arrived_at!=null}async function us(e){return await X.selectFrom("delivery_stops").where("id","=",e).selectAll().executeTakeFirst()??null}async function wb(e){return await X.selectFrom("delivery_stops").where("uuid","=",e).selectAll().executeTakeFirst()??null}import{db as vn,matchedRows as zf}from"@stacksjs/database/runtime";async function qf(e){try{let t=await vn.deleteFrom("shipping_zones").where("id","=",e).executeTakeFirst();return _(t)>0}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete shipping zone: ${t.message}`);throw t}}async function Gf(e){try{return(await zf(vn.updateTable("shipping_zones").set({status:"inactive"}).where("id","=",e))).length>0}catch(t){if(t instanceof Error)throw TypeError(`Failed to soft delete shipping zone: ${t.message}`);throw t}}async function Vf(e){if(!e.length)return 0;try{let t=await vn.deleteFrom("shipping_zones").where("id","in",e).executeTakeFirst();return _(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete shipping zones: ${t.message}`);throw t}}async function Hf(e){if(!e.length)return 0;try{return(await zf(vn.updateTable("shipping_zones").set({status:"inactive"}).where("id","in",e))).length}catch(t){if(t instanceof Error)throw TypeError(`Failed to soft delete shipping zones: ${t.message}`);throw t}}var{randomUUIDv7:Kf}=globalThis.Bun;import{db as cs}from"@stacksjs/database/runtime";async function Zf(e){try{let t=Kf(),r={...qt(e),uuid:t};await cs.insertInto("shipping_zones").values(r).executeTakeFirst();let n=await cs.selectFrom("shipping_zones").where("uuid","=",t).selectAll().executeTakeFirst();if(!n)throw Error("Failed to resolve created shipping zone");return w(n)}catch(t){if(t instanceof Error)throw TypeError(`Failed to create shipping zone: ${t.message}`);throw t}}async function Qf(e){if(!e.length)return 0;try{let t=e.map((n)=>({...qt(n),uuid:Kf()})),r=await cs.insertInto("shipping_zones").values(t).executeTakeFirst();return _(r)}catch(t){if(t instanceof Error)throw TypeError(`Failed to create shipping zones in bulk: ${t.message}`);throw t}}import{db as Dn}from"@stacksjs/database/runtime";import{formatDate as Sn}from"@stacksjs/orm";async function Yf(e,t){try{if(!e)throw Error("Shipping zone ID is required for update");let r=await Dn.updateTable("shipping_zones").set({...qt(t),updated_at:Sn(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!r)return;return w(r)}catch(r){if(r instanceof Error)throw TypeError(`Failed to update shipping zone: ${r.message}`);throw r}}async function Xf(e,t){try{let r=await Dn.updateTable("shipping_zones").set({status:t,updated_at:Sn(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!r)throw Error("Failed to update shipping zone status");return w(r)}catch(r){if(r instanceof Error)throw TypeError(`Failed to update shipping zone status: ${r.message}`);throw r}}async function ew(e,t){try{let r=await Dn.updateTable("shipping_zones").set({countries:t,updated_at:Sn(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!r)throw Error("Failed to update shipping zone countries");return w(r)}catch(r){if(r instanceof Error)throw TypeError(`Failed to update shipping zone countries: ${r.message}`);throw r}}async function tw(e,t,r){try{let n={updated_at:Sn(new Date)};if(t!==void 0)n.regions=t;if(r!==void 0)n.postal_codes=r;let o=await Dn.updateTable("shipping_zones").set(n).where("id","=",e).returningAll().executeTakeFirst();if(!o)throw Error("Failed to update regions and postal codes");return w(o)}catch(n){if(n instanceof Error)throw TypeError(`Failed to update regions and postal codes: ${n.message}`);throw n}}var yb={digital:Zr,couriers:Yr,geocoding:rn,licenses:an,methods:dn,rates:wn,routes:Hr,tracking:Pn,zones:kn},gb=yb;import{db as hb}from"@stacksjs/database/runtime";function rw(e){let t=Number(e);return Number.isFinite(t)?t/100:0}function gt(e,t,r={}){let n=Math.max(0,Math.round(e)),o=[],a=0,s=0;for(let i of t){let u=rw(i.rate),c=Math.round(n*u),d=Boolean(r.exempt&&i.exemptible);if(d)s+=c;else a+=c;o.push({id:Number(i.id),code:String(i.code??""),name:String(i.name??""),rate:u,amount:d?0:c,exempted:d})}return{taxable:n,components:o,tax:a,exempted:s}}async function ls(e={}){let t=hb.selectFrom("tax_rates").where("status","=","active").selectAll();if(e.country)t=t.where("country","=",e.country);let r=await t.execute();if(!e.codes?.length)return r;let n=new Set(e.codes);return r.filter((o)=>n.has(String(o.code??"")))}async function nw(e,t={}){return gt(e,await ls(t),t)}import{db as ow}from"@stacksjs/database/runtime";async function aw(e){try{let t=await ow.deleteFrom("tax_rates").where("id","=",e).executeTakeFirst();return _(t)>0}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete tax rate: ${t.message}`);throw t}}async function sw(e){if(!e.length)return 0;try{let t=await ow.deleteFrom("tax_rates").where("id","in",e).executeTakeFirst();return _(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete tax rates: ${t.message}`);throw t}}import{db as iw}from"@stacksjs/database/runtime";async function uw(e){let t=await iw.selectFrom("tax_rates").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function cw(){return P(await iw.selectFrom("tax_rates").selectAll().execute())}var{randomUUIDv7:dw}=globalThis.Bun;import{db as lw}from"@stacksjs/database/runtime";async function mw(e){try{return await lw.transaction(async(t)=>{let r={...e,uuid:dw()};if(r.is_default)await t.updateTable("tax_rates").set({is_default:!1}).execute();let n=await t.insertInto("tax_rates").values(r).returningAll().executeTakeFirst();if(!n)throw Error("Failed to create tax rate");return w(n)})}catch(t){if(t instanceof Error)throw TypeError(`Failed to create tax rate: ${t.message}`);throw t}}async function pw(e){if(!e.length)return 0;try{return await lw.transaction(async(t)=>{let r=0;for(let n of e){let o={...n,uuid:dw()};if(o.is_default)await t.updateTable("tax_rates").set({is_default:!1}).execute();if(await t.insertInto("tax_rates").values(o).executeTakeFirst())r++}return r})}catch(t){if(t instanceof Error)throw TypeError(`Failed to create tax rates in bulk: ${t.message}`);throw t}}import{db as Cn}from"@stacksjs/database/runtime";import{formatDate as Tn}from"@stacksjs/orm";async function fw(e,t){try{if(!e)throw Error("Tax rate ID is required for update");return await Cn.transaction(async(r)=>{let n=await r.selectFrom("tax_rates").select("is_default").where("id","=",e).executeTakeFirst();if(!n)return;let o=t.is_default??Boolean(n.is_default),a=Tn(new Date);if(o)await r.updateTable("tax_rates").set({is_default:!1,updated_at:a}).where("id","!=",e).execute();let s=await r.updateTable("tax_rates").set({...t,updated_at:a}).where("id","=",e).returningAll().executeTakeFirst();if(!s)return;return w(s)})}catch(r){if(r instanceof Error)throw TypeError(`Failed to update tax rate: ${r.message}`);throw r}}async function ww(e,t){try{let r=await Cn.updateTable("tax_rates").set({status:t,updated_at:Tn(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!r)throw Error("Failed to update tax rate status");return w(r)}catch(r){if(r instanceof Error)throw TypeError(`Failed to update tax rate status: ${r.message}`);throw r}}async function yw(e,t){try{let r=await Cn.updateTable("tax_rates").set({rate:t,updated_at:Tn(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!r)throw Error("Failed to update rate information");return w(r)}catch(r){if(r instanceof Error)throw TypeError(`Failed to update rate information: ${r.message}`);throw r}}async function gw(e,t){try{return await Cn.transaction(async(r)=>{if(!await r.selectFrom("tax_rates").select("id").where("id","=",e).executeTakeFirst())return!1;let o=Tn(new Date);if(t)await r.updateTable("tax_rates").set({is_default:!1,updated_at:o}).where("id","!=",e).execute();return await r.updateTable("tax_rates").set({is_default:t,updated_at:o}).where("id","=",e).execute(),!0})}catch(r){if(r instanceof Error)throw TypeError(`Failed to update tax rate default status: ${r.message}`);throw r}}import{db as ps}from"@stacksjs/database/runtime";async function hw(e){try{let t=await ps.selectFrom("waitlist_products").where("id","=",e).selectAll().executeTakeFirst();if(!t)return;return await ps.deleteFrom("waitlist_products").where("id","=",e).execute(),w(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete waitlist product: ${t.message}`);throw t}}async function bw(e){if(!e.length)return 0;try{let t=await ps.deleteFrom("waitlist_products").where("id","in",e).executeTakeFirst();return _(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete waitlist products in bulk: ${t.message}`);throw t}}import{db as j}from"@stacksjs/database/runtime";import{formatDate as z}from"@stacksjs/orm";async function rr(e){let t=await j.selectFrom("waitlist_products").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function _w(){return P(await j.selectFrom("waitlist_products").selectAll().execute())}async function xw(e,t){let r=j.selectFrom("waitlist_products").select(["source",j.fn.count("id").as("count")]).groupBy("source");if(e&&t){let o=z(e),a=z(t);r=r.where("created_at",">=",o).where("created_at","<=",a)}return(await r.execute()).reduce((o,{source:a,count:s})=>(o[a]=s,o),{})}async function Rw(e=new Date){let t=new Date(e);t.setHours(0,0,0,0);let r=new Date(e);r.setHours(23,59,59,999);let n=z(t),o=z(r);return(await j.selectFrom("waitlist_products").select(j.fn.count("id").as("count")).where("created_at",">=",n).where("created_at","<=",o).executeTakeFirst())?.count??0}async function Pw(e){return(await j.selectFrom("waitlist_products").select(j.fn.count("id").as("count")).where("quantity","=",e).executeTakeFirst())?.count??0}async function vw(e,t){let r=j.selectFrom("waitlist_products").select(["quantity",j.fn.count("id").as("count")]).groupBy("quantity");if(e&&t){let o=z(e),a=z(t);r=r.where("created_at",">=",o).where("created_at","<=",a)}return(await r.execute()).reduce((o,{quantity:a,count:s})=>(o[a]=s,o),{})}async function Dw(e,t){let r=z(e),n=z(t),o=await j.selectFrom("waitlist_products").selectAll().where("notified_at",">=",r).where("notified_at","<=",n).whereNotNull("notified_at").execute();return P(o)}async function Sw(e,t){let r=z(e),n=z(t),o=await j.selectFrom("waitlist_products").selectAll().where("purchased_at",">=",r).where("purchased_at","<=",n).whereNotNull("purchased_at").execute();return P(o)}async function kw(e,t){let r=z(e),n=z(t),o=await j.selectFrom("waitlist_products").selectAll().where("cancelled_at",">=",r).where("cancelled_at","<=",n).whereNotNull("cancelled_at").execute();return P(o)}async function Cw(){let e=await j.selectFrom("waitlist_products").selectAll().where("status","=","waiting").execute();return P(e)}async function Tw(e,t,r){let n=j.selectFrom("waitlist_products").select(j.fn.count("id").as("count")).where("status","=",e);if(t&&r){let a=z(t),s=z(r);n=n.where("created_at",">=",a).where("created_at","<=",s)}return(await n.executeTakeFirst())?.count??0}async function Aw(e,t){let r=j.selectFrom("waitlist_products").select(["status",j.fn.count("id").as("count")]).groupBy("status");if(e&&t){let u=z(e),c=z(t);r=r.where("created_at",">=",u).where("created_at","<=",c)}let n=await r.execute(),o=n.reduce((u,{count:c})=>u+c,0),a=Number(n.find((u)=>u.status==="purchased")?.count??0),s=o>0?a/o*100:0,i=n.reduce((u,{status:c,count:d})=>(u[c]={count:d,percentage:o>0?d/o*100:0},u),{});return{totalConversionRate:s,statusBreakdown:i}}async function Ew(e,t){let r=z(e),n=z(t);return(await j.selectFrom("waitlist_products").select(j.fn.count("id").as("count")).where("created_at",">=",r).where("created_at","<=",n).executeTakeFirst())?.count??0}async function Fw(e,t){let r=j.selectFrom("waitlist_products").select(["created_at"]);if(e&&t){let a=z(e),s=z(t);r=r.where("created_at",">=",a).where("created_at","<=",s)}let o=(await r.execute()).reduce((a,{created_at:s})=>{let i=(s||"").split("T")[0]||"unknown";return a[i]=(a[i]||0)+1,a},{});return Object.entries(o).map(([a,s])=>({date:a,count:s})).sort((a,s)=>a.date.localeCompare(s.date))}var{randomUUIDv7:Mw}=globalThis.Bun;import{db as fs}from"@stacksjs/database/runtime";import{formatDate as Iw}from"@stacksjs/orm";var bb={notified:"notified_at",purchased:"purchased_at",cancelled:"cancelled_at"};function _b(e){return typeof e==="number"||e instanceof Date?Iw(e):e}function nr(e,t={}){let r=Object.fromEntries(Object.entries(e).filter(([,o])=>o!==void 0));if(r.quantity===void 0&&r.party_size!==void 0)r.quantity=r.party_size;delete r.party_size;for(let o of["notified_at","purchased_at","cancelled_at"])if(r[o]!==void 0)r[o]=_b(r[o]);let n=bb[r.status];if(n&&r[n]===void 0&&!t[n])r[n]=Iw(new Date);return r}async function Nw(e){try{let t=Mw(),r={...nr(e),uuid:t,status:e.status||"waiting"};await fs.insertInto("waitlist_products").values(r).executeTakeFirst();let n=await fs.selectFrom("waitlist_products").where("uuid","=",t).selectAll().executeTakeFirst();if(!n)throw Error("Failed to create waitlist product");return w(n)}catch(t){if(t instanceof Error)throw TypeError(`Failed to create waitlist product: ${t.message}`);throw t}}async function Ow(e){if(!e.length)return 0;try{let t=e.map((n)=>({...nr(n),status:n.status||"waiting",uuid:Mw()})),r=await fs.insertInto("waitlist_products").values(t).executeTakeFirst();return _(r)}catch(t){if(t instanceof Error)throw TypeError(`Failed to create waitlist products in bulk: ${t.message}`);throw t}}import{db as xb}from"@stacksjs/database/runtime";import{formatDate as Rb}from"@stacksjs/orm";async function An(e,t){try{if(!e)throw Error("Waitlist product ID is required for update");let r=await rr(e);if(!r)return;await xb.updateTable("waitlist_products").set({...nr(t,r),updated_at:Rb(new Date)}).where("id","=",e).execute();let n=await rr(e);if(!n)return;return w(n)}catch(r){if(r instanceof Error)throw TypeError(`Failed to update waitlist product: ${r.message}`);throw r}}async function $w(e,t){return await An(e,{status:t})}async function Bw(e,t){return await An(e,{quantity:t})}import{db as ws}from"@stacksjs/database/runtime";async function Uw(e){try{let t=await ws.selectFrom("waitlist_restaurants").where("id","=",e).selectAll().executeTakeFirst();if(!t)return;return await ws.deleteFrom("waitlist_restaurants").where("id","=",e).execute(),w(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete restaurant waitlist entry: ${t.message}`);throw t}}async function Jw(e){if(!e.length)return 0;try{let t=await ws.deleteFrom("waitlist_restaurants").where("id","in",e).executeTakeFirst();return _(t)}catch(t){if(t instanceof Error)throw TypeError(`Failed to delete restaurant waitlist entries in bulk: ${t.message}`);throw t}}import{db as N}from"@stacksjs/database/runtime";import{formatDate as ce}from"@stacksjs/orm";async function or(e){let t=await N.selectFrom("waitlist_restaurants").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function Ww(){return P(await N.selectFrom("waitlist_restaurants").selectAll().execute())}async function Lw(){return(await N.selectFrom("waitlist_restaurants").select(["table_preference",N.fn.count("id").as("count")]).groupBy("table_preference").execute()).reduce((t,{table_preference:r,count:n})=>(t[r]=n,t),{})}async function jw(e=new Date){let t=new Date(e);t.setHours(0,0,0,0);let r=new Date(e);r.setHours(23,59,59,999);let n=ce(t),o=ce(r);return(await N.selectFrom("waitlist_restaurants").select(N.fn.count("id").as("count")).where("created_at",">=",n).where("created_at","<=",o).executeTakeFirst())?.count??0}async function zw(e){return(await N.selectFrom("waitlist_restaurants").select(N.fn.count("id").as("count")).where("party_size","=",e).executeTakeFirst())?.count??0}async function qw(){return(await N.selectFrom("waitlist_restaurants").select(["party_size",N.fn.count("id").as("count")]).groupBy("party_size").execute()).reduce((t,{party_size:r,count:n})=>(t[r]=n,t),{})}async function Gw(e,t){let r=ce(e),n=ce(t),o=await N.selectFrom("waitlist_restaurants").selectAll().where("created_at",">=",r).where("created_at","<=",n).execute();return P(o)}async function Vw(e,t){let r=ce(e),n=ce(t),o=await N.selectFrom("waitlist_restaurants").selectAll().where("check_in_time",">=",r).where("check_in_time","<=",n).where("status","=","seated").execute();return P(o)}async function Hw(){let e=await N.selectFrom("waitlist_restaurants").selectAll().where("status","=","waiting").execute();return P(e)}async function Kw(){let e=await N.selectFrom("waitlist_restaurants").select(["status",N.fn.count("id").as("count")]).groupBy("status").execute(),t=e.reduce((a,{count:s})=>a+s,0),r=e.find((a)=>a.status==="seated")?.count??0,n=t>0?Number(r)/t*100:0,o=e.reduce((a,{status:s,count:i})=>(a[s]={count:i,percentage:t>0?i/t*100:0},a),{});return{totalConversionRate:n,statusBreakdown:o}}async function Zw(){let e=await N.selectFrom("waitlist_restaurants").select([N.fn.avg("quoted_wait_time").as("avg_quoted_wait_time"),N.fn.avg("actual_wait_time").as("avg_actual_wait_time")]).executeTakeFirst();return{averageQuotedWaitTime:e?.avg_quoted_wait_time??0,averageActualWaitTime:e?.avg_actual_wait_time??0}}async function Qw(){let e=P(await N.selectFrom("waitlist_restaurants").selectAll().where("status","=","waiting").execute()),t=e.reduce((n,o)=>n+(o.quoted_wait_time??0),0),r=e.length>0?t/e.length:0;return{entries:e,totalQuotedWaitTime:t,averageQuotedWaitTime:r}}async function Yw(){let e=P(await N.selectFrom("waitlist_restaurants").selectAll().where("status","=","waiting").execute()),t=e.reduce((o,a)=>o+a.party_size,0),r=e.length>0?t/e.length:0,n=e.reduce((o,a)=>(o[a.party_size]=(o[a.party_size]||0)+1,o),{});return{entries:e,totalPartySize:t,averagePartySize:r,partySizeBreakdown:n}}async function Xw(){let e=new Date,t=new Date(e);t.setHours(0,0,0,0);let r=new Date(e);r.setHours(23,59,59,999);let n=ce(t),o=ce(r),a=await N.selectFrom("waitlist_restaurants").selectAll().where("status","=","seated").where("check_in_time",">=",n).where("check_in_time","<=",o).execute(),s=a.length,i=a.reduce((m,l)=>m+l.party_size,0),u=s>0?i/s:0,c=a.reduce((m,l)=>(m[l.table_preference]=(m[l.table_preference]||0)+1,m),{}),d=a.reduce((m,l)=>(m[l.party_size]=(m[l.party_size]||0)+1,m),{});return{totalTablesTurned:s,averagePartySize:u,totalCustomersSeated:i,breakdownByTablePreference:c,breakdownByPartySize:d}}async function ey(e,t){let r=ce(e),n=ce(t),o=await N.selectFrom("waitlist_restaurants").select(["status",N.fn.count("id").as("count")]).where("check_in_time",">=",r).where("check_in_time","<=",n).groupBy("status").execute(),a=o.reduce((c,{count:d})=>c+d,0),s=o.find((c)=>c.status==="seated")?.count??0,i=a>0?Number(s)/a*100:0,u=o.reduce((c,{status:d,count:m})=>(c[d]={count:m,percentage:a>0?m/a*100:0},c),{});return{totalEntries:a,seatedEntries:s,seatingRate:i,statusBreakdown:u}}async function ty(e,t){let r=ce(e),n=ce(t),o=N.selectFrom("waitlist_restaurants").selectAll().where("status","=","no_show").where("check_in_time",">=",r).where("check_in_time","<=",n),a=await N.selectFrom("waitlist_restaurants").select(N.fn.count("id").as("count")).where("check_in_time",">=",r).where("check_in_time","<=",n).executeTakeFirst(),s=await o.execute(),i=s.length,u=a?.count&&a.count>0?i/a.count*100:0,c=s.reduce((p,b)=>p+(b.quoted_wait_time??0),0),d=i>0?c/i:0,m=s.reduce((p,b)=>p+b.party_size,0),l=i>0?m/i:0,y=s.reduce((p,b)=>(p[b.table_preference]=(p[b.table_preference]||0)+1,p),{}),g=s.reduce((p,b)=>(p[b.party_size]=(p[b.party_size]||0)+1,p),{});return{totalNoShows:i,noShowRate:u,averageQuotedWaitTime:d,averagePartySize:l,breakdownByTablePreference:y,breakdownByPartySize:g}}async function ry(){let e=await N.selectFrom("waitlist_restaurants").select(["quoted_wait_time","actual_wait_time"]).where("status","=","waiting").execute(),t=e.reduce((o,a)=>o+(a.quoted_wait_time||0),0),r=e.reduce((o,a)=>o+(a.actual_wait_time||0),0),n=e.length;return{averageQuoted:n>0?t/n:0,averageActual:n>0?r/n:0}}async function ny(){let e=Date.now()-86400000,t=await N.selectFrom("waitlist_restaurants").select(["seated_at"]).where("status","=","seated").where("seated_at",">=",e).execute(),r=Array.from({length:24},(n,o)=>({hour:o,count:t.filter((a)=>a.seated_at===o).length}));return{total:t.length,byHour:r}}async function oy(){return(await N.selectFrom("waitlist_restaurants").select(["created_at","status"]).execute()).reduce((t,r)=>{let n=r.created_at;if(!t[n])t[n]={total:0,waiting:0,seated:0,cancelled:0,no_show:0};return t[n].total++,t[n][r.status]++,t},{})}var{randomUUIDv7:ay}=globalThis.Bun;import{db as gs}from"@stacksjs/database/runtime";import{formatDate as ys}from"@stacksjs/orm";var Pb={seated:"seated_at",no_show:"no_show_at",cancelled:"cancelled_at"};function vb(e){if(typeof e==="number")return ys(e<=2147483647?e*1000:e);if(e instanceof Date)return ys(e);return e}function ar(e,t={}){let r=Object.fromEntries(Object.entries(e).filter(([,o])=>o!==void 0));for(let o of["check_in_time","seated_at","no_show_at","cancelled_at"])if(r[o]!==void 0)r[o]=vb(r[o]);let n=Pb[r.status];if(n&&r[n]===void 0&&!t[n])r[n]=ys(new Date);return r}async function sy(e){try{let t=ay(),r={...ar(e),status:e.status||"waiting",uuid:t};await gs.insertInto("waitlist_restaurants").values(r).executeTakeFirst();let n=await gs.selectFrom("waitlist_restaurants").where("uuid","=",t).selectAll().executeTakeFirst();if(!n)throw Error("Failed to create restaurant waitlist entry");return w(n)}catch(t){if(t instanceof Error)throw TypeError(`Failed to create restaurant waitlist entry: ${t.message}`);throw t}}async function iy(e){if(!e.length)return 0;try{let t=e.map((n)=>({...ar(n),status:n.status||"waiting",uuid:ay()})),r=await gs.insertInto("waitlist_restaurants").values(t).executeTakeFirst();return _(r)}catch(t){if(t instanceof Error)throw TypeError(`Failed to create restaurant waitlist entries in bulk: ${t.message}`);throw t}}import{db as Db}from"@stacksjs/database/runtime";import{formatDate as Sb}from"@stacksjs/orm";async function ht(e,t){try{if(!e)throw Error("Restaurant waitlist entry ID is required for update");let r=await or(e);if(!r)return;await Db.updateTable("waitlist_restaurants").set({...ar(t,r),updated_at:Sb(new Date)}).where("id","=",e).execute();let n=await or(e);if(!n)return;return w(n)}catch(r){if(r instanceof Error)throw TypeError(`Failed to update restaurant waitlist entry: ${r.message}`);throw r}}async function uy(e,t){return await ht(e,{status:t})}async function cy(e,t){return await ht(e,{party_size:t})}async function dy(e,t,r){return await ht(e,{quoted_wait_time:t,...r===void 0?{}:{actual_wait_time:r}})}async function ly(e,t){return await ht(e,{queue_position:t})}var kb={products:En,restaurant:bt},Cb=kb;var Tb={auctions:ao,carts:so,catalog:co,coupons:Go,customers:Vo,devices:Yo,errors:ta,giftCards:oa,orders:xa,payments:Ra,products:Ta,receipts:Ua,register:Fa,releases:Ia,restaurant:bt,shippings:ds,tax:ms,waitlists:hs},NF=Tb;export{I as PriceFormatError,ao as auctions,gt as breakdownFor,so as carts,co as catalog,wu as catalogImport,Tb as commerce,Go as coupons,U as currencyExponent,Vo as customers,ee as decimalToMinor,NF as default,Yo as devices,ta as errors,Us as formatCurrency,ne as formatMinor,oa as giftCards,ve as minorToDecimal,Js as minorToInput,lo as minorToMajor,js as money,mo as moneyInputError,Ws as moneyInputStep,rw as multiplierOf,xa as orders,Ls as parseMoneyInput,Ra as payments,Ta as products,Ua as receipts,Fa as register,Ia as releases,bt as restaurant,ds as shippings,ms as tax,hs as waitlists};
1
+ import*as auctions from"./auctions";import*as carts from"./carts";import*as catalog from"./catalog";import*as catalogImport from"./imports";import*as coupons from"./coupons";import*as customers from"./customers";import*as devices from"./devices";import*as errors from"./errors";import*as giftCards from"./gift-cards";import*as money from"./money";import*as orders from"./orders";import*as payments from"./payments";import*as products from"./products";import*as register from"./register";import*as releases from"./releases";import*as receipts from"./receipts";import*as shippings from"./shippings";import*as tax from"./tax";import*as waitlists from"./waitlists";import*as restaurant from"./waitlists/restaurant";export const commerce={auctions,carts,catalog,coupons,customers,devices,errors,giftCards,orders,payments,products,receipts,register,releases,restaurant,shippings,tax,waitlists};export default commerce;export{auctions,carts,catalog,catalogImport,coupons,customers,devices,errors,giftCards,money,orders,payments,products,receipts,register,releases,restaurant,shippings,tax,waitlists};export{currencyExponent,decimalToMinor,formatCurrency,formatMinor,minorToDecimal,minorToInput,minorToMajor,moneyInputError,moneyInputStep,parseMoneyInput,PriceFormatError}from"./money";export{breakdownFor,multiplierOf}from"./sales-tax";export{restockedQuantity}from"./inventory";export{parseSalesTaxSetup,parseTaxRateWriteData}from"./tax-input";