@stacksjs/commerce 0.75.76 → 0.75.77

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.
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  // @bun
2
- var zw=Object.defineProperty;var Gw=(e)=>e;function Vw(e,t){this[e]=Gw.bind(null,t)}var F=(e,t)=>{for(var r in t)zw(e,r,{get:t[r],enumerable:!0,configurable:!0,set:Vw.bind(t,r)})};var qw=(e,t,r)=>()=>{if(e)try{t=e(e=0)}catch(n){r=[n]}if(r)throw r[0];return t};function it(e,t){if(e===t)return!0;return Cg[e]?.includes(t)??!1}async function Ke(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 Pr(e){await Ke("order:created",{order:e})}async function Ze(e,t){await Ke("order:paid",{order:e,payment:t})}async function ea(e){await Ke("order:shipped",{order:e})}async function kg(e){await Ke("order:out_for_delivery",{order:e})}async function ta(e){await Ke("order:delivered",{order:e})}async function It(e,t){await Ke("order:cancelled",{order:e,reason:t})}async function Mt(e,t){await Ke("order:refunded",{order:e,refundAmount:t})}async function ut(e,t){switch(e){case"PROCESSING":return Ze(t);case"SHIPPED":return ea(t);case"OUT_FOR_DELIVERY":return kg(t);case"DELIVERED":return ta(t);case"CANCELLED":return It(t);case"REFUNDED":return Mt(t);case"PENDING":default:}}var Cg;var ct=qw(()=>{Cg={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 Xn={};F(Xn,{DEFAULT_INCREMENT_LADDER:()=>_e,auctionChannel:()=>nr,auctionTotals:()=>Wn,biddersFor:()=>An,bids:()=>$n,bidsByBidder:()=>kn,bidsForAuction:()=>Cn,bidsForItem:()=>Sn,broadcastBid:()=>En,broadcastItemClosed:()=>In,broadcastPledge:()=>Fn,closeAuction:()=>Gn,closeDueItems:()=>zn,closeItem:()=>Dt,closingSoon:()=>qn,closingSoonNotification:()=>Yw,currencyFor:()=>Mn,determineWinner:()=>rt,effectiveCloseAt:()=>Me,engine:()=>Bn,extendedCloseAt:()=>xt,fetchAuction:()=>pe,fetchAuctionForEvent:()=>Jn,fetchCatalogue:()=>Un,fetchItems:()=>Re,fetchPledges:()=>Qn,incrementFor:()=>de,leadingBid:()=>_t,lots:()=>Hn,makePledge:()=>cs,nextMinimumBid:()=>xe,openAuction:()=>jn,outbidNotification:()=>Zw,placeBid:()=>On,pledgeLevels:()=>ds,pledgeTotal:()=>Zn,pledges:()=>Yn,resolveBid:()=>Rt,rulesFor:()=>Pt,settle:()=>vt,settleAuction:()=>Vn,winnerNotification:()=>Qw});var $n={};F($n,{biddersFor:()=>An,bidsByBidder:()=>kn,bidsForAuction:()=>Cn,bidsForItem:()=>Sn,leadingBid:()=>_t,placeBid:()=>On});import{db as bt}from"@stacksjs/database/runtime";async function _t(e){return await bt.selectFrom("bids").selectAll().where("auction_item_id","=",e).where("status","=","leading").orderBy("amount","desc").executeTakeFirst()??null}async function Sn(e){return await bt.selectFrom("bids").selectAll().where("auction_item_id","=",e).orderBy("placed_at","desc").execute()??[]}async function Cn(e){return await bt.selectFrom("bids").selectAll().where("auction_id","=",e).orderBy("placed_at","asc").execute()??[]}async function kn(e,t){return await bt.selectFrom("bids").selectAll().where("auction_id","=",e).where("bidder_email","=",t.toLowerCase()).orderBy("placed_at","desc").execute()??[]}async function An(e){let t=await bt.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:Kw}=globalThis.Bun;import{db as Nn}from"@stacksjs/database/runtime";function xt(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 Me(e,t){return new Date(e.closes_at??t)}var _e=[{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=_e,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 xe(e,t,r=_e){if(t===null||t<=0)return e.starting_bid;return t+de(t,r,e.min_increment)}function Rt(e,t,r,n=_e){let o=Math.max(r.amount,r.maxAmount??0),a=xe(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 nr(e){return`auction.${e}`}async function Tn(){try{let e=await import("@stacksjs/realtime");return e.emit??null}catch{return null}}async function En(e){let t=await Tn();if(!t||!e.item||!e.leader)return;await t(nr(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 Fn(e,t){let r=await Tn();if(!r)return;await r(nr(e.auction_id),"pledge.made",{donorName:e.donor_name,amount:e.amount,level:e.level??null,runningTotal:t})}async function In(e,t,r){let n=await Tn();if(!n)return;await n(nr(e),"item.closed",{itemId:t,...r})}import{config as Hw}from"@stacksjs/config";function is(){return Hw.commerce??{}}function us(){return is().auction??{}}function Pt(e){let t=us();return{increments:t.increments?.length?t.increments:_e,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 Mn(e){return e?.currency??us().currency??is().currency??"USD"}function or(e){return e.toISOString().slice(0,19).replace("T"," ")}async function On(e){let t=e.now??new Date,r=await Nn.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 Nn.selectFrom("auctions").selectAll().where("id","=",r.auction_id).executeTakeFirst(),o=Pt(n),a=await _t(r.id),s=xe(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=Me(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=Rt(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:xt(r,i,o,t),d=u.leader&&!u.leader.isChallenger&&a&&a.bidder_email.toLowerCase()===e.bidderEmail.toLowerCase(),m=await Nn.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 b=u.leader?.isChallenger===!0,p=Kw();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:b?"leading":"outbid",placed_at:or(t)}).execute(),a){if(b)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:or(t)}).where("id","=",r.id).execute();else if(c)await y.updateTable("auction_items").set({closes_at:or(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?or(c):r.closes_at,extension_count:c?r.extension_count+1:r.extension_count},extendedTo:c??void 0};return await En(l).catch(()=>{return}),l}var Bn={};F(Bn,{DEFAULT_INCREMENT_LADDER:()=>_e,determineWinner:()=>rt,effectiveCloseAt:()=>Me,extendedCloseAt:()=>xt,incrementFor:()=>de,nextMinimumBid:()=>xe,resolveBid:()=>Rt,settle:()=>vt});function rt(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 vt(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}}var Hn={};F(Hn,{auctionTotals:()=>Wn,closeAuction:()=>Gn,closeDueItems:()=>zn,closeItem:()=>Dt,closingSoon:()=>qn,fetchAuction:()=>pe,fetchAuctionForEvent:()=>Jn,fetchCatalogue:()=>Un,fetchItems:()=>Re,openAuction:()=>jn,settleAuction:()=>Vn});import{db as Ne}from"@stacksjs/database/runtime";async function pe(e){return await Ne.selectFrom("auctions").selectAll().where("id","=",e).executeTakeFirst()??null}async function Jn(e){return await Ne.selectFrom("auctions").selectAll().where("event_id","=",e).executeTakeFirst()??null}async function Re(e){return await Ne.selectFrom("auction_items").selectAll().where("auction_id","=",e).orderBy("lot_number","asc").execute()??[]}async function Un(e){let[t,r]=await Promise.all([pe(e),Re(e)]),n=Pt(t),o=await Ne.selectFrom("bids").select(["auction_item_id","amount","bidder_name"]).where("auction_id","=",e).where("status","in",["leading","won"]).execute(),a=await Ne.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:xe(u,c?.amount??null,n.increments),leaderName:c?.bidder_name??null}})}async function Wn(e){let t=await pe(e),r=await Ne.selectFrom("bids").select(["auction_item_id","amount","bidder_email","status"]).where("auction_id","=",e).where("status","!=","invalid").execute(),n=await Ne.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 Ne.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 Oe}from"@stacksjs/database/runtime";function Ln(e){return e.toISOString().slice(0,19).replace("T"," ")}async function jn(e,t=new Date){return await Oe.updateTable("auctions").set({status:"open",opens_at:Ln(t)}).where("id","=",e).execute(),await Oe.updateTable("auction_items").set({status:"open"}).where("auction_id","=",e).where("status","=","closed").execute(),pe(e)}async function Dt(e,t=new Date){if(e.status==="sold"||e.status==="passed")return null;let r=await Oe.selectFrom("bids").selectAll().where("auction_item_id","=",e.id).execute(),n=rt(e,r??[]);return await Oe.transaction(async(o)=>{if(await o.updateTable("auction_items").set({status:n.status,closes_at:Ln(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 In(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 Re(e),o=[];for(let a of n){if(a.status!=="open")continue;if(Me(a,r.closes_at)>t)continue;let s=await Dt(a,t);if(s)o.push(s)}return o}async function Gn(e,t=new Date){let r=await Re(e),n=[];for(let o of r){let a=await Dt(o,t);if(a)n.push(a)}return await Oe.updateTable("auctions").set({status:"closed",closes_at:Ln(t)}).where("id","=",e).execute(),n}async function Vn(e,t={}){let r=await pe(e);if(!r)return null;let n=await Re(e),o=await Oe.selectFrom("bids").selectAll().where("auction_id","=",e).execute(),a=await Oe.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=rt(u,s.get(u.id)??[]);return u.status==="passed"?{...c,status:"passed"}:c});if(t.markSettled)await Oe.updateTable("auctions").set({status:"settled"}).where("id","=",e).execute();return vt(n,i,a??[],{auctionId:e,currency:Mn(r),goalAmount:r.goal_amount??null})}async function qn(e,t,r=new Date){let n=await pe(e);if(!n)return[];let o=new Date(r.getTime()+t*60000);return(await Re(e)).filter((a)=>{if(a.status!=="open")return!1;let s=Me(a,n.closes_at);return s>r&&s<=o})}function Kn(e,t="USD"){return new Intl.NumberFormat("en-US",{style:"currency",currency:t,minimumFractionDigits:0}).format(e/100)}function Zw(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 ${Kn(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 Qw(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 ${Kn(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 Yw(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 ${Kn(r,n)}.`,data:{itemId:e.id,lotNumber:e.lot_number,title:e.title,currentBid:r,closesAt:e.closes_at}}}var Yn={};F(Yn,{fetchPledges:()=>Qn,makePledge:()=>cs,pledgeLevels:()=>ds,pledgeTotal:()=>Zn});var{randomUUIDv7:Xw}=globalThis.Bun;import{db as ar}from"@stacksjs/database/runtime";async function cs(e){let t=Xw();await ar.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 ar.selectFrom("pledges").selectAll().where("uuid","=",t).executeTakeFirst();return await Fn(r,await Zn(e.auctionId)).catch(()=>{return}),r}async function Zn(e){return(await ar.selectFrom("pledges").select(["amount"]).where("auction_id","=",e).where("status","=","confirmed").execute()??[]).reduce((r,n)=>r+n.amount,0)}async function Qn(e){return await ar.selectFrom("pledges").selectAll().where("auction_id","=",e).orderBy("amount","desc").execute()??[]}async function ds(e){let t=(await Qn(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)}var eo={};F(eo,{bulkDestroy:()=>ps,bulkStore:()=>_s,bulkUpdate:()=>vs,destroy:()=>ms,fetchAll:()=>ys,fetchById:()=>ws,store:()=>bs,update:()=>Ps});import{db as ls}from"@stacksjs/database/runtime";import{mutationCount as _}from"@stacksjs/database/runtime";async function ms(e){try{let t=await ls.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 ps(e){if(!e.length)return 0;try{let t=await ls.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 fs}from"@stacksjs/database/runtime";function ey(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=ey(r);if(!(o in t))t[o]=n}return t}function P(e){return e.map((t)=>w(t))}async function ws(e){let t=await fs.selectFrom("carts").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function ys(){return P(await fs.selectFrom("carts").selectAll().execute())}var{randomUUIDv7:gs}=globalThis.Bun;import{db as hs}from"@stacksjs/database/runtime";async function bs(e){try{let t={...e,uuid:gs()},r=await hs.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 _s(e){if(!e.length)return 0;let t=0;try{return await hs.transaction(async(r)=>{for(let n of e){let o={...n,uuid:gs()};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 xs,matchedRows as ty}from"@stacksjs/database/runtime";import{formatDate as Rs}from"@stacksjs/orm";async function Ps(e,t){try{let r=await xs.updateTable("carts").set({...t,updated_at:Rs(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 vs(e){if(!e.length)return 0;let t=0;try{return await xs.transaction(async(r)=>{for(let n of e){if(!n.id)continue;if((await ty(r.updateTable("carts").set({...n,updated_at:Rs(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 ru={};F(ru,{ACCOUNT_CREDENTIAL_ENV:()=>ao,ACCOUNT_CREDENTIAL_HELP:()=>he,AdminCredentialError:()=>Ct,CATALOG_IMPORT_NAMESPACE:()=>Wi,CatalogFetchError:()=>A,MAX_RETRIES:()=>so,MissingCredentialsError:()=>at,PriceFormatError:()=>I,SHOPIFY_ADMIN_API_VERSION:()=>Gs,SHOPWARE_ACCESS_KEY_HELP:()=>co,SKU_MAX:()=>Fo,UNKNOWN_COUNTRY:()=>Zi,accountAdapter:()=>Yy,accountAdapters:()=>tu,addressLine:()=>We,adminRequest:()=>$e,amountOrZero:()=>Le,catalogAdapter:()=>Qy,catalogAdapters:()=>eu,catalogUuid:()=>te,cleanName:()=>U,createDatabaseAccountRepository:()=>qi,createDatabaseRepository:()=>Xi,createMemoryAccountRepository:()=>jy,createMemoryRepository:()=>Ky,createReadOnlyAccountRepository:()=>zy,createReadOnlyRepository:()=>Zy,credentialSecrets:()=>ze,currencyCode:()=>ie,currencyExponent:()=>J,customerRow:()=>mr,customerUuid:()=>qe,decimalToMinor:()=>ee,decodeHtmlEntities:()=>Fs,defaultSleep:()=>Ws,detectShopifyCurrency:()=>Bs,detectShopwareCurrency:()=>oi,fetchJson:()=>fe,formatMinor:()=>ne,gmtTimestamp:()=>sr,importCatalog:()=>Hy,importCustomers:()=>Wy,importOrders:()=>Ly,isoTimestamp:()=>we,lineLabel:()=>Co,lowestPrice:()=>No,mapShopifyCustomer:()=>Vs,mapShopifyOrder:()=>Hs,mapShopifyProduct:()=>$s,mapShopwareCustomer:()=>mi,mapShopwareOrder:()=>wi,mapShopwareProduct:()=>ti,mapWooCustomer:()=>Ii,mapWooOrder:()=>Mi,mapWooProduct:()=>Si,minorToDecimal:()=>Pe,missingAccessKeyMessage:()=>ni,nextPageInfo:()=>Ks,normalizeEmail:()=>oe,normalizeStoreUrl:()=>q,numberToDecimalString:()=>Es,numberToMinor:()=>ot,optionalString:()=>R,orderRow:()=>Gi,personName:()=>H,phoneOf:()=>ye,productRow:()=>Io,promotedCustomerUuid:()=>Ao,quantityOf:()=>je,readAccountCredentials:()=>cy,redactSecrets:()=>Ge,rescaleMinor:()=>nt,retryAfterSeconds:()=>Ds,shopifyAccountAdapter:()=>io,shopifyAdapter:()=>no,shopifyAdminBase:()=>Zs,shopifyOrderStatus:()=>qs,shopwareAccessToken:()=>wo,shopwareAccountAdapter:()=>yo,shopwareAdapter:()=>mo,shopwareAdminBase:()=>yi,shopwareBaseUrl:()=>ri,shopwareCustomerCriteria:()=>gi,shopwareLineLabel:()=>fi,shopwareOrderCriteria:()=>hi,shopwareOrderStatus:()=>pi,shopwareProductCriteria:()=>si,shopwareVariantCriteria:()=>ii,signedMinor:()=>ge,storeHost:()=>St,totalInventory:()=>Qi,unitFromTotal:()=>oo,uuidV5:()=>Li,variantRow:()=>Mo,variantSkus:()=>Yi,wooAdminBase:()=>Ni,wooAuthorization:()=>Oi,wooCommerceAccountAdapter:()=>Po,wooCommerceAdapter:()=>xo,wooOrderStatus:()=>Fi,wooPrices:()=>vi,wooSlug:()=>Di});import{slug as Is}from"@stacksjs/strings";class A 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 ry=2000,ny=30000;function q(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 St(e){return new URL(e).host.toLowerCase()}function Ds(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(ny)})}catch(u){let c=u instanceof Error?u.message:String(u);throw new A(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 A(e,`${e} responded ${u}.${o}`,s.status,c?c.slice(0,ry):void 0,Ds(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 A(e,`${e} did not return JSON (${u}).${o}`,s.status)}}var Ts={};F(Ts,{PriceFormatError:()=>I,currencyExponent:()=>J,decimalToMinor:()=>ee,formatCurrency:()=>Ss,formatMinor:()=>ne,minorToDecimal:()=>Pe,minorToInput:()=>Cs,minorToMajor:()=>to,moneyInputError:()=>ro,moneyInputStep:()=>ks,parseMoneyInput:()=>As,rescaleMinor:()=>nt});class I extends Error{value;constructor(e,t){super(`Unreadable price ${JSON.stringify(e)}: ${t}`);this.value=e;this.name="PriceFormatError"}}function J(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 Pe(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 nt(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(Pe(String(e),t),r)}function ne(e,t){let r=J(t),n=Math.round(Number(e)),o=Number.isSafeInteger(n)?`${n<0?"-":""}${Pe(Math.abs(n),r)}`:String(e);return t?`${o} ${t}`:o}function to(e,t){let r=Math.round(Number(e??0));if(!Number.isFinite(r))return 0;let n=Pe(Math.abs(r),J(t));return r<0?-Number(n):Number(n)}function Ss(e,t,r){let n=(t||"USD").toUpperCase(),o=to(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 Cs(e,t){if(e===null||e===void 0||e==="")return"";let r=Math.round(Number(e));if(!Number.isFinite(r))return"";let n=Pe(Math.abs(r),J(t));return r<0?`-${n}`:n}function ks(e){let t=J(e);return t===0?"1":`0.${"1".padStart(t,"0")}`}function ro(e,t,r={}){let n=e===null||e===void 0?"":String(e).trim(),o=J(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 ${Pe(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 As(e,t,r={}){let n=ro(e,t,r);if(n)throw new I(e,n);return ee(e,J(t))}function Es(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 ot(e,t=2){if(e===null||e===void 0)return null;if(typeof e==="string")return ee(e,t);return ee(Es(e),t)}var oy={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 Fs(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 oy[r.toLowerCase()]??t})}function U(e){if(typeof e!=="string")return"";return Fs(e).replace(/\s+/g," ").trim()}function R(e){if(typeof e!=="string")return null;let t=e.trim();return t===""?null:t}var Ms=250,Ns=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 sy(e){return(Array.isArray(e)?e:typeof e==="string"?e.split(","):[]).map((r)=>String(r).trim()).filter(Boolean)}function Os(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 $s(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)??Is(o),s=J(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),b=Os(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:Os(l.price,s,`variant ${y} price`,r,n),compareAtMinor:b?b: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:Is(m)}]:[],tags:sy(e.tags),currency:t.currency,images:d,optionNames:u,variants:c,hasOptions:i,url:`${t.storeUrl}/products/${a}`},warnings:n}}async function Bs(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*iy(e,t={}){let r=q(e),n=t.fetch??fetch,o=t.limit,a=o&&o>0?Math.min(Ms,o):Ms,s=[],i=t.currency?.toUpperCase()??null;if(!i){if(i=await Bs(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<=Ns;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 A(m,`${m} did not return a "products" list. Is this a Shopify storefront?`);let y=l.products;if(y.length===0)return;let b=y.map((g)=>String(g?.id));if(d>1&&b.every((g)=>u.has(g)))throw new A(m,`${m} repeated products from an earlier page; the store is not paginating. Use --limit to import the first page only.`);b.forEach((g)=>u.add(g));let p=[],h=d===1?s:[];for(let g of y){if(o&&c>=o)break;try{let f=$s(g,{storeUrl:r,currency:i});p.push(f.product),h.push(...f.warnings),c++}catch(f){h.push({externalId:g?.id===void 0?void 0:String(g.id),message:`skipped: ${f.message}`})}}if(yield{url:m,products:p,warnings:h},o&&c>=o)return}throw new A(r,`Stopped after ${Ns} pages of ${r}/products.json without reaching the end.`)}var no={name:"shopify",pages:iy};var uy=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;function oe(e){if(typeof e!=="string")return null;let t=e.trim().toLowerCase();return uy.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 sr(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)=>U(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 We(...e){let t=e.map((r)=>U(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=ot(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 Le(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 oo(e,t){if(t<=1)return e;return Math.floor((2*e+t)/(2*t))}function je(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 ao={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 at extends Error{constructor(e){super(e);this.name="MissingCredentialsError"}}function Js(e,t){let r=e[t]?.trim();return r?r:void 0}function cy(e,t){let r=e.trim().toLowerCase(),n=ao[r];if(!n)throw new at(`Customers and orders can be imported from ${Object.keys(ao).join(", ")}; got "${e}".`);let o=n.filter((s)=>!Js(t,s));if(o.length>0){let s=o.length===1?`${o[0]} is not set`:`${o.join(" and ")} are not set`;throw new at(`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)=>Js(t,s));for(let[s,i]of a.entries())if(/\s/.test(i))throw new at(`${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 at(`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 ze(e){switch(e.source){case"shopify":return[e.accessToken];case"woocommerce":return[e.consumerKey,e.consumerSecret];case"shopware":return[e.clientId,e.clientSecret]}}function Ge(e,t){let r=e;for(let n of t)if(n.length>=4)r=r.split(n).join("[redacted]");return r}var so=5,dy=2,ly=60,Ws=(e)=>new Promise((t)=>setTimeout(t,e));class Ct extends A{constructor(e,t,r){super(e,t,r);this.name="AdminCredentialError"}}function Us(e,t,r=""){let n=Ge(`${e.message}${r}`,t),o=e.body===void 0?void 0:Ge(e.body,t);return new A(Ge(e.url,t),n,e.status,o,e.retryAfter)}async function $e(e,t){let{fetch:r,secrets:n,credentialHelp:o,hint:a="",sleep:s,...i}=t,u=s??Ws;for(let c=0;;c++)try{return await fe(e,r,"",i)}catch(d){if(!(d instanceof A))throw d;if(d.status===429&&c<so){let m=d.retryAfter!==void 0&&d.retryAfter>=0?d.retryAfter:dy;await u(Math.min(m,ly)*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 Ct(Ge(e,n),Ge(`${e} responded ${d.status}. ${m} ${o}`,n),d.status)}if(d.status===429)throw Us(d,n,` Still rate limited after ${so} retries; re-run later, the import resumes safely.`);throw Us(d,n,a?` ${a}`:"")}}var Gs="2026-10",Ls=250,js=4000,my=["id","email","first_name","last_name","phone","state","total_spent","currency","created_at","default_address"],py=["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"],fy=`Check SHOPIFY_ADMIN_TOKEN, and that the app is installed on this store with the read_customers and read_orders scopes. ${he.shopify}`;function Vs(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,J(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 qs(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 wy(e){if(!e)return null;return We(H(e.first_name,e.last_name)??e.name,e.address1,e.address2,e.city,[e.province_code??e.province,e.zip].map((t)=>U(t)).filter(Boolean).join(" "),e.country_code??e.country)}function Hs(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=J(o),s=(p,h)=>Le(p,a,h,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,h)=>p+s(h?.price,"shipping line"),0),c=[];for(let p of e.line_items??[]){let h=p?.id===void 0||p.id===null?"":String(p.id),g=je(p?.quantity),f=R(p?.name)??H(p?.title,p?.variant_title)??`Line ${h}`;if(!h||g===null){n.push({externalId:r,message:`line "${f}" has no id or quantity; left out`});continue}c.push({externalId:h,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:g,unitPriceMinor:s(p.price,`line "${f}" price`)})}let{status:d,mapped:m}=qs(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),b=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||b?{externalId:b,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:wy(e.shipping_address),note:R(e.note),placedAt:we(e.processed_at)??we(e.created_at),lines:c},warnings:n}}function Ks(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 Zs(e,t){let r=q(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*zs(e,t,r){if(t.credentials.source!=="shopify")throw TypeError("The Shopify importer needs Shopify credentials (SHOPIFY_ADMIN_TOKEN).");let n=Zs(e,t.adminUrl),o=t.fetch??fetch,a=t.limit,s=a&&a>0?Math.min(Ls,a):Ls,i=`${n}/admin/api/${Gs}/${r.resource}.json`,u=r.fields.join(","),c={fetch:o,headers:{"X-Shopify-Access-Token":t.credentials.accessToken},secrets:ze(t.credentials),credentialHelp:fy,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<=js;y++){let{data:b,headers:p}=await $e(l,c),h=b?.[r.resource];if(!Array.isArray(h))throw new A(l,`${l} did not return a "${r.resource}" list. Is this the Shopify Admin API?`);let g=h,f=g.map((E)=>String(E?.id));if(y>1&&f.length>0&&f.every((E)=>d.has(E)))throw new A(l,`${l} repeated ${r.resource} from an earlier page; stopping rather than looping.`);f.forEach((E)=>d.add(E));let x=[],D=[];for(let E of g){if(a&&m>=a)break;let C=r.map(E);if(D.push(...C.warnings),C.record)x.push(C.record),m++}yield{url:l,items:x,warnings:D};let v=Ks(p.get("link"));if(!v||g.length===0||a&&m>=a)return;l=`${i}?limit=${s}&fields=${u}&page_info=${encodeURIComponent(v)}`}throw new A(i,`Stopped after ${js} pages of ${i} without reaching the end.`)}var io={name:"shopify",customers:(e,t)=>zs(e,t,{resource:"customers",fields:my,firstQuery:"",map:Vs}),orders:(e,t)=>zs(e,t,{resource:"orders",fields:py,firstQuery:"&status=any",map:(r)=>Hs(r,{currency:t.currency})})};import{slug as ei}from"@stacksjs/strings";var ir=100,ur=1000,cr="/store-api",uo="Is this a Shopware 6 store with the Store API reachable at /store-api?",co='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 dr(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 Ve(e){return dr(e,"name")?.replace(/\s+/g," ")??null}function Qs(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 Ys(e){return e.available!==!1&&e.active!==!1}function Xs(e,t,r,n,o){let a=J(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=ot(s,a),u=ot(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 yy(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:dr(s,"alt")??dr(s,"title")})}return n}function gy(e){let t=new Set,r=[];for(let n of[e.seoCategory,...e.categories??[]]){let o=Ve(n),a=o?ei(o):"";if(!o||!a||t.has(a))continue;t.add(a),r.push({name:o,slug:a})}return r}function hy(e){let t=new Map;for(let r of e)for(let n of r.options??[]){let o=Ve(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 by(e,t){return(e.options??[]).find((r)=>(R(r.groupId)??R(r.group?.id)??Ve(r.group))===t.key)}function ti(e,t){if(!R(e?.id))throw TypeError("Shopware product has no id");let r=e.id,n=[],o=Ve(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=hy(a);c=d.map((l)=>l.name);let m=a.map((l)=>{let y=d.map((x)=>by(l,x)),b=y.map((x)=>Ve(x)??""),p=R(l.productNumber),h=`variant ${p??l.id}`,g=Xs(l,h,r,t,n);return{variant:{externalId:String(l.id),title:b.filter(Boolean).join(" / ")||Ve(l)||p||o,sku:p,priceMinor:g.priceMinor,compareAtMinor:g.compareAtMinor,available:Ys(l),inventory:Qs(l),optionValues:b},sortKey:y.map((x)=>x?.position??0),productNumber:p??""}});m.sort((l,y)=>{for(let b=0;b<l.sortKey.length;b++){let p=(l.sortKey[b]??0)-(y.sortKey[b]??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=Xs(e,`"${o}"`,r,t,n);u=[{externalId:r,title:o,sku:R(e.productNumber),priceMinor:d.priceMinor,compareAtMinor:d.compareAtMinor,available:Ys(e),inventory:Qs(e),optionValues:[]}]}return{product:{source:"shopware",externalId:r,name:o,handle:ei(o),descriptionHtml:dr(e,"description"),vendor:Ve(e.manufacturer),categories:gy(e),tags:(e.tags??[]).map((d)=>R(d?.name)).filter((d)=>d!==null),currency:t.currency,images:yy(e),optionNames:c,variants:u,hasOptions:i,url:`${t.storeUrl}/detail/${r}`},warnings:n}}function ri(e){return q(e).replace(/\/store-api$/i,"")}function ni(){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. ${co}`}function _y(e){if(!e)return null;try{let r=JSON.parse(e)?.errors?.[0];return R(r?.detail)??R(r?.title)}catch{return null}}function xy(e){let t=_y(e.body),r=t?` Shopware said: "${t}"`:"";if(e.status===401||e.status===403||e.status===412)return new A(e.url,`${e.message}${r} The sales channel access key looks wrong: check --access-key or SHOPWARE_ACCESS_KEY. ${co}`,e.status,e.body);return new A(e.url,`${e.message}${r} ${uo}`,e.status,e.body)}async function lo(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 A))throw o;throw xy(o)}}function Ry(e){return e instanceof A&&(e.status===401||e.status===403||e.status===412)}async function oi(e,t,r=fetch){try{let n=await lo(`${e}${cr}/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(Ry(n))throw n;return null}}var ai={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 si(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:ai}}function ii(e,t){return{page:t,limit:ir,"total-count-mode":"exact",filter:[{type:"equalsAny",field:"parentId",value:e}],sort:[{field:"id",order:"ASC"}],associations:{options:{associations:{group:{}}}},includes:ai}}function ui(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 Py(e,t,r,n){let o=new Map;if(r.length===0)return o;let a=`${e}${cr}/product`;for(let s=1;s<=ur;s++){let i=await lo(a,t,n,ii(r,s));if(!Array.isArray(i?.elements))throw new A(a,`${a} did not return a product list for the variants. ${uo}`);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||ui(i,s,ir,u.length))return o}throw new A(a,`Stopped after ${ur} pages of variants from ${a} without reaching the end.`)}async function*vy(e,t={}){let r=t.accessKey?.trim();if(!r)throw TypeError(ni());let n=ri(e),o=t.fetch??fetch,a=t.limit,s=a&&a>0?Math.min(ir,a):ir,i=`${n}${cr}/product`,u=[],c=t.currency?.trim().toUpperCase()||null,d=await oi(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}${cr}/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 b=1;b<=ur;b++){let p=`${i} (page ${b})`,h;try{h=await lo(i,r,o,si(b,s))}catch(S){if(S instanceof A)throw new A(S.url,S.message.replace(S.url,p),S.status,S.body);throw S}if(!Array.isArray(h?.elements))throw new A(i,`${p} did not return a product list. ${uo}`);let g=h.elements;if(g.length===0)return;let f=g.map((S)=>String(S?.id));if(b>1&&f.every((S)=>l.has(S)))throw new A(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?g.slice(0,Math.max(0,a-y)):g,D=b===1?u:[],v=x.filter((S)=>typeof S?.childCount==="number"&&S.childCount>0).map((S)=>String(S.id)),E=await Py(n,r,v,o),C=[];for(let S of x)try{let k=ti(S,{storeUrl:n,currency:m,children:E.get(String(S?.id))});C.push(k.product),D.push(...k.warnings),y++}catch(k){D.push({externalId:S?.id===void 0?void 0:String(S.id),message:`skipped: ${k.message}`})}if(yield{url:p,products:C,warnings:D},a&&y>=a)return;if(ui(h,b,s,g.length))return}throw new A(i,`Stopped after ${ur} pages of ${i} without reaching the end.`)}var mo={name:"shopware",pages:vy};var ci=100,di=1e4,Dy=`Check SHOPWARE_CLIENT_ID and SHOPWARE_CLIENT_SECRET, and that the integration's role may read customers and orders. ${he.shopware}`,po="Is this a Shopware 6 store with the Admin API reachable at /api?";function mi(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,J(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 fo(e){return(e?.stateMachineState?.technicalName??"").toLowerCase()}function Sy(e){let t=[...e.transactions??[]].sort((r,n)=>String(r?.createdAt??"").localeCompare(String(n?.createdAt??"")));return fo(t.at(-1))}function pi(e){let t=fo(e),r=fo(e.deliveries?.[0]),n=Sy(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 Cy(e){if(!e||!R(e.street))return null;return We(H(e.firstName,e.lastName),e.company,e.street,e.additionalAddressLine1,[e.zipcode,e.city].map((t)=>U(t)).filter(Boolean).join(" "),e.country?.iso??e.country?.name)}function ky(e){return e.payload&&typeof e.payload==="object"&&!Array.isArray(e.payload)?e.payload:{}}function fi(e,t){let r=Array.isArray(t)?t.map((n)=>U(n?.option)).filter(Boolean):[];return r.length>0&&!r.every((n)=>e.includes(n))?`${e} - ${r.join(", ")}`:e}function wi(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=J(o),s=(f,x)=>Le(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=U(f?.label)||`Line ${x}`,v=(f?.type??"").toLowerCase(),E=null;try{E=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"||E!==null&&E<0){u+=Math.abs(E??0);continue}let C=je(f?.quantity);if(!x||C===null){n.push({externalId:r,message:`line "${D}" has no id or quantity; left out`});continue}let S=v==="product"&&f.productId===null,k=v==="product"&&!S?R(f.productId)??R(f.referencedId):null,O=ky(f);i.push({externalId:x,productExternalId:R(O.parentId)??k,variantExternalId:k,name:fi(D,O.options),sku:R(O.productNumber),quantity:C,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}=pi(e);if(!l)n.push({externalId:r,message:`Shopware state "${y}" has no Stacks equivalent; imported as ${m}`});let b=(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,h=oe(e.orderCustomer?.email),g=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:h||g?{externalId:g,email:h,name:H(e.orderCustomer?.firstName,e.orderCustomer?.lastName),phone:ye(b?.phoneNumber)}:null,shippingAddress:Cy(p),note:R(e.customerComment),placedAt:we(e.orderDateTime),lines:i},warnings:n}}function yi(e,t){let r=q(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 gi(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 Ay=["id","firstName","lastName","company","street","additionalAddressLine1","zipcode","city","phoneNumber","country"];function hi(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:Ay,order_delivery:["shippingOrderAddress","stateMachineState"],order_transaction:["stateMachineState","createdAt"],currency:["isoCode"],country:["iso","name"],state_machine_state:["technicalName"]}}}async function wo(e,t,r,n){let o=`${e}/api/oauth/token`,{data:a}=await $e(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 A(o,`${o} returned no access_token. ${po}`);return s}async function*li(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=yi(e,t.adminUrl),{clientId:s,clientSecret:i}=t.credentials,u=ze(t.credentials),d={fetch:t.fetch??fetch,secrets:u,credentialHelp:Dy,hint:po,sleep:t.sleep},m=await wo(a,s,i,d),l=async(f,x)=>{let D=()=>$e(f,{...d,secrets:[...u,m],headers:{authorization:`Bearer ${m}`},json:x});try{return await D()}catch(v){if(!(v instanceof Ct)||v.status!==401)throw v;return m=await wo(a,s,i,d),await D()}},y=`${a}/api/search/${r}`,b=t.limit,p=b&&b>0?Math.min(ci,b):ci,h=new Set,g=0;for(let f=1;f<=di;f++){let x=`${y} (page ${f})`,{data:D}=await l(y,n(f,p));if(!Array.isArray(D?.data))throw new A(y,`${x} did not return a "data" list. ${po}`);let v=D.data;if(v.length===0)return;let E=v.map((O)=>String(O?.id));if(f>1&&E.every((O)=>h.has(O)))throw new A(y,`${x} repeated ${r}s from an earlier page; the store is not paginating.`);E.forEach((O)=>h.add(O));let C=[],S=[];for(let O of v){if(b&&g>=b)break;let M=o(O);if(S.push(...M.warnings),M.record)C.push(M.record),g++}if(yield{url:x,items:C,warnings:S},b&&g>=b)return;let k=typeof D.total==="number"?D.total:Number.NaN;if(v.length<p||Number.isInteger(k)&&f*p>=k)return}throw new A(y,`Stopped after ${di} pages of ${y} without reaching the end.`)}var yo={name:"shopware",customers:(e,t)=>li(e,t,"customer",gi,(r)=>mi(r,{currency:t.currency})),orders:(e,t)=>li(e,t,"order",hi,(r)=>wi(r,{currency:t.currency}))};import{slug as Pi}from"@stacksjs/strings";var ho=100,bo=1000,_o="/wp-json/wc/store/v1/products",bi="Is WooCommerce 6+ installed with the Store API reachable at /wp-json?";function vi(e){let t=R(e?.currency_code)?.toUpperCase()??null,r=Number(e?.currency_minor_unit),n=Number.isInteger(r)&&r>=0?r:2,o=J(t),a=nt(e?.price,n,o),s=nt(e?.regular_price,n,o);return{currency:t,priceMinor:a,compareAtMinor:s!==null&&a!==null&&s>a?s:null}}function _i(e,t,r){try{return vi(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 go(e){return(e??[]).map((t)=>{let r=U(t?.name);return{name:r,slug:R(t?.slug)??Pi(r)}}).filter((t)=>t.name&&t.slug)}function Di(e){let t=R(e);if(!t||!t.includes("%"))return t;try{return decodeURIComponent(t)}catch{return t}}function xi(e){return typeof e.low_stock_remaining==="number"?Math.max(0,Math.trunc(e.low_stock_remaining)):null}function Ri(e){return e.is_in_stock!==!1&&e.is_purchasable!==!1}function Si(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=U(e.name);if(!o)throw TypeError(`WooCommerce product ${r} has no name`);let a=_i(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)=>U(l.name)).filter(Boolean),c,d=a.currency;if(s)c=(e.variations??[]).map((l)=>{let y=String(l.id),b=i.map((g)=>{let f=U(g.name).toLowerCase(),x=(g.taxonomy??"").toLowerCase(),D=(l.attributes??[]).find((C)=>{let S=U(C.name).toLowerCase();return S===f||x!==""&&S===x}),v=R(D?.value);if(!v)return"Any";let E=(g.terms??[]).find((C)=>C.slug===v);return E?U(E.name):U(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:b.join(" / ")||o,sku:null,priceMinor:null,compareAtMinor:null,available:!1,inventory:null,optionValues:b};let h=_i(p,y,n);return d??=h.currency,{externalId:y,title:b.join(" / ")||U(p.name)||o,sku:R(p.sku),priceMinor:h.priceMinor,compareAtMinor:h.compareAtMinor,available:Ri(p),inventory:xi(p),optionValues:b}});else c=[{externalId:r,title:o,sku:R(e.sku),priceMinor:a.priceMinor,compareAtMinor:a.compareAtMinor,available:Ri(e),inventory:xi(e),optionValues:[]}];let m=go(e.brands)[0];return{product:{source:"woocommerce",externalId:r,name:o,handle:Di(e.slug)??Pi(o),descriptionHtml:R(e.description)??R(e.short_description),vendor:m?m.name:null,categories:go(e.categories),tags:go(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 Ci(e,t){let{data:r,headers:n}=await fe(e,t,bi);if(!Array.isArray(r))throw new A(e,`${e} did not return a product list. ${bi}`);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 Ty(e,t,r){let n=new Map;if(t.length===0)return n;for(let o=1;o<=bo;o++){let a=`${e}${_o}?type=variation&parent=${t.join(",")}&per_page=${ho}&page=${o}`,s=await Ci(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*Ey(e,t={}){let r=q(e),n=t.fetch??fetch,o=t.limit,a=o&&o>0?Math.min(ho,o):ho,s=new Set,i=0;for(let u=1;u<=bo;u++){let c=`${r}${_o}?per_page=${a}&page=${u}`,d=await Ci(c,n);if(d.items.length===0)return;let m=d.items.map((g)=>String(g?.id));if(u>1&&m.every((g)=>s.has(g)))throw new A(c,`${c} repeated products from an earlier page; the store is not paginating. Use --limit to import the first page only.`);m.forEach((g)=>s.add(g));let l=o?d.items.slice(0,Math.max(0,o-i)):d.items,y=[],b=l.filter((g)=>g?.type==="variable"&&(g.variations?.length??0)>0).map((g)=>String(g.id)),p=new Map;try{p=await Ty(r,b,n)}catch(g){if(!(g instanceof A))throw g;y.push({message:`variations could not be fetched (${g.message}); variable products are imported without variant prices`})}let h=[];for(let g of l)try{let f=Si(g,{variations:p});h.push(f.product),y.push(...f.warnings),i++}catch(f){y.push({externalId:g?.id===void 0?void 0:String(g.id),message:`skipped: ${f.message}`})}if(yield{url:c,products:h,warnings:y},o&&i>=o)return;if(d.totalPages!==null&&u>=d.totalPages)return}throw new A(r,`Stopped after ${bo} pages of ${r}${_o} without reaching the end.`)}var xo={name:"woocommerce",pages:Ey};var ki=100,Ai=1e4,Ro="/wp-json/wc/v3",Fy=`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}`,Ti="Is WooCommerce installed with the REST API reachable at /wp-json/wc/v3, and pretty permalinks enabled?",Iy={pending:"PENDING","on-hold":"PENDING",processing:"PROCESSING",completed:"DELIVERED",cancelled:"CANCELLED",failed:"CANCELLED",refunded:"REFUNDED"},My=new Set(["checkout-draft","auto-draft","trash"]);function Fi(e){let t=Iy[(e??"").toLowerCase()];return t?{status:t,mapped:!0}:{status:"PENDING",mapped:!1}}function Ny(e){let t=R(e);if(!t)return null;try{return new URL(t).protocol==="https:"?t:null}catch{return null}}function Ii(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:Ny(e.avatar_url),createdAt:sr(e.date_created_gmt)},warnings:r}}function Oy(e){if(!e||!R(e.address_1))return null;return We(H(e.first_name,e.last_name),e.company,e.address_1,e.address_2,e.city,[e.state,e.postcode].map((t)=>U(t)).filter(Boolean).join(" "),e.country)}function Mi(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(My.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=J(a),i=(p,h)=>Le(p,s,h,r,n),u=[];for(let p of e.line_items??[]){let h=p?.id===void 0||p.id===null?"":String(p.id),g=je(p?.quantity),f=U(p?.name)||`Line ${h}`;if(!h||g===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:h,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:g,unitPriceMinor:oo(x,g)})}let c=0;for(let p of e.fee_lines??[]){let h=U(p?.name)||"Fee",g=null;try{g=ge(p?.total,s)}catch(f){if(!(f instanceof I))throw f;n.push({externalId:r,message:`fee "${h}": ${f.message}; left out`})}if(g===null||g===0)continue;if(g<0){c+=-g;continue}u.push({externalId:`fee-${p?.id??u.length}`,productExternalId:null,variantExternalId:null,name:h,sku:null,quantity:1,unitPriceMinor:g})}let{status:d,mapped:m}=Fi(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),b=0;for(let p of e.refunds??[])try{b+=Math.abs(ge(p?.total,s)??0)}catch(h){if(!(h instanceof I))throw h;n.push({externalId:r,message:`refund ${p?.id??""}: ${h.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:Oy(e.shipping),note:R(e.customer_note),placedAt:sr(e.date_created_gmt),lines:u,refundedMinor:b},warnings:n}}function Ni(e,t){let r=q(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 Oi(e,t){return`Basic ${Buffer.from(`${e}:${t}`,"utf8").toString("base64")}`}async function*Ei(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=Ni(e,t.adminUrl),{consumerKey:a,consumerSecret:s}=t.credentials,i=Oi(a,s),u={fetch:t.fetch??fetch,headers:{authorization:i},secrets:[...ze(t.credentials),i.slice(6)],credentialHelp:Fy,hint:Ti,sleep:t.sleep},c=t.limit,d=c&&c>0?Math.min(ki,c):ki,m=new Set,l=0;for(let y=1;y<=Ai;y++){let b=`${o}${Ro}/${r}?per_page=${d}&page=${y}&orderby=id&order=asc`,{data:p,headers:h}=await $e(b,u);if(!Array.isArray(p))throw new A(b,`${b} did not return a list of ${r}. ${Ti}`);let g=p;if(g.length===0)return;let f=g.map((C)=>String(C?.id));if(y>1&&f.every((C)=>m.has(C)))throw new A(b,`${b} repeated ${r} from an earlier page; the store is not paginating.`);f.forEach((C)=>m.add(C));let x=[],D=[];for(let C of g){if(c&&l>=c)break;let S=n(C);if(D.push(...S.warnings),S.record)x.push(S.record),l++}yield{url:b,items:x,warnings:D};let v=h.get("x-wp-totalpages")?.trim(),E=v?Number(v):Number.NaN;if(c&&l>=c)return;if(Number.isInteger(E)&&y>=E)return}throw new A(`${o}${Ro}/${r}`,`Stopped after ${Ai} pages of ${o}${Ro}/${r} without reaching the end.`)}var Po={name:"woocommerce",customers:(e,t)=>Ei(e,t,"customers",Ii),orders:(e,t)=>Ei(e,t,"orders",(r)=>Mi(r,{currency:t.currency}))};import{db as So,sqlHelpers as ji}from"@stacksjs/database/runtime";import{env as zi}from"@stacksjs/env";import{formatDate as ko}from"@stacksjs/orm";import{db as $y}from"@stacksjs/database/runtime";import{HttpError as Ji}from"@stacksjs/error-handling";import{isUniqueViolation as By}from"@stacksjs/orm";function ve(e){if(typeof e==="bigint")return vo(e);if(typeof e==="number")return vo(e);if(!e||typeof e!=="object")return;if(Array.isArray(e)){for(let r of e){let n=ve(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=vo(n);if(o!==void 0)return o}return}function vo(e){let t=typeof e==="bigint"?Number(e):Number(e);if(!Number.isSafeInteger(t)||t<=0)return;return t}import{db as $i}from"@stacksjs/database/runtime";async function lr(e){let t=await $i.selectFrom("customers").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function Bi(){return P(await $i.selectFrom("customers").selectAll().execute())}var Do="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=400&fit=crop&q=60";async function Ui(e){try{let t={...e,avatar:e.avatar??Do},r=await $y.insertInto("customers").values(t).executeTakeFirst();if(!r)throw Error("Failed to create customer");let n=ve(r);if(n===void 0)throw Error("Failed to create customer: the database reported no insert id");return await lr(n)}catch(t){if(t instanceof Ji)throw t;if(By(t))throw new Ji(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 Jy}from"crypto";var Wi="5d0c8a3e-6f1b-4c2a-9e47-b18f3d2a6c90";function Li(e,t=Wi){let r=t.replace(/-/g,"");if(!/^[0-9a-f]{32}$/i.test(r))throw TypeError(`Invalid namespace UUID "${t}"`);let n=Jy("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 Li(`${e}:${t.toLowerCase()}:${r}:${n}`)}var Uy=255;function qe(e,t,r,n){return te(e,t,"customer",r??`email:${n}`)}function Ao(e,t,r,n,o){if(!n)return null;if(r!==null&&r!==qe(e,t,null,o))return null;return qe(e,t,n,o)}function kt(e){return e?ko(new Date(e)):null}function mr(e,t,r,n){let o={name:e.name.slice(0,Uy),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=kt(e.lastOrderAt),o.status=e.active===!1?"Inactive":"Active",o.avatar=e.avatarUrl??Do,o.created_at=kt(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=kt(e.lastOrderAt);if(e.active!==null)o.status=e.active?"Active":"Inactive";return o}function Co(e){return e.sku?`${e.name} (SKU ${e.sku})`:e.name}function Gi(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:kt(e.placedAt)??n,updated_at:n};if(r!==null)o.customer_id=r;return o}class To{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 Vi(e){let t=q(e.storeUrl);return{storeUrl:t,host:St(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 Wy(e){let{storeUrl:t,host:r,clock:n,fetchOptions:o}=Vi(e),{adapter:a,repository:s}=e,i=new To,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=ko(n()),b=qe(m.source,r,m.externalId,m.email),p=i.find(b,m.email);if(!p){let f=await l.createCustomer(mr(m,b,y,"create"));return i.remember(f,b,m.email),{action:"create",externalId:m.externalId,email:m.email,name:m.name,matchedBy:null}}let h=mr(m,b,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 h.email=m.email;let g=p.matchedBy==="email"?Ao(m.source,r,i.uuidOf(p.id),m.externalId,m.email):null;if(g)h.uuid=g;return await l.updateCustomer(p.id,h),i.remember(p.id,g,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:qe(y.source,r,y.externalId,y.email),email:y.email})));for(let y of l){let b=await d(y,s);c.counts.customers[b.action==="create"?"created":"updated"]++,c.customers.push(b),e.onCustomer?.(b)}}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 Ly(e){let{storeUrl:t,host:r,clock:n,fetchOptions:o}=Vi(e),{adapter:a,repository:s}=e,i=new To,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),b=(f,x)=>te(f.source,r,"variant",x);function p(f){let x=f.customer;if(x?.externalId)return qe(f.source,r,x.externalId,x.email??"");return x?.email?qe(f.source,r,null,x.email):null}async function h(f,x,D){let v=f.customer;if(!v)return null;let E=p(f),C=i.find(E,v.email);if(C){let k=C.matchedBy==="email"&&v.email?Ao(f.source,r,i.uuidOf(C.id),v.externalId,v.email):null;if(k)await x.updateCustomer(C.id,{uuid:k,updated_at:D}),i.remember(C.id,k,v.email);return C.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(mr({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},E,D,"create"));return i.remember(S,E,v.email),l.counts.customers.created++,S}async function g(f,x,D){let v=ko(n()),E=await h(f,x,v),C=Gi(f,r,E,v),S=D.orders.get(C.uuid),k;if(S===void 0)k=await x.createOrder(C);else{k=S;let V={...C};delete V.uuid,await x.updateOrder(k,V)}let O=0,M=0,re=f.lines.map((V)=>{let ht=(V.productExternalId?D.products.get(y(f,V.productExternalId)):void 0)??(V.variantExternalId?D.variants.get(b(f,V.variantExternalId)):void 0)??null;if(ht===null){if(!V.productExternalId&&!V.variantExternalId)M++;else if(O++,d.size<5)d.add(Co(V))}return{order_id:k,product_id:ht,quantity:V.quantity,price:V.unitPriceMinor,special_instructions:Co(V),created_at:v,updated_at:v}});return await x.replaceOrderItems(k,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:E}}for await(let f of a.orders(t,o)){l.pages.push(f.url),l.warnings.push(...f.warnings);let x=f.items.filter((k)=>{if(!u.has(k.externalId))return u.add(k.externalId),!0;return l.counts.duplicates++,!1}),D=x.map((k)=>te(k.source,r,"order",k.externalId)),v=[...new Set(x.flatMap((k)=>k.lines.flatMap((O)=>O.productExternalId?[y(k,O.productExternalId)]:[])))],E=[...new Set(x.flatMap((k)=>k.lines.flatMap((O)=>O.variantExternalId?[b(k,O.variantExternalId)]:[])))],C={orders:D.length>0?await s.findOrders(D):new Map,products:v.length>0?await s.findProducts(v):new Map,variants:E.length>0?await s.findVariantProducts(E):new Map};await i.load(s,x.map((k)=>({uuid:p(k),email:k.customer?.email??null})));let S=new Map;for(let k of x){c.add(k.currency);let{customerId:O,...M}=s.transaction?await s.transaction((V)=>g(k,V,C)):await g(k,s,C);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=kt(k.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[k,O]of S)await s.advanceLastOrder(k,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 qi(e=So){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=ji(zi.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=ji(zi.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===So)n.transaction=(o)=>So.transaction((a)=>o(qi(a)));return n}function jy(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 zy(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:Hi}=globalThis.Bun;import{db as Eo}from"@stacksjs/database/runtime";import{formatDate as Gy}from"@stacksjs/orm";var Zi="Unknown",Vy=1,qy=50,Fo=100;function No(e){let t=e.map((r)=>r.priceMinor).filter((r)=>r!==null);return t.length>0?Math.min(...t):null}function Qi(e){if(e.length===0||e.some((t)=>t.inventory===null))return null;return e.reduce((t,r)=>t+(r.inventory??0),0)}function Yi(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>Fo)t.set(o.externalId,null),r.push({externalId:e.externalId,message:`"${e.name}" variant "${o.title}" has a SKU longer than ${Fo} 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 Io(e,t,r,n,o){let a=Qi(e.variants),s={uuid:te(e.source,t,"product",e.externalId),name:e.name,description:e.descriptionHtml,price:No(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=Vy,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 Mo(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,qy),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 Ki(e){let t={...e};return delete t.uuid,t}async function Hy(e){let t=q(e.storeUrl),r=St(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,h,g){let f=p.categories[0];if(!f)return null;let x=i.get(f.slug);if(x!==void 0)return x;let D=await h.findCategory(f.slug,f.name);if(D===void 0)D=await h.createCategory({uuid:Hi(),name:f.name,slug:f.slug,description:null,image_url:null,is_active:!0,parent_category_id:null,display_order:i.size,created_at:g,updated_at:g}),s.counts.categories.created++;return i.set(f.slug,D),D}async function l(p,h,g){if(!p.vendor)return null;let f=u.get(p.vendor);if(f!==void 0)return f;let x=await h.findManufacturer(p.vendor);if(x===void 0)x=await h.createManufacturer({uuid:Hi(),manufacturer:p.vendor,description:null,country:Zi,featured:!1,created_at:g,updated_at:g}),s.counts.manufacturers.created++;return u.set(p.vendor,x),x}async function y(p){let h=p.map((f)=>te(f.source,r,"product",f.externalId)),g=p.filter((f)=>f.hasOptions).flatMap((f)=>f.variants.map((x)=>te(f.source,r,"variant",x.externalId)));return{products:h.length>0?await a.findProducts(h):new Map,variants:g.length>0?await a.findVariants(g):new Map}}async function b(p,h,g){let f=Gy(n()),x={categoryId:await m(p,h,f),manufacturerId:await l(p,h,f)},D=te(p.source,r,"product",p.externalId),v=g.products.get(D),E=v===void 0?"create":"update",C;if(v===void 0)C=await h.createProduct(Io(p,r,x,f,"create"));else C=v,await h.updateProduct(C,Ki(Io(p,r,x,f,"update")));let S={create:0,update:0};if(p.hasOptions){let{skus:k,warnings:O}=Yi(p);s.warnings.push(...O);let M=[...k.values()].filter((re)=>re!==null);if(v!==void 0&&M.length>0)await h.releaseVariantSkus(C,M);for(let re of p.variants){let V=k.get(re.externalId)??null,ht=g.variants.get(te(p.source,r,"variant",re.externalId));if(ht===void 0)await h.createVariant(Mo(p,re,r,C,f,"create",V)),S.create++;else await h.updateVariant(ht,Ki(Mo(p,re,r,C,f,"update",V))),S.update++}}return{action:E,externalId:p.externalId,name:p.name,handle:p.handle,priceMinor:No(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 h=[];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),h.push(f)}let g=await y(h);for(let f of h){if(f.currency)d.add(f.currency);let x=a.transaction?await a.transaction((D)=>b(f,D,g)):await b(f,a,g);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 Xi(e=Eo){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===Eo)o.transaction=(a)=>Eo.transaction((s)=>a(Xi(s)));return o}function Ky(){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 Zy(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 eu={shopify:no,woocommerce:xo,shopware:mo};function Qy(e){return eu[e.trim().toLowerCase()]}var tu={shopify:io,woocommerce:Po,shopware:yo};function Yy(e){return tu[e.trim().toLowerCase()]}var $o={};F($o,{deleteCoupon:()=>nu,deleteCoupons:()=>ou,deleteExpiredCoupons:()=>au,fetchActive:()=>du,fetchAll:()=>uu,fetchByCode:()=>cu,fetchById:()=>He,fetchConversionRate:()=>gu,fetchCouponCounts:()=>mu,fetchCouponCountsByType:()=>pu,fetchRedemptionStats:()=>fu,fetchRedemptionTrend:()=>yu,fetchStats:()=>lu,fetchTopRedeemedCoupons:()=>wu,getActiveCouponsMoMChange:()=>hu,redeem:()=>Su,store:()=>xu,update:()=>Du});import{db as Oo}from"@stacksjs/database/runtime";import{formatDate as Xy}from"@stacksjs/orm";async function nu(e){let t=await Oo.deleteFrom("coupons").where("id","=",e).executeTakeFirst();return _(t)>0}async function ou(e){if(!e.length)return 0;return await Oo.deleteFrom("coupons").where("id","in",e).execute()||0}async function au(){let e=Xy(new Date),t=await Oo.deleteFrom("coupons").where("end_date","<",e).executeTakeFirst();return _(t)}import{db as T}from"@stacksjs/database/runtime";import{extractDate as su,formatDate as iu}from"@stacksjs/orm";import{camelCase as eg}from"@stacksjs/strings";function fr(e){let t=Object.fromEntries(Object.entries(e).map(([r,n])=>[eg(r),n]));if(t.endDate)t.endDate=su(new Date(t.endDate));if(t.startDate)t.startDate=su(new Date(t.startDate));if(t.isActive!==void 0)t.isActive=Boolean(t.isActive);return t}async function uu(){let e=await T.selectFrom("coupons").selectAll().execute();return P(e).map(fr)}async function He(e){let t=await T.selectFrom("coupons").where("id","=",e).selectAll().executeTakeFirst();if(t)return fr(w(t));return}async function cu(e){let t=await T.selectFrom("coupons").where("code","=",e).selectAll().executeTakeFirst();if(t)return fr(w(t));return}async function du(){let e=iu(new Date),t=await T.selectFrom("coupons").where("is_active","=",!0).where("start_date","<=",e).where("end_date",">=",e).selectAll().execute();return P(t).map(fr)}async function lu(){let e=await T.selectFrom("coupons").select(T.fn.count("id").as("count")).executeTakeFirst(),t=iu(new Date),r=await T.selectFrom("coupons").where("is_active","=",!0).where("start_date","<=",t).where("end_date",">=",t).select(T.fn.count("id").as("count")).executeTakeFirst(),n=await T.selectFrom("coupons").select(["discount_type",T.fn.count("id").as("count")]).groupBy("discount_type").execute(),o=await T.selectFrom("coupons").select(["id","code","discount_type","discount_value","usage_count"]).orderBy("usage_count","desc").limit(5).execute(),a=await T.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 mu(){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 pr(null,null,e),a=await pr(t,null,e),s=await pr(r,null,e),i=await pr(n,null,e);return{week:a,month:s,year:i,all_time:o}}async function pr(e,t,r){let n=T.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(T.fn.count("id").as("count")).executeTakeFirst(),a=T.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(T.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 pu(){let e=new Date,t=await T.selectFrom("coupons").select("discount_type").distinct().execute(),r={};for(let{discount_type:n}of t){let o=await T.selectFrom("coupons").where("discount_type","=",n).select(T.fn.count("id").as("count")).executeTakeFirst(),a=await T.selectFrom("coupons").where("discount_type","=",n).where("is_active","=",!0).where("start_date","<=",e).where("end_date",">=",e).select(T.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 fu(){let e=await T.selectFrom("coupons").select(T.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 T.selectFrom("coupons").where("updated_at",">=",r.toISOString()).select(T.fn.sum("usage_count").as("total")).executeTakeFirst(),s=await T.selectFrom("coupons").where("updated_at",">=",n.toISOString()).select(T.fn.sum("usage_count").as("total")).executeTakeFirst(),i=await T.selectFrom("coupons").where("updated_at",">=",o.toISOString()).select(T.fn.sum("usage_count").as("total")).executeTakeFirst(),u=await T.selectFrom("coupons").select(["discount_type",T.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 wu(e=5){return await T.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 yu(e=30){let t=new Date().toISOString(),r=new Date;r.setDate(r.getDate()-e);let n=await T.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 gu(){let e=new Date,t=await T.selectFrom("coupons").where("is_active","=",!0).where("start_date","<=",e).where("end_date",">=",e).select(T.fn.count("id").as("count")).executeTakeFirst(),r=await T.selectFrom("coupons").where("usage_count",">",0).select(T.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 hu(){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 T.selectFrom("coupons").select(T.fn.count("id").as("count")).where("is_active","=",!0).where("start_date","<=",e).where("end_date",">=",t).executeTakeFirst(),a=await T.selectFrom("coupons").select(T.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:tg}=globalThis.Bun;import{db as bu}from"@stacksjs/database/runtime";import{HttpError as _u}from"@stacksjs/error-handling";import{isUniqueViolation as rg}from"@stacksjs/orm";async function xu(e){try{let t=tg();await bu.insertInto("coupons").values({...e,uuid:t}).executeTakeFirst();let r=await bu.selectFrom("coupons").where("uuid","=",t).selectAll().executeTakeFirst();return w(r,!0)}catch(t){if(t instanceof _u)throw t;if(rg(t))throw new _u(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 Pu,mutationCount as ng,sqlHelpers as og}from"@stacksjs/database/runtime";import{env as ag}from"@stacksjs/env";import{HttpError as Ru}from"@stacksjs/error-handling";import{formatDate as vu,isUniqueViolation as sg}from"@stacksjs/orm";async function Du(e,t){if(!await He(e))return;try{return await Pu.updateTable("coupons").set({...t,updated_at:vu(new Date)}).where("id","=",e).execute(),await He(e)}catch(n){if(n instanceof Ru)throw n;if(sg(n))throw new Ru(409,"A coupon with this code already exists");if(n instanceof Error)throw Error(`Failed to update coupon: ${n.message}`);throw n}}async function Su(e){let t=og(ag.DB_CONNECTION||"sqlite"),r=t.param,n=vu(new Date),o=await Pu.unsafe(`UPDATE coupons
2
+ var zw=Object.defineProperty;var Gw=(e)=>e;function Vw(e,t){this[e]=Gw.bind(null,t)}var F=(e,t)=>{for(var r in t)zw(e,r,{get:t[r],enumerable:!0,configurable:!0,set:Vw.bind(t,r)})};var qw=(e,t,r)=>()=>{if(e)try{t=e(e=0)}catch(n){r=[n]}if(r)throw r[0];return t};function Je(e,t){if(e===t)return!0;return Cg[e]?.includes(t)??!1}async function Ze(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 Pr(e){await Ze("order:created",{order:e})}async function Qe(e,t){await Ze("order:paid",{order:e,payment:t})}async function ea(e){await Ze("order:shipped",{order:e})}async function kg(e){await Ze("order:out_for_delivery",{order:e})}async function ta(e){await Ze("order:delivered",{order:e})}async function It(e,t){await Ze("order:cancelled",{order:e,reason:t})}async function Mt(e,t){await Ze("order:refunded",{order:e,refundAmount:t})}async function ut(e,t){switch(e){case"PROCESSING":return Qe(t);case"SHIPPED":return ea(t);case"OUT_FOR_DELIVERY":return kg(t);case"DELIVERED":return ta(t);case"CANCELLED":return It(t);case"REFUNDED":return Mt(t);case"PENDING":default:}}var Cg;var ct=qw(()=>{Cg={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 Xn={};F(Xn,{DEFAULT_INCREMENT_LADDER:()=>_e,auctionChannel:()=>nr,auctionTotals:()=>Wn,biddersFor:()=>An,bids:()=>$n,bidsByBidder:()=>kn,bidsForAuction:()=>Cn,bidsForItem:()=>Sn,broadcastBid:()=>En,broadcastItemClosed:()=>In,broadcastPledge:()=>Fn,closeAuction:()=>Gn,closeDueItems:()=>zn,closeItem:()=>Dt,closingSoon:()=>qn,closingSoonNotification:()=>Yw,currencyFor:()=>Mn,determineWinner:()=>nt,effectiveCloseAt:()=>Me,engine:()=>Bn,extendedCloseAt:()=>xt,fetchAuction:()=>pe,fetchAuctionForEvent:()=>Jn,fetchCatalogue:()=>Un,fetchItems:()=>Re,fetchPledges:()=>Qn,incrementFor:()=>de,leadingBid:()=>_t,lots:()=>Hn,makePledge:()=>cs,nextMinimumBid:()=>xe,openAuction:()=>jn,outbidNotification:()=>Zw,placeBid:()=>On,pledgeLevels:()=>ds,pledgeTotal:()=>Zn,pledges:()=>Yn,resolveBid:()=>Rt,rulesFor:()=>Pt,settle:()=>vt,settleAuction:()=>Vn,winnerNotification:()=>Qw});var $n={};F($n,{biddersFor:()=>An,bidsByBidder:()=>kn,bidsForAuction:()=>Cn,bidsForItem:()=>Sn,leadingBid:()=>_t,placeBid:()=>On});import{db as bt}from"@stacksjs/database/runtime";async function _t(e){return await bt.selectFrom("bids").selectAll().where("auction_item_id","=",e).where("status","=","leading").orderBy("amount","desc").executeTakeFirst()??null}async function Sn(e){return await bt.selectFrom("bids").selectAll().where("auction_item_id","=",e).orderBy("placed_at","desc").execute()??[]}async function Cn(e){return await bt.selectFrom("bids").selectAll().where("auction_id","=",e).orderBy("placed_at","asc").execute()??[]}async function kn(e,t){return await bt.selectFrom("bids").selectAll().where("auction_id","=",e).where("bidder_email","=",t.toLowerCase()).orderBy("placed_at","desc").execute()??[]}async function An(e){let t=await bt.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:Kw}=globalThis.Bun;import{db as Nn}from"@stacksjs/database/runtime";function xt(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 Me(e,t){return new Date(e.closes_at??t)}var _e=[{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=_e,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 xe(e,t,r=_e){if(t===null||t<=0)return e.starting_bid;return t+de(t,r,e.min_increment)}function Rt(e,t,r,n=_e){let o=Math.max(r.amount,r.maxAmount??0),a=xe(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 l=Math.max(e.starting_bid,r.amount);return{accepted:!0,leader:{bidderEmail:r.bidderEmail,bidderName:r.bidderName,amount:l,maxAmount:r.maxAmount??null,isChallenger:!0},challengerAmount:l,nextMinimumBid:l+de(l,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 l=s+de(s,n,e.min_increment),m=Math.min(o,Math.max(l,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 nr(e){return`auction.${e}`}async function Tn(){try{let e=await import("@stacksjs/realtime");return e.emit??null}catch{return null}}async function En(e){let t=await Tn();if(!t||!e.item||!e.leader)return;await t(nr(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 Fn(e,t){let r=await Tn();if(!r)return;await r(nr(e.auction_id),"pledge.made",{donorName:e.donor_name,amount:e.amount,level:e.level??null,runningTotal:t})}async function In(e,t,r){let n=await Tn();if(!n)return;await n(nr(e),"item.closed",{itemId:t,...r})}import{config as Hw}from"@stacksjs/config";function is(){return Hw.commerce??{}}function us(){return is().auction??{}}function Pt(e){let t=us();return{increments:t.increments?.length?t.increments:_e,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 Mn(e){return e?.currency??us().currency??is().currency??"USD"}function or(e){return e.toISOString().slice(0,19).replace("T"," ")}async function On(e){let t=e.now??new Date,r=await Nn.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 Nn.selectFrom("auctions").selectAll().where("id","=",r.auction_id).executeTakeFirst(),o=Pt(n),a=await _t(r.id),s=xe(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=Me(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=Rt(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:xt(r,i,o,t),l=u.leader&&!u.leader.isChallenger&&a&&a.bidder_email.toLowerCase()===e.bidderEmail.toLowerCase(),m=await Nn.transaction(async(y)=>{if(l&&a)return await y.updateTable("bids").set({max_amount:u.leader.maxAmount}).where("id","=",a.id).execute(),{...a,max_amount:u.leader.maxAmount};let b=u.leader?.isChallenger===!0,p=Kw();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:b?"leading":"outbid",placed_at:or(t)}).execute(),a){if(b)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:or(t)}).where("id","=",r.id).execute();else if(c)await y.updateTable("auction_items").set({closes_at:or(c),extension_count:r.extension_count+1}).where("id","=",r.id).execute();return await y.selectFrom("bids").selectAll().where("uuid","=",p).executeTakeFirst()}),d={...u,bid:m,item:{...r,status:u.buyNow?"sold":r.status,closes_at:c?or(c):r.closes_at,extension_count:c?r.extension_count+1:r.extension_count},extendedTo:c??void 0};return await En(d).catch(()=>{return}),d}var Bn={};F(Bn,{DEFAULT_INCREMENT_LADDER:()=>_e,determineWinner:()=>nt,effectiveCloseAt:()=>Me,extendedCloseAt:()=>xt,incrementFor:()=>de,nextMinimumBid:()=>xe,resolveBid:()=>Rt,settle:()=>vt});function nt(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 vt(e,t,r,n){let o=t.filter((m)=>m.status==="sold"),a=t.filter((m)=>m.status==="passed"),s=o.reduce((m,d)=>m+d.amount,0),i=r.filter((m)=>m.status==="confirmed").reduce((m,d)=>m+d.amount,0),u=new Map(e.map((m)=>[m.id,m.fair_market_value??null])),c=o.reduce((m,d)=>{let y=u.get(d.itemId);return y==null?m:m+(d.amount-y)},0),l=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:l===0?0:o.length/l,valueDelta:c,outcomes:t}}var Hn={};F(Hn,{auctionTotals:()=>Wn,closeAuction:()=>Gn,closeDueItems:()=>zn,closeItem:()=>Dt,closingSoon:()=>qn,fetchAuction:()=>pe,fetchAuctionForEvent:()=>Jn,fetchCatalogue:()=>Un,fetchItems:()=>Re,openAuction:()=>jn,settleAuction:()=>Vn});import{db as Ne}from"@stacksjs/database/runtime";async function pe(e){return await Ne.selectFrom("auctions").selectAll().where("id","=",e).executeTakeFirst()??null}async function Jn(e){return await Ne.selectFrom("auctions").selectAll().where("event_id","=",e).executeTakeFirst()??null}async function Re(e){return await Ne.selectFrom("auction_items").selectAll().where("auction_id","=",e).orderBy("lot_number","asc").execute()??[]}async function Un(e){let[t,r]=await Promise.all([pe(e),Re(e)]),n=Pt(t),o=await Ne.selectFrom("bids").select(["auction_item_id","amount","bidder_name"]).where("auction_id","=",e).where("status","in",["leading","won"]).execute(),a=await Ne.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:xe(u,c?.amount??null,n.increments),leaderName:c?.bidder_name??null}})}async function Wn(e){let t=await pe(e),r=await Ne.selectFrom("bids").select(["auction_item_id","amount","bidder_email","status"]).where("auction_id","=",e).where("status","!=","invalid").execute(),n=await Ne.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,l)=>c+l.amount,0),i=(n??[]).reduce((c,l)=>c+l.amount,0),u=await Ne.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 Oe}from"@stacksjs/database/runtime";function Ln(e){return e.toISOString().slice(0,19).replace("T"," ")}async function jn(e,t=new Date){return await Oe.updateTable("auctions").set({status:"open",opens_at:Ln(t)}).where("id","=",e).execute(),await Oe.updateTable("auction_items").set({status:"open"}).where("auction_id","=",e).where("status","=","closed").execute(),pe(e)}async function Dt(e,t=new Date){if(e.status==="sold"||e.status==="passed")return null;let r=await Oe.selectFrom("bids").selectAll().where("auction_item_id","=",e.id).execute(),n=nt(e,r??[]);return await Oe.transaction(async(o)=>{if(await o.updateTable("auction_items").set({status:n.status,closes_at:Ln(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 In(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 Re(e),o=[];for(let a of n){if(a.status!=="open")continue;if(Me(a,r.closes_at)>t)continue;let s=await Dt(a,t);if(s)o.push(s)}return o}async function Gn(e,t=new Date){let r=await Re(e),n=[];for(let o of r){let a=await Dt(o,t);if(a)n.push(a)}return await Oe.updateTable("auctions").set({status:"closed",closes_at:Ln(t)}).where("id","=",e).execute(),n}async function Vn(e,t={}){let r=await pe(e);if(!r)return null;let n=await Re(e),o=await Oe.selectFrom("bids").selectAll().where("auction_id","=",e).execute(),a=await Oe.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=nt(u,s.get(u.id)??[]);return u.status==="passed"?{...c,status:"passed"}:c});if(t.markSettled)await Oe.updateTable("auctions").set({status:"settled"}).where("id","=",e).execute();return vt(n,i,a??[],{auctionId:e,currency:Mn(r),goalAmount:r.goal_amount??null})}async function qn(e,t,r=new Date){let n=await pe(e);if(!n)return[];let o=new Date(r.getTime()+t*60000);return(await Re(e)).filter((a)=>{if(a.status!=="open")return!1;let s=Me(a,n.closes_at);return s>r&&s<=o})}function Kn(e,t="USD"){return new Intl.NumberFormat("en-US",{style:"currency",currency:t,minimumFractionDigits:0}).format(e/100)}function Zw(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 ${Kn(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 Qw(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 ${Kn(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 Yw(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 ${Kn(r,n)}.`,data:{itemId:e.id,lotNumber:e.lot_number,title:e.title,currentBid:r,closesAt:e.closes_at}}}var Yn={};F(Yn,{fetchPledges:()=>Qn,makePledge:()=>cs,pledgeLevels:()=>ds,pledgeTotal:()=>Zn});var{randomUUIDv7:Xw}=globalThis.Bun;import{db as ar}from"@stacksjs/database/runtime";async function cs(e){let t=Xw();await ar.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 ar.selectFrom("pledges").selectAll().where("uuid","=",t).executeTakeFirst();return await Fn(r,await Zn(e.auctionId)).catch(()=>{return}),r}async function Zn(e){return(await ar.selectFrom("pledges").select(["amount"]).where("auction_id","=",e).where("status","=","confirmed").execute()??[]).reduce((r,n)=>r+n.amount,0)}async function Qn(e){return await ar.selectFrom("pledges").selectAll().where("auction_id","=",e).orderBy("amount","desc").execute()??[]}async function ds(e){let t=(await Qn(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)}var eo={};F(eo,{bulkDestroy:()=>ps,bulkStore:()=>_s,bulkUpdate:()=>vs,destroy:()=>ms,fetchAll:()=>ys,fetchById:()=>ws,store:()=>bs,update:()=>Ps});import{db as ls}from"@stacksjs/database/runtime";import{mutationCount as _}from"@stacksjs/database/runtime";async function ms(e){try{let t=await ls.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 ps(e){if(!e.length)return 0;try{let t=await ls.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 fs}from"@stacksjs/database/runtime";function ey(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=ey(r);if(!(o in t))t[o]=n}return t}function P(e){return e.map((t)=>w(t))}async function ws(e){let t=await fs.selectFrom("carts").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function ys(){return P(await fs.selectFrom("carts").selectAll().execute())}var{randomUUIDv7:gs}=globalThis.Bun;import{db as hs}from"@stacksjs/database/runtime";async function bs(e){try{let t={...e,uuid:gs()},r=await hs.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 _s(e){if(!e.length)return 0;let t=0;try{return await hs.transaction(async(r)=>{for(let n of e){let o={...n,uuid:gs()};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 xs,matchedRows as ty}from"@stacksjs/database/runtime";import{formatDate as Rs}from"@stacksjs/orm";async function Ps(e,t){try{let r=await xs.updateTable("carts").set({...t,updated_at:Rs(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 vs(e){if(!e.length)return 0;let t=0;try{return await xs.transaction(async(r)=>{for(let n of e){if(!n.id)continue;if((await ty(r.updateTable("carts").set({...n,updated_at:Rs(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 ru={};F(ru,{ACCOUNT_CREDENTIAL_ENV:()=>ao,ACCOUNT_CREDENTIAL_HELP:()=>he,AdminCredentialError:()=>Ct,CATALOG_IMPORT_NAMESPACE:()=>Wi,CatalogFetchError:()=>A,MAX_RETRIES:()=>so,MissingCredentialsError:()=>st,PriceFormatError:()=>I,SHOPIFY_ADMIN_API_VERSION:()=>Gs,SHOPWARE_ACCESS_KEY_HELP:()=>co,SKU_MAX:()=>Fo,UNKNOWN_COUNTRY:()=>Zi,accountAdapter:()=>Yy,accountAdapters:()=>tu,addressLine:()=>Le,adminRequest:()=>$e,amountOrZero:()=>je,catalogAdapter:()=>Qy,catalogAdapters:()=>eu,catalogUuid:()=>te,cleanName:()=>U,createDatabaseAccountRepository:()=>qi,createDatabaseRepository:()=>Xi,createMemoryAccountRepository:()=>jy,createMemoryRepository:()=>Ky,createReadOnlyAccountRepository:()=>zy,createReadOnlyRepository:()=>Zy,credentialSecrets:()=>Ge,currencyCode:()=>ie,currencyExponent:()=>J,customerRow:()=>mr,customerUuid:()=>He,decimalToMinor:()=>ee,decodeHtmlEntities:()=>Fs,defaultSleep:()=>Ws,detectShopifyCurrency:()=>Bs,detectShopwareCurrency:()=>oi,fetchJson:()=>fe,formatMinor:()=>ne,gmtTimestamp:()=>sr,importCatalog:()=>Hy,importCustomers:()=>Wy,importOrders:()=>Ly,isoTimestamp:()=>we,lineLabel:()=>Co,lowestPrice:()=>No,mapShopifyCustomer:()=>Vs,mapShopifyOrder:()=>Hs,mapShopifyProduct:()=>$s,mapShopwareCustomer:()=>mi,mapShopwareOrder:()=>wi,mapShopwareProduct:()=>ti,mapWooCustomer:()=>Ii,mapWooOrder:()=>Mi,mapWooProduct:()=>Si,minorToDecimal:()=>Pe,missingAccessKeyMessage:()=>ni,nextPageInfo:()=>Ks,normalizeEmail:()=>oe,normalizeStoreUrl:()=>q,numberToDecimalString:()=>Es,numberToMinor:()=>at,optionalString:()=>R,orderRow:()=>Gi,personName:()=>H,phoneOf:()=>ye,productRow:()=>Io,promotedCustomerUuid:()=>Ao,quantityOf:()=>ze,readAccountCredentials:()=>cy,redactSecrets:()=>Ve,rescaleMinor:()=>ot,retryAfterSeconds:()=>Ds,shopifyAccountAdapter:()=>io,shopifyAdapter:()=>no,shopifyAdminBase:()=>Zs,shopifyOrderStatus:()=>qs,shopwareAccessToken:()=>wo,shopwareAccountAdapter:()=>yo,shopwareAdapter:()=>mo,shopwareAdminBase:()=>yi,shopwareBaseUrl:()=>ri,shopwareCustomerCriteria:()=>gi,shopwareLineLabel:()=>fi,shopwareOrderCriteria:()=>hi,shopwareOrderStatus:()=>pi,shopwareProductCriteria:()=>si,shopwareVariantCriteria:()=>ii,signedMinor:()=>ge,storeHost:()=>St,totalInventory:()=>Qi,unitFromTotal:()=>oo,uuidV5:()=>Li,variantRow:()=>Mo,variantSkus:()=>Yi,wooAdminBase:()=>Ni,wooAuthorization:()=>Oi,wooCommerceAccountAdapter:()=>Po,wooCommerceAdapter:()=>xo,wooOrderStatus:()=>Fi,wooPrices:()=>vi,wooSlug:()=>Di});import{slug as Is}from"@stacksjs/strings";class A 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 ry=2000,ny=30000;function q(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 St(e){return new URL(e).host.toLowerCase()}function Ds(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(ny)})}catch(u){let c=u instanceof Error?u.message:String(u);throw new A(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 A(e,`${e} responded ${u}.${o}`,s.status,c?c.slice(0,ry):void 0,Ds(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 A(e,`${e} did not return JSON (${u}).${o}`,s.status)}}var Ts={};F(Ts,{PriceFormatError:()=>I,currencyExponent:()=>J,decimalToMinor:()=>ee,formatCurrency:()=>Ss,formatMinor:()=>ne,minorToDecimal:()=>Pe,minorToInput:()=>Cs,minorToMajor:()=>to,moneyInputError:()=>ro,moneyInputStep:()=>ks,parseMoneyInput:()=>As,rescaleMinor:()=>ot});class I extends Error{value;constructor(e,t){super(`Unreadable price ${JSON.stringify(e)}: ${t}`);this.value=e;this.name="PriceFormatError"}}function J(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 Pe(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 ot(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(Pe(String(e),t),r)}function ne(e,t){let r=J(t),n=Math.round(Number(e)),o=Number.isSafeInteger(n)?`${n<0?"-":""}${Pe(Math.abs(n),r)}`:String(e);return t?`${o} ${t}`:o}function to(e,t){let r=Math.round(Number(e??0));if(!Number.isFinite(r))return 0;let n=Pe(Math.abs(r),J(t));return r<0?-Number(n):Number(n)}function Ss(e,t,r){let n=(t||"USD").toUpperCase(),o=to(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 Cs(e,t){if(e===null||e===void 0||e==="")return"";let r=Math.round(Number(e));if(!Number.isFinite(r))return"";let n=Pe(Math.abs(r),J(t));return r<0?`-${n}`:n}function ks(e){let t=J(e);return t===0?"1":`0.${"1".padStart(t,"0")}`}function ro(e,t,r={}){let n=e===null||e===void 0?"":String(e).trim(),o=J(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 ${Pe(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 As(e,t,r={}){let n=ro(e,t,r);if(n)throw new I(e,n);return ee(e,J(t))}function Es(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 at(e,t=2){if(e===null||e===void 0)return null;if(typeof e==="string")return ee(e,t);return ee(Es(e),t)}var oy={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 Fs(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 oy[r.toLowerCase()]??t})}function U(e){if(typeof e!=="string")return"";return Fs(e).replace(/\s+/g," ").trim()}function R(e){if(typeof e!=="string")return null;let t=e.trim();return t===""?null:t}var Ms=250,Ns=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 sy(e){return(Array.isArray(e)?e:typeof e==="string"?e.split(","):[]).map((r)=>String(r).trim()).filter(Boolean)}function Os(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 $s(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)??Is(o),s=J(t.currency),i=!ay(e.options),u=i?(e.options??[]).map((d)=>R(d.name)??"").filter(Boolean):[],c=(e.variants??[]).map((d)=>{let y=String(d.id),b=Os(d.compare_at_price,s,`variant ${y} compare-at price`,r,n);return{externalId:y,title:R(d.title)??o,sku:R(d.sku),priceMinor:Os(d.price,s,`variant ${y} price`,r,n),compareAtMinor:b?b:null,available:d.available!==!1,inventory:typeof d.inventory_quantity==="number"?Math.max(0,Math.trunc(d.inventory_quantity)):null,optionValues:i?[d.option1,d.option2,d.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 l=[...e.images??[]].filter((d)=>R(d?.src)).sort((d,y)=>(d.position??0)-(y.position??0)).map((d)=>({src:R(d.src),alt:R(d.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:Is(m)}]:[],tags:sy(e.tags),currency:t.currency,images:l,optionNames:u,variants:c,hasOptions:i,url:`${t.storeUrl}/products/${a}`},warnings:n}}async function Bs(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*iy(e,t={}){let r=q(e),n=t.fetch??fetch,o=t.limit,a=o&&o>0?Math.min(Ms,o):Ms,s=[],i=t.currency?.toUpperCase()??null;if(!i){if(i=await Bs(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 l=1;l<=Ns;l++){let m=`${r}/products.json?limit=${a}&page=${l}`,{data:d}=await fe(m,n,"Is this a Shopify storefront, and is it public (no storefront password)?");if(!Array.isArray(d?.products))throw new A(m,`${m} did not return a "products" list. Is this a Shopify storefront?`);let y=d.products;if(y.length===0)return;let b=y.map((g)=>String(g?.id));if(l>1&&b.every((g)=>u.has(g)))throw new A(m,`${m} repeated products from an earlier page; the store is not paginating. Use --limit to import the first page only.`);b.forEach((g)=>u.add(g));let p=[],h=l===1?s:[];for(let g of y){if(o&&c>=o)break;try{let f=$s(g,{storeUrl:r,currency:i});p.push(f.product),h.push(...f.warnings),c++}catch(f){h.push({externalId:g?.id===void 0?void 0:String(g.id),message:`skipped: ${f.message}`})}}if(yield{url:m,products:p,warnings:h},o&&c>=o)return}throw new A(r,`Stopped after ${Ns} pages of ${r}/products.json without reaching the end.`)}var no={name:"shopify",pages:iy};var uy=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;function oe(e){if(typeof e!=="string")return null;let t=e.trim().toLowerCase();return uy.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 sr(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)=>U(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 Le(...e){let t=e.map((r)=>U(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=at(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 je(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 oo(e,t){if(t<=1)return e;return Math.floor((2*e+t)/(2*t))}function ze(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 ao={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 st extends Error{constructor(e){super(e);this.name="MissingCredentialsError"}}function Js(e,t){let r=e[t]?.trim();return r?r:void 0}function cy(e,t){let r=e.trim().toLowerCase(),n=ao[r];if(!n)throw new st(`Customers and orders can be imported from ${Object.keys(ao).join(", ")}; got "${e}".`);let o=n.filter((s)=>!Js(t,s));if(o.length>0){let s=o.length===1?`${o[0]} is not set`:`${o.join(" and ")} are not set`;throw new st(`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)=>Js(t,s));for(let[s,i]of a.entries())if(/\s/.test(i))throw new st(`${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 st(`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 so=5,dy=2,ly=60,Ws=(e)=>new Promise((t)=>setTimeout(t,e));class Ct extends A{constructor(e,t,r){super(e,t,r);this.name="AdminCredentialError"}}function Us(e,t,r=""){let n=Ve(`${e.message}${r}`,t),o=e.body===void 0?void 0:Ve(e.body,t);return new A(Ve(e.url,t),n,e.status,o,e.retryAfter)}async function $e(e,t){let{fetch:r,secrets:n,credentialHelp:o,hint:a="",sleep:s,...i}=t,u=s??Ws;for(let c=0;;c++)try{return await fe(e,r,"",i)}catch(l){if(!(l instanceof A))throw l;if(l.status===429&&c<so){let m=l.retryAfter!==void 0&&l.retryAfter>=0?l.retryAfter:dy;await u(Math.min(m,ly)*1000);continue}if(l.status===401||l.status===403){let m=l.status===401?"The credentials were rejected.":"The credentials were accepted but lack permission to read this.";throw new Ct(Ve(e,n),Ve(`${e} responded ${l.status}. ${m} ${o}`,n),l.status)}if(l.status===429)throw Us(l,n,` Still rate limited after ${so} retries; re-run later, the import resumes safely.`);throw Us(l,n,a?` ${a}`:"")}}var Gs="2026-10",Ls=250,js=4000,my=["id","email","first_name","last_name","phone","state","total_spent","currency","created_at","default_address"],py=["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"],fy=`Check SHOPIFY_ADMIN_TOKEN, and that the app is installed on this store with the read_customers and read_orders scopes. ${he.shopify}`;function Vs(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,J(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 qs(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 wy(e){if(!e)return null;return Le(H(e.first_name,e.last_name)??e.name,e.address1,e.address2,e.city,[e.province_code??e.province,e.zip].map((t)=>U(t)).filter(Boolean).join(" "),e.country_code??e.country)}function Hs(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=J(o),s=(p,h)=>je(p,a,h,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,h)=>p+s(h?.price,"shipping line"),0),c=[];for(let p of e.line_items??[]){let h=p?.id===void 0||p.id===null?"":String(p.id),g=ze(p?.quantity),f=R(p?.name)??H(p?.title,p?.variant_title)??`Line ${h}`;if(!h||g===null){n.push({externalId:r,message:`line "${f}" has no id or quantity; left out`});continue}c.push({externalId:h,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:g,unitPriceMinor:s(p.price,`line "${f}" price`)})}let{status:l,mapped:m}=qs(e),d=[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 "${d}" has no Stacks equivalent; imported as ${l}`});let y=oe(e.customer?.email)??oe(e.email)??oe(e.contact_email),b=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:l,sourceStatus:d,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||b?{externalId:b,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:wy(e.shipping_address),note:R(e.note),placedAt:we(e.processed_at)??we(e.created_at),lines:c},warnings:n}}function Ks(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 Zs(e,t){let r=q(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*zs(e,t,r){if(t.credentials.source!=="shopify")throw TypeError("The Shopify importer needs Shopify credentials (SHOPIFY_ADMIN_TOKEN).");let n=Zs(e,t.adminUrl),o=t.fetch??fetch,a=t.limit,s=a&&a>0?Math.min(Ls,a):Ls,i=`${n}/admin/api/${Gs}/${r.resource}.json`,u=r.fields.join(","),c={fetch:o,headers:{"X-Shopify-Access-Token":t.credentials.accessToken},secrets:Ge(t.credentials),credentialHelp:fy,hint:`Is ${n} the store's Admin API address? For a custom domain, pass --admin-url https://<store>.myshopify.com.`,sleep:t.sleep},l=new Set,m=0,d=`${i}?limit=${s}&fields=${u}${r.firstQuery}`;for(let y=1;y<=js;y++){let{data:b,headers:p}=await $e(d,c),h=b?.[r.resource];if(!Array.isArray(h))throw new A(d,`${d} did not return a "${r.resource}" list. Is this the Shopify Admin API?`);let g=h,f=g.map((E)=>String(E?.id));if(y>1&&f.length>0&&f.every((E)=>l.has(E)))throw new A(d,`${d} repeated ${r.resource} from an earlier page; stopping rather than looping.`);f.forEach((E)=>l.add(E));let x=[],D=[];for(let E of g){if(a&&m>=a)break;let C=r.map(E);if(D.push(...C.warnings),C.record)x.push(C.record),m++}yield{url:d,items:x,warnings:D};let v=Ks(p.get("link"));if(!v||g.length===0||a&&m>=a)return;d=`${i}?limit=${s}&fields=${u}&page_info=${encodeURIComponent(v)}`}throw new A(i,`Stopped after ${js} pages of ${i} without reaching the end.`)}var io={name:"shopify",customers:(e,t)=>zs(e,t,{resource:"customers",fields:my,firstQuery:"",map:Vs}),orders:(e,t)=>zs(e,t,{resource:"orders",fields:py,firstQuery:"&status=any",map:(r)=>Hs(r,{currency:t.currency})})};import{slug as ei}from"@stacksjs/strings";var ir=100,ur=1000,cr="/store-api",uo="Is this a Shopware 6 store with the Store API reachable at /store-api?",co='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 dr(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 qe(e){return dr(e,"name")?.replace(/\s+/g," ")??null}function Qs(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 Ys(e){return e.available!==!1&&e.active!==!1}function Xs(e,t,r,n,o){let a=J(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=at(s,a),u=at(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 yy(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:dr(s,"alt")??dr(s,"title")})}return n}function gy(e){let t=new Set,r=[];for(let n of[e.seoCategory,...e.categories??[]]){let o=qe(n),a=o?ei(o):"";if(!o||!a||t.has(a))continue;t.add(a),r.push({name:o,slug:a})}return r}function hy(e){let t=new Map;for(let r of e)for(let n of r.options??[]){let o=qe(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 by(e,t){return(e.options??[]).find((r)=>(R(r.groupId)??R(r.group?.id)??qe(r.group))===t.key)}function ti(e,t){if(!R(e?.id))throw TypeError("Shopware product has no id");let r=e.id,n=[],o=qe(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 l=hy(a);c=l.map((d)=>d.name);let m=a.map((d)=>{let y=l.map((x)=>by(d,x)),b=y.map((x)=>qe(x)??""),p=R(d.productNumber),h=`variant ${p??d.id}`,g=Xs(d,h,r,t,n);return{variant:{externalId:String(d.id),title:b.filter(Boolean).join(" / ")||qe(d)||p||o,sku:p,priceMinor:g.priceMinor,compareAtMinor:g.compareAtMinor,available:Ys(d),inventory:Qs(d),optionValues:b},sortKey:y.map((x)=>x?.position??0),productNumber:p??""}});m.sort((d,y)=>{for(let b=0;b<d.sortKey.length;b++){let p=(d.sortKey[b]??0)-(y.sortKey[b]??0);if(p!==0)return p}return d.productNumber.localeCompare(y.productNumber)}),u=m.map((d)=>d.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 l=Xs(e,`"${o}"`,r,t,n);u=[{externalId:r,title:o,sku:R(e.productNumber),priceMinor:l.priceMinor,compareAtMinor:l.compareAtMinor,available:Ys(e),inventory:Qs(e),optionValues:[]}]}return{product:{source:"shopware",externalId:r,name:o,handle:ei(o),descriptionHtml:dr(e,"description"),vendor:qe(e.manufacturer),categories:gy(e),tags:(e.tags??[]).map((l)=>R(l?.name)).filter((l)=>l!==null),currency:t.currency,images:yy(e),optionNames:c,variants:u,hasOptions:i,url:`${t.storeUrl}/detail/${r}`},warnings:n}}function ri(e){return q(e).replace(/\/store-api$/i,"")}function ni(){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. ${co}`}function _y(e){if(!e)return null;try{let r=JSON.parse(e)?.errors?.[0];return R(r?.detail)??R(r?.title)}catch{return null}}function xy(e){let t=_y(e.body),r=t?` Shopware said: "${t}"`:"";if(e.status===401||e.status===403||e.status===412)return new A(e.url,`${e.message}${r} The sales channel access key looks wrong: check --access-key or SHOPWARE_ACCESS_KEY. ${co}`,e.status,e.body);return new A(e.url,`${e.message}${r} ${uo}`,e.status,e.body)}async function lo(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 A))throw o;throw xy(o)}}function Ry(e){return e instanceof A&&(e.status===401||e.status===403||e.status===412)}async function oi(e,t,r=fetch){try{let n=await lo(`${e}${cr}/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(Ry(n))throw n;return null}}var ai={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 si(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:ai}}function ii(e,t){return{page:t,limit:ir,"total-count-mode":"exact",filter:[{type:"equalsAny",field:"parentId",value:e}],sort:[{field:"id",order:"ASC"}],associations:{options:{associations:{group:{}}}},includes:ai}}function ui(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 Py(e,t,r,n){let o=new Map;if(r.length===0)return o;let a=`${e}${cr}/product`;for(let s=1;s<=ur;s++){let i=await lo(a,t,n,ii(r,s));if(!Array.isArray(i?.elements))throw new A(a,`${a} did not return a product list for the variants. ${uo}`);let u=i.elements;for(let c of u){let l=R(c?.parentId);if(!l)continue;let m=o.get(l)??[];m.push(c),o.set(l,m)}if(u.length===0||ui(i,s,ir,u.length))return o}throw new A(a,`Stopped after ${ur} pages of variants from ${a} without reaching the end.`)}async function*vy(e,t={}){let r=t.accessKey?.trim();if(!r)throw TypeError(ni());let n=ri(e),o=t.fetch??fetch,a=t.limit,s=a&&a>0?Math.min(ir,a):ir,i=`${n}${cr}/product`,u=[],c=t.currency?.trim().toUpperCase()||null,l=await oi(n,r,o),m=l??c;if(l&&c&&l!==c)u.push({message:`--currency ${c} ignored: this sales channel prices in ${l}, and the Store API does not convert.`});if(!m)u.push({message:`${n}${cr}/context did not report a currency; prices read as 2-decimal amounts. Pass --currency to be sure.`});let d=new Set,y=0;for(let b=1;b<=ur;b++){let p=`${i} (page ${b})`,h;try{h=await lo(i,r,o,si(b,s))}catch(S){if(S instanceof A)throw new A(S.url,S.message.replace(S.url,p),S.status,S.body);throw S}if(!Array.isArray(h?.elements))throw new A(i,`${p} did not return a product list. ${uo}`);let g=h.elements;if(g.length===0)return;let f=g.map((S)=>String(S?.id));if(b>1&&f.every((S)=>d.has(S)))throw new A(i,`${p} repeated products from an earlier page; the store is not paginating. Use --limit to import the first page only.`);f.forEach((S)=>d.add(S));let x=a?g.slice(0,Math.max(0,a-y)):g,D=b===1?u:[],v=x.filter((S)=>typeof S?.childCount==="number"&&S.childCount>0).map((S)=>String(S.id)),E=await Py(n,r,v,o),C=[];for(let S of x)try{let k=ti(S,{storeUrl:n,currency:m,children:E.get(String(S?.id))});C.push(k.product),D.push(...k.warnings),y++}catch(k){D.push({externalId:S?.id===void 0?void 0:String(S.id),message:`skipped: ${k.message}`})}if(yield{url:p,products:C,warnings:D},a&&y>=a)return;if(ui(h,b,s,g.length))return}throw new A(i,`Stopped after ${ur} pages of ${i} without reaching the end.`)}var mo={name:"shopware",pages:vy};var ci=100,di=1e4,Dy=`Check SHOPWARE_CLIENT_ID and SHOPWARE_CLIENT_SECRET, and that the integration's role may read customers and orders. ${he.shopware}`,po="Is this a Shopware 6 store with the Admin API reachable at /api?";function mi(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,J(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 fo(e){return(e?.stateMachineState?.technicalName??"").toLowerCase()}function Sy(e){let t=[...e.transactions??[]].sort((r,n)=>String(r?.createdAt??"").localeCompare(String(n?.createdAt??"")));return fo(t.at(-1))}function pi(e){let t=fo(e),r=fo(e.deliveries?.[0]),n=Sy(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 Cy(e){if(!e||!R(e.street))return null;return Le(H(e.firstName,e.lastName),e.company,e.street,e.additionalAddressLine1,[e.zipcode,e.city].map((t)=>U(t)).filter(Boolean).join(" "),e.country?.iso??e.country?.name)}function ky(e){return e.payload&&typeof e.payload==="object"&&!Array.isArray(e.payload)?e.payload:{}}function fi(e,t){let r=Array.isArray(t)?t.map((n)=>U(n?.option)).filter(Boolean):[];return r.length>0&&!r.every((n)=>e.includes(n))?`${e} - ${r.join(", ")}`:e}function wi(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=J(o),s=(f,x)=>je(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=U(f?.label)||`Line ${x}`,v=(f?.type??"").toLowerCase(),E=null;try{E=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"||E!==null&&E<0){u+=Math.abs(E??0);continue}let C=ze(f?.quantity);if(!x||C===null){n.push({externalId:r,message:`line "${D}" has no id or quantity; left out`});continue}let S=v==="product"&&f.productId===null,k=v==="product"&&!S?R(f.productId)??R(f.referencedId):null,O=ky(f);i.push({externalId:x,productExternalId:R(O.parentId)??k,variantExternalId:k,name:fi(D,O.options),sku:R(O.productNumber),quantity:C,unitPriceMinor:s(f.unitPrice,`line "${D}" unit price`)})}let c=s(e.amountTotal,"total"),l=e.amountNet===null||e.amountNet===void 0?c:s(e.amountNet,"net total"),{status:m,mapped:d,sourceStatus:y}=pi(e);if(!d)n.push({externalId:r,message:`Shopware state "${y}" has no Stacks equivalent; imported as ${m}`});let b=(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,h=oe(e.orderCustomer?.email),g=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-l),discountMinor:u,shippingMinor:s(e.shippingTotal,"shipping"),tipMinor:0,customer:h||g?{externalId:g,email:h,name:H(e.orderCustomer?.firstName,e.orderCustomer?.lastName),phone:ye(b?.phoneNumber)}:null,shippingAddress:Cy(p),note:R(e.customerComment),placedAt:we(e.orderDateTime),lines:i},warnings:n}}function yi(e,t){let r=q(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 gi(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 Ay=["id","firstName","lastName","company","street","additionalAddressLine1","zipcode","city","phoneNumber","country"];function hi(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:Ay,order_delivery:["shippingOrderAddress","stateMachineState"],order_transaction:["stateMachineState","createdAt"],currency:["isoCode"],country:["iso","name"],state_machine_state:["technicalName"]}}}async function wo(e,t,r,n){let o=`${e}/api/oauth/token`,{data:a}=await $e(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 A(o,`${o} returned no access_token. ${po}`);return s}async function*li(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=yi(e,t.adminUrl),{clientId:s,clientSecret:i}=t.credentials,u=Ge(t.credentials),l={fetch:t.fetch??fetch,secrets:u,credentialHelp:Dy,hint:po,sleep:t.sleep},m=await wo(a,s,i,l),d=async(f,x)=>{let D=()=>$e(f,{...l,secrets:[...u,m],headers:{authorization:`Bearer ${m}`},json:x});try{return await D()}catch(v){if(!(v instanceof Ct)||v.status!==401)throw v;return m=await wo(a,s,i,l),await D()}},y=`${a}/api/search/${r}`,b=t.limit,p=b&&b>0?Math.min(ci,b):ci,h=new Set,g=0;for(let f=1;f<=di;f++){let x=`${y} (page ${f})`,{data:D}=await d(y,n(f,p));if(!Array.isArray(D?.data))throw new A(y,`${x} did not return a "data" list. ${po}`);let v=D.data;if(v.length===0)return;let E=v.map((O)=>String(O?.id));if(f>1&&E.every((O)=>h.has(O)))throw new A(y,`${x} repeated ${r}s from an earlier page; the store is not paginating.`);E.forEach((O)=>h.add(O));let C=[],S=[];for(let O of v){if(b&&g>=b)break;let M=o(O);if(S.push(...M.warnings),M.record)C.push(M.record),g++}if(yield{url:x,items:C,warnings:S},b&&g>=b)return;let k=typeof D.total==="number"?D.total:Number.NaN;if(v.length<p||Number.isInteger(k)&&f*p>=k)return}throw new A(y,`Stopped after ${di} pages of ${y} without reaching the end.`)}var yo={name:"shopware",customers:(e,t)=>li(e,t,"customer",gi,(r)=>mi(r,{currency:t.currency})),orders:(e,t)=>li(e,t,"order",hi,(r)=>wi(r,{currency:t.currency}))};import{slug as Pi}from"@stacksjs/strings";var ho=100,bo=1000,_o="/wp-json/wc/store/v1/products",bi="Is WooCommerce 6+ installed with the Store API reachable at /wp-json?";function vi(e){let t=R(e?.currency_code)?.toUpperCase()??null,r=Number(e?.currency_minor_unit),n=Number.isInteger(r)&&r>=0?r:2,o=J(t),a=ot(e?.price,n,o),s=ot(e?.regular_price,n,o);return{currency:t,priceMinor:a,compareAtMinor:s!==null&&a!==null&&s>a?s:null}}function _i(e,t,r){try{return vi(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 go(e){return(e??[]).map((t)=>{let r=U(t?.name);return{name:r,slug:R(t?.slug)??Pi(r)}}).filter((t)=>t.name&&t.slug)}function Di(e){let t=R(e);if(!t||!t.includes("%"))return t;try{return decodeURIComponent(t)}catch{return t}}function xi(e){return typeof e.low_stock_remaining==="number"?Math.max(0,Math.trunc(e.low_stock_remaining)):null}function Ri(e){return e.is_in_stock!==!1&&e.is_purchasable!==!1}function Si(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=U(e.name);if(!o)throw TypeError(`WooCommerce product ${r} has no name`);let a=_i(e,r,n),s=e.type==="variable"&&(e.variations?.length??0)>0,i=s?(e.attributes??[]).filter((d)=>d.has_variations!==!1):[],u=i.map((d)=>U(d.name)).filter(Boolean),c,l=a.currency;if(s)c=(e.variations??[]).map((d)=>{let y=String(d.id),b=i.map((g)=>{let f=U(g.name).toLowerCase(),x=(g.taxonomy??"").toLowerCase(),D=(d.attributes??[]).find((C)=>{let S=U(C.name).toLowerCase();return S===f||x!==""&&S===x}),v=R(D?.value);if(!v)return"Any";let E=(g.terms??[]).find((C)=>C.slug===v);return E?U(E.name):U(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:b.join(" / ")||o,sku:null,priceMinor:null,compareAtMinor:null,available:!1,inventory:null,optionValues:b};let h=_i(p,y,n);return l??=h.currency,{externalId:y,title:b.join(" / ")||U(p.name)||o,sku:R(p.sku),priceMinor:h.priceMinor,compareAtMinor:h.compareAtMinor,available:Ri(p),inventory:xi(p),optionValues:b}});else c=[{externalId:r,title:o,sku:R(e.sku),priceMinor:a.priceMinor,compareAtMinor:a.compareAtMinor,available:Ri(e),inventory:xi(e),optionValues:[]}];let m=go(e.brands)[0];return{product:{source:"woocommerce",externalId:r,name:o,handle:Di(e.slug)??Pi(o),descriptionHtml:R(e.description)??R(e.short_description),vendor:m?m.name:null,categories:go(e.categories),tags:go(e.tags).map((d)=>d.name),currency:l,images:(e.images??[]).filter((d)=>R(d?.src)).map((d)=>({src:R(d.src),alt:R(d.alt)})),optionNames:s?u:[],variants:c,hasOptions:s,url:R(e.permalink)},warnings:n}}async function Ci(e,t){let{data:r,headers:n}=await fe(e,t,bi);if(!Array.isArray(r))throw new A(e,`${e} did not return a product list. ${bi}`);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 Ty(e,t,r){let n=new Map;if(t.length===0)return n;for(let o=1;o<=bo;o++){let a=`${e}${_o}?type=variation&parent=${t.join(",")}&per_page=${ho}&page=${o}`,s=await Ci(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*Ey(e,t={}){let r=q(e),n=t.fetch??fetch,o=t.limit,a=o&&o>0?Math.min(ho,o):ho,s=new Set,i=0;for(let u=1;u<=bo;u++){let c=`${r}${_o}?per_page=${a}&page=${u}`,l=await Ci(c,n);if(l.items.length===0)return;let m=l.items.map((g)=>String(g?.id));if(u>1&&m.every((g)=>s.has(g)))throw new A(c,`${c} repeated products from an earlier page; the store is not paginating. Use --limit to import the first page only.`);m.forEach((g)=>s.add(g));let d=o?l.items.slice(0,Math.max(0,o-i)):l.items,y=[],b=d.filter((g)=>g?.type==="variable"&&(g.variations?.length??0)>0).map((g)=>String(g.id)),p=new Map;try{p=await Ty(r,b,n)}catch(g){if(!(g instanceof A))throw g;y.push({message:`variations could not be fetched (${g.message}); variable products are imported without variant prices`})}let h=[];for(let g of d)try{let f=Si(g,{variations:p});h.push(f.product),y.push(...f.warnings),i++}catch(f){y.push({externalId:g?.id===void 0?void 0:String(g.id),message:`skipped: ${f.message}`})}if(yield{url:c,products:h,warnings:y},o&&i>=o)return;if(l.totalPages!==null&&u>=l.totalPages)return}throw new A(r,`Stopped after ${bo} pages of ${r}${_o} without reaching the end.`)}var xo={name:"woocommerce",pages:Ey};var ki=100,Ai=1e4,Ro="/wp-json/wc/v3",Fy=`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}`,Ti="Is WooCommerce installed with the REST API reachable at /wp-json/wc/v3, and pretty permalinks enabled?",Iy={pending:"PENDING","on-hold":"PENDING",processing:"PROCESSING",completed:"DELIVERED",cancelled:"CANCELLED",failed:"CANCELLED",refunded:"REFUNDED"},My=new Set(["checkout-draft","auto-draft","trash"]);function Fi(e){let t=Iy[(e??"").toLowerCase()];return t?{status:t,mapped:!0}:{status:"PENDING",mapped:!1}}function Ny(e){let t=R(e);if(!t)return null;try{return new URL(t).protocol==="https:"?t:null}catch{return null}}function Ii(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:Ny(e.avatar_url),createdAt:sr(e.date_created_gmt)},warnings:r}}function Oy(e){if(!e||!R(e.address_1))return null;return Le(H(e.first_name,e.last_name),e.company,e.address_1,e.address_2,e.city,[e.state,e.postcode].map((t)=>U(t)).filter(Boolean).join(" "),e.country)}function Mi(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(My.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=J(a),i=(p,h)=>je(p,s,h,r,n),u=[];for(let p of e.line_items??[]){let h=p?.id===void 0||p.id===null?"":String(p.id),g=ze(p?.quantity),f=U(p?.name)||`Line ${h}`;if(!h||g===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:h,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:g,unitPriceMinor:oo(x,g)})}let c=0;for(let p of e.fee_lines??[]){let h=U(p?.name)||"Fee",g=null;try{g=ge(p?.total,s)}catch(f){if(!(f instanceof I))throw f;n.push({externalId:r,message:`fee "${h}": ${f.message}; left out`})}if(g===null||g===0)continue;if(g<0){c+=-g;continue}u.push({externalId:`fee-${p?.id??u.length}`,productExternalId:null,variantExternalId:null,name:h,sku:null,quantity:1,unitPriceMinor:g})}let{status:l,mapped:m}=Fi(o);if(!m)n.push({externalId:r,message:`WooCommerce status "${o||"none"}" has no Stacks equivalent; imported as ${l}`});let d=e.customer_id?String(e.customer_id):null,y=oe(e.billing?.email),b=0;for(let p of e.refunds??[])try{b+=Math.abs(ge(p?.total,s)??0)}catch(h){if(!(h instanceof I))throw h;n.push({externalId:r,message:`refund ${p?.id??""}: ${h.message}; not counted`})}return{record:{source:"woocommerce",externalId:r,number:R(e.number)?`#${R(e.number)}`:null,currency:a,status:l,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||d?{externalId:d,email:y,name:H(e.billing?.first_name,e.billing?.last_name),phone:ye(e.billing?.phone)}:null,shippingAddress:Oy(e.shipping),note:R(e.customer_note),placedAt:sr(e.date_created_gmt),lines:u,refundedMinor:b},warnings:n}}function Ni(e,t){let r=q(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 Oi(e,t){return`Basic ${Buffer.from(`${e}:${t}`,"utf8").toString("base64")}`}async function*Ei(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=Ni(e,t.adminUrl),{consumerKey:a,consumerSecret:s}=t.credentials,i=Oi(a,s),u={fetch:t.fetch??fetch,headers:{authorization:i},secrets:[...Ge(t.credentials),i.slice(6)],credentialHelp:Fy,hint:Ti,sleep:t.sleep},c=t.limit,l=c&&c>0?Math.min(ki,c):ki,m=new Set,d=0;for(let y=1;y<=Ai;y++){let b=`${o}${Ro}/${r}?per_page=${l}&page=${y}&orderby=id&order=asc`,{data:p,headers:h}=await $e(b,u);if(!Array.isArray(p))throw new A(b,`${b} did not return a list of ${r}. ${Ti}`);let g=p;if(g.length===0)return;let f=g.map((C)=>String(C?.id));if(y>1&&f.every((C)=>m.has(C)))throw new A(b,`${b} repeated ${r} from an earlier page; the store is not paginating.`);f.forEach((C)=>m.add(C));let x=[],D=[];for(let C of g){if(c&&d>=c)break;let S=n(C);if(D.push(...S.warnings),S.record)x.push(S.record),d++}yield{url:b,items:x,warnings:D};let v=h.get("x-wp-totalpages")?.trim(),E=v?Number(v):Number.NaN;if(c&&d>=c)return;if(Number.isInteger(E)&&y>=E)return}throw new A(`${o}${Ro}/${r}`,`Stopped after ${Ai} pages of ${o}${Ro}/${r} without reaching the end.`)}var Po={name:"woocommerce",customers:(e,t)=>Ei(e,t,"customers",Ii),orders:(e,t)=>Ei(e,t,"orders",(r)=>Mi(r,{currency:t.currency}))};import{db as So,sqlHelpers as ji}from"@stacksjs/database/runtime";import{env as zi}from"@stacksjs/env";import{formatDate as ko}from"@stacksjs/orm";import{db as $y}from"@stacksjs/database/runtime";import{HttpError as Ji}from"@stacksjs/error-handling";import{isUniqueViolation as By}from"@stacksjs/orm";function ve(e){if(typeof e==="bigint")return vo(e);if(typeof e==="number")return vo(e);if(!e||typeof e!=="object")return;if(Array.isArray(e)){for(let r of e){let n=ve(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=vo(n);if(o!==void 0)return o}return}function vo(e){let t=typeof e==="bigint"?Number(e):Number(e);if(!Number.isSafeInteger(t)||t<=0)return;return t}import{db as $i}from"@stacksjs/database/runtime";async function lr(e){let t=await $i.selectFrom("customers").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function Bi(){return P(await $i.selectFrom("customers").selectAll().execute())}var Do="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=400&fit=crop&q=60";async function Ui(e){try{let t={...e,avatar:e.avatar??Do},r=await $y.insertInto("customers").values(t).executeTakeFirst();if(!r)throw Error("Failed to create customer");let n=ve(r);if(n===void 0)throw Error("Failed to create customer: the database reported no insert id");return await lr(n)}catch(t){if(t instanceof Ji)throw t;if(By(t))throw new Ji(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 Jy}from"crypto";var Wi="5d0c8a3e-6f1b-4c2a-9e47-b18f3d2a6c90";function Li(e,t=Wi){let r=t.replace(/-/g,"");if(!/^[0-9a-f]{32}$/i.test(r))throw TypeError(`Invalid namespace UUID "${t}"`);let n=Jy("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 Li(`${e}:${t.toLowerCase()}:${r}:${n}`)}var Uy=255;function He(e,t,r,n){return te(e,t,"customer",r??`email:${n}`)}function Ao(e,t,r,n,o){if(!n)return null;if(r!==null&&r!==He(e,t,null,o))return null;return He(e,t,n,o)}function kt(e){return e?ko(new Date(e)):null}function mr(e,t,r,n){let o={name:e.name.slice(0,Uy),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=kt(e.lastOrderAt),o.status=e.active===!1?"Inactive":"Active",o.avatar=e.avatarUrl??Do,o.created_at=kt(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=kt(e.lastOrderAt);if(e.active!==null)o.status=e.active?"Active":"Inactive";return o}function Co(e){return e.sku?`${e.name} (SKU ${e.sku})`:e.name}function Gi(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:kt(e.placedAt)??n,updated_at:n};if(r!==null)o.customer_id=r;return o}class To{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 Vi(e){let t=q(e.storeUrl);return{storeUrl:t,host:St(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 Wy(e){let{storeUrl:t,host:r,clock:n,fetchOptions:o}=Vi(e),{adapter:a,repository:s}=e,i=new To,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 l(m,d){let y=ko(n()),b=He(m.source,r,m.externalId,m.email),p=i.find(b,m.email);if(!p){let f=await d.createCustomer(mr(m,b,y,"create"));return i.remember(f,b,m.email),{action:"create",externalId:m.externalId,email:m.email,name:m.name,matchedBy:null}}let h=mr(m,b,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 h.email=m.email;let g=p.matchedBy==="email"?Ao(m.source,r,i.uuidOf(p.id),m.externalId,m.email):null;if(g)h.uuid=g;return await d.updateCustomer(p.id,h),i.remember(p.id,g,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 d=[];for(let y of m.items){if(u.has(y.email)){c.counts.merged++;continue}u.add(y.email),d.push(y)}await i.load(s,d.map((y)=>({uuid:He(y.source,r,y.externalId,y.email),email:y.email})));for(let y of d){let b=await l(y,s);c.counts.customers[b.action==="create"?"created":"updated"]++,c.customers.push(b),e.onCustomer?.(b)}}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 Ly(e){let{storeUrl:t,host:r,clock:n,fetchOptions:o}=Vi(e),{adapter:a,repository:s}=e,i=new To,u=new Set,c=new Set,l=new Set,m=[],d={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),b=(f,x)=>te(f.source,r,"variant",x);function p(f){let x=f.customer;if(x?.externalId)return He(f.source,r,x.externalId,x.email??"");return x?.email?He(f.source,r,null,x.email):null}async function h(f,x,D){let v=f.customer;if(!v)return null;let E=p(f),C=i.find(E,v.email);if(C){let k=C.matchedBy==="email"&&v.email?Ao(f.source,r,i.uuidOf(C.id),v.externalId,v.email):null;if(k)await x.updateCustomer(C.id,{uuid:k,updated_at:D}),i.remember(C.id,k,v.email);return C.id}if(!v.email)return d.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(mr({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},E,D,"create"));return i.remember(S,E,v.email),d.counts.customers.created++,S}async function g(f,x,D){let v=ko(n()),E=await h(f,x,v),C=Gi(f,r,E,v),S=D.orders.get(C.uuid),k;if(S===void 0)k=await x.createOrder(C);else{k=S;let V={...C};delete V.uuid,await x.updateOrder(k,V)}let O=0,M=0,re=f.lines.map((V)=>{let ht=(V.productExternalId?D.products.get(y(f,V.productExternalId)):void 0)??(V.variantExternalId?D.variants.get(b(f,V.variantExternalId)):void 0)??null;if(ht===null){if(!V.productExternalId&&!V.variantExternalId)M++;else if(O++,l.size<5)l.add(Co(V))}return{order_id:k,product_id:ht,quantity:V.quantity,price:V.unitPriceMinor,special_instructions:Co(V),created_at:v,updated_at:v}});return await x.replaceOrderItems(k,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:E}}for await(let f of a.orders(t,o)){d.pages.push(f.url),d.warnings.push(...f.warnings);let x=f.items.filter((k)=>{if(!u.has(k.externalId))return u.add(k.externalId),!0;return d.counts.duplicates++,!1}),D=x.map((k)=>te(k.source,r,"order",k.externalId)),v=[...new Set(x.flatMap((k)=>k.lines.flatMap((O)=>O.productExternalId?[y(k,O.productExternalId)]:[])))],E=[...new Set(x.flatMap((k)=>k.lines.flatMap((O)=>O.variantExternalId?[b(k,O.variantExternalId)]:[])))],C={orders:D.length>0?await s.findOrders(D):new Map,products:v.length>0?await s.findProducts(v):new Map,variants:E.length>0?await s.findVariantProducts(E):new Map};await i.load(s,x.map((k)=>({uuid:p(k),email:k.customer?.email??null})));let S=new Map;for(let k of x){c.add(k.currency);let{customerId:O,...M}=s.transaction?await s.transaction((V)=>g(k,V,C)):await g(k,s,C);if(d.counts.orders[M.action==="create"?"created":"updated"]++,d.counts.lines.linked+=M.lines-M.unlinkedLines-M.productlessLines,d.counts.lines.unlinked+=M.unlinkedLines,d.counts.lines.productless+=M.productlessLines,M.refundedMinor>0&&M.status!=="REFUNDED"){if(d.counts.partlyRefunded++,m.length<3)m.push(`${M.number??M.externalId}: ${ne(M.refundedMinor,M.currency)} of ${ne(M.totalMinor,M.currency)}`)}let re=kt(k.placedAt);if(O!==null&&re&&re>(S.get(O)??""))S.set(O,re);d.orders.push(M),e.onOrder?.(M)}if(s.advanceLastOrder)for(let[k,O]of S)await s.advanceLastOrder(k,O)}if(d.currencies=[...c].sort(),d.counts.lines.unlinked>0){let f=[...l].map((D)=>`"${D}"`).join(", "),x=d.counts.lines.unlinked===1;d.warnings.push({message:`${d.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(d.counts.partlyRefunded>0){let f=d.counts.partlyRefunded===1;d.warnings.push({message:`${d.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 d}function qi(e=So){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=ji(zi.DB_CONNECTION||"sqlite").param,u=await r(a.map((c)=>c.trim().toLowerCase()),async(c)=>{let l=c.map((d,y)=>i(y+1)).join(", "),m=await e.unsafe(`SELECT id, uuid, email FROM customers WHERE LOWER(email) IN (${l})`,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=ji(zi.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===So)n.transaction=(o)=>So.transaction((a)=>o(qi(a)));return n}function jy(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,l)=>Math.max(c,Number(l.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 zy(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:Hi}=globalThis.Bun;import{db as Eo}from"@stacksjs/database/runtime";import{formatDate as Gy}from"@stacksjs/orm";var Zi="Unknown",Vy=1,qy=50,Fo=100;function No(e){let t=e.map((r)=>r.priceMinor).filter((r)=>r!==null);return t.length>0?Math.min(...t):null}function Qi(e){if(e.length===0||e.some((t)=>t.inventory===null))return null;return e.reduce((t,r)=>t+(r.inventory??0),0)}function Yi(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>Fo)t.set(o.externalId,null),r.push({externalId:e.externalId,message:`"${e.name}" variant "${o.title}" has a SKU longer than ${Fo} 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 Io(e,t,r,n,o){let a=Qi(e.variants),s={uuid:te(e.source,t,"product",e.externalId),name:e.name,description:e.descriptionHtml,price:No(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=Vy,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 Mo(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,qy),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 Ki(e){let t={...e};return delete t.uuid,t}async function Hy(e){let t=q(e.storeUrl),r=St(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,l=new Set;async function m(p,h,g){let f=p.categories[0];if(!f)return null;let x=i.get(f.slug);if(x!==void 0)return x;let D=await h.findCategory(f.slug,f.name);if(D===void 0)D=await h.createCategory({uuid:Hi(),name:f.name,slug:f.slug,description:null,image_url:null,is_active:!0,parent_category_id:null,display_order:i.size,created_at:g,updated_at:g}),s.counts.categories.created++;return i.set(f.slug,D),D}async function d(p,h,g){if(!p.vendor)return null;let f=u.get(p.vendor);if(f!==void 0)return f;let x=await h.findManufacturer(p.vendor);if(x===void 0)x=await h.createManufacturer({uuid:Hi(),manufacturer:p.vendor,description:null,country:Zi,featured:!1,created_at:g,updated_at:g}),s.counts.manufacturers.created++;return u.set(p.vendor,x),x}async function y(p){let h=p.map((f)=>te(f.source,r,"product",f.externalId)),g=p.filter((f)=>f.hasOptions).flatMap((f)=>f.variants.map((x)=>te(f.source,r,"variant",x.externalId)));return{products:h.length>0?await a.findProducts(h):new Map,variants:g.length>0?await a.findVariants(g):new Map}}async function b(p,h,g){let f=Gy(n()),x={categoryId:await m(p,h,f),manufacturerId:await d(p,h,f)},D=te(p.source,r,"product",p.externalId),v=g.products.get(D),E=v===void 0?"create":"update",C;if(v===void 0)C=await h.createProduct(Io(p,r,x,f,"create"));else C=v,await h.updateProduct(C,Ki(Io(p,r,x,f,"update")));let S={create:0,update:0};if(p.hasOptions){let{skus:k,warnings:O}=Yi(p);s.warnings.push(...O);let M=[...k.values()].filter((re)=>re!==null);if(v!==void 0&&M.length>0)await h.releaseVariantSkus(C,M);for(let re of p.variants){let V=k.get(re.externalId)??null,ht=g.variants.get(te(p.source,r,"variant",re.externalId));if(ht===void 0)await h.createVariant(Mo(p,re,r,C,f,"create",V)),S.create++;else await h.updateVariant(ht,Ki(Mo(p,re,r,C,f,"update",V))),S.update++}}return{action:E,externalId:p.externalId,name:p.name,handle:p.handle,priceMinor:No(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 h=[];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),h.push(f)}let g=await y(h);for(let f of h){if(f.currency)l.add(f.currency);let x=a.transaction?await a.transaction((D)=>b(f,D,g)):await b(f,a,g);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=[...l].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 Xi(e=Eo){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 l of c)i.set(l.uuid,Number(l.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===Eo)o.transaction=(a)=>Eo.transaction((s)=>a(Xi(s)));return o}function Ky(){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 Zy(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 eu={shopify:no,woocommerce:xo,shopware:mo};function Qy(e){return eu[e.trim().toLowerCase()]}var tu={shopify:io,woocommerce:Po,shopware:yo};function Yy(e){return tu[e.trim().toLowerCase()]}var $o={};F($o,{deleteCoupon:()=>nu,deleteCoupons:()=>ou,deleteExpiredCoupons:()=>au,fetchActive:()=>du,fetchAll:()=>uu,fetchByCode:()=>cu,fetchById:()=>Ke,fetchConversionRate:()=>gu,fetchCouponCounts:()=>mu,fetchCouponCountsByType:()=>pu,fetchRedemptionStats:()=>fu,fetchRedemptionTrend:()=>yu,fetchStats:()=>lu,fetchTopRedeemedCoupons:()=>wu,getActiveCouponsMoMChange:()=>hu,redeem:()=>Su,store:()=>xu,update:()=>Du});import{db as Oo}from"@stacksjs/database/runtime";import{formatDate as Xy}from"@stacksjs/orm";async function nu(e){let t=await Oo.deleteFrom("coupons").where("id","=",e).executeTakeFirst();return _(t)>0}async function ou(e){if(!e.length)return 0;return await Oo.deleteFrom("coupons").where("id","in",e).execute()||0}async function au(){let e=Xy(new Date),t=await Oo.deleteFrom("coupons").where("end_date","<",e).executeTakeFirst();return _(t)}import{db as T}from"@stacksjs/database/runtime";import{extractDate as su,formatDate as iu}from"@stacksjs/orm";import{camelCase as eg}from"@stacksjs/strings";function fr(e){let t=Object.fromEntries(Object.entries(e).map(([r,n])=>[eg(r),n]));if(t.endDate)t.endDate=su(new Date(t.endDate));if(t.startDate)t.startDate=su(new Date(t.startDate));if(t.isActive!==void 0)t.isActive=Boolean(t.isActive);return t}async function uu(){let e=await T.selectFrom("coupons").selectAll().execute();return P(e).map(fr)}async function Ke(e){let t=await T.selectFrom("coupons").where("id","=",e).selectAll().executeTakeFirst();if(t)return fr(w(t));return}async function cu(e){let t=await T.selectFrom("coupons").where("code","=",e).selectAll().executeTakeFirst();if(t)return fr(w(t));return}async function du(){let e=iu(new Date),t=await T.selectFrom("coupons").where("is_active","=",!0).where("start_date","<=",e).where("end_date",">=",e).selectAll().execute();return P(t).map(fr)}async function lu(){let e=await T.selectFrom("coupons").select(T.fn.count("id").as("count")).executeTakeFirst(),t=iu(new Date),r=await T.selectFrom("coupons").where("is_active","=",!0).where("start_date","<=",t).where("end_date",">=",t).select(T.fn.count("id").as("count")).executeTakeFirst(),n=await T.selectFrom("coupons").select(["discount_type",T.fn.count("id").as("count")]).groupBy("discount_type").execute(),o=await T.selectFrom("coupons").select(["id","code","discount_type","discount_value","usage_count"]).orderBy("usage_count","desc").limit(5).execute(),a=await T.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 mu(){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 pr(null,null,e),a=await pr(t,null,e),s=await pr(r,null,e),i=await pr(n,null,e);return{week:a,month:s,year:i,all_time:o}}async function pr(e,t,r){let n=T.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(T.fn.count("id").as("count")).executeTakeFirst(),a=T.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(T.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 pu(){let e=new Date,t=await T.selectFrom("coupons").select("discount_type").distinct().execute(),r={};for(let{discount_type:n}of t){let o=await T.selectFrom("coupons").where("discount_type","=",n).select(T.fn.count("id").as("count")).executeTakeFirst(),a=await T.selectFrom("coupons").where("discount_type","=",n).where("is_active","=",!0).where("start_date","<=",e).where("end_date",">=",e).select(T.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 fu(){let e=await T.selectFrom("coupons").select(T.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 T.selectFrom("coupons").where("updated_at",">=",r.toISOString()).select(T.fn.sum("usage_count").as("total")).executeTakeFirst(),s=await T.selectFrom("coupons").where("updated_at",">=",n.toISOString()).select(T.fn.sum("usage_count").as("total")).executeTakeFirst(),i=await T.selectFrom("coupons").where("updated_at",">=",o.toISOString()).select(T.fn.sum("usage_count").as("total")).executeTakeFirst(),u=await T.selectFrom("coupons").select(["discount_type",T.fn.sum("usage_count").as("total")]).groupBy("discount_type").execute(),c={};return u.forEach((l)=>{c[l.discount_type]=Number(l.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 wu(e=5){return await T.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 yu(e=30){let t=new Date().toISOString(),r=new Date;r.setDate(r.getDate()-e);let n=await T.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 gu(){let e=new Date,t=await T.selectFrom("coupons").where("is_active","=",!0).where("start_date","<=",e).where("end_date",">=",e).select(T.fn.count("id").as("count")).executeTakeFirst(),r=await T.selectFrom("coupons").where("usage_count",">",0).select(T.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 hu(){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 T.selectFrom("coupons").select(T.fn.count("id").as("count")).where("is_active","=",!0).where("start_date","<=",e).where("end_date",">=",t).executeTakeFirst(),a=await T.selectFrom("coupons").select(T.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:tg}=globalThis.Bun;import{db as bu}from"@stacksjs/database/runtime";import{HttpError as _u}from"@stacksjs/error-handling";import{isUniqueViolation as rg}from"@stacksjs/orm";async function xu(e){try{let t=tg();await bu.insertInto("coupons").values({...e,uuid:t}).executeTakeFirst();let r=await bu.selectFrom("coupons").where("uuid","=",t).selectAll().executeTakeFirst();return w(r,!0)}catch(t){if(t instanceof _u)throw t;if(rg(t))throw new _u(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 Pu,mutationCount as ng,sqlHelpers as og}from"@stacksjs/database/runtime";import{env as ag}from"@stacksjs/env";import{HttpError as Ru}from"@stacksjs/error-handling";import{formatDate as vu,isUniqueViolation as sg}from"@stacksjs/orm";async function Du(e,t){if(!await Ke(e))return;try{return await Pu.updateTable("coupons").set({...t,updated_at:vu(new Date)}).where("id","=",e).execute(),await Ke(e)}catch(n){if(n instanceof Ru)throw n;if(sg(n))throw new Ru(409,"A coupon with this code already exists");if(n instanceof Error)throw Error(`Failed to update coupon: ${n.message}`);throw n}}async function Su(e){let t=og(ag.DB_CONNECTION||"sqlite"),r=t.param,n=vu(new Date),o=await Pu.unsafe(`UPDATE coupons
3
3
  SET usage_count = COALESCE(usage_count, 0) + 1, updated_at = ${r(1)}
4
4
  WHERE id = ${r(2)}
5
5
  AND (usage_limit IS NULL OR COALESCE(usage_count, 0) < usage_limit)
6
6
  AND is_active = ${t.boolTrue}
7
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(ng(o)>0){let u=await He(e);if(u)return{ok:!0,coupon:u};return{ok:!1,reason:"not-found"}}let a=await He(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"}}var Bo={};F(Bo,{bulkDestroy:()=>Au,destroy:()=>ku,fetchAll:()=>Bi,fetchById:()=>lr,store:()=>Ui,update:()=>Eu});import{db as Cu}from"@stacksjs/database/runtime";async function ku(e){try{let t=await Cu.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 Au(e){if(!e.length)return 0;try{let t=await Cu.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 ig}from"@stacksjs/database/runtime";import{HttpError as Tu}from"@stacksjs/error-handling";import{formatDate as ug,isUniqueViolation as cg}from"@stacksjs/orm";async function Eu(e,t){try{if(!e)throw Error("Customer ID is required for update");let r=await ig.updateTable("customers").set({...t,updated_at:ug(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!r)return;return w(r)}catch(r){if(r instanceof Tu)throw r;if(cg(r))throw new Tu(409,"A customer with this email already exists");if(r instanceof Error)throw Error(`Failed to update customer: ${r.message}`);throw r}}var jo={};F(jo,{bulkDestroy:()=>Mu,bulkStore:()=>qu,calculateErrorRate:()=>Bu,calculatePrinterHealth:()=>Uu,countAll:()=>Nu,countPrintsByDeviceId:()=>$u,countTotalPrints:()=>Ou,destroy:()=>Iu,downloadPrintDevices:()=>ju,exportPrintDevices:()=>yr,fetchAll:()=>wr,fetchById:()=>De,fetchErrorsByDeviceId:()=>Ju,getPrinterStatusCounts:()=>Wu,store:()=>Vu,storePrintDevicesExport:()=>zu,update:()=>Hu,updatePrintCount:()=>Zu,updateStatus:()=>Ku});import{db as Fu}from"@stacksjs/database/runtime";async function Iu(e){try{let t=await Fu.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 Mu(e){if(!e.length)return 0;try{let t=await Fu.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 dg}from"ts-spreadsheets";import{db as Q}from"@stacksjs/database/runtime";async function De(e){let t=await Q.selectFrom("print_devices").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function wr(){return P(await Q.selectFrom("print_devices").selectAll().execute())}async function Nu(){let e=await Q.selectFrom("print_devices").select(Q.fn.count("id").as("count")).executeTakeFirst();return Number(e?.count||0)}async function Ou(){let e=await Q.selectFrom("print_devices").select(Q.fn.sum("print_count").as("total")).executeTakeFirst();return Number(e?.total||0)}async function $u(e){let t=await Q.selectFrom("print_devices").select("print_count").where("id","=",e).executeTakeFirst();return Number(t?.print_count??0)}async function Bu(){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 Ju(e){let t=await Q.selectFrom("receipts").where("print_device_id","=",e).where("status","=","failed").selectAll().execute();return P(t)}async function Uu(){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 Wu(){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 Jo(e,t,r=t){let n=e;return n[String(t)]??n[r]}function lg(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 Lu(e,t,r=t){let n=Jo(e,t,r);if(typeof n==="number")return n;let o=Number(n);return Number.isFinite(o)?o:0}function At(e,t,r=t){let n=Jo(e,t,r);return n==null?"":String(n)}async function yr(e="csv"){let t=await wr(),r=mg(t);return dg(r,{type:e})}function mg(e){let t=["Device ID","Name","MAC Address","Location","Terminal","Status","Last Ping","Print Count"],r=e.map((n)=>[Lu(n,"id"),At(n,"name"),At(n,"macAddress","mac_address"),At(n,"location"),At(n,"terminal"),At(n,"status"),lg(Jo(n,"lastPing","last_ping")).toLocaleString(),Lu(n,"printCount","print_count")]);return{headings:t,data:r}}async function ju(e="csv",t){let r=await yr(e),n=`print_devices_export_${new Date().toISOString().split("T")[0]}.${e}`;return r.download(t||n)}async function zu(e="csv",t){let r=await yr(e),n=`print_devices_export_${new Date().toISOString().split("T")[0]}.${e}`;r.store(t||n)}var{randomUUIDv7:Gu}=globalThis.Bun;import{db as Uo}from"@stacksjs/database/runtime";async function Vu(e){try{let t=Gu(),r={last_ping:0,print_count:0,...e,uuid:t};await Uo.insertInto("print_devices").values(r).executeTakeFirst();let n=await Uo.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 qu(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:Gu()};await Uo.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 Wo}from"@stacksjs/database/runtime";import{formatDate as Lo}from"@stacksjs/orm";async function Hu(e,t){if(!await De(e))return;try{return await Wo.updateTable("print_devices").set({...t,updated_at:Lo(new Date)}).where("id","=",e).execute(),await De(e)}catch(n){if(n instanceof Error)throw TypeError(`Failed to update print device: ${n.message}`);throw n}}async function Ku(e,t){if(!await De(e))throw Error(`Print device with ID ${e} not found`);try{return await Wo.updateTable("print_devices").set({status:t,updated_at:Lo(new Date)}).where("id","=",e).execute(),await De(e)}catch(n){if(n instanceof Error)throw TypeError(`Failed to update print device status: ${n.message}`);throw n}}async function Zu(e,t){if(!await De(e))throw Error(`Print device with ID ${e} not found`);try{return await Wo.updateTable("print_devices").set({print_count:t,updated_at:Lo(new Date)}).where("id","=",e).execute(),await De(e)}catch(n){if(n instanceof Error)throw TypeError(`Failed to update print count: ${n.message}`);throw n}}var Vo={};F(Vo,{bulkDestroy:()=>Yu,bulkUpdateStatus:()=>sc,destroy:()=>Qu,destroyGroup:()=>Xu,fetchAll:()=>hr,fetchByGroup:()=>rc,fetchById:()=>ec,fetchGrouped:()=>tc,fetchStats:()=>nc,fetchTimeline:()=>oc,ignoreGroup:()=>uc,resolveGroup:()=>ic,unresolveGroup:()=>cc,update:()=>ac});import{db as zo}from"@stacksjs/database/runtime";import{log as Go}from"@stacksjs/logging";async function Qu(e){try{return await zo.deleteFrom("errors").where("id","=",e).execute(),!0}catch(t){return Go.error("[commerce/errors] destroy failed",{id:e,error:t}),!1}}async function Yu(e){try{return await zo.deleteFrom("errors").where("id","in",e).execute(),!0}catch(t){return Go.error("[commerce/errors] bulkDestroy failed",{count:e.length,error:t}),!1}}async function Xu(e,t){try{return await zo.deleteFrom("errors").where("type","=",e).where("message","=",t).execute(),!0}catch(r){return Go.error("[commerce/errors] destroyGroup failed",{type:e,message:t,error:r}),!1}}import{db as gr}from"@stacksjs/database/runtime";async function ec(e){return await gr.selectFrom("errors").where("id","=",e).selectAll().executeTakeFirst()}async function hr(){return await gr.selectFrom("errors").selectAll().orderBy("created_at","desc").execute()}async function tc(){let e=await gr.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 rc(e,t){return await gr.selectFrom("errors").where("type","=",e).where("message","=",t).selectAll().orderBy("created_at","desc").execute()}async function nc(){let e=await hr(),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 oc(){let e=await hr(),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 Tt}from"@stacksjs/database/runtime";import{sql as Et}from"@stacksjs/database/runtime";import{log as Ft}from"@stacksjs/logging";async function ac(e,t){try{return await Tt.updateTable("errors").set({...t,updated_at:Et.raw("CURRENT_TIMESTAMP")}).where("id","=",e).execute(),!0}catch(r){return Ft.error("[commerce/errors] update failed",{id:e,error:r}),!1}}async function sc(e,t){try{return await Tt.updateTable("errors").set({status:t,updated_at:Et.raw("CURRENT_TIMESTAMP")}).where("id","in",e).execute(),!0}catch(r){return Ft.error("[commerce/errors] bulkUpdateStatus failed",{count:e.length,status:t,error:r}),!1}}async function ic(e,t){try{return await Tt.updateTable("errors").set({status:1,updated_at:Et.raw("CURRENT_TIMESTAMP")}).where("type","=",e).where("message","=",t).execute(),!0}catch(r){return Ft.error("[commerce/errors] resolveGroup failed",{type:e,message:t,error:r}),!1}}async function uc(e,t){try{return await Tt.updateTable("errors").set({status:2,updated_at:Et.raw("CURRENT_TIMESTAMP")}).where("type","=",e).where("message","=",t).execute(),!0}catch(r){return Ft.error("[commerce/errors] ignoreGroup failed",{type:e,message:t,error:r}),!1}}async function cc(e,t){try{return await Tt.updateTable("errors").set({status:0,updated_at:Et.raw("CURRENT_TIMESTAMP")}).where("type","=",e).where("message","=",t).execute(),!0}catch(r){return Ft.error("[commerce/errors] unresolveGroup failed",{type:e,message:t,error:r}),!1}}var Ko={};F(Ko,{bulkDestroy:()=>_c,calculateGiftCardValues:()=>wc,checkBalance:()=>pc,compareActiveGiftCards:()=>fc,deactivate:()=>Rc,destroy:()=>bc,destroyExpired:()=>xc,fetchActive:()=>lc,fetchAll:()=>dc,fetchByCode:()=>qo,fetchById:()=>Se,fetchStats:()=>mc,fetchTotalCurrentBalance:()=>gc,fetchTotalValue:()=>yc,store:()=>vc,update:()=>Ac,updateBalance:()=>Tc});import{db as br,matchedRows as wg}from"@stacksjs/database/runtime";import{formatDate as hc}from"@stacksjs/orm";import{db as W,sql as ae}from"@stacksjs/database/runtime";import{formatDate as Be,toTimestamp as st}from"@stacksjs/orm";import{aggregateFunctions as pg,db as fg}from"@stacksjs/database/runtime";async function ue(e,t,r){let n=fg.selectFrom(e);if(r)n=r(n);n=n.select(Object.entries(t).map(([s,i])=>{let u=i.column??"id",c=pg[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 dc(){let e=await W.selectFrom("gift_cards").selectAll().execute();return P(e)}async function Se(e){let t=await W.selectFrom("gift_cards").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function qo(e){let t=await W.selectFrom("gift_cards").where("code","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function lc(){let e=await W.selectFrom("gift_cards").where("is_active","=",!0).selectAll().execute();return P(e)}async function mc(){let{count:e}=await ue("gift_cards",{count:{kind:"count"}}),t=st(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","<=",st(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 pc(e){let t=await qo(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 fc(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(st(t))} OR expiry_date IS NULL)`).where("created_at",">=",Be(r)).where("created_at","<=",Be(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(st(o))} OR expiry_date IS NULL)`).where("created_at",">=",Be(o)).where("created_at","<=",Be(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 wc(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(st(t))} OR expiry_date IS NULL)`).where("created_at",">=",Be(r)).where("created_at","<=",Be(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(st(o))} OR expiry_date IS NULL)`).where("created_at",">=",Be(o)).where("created_at","<=",Be(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,b=d>0?(d-m)/d*100:0,p=c>0?i/c:0,h=c>0?u/c:0,g=i-d,f=u-m,x=c-l,D=d!==0?g/d*100:i>0?100:0,v=m!==0?f/m*100:u>0?100:0,E=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:h},previous_period:{total_initial_value:d,total_remaining_balance:m,utilization_rate:b,card_count:l},comparison:{initial_value:{difference:g,percentage:Math.abs(D),is_increase:g>=0},balance:{difference:f,percentage:Math.abs(v),is_increase:f>=0},card_count:{difference:x,percentage:Math.abs(E),is_increase:x>=0}},days_range:e}}async function yc(){let{total_value:e}=await ue("gift_cards",{total_value:{kind:"sum",column:"initial_balance"}});return{total_value:e}}async function gc(){let{total_balance:e}=await ue("gift_cards",{total_balance:{kind:"sum",column:"current_balance"}});return{total_balance:e}}async function bc(e){let t=await br.deleteFrom("gift_cards").where("id","=",e).executeTakeFirst();return _(t)>0}async function _c(e){if(!e.length)return 0;let t=await br.deleteFrom("gift_cards").where("id","in",e).executeTakeFirst();return _(t)}async function xc(){let e=hc(new Date),t=await br.deleteFrom("gift_cards").where("expiry_date","<",e).executeTakeFirst();return _(t)}async function Rc(e){if(!await Se(e))throw Error(`Gift card with ID ${e} not found`);return(await wg(br.updateTable("gift_cards").set({is_active:!1,status:"DEACTIVATED",updated_at:hc(new Date)}).where("id","=",e))).length>0}var{randomUUIDv7:yg}=globalThis.Bun;import{db as Ho}from"@stacksjs/database/runtime";import{HttpError as Pc}from"@stacksjs/error-handling";import{isUniqueViolation as gg}from"@stacksjs/orm";async function vc(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:yg()};try{let n=await Ho.insertInto("gift_cards").values(r).executeTakeFirst(),o=ve(n);if(o!==void 0){let s=await Ho.selectFrom("gift_cards").where("id","=",o).selectAll().executeTakeFirst();return w(s)}let a=await Ho.selectFrom("gift_cards").where("uuid","=",r.uuid).selectAll().executeTakeFirst();return w(a,!0)}catch(n){if(n instanceof Pc)throw n;if(gg(n))throw new Pc(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 Cc,mutationCount as hg,parseSqlDateTime as Dc,sqlHelpers as bg}from"@stacksjs/database/runtime";import{env as _g}from"@stacksjs/env";import{HttpError as Sc}from"@stacksjs/error-handling";import{formatDate as kc,isUniqueViolation as xg}from"@stacksjs/orm";async function Ac(e,t){if(!await Se(e))return;try{return await Cc.updateTable("gift_cards").set({...t,updated_at:kc(new Date)}).where("id","=",e).execute(),await Se(e)}catch(n){if(n instanceof Sc)throw n;if(xg(n))throw new Sc(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 Tc(e,t){if(!Number.isFinite(t))throw Error(`Gift card balance adjustment must be a finite number, got ${t}`);let r=bg(_g.DB_CONNECTION||"sqlite"),n=r.param,o=kc(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 Cc.unsafe(`UPDATE gift_cards
8
+ AND (end_date IS NULL OR end_date >= ${r(4)})`,[n,e,n,n]);if(ng(o)>0){let u=await Ke(e);if(u)return{ok:!0,coupon:u};return{ok:!1,reason:"not-found"}}let a=await Ke(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"}}var Bo={};F(Bo,{bulkDestroy:()=>Au,destroy:()=>ku,fetchAll:()=>Bi,fetchById:()=>lr,store:()=>Ui,update:()=>Eu});import{db as Cu}from"@stacksjs/database/runtime";async function ku(e){try{let t=await Cu.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 Au(e){if(!e.length)return 0;try{let t=await Cu.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 ig}from"@stacksjs/database/runtime";import{HttpError as Tu}from"@stacksjs/error-handling";import{formatDate as ug,isUniqueViolation as cg}from"@stacksjs/orm";async function Eu(e,t){try{if(!e)throw Error("Customer ID is required for update");let r=await ig.updateTable("customers").set({...t,updated_at:ug(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!r)return;return w(r)}catch(r){if(r instanceof Tu)throw r;if(cg(r))throw new Tu(409,"A customer with this email already exists");if(r instanceof Error)throw Error(`Failed to update customer: ${r.message}`);throw r}}var jo={};F(jo,{bulkDestroy:()=>Mu,bulkStore:()=>qu,calculateErrorRate:()=>Bu,calculatePrinterHealth:()=>Uu,countAll:()=>Nu,countPrintsByDeviceId:()=>$u,countTotalPrints:()=>Ou,destroy:()=>Iu,downloadPrintDevices:()=>ju,exportPrintDevices:()=>yr,fetchAll:()=>wr,fetchById:()=>De,fetchErrorsByDeviceId:()=>Ju,getPrinterStatusCounts:()=>Wu,store:()=>Vu,storePrintDevicesExport:()=>zu,update:()=>Hu,updatePrintCount:()=>Zu,updateStatus:()=>Ku});import{db as Fu}from"@stacksjs/database/runtime";async function Iu(e){try{let t=await Fu.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 Mu(e){if(!e.length)return 0;try{let t=await Fu.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 dg}from"ts-spreadsheets";import{db as Q}from"@stacksjs/database/runtime";async function De(e){let t=await Q.selectFrom("print_devices").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function wr(){return P(await Q.selectFrom("print_devices").selectAll().execute())}async function Nu(){let e=await Q.selectFrom("print_devices").select(Q.fn.count("id").as("count")).executeTakeFirst();return Number(e?.count||0)}async function Ou(){let e=await Q.selectFrom("print_devices").select(Q.fn.sum("print_count").as("total")).executeTakeFirst();return Number(e?.total||0)}async function $u(e){let t=await Q.selectFrom("print_devices").select("print_count").where("id","=",e).executeTakeFirst();return Number(t?.print_count??0)}async function Bu(){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 Ju(e){let t=await Q.selectFrom("receipts").where("print_device_id","=",e).where("status","=","failed").selectAll().execute();return P(t)}async function Uu(){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 Wu(){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 Jo(e,t,r=t){let n=e;return n[String(t)]??n[r]}function lg(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 Lu(e,t,r=t){let n=Jo(e,t,r);if(typeof n==="number")return n;let o=Number(n);return Number.isFinite(o)?o:0}function At(e,t,r=t){let n=Jo(e,t,r);return n==null?"":String(n)}async function yr(e="csv"){let t=await wr(),r=mg(t);return dg(r,{type:e})}function mg(e){let t=["Device ID","Name","MAC Address","Location","Terminal","Status","Last Ping","Print Count"],r=e.map((n)=>[Lu(n,"id"),At(n,"name"),At(n,"macAddress","mac_address"),At(n,"location"),At(n,"terminal"),At(n,"status"),lg(Jo(n,"lastPing","last_ping")).toLocaleString(),Lu(n,"printCount","print_count")]);return{headings:t,data:r}}async function ju(e="csv",t){let r=await yr(e),n=`print_devices_export_${new Date().toISOString().split("T")[0]}.${e}`;return r.download(t||n)}async function zu(e="csv",t){let r=await yr(e),n=`print_devices_export_${new Date().toISOString().split("T")[0]}.${e}`;r.store(t||n)}var{randomUUIDv7:Gu}=globalThis.Bun;import{db as Uo}from"@stacksjs/database/runtime";async function Vu(e){try{let t=Gu(),r={last_ping:0,print_count:0,...e,uuid:t};await Uo.insertInto("print_devices").values(r).executeTakeFirst();let n=await Uo.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 qu(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:Gu()};await Uo.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 Wo}from"@stacksjs/database/runtime";import{formatDate as Lo}from"@stacksjs/orm";async function Hu(e,t){if(!await De(e))return;try{return await Wo.updateTable("print_devices").set({...t,updated_at:Lo(new Date)}).where("id","=",e).execute(),await De(e)}catch(n){if(n instanceof Error)throw TypeError(`Failed to update print device: ${n.message}`);throw n}}async function Ku(e,t){if(!await De(e))throw Error(`Print device with ID ${e} not found`);try{return await Wo.updateTable("print_devices").set({status:t,updated_at:Lo(new Date)}).where("id","=",e).execute(),await De(e)}catch(n){if(n instanceof Error)throw TypeError(`Failed to update print device status: ${n.message}`);throw n}}async function Zu(e,t){if(!await De(e))throw Error(`Print device with ID ${e} not found`);try{return await Wo.updateTable("print_devices").set({print_count:t,updated_at:Lo(new Date)}).where("id","=",e).execute(),await De(e)}catch(n){if(n instanceof Error)throw TypeError(`Failed to update print count: ${n.message}`);throw n}}var Vo={};F(Vo,{bulkDestroy:()=>Yu,bulkUpdateStatus:()=>sc,destroy:()=>Qu,destroyGroup:()=>Xu,fetchAll:()=>hr,fetchByGroup:()=>rc,fetchById:()=>ec,fetchGrouped:()=>tc,fetchStats:()=>nc,fetchTimeline:()=>oc,ignoreGroup:()=>uc,resolveGroup:()=>ic,unresolveGroup:()=>cc,update:()=>ac});import{db as zo}from"@stacksjs/database/runtime";import{log as Go}from"@stacksjs/logging";async function Qu(e){try{return await zo.deleteFrom("errors").where("id","=",e).execute(),!0}catch(t){return Go.error("[commerce/errors] destroy failed",{id:e,error:t}),!1}}async function Yu(e){try{return await zo.deleteFrom("errors").where("id","in",e).execute(),!0}catch(t){return Go.error("[commerce/errors] bulkDestroy failed",{count:e.length,error:t}),!1}}async function Xu(e,t){try{return await zo.deleteFrom("errors").where("type","=",e).where("message","=",t).execute(),!0}catch(r){return Go.error("[commerce/errors] destroyGroup failed",{type:e,message:t,error:r}),!1}}import{db as gr}from"@stacksjs/database/runtime";async function ec(e){return await gr.selectFrom("errors").where("id","=",e).selectAll().executeTakeFirst()}async function hr(){return await gr.selectFrom("errors").selectAll().orderBy("created_at","desc").execute()}async function tc(){let e=await gr.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 rc(e,t){return await gr.selectFrom("errors").where("type","=",e).where("message","=",t).selectAll().orderBy("created_at","desc").execute()}async function nc(){let e=await hr(),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 oc(){let e=await hr(),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 Tt}from"@stacksjs/database/runtime";import{sql as Et}from"@stacksjs/database/runtime";import{log as Ft}from"@stacksjs/logging";async function ac(e,t){try{return await Tt.updateTable("errors").set({...t,updated_at:Et.raw("CURRENT_TIMESTAMP")}).where("id","=",e).execute(),!0}catch(r){return Ft.error("[commerce/errors] update failed",{id:e,error:r}),!1}}async function sc(e,t){try{return await Tt.updateTable("errors").set({status:t,updated_at:Et.raw("CURRENT_TIMESTAMP")}).where("id","in",e).execute(),!0}catch(r){return Ft.error("[commerce/errors] bulkUpdateStatus failed",{count:e.length,status:t,error:r}),!1}}async function ic(e,t){try{return await Tt.updateTable("errors").set({status:1,updated_at:Et.raw("CURRENT_TIMESTAMP")}).where("type","=",e).where("message","=",t).execute(),!0}catch(r){return Ft.error("[commerce/errors] resolveGroup failed",{type:e,message:t,error:r}),!1}}async function uc(e,t){try{return await Tt.updateTable("errors").set({status:2,updated_at:Et.raw("CURRENT_TIMESTAMP")}).where("type","=",e).where("message","=",t).execute(),!0}catch(r){return Ft.error("[commerce/errors] ignoreGroup failed",{type:e,message:t,error:r}),!1}}async function cc(e,t){try{return await Tt.updateTable("errors").set({status:0,updated_at:Et.raw("CURRENT_TIMESTAMP")}).where("type","=",e).where("message","=",t).execute(),!0}catch(r){return Ft.error("[commerce/errors] unresolveGroup failed",{type:e,message:t,error:r}),!1}}var Ko={};F(Ko,{bulkDestroy:()=>_c,calculateGiftCardValues:()=>wc,checkBalance:()=>pc,compareActiveGiftCards:()=>fc,deactivate:()=>Rc,destroy:()=>bc,destroyExpired:()=>xc,fetchActive:()=>lc,fetchAll:()=>dc,fetchByCode:()=>qo,fetchById:()=>Se,fetchStats:()=>mc,fetchTotalCurrentBalance:()=>gc,fetchTotalValue:()=>yc,store:()=>vc,update:()=>Ac,updateBalance:()=>Tc});import{db as br,matchedRows as wg}from"@stacksjs/database/runtime";import{formatDate as hc}from"@stacksjs/orm";import{db as W,sql as ae}from"@stacksjs/database/runtime";import{formatDate as Be,toTimestamp as it}from"@stacksjs/orm";import{aggregateFunctions as pg,db as fg}from"@stacksjs/database/runtime";async function ue(e,t,r){let n=fg.selectFrom(e);if(r)n=r(n);n=n.select(Object.entries(t).map(([s,i])=>{let u=i.column??"id",c=pg[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 dc(){let e=await W.selectFrom("gift_cards").selectAll().execute();return P(e)}async function Se(e){let t=await W.selectFrom("gift_cards").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function qo(e){let t=await W.selectFrom("gift_cards").where("code","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function lc(){let e=await W.selectFrom("gift_cards").where("is_active","=",!0).selectAll().execute();return P(e)}async function mc(){let{count:e}=await ue("gift_cards",{count:{kind:"count"}}),t=it(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"}},(l)=>l.whereRaw(ae`current_balance / initial_balance < 0.25`)),{count:a}=await ue("gift_cards",{count:{kind:"count"}},(l)=>l.whereRaw(ae`current_balance / initial_balance >= 0.25 AND current_balance / initial_balance <= 0.75`)),{count:s}=await ue("gift_cards",{count:{kind:"count"}},(l)=>l.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","<=",it(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((l)=>({status:l.status,count:Number(l.count)})),by_balance:{low:o,medium:a,high:s},expiring_soon:P(u),recently_used:P(c)}}async function pc(e){let t=await qo(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 fc(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(it(t))} OR expiry_date IS NULL)`).where("created_at",">=",Be(r)).where("created_at","<=",Be(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(it(o))} OR expiry_date IS NULL)`).where("created_at",">=",Be(o)).where("created_at","<=",Be(n)).executeTakeFirst(),i=Number(a?.count||0),u=Number(s?.count||0),c=i-u,l=u!==0?c/u*100:i>0?100:0;return{current_period:i,previous_period:u,difference:c,percentage_change:l,days_range:e}}async function wc(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(it(t))} OR expiry_date IS NULL)`).where("created_at",">=",Be(r)).where("created_at","<=",Be(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(it(o))} OR expiry_date IS NULL)`).where("created_at",">=",Be(o)).where("created_at","<=",Be(n)).executeTakeFirst(),i=Number(a?.total_initial||0),u=Number(a?.total_balance||0),c=Number(a?.card_count||0),l=Number(s?.total_initial||0),m=Number(s?.total_balance||0),d=Number(s?.card_count||0),y=i>0?(i-u)/i*100:0,b=l>0?(l-m)/l*100:0,p=c>0?i/c:0,h=c>0?u/c:0,g=i-l,f=u-m,x=c-d,D=l!==0?g/l*100:i>0?100:0,v=m!==0?f/m*100:u>0?100:0,E=d!==0?x/d*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:h},previous_period:{total_initial_value:l,total_remaining_balance:m,utilization_rate:b,card_count:d},comparison:{initial_value:{difference:g,percentage:Math.abs(D),is_increase:g>=0},balance:{difference:f,percentage:Math.abs(v),is_increase:f>=0},card_count:{difference:x,percentage:Math.abs(E),is_increase:x>=0}},days_range:e}}async function yc(){let{total_value:e}=await ue("gift_cards",{total_value:{kind:"sum",column:"initial_balance"}});return{total_value:e}}async function gc(){let{total_balance:e}=await ue("gift_cards",{total_balance:{kind:"sum",column:"current_balance"}});return{total_balance:e}}async function bc(e){let t=await br.deleteFrom("gift_cards").where("id","=",e).executeTakeFirst();return _(t)>0}async function _c(e){if(!e.length)return 0;let t=await br.deleteFrom("gift_cards").where("id","in",e).executeTakeFirst();return _(t)}async function xc(){let e=hc(new Date),t=await br.deleteFrom("gift_cards").where("expiry_date","<",e).executeTakeFirst();return _(t)}async function Rc(e){if(!await Se(e))throw Error(`Gift card with ID ${e} not found`);return(await wg(br.updateTable("gift_cards").set({is_active:!1,status:"DEACTIVATED",updated_at:hc(new Date)}).where("id","=",e))).length>0}var{randomUUIDv7:yg}=globalThis.Bun;import{db as Ho}from"@stacksjs/database/runtime";import{HttpError as Pc}from"@stacksjs/error-handling";import{isUniqueViolation as gg}from"@stacksjs/orm";async function vc(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:yg()};try{let n=await Ho.insertInto("gift_cards").values(r).executeTakeFirst(),o=ve(n);if(o!==void 0){let s=await Ho.selectFrom("gift_cards").where("id","=",o).selectAll().executeTakeFirst();return w(s)}let a=await Ho.selectFrom("gift_cards").where("uuid","=",r.uuid).selectAll().executeTakeFirst();return w(a,!0)}catch(n){if(n instanceof Pc)throw n;if(gg(n))throw new Pc(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 Cc,mutationCount as hg,parseSqlDateTime as Dc,sqlHelpers as bg}from"@stacksjs/database/runtime";import{env as _g}from"@stacksjs/env";import{HttpError as Sc}from"@stacksjs/error-handling";import{formatDate as kc,isUniqueViolation as xg}from"@stacksjs/orm";async function Ac(e,t){if(!await Se(e))return;try{return await Cc.updateTable("gift_cards").set({...t,updated_at:kc(new Date)}).where("id","=",e).execute(),await Se(e)}catch(n){if(n instanceof Sc)throw n;if(xg(n))throw new Sc(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 Tc(e,t){if(!Number.isFinite(t))throw Error(`Gift card balance adjustment must be a finite number, got ${t}`);let r=bg(_g.DB_CONNECTION||"sqlite"),n=r.param,o=kc(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)),l=await Cc.unsafe(`UPDATE gift_cards
9
9
  SET status = CASE WHEN current_balance + ${c(t)} = 0 THEN 'USED' WHEN 1 = 0 THEN status ELSE 'ACTIVE' END,
10
10
  current_balance = current_balance + ${c(t)},
11
11
  ${a?`last_used_date = ${c(o)},
@@ -14,15 +14,15 @@ var zw=Object.defineProperty;var Gw=(e)=>e;function Vw(e,t){this[e]=Gw.bind(null
14
14
  AND is_active = ${r.boolTrue}
15
15
  AND ${i}
16
16
  AND (expiry_date IS NULL OR expiry_date >= ${c(o)})
17
- AND current_balance + ${c(t)} >= 0`,u);if(hg(d)>0)return await Se(e);let m=await Se(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=Dc(l.expiry_date??l.expiryDate),b=Dc(o);if(y&&b&&y.getTime()<b.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")}var ma={};F(ma,{bulkDestroy:()=>Mc,bulkSoftDelete:()=>Nc,calculateOrderMetrics:()=>Wc,canTransition:()=>it,cleanupAbandonedCarts:()=>ad,compareOrdersByPeriod:()=>Uc,destroy:()=>Fc,downloadOrders:()=>Oc,emitForStatus:()=>ut,emitOrderCancelled:()=>It,emitOrderCreated:()=>Pr,emitOrderDelivered:()=>ta,emitOrderPaid:()=>Ze,emitOrderRefunded:()=>Mt,emitOrderShipped:()=>ea,exportOrders:()=>Rr,fetchAll:()=>Yo,fetchById:()=>Ce,fetchDailyOrderTrends:()=>Lc,fetchRecent:()=>Bc,fetchStats:()=>Jc,findOrderByIdempotencyKey:()=>vr,handleChargeRefunded:()=>da,handlePaymentIntentFailed:()=>ca,handlePaymentIntentSucceeded:()=>ua,placeOrder:()=>Kc,recomputeOrderTotals:()=>rd,registerCommerceWebhookHandlers:()=>ed,softDelete:()=>Ic,store:()=>zc,storeOrdersExport:()=>$c,update:()=>Zc,updateDeliveryInfo:()=>Yc,updateStatus:()=>Qc,validateCartQuantities:()=>od,validateCouponStacking:()=>nd,validateQuantityBounds:()=>la});import{db as _r,matchedRows as Ec}from"@stacksjs/database/runtime";async function Fc(e){try{let t=await _r.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 Ic(e){try{return(await Ec(_r.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 Mc(e){if(!e.length)return 0;try{let t=await _r.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 Nc(e){if(!e.length)return 0;try{return(await Ec(_r.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 xr}from"@stacksjs/database/runtime";import{createSpreadsheet as Rg}from"ts-spreadsheets";async function Rr(e="csv"){let t=await vg(),r=Dg(t);return Rg(r,{type:e})}var Pg=500;function Zo(e,t=Pg){let r=[];for(let n=0;n<e.length;n+=t)r.push(e.slice(n,n+t));return r}function Qo(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 vg(){let e=await xr.selectFrom("orders").selectAll().orderBy("id","asc").execute();if(e.length===0)return[];let t=Qo(e.map((i)=>i.id)),r=Qo(e.map((i)=>i.customer_id)),n=new Map;for(let i of Zo(r)){let u=await xr.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 Zo(t)){let u=await xr.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 Zo(Qo(o.map((u)=>u.product_id)))){let u=await xr.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 Dg(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 Oc(e="csv",t){let r=await Rr(e),n=`orders_export_${new Date().toISOString().split("T")[0]}.${e}`;return r.download(t||n)}async function $c(e="csv",t){let r=await Rr(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 Yo(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 Bc(e=10){return Yo(e)}async function Ce(e){let t=await B.selectFrom("orders").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function Jc(){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 Uc(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 Wc(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),b=l>0?y/l:0,p=c-l,h=d-y,g=m-b,f=l!==0?p/l*100:c>0?100:0,x=y!==0?h/y*100:d>0?100:0,D=b!==0?g/b*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:b},comparison:{orders:{difference:p,percentage:Math.abs(f),is_increase:p>=0},revenue:{difference:h,percentage:Math.abs(x),is_increase:h>=0},average_order_value:{difference:g,percentage:Math.abs(D),is_increase:g>=0}},days_range:e}}async function Lc(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:Sg}=globalThis.Bun;import{db as Xo}from"@stacksjs/database/runtime";import{formatDate as jc}from"@stacksjs/orm";async function zc(e){let t={...e,status:e.status||"PENDING",uuid:Sg(),created_at:jc(new Date),updated_at:jc(new Date)};try{let r=await Xo.insertInto("orders").values(t).executeTakeFirst(),n=ve(r);if(n!==void 0){let a=await Xo.selectFrom("orders").where("id","=",n).selectAll().executeTakeFirst();return w(a,!0)}let o=await Xo.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:Gc}=globalThis.Bun;import{db as na}from"@stacksjs/database/runtime";ct();import{formatDate as Fg,isUniqueViolation as Vc}from"@stacksjs/orm";import{sqlHelpers as Ag}from"@stacksjs/database/runtime";import{env as Tg}from"@stacksjs/env";function Eg(e,t,r,n){let o=Ag(e).param;return{query:`UPDATE products
17
+ AND current_balance + ${c(t)} >= 0`,u);if(hg(l)>0)return await Se(e);let m=await Se(e);if(!m)throw Error(`Gift card with ID ${e} not found`);let d=m;if(!d.is_active&&!d.isActive)throw Error("Gift card is not active");if(m.status==="USED"&&s&&!(d.is_reloadable??d.isReloadable))throw Error("Gift card is not reloadable");if(m.status!=="ACTIVE")throw Error("Gift card is not active");let y=Dc(d.expiry_date??d.expiryDate),b=Dc(o);if(y&&b&&y.getTime()<b.getTime())throw Error("Gift card has expired");if(t===0&&Number(d.current_balance??d.currentBalance)>=0)return m;throw Error("Insufficient gift card balance")}var ma={};F(ma,{bulkDestroy:()=>Mc,bulkSoftDelete:()=>Nc,calculateOrderMetrics:()=>Wc,canTransition:()=>Je,cleanupAbandonedCarts:()=>ad,compareOrdersByPeriod:()=>Uc,destroy:()=>Fc,downloadOrders:()=>Oc,emitForStatus:()=>ut,emitOrderCancelled:()=>It,emitOrderCreated:()=>Pr,emitOrderDelivered:()=>ta,emitOrderPaid:()=>Qe,emitOrderRefunded:()=>Mt,emitOrderShipped:()=>ea,exportOrders:()=>Rr,fetchAll:()=>Yo,fetchById:()=>Ce,fetchDailyOrderTrends:()=>Lc,fetchRecent:()=>Bc,fetchStats:()=>Jc,findOrderByIdempotencyKey:()=>vr,handleCommercePaymentEvent:()=>ed,handlePaymentFailed:()=>ca,handlePaymentSucceeded:()=>ua,handleRefundSucceeded:()=>da,placeOrder:()=>Kc,recomputeOrderTotals:()=>rd,softDelete:()=>Ic,store:()=>zc,storeOrdersExport:()=>$c,update:()=>Zc,updateDeliveryInfo:()=>Yc,updateStatus:()=>Qc,validateCartQuantities:()=>od,validateCouponStacking:()=>nd,validateQuantityBounds:()=>la});import{db as _r,matchedRows as Ec}from"@stacksjs/database/runtime";async function Fc(e){try{let t=await _r.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 Ic(e){try{return(await Ec(_r.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 Mc(e){if(!e.length)return 0;try{let t=await _r.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 Nc(e){if(!e.length)return 0;try{return(await Ec(_r.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 xr}from"@stacksjs/database/runtime";import{createSpreadsheet as Rg}from"ts-spreadsheets";async function Rr(e="csv"){let t=await vg(),r=Dg(t);return Rg(r,{type:e})}var Pg=500;function Zo(e,t=Pg){let r=[];for(let n=0;n<e.length;n+=t)r.push(e.slice(n,n+t));return r}function Qo(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 vg(){let e=await xr.selectFrom("orders").selectAll().orderBy("id","asc").execute();if(e.length===0)return[];let t=Qo(e.map((i)=>i.id)),r=Qo(e.map((i)=>i.customer_id)),n=new Map;for(let i of Zo(r)){let u=await xr.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 Zo(t)){let u=await xr.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 Zo(Qo(o.map((u)=>u.product_id)))){let u=await xr.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))},l=s.get(u);if(l)l.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((l,m)=>l+Number(m.quantity??0),0),totalPrice:u.reduce((l,m)=>l+Number(m.price??0)*Number(m.quantity??0),0)}})}function Dg(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 Oc(e="csv",t){let r=await Rr(e),n=`orders_export_${new Date().toISOString().split("T")[0]}.${e}`;return r.download(t||n)}async function $c(e="csv",t){let r=await Rr(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 Yo(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 Bc(e=10){return Yo(e)}async function Ce(e){let t=await B.selectFrom("orders").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function Jc(){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 Uc(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,l=u!==0?c/u*100:i>0?100:0;return{current_period:i,previous_period:u,difference:c,percentage_change:l,days_range:e}}async function Wc(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),l=Number(a?.total_revenue||0),m=c>0?l/c:0,d=Number(s?.total_orders||0),y=Number(s?.total_revenue||0),b=d>0?y/d:0,p=c-d,h=l-y,g=m-b,f=d!==0?p/d*100:c>0?100:0,x=y!==0?h/y*100:l>0?100:0,D=b!==0?g/b*100:m>0?100:0;return{current_period:{total_orders:c,total_revenue:l,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:d,total_revenue:y,average_order_value:b},comparison:{orders:{difference:p,percentage:Math.abs(f),is_increase:p>=0},revenue:{difference:h,percentage:Math.abs(x),is_increase:h>=0},average_order_value:{difference:g,percentage:Math.abs(D),is_increase:g>=0}},days_range:e}}async function Lc(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:Sg}=globalThis.Bun;import{db as Xo}from"@stacksjs/database/runtime";import{formatDate as jc}from"@stacksjs/orm";async function zc(e){let t={...e,status:e.status||"PENDING",uuid:Sg(),created_at:jc(new Date),updated_at:jc(new Date)};try{let r=await Xo.insertInto("orders").values(t).executeTakeFirst(),n=ve(r);if(n!==void 0){let a=await Xo.selectFrom("orders").where("id","=",n).selectAll().executeTakeFirst();return w(a,!0)}let o=await Xo.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:Gc}=globalThis.Bun;import{db as na}from"@stacksjs/database/runtime";ct();import{formatDate as Fg,isUniqueViolation as Vc}from"@stacksjs/orm";import{sqlHelpers as Ag}from"@stacksjs/database/runtime";import{env as Tg}from"@stacksjs/env";function Eg(e,t,r,n){let o=Ag(e).param;return{query:`UPDATE products
18
18
  SET inventory_count = inventory_count + ${o(1)},
19
19
  updated_at = ${o(2)}
20
20
  WHERE id = ${o(3)}
21
- AND inventory_count + ${o(4)} >= 0`,parameters:[r,n,t,r]}}async function ra(e,t,r,n){let o=Eg(Tg.DB_CONNECTION||"sqlite",t,r,n),a=await e.unsafe(o.query,o.parameters);return _(a)}var qc=!1;function Hc(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 vr(e){try{let t=await na.selectFrom("order_idempotency").where("idempotency_key","=",e).selectAll().executeTakeFirst();if(!t)return null;return await na.selectFrom("orders").where("id","=",t.order_id).selectAll().executeTakeFirst()??null}catch(t){if(Hc(t)){if(!qc)qc=!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 Kc(e){if(e.idempotencyKey){let t=await vr(e.idempotencyKey);if(t)return{ok:!0,order:t}}try{let t=await na.transaction(async(r)=>{let n=Fg(new Date),o=Gc(),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=Gc();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(Vc(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 ra(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(Vc(m))throw Object.assign(Error("idempotency-key collision"),{__placeFail:!0,failedAt:"idempotency",reason:"duplicate-idempotency-key"});if(!Hc(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(Pr(t.order),t.payment)Ze(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 vr(e.idempotencyKey);if(r)return{ok:!0,order:r}}return{ok:!1,reason:t.reason,failedAt:t.failedAt,error:t}}throw t}}ct();import{db as oa}from"@stacksjs/database/runtime";import{formatDate as aa}from"@stacksjs/orm";ct();async function Zc(e,t){if(!await Ce(e))return;try{return await oa.updateTable("orders").set({...t,updated_at:aa(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 Qc(e,t){let r=await Ce(e);if(!r)throw Error(`Order with ID ${e} not found`);let n=r.status??"PENDING";if(!it(n,t))throw Error(`[commerce/orders] illegal status transition ${n} \u2192 ${t}`);try{await oa.updateTable("orders").set({status:t,updated_at:aa(new Date)}).where("id","=",e).execute();let o=await Ce(e);if(o)ut(t,o);return o}catch(o){if(o instanceof Error)throw TypeError(`Failed to update order status: ${o.message}`);throw o}}async function Yc(e,t,r){let n=await Ce(e);if(!n)throw Error(`Order with ID ${e} not found`);let o={updated_at:aa(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 oa.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}}ct();import{db as Nt}from"@stacksjs/database/runtime";import{formatDate as Dr}from"@stacksjs/orm";async function sa(e){let t=await Nt.selectFrom("payments").where("transaction_id","=",e).selectAll().executeTakeFirst();if(!t)return null;return await Nt.selectFrom("orders").where("id","=",t.order_id).selectAll().executeTakeFirst()??null}var Xc=!1;function Ig(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 ia(e,t){try{return await t.insertInto("stripe_webhook_events").values({event_id:e,processed_at:Dr(new Date)}).execute(),!0}catch(r){if(r?.message?.includes("UNIQUE constraint")||r?.message?.includes("Duplicate entry"))return!1;if(Ig(r)){if(!Xc)Xc=!0,console.warn("[commerce/webhook] stripe_webhook_events table missing - Stripe retries may be processed multiple times. Run migrations to enable dedup.");return!0}throw r}}async function ua(e){let r=e.data.object?.id;if(!r)return;await Nt.transaction(async(o)=>{if(!await ia(e.id,o))return;let s=await o.selectFrom("payments").where("transaction_id","=",r).selectAll().executeTakeFirst();if(!s)return;let i=Dr(new Date);await o.updateTable("payments").set({status:"succeeded",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:"PROCESSING",updated_at:i}).where("id","=",u.id).execute()});let n=await sa(r);if(n)await Ze(n)}async function ca(e){let t=e.data.object,r=t?.id;if(!r)return;let o=t?.last_payment_error?.message??"payment failed";await Nt.transaction(async(s)=>{if(!await ia(e.id,s))return;let u=await s.selectFrom("payments").where("transaction_id","=",r).selectAll().executeTakeFirst();if(!u)return;let c=Dr(new Date);await s.updateTable("payments").set({status:"failed",failure_reason:o,updated_at:c}).where("id","=",u.id).execute();let d=await s.selectFrom("orders").where("id","=",u.order_id).selectAll().executeTakeFirst();if(d&&d.status==="PENDING")await s.updateTable("orders").set({status:"CANCELLED",updated_at:c}).where("id","=",d.id).execute()});let a=await sa(r);if(a)await It(a,o)}async function da(e){let t=e.data.object,r=t?.payment_intent;if(!r)return;let n=t?.amount_refunded??0;await Nt.transaction(async(a)=>{if(!await ia(e.id,a))return;let i=await a.selectFrom("payments").where("transaction_id","=",r).selectAll().executeTakeFirst();if(!i)return;let u=Dr(new Date);await a.updateTable("payments").set({status:"refunded",refund_amount:n,updated_at:u}).where("id","=",i.id).execute();let c=await a.selectFrom("orders").where("id","=",i.order_id).selectAll().executeTakeFirst();if(c&&c.status!=="REFUNDED")await a.updateTable("orders").set({status:"REFUNDED",updated_at:u}).where("id","=",c.id).execute()});let o=await sa(r);if(o)await Mt(o,n)}async function ed(){let e=await import("@stacksjs/payments").catch(()=>null);if(!e)return console.warn("[commerce/webhook] @stacksjs/payments not installed - Stripe webhook handlers NOT registered"),()=>{};let{onPaymentIntent:t,onCharge:r}=e;if(typeof t!=="function"||typeof r!=="function")return console.warn("[commerce/webhook] @stacksjs/payments shape changed - handlers NOT registered"),()=>{};return t({succeeded:ua,failed:ca}),r({refunded:da}),()=>{}}import{db as td}from"@stacksjs/database/runtime";async function Mg(e){if(e.length===0)return new Map;let t=await td.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 Ng(e){try{let t=await td.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 rd(e){let t=e.items.map((b)=>b.productId),r=await Mg(t),n=e.taxRateId!=null?await Ng(e.taxRateId):0,o=0,a=[];for(let b of e.items){let p=b.unitPriceCents??r.get(b.productId)??0,h=Math.round(p*b.quantity);o+=h,a.push({productId:b.productId,quantity:b.quantity,unitPriceCents:p,lineCents:h})}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 Sr,sqlHelpers as Og}from"@stacksjs/database/runtime";import{env as $g}from"@stacksjs/env";function nd(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 la(e,t){if(!Number.isFinite(t)||t<=0)return{ok:!1,productId:e,quantity:t,reason:"non-positive"};let r;try{r=await Sr.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 od(e){for(let r of e){let n=await la(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 ad(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=Og($g.DB_CONNECTION||"sqlite").param;try{let s=await Sr.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 Sr.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 Sr.deleteFrom("carts").where("id","in",i).execute();return{deleted:_(u),cutoffAt:o}}catch{return{deleted:0,cutoffAt:o}}}}var pa={};F(pa,{bulkDestroy:()=>ud,destroy:()=>id,fetchAll:()=>cd,fetchById:()=>Qe,fetchMonthlyPaymentTrends:()=>md,fetchPaymentStats:()=>dd,fetchPaymentStatsByMethod:()=>ld,recordRefund:()=>bd,store:()=>wd,update:()=>hd});import{db as sd}from"@stacksjs/database/runtime";async function id(e){try{let t=await sd.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 ud(e){if(!e.length)return 0;try{let t=await sd.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 cd(){let e=await K.selectFrom("payments").selectAll().execute();return P(e)}async function Qe(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,b=u-m,p=c-l,h=d-y,g=m>0?b/m*100:u>0?100:0,f=l>0?p/l*100:c>0?100:0,x=y>0?h/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:b,percentage:Math.abs(g),is_increase:b>=0},revenue:{difference:p,percentage:Math.abs(f),is_increase:p>=0},average:{difference:h,percentage:Math.abs(x),is_increase:h>=0}}}}async function ld(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 md(){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:Bg}=globalThis.Bun;import{db as pd}from"@stacksjs/database/runtime";import{HttpError as fd}from"@stacksjs/error-handling";import{isUniqueViolation as Jg}from"@stacksjs/orm";async function wd(e){let t=Bg(),r={...e,status:e.status||"pending",currency:e.currency||"USD",uuid:t};try{await pd.insertInto("payments").values(r).executeTakeFirst();let n=await pd.selectFrom("payments").where("uuid","=",t).selectAll().executeTakeFirst();return w(n,!0)}catch(n){if(n instanceof fd)throw n;if(Jg(n))throw new fd(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 yd,mutationCount as Ug,sqlHelpers as Wg}from"@stacksjs/database/runtime";import{env as Lg}from"@stacksjs/env";import{formatDate as gd}from"@stacksjs/orm";async function hd(e,t){if(!await Qe(e))return;try{return await yd.updateTable("payments").set({...t,updated_at:gd(new Date)}).where("id","=",e).execute(),await Qe(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 jg=new Set(["completed","succeeded","partiallyRefunded"]);async function bd(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=Wg(Lg.DB_CONNECTION||"sqlite").param,o=gd(new Date),a=await yd.unsafe(`UPDATE payments
21
+ AND inventory_count + ${o(4)} >= 0`,parameters:[r,n,t,r]}}async function ra(e,t,r,n){let o=Eg(Tg.DB_CONNECTION||"sqlite",t,r,n),a=await e.unsafe(o.query,o.parameters);return _(a)}var qc=!1;function Hc(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 vr(e){try{let t=await na.selectFrom("order_idempotency").where("idempotency_key","=",e).selectAll().executeTakeFirst();if(!t)return null;return await na.selectFrom("orders").where("id","=",t.order_id).selectAll().executeTakeFirst()??null}catch(t){if(Hc(t)){if(!qc)qc=!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 Kc(e){if(e.idempotencyKey){let t=await vr(e.idempotencyKey);if(t)return{ok:!0,order:t}}try{let t=await na.transaction(async(r)=>{let n=Fg(new Date),o=Gc(),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((d)=>{if(!Number.isInteger(d.productId)||d.productId<=0)throw Object.assign(Error("order item product id must be a positive integer"),{__placeFail:!0,failedAt:"items",reason:"unknown"});if(!Number.isInteger(d.quantity)||d.quantity<=0)throw Object.assign(Error("order item quantity must be a positive integer"),{__placeFail:!0,failedAt:"items",reason:"unknown"});if(!Number.isFinite(d.price)||d.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:d.productId,quantity:d.quantity,price:d.price,special_instructions:d.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=Gc();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(Vc(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:d,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 ra(r,d,y,n))throw Object.assign(Error(`inventory adjust failed for product ${d}`),{__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(Vc(m))throw Object.assign(Error("idempotency-key collision"),{__placeFail:!0,failedAt:"idempotency",reason:"duplicate-idempotency-key"});if(!Hc(m))throw m}let l=w(await r.selectFrom("orders").where("id","=",i).selectAll().executeTakeFirst(),!0);if(!l)throw Object.assign(Error("order disappeared mid-transaction"),{__placeFail:!0,failedAt:"order",reason:"unknown"});return{order:l,items:u,payment:c}});if(Pr(t.order),t.payment)Qe(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 vr(e.idempotencyKey);if(r)return{ok:!0,order:r}}return{ok:!1,reason:t.reason,failedAt:t.failedAt,error:t}}throw t}}ct();import{db as oa}from"@stacksjs/database/runtime";import{formatDate as aa}from"@stacksjs/orm";ct();async function Zc(e,t){if(!await Ce(e))return;try{return await oa.updateTable("orders").set({...t,updated_at:aa(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 Qc(e,t){let r=await Ce(e);if(!r)throw Error(`Order with ID ${e} not found`);let n=r.status??"PENDING";if(!Je(n,t))throw Error(`[commerce/orders] illegal status transition ${n} \u2192 ${t}`);try{await oa.updateTable("orders").set({status:t,updated_at:aa(new Date)}).where("id","=",e).execute();let o=await Ce(e);if(o)ut(t,o);return o}catch(o){if(o instanceof Error)throw TypeError(`Failed to update order status: ${o.message}`);throw o}}async function Yc(e,t,r){let n=await Ce(e);if(!n)throw Error(`Order with ID ${e} not found`);let o={updated_at:aa(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 oa.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}}ct();import{db as Nt}from"@stacksjs/database/runtime";import{formatDate as Dr}from"@stacksjs/orm";async function sa(e){let t=await Nt.selectFrom("payments").where("transaction_id","=",e).selectAll().executeTakeFirst();if(!t)return null;return await Nt.selectFrom("orders").where("id","=",t.order_id).selectAll().executeTakeFirst()??null}var Xc=!1;async function ia(e,t){try{let r=Dr(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(Mg(r))return!1;if(Ig(r)){if(!Xc)Xc=!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 Ig(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 Mg(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 ua(e){let t=e.reference;if(!t)return;await Nt.transaction(async(n)=>{if(!await ia(e,n))return;let a=await n.selectFrom("payments").where("transaction_id","=",t).selectAll().executeTakeFirst();if(!a)return;let s=Dr(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 sa(t);if(r)await Qe(r)}async function ca(e){let t=e.reference;if(!t)return;let r=e.reason??"payment failed";await Nt.transaction(async(o)=>{if(!await ia(e,o))return;let s=await o.selectFrom("payments").where("transaction_id","=",t).selectAll().executeTakeFirst();if(!s)return;let i=Dr(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 sa(t);if(n)await It(n,r)}async function da(e){let t=e.reference;if(!t)return;let r=e.amount?.amount??0;if(!Number.isSafeInteger(r)||r<=0)return;let n=!1,o=!1;if(await Nt.transaction(async(s)=>{if(!await ia(e,s))return;let u=await s.selectFrom("payments").where("transaction_id","=",t).selectAll().executeTakeFirst();if(!u)return;let c=Number(u.refund_amount??0),l=c+r;if(l>Number(u.amount)){console.warn(`[commerce/webhook] ${e.provider} refunded ${r} of payment ${u.id}, which has ${Number(u.amount)-c} left to refund; not recorded.`);return}n=l===Number(u.amount);let m=Dr(new Date);if(await s.updateTable("payments").set({status:n?"refunded":"partiallyRefunded",refund_amount:l,updated_at:m}).where("id","=",u.id).execute(),o=!0,!n)return;let d=await s.selectFrom("orders").where("id","=",u.order_id).selectAll().executeTakeFirst();if(d&&Je(d.status,"REFUNDED"))await s.updateTable("orders").set({status:"REFUNDED",updated_at:m}).where("id","=",d.id).execute()}),!o)return;let a=await sa(t);if(a&&n)await Mt(a,r)}async function ed(e){switch(e.type){case"payment.succeeded":return await ua(e),!0;case"payment.failed":return await ca(e),!0;case"refund.succeeded":return await da(e),!0;default:return!1}}import{db as td}from"@stacksjs/database/runtime";async function Ng(e){if(e.length===0)return new Map;let t=await td.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 Og(e){try{let t=await td.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 rd(e){let t=e.items.map((b)=>b.productId),r=await Ng(t),n=e.taxRateId!=null?await Og(e.taxRateId):0,o=0,a=[];for(let b of e.items){let p=b.unitPriceCents??r.get(b.productId)??0,h=Math.round(p*b.quantity);o+=h,a.push({productId:b.productId,quantity:b.quantity,unitPriceCents:p,lineCents:h})}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),l=o-s+u+c,m=e.maxDriftCents??5,d=!1,y=0;if(e.clientTotalCents!=null)y=Math.abs(l-e.clientTotalCents),d=y>m;return{subtotalCents:o,discountCents:s,taxCents:u,shippingCents:c,totalCents:l,resolvedItems:a,priceChanged:d,diffCents:y}}import{db as Sr,sqlHelpers as $g}from"@stacksjs/database/runtime";import{env as Bg}from"@stacksjs/env";function nd(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 la(e,t){if(!Number.isFinite(t)||t<=0)return{ok:!1,productId:e,quantity:t,reason:"non-positive"};let r;try{r=await Sr.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 od(e){for(let r of e){let n=await la(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 ad(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=$g(Bg.DB_CONNECTION||"sqlite").param;try{let s=await Sr.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 Sr.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 Sr.deleteFrom("carts").where("id","in",i).execute();return{deleted:_(u),cutoffAt:o}}catch{return{deleted:0,cutoffAt:o}}}}var pa={};F(pa,{bulkDestroy:()=>ud,destroy:()=>id,fetchAll:()=>cd,fetchById:()=>Ye,fetchMonthlyPaymentTrends:()=>md,fetchPaymentStats:()=>dd,fetchPaymentStatsByMethod:()=>ld,recordRefund:()=>bd,store:()=>wd,update:()=>hd});import{db as sd}from"@stacksjs/database/runtime";async function id(e){try{let t=await sd.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 ud(e){if(!e.length)return 0;try{let t=await sd.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 cd(){let e=await K.selectFrom("payments").selectAll().execute();return P(e)}async function Ye(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),l=u>0?c/u:0,m=Number(s?.transaction_count||0),d=Number(s?.total_revenue||0),y=m>0?d/m:0,b=u-m,p=c-d,h=l-y,g=m>0?b/m*100:u>0?100:0,f=d>0?p/d*100:c>0?100:0,x=y>0?h/y*100:l>0?100:0,D=Number(i?.count||0),v=D>0?u/D*100:0;return{total_transactions:u,total_revenue:c,average_transaction:l,successful_rate:v,comparison:{transactions:{difference:b,percentage:Math.abs(g),is_increase:b>=0},revenue:{difference:p,percentage:Math.abs(f),is_increase:p>=0},average:{difference:h,percentage:Math.abs(x),is_increase:h>=0}}}}async function ld(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),l=o>0?u/o*100:0;s[i.method]={count:u,revenue:c,percentage_of_total:l}}),s}async function md(){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:Jg}=globalThis.Bun;import{db as pd}from"@stacksjs/database/runtime";import{HttpError as fd}from"@stacksjs/error-handling";import{isUniqueViolation as Ug}from"@stacksjs/orm";async function wd(e){let t=Jg(),r={...e,status:e.status||"pending",currency:e.currency||"USD",uuid:t};try{await pd.insertInto("payments").values(r).executeTakeFirst();let n=await pd.selectFrom("payments").where("uuid","=",t).selectAll().executeTakeFirst();return w(n,!0)}catch(n){if(n instanceof fd)throw n;if(Ug(n))throw new fd(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 yd,mutationCount as Wg,sqlHelpers as Lg}from"@stacksjs/database/runtime";import{env as jg}from"@stacksjs/env";import{formatDate as gd}from"@stacksjs/orm";async function hd(e,t){if(!await Ye(e))return;try{return await yd.updateTable("payments").set({...t,updated_at:gd(new Date)}).where("id","=",e).execute(),await Ye(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 zg=new Set(["completed","succeeded","partiallyRefunded"]);async function bd(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=Lg(jg.DB_CONNECTION||"sqlite").param,o=gd(new Date),a=await yd.unsafe(`UPDATE payments
22
22
  SET status = CASE WHEN COALESCE(refund_amount, 0) + ${n(1)} = amount THEN 'refunded'
23
23
  WHEN 1 = 0 THEN status ELSE 'partiallyRefunded' END,
24
24
  refund_amount = COALESCE(refund_amount, 0) + ${n(2)},
25
25
  updated_at = ${n(3)}
26
26
  WHERE id = ${n(4)}
27
27
  AND status IN ('completed', 'succeeded', 'partiallyRefunded')
28
- AND COALESCE(refund_amount, 0) + ${n(5)} <= amount`,[t,t,o,e,t]);if(Ug(a)>0){let d=await Qe(e);if(d)return d;throw Error(`Payment with ID ${e} disappeared during refund`)}let s=await Qe(e);if(!s)throw Error(`Payment with ID ${e} not found`);let i=String(s.status||"");if(!jg.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`)}var _a={};F(_a,{categories:()=>Ar,default:()=>sh,items:()=>Tr,manufacturers:()=>Er,reviews:()=>Fr,units:()=>Nr,variants:()=>Or});var Ar={};F(Ar,{bulkRemove:()=>Td,compareCategoryGrowth:()=>Sd,deactivate:()=>Fd,deactivateChildCategories:()=>Id,fetchActive:()=>xd,fetchAll:()=>fa,fetchByDisplayOrder:()=>vd,fetchById:()=>Z,fetchByName:()=>_d,fetchCategoryTree:()=>Cd,fetchChildCategories:()=>Pd,fetchRootCategories:()=>Rd,fetchStats:()=>Dd,findOrCreateByName:()=>Nd,remove:()=>Ad,removeChildCategories:()=>Ed,store:()=>wa,update:()=>Od,updateActiveStatus:()=>Bd,updateDisplayOrder:()=>$d,updateParent:()=>Jd});import{db as $t,matchedRows as zg}from"@stacksjs/database/runtime";import{formatDate as kd}from"@stacksjs/orm";import{db as L}from"@stacksjs/database/runtime";import{formatDate as Ot}from"@stacksjs/orm";async function fa(){return await L.selectFrom("categories").selectAll().execute()}async function Z(e){return await L.selectFrom("categories").where("id","=",e).selectAll().executeTakeFirst()}async function _d(e){return await L.selectFrom("categories").where("name","=",e).selectAll().executeTakeFirst()}async function xd(){return await L.selectFrom("categories").where("is_active","=",!0).selectAll().execute()}async function Rd(){return await L.selectFrom("categories").whereNull("parent_category_id").where("is_active","=",!0).selectAll().execute()}async function Pd(e){return await L.selectFrom("categories").where("parent_category_id","=",e).where("is_active","=",!0).selectAll().execute()}async function vd(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 Dd(){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=Ot(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 Sd(e=30){let t=new Date,r=Ot(t),n=new Date;n.setDate(t.getDate()-e);let o=Ot(n),a=new Date(n);a.setDate(a.getDate()-1);let s=Ot(a),i=new Date(a);i.setDate(a.getDate()-e);let u=Ot(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,b=l!==0?y/l*100:m>0?100:0;return{current_period:m,previous_period:l,difference:y,percentage_change:b,days_range:e}}async function Cd(){let e=await fa(),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 Ad(e){let t=await $t.deleteFrom("categories").where("id","=",e).executeTakeFirst();return _(t)>0}async function Td(e){if(!e.length)return 0;let t=await $t.deleteFrom("categories").where("id","in",e).executeTakeFirst();return _(t)}async function Ed(e){let t=await $t.deleteFrom("categories").where("parent_category_id","=",e).executeTakeFirst();return _(t)}async function Fd(e){if(!await Z(e))throw Error(`Category with ID ${e} not found`);let r=await $t.updateTable("categories").set({is_active:!1,updated_at:kd(new Date)}).where("id","=",e).returning("id").executeTakeFirst();return Boolean(r)}async function Id(e){return(await zg($t.updateTable("categories").set({is_active:!1,updated_at:kd(new Date)}).where("parent_category_id","=",e))).length}var{randomUUIDv7:Gg}=globalThis.Bun;import{db as Md}from"@stacksjs/database/runtime";import{HttpError as Cr}from"@stacksjs/error-handling";import{isUniqueViolation as Vg}from"@stacksjs/orm";import{slug as qg}from"@stacksjs/strings";async function wa(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 Cr(422,"Parent category ID must be a positive integer");if(t&&!await Z(t))throw new Cr(422,`Parent category with ID ${e.parent_category_id} not found`);let r={...e,uuid:Gg(),is_active:e.is_active??!0,parent_category_id:e.parent_category_id||null},n=await Md.insertInto("categories").values(r).returningAll().executeTakeFirst();if(!n)throw Error("Failed to create category");return n}catch(t){if(t instanceof Cr)throw t;if(Vg(t))throw new Cr(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 Nd(e){if(!e.name)throw Error("Name is required");let t=await Md.selectFrom("categories").selectAll().where("name","=",e.name).executeTakeFirst();if(t)return t;let r={name:e.name,slug:qg(e.name),is_active:e.is_active??!0,display_order:0};return await wa(r)}import{db as Bt}from"@stacksjs/database/runtime";import{HttpError as dt}from"@stacksjs/error-handling";import{formatDate as kr,isUniqueViolation as Hg}from"@stacksjs/orm";async function Od(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 dt(422,"Parent category ID must be a positive integer");if(n===e)throw new dt(422,"A category cannot be its own parent");if(n&&!await Z(n))throw new dt(422,`Parent category with ID ${t.parent_category_id} not found`);if(n&&await Ud(e,String(n)))throw new dt(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 Bt.updateTable("categories").set({...t,...n,updated_at:kr(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!o)return;return o}catch(n){if(n instanceof dt)throw n;if(Hg(n))throw new dt(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 $d(e,t){if(!await Z(e))throw Error(`Category with ID ${e} not found`);try{return await Bt.updateTable("categories").set({display_order:t,updated_at:kr(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 Bd(e,t){if(!await Z(e))throw Error(`Category with ID ${e} not found`);try{return await Bt.updateTable("categories").set({is_active:t,updated_at:kr(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 Jd(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 Ud(e,t))throw Error("This operation would create a circular reference in the category hierarchy")}try{let n={updated_at:kr(new Date)};if(t===null)await Bt.updateTable("categories").set({...n,parent_category_id:null}).where("id","=",e).execute();else await Bt.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 Ud(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}var Tr={};F(Tr,{bulkDestroy:()=>jd,bulkStore:()=>Zd,destroy:()=>Ld,fetchAll:()=>zd,fetchById:()=>Ae,fetchTopProducts:()=>Vd,store:()=>Kd,update:()=>Qd,updateAvailability:()=>Yd,updateInventory:()=>Xd});import{db as Wd}from"@stacksjs/database/runtime";async function Ld(e){try{let t=await Wd.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 jd(e){if(!e.length)return 0;try{let t=await Wd.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 ke,sql as Kg}from"@stacksjs/database/runtime";async function Ae(e){let t=await ke.selectFrom("products").where("id","=",e).selectAll().executeTakeFirst();if(t){let r=null,n=null;if(t.manufacturer_id)r=await ke.selectFrom("manufacturers").where("id","=",t.manufacturer_id).selectAll().executeTakeFirst();if(t.category_id)n=await ke.selectFrom("categories").where("id","=",t.category_id).selectAll().executeTakeFirst();return{...t,manufacturer:r,category:n}}return}async function zd(){let e=await ke.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=ke.selectFrom("manufacturers"),o=ke.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 Gd(e){try{let t=await ke.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 Vd(e=5){try{return(await ke.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",ke.fn.sum("order_items.quantity").as("units_sold"),Kg`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:qd}=globalThis.Bun;import{db as Hd}from"@stacksjs/database/runtime";async function Kd(e){try{let t={...e,uuid:qd()},r=await Hd.insertInto("products").values(t).executeTakeFirst();if(!r)throw Error("Failed to create product item");let n=ve(r),o=n!==void 0?await Ae(n):await Gd(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 Zd(e){if(!e.length)return 0;let t=0;try{return await Hd.transaction(async(r)=>{for(let n of e){let o={...n,uuid:qd()};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 ya,matchedRows as qD}from"@stacksjs/database/runtime";import{formatDate as ga}from"@stacksjs/orm";async function Qd(e,t){try{if(!e)throw Error("Product item ID is required for update");let r=await ya.updateTable("products").set({...t,updated_at:ga(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 Yd(e,t){if(!await Ae(e))throw Error(`Product item with ID ${e} not found`);try{return await ya.updateTable("products").set({is_available:t,updated_at:ga(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 Xd(e,t){let r=await Ae(e);if(!r)throw Error(`Product item with ID ${e} not found`);let n={updated_at:ga(new Date)};if(t!==void 0)n.inventory_count=t;if(Object.keys(n).length===1)return r;try{return await ya.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}}var Er={};F(Er,{bulkDestroy:()=>rl,bulkStore:()=>pl,destroy:()=>tl,fetchAll:()=>nl,fetchByCountry:()=>il,fetchById:()=>ol,fetchByUuid:()=>al,fetchFeatured:()=>sl,fetchWithProductCount:()=>ul,store:()=>ml,update:()=>wl,updateByUuid:()=>gl,updateFeaturedStatus:()=>yl});import{db as el}from"@stacksjs/database/runtime";async function tl(e){try{let t=await el.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 rl(e){if(!e.length)return 0;try{let t=await el.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 Te}from"@stacksjs/database/runtime";async function nl(){return P(await Te.selectFrom("manufacturers").selectAll().execute())}async function ol(e){let t=await Te.selectFrom("manufacturers").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function al(e){let t=await Te.selectFrom("manufacturers").where("uuid","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function sl(e=10){let t=await Te.selectFrom("manufacturers").where("featured","=",!0).selectAll().orderBy("manufacturer","asc").limit(e).execute();return P(t)}async function il(e,t={}){let r=t.page||1,n=t.limit||2,o=await Te.selectFrom("manufacturers").select(Te.fn.count("id").as("total")).where("country","=",e).executeTakeFirst(),a=Number(o?.total||0),s=await Te.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 ul(e={}){let t=Te.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",Te.fn.count("p.id").as("product_count")]).groupBy("m.id"),t.execute()}var{randomUUIDv7:dl}=globalThis.Bun;import{db as ll}from"@stacksjs/database/runtime";import{HttpError as cl}from"@stacksjs/error-handling";import{isUniqueViolation as Zg}from"@stacksjs/orm";async function ml(e){try{let t={...e,uuid:dl(),featured:e.featured??!1},r=await ll.insertInto("manufacturers").values(t).returningAll().executeTakeFirst();if(!r)throw Error("Failed to create manufacturer");return w(r)}catch(t){if(t instanceof cl)throw t;if(Zg(t))throw new cl(409,"A manufacturer with this name already exists");if(t instanceof Error)throw Error(`Failed to create manufacturer: ${t.message}`);throw t}}async function pl(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 ll.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 ha}from"@stacksjs/database/runtime";import{HttpError as fl}from"@stacksjs/error-handling";import{formatDate as ba,isUniqueViolation as Qg}from"@stacksjs/orm";async function wl(e,t){try{if(!e)throw Error("Manufacturer ID is required for update");let r=await ha.updateTable("manufacturers").set({...t,updated_at:ba(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!r)return;return w(r)}catch(r){if(r instanceof fl)throw r;if(Qg(r))throw new fl(409,"A manufacturer with this name already exists");if(r instanceof Error)throw Error(`Failed to update manufacturer: ${r.message}`);throw r}}async function yl(e,t){try{let r=await ha.updateTable("manufacturers").set({featured:t,updated_at:ba(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 gl(e,t){try{let r=await ha.updateTable("manufacturers").set({...t,updated_at:ba(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}}var Fr={};F(Fr,{bulkDestroy:()=>_l,destroy:()=>bl,fetchAll:()=>Rl,fetchApprovedByProductId:()=>Dl,fetchById:()=>xl,fetchByProductId:()=>Pl,fetchByUserId:()=>vl,fetchMostHelpfulByProductId:()=>Sl,fetchStats:()=>Tl,fetchStatsByProductIds:()=>El,store:()=>Fl,update:()=>Nl,updateVotes:()=>Ol});import{db as hl}from"@stacksjs/database/runtime";async function bl(e){try{let t=await hl.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 _l(e){if(!e.length)return 0;try{let t=await hl.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 lt}from"@stacksjs/database/runtime";async function xl(e){return w(await lt.selectFrom("reviews").where("id","=",e).selectAll().executeTakeFirst(),!0)}async function Rl(){return P(await lt.selectFrom("reviews").selectAll().execute())}async function Pl(e){return P(await lt.selectFrom("reviews").where("product_id","=",e).selectAll().execute())}async function vl(e){return P(await lt.selectFrom("reviews").where("customer_id","=",e).selectAll().execute())}async function Dl(e){return P(await lt.selectFrom("reviews").where("product_id","=",e).where("is_approved","=",!0).selectAll().execute())}async function Sl(e){return P(await lt.selectFrom("reviews").where("product_id","=",e).orderBy("helpful_votes","desc").selectAll().execute())}import{db as Cl}from"@stacksjs/database/runtime";function kl(){return{total:0,rated:0,commentsOnly:0,average:0,distribution:{1:0,2:0,3:0,4:0,5:0}}}function Al(e){let t=kl();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 Tl(e){let t=await Cl.selectFrom("reviews").select(["rating"]).where("product_id","=",e).where("is_approved","=",!0).execute();return Al(t)}async function El(e){let t=new Map;for(let o of e)t.set(o,kl());if(e.length===0)return t;let r=await Cl.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,Al(a));return t}var{randomUUIDv7:Yg}=globalThis.Bun;import{db as Xg}from"@stacksjs/database/runtime";function eh(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 Fl(e){try{if(eh(e))throw Error("A review needs a rating or something written: both were empty");let t={...e,uuid:Yg(),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 Xg.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 Il,sqlHelpers as th}from"@stacksjs/database/runtime";import{env as rh}from"@stacksjs/env";import{formatDate as Ml}from"@stacksjs/orm";async function Nl(e,t){try{if(!e)throw Error("Review ID is required for update");let r=await Il.updateTable("reviews").set({...t,updated_at:Ml(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 Ol(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}=th(rh.DB_CONNECTION||"sqlite"),s=await Il.unsafe(`UPDATE "reviews" SET "${n}" = ${o}, "updated_at" = ${a(1)} WHERE "id" = ${a(2)} RETURNING *`,[Ml(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}}var Nr={};F(Nr,{bulkDestroy:()=>Jl,bulkStore:()=>Gl,bulkUpdate:()=>Kl,destroy:()=>Bl,fetchAll:()=>Ll,fetchById:()=>Wl,formatUnitOptions:()=>Vl,getDefaultUnit:()=>ql,store:()=>zl,update:()=>Hl,updateDefaultStatus:()=>Zl});import{db as $l}from"@stacksjs/database/runtime";async function Bl(e){try{let t=await $l.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 Jl(e){if(!e.length)return 0;try{let t=await $l.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 Ul}from"@stacksjs/database/runtime";async function Wl(e){let t=await Ul.selectFrom("product_units").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function Ll(){return P(await Ul.selectFrom("product_units").selectAll().execute())}var{randomUUIDv7:jl}=globalThis.Bun;import{db as Jt}from"@stacksjs/database/runtime";async function zl(e){try{return await Jt.transaction(async(t)=>{let r={...e,uuid:jl()},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 Gl(e){if(!e.length)return 0;let t=0;try{for(let r of e){let n={...r,uuid:jl()},o=await Jt.insertInto("product_units").values(n).returningAll().executeTakeFirst();if(n.is_default&&n.type&&o)await Jt.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 Vl(e){try{let t=Jt.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 ql(e){try{let t=await Jt.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 Ir,matchedRows as nh}from"@stacksjs/database/runtime";import{formatDate as Mr}from"@stacksjs/orm";async function Hl(e,t){try{if(!e)throw Error("Product unit ID is required for update");return await Ir.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:Mr(new Date)}).where("type","=",o).where("id","!=",e).execute();let s=await r.updateTable("product_units").set({...t,updated_at:Mr(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 Kl(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 nh(Ir.updateTable("product_units").set({...o,updated_at:Mr(new Date)}).where("id","=",n.id)),s=o;if(s.is_default===!0&&s.type)await Ir.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 Zl(e,t){try{return await Ir.transaction(async(r)=>{let n=await r.selectFrom("product_units").select("type").where("id","=",e).executeTakeFirst();if(!n)return!1;let o=Mr(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}}var Or={};F(Or,{bulkDestroy:()=>Xl,bulkStore:()=>sm,bulkUpdate:()=>mm,destroy:()=>Yl,fetchAll:()=>rm,fetchById:()=>tm,formatVariantOptions:()=>im,generateVariantCombinations:()=>um,store:()=>am,update:()=>lm});import{db as Ql}from"@stacksjs/database/runtime";async function Yl(e){try{let t=await Ql.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 Xl(e){if(!e.length)return 0;try{let t=await Ql.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 em}from"@stacksjs/database/runtime";async function tm(e){let t=await em.selectFrom("product_variants").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function rm(){return P(await em.selectFrom("product_variants").selectAll().execute())}var{randomUUIDv7:nm}=globalThis.Bun;import{db as om}from"@stacksjs/database/runtime";async function am(e){try{let t={...e,uuid:nm()},r=await om.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 sm(e){if(!e.length)return 0;let t=0;try{for(let r of e){let n={...r,uuid:nm()};await om.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 im(e){if(!e||!e.length)return JSON.stringify([]);let t=e.map((r)=>r.trim()).filter(Boolean);return JSON.stringify(t)}function um(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 cm,matchedRows as oh}from"@stacksjs/database/runtime";import{formatDate as dm}from"@stacksjs/orm";async function lm(e,t){try{let r=await cm.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 mm(e){if(!e.length)return 0;let t=0;try{for(let r of e){if(!r.id)continue;if((await oh(cm.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 ah={categories:Ar,items:Tr,manufacturers:Er,reviews:Fr,units:Nr,variants:Or},sh=ah;var Sa={};F(Sa,{bulkDestroy:()=>wm,bulkStore:()=>vm,destroy:()=>fm,fetchAll:()=>ym,fetchById:()=>mt,fetchPageStats:()=>bm,fetchPrintJobStats:()=>gm,fetchPrintTimeStats:()=>_m,fetchPrintsPerHour:()=>xm,fetchSuccessRate:()=>hm,store:()=>Pm,update:()=>Dm,updatePrintJob:()=>Cm,updateStatus:()=>Sm});import{db as pm}from"@stacksjs/database/runtime";async function fm(e){try{let t=await pm.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 wm(e){if(!e.length)return 0;try{let t=await pm.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 xa}from"@stacksjs/database/runtime";import{formatDate as ih}from"@stacksjs/orm";function be(e){return ih(e)}function uh(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 mt(e){let t=await xa.selectFrom("receipts").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function ym(){return P(await xa.selectFrom("receipts").selectAll().execute())}async function gm(e,t){let r=be(e),n=be(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 hm(e,t){let r=be(e),n=be(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 bm(e,t){let r=be(e),n=be(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 _m(e,t){let r=be(e),n=be(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 xm(e,t){let r=typeof e==="number"?e:e.getTime(),n=typeof t==="number"?t:t.getTime(),o=be(e),a=be(t),s=await xa.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=uh(m.timestamp);if(!l)return;d[l.getHours()].count++}),{totalPrints:i,totalHours:u,printsPerHour:c,hourlyBreakdown:d}}var{randomUUIDv7:Rm}=globalThis.Bun;import{db as Pa}from"@stacksjs/database/runtime";import{formatDate as Ra}from"@stacksjs/orm";function Ut(e){try{if(typeof e==="number")return Ra(e<=2147483647?e*1000:e);if(typeof e==="string"&&/^\d{10}$/.test(e))return Ra(Number(e)*1000);return Ra(e)}catch{throw TypeError("Receipt timestamp must be a valid date")}}async function Pm(e){try{let t=Rm(),r={...e,timestamp:Ut(e.timestamp),uuid:t};await Pa.insertInto("receipts").values(r).executeTakeFirst();let n=await Pa.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 vm(e){if(!e.length)return 0;try{let t=e.map((n)=>({...n,timestamp:Ut(n.timestamp),uuid:Rm()})),r=await Pa.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 va}from"@stacksjs/database/runtime";import{formatDate as Da}from"@stacksjs/orm";async function Dm(e,t){try{if(!e)throw Error("Receipt ID is required for update");let r={...t,...t.timestamp===void 0?{}:{timestamp:Ut(t.timestamp)},updated_at:Da(new Date)};await va.updateTable("receipts").set(r).where("id","=",e).execute();let n=await mt(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 Sm(e,t){try{await va.updateTable("receipts").set({status:t,updated_at:Da(new Date)}).where("id","=",e).execute();let r=await mt(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 Cm(e,t,r,n){try{let o={updated_at:Da(new Date)};if(t!==void 0)o.size=t;if(r!==void 0)o.pages=r;if(n!==void 0)o.duration=n;await va.updateTable("receipts").set(o).where("id","=",e).execute();let a=await mt(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}}var Qa={};F(Qa,{couriers:()=>Vr,default:()=>Fh,digital:()=>zr,geocoding:()=>Zr,licenses:()=>Xr,methods:()=>nn,rates:()=>cn,routes:()=>Lr,tracking:()=>gn,zones:()=>xn});var Lr={};F(Lr,{DeliveryRouteInputError:()=>se,bulkDestroy:()=>Tm,destroy:()=>Am,fetchActive:()=>Fm,fetchAll:()=>Em,fetchByCourier:()=>Im,fetchById:()=>Br,store:()=>Mm,update:()=>Om,updateLastActive:()=>Nm,updateMetrics:()=>Bm,updateStops:()=>$m,validateDeliveryRouteWrite:()=>pt});import{db as km}from"@stacksjs/database/runtime";async function Am(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 Tm(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 $r}from"@stacksjs/database/runtime";async function Br(e){return await $r.selectFrom("delivery_routes").where("id","=",e).selectAll().executeTakeFirst()}async function Em(){return await $r.selectFrom("delivery_routes").selectAll().execute()}async function Fm(){return await $r.selectFrom("delivery_routes").where("last_active",">=",Date.now()-86400000).selectAll().execute()}async function Im(e){return await $r.selectFrom("delivery_routes").where("courier","=",e).selectAll().execute()}var{randomUUIDv7:lh}=globalThis.Bun;import{db as Ca}from"@stacksjs/database/runtime";function Ye(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 Wt(e){return Ye(e,{name:["name"],description:["description"],base_rate:["base_rate","baseRate"],free_shipping:["free_shipping","freeShipping"],status:["status"]})}function Ee(e){return Ye(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 Lt(e){return Ye(e,{name:["name"],countries:["countries"],regions:["regions"],postal_codes:["postal_codes","postalCodes"],status:["status"],shipping_method_id:["shipping_method_id","shippingMethodId","shippingmethod_id"]})}function jt(e){return Ye(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 zt(e){return Ye(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 Gt(e){return Ye(e,{name:["name"],phone:["phone"],vehicle_number:["vehicle_number","vehicleNumber"],license:["license"],status:["status"],user_id:["user_id","userId"]})}function Jr(e){return Ye(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 ch}from"@stacksjs/database/runtime";class se extends TypeError{constructor(e){super(e);this.name="DeliveryRouteInputError"}}function Ur(e,t,r){return Number(e[r]??t?.[r])}function dh(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 pt(e,t){let r=Ur(e,t,"courier_id"),n=Ur(e,t,"stops"),o=Ur(e,t,"delivery_time"),a=Ur(e,t,"total_distance"),s=dh(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 ch.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 Mm(e){try{let t=lh(),r=Jr(e),o={...await pt(r),uuid:t};await Ca.insertInto("delivery_routes").values(o).executeTakeFirst();let a=await Ca.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 Nm(e){try{await Ca.updateTable("delivery_routes").set({last_active:Date.now(),updated_at:new Date().toISOString()}).where("id","=",e).execute();let t=await Br(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 Wr}from"@stacksjs/database/runtime";import{formatDate as ka}from"@stacksjs/orm";async function Om(e,t){try{if(!e)throw Error("Delivery route ID is required for update");let r=await Wr.selectFrom("delivery_routes").where("id","=",e).selectAll().executeTakeFirst();if(!r)return;let n=Jr(t),o=await pt(n,r),a=await Wr.updateTable("delivery_routes").set({...o,updated_at:ka(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 $m(e,t){try{let r=await Wr.updateTable("delivery_routes").set({stops:t,updated_at:ka(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 Bm(e,t,r){try{let n={updated_at:ka(new Date)};if(t!==void 0)n.delivery_time=t;if(r!==void 0)n.total_distance=r;let o=await Wr.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}}var zr={};F(zr,{bulkDestroy:()=>Lm,bulkSoftDelete:()=>jm,bulkStore:()=>Km,destroy:()=>Um,fetchAll:()=>Vm,fetchById:()=>Gm,softDelete:()=>Wm,store:()=>Hm,update:()=>Zm,updateDeliverySettings:()=>Ym,updateStatus:()=>Qm});import{db as jr,matchedRows as Jm}from"@stacksjs/database/runtime";async function Um(e){try{let t=await jr.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 Wm(e){try{return(await Jm(jr.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 Lm(e){if(!e.length)return 0;try{let t=await jr.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 jm(e){if(!e.length)return 0;try{return(await Jm(jr.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 zm}from"@stacksjs/database/runtime";async function Gm(e){let t=await zm.selectFrom("digital_deliveries").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function Vm(){return P(await zm.selectFrom("digital_deliveries").selectAll().execute())}var{randomUUIDv7:qm}=globalThis.Bun;import{db as Aa}from"@stacksjs/database/runtime";async function Hm(e){try{let t=qm(),r={...jt(e),uuid:t};await Aa.insertInto("digital_deliveries").values(r).executeTakeFirst();let n=await Aa.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 Km(e){if(!e.length)return 0;try{let t=e.map((n)=>({...jt(n),uuid:qm()})),r=await Aa.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 Ta}from"@stacksjs/database/runtime";import{formatDate as Ea}from"@stacksjs/orm";async function Zm(e,t){try{if(!e)throw Error("Digital delivery ID is required for update");let r=await Ta.updateTable("digital_deliveries").set({...jt(t),updated_at:Ea(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 Qm(e,t){try{let r=await Ta.updateTable("digital_deliveries").set({status:t,updated_at:Ea(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 Ym(e,t,r,n,o){try{let a={updated_at:Ea(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 Ta.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}}var Vr={};F(Vr,{bulkDestroy:()=>np,bulkStore:()=>sp,destroy:()=>rp,fetchAll:()=>ep,fetchById:()=>Gr,store:()=>ap,update:()=>ip,updateContact:()=>cp,updateStatus:()=>up});import{db as tp}from"@stacksjs/database/runtime";import{db as Xm}from"@stacksjs/database/runtime";async function Gr(e){let t=await Xm.selectFrom("couriers").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function ep(){return P(await Xm.selectFrom("couriers").selectAll().execute())}async function rp(e){try{let t=await tp.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 np(e){if(!e.length)return 0;let t=0;try{return await tp.transaction(async(r)=>{for(let n of e)if(await Gr(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:op}=globalThis.Bun;import{db as Fa}from"@stacksjs/database/runtime";async function ap(e){try{let t=op(),r={...Gt(e),uuid:t};await Fa.insertInto("couriers").values(r).executeTakeFirst();let n=await Fa.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 sp(e){if(!e.length)return 0;try{let t=e.map((n)=>({...Gt(n),uuid:op()})),r=await Fa.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 Ia}from"@stacksjs/database/runtime";import{formatDate as Ma}from"@stacksjs/orm";async function ip(e,t){try{if(!e)throw Error("Courier ID is required for update");let r=await Ia.updateTable("couriers").set({...Gt(t),updated_at:Ma(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 up(e,t){try{let r=await Ia.updateTable("couriers").set({status:t,updated_at:Ma(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 cp(e,t){try{let r={updated_at:Ma(new Date)};if(t!==void 0)r.phone=t;let n=await Ia.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 Zr={};F(Zr,{PRECISION_RANK:()=>qt,checkCoverage:()=>gh,formatQuery:()=>ft,geocode:()=>yh,geocodingDriver:()=>wp,nominatimDriver:()=>Kr,setGeocodingDriver:()=>wh});var Xe=(e)=>e*Math.PI/180;function Je(e,t){let r=Xe(t.latitude-e.latitude),n=Xe(t.longitude-e.longitude),o=Xe(e.latitude),a=Xe(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 qr(e,t){let r=Xe(e.latitude),n=Xe(t.latitude),o=Xe(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 Hr(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 dp(e,t,r){return Je(e,t)<=r}function Vt(e){return typeof e?.latitude==="number"&&typeof e?.longitude==="number"&&Number.isFinite(e.latitude)&&Number.isFinite(e.longitude)}var qt={unknown:0,locality:1,postal:2,street:3,rooftop:4};function ft(e){return[e.street,e.city,e.region,e.postalCode,e.country].map((t)=>String(t??"").trim()).filter(Boolean).join(", ")}var mh="https://nominatim.openstreetmap.org/search",lp=1000,mp=0,pp=Promise.resolve();async function ph(e){let t=pp.then(async()=>{let r=Date.now()-mp;if(r<lp)await Bun.sleep(lp-r);return mp=Date.now(),e()});return pp=t.then(()=>{return},()=>{return}),t}function fh(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 Kr(e={}){let t=e.userAgent??`${process.env.APP_NAME??"Stacks"} (${process.env.APP_URL??"stacks-app"})`,r=e.endpoint??mh;return{name:"nominatim",async geocode(n){let o=ft(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 ph(()=>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=fh(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 fp=null;function wh(e){fp=e}function wp(){return fp??Kr()}async function yh(e,t={}){let r=t.driver??wp(),n=t.minimumPrecision??"street",o=`geocode:${r.name}:${ft(e).toLowerCase()}`,a=await hh(o);if(a!==void 0)return a;let s=await r.geocode(e),i=s&&qt[s.precision]>=qt[n]?s:null;return await bh(o,i,i?t.cacheSeconds??2592000:600),i}function gh(e,t,r){if(t.length===0)return null;let n=t[0],o=Je(e,n);for(let a of t.slice(1)){let s=Je(e,a);if(s<o)o=s,n=a}return{covered:o<=r,distanceMeters:Math.round(o),nearest:n}}async function hh(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 bh(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{}}var Xr={};F(Xr,{LicenseKeyInputError:()=>G,bulkDestroy:()=>bp,bulkSoftDelete:()=>_p,bulkStore:()=>kp,destroy:()=>gp,fetchAll:()=>Pp,fetchById:()=>Rp,softDelete:()=>hp,store:()=>Cp,update:()=>Ap,updateExpiration:()=>Ep,updateStatus:()=>Tp,validateLicenseKeyWrite:()=>et});import{db as Qr,matchedRows as yp}from"@stacksjs/database/runtime";async function gp(e){try{let t=await Qr.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 hp(e){try{return(await yp(Qr.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 bp(e){if(!e.length)return 0;try{let t=await Qr.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 _p(e){if(!e.length)return 0;try{return(await yp(Qr.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 xp}from"@stacksjs/database/runtime";async function Rp(e){let t=await xp.selectFrom("license_keys").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function Pp(){return P(await xp.selectFrom("license_keys").selectAll().execute())}var{randomUUIDv7:Sp}=globalThis.Bun;import{db as $a}from"@stacksjs/database/runtime";import{db as Na}from"@stacksjs/database/runtime";var vp=["Standard License","Premium License","Enterprise License"],Dp=["active","inactive","unassigned"];class G extends TypeError{constructor(e){super(e);this.name="LicenseKeyInputError"}}function Ht(e,t,r){return e[r]!==void 0?e[r]:t?.[r]}function Oa(e,t,r,n){let o=Ht(e,t,r);if(o===void 0||o===null||o==="")return null;let a=Number(o);if(!Number.isSafeInteger(a)||a<1)throw new G(`${n} must be a positive integer or null.`);return a}function _h(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 et(e,t){let r=String(Ht(e,t,"key")||"").trim().toUpperCase(),n=String(Ht(e,t,"template")||""),o=String(Ht(e,t,"status")||""),a=_h(Ht(e,t,"expiry_date")),s=Oa(e,t,"customer_id","Customer"),i=Oa(e,t,"product_id","Product"),u=Oa(e,t,"order_id","Order");if(!/^[A-Z0-9]{4}(?:-[A-Z0-9]{4}){4}$/.test(r))throw new G("License key must use five groups of four uppercase letters or numbers.");if(!vp.includes(n))throw new G(`Template must be one of: ${vp.join(", ")}.`);if(!Dp.includes(o))throw new G(`Status must be one of: ${Dp.join(", ")}.`);if(!Number.isSafeInteger(a)||a<0||a>2147483647)throw new G("Expiry date must be a Unix timestamp between 1970 and 2038.");let[c,d,m]=await Promise.all([s?Na.selectFrom("customers").where("id","=",s).select("id").executeTakeFirst():null,i?Na.selectFrom("products").where("id","=",i).select("id").executeTakeFirst():null,u?Na.selectFrom("orders").where("id","=",u).select(["id","customer_id"]).executeTakeFirst():null]);if(s&&!c)throw new G(`Customer ${s} was not found.`);if(i&&!d)throw new G(`Product ${i} was not found.`);if(u&&!m)throw new G(`Order ${u} was not found.`);if(s&&m?.customer_id&&Number(m.customer_id)!==s)throw new G(`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 Cp(e){try{let t=Sp(),r=zt(e),n={...await et(r),uuid:t};await $a.insertInto("license_keys").values(n).executeTakeFirst();let o=await $a.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 G)throw t;if(t instanceof Error){if(t.message.includes("UNIQUE constraint failed: license_keys.key"))throw new G("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 et(zt(n)),uuid:Sp()}))),r=await $a.insertInto("license_keys").values(t).executeTakeFirst();return _(r)}catch(t){if(t instanceof G)throw t;if(t instanceof Error)throw TypeError(`Failed to create license keys in bulk: ${t.message}`);throw t}}import{db as Yr}from"@stacksjs/database/runtime";import{formatDate as Ba}from"@stacksjs/orm";async function Ap(e,t){try{if(!e)throw Error("License key ID is required for update");let r=await Yr.selectFrom("license_keys").where("id","=",e).selectAll().executeTakeFirst();if(!r)return;let n=zt(t),o=await et(n,r),a=await Yr.updateTable("license_keys").set({...o,updated_at:Ba(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!a)return;return w(a)}catch(r){if(r instanceof G)throw r;if(r instanceof Error){if(r.message.includes("UNIQUE constraint failed: license_keys.key"))throw new G("A license key with this value already exists.");throw TypeError(`Failed to update license key: ${r.message}`)}throw r}}async function Tp(e,t){try{let r=await Yr.updateTable("license_keys").set({status:t,updated_at:Ba(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 Ep(e,t){try{let r={updated_at:Ba(new Date)};if(t!==void 0)r.expiry_date=t;let n=await Yr.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}}var nn={};F(nn,{bulkDestroy:()=>Np,bulkSoftDelete:()=>Op,bulkStore:()=>Up,destroy:()=>Ip,fetchAll:()=>$p,fetchById:()=>rn,formatShippingOptions:()=>Wp,getActiveShippingMethods:()=>Lp,softDelete:()=>Mp,store:()=>Jp,update:()=>jp,updatePricing:()=>Gp,updateStatus:()=>zp});import{db as en,matchedRows as Fp}from"@stacksjs/database/runtime";async function Ip(e){try{let t=await en.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 Mp(e){try{return(await Fp(en.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 Np(e){if(!e.length)return 0;try{let t=await en.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 Op(e){if(!e.length)return 0;try{return(await Fp(en.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 tn}from"@stacksjs/database/runtime";async function rn(e){let t=await tn.selectFrom("shipping_methods").where("id","=",e).selectAll().executeTakeFirst();if(t){let r=await tn.selectFrom("shipping_zones").where("shipping_method_id","=",e).selectAll().execute();return{...t,shippingZones:r}}return}async function $p(){let e=await tn.selectFrom("shipping_methods").selectAll().execute();if(e.length===0)return[];let t=[...new Set(e.map((a)=>a.id))],o=(await tn.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:Bp}=globalThis.Bun;import{db as Kt}from"@stacksjs/database/runtime";async function Jp(e){try{let t=Bp(),r={...Wt(e),uuid:t};await Kt.insertInto("shipping_methods").values(r).executeTakeFirst();let n=await Kt.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 Up(e){if(!e.length)return 0;try{let t=e.map((n)=>({...Wt(n),uuid:Bp()})),r=await Kt.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 Wp(){try{return Kt.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 Lp(){try{let e=await Kt.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 Ja}from"@stacksjs/database/runtime";import{formatDate as Ua}from"@stacksjs/orm";async function jp(e,t){try{if(!e)throw Error("Shipping method ID is required for update");let r=await Ja.updateTable("shipping_methods").set({...Wt(t),updated_at:Ua(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 zp(e,t){try{let r=await Ja.updateTable("shipping_methods").set({status:t,updated_at:Ua(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 Gp(e,t,r){try{let n={updated_at:Ua(new Date)};if(t!==void 0)n.base_rate=t;if(r!==void 0)n.free_shipping=r;let o=await Ja.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}}var cn={};F(cn,{ShippingRateInputError:()=>Y,bulkDestroy:()=>qp,bulkStore:()=>lf,bulkUpdate:()=>pf,destroy:()=>Vp,destroyByMethod:()=>Kp,destroyByZone:()=>Hp,fetchAll:()=>Yp,fetchById:()=>Qp,formatShippingRateOptions:()=>rf,getRateByWeightAndAddress:()=>ef,getRateByWeightAndZone:()=>Wa,getRatesByZone:()=>Xp,getShippingRatesByMethod:()=>nf,resolveZoneForAddress:()=>an,store:()=>df,update:()=>mf,updateByMethod:()=>wf,updateByZone:()=>ff,validateShippingRateWrite:()=>tt,validateZoneMatchesAddress:()=>tf});import{db as on}from"@stacksjs/database/runtime";async function Vp(e){try{let t=await on.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 qp(e){if(!e.length)return 0;try{let t=await on.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 Hp(e){try{let t=await on.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 Kp(e){try{let t=await on.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 Qp(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 Yp(){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 Xp(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 Wa(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 an(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&&Zp(n.regions,e.region))o=2;if(e.postalCode&&n.postal_codes&&Zp(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 ef(e,t){let r=await an(t);if(r==null)return;return Wa(e,r)}async function tf(e,t){return await an(t)===e}function Zp(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 rf(){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 nf(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:cf}=globalThis.Bun;import{db as La}from"@stacksjs/database/runtime";import{db as Zt}from"@stacksjs/database/runtime";async function of(){return P(await Zt.selectFrom("shipping_zones").selectAll().execute())}async function sn(e){let t=await Zt.selectFrom("shipping_zones").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}function af(){try{return Zt.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 sf(){try{let e=await Zt.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 uf(e){try{let t=await Zt.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 Qt(e,t,r){return Number(e[r]??t?.[r])}async function tt(e,t){let r=Qt(e,t,"shipping_method_id"),n=Qt(e,t,"shipping_zone_id"),o=Qt(e,t,"weight_from"),a=Qt(e,t,"weight_to"),s=Qt(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([rn(r),sn(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 df(e){try{let t=Ee(e),r=Number(t.shipping_method_id),n=Number(t.shipping_zone_id);await tt(t);let o=cf(),a={...t,shipping_method_id:r,shipping_zone_id:n,uuid:o};await La.insertInto("shipping_rates").values(a).executeTakeFirst();let s=await La.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 lf(e){if(!e.length)return 0;try{for(let n of e){let o=Ee(n);await tt(o)}let t=e.map((n)=>({...Ee(n),uuid:cf()})),r=await La.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 Yt,matchedRows as ja}from"@stacksjs/database/runtime";import{formatDate as un}from"@stacksjs/orm";async function mf(e,t){try{if(!e)throw Error("Shipping rate ID is required for update");let r=await Yt.selectFrom("shipping_rates").where("id","=",e).selectAll().executeTakeFirst();if(!r)return;let n=Ee(t);await tt(n,r);let o=await Yt.updateTable("shipping_rates").set({...n,updated_at:un(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 pf(e){if(!e.length)return 0;try{let t=0;for(let{id:r,data:n}of e)if((await ja(Yt.updateTable("shipping_rates").set({...Ee(n),updated_at:un(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 ff(e,t){try{return(await ja(Yt.updateTable("shipping_rates").set({...Ee(t),updated_at:un(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 wf(e,t){try{return(await ja(Yt.updateTable("shipping_rates").set({...Ee(t),updated_at:un(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}}var gn={};F(gn,{ARRIVAL_RADIUS_METERS:()=>Va,NEARBY_RADIUS_METERS:()=>Ga,assignStop:()=>gf,bearingInDegrees:()=>qr,broadcastToChannel:()=>Fe,completeStop:()=>bf,distanceInMeters:()=>Je,emitDeliveryArrived:()=>fn,emitDeliveryAssigned:()=>ln,emitDeliveryCompleted:()=>wn,emitDeliveryFailed:()=>yn,emitDeliveryNearby:()=>pn,emitDeliveryPosition:()=>dn,emitDeliveryStarted:()=>mn,estimateSecondsRemaining:()=>Hr,failStop:()=>_f,hasCoordinates:()=>Vt,isWithin:()=>dp,orderTrackingChannel:()=>Ue,recordCourierPing:()=>yf,routeTrackingChannel:()=>za,startRoute:()=>xf,startStop:()=>hf});function Ue(e){return`order.${e}`}function za(e){return`delivery-route.${e}`}async function wt(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 Fe(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 dn(e,t,r){await Promise.all([...e.map((n)=>Fe(Ue(n),"delivery:position",r)),t==null?Promise.resolve():Fe(za(t),"delivery:position",r)])}async function ln(e){if(await wt("delivery:assigned",{stop:e}),e.order_id!=null)await Fe(Ue(e.order_id),"delivery:assigned",{stop:e})}async function mn(e){if(await wt("delivery:started",{stop:e}),e.order_id!=null)await Fe(Ue(e.order_id),"delivery:started",{stop:e})}async function pn(e,t,r){if(await wt("delivery:nearby",{stop:e,distanceMeters:t,etaSeconds:r}),e.order_id!=null)await Fe(Ue(e.order_id),"delivery:nearby",{stop:e,distanceMeters:t,etaSeconds:r})}async function fn(e){if(await wt("delivery:arrived",{stop:e}),e.order_id!=null)await Fe(Ue(e.order_id),"delivery:arrived",{stop:e})}async function wn(e){if(await wt("delivery:completed",{stop:e}),e.order_id!=null)await Fe(Ue(e.order_id),"delivery:completed",{stop:e})}async function yn(e,t){await wt("delivery:failed",{stop:e,reason:t})}var{randomUUIDv7:xh}=globalThis.Bun;import{db as Ie}from"@stacksjs/database/runtime";var Ga=400,Va=60,Rh=250;async function yf(e){let t=e.recordedAt??new Date().toISOString(),r=typeof e.accuracy!=="number"||e.accuracy<=Rh,n=await Ie.selectFrom("couriers").where("id","=",e.courierId).select(["id","latitude","longitude"]).executeTakeFirst();if(!n)throw Error(`Unknown courier: ${e.courierId}`);let o=Vt(n)?{latitude:n.latitude,longitude:n.longitude}:null,a=typeof e.heading==="number"?e.heading:o?qr(o,e):null,s=await Ph(e.courierId),i=s?await vh(s.id):null,u=null,c=null,d=!1,m=!1,l=i&&Vt({latitude:i.latitude??void 0,longitude:i.longitude??void 0})?{latitude:i.latitude,longitude:i.longitude}:null;if(r&&i&&l)u=Math.round(Je(e,l)),c=Hr(u,e.speed??0),m=u<=Va&&i.arrived_at==null,d=!m&&u<=Ga&&i.status==="en_route"&&i.notified_nearby_at==null;let y=await Dh({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 Ie.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 Ie.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 dn(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 Ie.updateTable("delivery_stops").set({notified_nearby_at:t}).where("id","=",i.id).execute(),await pn(i,u,c);if(m&&i)await Ie.updateTable("delivery_stops").set({status:"arrived",arrived_at:t}).where("id","=",i.id).execute(),await fn({...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 Ph(e){return await Ie.selectFrom("delivery_routes").where("courier_id","=",e).where("status","=","active").select(["id"]).orderBy("id","desc").executeTakeFirst()??null}async function vh(e){let t=await Ie.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 Dh(e){let t=xh();return await Ie.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 Ie.selectFrom("courier_pings").where("uuid","=",t).select(["id"]).executeTakeFirst())?.id??null}var{randomUUIDv7:Sh}=globalThis.Bun;import{db as X}from"@stacksjs/database/runtime";function qa(e){return e.type==="pickup"}async function gf(e){let t=Sh(),r=e.sequence??await kh(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 Th(t);if(n)await ln(n);return n??{}}async function hf(e){await X.updateTable("delivery_stops").set({status:"en_route"}).where("id","=",e).execute();let t=await Ka(e);if(!t)return null;if(t.order_id!=null&&!qa(t))await Ha(t.order_id,"OUT_FOR_DELIVERY");return await mn(t),t}async function bf(e,t){let r=new Date().toISOString();await X.updateTable("delivery_stops").set({status:"completed",completed_at:r,...await Ah(e)?{}:{arrived_at:r},...t?{notes:t}:{}}).where("id","=",e).execute();let n=await Ka(e);if(!n)return null;if(n.order_id!=null)await Ha(n.order_id,qa(n)?"OUT_FOR_DELIVERY":"DELIVERED");return await wn(n),await Rf(n.delivery_route_id),n}async function _f(e,t){await X.updateTable("delivery_stops").set({status:"failed",notes:t}).where("id","=",e).execute();let r=await Ka(e);if(!r)return null;if(r.order_id!=null&&!qa(r))await Ha(r.order_id,"SHIPPED");return await yn(r,t),await Rf(r.delivery_route_id),r}async function xf(e){await X.updateTable("delivery_routes").set({status:"active",started_at:new Date().toISOString()}).where("id","=",e).execute()}async function Rf(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 Ha(e,t){let r=await X.selectFrom("orders").where("id","=",e).select(["id","status"]).executeTakeFirst();if(!r)return;let n=await Promise.resolve().then(() => (ct(),{}));let s=Ch(r.status,t,it);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 ut(i,{...r,status:i})}function Ch(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 kh(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 Ah(e){return(await X.selectFrom("delivery_stops").where("id","=",e).select(["arrived_at"]).executeTakeFirst())?.arrived_at!=null}async function Ka(e){return await X.selectFrom("delivery_stops").where("id","=",e).selectAll().executeTakeFirst()??null}async function Th(e){return await X.selectFrom("delivery_stops").where("uuid","=",e).selectAll().executeTakeFirst()??null}var xn={};F(xn,{bulkDestroy:()=>Sf,bulkSoftDelete:()=>Cf,bulkStore:()=>Tf,destroy:()=>vf,fetchAll:()=>of,fetchById:()=>sn,formatZoneOptions:()=>af,getActiveShippingZones:()=>sf,getZonesByCountry:()=>uf,softDelete:()=>Df,store:()=>Af,update:()=>Ef,updateCountries:()=>If,updateRegionsAndPostalCodes:()=>Mf,updateStatus:()=>Ff});import{db as hn,matchedRows as Pf}from"@stacksjs/database/runtime";async function vf(e){try{let t=await hn.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 Df(e){try{return(await Pf(hn.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 Sf(e){if(!e.length)return 0;try{let t=await hn.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 Cf(e){if(!e.length)return 0;try{return(await Pf(hn.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 Za}from"@stacksjs/database/runtime";async function Af(e){try{let t=kf(),r={...Lt(e),uuid:t};await Za.insertInto("shipping_zones").values(r).executeTakeFirst();let n=await Za.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 Tf(e){if(!e.length)return 0;try{let t=e.map((n)=>({...Lt(n),uuid:kf()})),r=await Za.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 bn}from"@stacksjs/database/runtime";import{formatDate as _n}from"@stacksjs/orm";async function Ef(e,t){try{if(!e)throw Error("Shipping zone ID is required for update");let r=await bn.updateTable("shipping_zones").set({...Lt(t),updated_at:_n(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 Ff(e,t){try{let r=await bn.updateTable("shipping_zones").set({status:t,updated_at:_n(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 If(e,t){try{let r=await bn.updateTable("shipping_zones").set({countries:t,updated_at:_n(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 Mf(e,t,r){try{let n={updated_at:_n(new Date)};if(t!==void 0)n.regions=t;if(r!==void 0)n.postal_codes=r;let o=await bn.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 Eh={digital:zr,couriers:Vr,geocoding:Zr,licenses:Xr,methods:nn,rates:cn,routes:Lr,tracking:gn,zones:xn},Fh=Eh;var es={};F(es,{activeTaxRates:()=>Ya,breakdownFor:()=>Xa,bulkDestroy:()=>Bf,bulkStore:()=>Gf,destroy:()=>$f,fetchAll:()=>Wf,fetchById:()=>Uf,store:()=>zf,taxFor:()=>Nf,update:()=>Vf,updateDefaultStatus:()=>Kf,updateRate:()=>Hf,updateStatus:()=>qf});import{db as Ih}from"@stacksjs/database/runtime";function Mh(e){let t=Number(e);return Number.isFinite(t)?t/100:0}async function Ya(e={}){let t=Ih.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??"")))}function Xa(e,t,r={}){let n=Math.max(0,Math.round(e)),o=[],a=0,s=0;for(let i of t){let u=Mh(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 Nf(e,t={}){return Xa(e,await Ya(t),t)}import{db as Of}from"@stacksjs/database/runtime";async function $f(e){try{let t=await Of.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 Bf(e){if(!e.length)return 0;try{let t=await Of.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 Jf}from"@stacksjs/database/runtime";async function Uf(e){let t=await Jf.selectFrom("tax_rates").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function Wf(){return P(await Jf.selectFrom("tax_rates").selectAll().execute())}var{randomUUIDv7:Lf}=globalThis.Bun;import{db as jf}from"@stacksjs/database/runtime";async function zf(e){try{return await jf.transaction(async(t)=>{let r={...e,uuid:Lf()};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 Gf(e){if(!e.length)return 0;try{return await jf.transaction(async(t)=>{let r=0;for(let n of e){let o={...n,uuid:Lf()};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 Rn}from"@stacksjs/database/runtime";import{formatDate as Pn}from"@stacksjs/orm";async function Vf(e,t){try{if(!e)throw Error("Tax rate ID is required for update");return await Rn.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=Pn(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 qf(e,t){try{let r=await Rn.updateTable("tax_rates").set({status:t,updated_at:Pn(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 Hf(e,t){try{let r=await Rn.updateTable("tax_rates").set({rate:t,updated_at:Pn(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 Kf(e,t){try{return await Rn.transaction(async(r)=>{if(!await r.selectFrom("tax_rates").select("id").where("id","=",e).executeTakeFirst())return!1;let o=Pn(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}}var ss={};F(ss,{default:()=>zh,products:()=>Dn,restaurant:()=>gt});var Dn={};F(Dn,{bulkDestroy:()=>Qf,bulkStore:()=>fw,destroy:()=>Zf,fetchAll:()=>Yf,fetchById:()=>Xt,fetchCancelledBetweenDates:()=>aw,fetchConversionRates:()=>uw,fetchCountBetweenDates:()=>cw,fetchCountByAllQuantities:()=>rw,fetchCountByDate:()=>ew,fetchCountByDateGrouped:()=>dw,fetchCountByQuantity:()=>tw,fetchCountBySource:()=>Xf,fetchCountByStatus:()=>iw,fetchNotifiedBetweenDates:()=>nw,fetchPurchasedBetweenDates:()=>ow,fetchWaiting:()=>sw,store:()=>pw,update:()=>vn,updatePartySize:()=>yw,updateStatus:()=>ww});import{db as ts}from"@stacksjs/database/runtime";async function Zf(e){try{let t=await ts.selectFrom("waitlist_products").where("id","=",e).selectAll().executeTakeFirst();if(!t)return;return await ts.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 Qf(e){if(!e.length)return 0;try{let t=await ts.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 Xt(e){let t=await j.selectFrom("waitlist_products").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function Yf(){return P(await j.selectFrom("waitlist_products").selectAll().execute())}async function Xf(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 ew(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 tw(e){return(await j.selectFrom("waitlist_products").select(j.fn.count("id").as("count")).where("quantity","=",e).executeTakeFirst())?.count??0}async function rw(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 nw(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 ow(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 aw(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 sw(){let e=await j.selectFrom("waitlist_products").selectAll().where("status","=","waiting").execute();return P(e)}async function iw(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 uw(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 cw(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 dw(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 rs}from"@stacksjs/database/runtime";import{formatDate as lw}from"@stacksjs/orm";var Nh={notified:"notified_at",purchased:"purchased_at",cancelled:"cancelled_at"};function Oh(e){return typeof e==="number"||e instanceof Date?lw(e):e}function er(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]=Oh(r[o]);let n=Nh[r.status];if(n&&r[n]===void 0&&!t[n])r[n]=lw(new Date);return r}async function pw(e){try{let t=mw(),r={...er(e),uuid:t,status:e.status||"waiting"};await rs.insertInto("waitlist_products").values(r).executeTakeFirst();let n=await rs.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 fw(e){if(!e.length)return 0;try{let t=e.map((n)=>({...er(n),status:n.status||"waiting",uuid:mw()})),r=await rs.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 $h}from"@stacksjs/database/runtime";import{formatDate as Bh}from"@stacksjs/orm";async function vn(e,t){try{if(!e)throw Error("Waitlist product ID is required for update");let r=await Xt(e);if(!r)return;await $h.updateTable("waitlist_products").set({...er(t,r),updated_at:Bh(new Date)}).where("id","=",e).execute();let n=await Xt(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 ww(e,t){return await vn(e,{status:t})}async function yw(e,t){return await vn(e,{quantity:t})}var gt={};F(gt,{bulkDestroy:()=>hw,bulkStore:()=>Jw,destroy:()=>gw,fetchAll:()=>bw,fetchAverageWaitTimes:()=>kw,fetchBetweenDates:()=>vw,fetchById:()=>tr,fetchConversionRates:()=>Cw,fetchCountByAllPartySizes:()=>Pw,fetchCountByDate:()=>xw,fetchCountByPartySize:()=>Rw,fetchCountByTablePreference:()=>_w,fetchCurrentWaitTimes:()=>Mw,fetchNoShowStats:()=>Iw,fetchSeatedBetweenDates:()=>Dw,fetchSeatedStats:()=>Nw,fetchSeatingRate:()=>Fw,fetchTablesTurnedToday:()=>Ew,fetchTimeSeriesStats:()=>Ow,fetchWaiting:()=>Sw,fetchWaitingWithPartySizes:()=>Tw,fetchWaitingWithQuotedTimes:()=>Aw,store:()=>Bw,update:()=>yt,updatePartySize:()=>Ww,updateQueuePosition:()=>jw,updateStatus:()=>Uw,updateWaitTimes:()=>Lw});import{db as ns}from"@stacksjs/database/runtime";async function gw(e){try{let t=await ns.selectFrom("waitlist_restaurants").where("id","=",e).selectAll().executeTakeFirst();if(!t)return;return await ns.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 hw(e){if(!e.length)return 0;try{let t=await ns.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 tr(e){let t=await N.selectFrom("waitlist_restaurants").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function bw(){return P(await N.selectFrom("waitlist_restaurants").selectAll().execute())}async function _w(){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 xw(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 Rw(e){return(await N.selectFrom("waitlist_restaurants").select(N.fn.count("id").as("count")).where("party_size","=",e).executeTakeFirst())?.count??0}async function Pw(){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 vw(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 Dw(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 Sw(){let e=await N.selectFrom("waitlist_restaurants").selectAll().where("status","=","waiting").execute();return P(e)}async function Cw(){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 kw(){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 Aw(){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 Tw(){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 Ew(){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 Fw(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 Iw(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,h)=>p+(h.quoted_wait_time??0),0),d=i>0?c/i:0,m=s.reduce((p,h)=>p+h.party_size,0),l=i>0?m/i:0,y=s.reduce((p,h)=>(p[h.table_preference]=(p[h.table_preference]||0)+1,p),{}),b=s.reduce((p,h)=>(p[h.party_size]=(p[h.party_size]||0)+1,p),{});return{totalNoShows:i,noShowRate:u,averageQuotedWaitTime:d,averagePartySize:l,breakdownByTablePreference:y,breakdownByPartySize:b}}async function Mw(){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 Nw(){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 Ow(){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:$w}=globalThis.Bun;import{db as as}from"@stacksjs/database/runtime";import{formatDate as os}from"@stacksjs/orm";var Jh={seated:"seated_at",no_show:"no_show_at",cancelled:"cancelled_at"};function Uh(e){if(typeof e==="number")return os(e<=2147483647?e*1000:e);if(e instanceof Date)return os(e);return e}function rr(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]=Uh(r[o]);let n=Jh[r.status];if(n&&r[n]===void 0&&!t[n])r[n]=os(new Date);return r}async function Bw(e){try{let t=$w(),r={...rr(e),status:e.status||"waiting",uuid:t};await as.insertInto("waitlist_restaurants").values(r).executeTakeFirst();let n=await as.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 Jw(e){if(!e.length)return 0;try{let t=e.map((n)=>({...rr(n),status:n.status||"waiting",uuid:$w()})),r=await as.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 Wh}from"@stacksjs/database/runtime";import{formatDate as Lh}from"@stacksjs/orm";async function yt(e,t){try{if(!e)throw Error("Restaurant waitlist entry ID is required for update");let r=await tr(e);if(!r)return;await Wh.updateTable("waitlist_restaurants").set({...rr(t,r),updated_at:Lh(new Date)}).where("id","=",e).execute();let n=await tr(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 Uw(e,t){return await yt(e,{status:t})}async function Ww(e,t){return await yt(e,{party_size:t})}async function Lw(e,t,r){return await yt(e,{quoted_wait_time:t,...r===void 0?{}:{actual_wait_time:r}})}async function jw(e,t){return await yt(e,{queue_position:t})}var jh={products:Dn,restaurant:gt},zh=jh;var Gh={auctions:Xn,carts:eo,coupons:$o,customers:Bo,devices:jo,errors:Vo,giftCards:Ko,orders:ma,payments:pa,products:_a,receipts:Sa,restaurant:gt,shippings:Qa,tax:es,waitlists:ss},L0=Gh;export{I as PriceFormatError,Xn as auctions,eo as carts,ru as catalogImport,Gh as commerce,$o as coupons,J as currencyExponent,Bo as customers,ee as decimalToMinor,L0 as default,jo as devices,Vo as errors,Ss as formatCurrency,ne as formatMinor,Ko as giftCards,Pe as minorToDecimal,Cs as minorToInput,to as minorToMajor,Ts as money,ro as moneyInputError,ks as moneyInputStep,ma as orders,As as parseMoneyInput,pa as payments,_a as products,Sa as receipts,gt as restaurant,Qa as shippings,es as tax,ss as waitlists};
28
+ AND COALESCE(refund_amount, 0) + ${n(5)} <= amount`,[t,t,o,e,t]);if(Wg(a)>0){let l=await Ye(e);if(l)return l;throw Error(`Payment with ID ${e} disappeared during refund`)}let s=await Ye(e);if(!s)throw Error(`Payment with ID ${e} not found`);let i=String(s.status||"");if(!zg.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`)}var _a={};F(_a,{categories:()=>Ar,default:()=>ih,items:()=>Tr,manufacturers:()=>Er,reviews:()=>Fr,units:()=>Nr,variants:()=>Or});var Ar={};F(Ar,{bulkRemove:()=>Td,compareCategoryGrowth:()=>Sd,deactivate:()=>Fd,deactivateChildCategories:()=>Id,fetchActive:()=>xd,fetchAll:()=>fa,fetchByDisplayOrder:()=>vd,fetchById:()=>Z,fetchByName:()=>_d,fetchCategoryTree:()=>Cd,fetchChildCategories:()=>Pd,fetchRootCategories:()=>Rd,fetchStats:()=>Dd,findOrCreateByName:()=>Nd,remove:()=>Ad,removeChildCategories:()=>Ed,store:()=>wa,update:()=>Od,updateActiveStatus:()=>Bd,updateDisplayOrder:()=>$d,updateParent:()=>Jd});import{db as $t,matchedRows as Gg}from"@stacksjs/database/runtime";import{formatDate as kd}from"@stacksjs/orm";import{db as L}from"@stacksjs/database/runtime";import{formatDate as Ot}from"@stacksjs/orm";async function fa(){return await L.selectFrom("categories").selectAll().execute()}async function Z(e){return await L.selectFrom("categories").where("id","=",e).selectAll().executeTakeFirst()}async function _d(e){return await L.selectFrom("categories").where("name","=",e).selectAll().executeTakeFirst()}async function xd(){return await L.selectFrom("categories").where("is_active","=",!0).selectAll().execute()}async function Rd(){return await L.selectFrom("categories").whereNull("parent_category_id").where("is_active","=",!0).selectAll().execute()}async function Pd(e){return await L.selectFrom("categories").where("parent_category_id","=",e).where("is_active","=",!0).selectAll().execute()}async function vd(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 Dd(){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=Ot(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 Sd(e=30){let t=new Date,r=Ot(t),n=new Date;n.setDate(t.getDate()-e);let o=Ot(n),a=new Date(n);a.setDate(a.getDate()-1);let s=Ot(a),i=new Date(a);i.setDate(a.getDate()-e);let u=Ot(i),c=await L.selectFrom("categories").select(L.fn.count("id").as("count")).where("created_at",">=",o).where("created_at","<=",r).executeTakeFirst(),l=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),d=Number(l?.count||0),y=m-d,b=d!==0?y/d*100:m>0?100:0;return{current_period:m,previous_period:d,difference:y,percentage_change:b,days_range:e}}async function Cd(){let e=await fa(),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 Ad(e){let t=await $t.deleteFrom("categories").where("id","=",e).executeTakeFirst();return _(t)>0}async function Td(e){if(!e.length)return 0;let t=await $t.deleteFrom("categories").where("id","in",e).executeTakeFirst();return _(t)}async function Ed(e){let t=await $t.deleteFrom("categories").where("parent_category_id","=",e).executeTakeFirst();return _(t)}async function Fd(e){if(!await Z(e))throw Error(`Category with ID ${e} not found`);let r=await $t.updateTable("categories").set({is_active:!1,updated_at:kd(new Date)}).where("id","=",e).returning("id").executeTakeFirst();return Boolean(r)}async function Id(e){return(await Gg($t.updateTable("categories").set({is_active:!1,updated_at:kd(new Date)}).where("parent_category_id","=",e))).length}var{randomUUIDv7:Vg}=globalThis.Bun;import{db as Md}from"@stacksjs/database/runtime";import{HttpError as Cr}from"@stacksjs/error-handling";import{isUniqueViolation as qg}from"@stacksjs/orm";import{slug as Hg}from"@stacksjs/strings";async function wa(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 Cr(422,"Parent category ID must be a positive integer");if(t&&!await Z(t))throw new Cr(422,`Parent category with ID ${e.parent_category_id} not found`);let r={...e,uuid:Vg(),is_active:e.is_active??!0,parent_category_id:e.parent_category_id||null},n=await Md.insertInto("categories").values(r).returningAll().executeTakeFirst();if(!n)throw Error("Failed to create category");return n}catch(t){if(t instanceof Cr)throw t;if(qg(t))throw new Cr(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 Nd(e){if(!e.name)throw Error("Name is required");let t=await Md.selectFrom("categories").selectAll().where("name","=",e.name).executeTakeFirst();if(t)return t;let r={name:e.name,slug:Hg(e.name),is_active:e.is_active??!0,display_order:0};return await wa(r)}import{db as Bt}from"@stacksjs/database/runtime";import{HttpError as dt}from"@stacksjs/error-handling";import{formatDate as kr,isUniqueViolation as Kg}from"@stacksjs/orm";async function Od(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 dt(422,"Parent category ID must be a positive integer");if(n===e)throw new dt(422,"A category cannot be its own parent");if(n&&!await Z(n))throw new dt(422,`Parent category with ID ${t.parent_category_id} not found`);if(n&&await Ud(e,String(n)))throw new dt(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 Bt.updateTable("categories").set({...t,...n,updated_at:kr(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!o)return;return o}catch(n){if(n instanceof dt)throw n;if(Kg(n))throw new dt(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 $d(e,t){if(!await Z(e))throw Error(`Category with ID ${e} not found`);try{return await Bt.updateTable("categories").set({display_order:t,updated_at:kr(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 Bd(e,t){if(!await Z(e))throw Error(`Category with ID ${e} not found`);try{return await Bt.updateTable("categories").set({is_active:t,updated_at:kr(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 Jd(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 Ud(e,t))throw Error("This operation would create a circular reference in the category hierarchy")}try{let n={updated_at:kr(new Date)};if(t===null)await Bt.updateTable("categories").set({...n,parent_category_id:null}).where("id","=",e).execute();else await Bt.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 Ud(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}var Tr={};F(Tr,{bulkDestroy:()=>jd,bulkStore:()=>Zd,destroy:()=>Ld,fetchAll:()=>zd,fetchById:()=>Ae,fetchTopProducts:()=>Vd,store:()=>Kd,update:()=>Qd,updateAvailability:()=>Yd,updateInventory:()=>Xd});import{db as Wd}from"@stacksjs/database/runtime";async function Ld(e){try{let t=await Wd.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 jd(e){if(!e.length)return 0;try{let t=await Wd.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 ke,sql as Zg}from"@stacksjs/database/runtime";async function Ae(e){let t=await ke.selectFrom("products").where("id","=",e).selectAll().executeTakeFirst();if(t){let r=null,n=null;if(t.manufacturer_id)r=await ke.selectFrom("manufacturers").where("id","=",t.manufacturer_id).selectAll().executeTakeFirst();if(t.category_id)n=await ke.selectFrom("categories").where("id","=",t.category_id).selectAll().executeTakeFirst();return{...t,manufacturer:r,category:n}}return}async function zd(){let e=await ke.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=ke.selectFrom("manufacturers"),o=ke.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,l)=>(c[l.id]=l,c),{}),u=s.reduce((c,l)=>(c[l.id]=l,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 Gd(e){try{let t=await ke.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 Vd(e=5){try{return(await ke.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",ke.fn.sum("order_items.quantity").as("units_sold"),Zg`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:qd}=globalThis.Bun;import{db as Hd}from"@stacksjs/database/runtime";async function Kd(e){try{let t={...e,uuid:qd()},r=await Hd.insertInto("products").values(t).executeTakeFirst();if(!r)throw Error("Failed to create product item");let n=ve(r),o=n!==void 0?await Ae(n):await Gd(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 Zd(e){if(!e.length)return 0;let t=0;try{return await Hd.transaction(async(r)=>{for(let n of e){let o={...n,uuid:qd()};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 ya,matchedRows as HD}from"@stacksjs/database/runtime";import{formatDate as ga}from"@stacksjs/orm";async function Qd(e,t){try{if(!e)throw Error("Product item ID is required for update");let r=await ya.updateTable("products").set({...t,updated_at:ga(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 Yd(e,t){if(!await Ae(e))throw Error(`Product item with ID ${e} not found`);try{return await ya.updateTable("products").set({is_available:t,updated_at:ga(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 Xd(e,t){let r=await Ae(e);if(!r)throw Error(`Product item with ID ${e} not found`);let n={updated_at:ga(new Date)};if(t!==void 0)n.inventory_count=t;if(Object.keys(n).length===1)return r;try{return await ya.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}}var Er={};F(Er,{bulkDestroy:()=>rl,bulkStore:()=>pl,destroy:()=>tl,fetchAll:()=>nl,fetchByCountry:()=>il,fetchById:()=>ol,fetchByUuid:()=>al,fetchFeatured:()=>sl,fetchWithProductCount:()=>ul,store:()=>ml,update:()=>wl,updateByUuid:()=>gl,updateFeaturedStatus:()=>yl});import{db as el}from"@stacksjs/database/runtime";async function tl(e){try{let t=await el.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 rl(e){if(!e.length)return 0;try{let t=await el.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 Te}from"@stacksjs/database/runtime";async function nl(){return P(await Te.selectFrom("manufacturers").selectAll().execute())}async function ol(e){let t=await Te.selectFrom("manufacturers").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function al(e){let t=await Te.selectFrom("manufacturers").where("uuid","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function sl(e=10){let t=await Te.selectFrom("manufacturers").where("featured","=",!0).selectAll().orderBy("manufacturer","asc").limit(e).execute();return P(t)}async function il(e,t={}){let r=t.page||1,n=t.limit||2,o=await Te.selectFrom("manufacturers").select(Te.fn.count("id").as("total")).where("country","=",e).executeTakeFirst(),a=Number(o?.total||0),s=await Te.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 ul(e={}){let t=Te.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",Te.fn.count("p.id").as("product_count")]).groupBy("m.id"),t.execute()}var{randomUUIDv7:dl}=globalThis.Bun;import{db as ll}from"@stacksjs/database/runtime";import{HttpError as cl}from"@stacksjs/error-handling";import{isUniqueViolation as Qg}from"@stacksjs/orm";async function ml(e){try{let t={...e,uuid:dl(),featured:e.featured??!1},r=await ll.insertInto("manufacturers").values(t).returningAll().executeTakeFirst();if(!r)throw Error("Failed to create manufacturer");return w(r)}catch(t){if(t instanceof cl)throw t;if(Qg(t))throw new cl(409,"A manufacturer with this name already exists");if(t instanceof Error)throw Error(`Failed to create manufacturer: ${t.message}`);throw t}}async function pl(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 ll.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 ha}from"@stacksjs/database/runtime";import{HttpError as fl}from"@stacksjs/error-handling";import{formatDate as ba,isUniqueViolation as Yg}from"@stacksjs/orm";async function wl(e,t){try{if(!e)throw Error("Manufacturer ID is required for update");let r=await ha.updateTable("manufacturers").set({...t,updated_at:ba(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!r)return;return w(r)}catch(r){if(r instanceof fl)throw r;if(Yg(r))throw new fl(409,"A manufacturer with this name already exists");if(r instanceof Error)throw Error(`Failed to update manufacturer: ${r.message}`);throw r}}async function yl(e,t){try{let r=await ha.updateTable("manufacturers").set({featured:t,updated_at:ba(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 gl(e,t){try{let r=await ha.updateTable("manufacturers").set({...t,updated_at:ba(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}}var Fr={};F(Fr,{bulkDestroy:()=>_l,destroy:()=>bl,fetchAll:()=>Rl,fetchApprovedByProductId:()=>Dl,fetchById:()=>xl,fetchByProductId:()=>Pl,fetchByUserId:()=>vl,fetchMostHelpfulByProductId:()=>Sl,fetchStats:()=>Tl,fetchStatsByProductIds:()=>El,store:()=>Fl,update:()=>Nl,updateVotes:()=>Ol});import{db as hl}from"@stacksjs/database/runtime";async function bl(e){try{let t=await hl.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 _l(e){if(!e.length)return 0;try{let t=await hl.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 lt}from"@stacksjs/database/runtime";async function xl(e){return w(await lt.selectFrom("reviews").where("id","=",e).selectAll().executeTakeFirst(),!0)}async function Rl(){return P(await lt.selectFrom("reviews").selectAll().execute())}async function Pl(e){return P(await lt.selectFrom("reviews").where("product_id","=",e).selectAll().execute())}async function vl(e){return P(await lt.selectFrom("reviews").where("customer_id","=",e).selectAll().execute())}async function Dl(e){return P(await lt.selectFrom("reviews").where("product_id","=",e).where("is_approved","=",!0).selectAll().execute())}async function Sl(e){return P(await lt.selectFrom("reviews").where("product_id","=",e).orderBy("helpful_votes","desc").selectAll().execute())}import{db as Cl}from"@stacksjs/database/runtime";function kl(){return{total:0,rated:0,commentsOnly:0,average:0,distribution:{1:0,2:0,3:0,4:0,5:0}}}function Al(e){let t=kl();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 Tl(e){let t=await Cl.selectFrom("reviews").select(["rating"]).where("product_id","=",e).where("is_approved","=",!0).execute();return Al(t)}async function El(e){let t=new Map;for(let o of e)t.set(o,kl());if(e.length===0)return t;let r=await Cl.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,Al(a));return t}var{randomUUIDv7:Xg}=globalThis.Bun;import{db as eh}from"@stacksjs/database/runtime";function th(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 Fl(e){try{if(th(e))throw Error("A review needs a rating or something written: both were empty");let t={...e,uuid:Xg(),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 eh.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 Il,sqlHelpers as rh}from"@stacksjs/database/runtime";import{env as nh}from"@stacksjs/env";import{formatDate as Ml}from"@stacksjs/orm";async function Nl(e,t){try{if(!e)throw Error("Review ID is required for update");let r=await Il.updateTable("reviews").set({...t,updated_at:Ml(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 Ol(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}=rh(nh.DB_CONNECTION||"sqlite"),s=await Il.unsafe(`UPDATE "reviews" SET "${n}" = ${o}, "updated_at" = ${a(1)} WHERE "id" = ${a(2)} RETURNING *`,[Ml(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}}var Nr={};F(Nr,{bulkDestroy:()=>Jl,bulkStore:()=>Gl,bulkUpdate:()=>Kl,destroy:()=>Bl,fetchAll:()=>Ll,fetchById:()=>Wl,formatUnitOptions:()=>Vl,getDefaultUnit:()=>ql,store:()=>zl,update:()=>Hl,updateDefaultStatus:()=>Zl});import{db as $l}from"@stacksjs/database/runtime";async function Bl(e){try{let t=await $l.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 Jl(e){if(!e.length)return 0;try{let t=await $l.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 Ul}from"@stacksjs/database/runtime";async function Wl(e){let t=await Ul.selectFrom("product_units").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function Ll(){return P(await Ul.selectFrom("product_units").selectAll().execute())}var{randomUUIDv7:jl}=globalThis.Bun;import{db as Jt}from"@stacksjs/database/runtime";async function zl(e){try{return await Jt.transaction(async(t)=>{let r={...e,uuid:jl()},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 Gl(e){if(!e.length)return 0;let t=0;try{for(let r of e){let n={...r,uuid:jl()},o=await Jt.insertInto("product_units").values(n).returningAll().executeTakeFirst();if(n.is_default&&n.type&&o)await Jt.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 Vl(e){try{let t=Jt.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 ql(e){try{let t=await Jt.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 Ir,matchedRows as oh}from"@stacksjs/database/runtime";import{formatDate as Mr}from"@stacksjs/orm";async function Hl(e,t){try{if(!e)throw Error("Product unit ID is required for update");return await Ir.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:Mr(new Date)}).where("type","=",o).where("id","!=",e).execute();let s=await r.updateTable("product_units").set({...t,updated_at:Mr(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 Kl(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 oh(Ir.updateTable("product_units").set({...o,updated_at:Mr(new Date)}).where("id","=",n.id)),s=o;if(s.is_default===!0&&s.type)await Ir.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 Zl(e,t){try{return await Ir.transaction(async(r)=>{let n=await r.selectFrom("product_units").select("type").where("id","=",e).executeTakeFirst();if(!n)return!1;let o=Mr(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}}var Or={};F(Or,{bulkDestroy:()=>Xl,bulkStore:()=>sm,bulkUpdate:()=>mm,destroy:()=>Yl,fetchAll:()=>rm,fetchById:()=>tm,formatVariantOptions:()=>im,generateVariantCombinations:()=>um,store:()=>am,update:()=>lm});import{db as Ql}from"@stacksjs/database/runtime";async function Yl(e){try{let t=await Ql.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 Xl(e){if(!e.length)return 0;try{let t=await Ql.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 em}from"@stacksjs/database/runtime";async function tm(e){let t=await em.selectFrom("product_variants").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function rm(){return P(await em.selectFrom("product_variants").selectAll().execute())}var{randomUUIDv7:nm}=globalThis.Bun;import{db as om}from"@stacksjs/database/runtime";async function am(e){try{let t={...e,uuid:nm()},r=await om.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 sm(e){if(!e.length)return 0;let t=0;try{for(let r of e){let n={...r,uuid:nm()};await om.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 im(e){if(!e||!e.length)return JSON.stringify([]);let t=e.map((r)=>r.trim()).filter(Boolean);return JSON.stringify(t)}function um(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 cm,matchedRows as ah}from"@stacksjs/database/runtime";import{formatDate as dm}from"@stacksjs/orm";async function lm(e,t){try{let r=await cm.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 mm(e){if(!e.length)return 0;let t=0;try{for(let r of e){if(!r.id)continue;if((await ah(cm.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 sh={categories:Ar,items:Tr,manufacturers:Er,reviews:Fr,units:Nr,variants:Or},ih=sh;var Sa={};F(Sa,{bulkDestroy:()=>wm,bulkStore:()=>vm,destroy:()=>fm,fetchAll:()=>ym,fetchById:()=>mt,fetchPageStats:()=>bm,fetchPrintJobStats:()=>gm,fetchPrintTimeStats:()=>_m,fetchPrintsPerHour:()=>xm,fetchSuccessRate:()=>hm,store:()=>Pm,update:()=>Dm,updatePrintJob:()=>Cm,updateStatus:()=>Sm});import{db as pm}from"@stacksjs/database/runtime";async function fm(e){try{let t=await pm.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 wm(e){if(!e.length)return 0;try{let t=await pm.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 xa}from"@stacksjs/database/runtime";import{formatDate as uh}from"@stacksjs/orm";function be(e){return uh(e)}function ch(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 mt(e){let t=await xa.selectFrom("receipts").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function ym(){return P(await xa.selectFrom("receipts").selectAll().execute())}async function gm(e,t){let r=be(e),n=be(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 hm(e,t){let r=be(e),n=be(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 bm(e,t){let r=be(e),n=be(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 _m(e,t){let r=be(e),n=be(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 xm(e,t){let r=typeof e==="number"?e:e.getTime(),n=typeof t==="number"?t:t.getTime(),o=be(e),a=be(t),s=await xa.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,l=Array.from({length:24},(m,d)=>({hour:d,count:0}));return s.forEach((m)=>{let d=ch(m.timestamp);if(!d)return;l[d.getHours()].count++}),{totalPrints:i,totalHours:u,printsPerHour:c,hourlyBreakdown:l}}var{randomUUIDv7:Rm}=globalThis.Bun;import{db as Pa}from"@stacksjs/database/runtime";import{formatDate as Ra}from"@stacksjs/orm";function Ut(e){try{if(typeof e==="number")return Ra(e<=2147483647?e*1000:e);if(typeof e==="string"&&/^\d{10}$/.test(e))return Ra(Number(e)*1000);return Ra(e)}catch{throw TypeError("Receipt timestamp must be a valid date")}}async function Pm(e){try{let t=Rm(),r={...e,timestamp:Ut(e.timestamp),uuid:t};await Pa.insertInto("receipts").values(r).executeTakeFirst();let n=await Pa.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 vm(e){if(!e.length)return 0;try{let t=e.map((n)=>({...n,timestamp:Ut(n.timestamp),uuid:Rm()})),r=await Pa.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 va}from"@stacksjs/database/runtime";import{formatDate as Da}from"@stacksjs/orm";async function Dm(e,t){try{if(!e)throw Error("Receipt ID is required for update");let r={...t,...t.timestamp===void 0?{}:{timestamp:Ut(t.timestamp)},updated_at:Da(new Date)};await va.updateTable("receipts").set(r).where("id","=",e).execute();let n=await mt(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 Sm(e,t){try{await va.updateTable("receipts").set({status:t,updated_at:Da(new Date)}).where("id","=",e).execute();let r=await mt(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 Cm(e,t,r,n){try{let o={updated_at:Da(new Date)};if(t!==void 0)o.size=t;if(r!==void 0)o.pages=r;if(n!==void 0)o.duration=n;await va.updateTable("receipts").set(o).where("id","=",e).execute();let a=await mt(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}}var Qa={};F(Qa,{couriers:()=>Vr,default:()=>Ih,digital:()=>zr,geocoding:()=>Zr,licenses:()=>Xr,methods:()=>nn,rates:()=>cn,routes:()=>Lr,tracking:()=>gn,zones:()=>xn});var Lr={};F(Lr,{DeliveryRouteInputError:()=>se,bulkDestroy:()=>Tm,destroy:()=>Am,fetchActive:()=>Fm,fetchAll:()=>Em,fetchByCourier:()=>Im,fetchById:()=>Br,store:()=>Mm,update:()=>Om,updateLastActive:()=>Nm,updateMetrics:()=>Bm,updateStops:()=>$m,validateDeliveryRouteWrite:()=>pt});import{db as km}from"@stacksjs/database/runtime";async function Am(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 Tm(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 $r}from"@stacksjs/database/runtime";async function Br(e){return await $r.selectFrom("delivery_routes").where("id","=",e).selectAll().executeTakeFirst()}async function Em(){return await $r.selectFrom("delivery_routes").selectAll().execute()}async function Fm(){return await $r.selectFrom("delivery_routes").where("last_active",">=",Date.now()-86400000).selectAll().execute()}async function Im(e){return await $r.selectFrom("delivery_routes").where("courier","=",e).selectAll().execute()}var{randomUUIDv7:mh}=globalThis.Bun;import{db as Ca}from"@stacksjs/database/runtime";function Xe(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 Wt(e){return Xe(e,{name:["name"],description:["description"],base_rate:["base_rate","baseRate"],free_shipping:["free_shipping","freeShipping"],status:["status"]})}function Ee(e){return Xe(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 Lt(e){return Xe(e,{name:["name"],countries:["countries"],regions:["regions"],postal_codes:["postal_codes","postalCodes"],status:["status"],shipping_method_id:["shipping_method_id","shippingMethodId","shippingmethod_id"]})}function jt(e){return Xe(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 zt(e){return Xe(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 Gt(e){return Xe(e,{name:["name"],phone:["phone"],vehicle_number:["vehicle_number","vehicleNumber"],license:["license"],status:["status"],user_id:["user_id","userId"]})}function Jr(e){return Xe(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 dh}from"@stacksjs/database/runtime";class se extends TypeError{constructor(e){super(e);this.name="DeliveryRouteInputError"}}function Ur(e,t,r){return Number(e[r]??t?.[r])}function lh(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 pt(e,t){let r=Ur(e,t,"courier_id"),n=Ur(e,t,"stops"),o=Ur(e,t,"delivery_time"),a=Ur(e,t,"total_distance"),s=lh(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 dh.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 Mm(e){try{let t=mh(),r=Jr(e),o={...await pt(r),uuid:t};await Ca.insertInto("delivery_routes").values(o).executeTakeFirst();let a=await Ca.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 Nm(e){try{await Ca.updateTable("delivery_routes").set({last_active:Date.now(),updated_at:new Date().toISOString()}).where("id","=",e).execute();let t=await Br(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 Wr}from"@stacksjs/database/runtime";import{formatDate as ka}from"@stacksjs/orm";async function Om(e,t){try{if(!e)throw Error("Delivery route ID is required for update");let r=await Wr.selectFrom("delivery_routes").where("id","=",e).selectAll().executeTakeFirst();if(!r)return;let n=Jr(t),o=await pt(n,r),a=await Wr.updateTable("delivery_routes").set({...o,updated_at:ka(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 $m(e,t){try{let r=await Wr.updateTable("delivery_routes").set({stops:t,updated_at:ka(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 Bm(e,t,r){try{let n={updated_at:ka(new Date)};if(t!==void 0)n.delivery_time=t;if(r!==void 0)n.total_distance=r;let o=await Wr.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}}var zr={};F(zr,{bulkDestroy:()=>Lm,bulkSoftDelete:()=>jm,bulkStore:()=>Km,destroy:()=>Um,fetchAll:()=>Vm,fetchById:()=>Gm,softDelete:()=>Wm,store:()=>Hm,update:()=>Zm,updateDeliverySettings:()=>Ym,updateStatus:()=>Qm});import{db as jr,matchedRows as Jm}from"@stacksjs/database/runtime";async function Um(e){try{let t=await jr.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 Wm(e){try{return(await Jm(jr.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 Lm(e){if(!e.length)return 0;try{let t=await jr.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 jm(e){if(!e.length)return 0;try{return(await Jm(jr.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 zm}from"@stacksjs/database/runtime";async function Gm(e){let t=await zm.selectFrom("digital_deliveries").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function Vm(){return P(await zm.selectFrom("digital_deliveries").selectAll().execute())}var{randomUUIDv7:qm}=globalThis.Bun;import{db as Aa}from"@stacksjs/database/runtime";async function Hm(e){try{let t=qm(),r={...jt(e),uuid:t};await Aa.insertInto("digital_deliveries").values(r).executeTakeFirst();let n=await Aa.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 Km(e){if(!e.length)return 0;try{let t=e.map((n)=>({...jt(n),uuid:qm()})),r=await Aa.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 Ta}from"@stacksjs/database/runtime";import{formatDate as Ea}from"@stacksjs/orm";async function Zm(e,t){try{if(!e)throw Error("Digital delivery ID is required for update");let r=await Ta.updateTable("digital_deliveries").set({...jt(t),updated_at:Ea(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 Qm(e,t){try{let r=await Ta.updateTable("digital_deliveries").set({status:t,updated_at:Ea(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 Ym(e,t,r,n,o){try{let a={updated_at:Ea(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 Ta.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}}var Vr={};F(Vr,{bulkDestroy:()=>np,bulkStore:()=>sp,destroy:()=>rp,fetchAll:()=>ep,fetchById:()=>Gr,store:()=>ap,update:()=>ip,updateContact:()=>cp,updateStatus:()=>up});import{db as tp}from"@stacksjs/database/runtime";import{db as Xm}from"@stacksjs/database/runtime";async function Gr(e){let t=await Xm.selectFrom("couriers").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function ep(){return P(await Xm.selectFrom("couriers").selectAll().execute())}async function rp(e){try{let t=await tp.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 np(e){if(!e.length)return 0;let t=0;try{return await tp.transaction(async(r)=>{for(let n of e)if(await Gr(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:op}=globalThis.Bun;import{db as Fa}from"@stacksjs/database/runtime";async function ap(e){try{let t=op(),r={...Gt(e),uuid:t};await Fa.insertInto("couriers").values(r).executeTakeFirst();let n=await Fa.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 sp(e){if(!e.length)return 0;try{let t=e.map((n)=>({...Gt(n),uuid:op()})),r=await Fa.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 Ia}from"@stacksjs/database/runtime";import{formatDate as Ma}from"@stacksjs/orm";async function ip(e,t){try{if(!e)throw Error("Courier ID is required for update");let r=await Ia.updateTable("couriers").set({...Gt(t),updated_at:Ma(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 up(e,t){try{let r=await Ia.updateTable("couriers").set({status:t,updated_at:Ma(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 cp(e,t){try{let r={updated_at:Ma(new Date)};if(t!==void 0)r.phone=t;let n=await Ia.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 Zr={};F(Zr,{PRECISION_RANK:()=>qt,checkCoverage:()=>hh,formatQuery:()=>ft,geocode:()=>gh,geocodingDriver:()=>wp,nominatimDriver:()=>Kr,setGeocodingDriver:()=>yh});var et=(e)=>e*Math.PI/180;function Ue(e,t){let r=et(t.latitude-e.latitude),n=et(t.longitude-e.longitude),o=et(e.latitude),a=et(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 qr(e,t){let r=et(e.latitude),n=et(t.latitude),o=et(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 Hr(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 dp(e,t,r){return Ue(e,t)<=r}function Vt(e){return typeof e?.latitude==="number"&&typeof e?.longitude==="number"&&Number.isFinite(e.latitude)&&Number.isFinite(e.longitude)}var qt={unknown:0,locality:1,postal:2,street:3,rooftop:4};function ft(e){return[e.street,e.city,e.region,e.postalCode,e.country].map((t)=>String(t??"").trim()).filter(Boolean).join(", ")}var ph="https://nominatim.openstreetmap.org/search",lp=1000,mp=0,pp=Promise.resolve();async function fh(e){let t=pp.then(async()=>{let r=Date.now()-mp;if(r<lp)await Bun.sleep(lp-r);return mp=Date.now(),e()});return pp=t.then(()=>{return},()=>{return}),t}function wh(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 Kr(e={}){let t=e.userAgent??`${process.env.APP_NAME??"Stacks"} (${process.env.APP_URL??"stacks-app"})`,r=e.endpoint??ph;return{name:"nominatim",async geocode(n){let o=ft(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 fh(()=>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),l=Number(u.lon);if(!Number.isFinite(c)||!Number.isFinite(l))return null;let m=wh(u);return{latitude:c,longitude:l,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 fp=null;function yh(e){fp=e}function wp(){return fp??Kr()}async function gh(e,t={}){let r=t.driver??wp(),n=t.minimumPrecision??"street",o=`geocode:${r.name}:${ft(e).toLowerCase()}`,a=await bh(o);if(a!==void 0)return a;let s=await r.geocode(e),i=s&&qt[s.precision]>=qt[n]?s:null;return await _h(o,i,i?t.cacheSeconds??2592000:600),i}function hh(e,t,r){if(t.length===0)return null;let n=t[0],o=Ue(e,n);for(let a of t.slice(1)){let s=Ue(e,a);if(s<o)o=s,n=a}return{covered:o<=r,distanceMeters:Math.round(o),nearest:n}}async function bh(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 _h(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{}}var Xr={};F(Xr,{LicenseKeyInputError:()=>G,bulkDestroy:()=>bp,bulkSoftDelete:()=>_p,bulkStore:()=>kp,destroy:()=>gp,fetchAll:()=>Pp,fetchById:()=>Rp,softDelete:()=>hp,store:()=>Cp,update:()=>Ap,updateExpiration:()=>Ep,updateStatus:()=>Tp,validateLicenseKeyWrite:()=>tt});import{db as Qr,matchedRows as yp}from"@stacksjs/database/runtime";async function gp(e){try{let t=await Qr.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 hp(e){try{return(await yp(Qr.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 bp(e){if(!e.length)return 0;try{let t=await Qr.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 _p(e){if(!e.length)return 0;try{return(await yp(Qr.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 xp}from"@stacksjs/database/runtime";async function Rp(e){let t=await xp.selectFrom("license_keys").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function Pp(){return P(await xp.selectFrom("license_keys").selectAll().execute())}var{randomUUIDv7:Sp}=globalThis.Bun;import{db as $a}from"@stacksjs/database/runtime";import{db as Na}from"@stacksjs/database/runtime";var vp=["Standard License","Premium License","Enterprise License"],Dp=["active","inactive","unassigned"];class G extends TypeError{constructor(e){super(e);this.name="LicenseKeyInputError"}}function Ht(e,t,r){return e[r]!==void 0?e[r]:t?.[r]}function Oa(e,t,r,n){let o=Ht(e,t,r);if(o===void 0||o===null||o==="")return null;let a=Number(o);if(!Number.isSafeInteger(a)||a<1)throw new G(`${n} must be a positive integer or null.`);return a}function xh(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 tt(e,t){let r=String(Ht(e,t,"key")||"").trim().toUpperCase(),n=String(Ht(e,t,"template")||""),o=String(Ht(e,t,"status")||""),a=xh(Ht(e,t,"expiry_date")),s=Oa(e,t,"customer_id","Customer"),i=Oa(e,t,"product_id","Product"),u=Oa(e,t,"order_id","Order");if(!/^[A-Z0-9]{4}(?:-[A-Z0-9]{4}){4}$/.test(r))throw new G("License key must use five groups of four uppercase letters or numbers.");if(!vp.includes(n))throw new G(`Template must be one of: ${vp.join(", ")}.`);if(!Dp.includes(o))throw new G(`Status must be one of: ${Dp.join(", ")}.`);if(!Number.isSafeInteger(a)||a<0||a>2147483647)throw new G("Expiry date must be a Unix timestamp between 1970 and 2038.");let[c,l,m]=await Promise.all([s?Na.selectFrom("customers").where("id","=",s).select("id").executeTakeFirst():null,i?Na.selectFrom("products").where("id","=",i).select("id").executeTakeFirst():null,u?Na.selectFrom("orders").where("id","=",u).select(["id","customer_id"]).executeTakeFirst():null]);if(s&&!c)throw new G(`Customer ${s} was not found.`);if(i&&!l)throw new G(`Product ${i} was not found.`);if(u&&!m)throw new G(`Order ${u} was not found.`);if(s&&m?.customer_id&&Number(m.customer_id)!==s)throw new G(`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 Cp(e){try{let t=Sp(),r=zt(e),n={...await tt(r),uuid:t};await $a.insertInto("license_keys").values(n).executeTakeFirst();let o=await $a.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 G)throw t;if(t instanceof Error){if(t.message.includes("UNIQUE constraint failed: license_keys.key"))throw new G("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 tt(zt(n)),uuid:Sp()}))),r=await $a.insertInto("license_keys").values(t).executeTakeFirst();return _(r)}catch(t){if(t instanceof G)throw t;if(t instanceof Error)throw TypeError(`Failed to create license keys in bulk: ${t.message}`);throw t}}import{db as Yr}from"@stacksjs/database/runtime";import{formatDate as Ba}from"@stacksjs/orm";async function Ap(e,t){try{if(!e)throw Error("License key ID is required for update");let r=await Yr.selectFrom("license_keys").where("id","=",e).selectAll().executeTakeFirst();if(!r)return;let n=zt(t),o=await tt(n,r),a=await Yr.updateTable("license_keys").set({...o,updated_at:Ba(new Date)}).where("id","=",e).returningAll().executeTakeFirst();if(!a)return;return w(a)}catch(r){if(r instanceof G)throw r;if(r instanceof Error){if(r.message.includes("UNIQUE constraint failed: license_keys.key"))throw new G("A license key with this value already exists.");throw TypeError(`Failed to update license key: ${r.message}`)}throw r}}async function Tp(e,t){try{let r=await Yr.updateTable("license_keys").set({status:t,updated_at:Ba(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 Ep(e,t){try{let r={updated_at:Ba(new Date)};if(t!==void 0)r.expiry_date=t;let n=await Yr.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}}var nn={};F(nn,{bulkDestroy:()=>Np,bulkSoftDelete:()=>Op,bulkStore:()=>Up,destroy:()=>Ip,fetchAll:()=>$p,fetchById:()=>rn,formatShippingOptions:()=>Wp,getActiveShippingMethods:()=>Lp,softDelete:()=>Mp,store:()=>Jp,update:()=>jp,updatePricing:()=>Gp,updateStatus:()=>zp});import{db as en,matchedRows as Fp}from"@stacksjs/database/runtime";async function Ip(e){try{let t=await en.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 Mp(e){try{return(await Fp(en.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 Np(e){if(!e.length)return 0;try{let t=await en.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 Op(e){if(!e.length)return 0;try{return(await Fp(en.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 tn}from"@stacksjs/database/runtime";async function rn(e){let t=await tn.selectFrom("shipping_methods").where("id","=",e).selectAll().executeTakeFirst();if(t){let r=await tn.selectFrom("shipping_zones").where("shipping_method_id","=",e).selectAll().execute();return{...t,shippingZones:r}}return}async function $p(){let e=await tn.selectFrom("shipping_methods").selectAll().execute();if(e.length===0)return[];let t=[...new Set(e.map((a)=>a.id))],o=(await tn.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:Bp}=globalThis.Bun;import{db as Kt}from"@stacksjs/database/runtime";async function Jp(e){try{let t=Bp(),r={...Wt(e),uuid:t};await Kt.insertInto("shipping_methods").values(r).executeTakeFirst();let n=await Kt.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 Up(e){if(!e.length)return 0;try{let t=e.map((n)=>({...Wt(n),uuid:Bp()})),r=await Kt.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 Wp(){try{return Kt.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 Lp(){try{let e=await Kt.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 Ja}from"@stacksjs/database/runtime";import{formatDate as Ua}from"@stacksjs/orm";async function jp(e,t){try{if(!e)throw Error("Shipping method ID is required for update");let r=await Ja.updateTable("shipping_methods").set({...Wt(t),updated_at:Ua(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 zp(e,t){try{let r=await Ja.updateTable("shipping_methods").set({status:t,updated_at:Ua(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 Gp(e,t,r){try{let n={updated_at:Ua(new Date)};if(t!==void 0)n.base_rate=t;if(r!==void 0)n.free_shipping=r;let o=await Ja.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}}var cn={};F(cn,{ShippingRateInputError:()=>Y,bulkDestroy:()=>qp,bulkStore:()=>lf,bulkUpdate:()=>pf,destroy:()=>Vp,destroyByMethod:()=>Kp,destroyByZone:()=>Hp,fetchAll:()=>Yp,fetchById:()=>Qp,formatShippingRateOptions:()=>rf,getRateByWeightAndAddress:()=>ef,getRateByWeightAndZone:()=>Wa,getRatesByZone:()=>Xp,getShippingRatesByMethod:()=>nf,resolveZoneForAddress:()=>an,store:()=>df,update:()=>mf,updateByMethod:()=>wf,updateByZone:()=>ff,validateShippingRateWrite:()=>rt,validateZoneMatchesAddress:()=>tf});import{db as on}from"@stacksjs/database/runtime";async function Vp(e){try{let t=await on.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 qp(e){if(!e.length)return 0;try{let t=await on.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 Hp(e){try{let t=await on.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 Kp(e){try{let t=await on.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 Qp(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 Yp(){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 Xp(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 Wa(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 an(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&&Zp(n.regions,e.region))o=2;if(e.postalCode&&n.postal_codes&&Zp(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 ef(e,t){let r=await an(t);if(r==null)return;return Wa(e,r)}async function tf(e,t){return await an(t)===e}function Zp(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 rf(){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 nf(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:cf}=globalThis.Bun;import{db as La}from"@stacksjs/database/runtime";import{db as Zt}from"@stacksjs/database/runtime";async function of(){return P(await Zt.selectFrom("shipping_zones").selectAll().execute())}async function sn(e){let t=await Zt.selectFrom("shipping_zones").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}function af(){try{return Zt.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 sf(){try{let e=await Zt.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 uf(e){try{let t=await Zt.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 Qt(e,t,r){return Number(e[r]??t?.[r])}async function rt(e,t){let r=Qt(e,t,"shipping_method_id"),n=Qt(e,t,"shipping_zone_id"),o=Qt(e,t,"weight_from"),a=Qt(e,t,"weight_to"),s=Qt(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([rn(r),sn(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 df(e){try{let t=Ee(e),r=Number(t.shipping_method_id),n=Number(t.shipping_zone_id);await rt(t);let o=cf(),a={...t,shipping_method_id:r,shipping_zone_id:n,uuid:o};await La.insertInto("shipping_rates").values(a).executeTakeFirst();let s=await La.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 lf(e){if(!e.length)return 0;try{for(let n of e){let o=Ee(n);await rt(o)}let t=e.map((n)=>({...Ee(n),uuid:cf()})),r=await La.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 Yt,matchedRows as ja}from"@stacksjs/database/runtime";import{formatDate as un}from"@stacksjs/orm";async function mf(e,t){try{if(!e)throw Error("Shipping rate ID is required for update");let r=await Yt.selectFrom("shipping_rates").where("id","=",e).selectAll().executeTakeFirst();if(!r)return;let n=Ee(t);await rt(n,r);let o=await Yt.updateTable("shipping_rates").set({...n,updated_at:un(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 pf(e){if(!e.length)return 0;try{let t=0;for(let{id:r,data:n}of e)if((await ja(Yt.updateTable("shipping_rates").set({...Ee(n),updated_at:un(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 ff(e,t){try{return(await ja(Yt.updateTable("shipping_rates").set({...Ee(t),updated_at:un(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 wf(e,t){try{return(await ja(Yt.updateTable("shipping_rates").set({...Ee(t),updated_at:un(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}}var gn={};F(gn,{ARRIVAL_RADIUS_METERS:()=>Va,NEARBY_RADIUS_METERS:()=>Ga,assignStop:()=>gf,bearingInDegrees:()=>qr,broadcastToChannel:()=>Fe,completeStop:()=>bf,distanceInMeters:()=>Ue,emitDeliveryArrived:()=>fn,emitDeliveryAssigned:()=>ln,emitDeliveryCompleted:()=>wn,emitDeliveryFailed:()=>yn,emitDeliveryNearby:()=>pn,emitDeliveryPosition:()=>dn,emitDeliveryStarted:()=>mn,estimateSecondsRemaining:()=>Hr,failStop:()=>_f,hasCoordinates:()=>Vt,isWithin:()=>dp,orderTrackingChannel:()=>We,recordCourierPing:()=>yf,routeTrackingChannel:()=>za,startRoute:()=>xf,startStop:()=>hf});function We(e){return`order.${e}`}function za(e){return`delivery-route.${e}`}async function wt(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 Fe(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 dn(e,t,r){await Promise.all([...e.map((n)=>Fe(We(n),"delivery:position",r)),t==null?Promise.resolve():Fe(za(t),"delivery:position",r)])}async function ln(e){if(await wt("delivery:assigned",{stop:e}),e.order_id!=null)await Fe(We(e.order_id),"delivery:assigned",{stop:e})}async function mn(e){if(await wt("delivery:started",{stop:e}),e.order_id!=null)await Fe(We(e.order_id),"delivery:started",{stop:e})}async function pn(e,t,r){if(await wt("delivery:nearby",{stop:e,distanceMeters:t,etaSeconds:r}),e.order_id!=null)await Fe(We(e.order_id),"delivery:nearby",{stop:e,distanceMeters:t,etaSeconds:r})}async function fn(e){if(await wt("delivery:arrived",{stop:e}),e.order_id!=null)await Fe(We(e.order_id),"delivery:arrived",{stop:e})}async function wn(e){if(await wt("delivery:completed",{stop:e}),e.order_id!=null)await Fe(We(e.order_id),"delivery:completed",{stop:e})}async function yn(e,t){await wt("delivery:failed",{stop:e,reason:t})}var{randomUUIDv7:Rh}=globalThis.Bun;import{db as Ie}from"@stacksjs/database/runtime";var Ga=400,Va=60,Ph=250;async function yf(e){let t=e.recordedAt??new Date().toISOString(),r=typeof e.accuracy!=="number"||e.accuracy<=Ph,n=await Ie.selectFrom("couriers").where("id","=",e.courierId).select(["id","latitude","longitude"]).executeTakeFirst();if(!n)throw Error(`Unknown courier: ${e.courierId}`);let o=Vt(n)?{latitude:n.latitude,longitude:n.longitude}:null,a=typeof e.heading==="number"?e.heading:o?qr(o,e):null,s=await vh(e.courierId),i=s?await Dh(s.id):null,u=null,c=null,l=!1,m=!1,d=i&&Vt({latitude:i.latitude??void 0,longitude:i.longitude??void 0})?{latitude:i.latitude,longitude:i.longitude}:null;if(r&&i&&d)u=Math.round(Ue(e,d)),c=Hr(u,e.speed??0),m=u<=Va&&i.arrived_at==null,l=!m&&u<=Ga&&i.status==="en_route"&&i.notified_nearby_at==null;let y=await Sh({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 Ie.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 Ie.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 dn(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(l&&i)await Ie.updateTable("delivery_stops").set({notified_nearby_at:t}).where("id","=",i.id).execute(),await pn(i,u,c);if(m&&i)await Ie.updateTable("delivery_stops").set({status:"arrived",arrived_at:t}).where("id","=",i.id).execute(),await fn({...i,status:"arrived",arrived_at:t});return{pingId:y,routeId:s?.id??null,stopId:i?.id??null,distanceToStopMeters:u,etaSeconds:c,crossedNearby:l,crossedArrival:m}}async function vh(e){return await Ie.selectFrom("delivery_routes").where("courier_id","=",e).where("status","=","active").select(["id"]).orderBy("id","desc").executeTakeFirst()??null}async function Dh(e){let t=await Ie.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 Sh(e){let t=Rh();return await Ie.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 Ie.selectFrom("courier_pings").where("uuid","=",t).select(["id"]).executeTakeFirst())?.id??null}var{randomUUIDv7:Ch}=globalThis.Bun;import{db as X}from"@stacksjs/database/runtime";function qa(e){return e.type==="pickup"}async function gf(e){let t=Ch(),r=e.sequence??await Ah(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 Eh(t);if(n)await ln(n);return n??{}}async function hf(e){await X.updateTable("delivery_stops").set({status:"en_route"}).where("id","=",e).execute();let t=await Ka(e);if(!t)return null;if(t.order_id!=null&&!qa(t))await Ha(t.order_id,"OUT_FOR_DELIVERY");return await mn(t),t}async function bf(e,t){let r=new Date().toISOString();await X.updateTable("delivery_stops").set({status:"completed",completed_at:r,...await Th(e)?{}:{arrived_at:r},...t?{notes:t}:{}}).where("id","=",e).execute();let n=await Ka(e);if(!n)return null;if(n.order_id!=null)await Ha(n.order_id,qa(n)?"OUT_FOR_DELIVERY":"DELIVERED");return await wn(n),await Rf(n.delivery_route_id),n}async function _f(e,t){await X.updateTable("delivery_stops").set({status:"failed",notes:t}).where("id","=",e).execute();let r=await Ka(e);if(!r)return null;if(r.order_id!=null&&!qa(r))await Ha(r.order_id,"SHIPPED");return await yn(r,t),await Rf(r.delivery_route_id),r}async function xf(e){await X.updateTable("delivery_routes").set({status:"active",started_at:new Date().toISOString()}).where("id","=",e).execute()}async function Rf(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 Ha(e,t){let r=await X.selectFrom("orders").where("id","=",e).select(["id","status"]).executeTakeFirst();if(!r)return;let n=await Promise.resolve().then(() => (ct(),{}));let s=kh(r.status,t,Je);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 ut(i,{...r,status:i})}function kh(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 Ah(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 Th(e){return(await X.selectFrom("delivery_stops").where("id","=",e).select(["arrived_at"]).executeTakeFirst())?.arrived_at!=null}async function Ka(e){return await X.selectFrom("delivery_stops").where("id","=",e).selectAll().executeTakeFirst()??null}async function Eh(e){return await X.selectFrom("delivery_stops").where("uuid","=",e).selectAll().executeTakeFirst()??null}var xn={};F(xn,{bulkDestroy:()=>Sf,bulkSoftDelete:()=>Cf,bulkStore:()=>Tf,destroy:()=>vf,fetchAll:()=>of,fetchById:()=>sn,formatZoneOptions:()=>af,getActiveShippingZones:()=>sf,getZonesByCountry:()=>uf,softDelete:()=>Df,store:()=>Af,update:()=>Ef,updateCountries:()=>If,updateRegionsAndPostalCodes:()=>Mf,updateStatus:()=>Ff});import{db as hn,matchedRows as Pf}from"@stacksjs/database/runtime";async function vf(e){try{let t=await hn.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 Df(e){try{return(await Pf(hn.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 Sf(e){if(!e.length)return 0;try{let t=await hn.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 Cf(e){if(!e.length)return 0;try{return(await Pf(hn.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 Za}from"@stacksjs/database/runtime";async function Af(e){try{let t=kf(),r={...Lt(e),uuid:t};await Za.insertInto("shipping_zones").values(r).executeTakeFirst();let n=await Za.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 Tf(e){if(!e.length)return 0;try{let t=e.map((n)=>({...Lt(n),uuid:kf()})),r=await Za.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 bn}from"@stacksjs/database/runtime";import{formatDate as _n}from"@stacksjs/orm";async function Ef(e,t){try{if(!e)throw Error("Shipping zone ID is required for update");let r=await bn.updateTable("shipping_zones").set({...Lt(t),updated_at:_n(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 Ff(e,t){try{let r=await bn.updateTable("shipping_zones").set({status:t,updated_at:_n(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 If(e,t){try{let r=await bn.updateTable("shipping_zones").set({countries:t,updated_at:_n(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 Mf(e,t,r){try{let n={updated_at:_n(new Date)};if(t!==void 0)n.regions=t;if(r!==void 0)n.postal_codes=r;let o=await bn.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 Fh={digital:zr,couriers:Vr,geocoding:Zr,licenses:Xr,methods:nn,rates:cn,routes:Lr,tracking:gn,zones:xn},Ih=Fh;var es={};F(es,{activeTaxRates:()=>Ya,breakdownFor:()=>Xa,bulkDestroy:()=>Bf,bulkStore:()=>Gf,destroy:()=>$f,fetchAll:()=>Wf,fetchById:()=>Uf,store:()=>zf,taxFor:()=>Nf,update:()=>Vf,updateDefaultStatus:()=>Kf,updateRate:()=>Hf,updateStatus:()=>qf});import{db as Mh}from"@stacksjs/database/runtime";function Nh(e){let t=Number(e);return Number.isFinite(t)?t/100:0}async function Ya(e={}){let t=Mh.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??"")))}function Xa(e,t,r={}){let n=Math.max(0,Math.round(e)),o=[],a=0,s=0;for(let i of t){let u=Nh(i.rate),c=Math.round(n*u),l=Boolean(r.exempt&&i.exemptible);if(l)s+=c;else a+=c;o.push({id:Number(i.id),code:String(i.code??""),name:String(i.name??""),rate:u,amount:l?0:c,exempted:l})}return{taxable:n,components:o,tax:a,exempted:s}}async function Nf(e,t={}){return Xa(e,await Ya(t),t)}import{db as Of}from"@stacksjs/database/runtime";async function $f(e){try{let t=await Of.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 Bf(e){if(!e.length)return 0;try{let t=await Of.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 Jf}from"@stacksjs/database/runtime";async function Uf(e){let t=await Jf.selectFrom("tax_rates").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function Wf(){return P(await Jf.selectFrom("tax_rates").selectAll().execute())}var{randomUUIDv7:Lf}=globalThis.Bun;import{db as jf}from"@stacksjs/database/runtime";async function zf(e){try{return await jf.transaction(async(t)=>{let r={...e,uuid:Lf()};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 Gf(e){if(!e.length)return 0;try{return await jf.transaction(async(t)=>{let r=0;for(let n of e){let o={...n,uuid:Lf()};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 Rn}from"@stacksjs/database/runtime";import{formatDate as Pn}from"@stacksjs/orm";async function Vf(e,t){try{if(!e)throw Error("Tax rate ID is required for update");return await Rn.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=Pn(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 qf(e,t){try{let r=await Rn.updateTable("tax_rates").set({status:t,updated_at:Pn(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 Hf(e,t){try{let r=await Rn.updateTable("tax_rates").set({rate:t,updated_at:Pn(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 Kf(e,t){try{return await Rn.transaction(async(r)=>{if(!await r.selectFrom("tax_rates").select("id").where("id","=",e).executeTakeFirst())return!1;let o=Pn(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}}var ss={};F(ss,{default:()=>Gh,products:()=>Dn,restaurant:()=>gt});var Dn={};F(Dn,{bulkDestroy:()=>Qf,bulkStore:()=>fw,destroy:()=>Zf,fetchAll:()=>Yf,fetchById:()=>Xt,fetchCancelledBetweenDates:()=>aw,fetchConversionRates:()=>uw,fetchCountBetweenDates:()=>cw,fetchCountByAllQuantities:()=>rw,fetchCountByDate:()=>ew,fetchCountByDateGrouped:()=>dw,fetchCountByQuantity:()=>tw,fetchCountBySource:()=>Xf,fetchCountByStatus:()=>iw,fetchNotifiedBetweenDates:()=>nw,fetchPurchasedBetweenDates:()=>ow,fetchWaiting:()=>sw,store:()=>pw,update:()=>vn,updatePartySize:()=>yw,updateStatus:()=>ww});import{db as ts}from"@stacksjs/database/runtime";async function Zf(e){try{let t=await ts.selectFrom("waitlist_products").where("id","=",e).selectAll().executeTakeFirst();if(!t)return;return await ts.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 Qf(e){if(!e.length)return 0;try{let t=await ts.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 Xt(e){let t=await j.selectFrom("waitlist_products").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function Yf(){return P(await j.selectFrom("waitlist_products").selectAll().execute())}async function Xf(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 ew(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 tw(e){return(await j.selectFrom("waitlist_products").select(j.fn.count("id").as("count")).where("quantity","=",e).executeTakeFirst())?.count??0}async function rw(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 nw(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 ow(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 aw(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 sw(){let e=await j.selectFrom("waitlist_products").selectAll().where("status","=","waiting").execute();return P(e)}async function iw(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 uw(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:l})=>(u[c]={count:l,percentage:o>0?l/o*100:0},u),{});return{totalConversionRate:s,statusBreakdown:i}}async function cw(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 dw(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 rs}from"@stacksjs/database/runtime";import{formatDate as lw}from"@stacksjs/orm";var Oh={notified:"notified_at",purchased:"purchased_at",cancelled:"cancelled_at"};function $h(e){return typeof e==="number"||e instanceof Date?lw(e):e}function er(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]=$h(r[o]);let n=Oh[r.status];if(n&&r[n]===void 0&&!t[n])r[n]=lw(new Date);return r}async function pw(e){try{let t=mw(),r={...er(e),uuid:t,status:e.status||"waiting"};await rs.insertInto("waitlist_products").values(r).executeTakeFirst();let n=await rs.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 fw(e){if(!e.length)return 0;try{let t=e.map((n)=>({...er(n),status:n.status||"waiting",uuid:mw()})),r=await rs.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 Bh}from"@stacksjs/database/runtime";import{formatDate as Jh}from"@stacksjs/orm";async function vn(e,t){try{if(!e)throw Error("Waitlist product ID is required for update");let r=await Xt(e);if(!r)return;await Bh.updateTable("waitlist_products").set({...er(t,r),updated_at:Jh(new Date)}).where("id","=",e).execute();let n=await Xt(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 ww(e,t){return await vn(e,{status:t})}async function yw(e,t){return await vn(e,{quantity:t})}var gt={};F(gt,{bulkDestroy:()=>hw,bulkStore:()=>Jw,destroy:()=>gw,fetchAll:()=>bw,fetchAverageWaitTimes:()=>kw,fetchBetweenDates:()=>vw,fetchById:()=>tr,fetchConversionRates:()=>Cw,fetchCountByAllPartySizes:()=>Pw,fetchCountByDate:()=>xw,fetchCountByPartySize:()=>Rw,fetchCountByTablePreference:()=>_w,fetchCurrentWaitTimes:()=>Mw,fetchNoShowStats:()=>Iw,fetchSeatedBetweenDates:()=>Dw,fetchSeatedStats:()=>Nw,fetchSeatingRate:()=>Fw,fetchTablesTurnedToday:()=>Ew,fetchTimeSeriesStats:()=>Ow,fetchWaiting:()=>Sw,fetchWaitingWithPartySizes:()=>Tw,fetchWaitingWithQuotedTimes:()=>Aw,store:()=>Bw,update:()=>yt,updatePartySize:()=>Ww,updateQueuePosition:()=>jw,updateStatus:()=>Uw,updateWaitTimes:()=>Lw});import{db as ns}from"@stacksjs/database/runtime";async function gw(e){try{let t=await ns.selectFrom("waitlist_restaurants").where("id","=",e).selectAll().executeTakeFirst();if(!t)return;return await ns.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 hw(e){if(!e.length)return 0;try{let t=await ns.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 tr(e){let t=await N.selectFrom("waitlist_restaurants").where("id","=",e).selectAll().executeTakeFirst();return w(t,!0)}async function bw(){return P(await N.selectFrom("waitlist_restaurants").selectAll().execute())}async function _w(){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 xw(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 Rw(e){return(await N.selectFrom("waitlist_restaurants").select(N.fn.count("id").as("count")).where("party_size","=",e).executeTakeFirst())?.count??0}async function Pw(){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 vw(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 Dw(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 Sw(){let e=await N.selectFrom("waitlist_restaurants").selectAll().where("status","=","waiting").execute();return P(e)}async function Cw(){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 kw(){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 Aw(){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 Tw(){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 Ew(){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,d)=>m+d.party_size,0),u=s>0?i/s:0,c=a.reduce((m,d)=>(m[d.table_preference]=(m[d.table_preference]||0)+1,m),{}),l=a.reduce((m,d)=>(m[d.party_size]=(m[d.party_size]||0)+1,m),{});return{totalTablesTurned:s,averagePartySize:u,totalCustomersSeated:i,breakdownByTablePreference:c,breakdownByPartySize:l}}async function Fw(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:l})=>c+l,0),s=o.find((c)=>c.status==="seated")?.count??0,i=a>0?Number(s)/a*100:0,u=o.reduce((c,{status:l,count:m})=>(c[l]={count:m,percentage:a>0?m/a*100:0},c),{});return{totalEntries:a,seatedEntries:s,seatingRate:i,statusBreakdown:u}}async function Iw(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,h)=>p+(h.quoted_wait_time??0),0),l=i>0?c/i:0,m=s.reduce((p,h)=>p+h.party_size,0),d=i>0?m/i:0,y=s.reduce((p,h)=>(p[h.table_preference]=(p[h.table_preference]||0)+1,p),{}),b=s.reduce((p,h)=>(p[h.party_size]=(p[h.party_size]||0)+1,p),{});return{totalNoShows:i,noShowRate:u,averageQuotedWaitTime:l,averagePartySize:d,breakdownByTablePreference:y,breakdownByPartySize:b}}async function Mw(){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 Nw(){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 Ow(){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:$w}=globalThis.Bun;import{db as as}from"@stacksjs/database/runtime";import{formatDate as os}from"@stacksjs/orm";var Uh={seated:"seated_at",no_show:"no_show_at",cancelled:"cancelled_at"};function Wh(e){if(typeof e==="number")return os(e<=2147483647?e*1000:e);if(e instanceof Date)return os(e);return e}function rr(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]=Wh(r[o]);let n=Uh[r.status];if(n&&r[n]===void 0&&!t[n])r[n]=os(new Date);return r}async function Bw(e){try{let t=$w(),r={...rr(e),status:e.status||"waiting",uuid:t};await as.insertInto("waitlist_restaurants").values(r).executeTakeFirst();let n=await as.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 Jw(e){if(!e.length)return 0;try{let t=e.map((n)=>({...rr(n),status:n.status||"waiting",uuid:$w()})),r=await as.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 Lh}from"@stacksjs/database/runtime";import{formatDate as jh}from"@stacksjs/orm";async function yt(e,t){try{if(!e)throw Error("Restaurant waitlist entry ID is required for update");let r=await tr(e);if(!r)return;await Lh.updateTable("waitlist_restaurants").set({...rr(t,r),updated_at:jh(new Date)}).where("id","=",e).execute();let n=await tr(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 Uw(e,t){return await yt(e,{status:t})}async function Ww(e,t){return await yt(e,{party_size:t})}async function Lw(e,t,r){return await yt(e,{quoted_wait_time:t,...r===void 0?{}:{actual_wait_time:r}})}async function jw(e,t){return await yt(e,{queue_position:t})}var zh={products:Dn,restaurant:gt},Gh=zh;var Vh={auctions:Xn,carts:eo,coupons:$o,customers:Bo,devices:jo,errors:Vo,giftCards:Ko,orders:ma,payments:pa,products:_a,receipts:Sa,restaurant:gt,shippings:Qa,tax:es,waitlists:ss},j0=Vh;export{I as PriceFormatError,Xn as auctions,eo as carts,ru as catalogImport,Vh as commerce,$o as coupons,J as currencyExponent,Bo as customers,ee as decimalToMinor,j0 as default,jo as devices,Vo as errors,Ss as formatCurrency,ne as formatMinor,Ko as giftCards,Pe as minorToDecimal,Cs as minorToInput,to as minorToMajor,Ts as money,ro as moneyInputError,ks as moneyInputStep,ma as orders,As as parseMoneyInput,pa as payments,_a as products,Sa as receipts,gt as restaurant,Qa as shippings,es as tax,ss as waitlists};