@lockerverse/sdk 0.2.173 → 0.2.174-dev.1

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/MIGRATIONS.md CHANGED
@@ -36,6 +36,20 @@ If it cannot be found, report that limit and use the baseline review below. Do n
36
36
  claim that every historical migration was applied. Read this file even if the
37
37
  version already matches: a previous upgrade may have missed host adoption steps.
38
38
 
39
+ ## 0.2.174-dev.1 — Match Stripe Elements payment method configuration
40
+
41
+ - **Affected:** Core checkout submission and React payment widgets.
42
+ - **Automatic:** React configures explicit card, Link, and community-enabled bank
43
+ methods in Stripe Elements and marks the confirmation request with
44
+ `paymentMethodConfiguration: "explicit"`. This matches the backend's Stripe
45
+ PaymentIntent configuration.
46
+ - **Required:** deploy the backend that supports this optional marker before
47
+ upgrading React. Keep Core and React matched. Existing Core-only callers omit
48
+ the marker and retain automatic payment methods. Custom Elements integrations
49
+ must send the marker only when they use the explicit method list.
50
+ - **Check:** submit card and bank payments through Stripe Elements in test mode,
51
+ including recurring checkout. Confirm pending recovery and settlement.
52
+
39
53
  ## 0.2.173 — widget ACH and SDK checkout UI
40
54
 
41
55
  ### Bank authorization terms
@@ -97,7 +111,39 @@ version already matches: a previous upgrade may have missed host adoption steps.
97
111
  verify a changed selection cannot discard it. Check both paid and free order
98
112
  confirmation panels. Do not submit a live transaction for this check.
99
113
 
100
- ## 0.2.170 — six-month payment widgets
114
+ ## 0.2.172-dev.1 — Check pending payment status
115
+
116
+ - **Affected:** React payment widgets with unresolved payments.
117
+ - **Automatic behavior:** the existing pending-payment screen now offers Check
118
+ payment status. It checks the saved payment reference and cannot submit a new
119
+ payment. The control is disabled while the check runs.
120
+ - **Required host changes:** none. Update Core and React together.
121
+ - **Verification:** complete a test bank payment, return to its pending checkout,
122
+ and check its status. Confirm completion clears recovery storage.
123
+
124
+ ## 0.2.171-dev.1 — SDK payment recovery and completion UI
125
+
126
+ - **Affected:** React payment widgets and custom hosts that persist payment recovery.
127
+ - **Optional adoption:** pass `recoveryStorageKey` to `LockerversePayment` to let
128
+ the SDK save and restore the pending payment in session storage. Use a stable
129
+ key scoped to the API environment, community, and widget. Remove the host's
130
+ storage code and recovery-driven component key. Do not combine automatic
131
+ persistence with a second host persistence writer.
132
+ - **Compatibility:** the SDK reads the hosted Next app's existing version 1
133
+ records when the same key is used. It writes version 2 records with widget
134
+ identity. It checks widget and selection identity before recovery and keeps
135
+ an unresolved record if those details differ. Recovery uses the saved connected
136
+ account even if current payment routing has changed. Storage is read after hydration,
137
+ before the payable form mounts. No contact details or payment tokens are saved.
138
+ - **Optional UI adoption:** use `completionView="summary"` for the SDK confirmation
139
+ panel and remove the host's duplicate success panel. Completion callbacks still
140
+ run. The default inline message and explicit `resumePayment` integrations remain
141
+ supported. Auctions and legacy custom checkout forms are unchanged.
142
+ - **Check:** reload a pending checkout and confirm the existing payment is checked;
143
+ verify a changed selection cannot discard it. Check both paid and free order
144
+ confirmation panels. Do not submit a live transaction for this check.
145
+
146
+ ## 0.2.169-dev.1 — six-month payment widgets
101
147
 
102
148
  Affected: @lockerverse/sdk checkout and @lockerverse/react payment widgets.
103
149
 
@@ -113,6 +159,31 @@ Affected: @lockerverse/sdk checkout and @lockerverse/react payment widgets.
113
159
  submission. Do not submit a live payment for an integration check.
114
160
 
115
161
 
162
+ ## 0.2.168-dev.1 — bank authorization terms
163
+
164
+ - **Affected:** React payment widgets with ACH enabled.
165
+ - **Automatic:** Stripe displays its bank authorization terms before payment confirmation.
166
+ - **Adoption:** update the matching SDK/React development pair. No prop changes are required.
167
+ - **Check:** confirm that the bank authorization text is visible when a bank account is selected.
168
+
169
+ ## 0.2.167-dev.1 — widget ACH and subscription payment recovery
170
+
171
+ - **Affected:** Core checkout data and React payment widgets.
172
+ - **Automatic:** bank payment availability follows the organization default and
173
+ community override returned by the backend. Missing policy remains disabled.
174
+ Pending payments keep their existing payment reference. A failed subscription
175
+ invoice can return `action_required` with `requiresAction: false` and `retryUrl`;
176
+ React shows a link to pay the same invoice instead of creating a second subscription.
177
+ - **Required for custom payment UI:** preserve the reference for pending and
178
+ action-required results. Handle `retryUrl` by opening that invoice, and recover
179
+ status before permitting a new checkout. Do not treat submission as settlement.
180
+ - **Adoption:** deploy the matching backend policy and recovery contract before
181
+ enabling ACH. Existing React hosts need no component prop changes. Keep Core and
182
+ React versions matched when upgrading. Auction payment methods are unchanged.
183
+ - **Check:** verify disabled/inherited/enabled bank visibility and pending, bank
184
+ verification, invoice retry, success, and terminal failure in Stripe test mode.
185
+ Do not create a live transaction for this check.
186
+
116
187
  ## 0.2.166 — single dropdown arrow
117
188
 
118
189
  - **Affected:** native single-select custom fields in React signup and payment forms.
package/dist/checkout.js CHANGED
@@ -1,2 +1,2 @@
1
- import{a as e,i as t,n,r,t as i}from"./schema-helpers.js";import{i as a,n as o,o as s,t as c}from"./transport.js";import{n as l,t as u}from"./types.js";import{n as d,r as f,t as p}from"./valibot.gen.js";import{array as m,boolean as h,check as g,finite as _,literal as v,looseObject as y,maxValue as b,minLength as x,minValue as S,nullable as C,number as w,object as T,optional as E,parser as D,picklist as O,pipe as k,record as A,regex as j,safeParse as M,strictObject as N,string as P,transform as F,union as ee,unknown as I,variant as te}from"valibot";function ne(e){let t=a(e,`widgetSlug`);return{...t,widgetSlug:t.resourceSlug,widgetSlugValue:t.resourceSlugValue}}const L=O([`one-time`,`monthly`,`annually`,`every-six-months`]),R=O([`none`,`event_admission`]),z=C(e(0)),re=O([`available`,`sold_out`]),ie=E(T({listings:m(T({listingId:r,maxPurchasableQuantity:z,remainingQuantity:z,status:re})),sharedLimits:m(T({id:r,listingIds:m(r),remainingQuantity:e(0),status:re}))}),{listings:[],sharedLimits:[]}),ae=k(P(),j(/^pk_(?:test|live)_\S+$/,`Invalid publishable key.`)),oe={description:t,fulfillmentType:R,id:r,inventoryQuantity:z,maxQuantity:z,minimumAmountCents:z,minQuantity:z,name:r,paymentOption:L},B=T({description:C(P()),endAt:r,id:r,location:C(P()),name:r,startAt:r,status:O([`draft`,`active`,`finished`,`cancelled`])}),se=te(`pricingMode`,[T({...oe,amountCents:e(0),pricingMode:v(`fixed`)}),T({...oe,amountCents:z,pricingMode:v(`custom`)})]),ce=T({acceptsDiscounts:E(h(),!1),id:r,maxQuantityPerOrder:E(z,null),product:se,productId:r,slug:r}),V=E(T({memberId:E(h(),!1),merchSize:E(h(),!1),phone:E(h(),!1),promoCode:E(h(),!1),serviceFee:E(h(),!1),shipping:E(h(),!1),tipping:E(h(),!1)}),{}),le=k(T({availability:ie,community:E(T({color:P(),memberIdLabel:E(C(P())),name:r,thumbnail:C(P()),widgetAchEnabled:E(h())})),config:E(T({customFields:n,fields:V})),description:t,event:C(B),id:E(P(),``),name:E(P(),`Lockerverse widget`),payment:T({connectedAccountId:E(C(r),null),currency:v(`usd`),publishableKey:ae}),pricingPolicy:E(T({currency:E(v(`usd`),`usd`),serviceFeeRateBasisPoints:E(e(0),0)})),products:E(m(ce),[]),showCommunityBranding:E(h(),!0),title:t}),F(e=>({...e,config:{customFields:e.config?.customFields??[],fields:{memberId:e.config?.fields?.memberId??!1,merchSize:e.config?.fields?.merchSize??!1,phone:e.config?.fields?.phone??!1,promoCode:e.config?.fields?.promoCode??!1,serviceFee:e.config?.fields?.serviceFee??!1,shipping:e.config?.fields?.shipping??!1,tipping:e.config?.fields?.tipping??!1}},pricingPolicy:e.pricingPolicy??{currency:`usd`,serviceFeeRateBasisPoints:0}}))),ue=T({acceptsDiscounts:h(),amountCents:C(e(0)),description:C(P()),fulfillmentType:R,id:r,inventoryQuantity:z,listingId:r,maximumQuantity:z,minimumAmountCents:z,minimumQuantity:z,name:r,paymentOption:L,pricingMode:O([`fixed`,`custom`]),slug:r}),de=T({availability:ie,community:C(T({accentColor:P(),imageUrl:C(P()),memberIdLabel:E(C(P())),name:r,widgetAchEnabled:E(h())})),event:C(B),payment:T({connectedAccountId:E(C(r),null),currency:v(`usd`),publishableKey:ae}),pricingPolicy:T({currency:v(`usd`),serviceFeeRateBasisPoints:e(0)}),products:m(ue),widget:T({customFields:n,description:C(P()),fields:V,id:P(),name:r,showCommunityBranding:h(),title:C(P())})}),fe=C(T({percentageOff:k(w(),_(),S(0),b(100)),source:O([`email_list`,`promo_code`])})),pe=T({acceptsDiscounts:h(),eventId:C(r),fulfillmentType:R,listingId:r,listingSlug:r,paymentOption:L,pricingMode:O([`fixed`,`custom`]),productId:r,productName:r,quantity:e(1),subtotalCents:e(0),unitAmountCents:e(0)}),me=k(d,T({amountCents:e(0),appliedDiscount:fe,connectedAccountId:C(r),discountableSubtotalCents:e(0),discountCents:e(0),lineItems:m(pe),paymentOption:L,serviceFeeCents:e(0),subtotalCents:e(0),tipCents:e(0),totalCents:e(0)}),g(({lineItems:e,paymentOption:t})=>e.length===0||e.some(e=>e.paymentOption!==t)?!1:t===`one-time`||e.length===1&&e[0]?.pricingMode===`fixed`&&e[0].quantity===1,`Invalid checkout cadence composition.`)),he=k(T({...p.entries,retryUrl:E(k(r,j(/^https:\/\//)))}),g(e=>e.checkoutId.trim()&&e.paymentReference.trim()?e.checkoutStatus===`action_required`?e.paymentRequired&&(e.requiresAction&&!!e.clientSecret?.trim()||!e.requiresAction&&e.clientSecret===null&&!!e.retryUrl):!e.requiresAction&&e.clientSecret===null:!1,`Invalid payment result state.`)),H=D(me),ge=D(de),U=D(he),_e=D(f),ve=D(le);function ye(e){return _e(e),ve(e)}function be(e){let t=M(y({quote:E(I())}),e),n=ye(e),r=t.success?t.output.quote:void 0;return r===void 0?{widget:n}:{quote:H(r),widget:n}}const xe={email:E(P()),includeServiceFee:E(h()),promoCode:E(P()),tipCents:E(e(0))},W=N(xe),G=D(E(W,{})),Se=N({confirmationToken:E(r),customFieldAnswers:E(m(i)),email:P(),memberId:E(P()),merchSize:E(O([`XS`,`S`,`M`,`L`,`XL`,`XXL`,`XXXL`])),metadata:E(A(P(),P())),phone:E(P()),shipping:E(N({address:N({city:P(),country:P(),line1:P(),line2:E(P()),postal_code:P(),state:P()}),name:P()}))}),Ce=ee([N({amountCents:e(1),productId:r}),N({productId:r,quantity:e(1)}),N({productId:r})]),we=ee([N({amountCents:e(1),productSlug:r}),N({productSlug:r,quantity:e(1)}),N({productSlug:r})]),K=k(m(Ce),x(1)),q=k(m(we),x(1)),Te=T({selection:q}),Ee=y({catalog:E(I()),email:E(I()),includeServiceFee:E(I()),items:E(K),promoCode:E(I()),selection:E(q),tipCents:E(I())}),J=k(y({authoritative:v(!0),items:K,payment:T({connectedAccountId:C(r),currency:v(`usd`),publishableKey:k(P(),x(1))}),paymentReference:k(P(),x(1)),pricing:W}),F(e=>{let{items:t,payment:n,paymentReference:r,pricing:i,...a}=e,o=H({...a,connectedAccountId:n.connectedAccountId}),{connectedAccountId:s,...c}=o;return{items:t,pricing:i,quote:{...c,authoritative:!0,payment:{connectedAccountId:s,currency:`usd`,publishableKey:n.publishableKey},paymentOption:o.paymentOption,paymentReference:r}}})),De=y({checkout:J,submission:Se}),Oe=r,ke=D(y({})),Ae=D(Ee);function je(e){let{catalog:t,items:n,selection:r,...i}=Ae(e),a;try{a=ke(t)}catch(e){throw TypeError(`A catalog is required to calculate a checkout.`,{cause:e})}try{return{catalog:a,items:n,pricing:G(i),selection:r}}catch(e){throw TypeError(`Checkout pricing input is invalid.`,{cause:e})}}const Me=D(Te),Ne=D(Oe);D(J);const Pe=D(De),Fe=D(q);function Y(e){return Math.max(100,e.minimumAmountCents??0)}function Ie(e,t){let n=new Map(e.products.map(({id:e,listingId:t})=>[e,t])),r=t.reduce((e,t)=>{let r=n.get(t.productId);return r&&e.set(r,(e.get(r)??0)+(`quantity`in t?t.quantity??1:1)),e},new Map),i=e.availability.listings.some(({listingId:e,maxPurchasableQuantity:t,status:n})=>r.has(e)&&(n===`sold_out`||t!==null&&(r.get(e)??0)>t)),a=e.availability.sharedLimits.some(({listingIds:e,remainingQuantity:t,status:n})=>{let i=e.reduce((e,t)=>e+(r.get(t)??0),0);return i>0&&(n===`sold_out`||i>t)});if(i||a)throw new l({code:`total_calculation_failed`,message:`This option is sold out.`,operation:`calculate_total`,reportable:!1,serverCode:`PAYMENT_WIDGET_SALES_LIMIT_REACHED`})}function Le(e,t){if(e.pricingMode!==`custom`||e.paymentOption!==`one-time`||t<Y(e))throw TypeError(`Selected Product amount is invalid.`);return{checkoutItem:{amountCents:t,productId:e.id},quantity:1,unitAmountCents:t}}function Re(e,t){if(e.pricingMode!==`fixed`||e.amountCents===null)throw TypeError(`Selected Product quantity is invalid.`);if(e.paymentOption!==`one-time`&&t!==1)throw TypeError(`Selected recurring Product is invalid.`);if(e.minimumQuantity!==null&&t<e.minimumQuantity||e.maximumQuantity!==null&&t>e.maximumQuantity||e.inventoryQuantity!==null&&t>e.inventoryQuantity)throw TypeError(`Selected Product quantity is invalid.`);return{checkoutItem:e.paymentOption===`one-time`?{productId:e.id,quantity:t}:{productId:e.id},quantity:t,unitAmountCents:e.amountCents}}function ze(e,t,n){let r=`quantity`in n?n.quantity:1,{checkoutItem:i,quantity:a,unitAmountCents:o}=`amountCents`in n?Le(t,n.amountCents):Re(t,r);return{checkoutItem:i,lineItem:{acceptsDiscounts:t.acceptsDiscounts,eventId:t.fulfillmentType===`event_admission`&&e.event?e.event.id:null,fulfillmentType:t.fulfillmentType,listingId:t.listingId,listingSlug:t.slug,paymentOption:t.paymentOption,pricingMode:t.pricingMode,productId:t.id,productName:t.name,quantity:a,subtotalCents:o*a,unitAmountCents:o}}}function X(e,t){let n=Fe(t),r=new Set,i=n.map(t=>{let n=e.products.find(e=>e.slug===t.productSlug);if(!n)throw TypeError(`Selected Product is unavailable.`);if(r.has(n.id))throw TypeError(`Each Product can appear only once per checkout.`);return r.add(n.id),ze(e,n,t)}),a=i[0]?.lineItem.paymentOption;if(!a)throw TypeError(`Select at least one Product.`);if(i.length>1&&(a!==`one-time`||i.some(({lineItem:e})=>e.paymentOption!==a)))throw TypeError(`Recurring Products must be purchased separately.`);let o=i.map(({checkoutItem:e})=>e);return Ie(e,o),{items:o,lineItems:i.map(({lineItem:e})=>e),paymentOption:a}}function Be(e){let{product:t}=e;return{acceptsDiscounts:e.acceptsDiscounts??!1,amountCents:t.amountCents,description:t.description??null,fulfillmentType:t.fulfillmentType,id:t.id,inventoryQuantity:t.inventoryQuantity,listingId:e.id,maximumQuantity:e.maxQuantityPerOrder,minimumAmountCents:t.minimumAmountCents,minimumQuantity:t.minQuantity,name:t.name,paymentOption:t.paymentOption,pricingMode:t.pricingMode,slug:e.slug}}function Ve(e){if(!e)return null;let t={accentColor:e.color,imageUrl:e.thumbnail||null,name:e.name};return e.widgetAchEnabled!==void 0&&(t.widgetAchEnabled=e.widgetAchEnabled),e.memberIdLabel!==void 0&&(t.memberIdLabel=e.memberIdLabel),t}function He(e){let t=e.config?.fields??{};return{availability:e.availability,community:Ve(e.community),event:e.event?{description:e.event.description,endAt:e.event.endAt,id:e.event.id,location:e.event.location,name:e.event.name,startAt:e.event.startAt,status:e.event.status}:null,payment:{connectedAccountId:e.payment.connectedAccountId,currency:e.payment.currency,publishableKey:e.payment.publishableKey},pricingPolicy:{currency:`usd`,serviceFeeRateBasisPoints:e.pricingPolicy?.serviceFeeRateBasisPoints??0},products:(e.products??[]).map(Be),widget:{customFields:e.config?.customFields??[],description:e.description??null,fields:{memberId:t.memberId??!1,merchSize:t.merchSize??!1,phone:t.phone??!1,promoCode:t.promoCode??!1,serviceFee:t.serviceFee??!1,shipping:t.shipping??!1,tipping:t.tipping??!1},id:e.id??``,name:e.name??`Lockerverse widget`,showCommunityBranding:e.showCommunityBranding??!0,title:e.title??null}}}function Z(e){return Q(e)}function Ue(e){return Q(e)}function We(e){return Q(e)}function Q(e){return s(structuredClone(e))}const Ge=T({code:O([`PAYMENT_WIDGET_PHONE_INVALID`,`PAYMENT_WIDGET_PHONE_REQUIRED`,`PAYMENT_WIDGET_SALES_LIMIT_REACHED`])});async function $(e){if(e.status===400||e.status===409)try{let t=M(Ge,await e.json());return t.success?t.output.code:void 0}catch{}}function Ke({catalog:e,items:t,selection:n}){if(t!==void 0&&n!==void 0)throw TypeError(`Use items or selection, not both.`);let r=Z(ge(e)),i=n===void 0?qe(t):X(r,n).items;return Ie(r,i),{catalog:r,items:i}}function qe(e){if(e===void 0)throw TypeError(`Checkout selection is invalid.`);return e}function Je(e){let{apiBaseUrl:t,communitySlug:n,communitySlugValue:r,environment:i,fetchImplementation:a,onError:u,requestTimeoutMs:d,sentryDsn:f,widgetSlug:p,widgetSlugValue:m}=ne(e),h=o({communitySlug:r,environment:i,getContext:()=>({widgetSlug:m}),onError:u,resourceContextName:`lockerverse_widget`,sentryDsn:f}),{requestJson:g}=c(a,h,d),_=`${t}/v2/community/${n}/payment-widgets/${p}/checkout`,v=`${t}/v2/community/${n}/payment-widgets/${p}`;function y(e,t,n=`invalid_selection`){throw h(new l({code:n,message:e,operation:t,reportable:!1}))}function b(e,t){return e instanceof l?e:new l({...t,reportable:!0})}function x(e,t,n=!1){let r=b(e,t);if(!(n&&(r.status===void 0||r.status>=500)))throw h(r);let i=r.status===void 0?new l({code:r.code,message:r.message,operation:r.operation,recoveryRecommended:!0,reportable:r.reportable}):new l({code:r.code,message:r.message,operation:r.operation,recoveryRecommended:!0,reportable:r.reportable,status:r.status});throw h(i)}function S(e){let t=e.email?.trim().toLowerCase(),n=e.promoCode?.trim(),r={};return t&&(r.email=t),e.includeServiceFee!==void 0&&(r.includeServiceFee=e.includeServiceFee),n&&(r.promoCode=n),e.tipCents!==void 0&&(r.tipCents=e.tipCents),r}function C(e){try{return Me(e).selection}catch{y(`Checkout selection is invalid.`,`load_widget`)}}function w(e,t,n,r){let{connectedAccountId:i,...a}=e;return Ue(s({...a,authoritative:!0,items:t,payment:{connectedAccountId:i,currency:`usd`,publishableKey:r.publishableKey},paymentOption:e.paymentOption,paymentReference:globalThis.crypto.randomUUID(),pricing:n}))}function T(e,t,n){try{return X(e,t).items}catch(e){throw e instanceof TypeError&&y(e.message,n),e}}function E(e,t,n,r){if(!n)throw new l({...r,message:`Lockerverse did not return the requested initial quote.`,reportable:!0});let i=T(e,t,r.operation);return s({catalog:Z(e),checkout:w(n,i,{includeServiceFee:e.widget.fields.serviceFee},e.payment)})}async function D(e){let t={code:`widget_load_failed`,message:`Lockerverse returned an invalid widget catalog.`,operation:`load_widget`},n=e?`${v}?selection=${encodeURIComponent(JSON.stringify(e))}`:v,r=await g(n,e?{cache:`no-store`}:void 0,be,{...t,message:`Unable to load Lockerverse widget because the request failed.`,report:!1},{...t,report:!1},$);if(!r.ok){let e=r.errorValue;throw e===`PAYMENT_WIDGET_SALES_LIMIT_REACHED`?new l({...t,message:`This option is sold out.`,reportable:!1,serverCode:e,status:r.response.status}):new l({...t,message:`Unable to load Lockerverse widget (${r.response.status}).`,reportable:r.response.status>=500,status:r.response.status})}let i=s(He(r.value.widget));return e?E(i,e,r.value.quote,t):Z(i)}async function O(e,t){let n=await D(),r={includeServiceFee:n.widget.fields.serviceFee},i=T(n,e,t.operation);return s({catalog:n,checkout:await j(i,r,n.payment,t)})}async function k(e){let t={code:`widget_load_failed`,message:`Lockerverse returned an invalid widget catalog.`,operation:`load_widget`};try{return e&&`${v}?selection=${encodeURIComponent(JSON.stringify(e))}`.length>4e3?await O(e,t):e?await D(e):await D()}catch(e){x(e,t)}}function A(e){return e===void 0?k():k(C(e))}async function j(e,t,n,r){let i=await g(`${_}/quote`,{body:JSON.stringify({...t,items:e}),headers:{"Content-Type":`application/json`},method:`POST`},H,{...r,message:`Unable to calculate the Lockerverse checkout total because the request failed.`,report:!1},{...r,report:!1},$);if(!i.ok){let e=i.errorValue;throw e===`PAYMENT_WIDGET_SALES_LIMIT_REACHED`?new l({...r,message:`This option is sold out.`,reportable:!1,serverCode:e,status:i.response.status}):new l({...r,message:`Unable to calculate the Lockerverse checkout total (${i.response.status}).`,reportable:i.response.status>=500,status:i.response.status})}return w(i.value,e,t,n)}async function M(e){let{catalog:t,items:n,pricing:r}=N(e),i={code:`total_calculation_failed`,message:`Lockerverse returned an invalid checkout total.`,operation:`calculate_total`};try{return await j(n,r,t.payment,i)}catch(e){x(e,i)}}function N(e){try{let t=je(e),n=Ke(t),r=S(t.pricing);return{catalog:n.catalog,items:n.items,pricing:r.includeServiceFee===void 0?{...r,includeServiceFee:n.catalog.widget.fields.serviceFee}:r}}catch(e){if(e instanceof l)throw e;y(e instanceof TypeError?e.message:`Checkout selection is invalid.`,`calculate_total`)}}function P(e){try{let t=Pe(e),{items:n,pricing:r,quote:i}=t.checkout,a=S(r),o=s(i),{submission:c}=t;o.totalCents>0&&!c.confirmationToken&&y(`Stripe confirmation is required for a paid checkout.`,`submit_payment`,`payment_submit_failed`);let l=c.email.trim().toLowerCase();return(!l||l!==a.email)&&y(`Payment email must match the current checkout quote.`,`submit_payment`),{items:n,pricing:a,quote:o,submission:{...c,email:l}}}catch(e){if(e instanceof l)throw e;y(`Lockerverse payment submission is invalid.`,`submit_payment`,`payment_submit_failed`)}}return{calculateTotal:M,async getPaymentStatus(e){let t;try{t=Ne(e).trim()}catch{y(`Provide a payment reference to recover its status.`,`get_payment_status`)}let n={code:`payment_status_failed`,message:`Lockerverse returned an invalid payment status.`,operation:`get_payment_status`};try{let e=await g(`${_}/${encodeURIComponent(t)}/status`,void 0,U,{...n,message:`Unable to recover the Lockerverse payment status because the request failed.`,report:!1},{...n,report:!1});if(!e.ok)throw new l({...n,message:`Unable to recover the Lockerverse payment status (${e.response.status}).`,reportable:e.response.status>=500,status:e.response.status});if(e.value.paymentReference!==t)throw new l({...n,reportable:!0});return We(e.value)}catch(e){x(e,n)}},load:A,async submitPayment(e){let{items:t,pricing:n,quote:r,submission:i}=P(e),a={code:`payment_submit_failed`,message:`Lockerverse returned an invalid payment confirmation.`,operation:`submit_payment`};try{let e=await g(`${_}/confirm`,{body:JSON.stringify({confirmationToken:i.confirmationToken,customFieldAnswers:i.customFieldAnswers,email:i.email,expectedAmountCents:r.amountCents,expectedAppliedDiscount:r.appliedDiscount,expectedConnectedAccountId:r.payment.connectedAccountId,expectedDiscountableSubtotalCents:r.discountableSubtotalCents,expectedDiscountCents:r.discountCents,expectedServiceFeeCents:r.serviceFeeCents,expectedSubtotalCents:r.subtotalCents,expectedTipCents:r.tipCents,expectedTotalCents:r.totalCents,...n,items:t,memberId:i.memberId,merchSize:i.merchSize,metadata:i.metadata,paymentReference:r.paymentReference,phone:i.phone,quoteContractVersion:1,shipping:i.shipping}),headers:{"Content-Type":`application/json`},method:`POST`},U,{...a,message:`Unable to submit the Lockerverse payment because the request failed.`,report:!1},{...a,report:!1},$);if(!e.ok){let t=e.errorValue;throw t?new l({...a,message:t===`PAYMENT_WIDGET_SALES_LIMIT_REACHED`?`This option is sold out.`:`Unable to submit the Lockerverse payment (${e.response.status}).`,reportable:!1,serverCode:t,status:e.response.status}):new l({...a,message:`Unable to submit the Lockerverse payment (${e.response.status}).`,reportable:e.response.status>=500,status:e.response.status})}if(e.value.paymentReference!==r.paymentReference)throw new l({...a,reportable:!0});return We(e.value)}catch(e){x(e,a,!0)}}}}function Ye(e,t){let{selection:n,...r}=t,i;try{i=G(r)}catch(e){throw TypeError(`Checkout pricing is invalid.`,{cause:e})}let a=i.includeServiceFee??e.widget.fields.serviceFee,{tipCents:o=0}=i,{items:c,lineItems:l,paymentOption:u}=X(e,n),d=l.reduce((e,t)=>e+t.subtotalCents,0);if(!Number.isSafeInteger(d)||d<=0||d>2147483647)throw TypeError(`Checkout total is invalid.`);let f=l.reduce((e,t)=>e+(t.acceptsDiscounts?t.subtotalCents:0),0),p=a?Math.round(d*e.pricingPolicy.serviceFeeRateBasisPoints/1e4):0,m=d+p,h=m+o;if(!Number.isSafeInteger(h)||h>2147483647)throw TypeError(`Checkout total is invalid.`);return s({amountCents:m,appliedDiscount:null,authoritative:!1,discountableSubtotalCents:f,discountCents:0,items:c,lineItems:l,paymentOption:u,serviceFeeCents:p,subtotalCents:d,tipCents:o,totalCents:h})}export{u as LOCKERVERSE_SDK_VERSION,l as LockerverseSdkError,Je as createLockerverseCheckoutClient,Ye as estimateLockerverseCheckout,Y as getLockerverseMinimumCustomAmountCents};
1
+ import{a as e,i as t,n,r,t as i}from"./schema-helpers.js";import{i as a,n as o,o as s,t as c}from"./transport.js";import{n as l,t as u}from"./types.js";import{n as d,r as f,t as p}from"./valibot.gen.js";import{array as m,boolean as h,check as g,finite as _,literal as v,looseObject as y,maxValue as b,minLength as x,minValue as S,nullable as C,number as w,object as T,optional as E,parser as D,picklist as O,pipe as k,record as A,regex as j,safeParse as M,strictObject as N,string as P,transform as F,union as ee,unknown as I,variant as te}from"valibot";function ne(e){let t=a(e,`widgetSlug`);return{...t,widgetSlug:t.resourceSlug,widgetSlugValue:t.resourceSlugValue}}const L=O([`one-time`,`monthly`,`annually`,`every-six-months`]),R=O([`none`,`event_admission`]),z=C(e(0)),re=O([`available`,`sold_out`]),ie=E(T({listings:m(T({listingId:r,maxPurchasableQuantity:z,remainingQuantity:z,status:re})),sharedLimits:m(T({id:r,listingIds:m(r),remainingQuantity:e(0),status:re}))}),{listings:[],sharedLimits:[]}),ae=k(P(),j(/^pk_(?:test|live)_\S+$/,`Invalid publishable key.`)),oe={description:t,fulfillmentType:R,id:r,inventoryQuantity:z,maxQuantity:z,minimumAmountCents:z,minQuantity:z,name:r,paymentOption:L},B=T({description:C(P()),endAt:r,id:r,location:C(P()),name:r,startAt:r,status:O([`draft`,`active`,`finished`,`cancelled`])}),se=te(`pricingMode`,[T({...oe,amountCents:e(0),pricingMode:v(`fixed`)}),T({...oe,amountCents:z,pricingMode:v(`custom`)})]),ce=T({acceptsDiscounts:E(h(),!1),id:r,maxQuantityPerOrder:E(z,null),product:se,productId:r,slug:r}),V=E(T({memberId:E(h(),!1),merchSize:E(h(),!1),phone:E(h(),!1),promoCode:E(h(),!1),serviceFee:E(h(),!1),shipping:E(h(),!1),tipping:E(h(),!1)}),{}),le=k(T({availability:ie,community:E(T({color:P(),memberIdLabel:E(C(P())),name:r,thumbnail:C(P()),widgetAchEnabled:E(h())})),config:E(T({customFields:n,fields:V})),description:t,event:C(B),id:E(P(),``),name:E(P(),`Lockerverse widget`),payment:T({connectedAccountId:E(C(r),null),currency:v(`usd`),publishableKey:ae}),pricingPolicy:E(T({currency:E(v(`usd`),`usd`),serviceFeeRateBasisPoints:E(e(0),0)})),products:E(m(ce),[]),showCommunityBranding:E(h(),!0),title:t}),F(e=>({...e,config:{customFields:e.config?.customFields??[],fields:{memberId:e.config?.fields?.memberId??!1,merchSize:e.config?.fields?.merchSize??!1,phone:e.config?.fields?.phone??!1,promoCode:e.config?.fields?.promoCode??!1,serviceFee:e.config?.fields?.serviceFee??!1,shipping:e.config?.fields?.shipping??!1,tipping:e.config?.fields?.tipping??!1}},pricingPolicy:e.pricingPolicy??{currency:`usd`,serviceFeeRateBasisPoints:0}}))),ue=T({acceptsDiscounts:h(),amountCents:C(e(0)),description:C(P()),fulfillmentType:R,id:r,inventoryQuantity:z,listingId:r,maximumQuantity:z,minimumAmountCents:z,minimumQuantity:z,name:r,paymentOption:L,pricingMode:O([`fixed`,`custom`]),slug:r}),de=T({availability:ie,community:C(T({accentColor:P(),imageUrl:C(P()),memberIdLabel:E(C(P())),name:r,widgetAchEnabled:E(h())})),event:C(B),payment:T({connectedAccountId:E(C(r),null),currency:v(`usd`),publishableKey:ae}),pricingPolicy:T({currency:v(`usd`),serviceFeeRateBasisPoints:e(0)}),products:m(ue),widget:T({customFields:n,description:C(P()),fields:V,id:P(),name:r,showCommunityBranding:h(),title:C(P())})}),fe=C(T({percentageOff:k(w(),_(),S(0),b(100)),source:O([`email_list`,`promo_code`])})),pe=T({acceptsDiscounts:h(),eventId:C(r),fulfillmentType:R,listingId:r,listingSlug:r,paymentOption:L,pricingMode:O([`fixed`,`custom`]),productId:r,productName:r,quantity:e(1),subtotalCents:e(0),unitAmountCents:e(0)}),me=k(d,T({amountCents:e(0),appliedDiscount:fe,connectedAccountId:C(r),discountableSubtotalCents:e(0),discountCents:e(0),lineItems:m(pe),paymentOption:L,serviceFeeCents:e(0),subtotalCents:e(0),tipCents:e(0),totalCents:e(0)}),g(({lineItems:e,paymentOption:t})=>e.length===0||e.some(e=>e.paymentOption!==t)?!1:t===`one-time`||e.length===1&&e[0]?.pricingMode===`fixed`&&e[0].quantity===1,`Invalid checkout cadence composition.`)),he=k(T({...p.entries,retryUrl:E(k(r,j(/^https:\/\//)))}),g(e=>e.checkoutId.trim()&&e.paymentReference.trim()?e.checkoutStatus===`action_required`?e.paymentRequired&&(e.requiresAction&&!!e.clientSecret?.trim()||!e.requiresAction&&e.clientSecret===null&&!!e.retryUrl):!e.requiresAction&&e.clientSecret===null:!1,`Invalid payment result state.`)),H=D(me),ge=D(de),U=D(he),_e=D(f),ve=D(le);function ye(e){return _e(e),ve(e)}function be(e){let t=M(y({quote:E(I())}),e),n=ye(e),r=t.success?t.output.quote:void 0;return r===void 0?{widget:n}:{quote:H(r),widget:n}}const xe={email:E(P()),includeServiceFee:E(h()),promoCode:E(P()),tipCents:E(e(0))},W=N(xe),G=D(E(W,{})),Se=N({confirmationToken:E(r),customFieldAnswers:E(m(i)),email:P(),memberId:E(P()),merchSize:E(O([`XS`,`S`,`M`,`L`,`XL`,`XXL`,`XXXL`])),metadata:E(A(P(),P())),paymentMethodConfiguration:E(v(`explicit`)),phone:E(P()),shipping:E(N({address:N({city:P(),country:P(),line1:P(),line2:E(P()),postal_code:P(),state:P()}),name:P()}))}),Ce=ee([N({amountCents:e(1),productId:r}),N({productId:r,quantity:e(1)}),N({productId:r})]),we=ee([N({amountCents:e(1),productSlug:r}),N({productSlug:r,quantity:e(1)}),N({productSlug:r})]),K=k(m(Ce),x(1)),q=k(m(we),x(1)),Te=T({selection:q}),Ee=y({catalog:E(I()),email:E(I()),includeServiceFee:E(I()),items:E(K),promoCode:E(I()),selection:E(q),tipCents:E(I())}),J=k(y({authoritative:v(!0),items:K,payment:T({connectedAccountId:C(r),currency:v(`usd`),publishableKey:k(P(),x(1))}),paymentReference:k(P(),x(1)),pricing:W}),F(e=>{let{items:t,payment:n,paymentReference:r,pricing:i,...a}=e,o=H({...a,connectedAccountId:n.connectedAccountId}),{connectedAccountId:s,...c}=o;return{items:t,pricing:i,quote:{...c,authoritative:!0,payment:{connectedAccountId:s,currency:`usd`,publishableKey:n.publishableKey},paymentOption:o.paymentOption,paymentReference:r}}})),De=y({checkout:J,submission:Se}),Oe=r,ke=D(y({})),Ae=D(Ee);function je(e){let{catalog:t,items:n,selection:r,...i}=Ae(e),a;try{a=ke(t)}catch(e){throw TypeError(`A catalog is required to calculate a checkout.`,{cause:e})}try{return{catalog:a,items:n,pricing:G(i),selection:r}}catch(e){throw TypeError(`Checkout pricing input is invalid.`,{cause:e})}}const Me=D(Te),Ne=D(Oe);D(J);const Pe=D(De),Fe=D(q);function Y(e){return Math.max(100,e.minimumAmountCents??0)}function Ie(e,t){let n=new Map(e.products.map(({id:e,listingId:t})=>[e,t])),r=t.reduce((e,t)=>{let r=n.get(t.productId);return r&&e.set(r,(e.get(r)??0)+(`quantity`in t?t.quantity??1:1)),e},new Map),i=e.availability.listings.some(({listingId:e,maxPurchasableQuantity:t,status:n})=>r.has(e)&&(n===`sold_out`||t!==null&&(r.get(e)??0)>t)),a=e.availability.sharedLimits.some(({listingIds:e,remainingQuantity:t,status:n})=>{let i=e.reduce((e,t)=>e+(r.get(t)??0),0);return i>0&&(n===`sold_out`||i>t)});if(i||a)throw new l({code:`total_calculation_failed`,message:`This option is sold out.`,operation:`calculate_total`,reportable:!1,serverCode:`PAYMENT_WIDGET_SALES_LIMIT_REACHED`})}function Le(e,t){if(e.pricingMode!==`custom`||e.paymentOption!==`one-time`||t<Y(e))throw TypeError(`Selected Product amount is invalid.`);return{checkoutItem:{amountCents:t,productId:e.id},quantity:1,unitAmountCents:t}}function Re(e,t){if(e.pricingMode!==`fixed`||e.amountCents===null)throw TypeError(`Selected Product quantity is invalid.`);if(e.paymentOption!==`one-time`&&t!==1)throw TypeError(`Selected recurring Product is invalid.`);if(e.minimumQuantity!==null&&t<e.minimumQuantity||e.maximumQuantity!==null&&t>e.maximumQuantity||e.inventoryQuantity!==null&&t>e.inventoryQuantity)throw TypeError(`Selected Product quantity is invalid.`);return{checkoutItem:e.paymentOption===`one-time`?{productId:e.id,quantity:t}:{productId:e.id},quantity:t,unitAmountCents:e.amountCents}}function ze(e,t,n){let r=`quantity`in n?n.quantity:1,{checkoutItem:i,quantity:a,unitAmountCents:o}=`amountCents`in n?Le(t,n.amountCents):Re(t,r);return{checkoutItem:i,lineItem:{acceptsDiscounts:t.acceptsDiscounts,eventId:t.fulfillmentType===`event_admission`&&e.event?e.event.id:null,fulfillmentType:t.fulfillmentType,listingId:t.listingId,listingSlug:t.slug,paymentOption:t.paymentOption,pricingMode:t.pricingMode,productId:t.id,productName:t.name,quantity:a,subtotalCents:o*a,unitAmountCents:o}}}function X(e,t){let n=Fe(t),r=new Set,i=n.map(t=>{let n=e.products.find(e=>e.slug===t.productSlug);if(!n)throw TypeError(`Selected Product is unavailable.`);if(r.has(n.id))throw TypeError(`Each Product can appear only once per checkout.`);return r.add(n.id),ze(e,n,t)}),a=i[0]?.lineItem.paymentOption;if(!a)throw TypeError(`Select at least one Product.`);if(i.length>1&&(a!==`one-time`||i.some(({lineItem:e})=>e.paymentOption!==a)))throw TypeError(`Recurring Products must be purchased separately.`);let o=i.map(({checkoutItem:e})=>e);return Ie(e,o),{items:o,lineItems:i.map(({lineItem:e})=>e),paymentOption:a}}function Be(e){let{product:t}=e;return{acceptsDiscounts:e.acceptsDiscounts??!1,amountCents:t.amountCents,description:t.description??null,fulfillmentType:t.fulfillmentType,id:t.id,inventoryQuantity:t.inventoryQuantity,listingId:e.id,maximumQuantity:e.maxQuantityPerOrder,minimumAmountCents:t.minimumAmountCents,minimumQuantity:t.minQuantity,name:t.name,paymentOption:t.paymentOption,pricingMode:t.pricingMode,slug:e.slug}}function Ve(e){if(!e)return null;let t={accentColor:e.color,imageUrl:e.thumbnail||null,name:e.name};return e.widgetAchEnabled!==void 0&&(t.widgetAchEnabled=e.widgetAchEnabled),e.memberIdLabel!==void 0&&(t.memberIdLabel=e.memberIdLabel),t}function He(e){let t=e.config?.fields??{};return{availability:e.availability,community:Ve(e.community),event:e.event?{description:e.event.description,endAt:e.event.endAt,id:e.event.id,location:e.event.location,name:e.event.name,startAt:e.event.startAt,status:e.event.status}:null,payment:{connectedAccountId:e.payment.connectedAccountId,currency:e.payment.currency,publishableKey:e.payment.publishableKey},pricingPolicy:{currency:`usd`,serviceFeeRateBasisPoints:e.pricingPolicy?.serviceFeeRateBasisPoints??0},products:(e.products??[]).map(Be),widget:{customFields:e.config?.customFields??[],description:e.description??null,fields:{memberId:t.memberId??!1,merchSize:t.merchSize??!1,phone:t.phone??!1,promoCode:t.promoCode??!1,serviceFee:t.serviceFee??!1,shipping:t.shipping??!1,tipping:t.tipping??!1},id:e.id??``,name:e.name??`Lockerverse widget`,showCommunityBranding:e.showCommunityBranding??!0,title:e.title??null}}}function Z(e){return Q(e)}function Ue(e){return Q(e)}function We(e){return Q(e)}function Q(e){return s(structuredClone(e))}const Ge=T({code:O([`PAYMENT_WIDGET_PHONE_INVALID`,`PAYMENT_WIDGET_PHONE_REQUIRED`,`PAYMENT_WIDGET_SALES_LIMIT_REACHED`])});async function $(e){if(e.status===400||e.status===409)try{let t=M(Ge,await e.json());return t.success?t.output.code:void 0}catch{}}function Ke({catalog:e,items:t,selection:n}){if(t!==void 0&&n!==void 0)throw TypeError(`Use items or selection, not both.`);let r=Z(ge(e)),i=n===void 0?qe(t):X(r,n).items;return Ie(r,i),{catalog:r,items:i}}function qe(e){if(e===void 0)throw TypeError(`Checkout selection is invalid.`);return e}function Je(e){let{apiBaseUrl:t,communitySlug:n,communitySlugValue:r,environment:i,fetchImplementation:a,onError:u,requestTimeoutMs:d,sentryDsn:f,widgetSlug:p,widgetSlugValue:m}=ne(e),h=o({communitySlug:r,environment:i,getContext:()=>({widgetSlug:m}),onError:u,resourceContextName:`lockerverse_widget`,sentryDsn:f}),{requestJson:g}=c(a,h,d),_=`${t}/v2/community/${n}/payment-widgets/${p}/checkout`,v=`${t}/v2/community/${n}/payment-widgets/${p}`;function y(e,t,n=`invalid_selection`){throw h(new l({code:n,message:e,operation:t,reportable:!1}))}function b(e,t){return e instanceof l?e:new l({...t,reportable:!0})}function x(e,t,n=!1){let r=b(e,t);if(!(n&&(r.status===void 0||r.status>=500)))throw h(r);let i=r.status===void 0?new l({code:r.code,message:r.message,operation:r.operation,recoveryRecommended:!0,reportable:r.reportable}):new l({code:r.code,message:r.message,operation:r.operation,recoveryRecommended:!0,reportable:r.reportable,status:r.status});throw h(i)}function S(e){let t=e.email?.trim().toLowerCase(),n=e.promoCode?.trim(),r={};return t&&(r.email=t),e.includeServiceFee!==void 0&&(r.includeServiceFee=e.includeServiceFee),n&&(r.promoCode=n),e.tipCents!==void 0&&(r.tipCents=e.tipCents),r}function C(e){try{return Me(e).selection}catch{y(`Checkout selection is invalid.`,`load_widget`)}}function w(e,t,n,r){let{connectedAccountId:i,...a}=e;return Ue(s({...a,authoritative:!0,items:t,payment:{connectedAccountId:i,currency:`usd`,publishableKey:r.publishableKey},paymentOption:e.paymentOption,paymentReference:globalThis.crypto.randomUUID(),pricing:n}))}function T(e,t,n){try{return X(e,t).items}catch(e){throw e instanceof TypeError&&y(e.message,n),e}}function E(e,t,n,r){if(!n)throw new l({...r,message:`Lockerverse did not return the requested initial quote.`,reportable:!0});let i=T(e,t,r.operation);return s({catalog:Z(e),checkout:w(n,i,{includeServiceFee:e.widget.fields.serviceFee},e.payment)})}async function D(e){let t={code:`widget_load_failed`,message:`Lockerverse returned an invalid widget catalog.`,operation:`load_widget`},n=e?`${v}?selection=${encodeURIComponent(JSON.stringify(e))}`:v,r=await g(n,e?{cache:`no-store`}:void 0,be,{...t,message:`Unable to load Lockerverse widget because the request failed.`,report:!1},{...t,report:!1},$);if(!r.ok){let e=r.errorValue;throw e===`PAYMENT_WIDGET_SALES_LIMIT_REACHED`?new l({...t,message:`This option is sold out.`,reportable:!1,serverCode:e,status:r.response.status}):new l({...t,message:`Unable to load Lockerverse widget (${r.response.status}).`,reportable:r.response.status>=500,status:r.response.status})}let i=s(He(r.value.widget));return e?E(i,e,r.value.quote,t):Z(i)}async function O(e,t){let n=await D(),r={includeServiceFee:n.widget.fields.serviceFee},i=T(n,e,t.operation);return s({catalog:n,checkout:await j(i,r,n.payment,t)})}async function k(e){let t={code:`widget_load_failed`,message:`Lockerverse returned an invalid widget catalog.`,operation:`load_widget`};try{return e&&`${v}?selection=${encodeURIComponent(JSON.stringify(e))}`.length>4e3?await O(e,t):e?await D(e):await D()}catch(e){x(e,t)}}function A(e){return e===void 0?k():k(C(e))}async function j(e,t,n,r){let i=await g(`${_}/quote`,{body:JSON.stringify({...t,items:e}),headers:{"Content-Type":`application/json`},method:`POST`},H,{...r,message:`Unable to calculate the Lockerverse checkout total because the request failed.`,report:!1},{...r,report:!1},$);if(!i.ok){let e=i.errorValue;throw e===`PAYMENT_WIDGET_SALES_LIMIT_REACHED`?new l({...r,message:`This option is sold out.`,reportable:!1,serverCode:e,status:i.response.status}):new l({...r,message:`Unable to calculate the Lockerverse checkout total (${i.response.status}).`,reportable:i.response.status>=500,status:i.response.status})}return w(i.value,e,t,n)}async function M(e){let{catalog:t,items:n,pricing:r}=N(e),i={code:`total_calculation_failed`,message:`Lockerverse returned an invalid checkout total.`,operation:`calculate_total`};try{return await j(n,r,t.payment,i)}catch(e){x(e,i)}}function N(e){try{let t=je(e),n=Ke(t),r=S(t.pricing);return{catalog:n.catalog,items:n.items,pricing:r.includeServiceFee===void 0?{...r,includeServiceFee:n.catalog.widget.fields.serviceFee}:r}}catch(e){if(e instanceof l)throw e;y(e instanceof TypeError?e.message:`Checkout selection is invalid.`,`calculate_total`)}}function P(e){try{let t=Pe(e),{items:n,pricing:r,quote:i}=t.checkout,a=S(r),o=s(i),{submission:c}=t;o.totalCents>0&&!c.confirmationToken&&y(`Stripe confirmation is required for a paid checkout.`,`submit_payment`,`payment_submit_failed`);let l=c.email.trim().toLowerCase();return(!l||l!==a.email)&&y(`Payment email must match the current checkout quote.`,`submit_payment`),{items:n,pricing:a,quote:o,submission:{...c,email:l}}}catch(e){if(e instanceof l)throw e;y(`Lockerverse payment submission is invalid.`,`submit_payment`,`payment_submit_failed`)}}return{calculateTotal:M,async getPaymentStatus(e){let t;try{t=Ne(e).trim()}catch{y(`Provide a payment reference to recover its status.`,`get_payment_status`)}let n={code:`payment_status_failed`,message:`Lockerverse returned an invalid payment status.`,operation:`get_payment_status`};try{let e=await g(`${_}/${encodeURIComponent(t)}/status`,void 0,U,{...n,message:`Unable to recover the Lockerverse payment status because the request failed.`,report:!1},{...n,report:!1});if(!e.ok)throw new l({...n,message:`Unable to recover the Lockerverse payment status (${e.response.status}).`,reportable:e.response.status>=500,status:e.response.status});if(e.value.paymentReference!==t)throw new l({...n,reportable:!0});return We(e.value)}catch(e){x(e,n)}},load:A,async submitPayment(e){let{items:t,pricing:n,quote:r,submission:i}=P(e),a={code:`payment_submit_failed`,message:`Lockerverse returned an invalid payment confirmation.`,operation:`submit_payment`};try{let e=await g(`${_}/confirm`,{body:JSON.stringify({confirmationToken:i.confirmationToken,customFieldAnswers:i.customFieldAnswers,email:i.email,expectedAmountCents:r.amountCents,expectedAppliedDiscount:r.appliedDiscount,expectedConnectedAccountId:r.payment.connectedAccountId,expectedDiscountableSubtotalCents:r.discountableSubtotalCents,expectedDiscountCents:r.discountCents,expectedServiceFeeCents:r.serviceFeeCents,expectedSubtotalCents:r.subtotalCents,expectedTipCents:r.tipCents,expectedTotalCents:r.totalCents,...n,items:t,memberId:i.memberId,merchSize:i.merchSize,metadata:i.metadata,paymentMethodConfiguration:i.paymentMethodConfiguration,paymentReference:r.paymentReference,phone:i.phone,quoteContractVersion:1,shipping:i.shipping}),headers:{"Content-Type":`application/json`},method:`POST`},U,{...a,message:`Unable to submit the Lockerverse payment because the request failed.`,report:!1},{...a,report:!1},$);if(!e.ok){let t=e.errorValue;throw t?new l({...a,message:t===`PAYMENT_WIDGET_SALES_LIMIT_REACHED`?`This option is sold out.`:`Unable to submit the Lockerverse payment (${e.response.status}).`,reportable:!1,serverCode:t,status:e.response.status}):new l({...a,message:`Unable to submit the Lockerverse payment (${e.response.status}).`,reportable:e.response.status>=500,status:e.response.status})}if(e.value.paymentReference!==r.paymentReference)throw new l({...a,reportable:!0});return We(e.value)}catch(e){x(e,a,!0)}}}}function Ye(e,t){let{selection:n,...r}=t,i;try{i=G(r)}catch(e){throw TypeError(`Checkout pricing is invalid.`,{cause:e})}let a=i.includeServiceFee??e.widget.fields.serviceFee,{tipCents:o=0}=i,{items:c,lineItems:l,paymentOption:u}=X(e,n),d=l.reduce((e,t)=>e+t.subtotalCents,0);if(!Number.isSafeInteger(d)||d<=0||d>2147483647)throw TypeError(`Checkout total is invalid.`);let f=l.reduce((e,t)=>e+(t.acceptsDiscounts?t.subtotalCents:0),0),p=a?Math.round(d*e.pricingPolicy.serviceFeeRateBasisPoints/1e4):0,m=d+p,h=m+o;if(!Number.isSafeInteger(h)||h>2147483647)throw TypeError(`Checkout total is invalid.`);return s({amountCents:m,appliedDiscount:null,authoritative:!1,discountableSubtotalCents:f,discountCents:0,items:c,lineItems:l,paymentOption:u,serviceFeeCents:p,subtotalCents:d,tipCents:o,totalCents:h})}export{u as LOCKERVERSE_SDK_VERSION,l as LockerverseSdkError,Je as createLockerverseCheckoutClient,Ye as estimateLockerverseCheckout,Y as getLockerverseMinimumCustomAmountCents};
2
2
  //# sourceMappingURL=checkout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkout.js","names":[],"sources":["../src/checkout-environment.ts","../src/checkout-schemas.ts","../src/checkout-input-schemas.ts","../src/custom-amount.ts","../src/checkout-selection.ts","../src/snapshots.ts","../src/checkout-client.ts","../src/checkout-estimate.ts"],"sourcesContent":["import { resolveResourceEnvironment } from \"./environment.ts\";\nimport type { CreateLockerverseWidgetOptions } from \"./types.ts\";\n\nexport function resolveWidgetEnvironment(\n options: CreateLockerverseWidgetOptions\n) {\n const runtime = resolveResourceEnvironment(options, \"widgetSlug\");\n return {\n ...runtime,\n widgetSlug: runtime.resourceSlug,\n widgetSlugValue: runtime.resourceSlugValue,\n };\n}\n","import {\n array,\n boolean,\n check,\n finite,\n type InferOutput,\n literal,\n looseObject,\n maxValue,\n minValue,\n nullable,\n number,\n object,\n optional,\n parser,\n picklist,\n pipe,\n regex,\n safeParse,\n string,\n transform,\n unknown,\n variant,\n} from \"valibot\";\n\nimport {\n vPaymentWidgetPaymentResultResponseDto,\n vPaymentWidgetQuoteResponseDto,\n vPublicPaymentWidgetResponseDto,\n} from \"./generated/public-api/valibot.gen.ts\";\nimport {\n customFieldsSchema,\n nonEmptyStringSchema,\n optionalNullableStringSchema,\n safeIntegerSchema,\n} from \"./schema-helpers.ts\";\n\nconst paymentOptionSchema = picklist([\n \"one-time\",\n \"monthly\",\n \"annually\",\n \"every-six-months\",\n]);\nconst fulfillmentTypeSchema = picklist([\"none\", \"event_admission\"]);\nconst nullableNonNegativeIntegerSchema = nullable(safeIntegerSchema(0));\nconst availabilityStatusSchema = picklist([\"available\", \"sold_out\"]);\nconst availabilitySchema = optional(\n object({\n listings: array(\n object({\n listingId: nonEmptyStringSchema,\n maxPurchasableQuantity: nullableNonNegativeIntegerSchema,\n remainingQuantity: nullableNonNegativeIntegerSchema,\n status: availabilityStatusSchema,\n })\n ),\n sharedLimits: array(\n object({\n id: nonEmptyStringSchema,\n listingIds: array(nonEmptyStringSchema),\n remainingQuantity: safeIntegerSchema(0),\n status: availabilityStatusSchema,\n })\n ),\n }),\n { listings: [], sharedLimits: [] }\n);\nconst publishableKeySchema = pipe(\n string(),\n regex(/^pk_(?:test|live)_\\S+$/, \"Invalid publishable key.\")\n);\n\nconst productBaseEntries = {\n description: optionalNullableStringSchema,\n fulfillmentType: fulfillmentTypeSchema,\n id: nonEmptyStringSchema,\n inventoryQuantity: nullableNonNegativeIntegerSchema,\n maxQuantity: nullableNonNegativeIntegerSchema,\n minimumAmountCents: nullableNonNegativeIntegerSchema,\n minQuantity: nullableNonNegativeIntegerSchema,\n name: nonEmptyStringSchema,\n paymentOption: paymentOptionSchema,\n};\n\nconst eventSchema = object({\n description: nullable(string()),\n endAt: nonEmptyStringSchema,\n id: nonEmptyStringSchema,\n location: nullable(string()),\n name: nonEmptyStringSchema,\n startAt: nonEmptyStringSchema,\n status: picklist([\"draft\", \"active\", \"finished\", \"cancelled\"]),\n});\n\nconst publicProductSchema = variant(\"pricingMode\", [\n object({\n ...productBaseEntries,\n amountCents: safeIntegerSchema(0),\n pricingMode: literal(\"fixed\"),\n }),\n object({\n ...productBaseEntries,\n amountCents: nullableNonNegativeIntegerSchema,\n pricingMode: literal(\"custom\"),\n }),\n]);\n\nconst productListingSchema = object({\n acceptsDiscounts: optional(boolean(), false),\n id: nonEmptyStringSchema,\n maxQuantityPerOrder: optional(nullableNonNegativeIntegerSchema, null),\n product: publicProductSchema,\n productId: nonEmptyStringSchema,\n slug: nonEmptyStringSchema,\n});\n\nconst widgetFieldsSchema = optional(\n object({\n memberId: optional(boolean(), false),\n merchSize: optional(boolean(), false),\n phone: optional(boolean(), false),\n promoCode: optional(boolean(), false),\n serviceFee: optional(boolean(), false),\n shipping: optional(boolean(), false),\n tipping: optional(boolean(), false),\n }),\n {}\n);\n\nexport const publicWidgetSchema = pipe(\n object({\n availability: availabilitySchema,\n community: optional(\n object({\n color: string(),\n memberIdLabel: optional(nullable(string())),\n name: nonEmptyStringSchema,\n thumbnail: nullable(string()),\n widgetAchEnabled: optional(boolean()),\n })\n ),\n config: optional(\n object({\n customFields: customFieldsSchema,\n fields: widgetFieldsSchema,\n })\n ),\n description: optionalNullableStringSchema,\n event: nullable(eventSchema),\n id: optional(string(), \"\"),\n name: optional(string(), \"Lockerverse widget\"),\n payment: object({\n connectedAccountId: optional(nullable(nonEmptyStringSchema), null),\n currency: literal(\"usd\"),\n publishableKey: publishableKeySchema,\n }),\n pricingPolicy: optional(\n object({\n currency: optional(literal(\"usd\"), \"usd\"),\n serviceFeeRateBasisPoints: optional(safeIntegerSchema(0), 0),\n })\n ),\n products: optional(array(productListingSchema), []),\n showCommunityBranding: optional(boolean(), true),\n title: optionalNullableStringSchema,\n }),\n transform((widget) => ({\n ...widget,\n config: {\n customFields: widget.config?.customFields ?? [],\n fields: {\n memberId: widget.config?.fields?.memberId ?? false,\n merchSize: widget.config?.fields?.merchSize ?? false,\n phone: widget.config?.fields?.phone ?? false,\n promoCode: widget.config?.fields?.promoCode ?? false,\n serviceFee: widget.config?.fields?.serviceFee ?? false,\n shipping: widget.config?.fields?.shipping ?? false,\n tipping: widget.config?.fields?.tipping ?? false,\n },\n },\n pricingPolicy: widget.pricingPolicy ?? {\n currency: \"usd\" as const,\n serviceFeeRateBasisPoints: 0,\n },\n }))\n);\n\nconst catalogProductSchema = object({\n acceptsDiscounts: boolean(),\n amountCents: nullable(safeIntegerSchema(0)),\n description: nullable(string()),\n fulfillmentType: fulfillmentTypeSchema,\n id: nonEmptyStringSchema,\n inventoryQuantity: nullableNonNegativeIntegerSchema,\n listingId: nonEmptyStringSchema,\n maximumQuantity: nullableNonNegativeIntegerSchema,\n minimumAmountCents: nullableNonNegativeIntegerSchema,\n minimumQuantity: nullableNonNegativeIntegerSchema,\n name: nonEmptyStringSchema,\n paymentOption: paymentOptionSchema,\n pricingMode: picklist([\"fixed\", \"custom\"]),\n slug: nonEmptyStringSchema,\n});\n\nconst catalogSchema = object({\n availability: availabilitySchema,\n community: nullable(\n object({\n accentColor: string(),\n imageUrl: nullable(string()),\n memberIdLabel: optional(nullable(string())),\n name: nonEmptyStringSchema,\n widgetAchEnabled: optional(boolean()),\n })\n ),\n event: nullable(eventSchema),\n payment: object({\n connectedAccountId: optional(nullable(nonEmptyStringSchema), null),\n currency: literal(\"usd\"),\n publishableKey: publishableKeySchema,\n }),\n pricingPolicy: object({\n currency: literal(\"usd\"),\n serviceFeeRateBasisPoints: safeIntegerSchema(0),\n }),\n products: array(catalogProductSchema),\n widget: object({\n customFields: customFieldsSchema,\n description: nullable(string()),\n fields: widgetFieldsSchema,\n id: string(),\n name: nonEmptyStringSchema,\n showCommunityBranding: boolean(),\n title: nullable(string()),\n }),\n});\n\nconst appliedDiscountSchema = nullable(\n object({\n percentageOff: pipe(number(), finite(), minValue(0), maxValue(100)),\n source: picklist([\"email_list\", \"promo_code\"]),\n })\n);\n\nconst checkoutLineItemSchema = object({\n acceptsDiscounts: boolean(),\n eventId: nullable(nonEmptyStringSchema),\n fulfillmentType: fulfillmentTypeSchema,\n listingId: nonEmptyStringSchema,\n listingSlug: nonEmptyStringSchema,\n paymentOption: paymentOptionSchema,\n pricingMode: picklist([\"fixed\", \"custom\"]),\n productId: nonEmptyStringSchema,\n productName: nonEmptyStringSchema,\n quantity: safeIntegerSchema(1),\n subtotalCents: safeIntegerSchema(0),\n unitAmountCents: safeIntegerSchema(0),\n});\n\nexport const checkoutQuoteSchema = pipe(\n vPaymentWidgetQuoteResponseDto,\n object({\n amountCents: safeIntegerSchema(0),\n appliedDiscount: appliedDiscountSchema,\n connectedAccountId: nullable(nonEmptyStringSchema),\n discountableSubtotalCents: safeIntegerSchema(0),\n discountCents: safeIntegerSchema(0),\n lineItems: array(checkoutLineItemSchema),\n paymentOption: paymentOptionSchema,\n serviceFeeCents: safeIntegerSchema(0),\n subtotalCents: safeIntegerSchema(0),\n tipCents: safeIntegerSchema(0),\n totalCents: safeIntegerSchema(0),\n }),\n check(({ lineItems, paymentOption }) => {\n if (\n lineItems.length === 0 ||\n lineItems.some((item) => item.paymentOption !== paymentOption)\n ) {\n return false;\n }\n return (\n paymentOption === \"one-time\" ||\n (lineItems.length === 1 &&\n lineItems[0]?.pricingMode === \"fixed\" &&\n lineItems[0].quantity === 1)\n );\n }, \"Invalid checkout cadence composition.\")\n);\n\nexport const paymentResultSchema = pipe(\n object({\n ...vPaymentWidgetPaymentResultResponseDto.entries,\n retryUrl: optional(pipe(nonEmptyStringSchema, regex(/^https:\\/\\//))),\n }),\n check((payment) => {\n if (!(payment.checkoutId.trim() && payment.paymentReference.trim())) {\n return false;\n }\n if (payment.checkoutStatus === \"action_required\") {\n return (\n payment.paymentRequired &&\n ((payment.requiresAction && Boolean(payment.clientSecret?.trim())) ||\n (!payment.requiresAction &&\n payment.clientSecret === null &&\n Boolean(payment.retryUrl)))\n );\n }\n return !payment.requiresAction && payment.clientSecret === null;\n }, \"Invalid payment result state.\")\n);\n\nexport type PublicCheckoutQuote = InferOutput<typeof checkoutQuoteSchema>;\nexport type PublicProductListing = InferOutput<typeof productListingSchema>;\nexport type PublicWidget = InferOutput<typeof publicWidgetSchema>;\n\nexport const parseCheckoutQuote = parser(checkoutQuoteSchema);\nexport const parseCatalog = parser(catalogSchema);\nexport const parsePaymentResult = parser(paymentResultSchema);\nconst parsePublicWidgetContract = parser(vPublicPaymentWidgetResponseDto);\nconst parseSdkPublicWidget = parser(publicWidgetSchema);\n\nexport function parsePublicWidget<Input>(input: Input) {\n parsePublicWidgetContract(input);\n return parseSdkPublicWidget(input);\n}\n\nexport function parsePublicWidgetLoad<Input>(input: Input) {\n const response = safeParse(\n looseObject({ quote: optional(unknown()) }),\n input\n );\n const widget = parsePublicWidget(input);\n const quote = response.success ? response.output.quote : undefined;\n return quote === undefined\n ? { widget }\n : { quote: parseCheckoutQuote(quote), widget };\n}\n","import {\n array,\n boolean,\n type InferOutput,\n literal,\n looseObject,\n minLength,\n nullable,\n object,\n optional,\n parser,\n picklist,\n pipe,\n record,\n strictObject,\n string,\n transform,\n union,\n unknown,\n} from \"valibot\";\n\nimport { parseCheckoutQuote } from \"./checkout-schemas.ts\";\nimport {\n customFieldAnswerSchema,\n nonEmptyStringSchema,\n safeIntegerSchema,\n} from \"./schema-helpers.ts\";\n\nconst checkoutPricingEntries = {\n email: optional(string()),\n includeServiceFee: optional(boolean()),\n promoCode: optional(string()),\n tipCents: optional(safeIntegerSchema(0)),\n};\n\nconst checkoutPricingInputSchema = strictObject(checkoutPricingEntries);\n\nexport const parseCheckoutPricingInput = parser(\n optional(checkoutPricingInputSchema, {})\n);\n\nconst paymentSubmissionSchema = strictObject({\n confirmationToken: optional(nonEmptyStringSchema),\n customFieldAnswers: optional(array(customFieldAnswerSchema)),\n email: string(),\n memberId: optional(string()),\n merchSize: optional(picklist([\"XS\", \"S\", \"M\", \"L\", \"XL\", \"XXL\", \"XXXL\"])),\n metadata: optional(record(string(), string())),\n phone: optional(string()),\n shipping: optional(\n strictObject({\n address: strictObject({\n city: string(),\n country: string(),\n line1: string(),\n line2: optional(string()),\n postal_code: string(),\n state: string(),\n }),\n name: string(),\n })\n ),\n});\n\nconst checkoutItemSchema = union([\n strictObject({\n amountCents: safeIntegerSchema(1),\n productId: nonEmptyStringSchema,\n }),\n strictObject({\n productId: nonEmptyStringSchema,\n quantity: safeIntegerSchema(1),\n }),\n strictObject({\n productId: nonEmptyStringSchema,\n }),\n]);\n\nconst checkoutSelectionItemSchema = union([\n strictObject({\n amountCents: safeIntegerSchema(1),\n productSlug: nonEmptyStringSchema,\n }),\n strictObject({\n productSlug: nonEmptyStringSchema,\n quantity: safeIntegerSchema(1),\n }),\n strictObject({\n productSlug: nonEmptyStringSchema,\n }),\n]);\n\nconst checkoutItemsSchema = pipe(array(checkoutItemSchema), minLength(1));\nconst checkoutSelectionItemsSchema = pipe(\n array(checkoutSelectionItemSchema),\n minLength(1)\n);\n\nconst loadCheckoutInputSchema = object({\n selection: checkoutSelectionItemsSchema,\n});\n\nconst calculateTotalInputSchema = looseObject({\n catalog: optional(unknown()),\n email: optional(unknown()),\n includeServiceFee: optional(unknown()),\n items: optional(checkoutItemsSchema),\n promoCode: optional(unknown()),\n selection: optional(checkoutSelectionItemsSchema),\n tipCents: optional(unknown()),\n});\n\nconst preparedCheckoutInputSchema = pipe(\n looseObject({\n authoritative: literal(true),\n items: checkoutItemsSchema,\n payment: object({\n connectedAccountId: nullable(nonEmptyStringSchema),\n currency: literal(\"usd\"),\n publishableKey: pipe(string(), minLength(1)),\n }),\n paymentReference: pipe(string(), minLength(1)),\n pricing: checkoutPricingInputSchema,\n }),\n transform((checkout) => {\n const { items, payment, paymentReference, pricing, ...quoteInput } =\n checkout;\n const parsedQuote = parseCheckoutQuote({\n ...quoteInput,\n connectedAccountId: payment.connectedAccountId,\n });\n const { connectedAccountId, ...quote } = parsedQuote;\n return {\n items,\n pricing,\n quote: {\n ...quote,\n authoritative: true as const,\n payment: {\n connectedAccountId,\n currency: \"usd\" as const,\n publishableKey: payment.publishableKey,\n },\n paymentOption: parsedQuote.paymentOption,\n paymentReference,\n },\n };\n })\n);\n\nconst submitPaymentInputSchema = looseObject({\n checkout: preparedCheckoutInputSchema,\n submission: paymentSubmissionSchema,\n});\n\nconst paymentReferenceInputSchema = nonEmptyStringSchema;\nconst parseCatalogInputFields = parser(looseObject({}));\n\nexport type ParsedPreparedCheckoutInput = InferOutput<\n typeof preparedCheckoutInputSchema\n>;\nexport type ParsedLoadCheckoutInput = InferOutput<\n typeof loadCheckoutInputSchema\n>;\nexport type ParsedPaymentReferenceInput = InferOutput<\n typeof paymentReferenceInputSchema\n>;\nexport type ParsedSubmitPaymentInput = InferOutput<\n typeof submitPaymentInputSchema\n>;\n\nconst parseCalculateTotalInputFields = parser(calculateTotalInputSchema);\n\nexport function parseCalculateTotalInput<Input>(input: Input) {\n const { catalog, items, selection, ...pricingInput } =\n parseCalculateTotalInputFields(input);\n let parsedCatalog: ReturnType<typeof parseCatalogInputFields>;\n try {\n parsedCatalog = parseCatalogInputFields(catalog);\n } catch (error) {\n throw new TypeError(\"A catalog is required to calculate a checkout.\", {\n cause: error,\n });\n }\n try {\n return {\n catalog: parsedCatalog,\n items,\n pricing: parseCheckoutPricingInput(pricingInput),\n selection,\n };\n } catch (error) {\n throw new TypeError(\"Checkout pricing input is invalid.\", { cause: error });\n }\n}\n\nexport type ParsedCalculateTotalInput = ReturnType<\n typeof parseCalculateTotalInput\n>;\nexport type ParsedCheckoutPricingInput = InferOutput<\n typeof checkoutPricingInputSchema\n>;\n\nexport const parseLoadCheckoutInput = parser(loadCheckoutInputSchema);\nexport const parsePaymentReferenceInput = parser(paymentReferenceInputSchema);\nexport const parsePreparedCheckoutInput = parser(preparedCheckoutInputSchema);\nexport const parseSubmitPaymentInput = parser(submitPaymentInputSchema);\n\nexport const parseCheckoutSelectionItems = parser(checkoutSelectionItemsSchema);\n","import type { LockerverseProduct } from \"./types.ts\";\n\nconst minimumCustomAmountCents = 100;\n\nexport function getLockerverseMinimumCustomAmountCents(\n product: Pick<LockerverseProduct, \"minimumAmountCents\">\n) {\n return Math.max(minimumCustomAmountCents, product.minimumAmountCents ?? 0);\n}\n","import { parseCheckoutSelectionItems } from \"./checkout-input-schemas.ts\";\nimport { getLockerverseMinimumCustomAmountCents } from \"./custom-amount.ts\";\nimport type {\n LockerverseCatalog,\n LockerverseCheckoutItem,\n LockerverseCheckoutLineItem,\n LockerverseCheckoutSelectionItem,\n LockerverseProduct,\n} from \"./types.ts\";\nimport { LockerverseSdkError } from \"./types.ts\";\n\ntype ResolvedSelectionItem = {\n checkoutItem: LockerverseCheckoutItem;\n quantity: number;\n unitAmountCents: number;\n};\n\nexport function assertCheckoutItemsAreAvailable(\n catalog: LockerverseCatalog,\n items: LockerverseCheckoutItem[]\n) {\n const listingIdByProductId = new Map(\n catalog.products.map(({ id, listingId }) => [id, listingId])\n );\n const requestedByListingId = items.reduce((requested, item) => {\n const listingId = listingIdByProductId.get(item.productId);\n if (listingId) {\n requested.set(\n listingId,\n (requested.get(listingId) ?? 0) +\n (\"quantity\" in item ? (item.quantity ?? 1) : 1)\n );\n }\n return requested;\n }, new Map<string, number>());\n const listingIsSoldOut = catalog.availability.listings.some(\n ({ listingId, maxPurchasableQuantity, status }) =>\n requestedByListingId.has(listingId) &&\n (status === \"sold_out\" ||\n (maxPurchasableQuantity !== null &&\n (requestedByListingId.get(listingId) ?? 0) > maxPurchasableQuantity))\n );\n const sharedLimitIsSoldOut = catalog.availability.sharedLimits.some(\n ({ listingIds, remainingQuantity, status }) => {\n const requestedQuantity = listingIds.reduce(\n (total, listingId) =>\n total + (requestedByListingId.get(listingId) ?? 0),\n 0\n );\n return (\n requestedQuantity > 0 &&\n (status === \"sold_out\" || requestedQuantity > remainingQuantity)\n );\n }\n );\n if (listingIsSoldOut || sharedLimitIsSoldOut) {\n throw new LockerverseSdkError({\n code: \"total_calculation_failed\",\n message: \"This option is sold out.\",\n operation: \"calculate_total\",\n reportable: false,\n serverCode: \"PAYMENT_WIDGET_SALES_LIMIT_REACHED\",\n });\n }\n}\n\nfunction resolveAmountItem(\n product: LockerverseProduct,\n amountCents: number\n): ResolvedSelectionItem {\n if (\n product.pricingMode !== \"custom\" ||\n product.paymentOption !== \"one-time\" ||\n amountCents < getLockerverseMinimumCustomAmountCents(product)\n ) {\n throw new TypeError(\"Selected Product amount is invalid.\");\n }\n return {\n checkoutItem: { amountCents, productId: product.id },\n quantity: 1,\n unitAmountCents: amountCents,\n };\n}\n\nfunction resolveFixedItem(\n product: LockerverseProduct,\n quantity: number\n): ResolvedSelectionItem {\n if (product.pricingMode !== \"fixed\" || product.amountCents === null) {\n throw new TypeError(\"Selected Product quantity is invalid.\");\n }\n if (product.paymentOption !== \"one-time\" && quantity !== 1) {\n throw new TypeError(\"Selected recurring Product is invalid.\");\n }\n if (\n (product.minimumQuantity !== null && quantity < product.minimumQuantity) ||\n (product.maximumQuantity !== null && quantity > product.maximumQuantity) ||\n (product.inventoryQuantity !== null && quantity > product.inventoryQuantity)\n ) {\n throw new TypeError(\"Selected Product quantity is invalid.\");\n }\n return {\n checkoutItem:\n product.paymentOption === \"one-time\"\n ? { productId: product.id, quantity }\n : { productId: product.id },\n quantity,\n unitAmountCents: product.amountCents,\n };\n}\n\nfunction resolveSelectionItem(\n catalog: LockerverseCatalog,\n product: LockerverseProduct,\n selection: LockerverseCheckoutSelectionItem\n) {\n const selectedQuantity = \"quantity\" in selection ? selection.quantity : 1;\n const resolved =\n \"amountCents\" in selection\n ? resolveAmountItem(product, selection.amountCents)\n : resolveFixedItem(product, selectedQuantity);\n const { checkoutItem, quantity, unitAmountCents } = resolved;\n\n return {\n checkoutItem,\n lineItem: {\n acceptsDiscounts: product.acceptsDiscounts,\n eventId:\n product.fulfillmentType === \"event_admission\" && catalog.event\n ? catalog.event.id\n : null,\n fulfillmentType: product.fulfillmentType,\n listingId: product.listingId,\n listingSlug: product.slug,\n paymentOption: product.paymentOption,\n pricingMode: product.pricingMode,\n productId: product.id,\n productName: product.name,\n quantity,\n subtotalCents: unitAmountCents * quantity,\n unitAmountCents,\n } satisfies LockerverseCheckoutLineItem,\n };\n}\n\nexport function resolveCheckoutSelection(\n catalog: LockerverseCatalog,\n input: LockerverseCheckoutSelectionItem[]\n) {\n const selection = parseCheckoutSelectionItems(input);\n const selectedProducts = new Set<string>();\n const resolved = selection.map((item) => {\n const product = catalog.products.find(\n (candidate) => candidate.slug === item.productSlug\n );\n if (!product) {\n throw new TypeError(\"Selected Product is unavailable.\");\n }\n if (selectedProducts.has(product.id)) {\n throw new TypeError(\"Each Product can appear only once per checkout.\");\n }\n selectedProducts.add(product.id);\n return resolveSelectionItem(catalog, product, item);\n });\n const paymentOption = resolved[0]?.lineItem.paymentOption;\n if (!paymentOption) {\n throw new TypeError(\"Select at least one Product.\");\n }\n if (\n resolved.length > 1 &&\n (paymentOption !== \"one-time\" ||\n resolved.some(({ lineItem }) => lineItem.paymentOption !== paymentOption))\n ) {\n throw new TypeError(\"Recurring Products must be purchased separately.\");\n }\n const items = resolved.map(({ checkoutItem }) => checkoutItem);\n assertCheckoutItemsAreAvailable(catalog, items);\n return {\n items,\n lineItems: resolved.map(({ lineItem }) => lineItem),\n paymentOption,\n };\n}\n","import type { PublicProductListing, PublicWidget } from \"./checkout-schemas.ts\";\nimport { deepFreeze } from \"./deep-freeze.ts\";\nimport type {\n LockerverseCatalog,\n LockerverseCommunityBranding,\n LockerversePaymentResult,\n LockerversePreparedCheckout,\n LockerverseProduct,\n} from \"./types.ts\";\n\nfunction mapProduct(listing: PublicProductListing): LockerverseProduct {\n const { product } = listing;\n\n return {\n acceptsDiscounts: listing.acceptsDiscounts ?? false,\n amountCents: product.amountCents,\n description: product.description ?? null,\n fulfillmentType: product.fulfillmentType,\n id: product.id,\n inventoryQuantity: product.inventoryQuantity,\n listingId: listing.id,\n maximumQuantity: listing.maxQuantityPerOrder,\n minimumAmountCents: product.minimumAmountCents,\n minimumQuantity: product.minQuantity,\n name: product.name,\n paymentOption: product.paymentOption,\n pricingMode: product.pricingMode,\n slug: listing.slug,\n };\n}\n\nfunction mapCommunity(\n community: PublicWidget[\"community\"]\n): LockerverseCommunityBranding | null {\n if (!community) {\n return null;\n }\n const branding: LockerverseCommunityBranding = {\n accentColor: community.color,\n imageUrl: community.thumbnail || null,\n name: community.name,\n };\n if (community.widgetAchEnabled !== undefined) {\n branding.widgetAchEnabled = community.widgetAchEnabled;\n }\n if (community.memberIdLabel !== undefined) {\n branding.memberIdLabel = community.memberIdLabel;\n }\n return branding;\n}\n\nexport function createCatalog(widget: PublicWidget): LockerverseCatalog {\n const fields = widget.config?.fields ?? {};\n\n return {\n availability: widget.availability,\n community: mapCommunity(widget.community),\n event: widget.event\n ? {\n description: widget.event.description,\n endAt: widget.event.endAt,\n id: widget.event.id,\n location: widget.event.location,\n name: widget.event.name,\n startAt: widget.event.startAt,\n status: widget.event.status,\n }\n : null,\n payment: {\n connectedAccountId: widget.payment.connectedAccountId,\n currency: widget.payment.currency,\n publishableKey: widget.payment.publishableKey,\n },\n pricingPolicy: {\n currency: \"usd\",\n serviceFeeRateBasisPoints:\n widget.pricingPolicy?.serviceFeeRateBasisPoints ?? 0,\n },\n products: (widget.products ?? []).map(mapProduct),\n widget: {\n customFields: widget.config?.customFields ?? [],\n description: widget.description ?? null,\n fields: {\n memberId: fields.memberId ?? false,\n merchSize: fields.merchSize ?? false,\n phone: fields.phone ?? false,\n promoCode: fields.promoCode ?? false,\n serviceFee: fields.serviceFee ?? false,\n shipping: fields.shipping ?? false,\n tipping: fields.tipping ?? false,\n },\n id: widget.id ?? \"\",\n name: widget.name ?? \"Lockerverse widget\",\n showCommunityBranding: widget.showCommunityBranding ?? true,\n title: widget.title ?? null,\n },\n };\n}\n\nexport function cloneCatalog(catalog: LockerverseCatalog): LockerverseCatalog {\n return cloneSnapshot(catalog);\n}\n\nexport function clonePreparedCheckout(\n checkout: LockerversePreparedCheckout\n): LockerversePreparedCheckout {\n return cloneSnapshot(checkout);\n}\n\nexport function clonePaymentResult(\n paymentResult: LockerversePaymentResult\n): LockerversePaymentResult {\n return cloneSnapshot(paymentResult);\n}\n\nfunction cloneSnapshot<T>(value: T): T {\n return deepFreeze(structuredClone(value));\n}\n","import { object, picklist, safeParse } from \"valibot\";\nimport { resolveWidgetEnvironment } from \"./checkout-environment.ts\";\nimport {\n type ParsedCalculateTotalInput,\n type ParsedCheckoutPricingInput,\n parseCalculateTotalInput,\n parseLoadCheckoutInput,\n parsePaymentReferenceInput,\n parseSubmitPaymentInput,\n} from \"./checkout-input-schemas.ts\";\nimport {\n parseCatalog,\n parseCheckoutQuote,\n parsePaymentResult,\n parsePublicWidgetLoad,\n} from \"./checkout-schemas.ts\";\nimport {\n assertCheckoutItemsAreAvailable,\n resolveCheckoutSelection,\n} from \"./checkout-selection.ts\";\nimport { deepFreeze } from \"./deep-freeze.ts\";\nimport { createSdkErrorReporter } from \"./error-reporting.ts\";\nimport {\n cloneCatalog,\n clonePaymentResult,\n clonePreparedCheckout,\n createCatalog,\n} from \"./snapshots.ts\";\nimport { createTransport } from \"./transport.ts\";\nimport {\n type CreateLockerverseWidgetOptions,\n type LockerverseCalculateTotalInput,\n type LockerverseCatalog,\n type LockerverseCheckoutClient,\n type LockerverseCheckoutItem,\n type LockerverseCheckoutPricingInput,\n type LockerverseCheckoutSelectionItem,\n type LockerverseLoadCheckoutInput,\n type LockerverseLoadedCheckout,\n type LockerversePreparedCheckout,\n LockerverseSdkError,\n type LockerverseSdkOperation,\n type LockerverseSdkServerCode,\n type LockerverseSubmitPaymentInput,\n} from \"./types.ts\";\n\ntype OperationErrorContext = {\n code:\n | \"payment_status_failed\"\n | \"payment_submit_failed\"\n | \"total_calculation_failed\"\n | \"widget_load_failed\";\n message: string;\n operation:\n | \"calculate_total\"\n | \"get_payment_status\"\n | \"load_widget\"\n | \"submit_payment\";\n};\n\nconst MAX_SELECTED_WIDGET_URL_LENGTH = 4000;\nconst paymentServerErrorSchema = object({\n code: picklist([\n \"PAYMENT_WIDGET_PHONE_INVALID\",\n \"PAYMENT_WIDGET_PHONE_REQUIRED\",\n \"PAYMENT_WIDGET_SALES_LIMIT_REACHED\",\n ]),\n});\n\nasync function readPaymentServerCode(\n response: Response\n): Promise<LockerverseSdkServerCode | undefined> {\n if (response.status !== 400 && response.status !== 409) {\n return;\n }\n try {\n const result = safeParse(paymentServerErrorSchema, await response.json());\n return result.success ? result.output.code : undefined;\n } catch {\n // Non-JSON error bodies do not contain a safe server code.\n }\n}\n\nfunction resolveCalculateTotalItems({\n catalog,\n items,\n selection,\n}: ParsedCalculateTotalInput) {\n if (items !== undefined && selection !== undefined) {\n throw new TypeError(\"Use items or selection, not both.\");\n }\n const selectionCatalog = cloneCatalog(parseCatalog(catalog));\n const checkoutItems =\n selection === undefined\n ? requireCheckoutItems(items)\n : resolveCheckoutSelection(selectionCatalog, selection).items;\n assertCheckoutItemsAreAvailable(selectionCatalog, checkoutItems);\n return {\n catalog: selectionCatalog,\n items: checkoutItems,\n };\n}\n\nfunction requireCheckoutItems(\n items: ParsedCalculateTotalInput[\"items\"]\n): LockerverseCheckoutItem[] {\n if (items === undefined) {\n throw new TypeError(\"Checkout selection is invalid.\");\n }\n return items;\n}\n\nexport function createLockerverseCheckoutClient(\n options: CreateLockerverseWidgetOptions\n): LockerverseCheckoutClient {\n const {\n apiBaseUrl,\n communitySlug,\n communitySlugValue,\n environment,\n fetchImplementation,\n onError,\n requestTimeoutMs,\n sentryDsn,\n widgetSlug,\n widgetSlugValue,\n } = resolveWidgetEnvironment(options);\n const reportError = createSdkErrorReporter({\n communitySlug: communitySlugValue,\n environment,\n getContext: () => ({ widgetSlug: widgetSlugValue }),\n onError,\n resourceContextName: \"lockerverse_widget\",\n sentryDsn,\n });\n const { requestJson } = createTransport(\n fetchImplementation,\n reportError,\n requestTimeoutMs\n );\n const checkoutBaseUrl = `${apiBaseUrl}/v2/community/${communitySlug}/payment-widgets/${widgetSlug}/checkout`;\n const widgetUrl = `${apiBaseUrl}/v2/community/${communitySlug}/payment-widgets/${widgetSlug}`;\n\n function invalidInput(\n message: string,\n operation: LockerverseSdkOperation,\n code: \"invalid_selection\" | \"payment_submit_failed\" = \"invalid_selection\"\n ): never {\n throw reportError(\n new LockerverseSdkError({\n code,\n message,\n operation,\n reportable: false,\n })\n );\n }\n\n function normalizeOperationError<ErrorValue>(\n error: ErrorValue,\n context: OperationErrorContext\n ) {\n return error instanceof LockerverseSdkError\n ? error\n : new LockerverseSdkError({ ...context, reportable: true });\n }\n\n function failOperation<ErrorValue>(\n error: ErrorValue,\n context: OperationErrorContext,\n recoveryMayBeRequired = false\n ): never {\n const normalized = normalizeOperationError(error, context);\n const recoveryRecommended =\n recoveryMayBeRequired &&\n (normalized.status === undefined || normalized.status >= 500);\n if (!recoveryRecommended) {\n throw reportError(normalized);\n }\n const recoveryError =\n normalized.status === undefined\n ? new LockerverseSdkError({\n code: normalized.code,\n message: normalized.message,\n operation: normalized.operation,\n recoveryRecommended: true,\n reportable: normalized.reportable,\n })\n : new LockerverseSdkError({\n code: normalized.code,\n message: normalized.message,\n operation: normalized.operation,\n recoveryRecommended: true,\n reportable: normalized.reportable,\n status: normalized.status,\n });\n throw reportError(recoveryError);\n }\n\n function normalizePricingInput(input: ParsedCheckoutPricingInput) {\n const email = input.email?.trim().toLowerCase();\n const promoCode = input.promoCode?.trim();\n const pricing: LockerverseCheckoutPricingInput = {};\n if (email) {\n pricing.email = email;\n }\n if (input.includeServiceFee !== undefined) {\n pricing.includeServiceFee = input.includeServiceFee;\n }\n if (promoCode) {\n pricing.promoCode = promoCode;\n }\n if (input.tipCents !== undefined) {\n pricing.tipCents = input.tipCents;\n }\n return pricing;\n }\n\n function normalizeLoadSelection(input: LockerverseLoadCheckoutInput) {\n try {\n return parseLoadCheckoutInput(input).selection;\n } catch {\n invalidInput(\"Checkout selection is invalid.\", \"load_widget\");\n }\n }\n\n function createPreparedCheckout(\n quote: ReturnType<typeof parseCheckoutQuote>,\n items: LockerverseCheckoutItem[],\n pricing: LockerverseCheckoutPricingInput,\n payment: LockerverseCatalog[\"payment\"]\n ): LockerversePreparedCheckout {\n const { connectedAccountId, ...checkoutQuote } = quote;\n return clonePreparedCheckout(\n deepFreeze({\n ...checkoutQuote,\n authoritative: true as const,\n items,\n payment: {\n connectedAccountId,\n currency: \"usd\" as const,\n publishableKey: payment.publishableKey,\n },\n paymentOption: quote.paymentOption,\n paymentReference: globalThis.crypto.randomUUID(),\n pricing,\n })\n );\n }\n\n function resolveSelectedCheckoutItems(\n catalog: LockerverseCatalog,\n selection: LockerverseCheckoutSelectionItem[],\n operation: LockerverseSdkOperation\n ) {\n try {\n return resolveCheckoutSelection(catalog, selection).items;\n } catch (error) {\n if (error instanceof TypeError) {\n invalidInput(error.message, operation);\n }\n throw error;\n }\n }\n\n function createSelectedCheckout(\n catalog: LockerverseCatalog,\n selection: LockerverseCheckoutSelectionItem[],\n quote: ReturnType<typeof parseCheckoutQuote> | undefined,\n context: OperationErrorContext\n ) {\n if (!quote) {\n throw new LockerverseSdkError({\n ...context,\n message: \"Lockerverse did not return the requested initial quote.\",\n reportable: true,\n });\n }\n const checkoutItems = resolveSelectedCheckoutItems(\n catalog,\n selection,\n context.operation\n );\n return deepFreeze({\n catalog: cloneCatalog(catalog),\n checkout: createPreparedCheckout(\n quote,\n checkoutItems,\n { includeServiceFee: catalog.widget.fields.serviceFee },\n catalog.payment\n ),\n });\n }\n\n function requestWidgetResource(): Promise<LockerverseCatalog>;\n function requestWidgetResource(\n selection: LockerverseCheckoutSelectionItem[]\n ): Promise<LockerverseLoadedCheckout>;\n async function requestWidgetResource(\n selection?: LockerverseCheckoutSelectionItem[]\n ): Promise<LockerverseCatalog | LockerverseLoadedCheckout> {\n const context = {\n code: \"widget_load_failed\" as const,\n message: \"Lockerverse returned an invalid widget catalog.\",\n operation: \"load_widget\" as const,\n };\n const requestUrl = selection\n ? `${widgetUrl}?selection=${encodeURIComponent(JSON.stringify(selection))}`\n : widgetUrl;\n const response = await requestJson(\n requestUrl,\n selection ? { cache: \"no-store\" } : undefined,\n parsePublicWidgetLoad,\n {\n ...context,\n message:\n \"Unable to load Lockerverse widget because the request failed.\",\n report: false,\n },\n { ...context, report: false },\n readPaymentServerCode\n );\n if (!response.ok) {\n const serverCode = response.errorValue;\n if (serverCode === \"PAYMENT_WIDGET_SALES_LIMIT_REACHED\") {\n throw new LockerverseSdkError({\n ...context,\n message: \"This option is sold out.\",\n reportable: false,\n serverCode,\n status: response.response.status,\n });\n }\n throw new LockerverseSdkError({\n ...context,\n message: `Unable to load Lockerverse widget (${response.response.status}).`,\n reportable: response.response.status >= 500,\n status: response.response.status,\n });\n }\n const catalog = deepFreeze(createCatalog(response.value.widget));\n if (!selection) {\n return cloneCatalog(catalog);\n }\n return createSelectedCheckout(\n catalog,\n selection,\n response.value.quote,\n context\n );\n }\n\n async function loadLargeSelection(\n selection: LockerverseCheckoutSelectionItem[],\n context: OperationErrorContext\n ): Promise<LockerverseLoadedCheckout> {\n const loaded = await requestWidgetResource();\n const pricing = {\n includeServiceFee: loaded.widget.fields.serviceFee,\n };\n const items = resolveSelectedCheckoutItems(\n loaded,\n selection,\n context.operation\n );\n return deepFreeze({\n catalog: loaded,\n checkout: await requestCheckoutQuote(\n items,\n pricing,\n loaded.payment,\n context\n ),\n });\n }\n\n async function loadWidget(\n selection?: LockerverseCheckoutSelectionItem[]\n ): Promise<LockerverseCatalog | LockerverseLoadedCheckout> {\n const context = {\n code: \"widget_load_failed\" as const,\n message: \"Lockerverse returned an invalid widget catalog.\",\n operation: \"load_widget\" as const,\n };\n try {\n if (\n selection &&\n `${widgetUrl}?selection=${encodeURIComponent(JSON.stringify(selection))}`\n .length > MAX_SELECTED_WIDGET_URL_LENGTH\n ) {\n return await loadLargeSelection(selection, context);\n }\n return selection\n ? await requestWidgetResource(selection)\n : await requestWidgetResource();\n } catch (error) {\n failOperation(error, context);\n }\n }\n\n function load(): Promise<LockerverseCatalog>;\n function load(\n input: LockerverseLoadCheckoutInput\n ): Promise<LockerverseLoadedCheckout>;\n function load(input?: LockerverseLoadCheckoutInput) {\n return input === undefined\n ? loadWidget()\n : loadWidget(normalizeLoadSelection(input));\n }\n\n async function requestCheckoutQuote(\n items: LockerverseCheckoutItem[],\n pricing: LockerverseCheckoutPricingInput,\n payment: LockerverseCatalog[\"payment\"],\n context: OperationErrorContext\n ) {\n const response = await requestJson(\n `${checkoutBaseUrl}/quote`,\n {\n body: JSON.stringify({ ...pricing, items }),\n headers: { \"Content-Type\": \"application/json\" },\n method: \"POST\",\n },\n parseCheckoutQuote,\n {\n ...context,\n message:\n \"Unable to calculate the Lockerverse checkout total because the request failed.\",\n report: false,\n },\n { ...context, report: false },\n readPaymentServerCode\n );\n if (!response.ok) {\n const serverCode = response.errorValue;\n if (serverCode === \"PAYMENT_WIDGET_SALES_LIMIT_REACHED\") {\n throw new LockerverseSdkError({\n ...context,\n message: \"This option is sold out.\",\n reportable: false,\n serverCode,\n status: response.response.status,\n });\n }\n throw new LockerverseSdkError({\n ...context,\n message: `Unable to calculate the Lockerverse checkout total (${response.response.status}).`,\n reportable: response.response.status >= 500,\n status: response.response.status,\n });\n }\n return createPreparedCheckout(response.value, items, pricing, payment);\n }\n\n async function calculateTotal(input: LockerverseCalculateTotalInput) {\n const { catalog, items, pricing } = normalizeCalculateTotalInput(input);\n const context = {\n code: \"total_calculation_failed\" as const,\n message: \"Lockerverse returned an invalid checkout total.\",\n operation: \"calculate_total\" as const,\n };\n try {\n return await requestCheckoutQuote(\n items,\n pricing,\n catalog.payment,\n context\n );\n } catch (error) {\n failOperation(error, context);\n }\n }\n\n function normalizeCalculateTotalInput(input: LockerverseCalculateTotalInput) {\n try {\n const parsed = parseCalculateTotalInput(input);\n const resolved = resolveCalculateTotalItems(parsed);\n const pricing = normalizePricingInput(parsed.pricing);\n return {\n catalog: resolved.catalog,\n items: resolved.items,\n pricing:\n pricing.includeServiceFee === undefined\n ? {\n ...pricing,\n includeServiceFee: resolved.catalog.widget.fields.serviceFee,\n }\n : pricing,\n };\n } catch (error) {\n if (error instanceof LockerverseSdkError) {\n throw error;\n }\n invalidInput(\n error instanceof TypeError\n ? error.message\n : \"Checkout selection is invalid.\",\n \"calculate_total\"\n );\n }\n }\n\n function normalizeSubmitPaymentInput(input: LockerverseSubmitPaymentInput) {\n try {\n const parsed = parseSubmitPaymentInput(input);\n const {\n items,\n pricing: pricingInput,\n quote: quoteInput,\n } = parsed.checkout;\n const pricing = normalizePricingInput(pricingInput);\n const quote = deepFreeze(quoteInput);\n const { submission } = parsed;\n if (quote.totalCents > 0 && !submission.confirmationToken) {\n invalidInput(\n \"Stripe confirmation is required for a paid checkout.\",\n \"submit_payment\",\n \"payment_submit_failed\"\n );\n }\n const email = submission.email.trim().toLowerCase();\n if (!email || email !== pricing.email) {\n invalidInput(\n \"Payment email must match the current checkout quote.\",\n \"submit_payment\"\n );\n }\n return {\n items,\n pricing,\n quote,\n submission: { ...submission, email },\n };\n } catch (error) {\n if (error instanceof LockerverseSdkError) {\n throw error;\n }\n invalidInput(\n \"Lockerverse payment submission is invalid.\",\n \"submit_payment\",\n \"payment_submit_failed\"\n );\n }\n }\n\n return {\n calculateTotal,\n async getPaymentStatus(paymentReference) {\n let normalizedReference: string;\n try {\n normalizedReference =\n parsePaymentReferenceInput(paymentReference).trim();\n } catch {\n invalidInput(\n \"Provide a payment reference to recover its status.\",\n \"get_payment_status\"\n );\n }\n const context = {\n code: \"payment_status_failed\" as const,\n message: \"Lockerverse returned an invalid payment status.\",\n operation: \"get_payment_status\" as const,\n };\n try {\n const response = await requestJson(\n `${checkoutBaseUrl}/${encodeURIComponent(normalizedReference)}/status`,\n undefined,\n parsePaymentResult,\n {\n ...context,\n message:\n \"Unable to recover the Lockerverse payment status because the request failed.\",\n report: false,\n },\n { ...context, report: false }\n );\n if (!response.ok) {\n throw new LockerverseSdkError({\n ...context,\n message: `Unable to recover the Lockerverse payment status (${response.response.status}).`,\n reportable: response.response.status >= 500,\n status: response.response.status,\n });\n }\n if (response.value.paymentReference !== normalizedReference) {\n throw new LockerverseSdkError({ ...context, reportable: true });\n }\n return clonePaymentResult(response.value);\n } catch (error) {\n failOperation(error, context);\n }\n },\n load,\n async submitPayment(input) {\n const { items, pricing, quote, submission } =\n normalizeSubmitPaymentInput(input);\n const context = {\n code: \"payment_submit_failed\" as const,\n message: \"Lockerverse returned an invalid payment confirmation.\",\n operation: \"submit_payment\" as const,\n };\n try {\n const response = await requestJson(\n `${checkoutBaseUrl}/confirm`,\n {\n body: JSON.stringify({\n confirmationToken: submission.confirmationToken,\n customFieldAnswers: submission.customFieldAnswers,\n email: submission.email,\n expectedAmountCents: quote.amountCents,\n expectedAppliedDiscount: quote.appliedDiscount,\n expectedConnectedAccountId: quote.payment.connectedAccountId,\n expectedDiscountableSubtotalCents:\n quote.discountableSubtotalCents,\n expectedDiscountCents: quote.discountCents,\n expectedServiceFeeCents: quote.serviceFeeCents,\n expectedSubtotalCents: quote.subtotalCents,\n expectedTipCents: quote.tipCents,\n expectedTotalCents: quote.totalCents,\n ...pricing,\n items,\n memberId: submission.memberId,\n merchSize: submission.merchSize,\n metadata: submission.metadata,\n paymentReference: quote.paymentReference,\n phone: submission.phone,\n quoteContractVersion: 1,\n shipping: submission.shipping,\n }),\n headers: { \"Content-Type\": \"application/json\" },\n method: \"POST\",\n },\n parsePaymentResult,\n {\n ...context,\n message:\n \"Unable to submit the Lockerverse payment because the request failed.\",\n report: false,\n },\n { ...context, report: false },\n readPaymentServerCode\n );\n if (!response.ok) {\n const serverCode = response.errorValue;\n if (serverCode) {\n throw new LockerverseSdkError({\n ...context,\n message:\n serverCode === \"PAYMENT_WIDGET_SALES_LIMIT_REACHED\"\n ? \"This option is sold out.\"\n : `Unable to submit the Lockerverse payment (${response.response.status}).`,\n reportable: false,\n serverCode,\n status: response.response.status,\n });\n }\n throw new LockerverseSdkError({\n ...context,\n message: `Unable to submit the Lockerverse payment (${response.response.status}).`,\n reportable: response.response.status >= 500,\n status: response.response.status,\n });\n }\n if (response.value.paymentReference !== quote.paymentReference) {\n throw new LockerverseSdkError({ ...context, reportable: true });\n }\n return clonePaymentResult(response.value);\n } catch (error) {\n failOperation(error, context, true);\n }\n },\n };\n}\n","import { parseCheckoutPricingInput } from \"./checkout-input-schemas.ts\";\nimport { resolveCheckoutSelection } from \"./checkout-selection.ts\";\nimport { deepFreeze } from \"./deep-freeze.ts\";\nimport type {\n LockerverseCatalog,\n LockerverseCheckoutEstimate,\n LockerverseEstimateCheckoutInput,\n} from \"./types.ts\";\n\nexport function estimateLockerverseCheckout(\n catalog: LockerverseCatalog,\n input: LockerverseEstimateCheckoutInput\n): LockerverseCheckoutEstimate {\n const { selection, ...pricingInput } = input;\n let pricing: ReturnType<typeof parseCheckoutPricingInput>;\n try {\n pricing = parseCheckoutPricingInput(pricingInput);\n } catch (error) {\n throw new TypeError(\"Checkout pricing is invalid.\", { cause: error });\n }\n const includeServiceFee =\n pricing.includeServiceFee ?? catalog.widget.fields.serviceFee;\n const { tipCents = 0 } = pricing;\n const { items, lineItems, paymentOption } = resolveCheckoutSelection(\n catalog,\n selection\n );\n const subtotalCents = lineItems.reduce(\n (total, lineItem) => total + lineItem.subtotalCents,\n 0\n );\n if (\n !Number.isSafeInteger(subtotalCents) ||\n subtotalCents <= 0 ||\n subtotalCents > 2_147_483_647\n ) {\n throw new TypeError(\"Checkout total is invalid.\");\n }\n const discountableSubtotalCents = lineItems.reduce(\n (total, lineItem) =>\n total + (lineItem.acceptsDiscounts ? lineItem.subtotalCents : 0),\n 0\n );\n const serviceFeeCents = includeServiceFee\n ? Math.round(\n (subtotalCents * catalog.pricingPolicy.serviceFeeRateBasisPoints) /\n 10_000\n )\n : 0;\n const amountCents = subtotalCents + serviceFeeCents;\n const totalCents = amountCents + tipCents;\n if (!Number.isSafeInteger(totalCents) || totalCents > 2_147_483_647) {\n throw new TypeError(\"Checkout total is invalid.\");\n }\n\n return deepFreeze({\n amountCents,\n appliedDiscount: null,\n authoritative: false,\n discountableSubtotalCents,\n discountCents: 0,\n items,\n lineItems,\n paymentOption,\n serviceFeeCents,\n subtotalCents,\n tipCents,\n totalCents,\n });\n}\n"],"mappings":"0iBAGA,SAAgB,GACd,EACA,CACA,IAAM,EAAU,EAA2B,EAAS,YAAY,EAChE,MAAO,CACL,GAAG,EACH,WAAY,EAAQ,aACpB,gBAAiB,EAAQ,iBAC3B,CACF,CCyBA,MAAM,EAAsB,EAAS,CACnC,WACA,UACA,WACA,kBACF,CAAC,EACK,EAAwB,EAAS,CAAC,OAAQ,iBAAiB,CAAC,EAC5D,EAAmC,EAAS,EAAkB,CAAC,CAAC,EAChE,GAA2B,EAAS,CAAC,YAAa,UAAU,CAAC,EAC7D,GAAqB,EACzB,EAAO,CACL,SAAU,EACR,EAAO,CACL,UAAW,EACX,uBAAwB,EACxB,kBAAmB,EACnB,OAAQ,EACV,CAAC,CACH,EACA,aAAc,EACZ,EAAO,CACL,GAAI,EACJ,WAAY,EAAM,CAAoB,EACtC,kBAAmB,EAAkB,CAAC,EACtC,OAAQ,EACV,CAAC,CACH,CACF,CAAC,EACD,CAAE,SAAU,CAAC,EAAG,aAAc,CAAC,CAAE,CACnC,EACM,GAAuB,EAC3B,EAAO,EACP,EAAM,yBAA0B,0BAA0B,CAC5D,EAEM,GAAqB,CACzB,YAAa,EACb,gBAAiB,EACjB,GAAI,EACJ,kBAAmB,EACnB,YAAa,EACb,mBAAoB,EACpB,YAAa,EACb,KAAM,EACN,cAAe,CACjB,EAEM,EAAc,EAAO,CACzB,YAAa,EAAS,EAAO,CAAC,EAC9B,MAAO,EACP,GAAI,EACJ,SAAU,EAAS,EAAO,CAAC,EAC3B,KAAM,EACN,QAAS,EACT,OAAQ,EAAS,CAAC,QAAS,SAAU,WAAY,WAAW,CAAC,CAC/D,CAAC,EAEK,GAAsB,GAAQ,cAAe,CACjD,EAAO,CACL,GAAG,GACH,YAAa,EAAkB,CAAC,EAChC,YAAa,EAAQ,OAAO,CAC9B,CAAC,EACD,EAAO,CACL,GAAG,GACH,YAAa,EACb,YAAa,EAAQ,QAAQ,CAC/B,CAAC,CACH,CAAC,EAEK,GAAuB,EAAO,CAClC,iBAAkB,EAAS,EAAQ,EAAG,EAAK,EAC3C,GAAI,EACJ,oBAAqB,EAAS,EAAkC,IAAI,EACpE,QAAS,GACT,UAAW,EACX,KAAM,CACR,CAAC,EAEK,EAAqB,EACzB,EAAO,CACL,SAAU,EAAS,EAAQ,EAAG,EAAK,EACnC,UAAW,EAAS,EAAQ,EAAG,EAAK,EACpC,MAAO,EAAS,EAAQ,EAAG,EAAK,EAChC,UAAW,EAAS,EAAQ,EAAG,EAAK,EACpC,WAAY,EAAS,EAAQ,EAAG,EAAK,EACrC,SAAU,EAAS,EAAQ,EAAG,EAAK,EACnC,QAAS,EAAS,EAAQ,EAAG,EAAK,CACpC,CAAC,EACD,CAAC,CACH,EAEa,GAAqB,EAChC,EAAO,CACL,aAAc,GACd,UAAW,EACT,EAAO,CACL,MAAO,EAAO,EACd,cAAe,EAAS,EAAS,EAAO,CAAC,CAAC,EAC1C,KAAM,EACN,UAAW,EAAS,EAAO,CAAC,EAC5B,iBAAkB,EAAS,EAAQ,CAAC,CACtC,CAAC,CACH,EACA,OAAQ,EACN,EAAO,CACL,aAAc,EACd,OAAQ,CACV,CAAC,CACH,EACA,YAAa,EACb,MAAO,EAAS,CAAW,EAC3B,GAAI,EAAS,EAAO,EAAG,EAAE,EACzB,KAAM,EAAS,EAAO,EAAG,oBAAoB,EAC7C,QAAS,EAAO,CACd,mBAAoB,EAAS,EAAS,CAAoB,EAAG,IAAI,EACjE,SAAU,EAAQ,KAAK,EACvB,eAAgB,EAClB,CAAC,EACD,cAAe,EACb,EAAO,CACL,SAAU,EAAS,EAAQ,KAAK,EAAG,KAAK,EACxC,0BAA2B,EAAS,EAAkB,CAAC,EAAG,CAAC,CAC7D,CAAC,CACH,EACA,SAAU,EAAS,EAAM,EAAoB,EAAG,CAAC,CAAC,EAClD,sBAAuB,EAAS,EAAQ,EAAG,EAAI,EAC/C,MAAO,CACT,CAAC,EACD,EAAW,IAAY,CACrB,GAAG,EACH,OAAQ,CACN,aAAc,EAAO,QAAQ,cAAgB,CAAC,EAC9C,OAAQ,CACN,SAAU,EAAO,QAAQ,QAAQ,UAAY,GAC7C,UAAW,EAAO,QAAQ,QAAQ,WAAa,GAC/C,MAAO,EAAO,QAAQ,QAAQ,OAAS,GACvC,UAAW,EAAO,QAAQ,QAAQ,WAAa,GAC/C,WAAY,EAAO,QAAQ,QAAQ,YAAc,GACjD,SAAU,EAAO,QAAQ,QAAQ,UAAY,GAC7C,QAAS,EAAO,QAAQ,QAAQ,SAAW,EAC7C,CACF,EACA,cAAe,EAAO,eAAiB,CACrC,SAAU,MACV,0BAA2B,CAC7B,CACF,EAAE,CACJ,EAEM,GAAuB,EAAO,CAClC,iBAAkB,EAAQ,EAC1B,YAAa,EAAS,EAAkB,CAAC,CAAC,EAC1C,YAAa,EAAS,EAAO,CAAC,EAC9B,gBAAiB,EACjB,GAAI,EACJ,kBAAmB,EACnB,UAAW,EACX,gBAAiB,EACjB,mBAAoB,EACpB,gBAAiB,EACjB,KAAM,EACN,cAAe,EACf,YAAa,EAAS,CAAC,QAAS,QAAQ,CAAC,EACzC,KAAM,CACR,CAAC,EAEK,GAAgB,EAAO,CAC3B,aAAc,GACd,UAAW,EACT,EAAO,CACL,YAAa,EAAO,EACpB,SAAU,EAAS,EAAO,CAAC,EAC3B,cAAe,EAAS,EAAS,EAAO,CAAC,CAAC,EAC1C,KAAM,EACN,iBAAkB,EAAS,EAAQ,CAAC,CACtC,CAAC,CACH,EACA,MAAO,EAAS,CAAW,EAC3B,QAAS,EAAO,CACd,mBAAoB,EAAS,EAAS,CAAoB,EAAG,IAAI,EACjE,SAAU,EAAQ,KAAK,EACvB,eAAgB,EAClB,CAAC,EACD,cAAe,EAAO,CACpB,SAAU,EAAQ,KAAK,EACvB,0BAA2B,EAAkB,CAAC,CAChD,CAAC,EACD,SAAU,EAAM,EAAoB,EACpC,OAAQ,EAAO,CACb,aAAc,EACd,YAAa,EAAS,EAAO,CAAC,EAC9B,OAAQ,EACR,GAAI,EAAO,EACX,KAAM,EACN,sBAAuB,EAAQ,EAC/B,MAAO,EAAS,EAAO,CAAC,CAC1B,CAAC,CACH,CAAC,EAEK,GAAwB,EAC5B,EAAO,CACL,cAAe,EAAK,EAAO,EAAG,EAAO,EAAG,EAAS,CAAC,EAAG,EAAS,GAAG,CAAC,EAClE,OAAQ,EAAS,CAAC,aAAc,YAAY,CAAC,CAC/C,CAAC,CACH,EAEM,GAAyB,EAAO,CACpC,iBAAkB,EAAQ,EAC1B,QAAS,EAAS,CAAoB,EACtC,gBAAiB,EACjB,UAAW,EACX,YAAa,EACb,cAAe,EACf,YAAa,EAAS,CAAC,QAAS,QAAQ,CAAC,EACzC,UAAW,EACX,YAAa,EACb,SAAU,EAAkB,CAAC,EAC7B,cAAe,EAAkB,CAAC,EAClC,gBAAiB,EAAkB,CAAC,CACtC,CAAC,EAEY,GAAsB,EACjC,EACA,EAAO,CACL,YAAa,EAAkB,CAAC,EAChC,gBAAiB,GACjB,mBAAoB,EAAS,CAAoB,EACjD,0BAA2B,EAAkB,CAAC,EAC9C,cAAe,EAAkB,CAAC,EAClC,UAAW,EAAM,EAAsB,EACvC,cAAe,EACf,gBAAiB,EAAkB,CAAC,EACpC,cAAe,EAAkB,CAAC,EAClC,SAAU,EAAkB,CAAC,EAC7B,WAAY,EAAkB,CAAC,CACjC,CAAC,EACD,GAAO,CAAE,YAAW,mBAEhB,EAAU,SAAW,GACrB,EAAU,KAAM,GAAS,EAAK,gBAAkB,CAAa,EAEtD,GAGP,IAAkB,YACjB,EAAU,SAAW,GACpB,EAAU,EAAE,EAAE,cAAgB,SAC9B,EAAU,EAAE,CAAC,WAAa,EAE7B,uCAAuC,CAC5C,EAEa,GAAsB,EACjC,EAAO,CACL,GAAG,EAAuC,QAC1C,SAAU,EAAS,EAAK,EAAsB,EAAM,aAAa,CAAC,CAAC,CACrE,CAAC,EACD,EAAO,GACC,EAAQ,WAAW,KAAK,GAAK,EAAQ,iBAAiB,KAAK,EAG7D,EAAQ,iBAAmB,kBAE3B,EAAQ,kBACN,EAAQ,gBAAkB,EAAQ,EAAQ,cAAc,KAAK,GAC5D,CAAC,EAAQ,gBACR,EAAQ,eAAiB,MACzB,EAAQ,EAAQ,UAGjB,CAAC,EAAQ,gBAAkB,EAAQ,eAAiB,KAXlD,GAYR,+BAA+B,CACpC,EAMa,EAAqB,EAAO,EAAmB,EAC/C,GAAe,EAAO,EAAa,EACnC,EAAqB,EAAO,EAAmB,EACtD,GAA4B,EAAO,CAA+B,EAClE,GAAuB,EAAO,EAAkB,EAEtD,SAAgB,GAAyB,EAAc,CAErD,OADA,GAA0B,CAAK,EACxB,GAAqB,CAAK,CACnC,CAEA,SAAgB,GAA6B,EAAc,CACzD,IAAM,EAAW,EACf,EAAY,CAAE,MAAO,EAAS,EAAQ,CAAC,CAAE,CAAC,EAC1C,CACF,EACM,EAAS,GAAkB,CAAK,EAChC,EAAQ,EAAS,QAAU,EAAS,OAAO,MAAQ,IAAA,GACzD,OAAO,IAAU,IAAA,GACb,CAAE,QAAO,EACT,CAAE,MAAO,EAAmB,CAAK,EAAG,QAAO,CACjD,CCrTA,MAAM,GAAyB,CAC7B,MAAO,EAAS,EAAO,CAAC,EACxB,kBAAmB,EAAS,EAAQ,CAAC,EACrC,UAAW,EAAS,EAAO,CAAC,EAC5B,SAAU,EAAS,EAAkB,CAAC,CAAC,CACzC,EAEM,EAA6B,EAAa,EAAsB,EAEzD,EAA4B,EACvC,EAAS,EAA4B,CAAC,CAAC,CACzC,EAEM,GAA0B,EAAa,CAC3C,kBAAmB,EAAS,CAAoB,EAChD,mBAAoB,EAAS,EAAM,CAAuB,CAAC,EAC3D,MAAO,EAAO,EACd,SAAU,EAAS,EAAO,CAAC,EAC3B,UAAW,EAAS,EAAS,CAAC,KAAM,IAAK,IAAK,IAAK,KAAM,MAAO,MAAM,CAAC,CAAC,EACxE,SAAU,EAAS,EAAO,EAAO,EAAG,EAAO,CAAC,CAAC,EAC7C,MAAO,EAAS,EAAO,CAAC,EACxB,SAAU,EACR,EAAa,CACX,QAAS,EAAa,CACpB,KAAM,EAAO,EACb,QAAS,EAAO,EAChB,MAAO,EAAO,EACd,MAAO,EAAS,EAAO,CAAC,EACxB,YAAa,EAAO,EACpB,MAAO,EAAO,CAChB,CAAC,EACD,KAAM,EAAO,CACf,CAAC,CACH,CACF,CAAC,EAEK,GAAqB,GAAM,CAC/B,EAAa,CACX,YAAa,EAAkB,CAAC,EAChC,UAAW,CACb,CAAC,EACD,EAAa,CACX,UAAW,EACX,SAAU,EAAkB,CAAC,CAC/B,CAAC,EACD,EAAa,CACX,UAAW,CACb,CAAC,CACH,CAAC,EAEK,GAA8B,GAAM,CACxC,EAAa,CACX,YAAa,EAAkB,CAAC,EAChC,YAAa,CACf,CAAC,EACD,EAAa,CACX,YAAa,EACb,SAAU,EAAkB,CAAC,CAC/B,CAAC,EACD,EAAa,CACX,YAAa,CACf,CAAC,CACH,CAAC,EAEK,EAAsB,EAAK,EAAM,EAAkB,EAAG,EAAU,CAAC,CAAC,EAClE,EAA+B,EACnC,EAAM,EAA2B,EACjC,EAAU,CAAC,CACb,EAEM,GAA0B,EAAO,CACrC,UAAW,CACb,CAAC,EAEK,GAA4B,EAAY,CAC5C,QAAS,EAAS,EAAQ,CAAC,EAC3B,MAAO,EAAS,EAAQ,CAAC,EACzB,kBAAmB,EAAS,EAAQ,CAAC,EACrC,MAAO,EAAS,CAAmB,EACnC,UAAW,EAAS,EAAQ,CAAC,EAC7B,UAAW,EAAS,CAA4B,EAChD,SAAU,EAAS,EAAQ,CAAC,CAC9B,CAAC,EAEK,EAA8B,EAClC,EAAY,CACV,cAAe,EAAQ,EAAI,EAC3B,MAAO,EACP,QAAS,EAAO,CACd,mBAAoB,EAAS,CAAoB,EACjD,SAAU,EAAQ,KAAK,EACvB,eAAgB,EAAK,EAAO,EAAG,EAAU,CAAC,CAAC,CAC7C,CAAC,EACD,iBAAkB,EAAK,EAAO,EAAG,EAAU,CAAC,CAAC,EAC7C,QAAS,CACX,CAAC,EACD,EAAW,GAAa,CACtB,GAAM,CAAE,QAAO,UAAS,mBAAkB,UAAS,GAAG,GACpD,EACI,EAAc,EAAmB,CACrC,GAAG,EACH,mBAAoB,EAAQ,kBAC9B,CAAC,EACK,CAAE,qBAAoB,GAAG,GAAU,EACzC,MAAO,CACL,QACA,UACA,MAAO,CACL,GAAG,EACH,cAAe,GACf,QAAS,CACP,qBACA,SAAU,MACV,eAAgB,EAAQ,cAC1B,EACA,cAAe,EAAY,cAC3B,kBACF,CACF,CACF,CAAC,CACH,EAEM,GAA2B,EAAY,CAC3C,SAAU,EACV,WAAY,EACd,CAAC,EAEK,GAA8B,EAC9B,GAA0B,EAAO,EAAY,CAAC,CAAC,CAAC,EAehD,GAAiC,EAAO,EAAyB,EAEvE,SAAgB,GAAgC,EAAc,CAC5D,GAAM,CAAE,UAAS,QAAO,YAAW,GAAG,GACpC,GAA+B,CAAK,EAClC,EACJ,GAAI,CACF,EAAgB,GAAwB,CAAO,CACjD,OAAS,EAAO,CACd,MAAU,UAAU,iDAAkD,CACpE,MAAO,CACT,CAAC,CACH,CACA,GAAI,CACF,MAAO,CACL,QAAS,EACT,QACA,QAAS,EAA0B,CAAY,EAC/C,WACF,CACF,OAAS,EAAO,CACd,MAAU,UAAU,qCAAsC,CAAE,MAAO,CAAM,CAAC,CAC5E,CACF,CASA,MAAa,GAAyB,EAAO,EAAuB,EACvD,GAA6B,EAAO,EAA2B,EAClC,EAAO,CAA2B,EAC5E,MAAa,GAA0B,EAAO,EAAwB,EAEzD,GAA8B,EAAO,CAA4B,EC5M9E,SAAgB,EACd,EACA,CACA,OAAO,KAAK,IAAI,IAA0B,EAAQ,oBAAsB,CAAC,CAC3E,CCSA,SAAgB,GACd,EACA,EACA,CACA,IAAM,EAAuB,IAAI,IAC/B,EAAQ,SAAS,KAAK,CAAE,KAAI,eAAgB,CAAC,EAAI,CAAS,CAAC,CAC7D,EACM,EAAuB,EAAM,QAAQ,EAAW,IAAS,CAC7D,IAAM,EAAY,EAAqB,IAAI,EAAK,SAAS,EAQzD,OAPI,GACF,EAAU,IACR,GACC,EAAU,IAAI,CAAS,GAAK,IAC1B,aAAc,EAAQ,EAAK,UAAY,EAAK,EACjD,EAEK,CACT,EAAG,IAAI,GAAqB,EACtB,EAAmB,EAAQ,aAAa,SAAS,MACpD,CAAE,YAAW,yBAAwB,YACpC,EAAqB,IAAI,CAAS,IACjC,IAAW,YACT,IAA2B,OACzB,EAAqB,IAAI,CAAS,GAAK,GAAK,EACrD,EACM,EAAuB,EAAQ,aAAa,aAAa,MAC5D,CAAE,aAAY,oBAAmB,YAAa,CAC7C,IAAM,EAAoB,EAAW,QAClC,EAAO,IACN,GAAS,EAAqB,IAAI,CAAS,GAAK,GAClD,CACF,EACA,OACE,EAAoB,IACnB,IAAW,YAAc,EAAoB,EAElD,CACF,EACA,GAAI,GAAoB,EACtB,MAAM,IAAI,EAAoB,CAC5B,KAAM,2BACN,QAAS,2BACT,UAAW,kBACX,WAAY,GACZ,WAAY,oCACd,CAAC,CAEL,CAEA,SAAS,GACP,EACA,EACuB,CACvB,GACE,EAAQ,cAAgB,UACxB,EAAQ,gBAAkB,YAC1B,EAAc,EAAuC,CAAO,EAE5D,MAAU,UAAU,qCAAqC,EAE3D,MAAO,CACL,aAAc,CAAE,cAAa,UAAW,EAAQ,EAAG,EACnD,SAAU,EACV,gBAAiB,CACnB,CACF,CAEA,SAAS,GACP,EACA,EACuB,CACvB,GAAI,EAAQ,cAAgB,SAAW,EAAQ,cAAgB,KAC7D,MAAU,UAAU,uCAAuC,EAE7D,GAAI,EAAQ,gBAAkB,YAAc,IAAa,EACvD,MAAU,UAAU,wCAAwC,EAE9D,GACG,EAAQ,kBAAoB,MAAQ,EAAW,EAAQ,iBACvD,EAAQ,kBAAoB,MAAQ,EAAW,EAAQ,iBACvD,EAAQ,oBAAsB,MAAQ,EAAW,EAAQ,kBAE1D,MAAU,UAAU,uCAAuC,EAE7D,MAAO,CACL,aACE,EAAQ,gBAAkB,WACtB,CAAE,UAAW,EAAQ,GAAI,UAAS,EAClC,CAAE,UAAW,EAAQ,EAAG,EAC9B,WACA,gBAAiB,EAAQ,WAC3B,CACF,CAEA,SAAS,GACP,EACA,EACA,EACA,CACA,IAAM,EAAmB,aAAc,EAAY,EAAU,SAAW,EAKlE,CAAE,eAAc,WAAU,mBAH9B,gBAAiB,EACb,GAAkB,EAAS,EAAU,WAAW,EAChD,GAAiB,EAAS,CAAgB,EAGhD,MAAO,CACL,eACA,SAAU,CACR,iBAAkB,EAAQ,iBAC1B,QACE,EAAQ,kBAAoB,mBAAqB,EAAQ,MACrD,EAAQ,MAAM,GACd,KACN,gBAAiB,EAAQ,gBACzB,UAAW,EAAQ,UACnB,YAAa,EAAQ,KACrB,cAAe,EAAQ,cACvB,YAAa,EAAQ,YACrB,UAAW,EAAQ,GACnB,YAAa,EAAQ,KACrB,WACA,cAAe,EAAkB,EACjC,iBACF,CACF,CACF,CAEA,SAAgB,EACd,EACA,EACA,CACA,IAAM,EAAY,GAA4B,CAAK,EAC7C,EAAmB,IAAI,IACvB,EAAW,EAAU,IAAK,GAAS,CACvC,IAAM,EAAU,EAAQ,SAAS,KAC9B,GAAc,EAAU,OAAS,EAAK,WACzC,EACA,GAAI,CAAC,EACH,MAAU,UAAU,kCAAkC,EAExD,GAAI,EAAiB,IAAI,EAAQ,EAAE,EACjC,MAAU,UAAU,iDAAiD,EAGvE,OADA,EAAiB,IAAI,EAAQ,EAAE,EACxB,GAAqB,EAAS,EAAS,CAAI,CACpD,CAAC,EACK,EAAgB,EAAS,EAAE,EAAE,SAAS,cAC5C,GAAI,CAAC,EACH,MAAU,UAAU,8BAA8B,EAEpD,GACE,EAAS,OAAS,IACjB,IAAkB,YACjB,EAAS,MAAM,CAAE,cAAe,EAAS,gBAAkB,CAAa,GAE1E,MAAU,UAAU,kDAAkD,EAExE,IAAM,EAAQ,EAAS,KAAK,CAAE,kBAAmB,CAAY,EAE7D,OADA,GAAgC,EAAS,CAAK,EACvC,CACL,QACA,UAAW,EAAS,KAAK,CAAE,cAAe,CAAQ,EAClD,eACF,CACF,CC5KA,SAAS,GAAW,EAAmD,CACrE,GAAM,CAAE,WAAY,EAEpB,MAAO,CACL,iBAAkB,EAAQ,kBAAoB,GAC9C,YAAa,EAAQ,YACrB,YAAa,EAAQ,aAAe,KACpC,gBAAiB,EAAQ,gBACzB,GAAI,EAAQ,GACZ,kBAAmB,EAAQ,kBAC3B,UAAW,EAAQ,GACnB,gBAAiB,EAAQ,oBACzB,mBAAoB,EAAQ,mBAC5B,gBAAiB,EAAQ,YACzB,KAAM,EAAQ,KACd,cAAe,EAAQ,cACvB,YAAa,EAAQ,YACrB,KAAM,EAAQ,IAChB,CACF,CAEA,SAAS,GACP,EACqC,CACrC,GAAI,CAAC,EACH,OAAO,KAET,IAAM,EAAyC,CAC7C,YAAa,EAAU,MACvB,SAAU,EAAU,WAAa,KACjC,KAAM,EAAU,IAClB,EAOA,OANI,EAAU,mBAAqB,IAAA,KACjC,EAAS,iBAAmB,EAAU,kBAEpC,EAAU,gBAAkB,IAAA,KAC9B,EAAS,cAAgB,EAAU,eAE9B,CACT,CAEA,SAAgB,GAAc,EAA0C,CACtE,IAAM,EAAS,EAAO,QAAQ,QAAU,CAAC,EAEzC,MAAO,CACL,aAAc,EAAO,aACrB,UAAW,GAAa,EAAO,SAAS,EACxC,MAAO,EAAO,MACV,CACE,YAAa,EAAO,MAAM,YAC1B,MAAO,EAAO,MAAM,MACpB,GAAI,EAAO,MAAM,GACjB,SAAU,EAAO,MAAM,SACvB,KAAM,EAAO,MAAM,KACnB,QAAS,EAAO,MAAM,QACtB,OAAQ,EAAO,MAAM,MACvB,EACA,KACJ,QAAS,CACP,mBAAoB,EAAO,QAAQ,mBACnC,SAAU,EAAO,QAAQ,SACzB,eAAgB,EAAO,QAAQ,cACjC,EACA,cAAe,CACb,SAAU,MACV,0BACE,EAAO,eAAe,2BAA6B,CACvD,EACA,UAAW,EAAO,UAAY,CAAC,EAAA,CAAG,IAAI,EAAU,EAChD,OAAQ,CACN,aAAc,EAAO,QAAQ,cAAgB,CAAC,EAC9C,YAAa,EAAO,aAAe,KACnC,OAAQ,CACN,SAAU,EAAO,UAAY,GAC7B,UAAW,EAAO,WAAa,GAC/B,MAAO,EAAO,OAAS,GACvB,UAAW,EAAO,WAAa,GAC/B,WAAY,EAAO,YAAc,GACjC,SAAU,EAAO,UAAY,GAC7B,QAAS,EAAO,SAAW,EAC7B,EACA,GAAI,EAAO,IAAM,GACjB,KAAM,EAAO,MAAQ,qBACrB,sBAAuB,EAAO,uBAAyB,GACvD,MAAO,EAAO,OAAS,IACzB,CACF,CACF,CAEA,SAAgB,EAAa,EAAiD,CAC5E,OAAO,EAAc,CAAO,CAC9B,CAEA,SAAgB,GACd,EAC6B,CAC7B,OAAO,EAAc,CAAQ,CAC/B,CAEA,SAAgB,GACd,EAC0B,CAC1B,OAAO,EAAc,CAAa,CACpC,CAEA,SAAS,EAAiB,EAAa,CACrC,OAAO,EAAW,gBAAgB,CAAK,CAAC,CAC1C,CCzDA,MACM,GAA2B,EAAO,CACtC,KAAM,EAAS,CACb,+BACA,gCACA,oCACF,CAAC,CACH,CAAC,EAED,eAAe,EACb,EAC+C,CAC3C,KAAS,SAAW,KAAO,EAAS,SAAW,IAGnD,GAAI,CACF,IAAM,EAAS,EAAU,GAA0B,MAAM,EAAS,KAAK,CAAC,EACxE,OAAO,EAAO,QAAU,EAAO,OAAO,KAAO,IAAA,EAC/C,MAAQ,CAER,CACF,CAEA,SAAS,GAA2B,CAClC,UACA,QACA,aAC4B,CAC5B,GAAI,IAAU,IAAA,IAAa,IAAc,IAAA,GACvC,MAAU,UAAU,mCAAmC,EAEzD,IAAM,EAAmB,EAAa,GAAa,CAAO,CAAC,EACrD,EACJ,IAAc,IAAA,GACV,GAAqB,CAAK,EAC1B,EAAyB,EAAkB,CAAS,CAAC,CAAC,MAE5D,OADA,GAAgC,EAAkB,CAAa,EACxD,CACL,QAAS,EACT,MAAO,CACT,CACF,CAEA,SAAS,GACP,EAC2B,CAC3B,GAAI,IAAU,IAAA,GACZ,MAAU,UAAU,gCAAgC,EAEtD,OAAO,CACT,CAEA,SAAgB,GACd,EAC2B,CAC3B,GAAM,CACJ,aACA,gBACA,qBACA,cACA,sBACA,UACA,mBACA,YACA,aACA,mBACE,GAAyB,CAAO,EAC9B,EAAc,EAAuB,CACzC,cAAe,EACf,cACA,gBAAmB,CAAE,WAAY,CAAgB,GACjD,UACA,oBAAqB,qBACrB,WACF,CAAC,EACK,CAAE,eAAgB,EACtB,EACA,EACA,CACF,EACM,EAAkB,GAAG,EAAW,gBAAgB,EAAc,mBAAmB,EAAW,WAC5F,EAAY,GAAG,EAAW,gBAAgB,EAAc,mBAAmB,IAEjF,SAAS,EACP,EACA,EACA,EAAsD,oBAC/C,CACP,MAAM,EACJ,IAAI,EAAoB,CACtB,OACA,UACA,YACA,WAAY,EACd,CAAC,CACH,CACF,CAEA,SAAS,EACP,EACA,EACA,CACA,OAAO,aAAiB,EACpB,EACA,IAAI,EAAoB,CAAE,GAAG,EAAS,WAAY,EAAK,CAAC,CAC9D,CAEA,SAAS,EACP,EACA,EACA,EAAwB,GACjB,CACP,IAAM,EAAa,EAAwB,EAAO,CAAO,EAIzD,GAAI,EAFF,IACC,EAAW,SAAW,IAAA,IAAa,EAAW,QAAU,MAEzD,MAAM,EAAY,CAAU,EAE9B,IAAM,EACJ,EAAW,SAAW,IAAA,GAClB,IAAI,EAAoB,CACtB,KAAM,EAAW,KACjB,QAAS,EAAW,QACpB,UAAW,EAAW,UACtB,oBAAqB,GACrB,WAAY,EAAW,UACzB,CAAC,EACD,IAAI,EAAoB,CACtB,KAAM,EAAW,KACjB,QAAS,EAAW,QACpB,UAAW,EAAW,UACtB,oBAAqB,GACrB,WAAY,EAAW,WACvB,OAAQ,EAAW,MACrB,CAAC,EACP,MAAM,EAAY,CAAa,CACjC,CAEA,SAAS,EAAsB,EAAmC,CAChE,IAAM,EAAQ,EAAM,OAAO,KAAK,CAAC,CAAC,YAAY,EACxC,EAAY,EAAM,WAAW,KAAK,EAClC,EAA2C,CAAC,EAalD,OAZI,IACF,EAAQ,MAAQ,GAEd,EAAM,oBAAsB,IAAA,KAC9B,EAAQ,kBAAoB,EAAM,mBAEhC,IACF,EAAQ,UAAY,GAElB,EAAM,WAAa,IAAA,KACrB,EAAQ,SAAW,EAAM,UAEpB,CACT,CAEA,SAAS,EAAuB,EAAqC,CACnE,GAAI,CACF,OAAO,GAAuB,CAAK,CAAC,CAAC,SACvC,MAAQ,CACN,EAAa,iCAAkC,aAAa,CAC9D,CACF,CAEA,SAAS,EACP,EACA,EACA,EACA,EAC6B,CAC7B,GAAM,CAAE,qBAAoB,GAAG,GAAkB,EACjD,OAAO,GACL,EAAW,CACT,GAAG,EACH,cAAe,GACf,QACA,QAAS,CACP,qBACA,SAAU,MACV,eAAgB,EAAQ,cAC1B,EACA,cAAe,EAAM,cACrB,iBAAkB,WAAW,OAAO,WAAW,EAC/C,SACF,CAAC,CACH,CACF,CAEA,SAAS,EACP,EACA,EACA,EACA,CACA,GAAI,CACF,OAAO,EAAyB,EAAS,CAAS,CAAC,CAAC,KACtD,OAAS,EAAO,CAId,MAHI,aAAiB,WACnB,EAAa,EAAM,QAAS,CAAS,EAEjC,CACR,CACF,CAEA,SAAS,EACP,EACA,EACA,EACA,EACA,CACA,GAAI,CAAC,EACH,MAAM,IAAI,EAAoB,CAC5B,GAAG,EACH,QAAS,0DACT,WAAY,EACd,CAAC,EAEH,IAAM,EAAgB,EACpB,EACA,EACA,EAAQ,SACV,EACA,OAAO,EAAW,CAChB,QAAS,EAAa,CAAO,EAC7B,SAAU,EACR,EACA,EACA,CAAE,kBAAmB,EAAQ,OAAO,OAAO,UAAW,EACtD,EAAQ,OACV,CACF,CAAC,CACH,CAMA,eAAe,EACb,EACyD,CACzD,IAAM,EAAU,CACd,KAAM,qBACN,QAAS,kDACT,UAAW,aACb,EACM,EAAa,EACf,GAAG,EAAU,aAAa,mBAAmB,KAAK,UAAU,CAAS,CAAC,IACtE,EACE,EAAW,MAAM,EACrB,EACA,EAAY,CAAE,MAAO,UAAW,EAAI,IAAA,GACpC,GACA,CACE,GAAG,EACH,QACE,gEACF,OAAQ,EACV,EACA,CAAE,GAAG,EAAS,OAAQ,EAAM,EAC5B,CACF,EACA,GAAI,CAAC,EAAS,GAAI,CAChB,IAAM,EAAa,EAAS,WAU5B,MATI,IAAe,qCACX,IAAI,EAAoB,CAC5B,GAAG,EACH,QAAS,2BACT,WAAY,GACZ,aACA,OAAQ,EAAS,SAAS,MAC5B,CAAC,EAEG,IAAI,EAAoB,CAC5B,GAAG,EACH,QAAS,sCAAsC,EAAS,SAAS,OAAO,IACxE,WAAY,EAAS,SAAS,QAAU,IACxC,OAAQ,EAAS,SAAS,MAC5B,CAAC,CACH,CACA,IAAM,EAAU,EAAW,GAAc,EAAS,MAAM,MAAM,CAAC,EAI/D,OAHK,EAGE,EACL,EACA,EACA,EAAS,MAAM,MACf,CACF,EAPS,EAAa,CAAO,CAQ/B,CAEA,eAAe,EACb,EACA,EACoC,CACpC,IAAM,EAAS,MAAM,EAAsB,EACrC,EAAU,CACd,kBAAmB,EAAO,OAAO,OAAO,UAC1C,EACM,EAAQ,EACZ,EACA,EACA,EAAQ,SACV,EACA,OAAO,EAAW,CAChB,QAAS,EACT,SAAU,MAAM,EACd,EACA,EACA,EAAO,QACP,CACF,CACF,CAAC,CACH,CAEA,eAAe,EACb,EACyD,CACzD,IAAM,EAAU,CACd,KAAM,qBACN,QAAS,kDACT,UAAW,aACb,EACA,GAAI,CAQF,OANE,GACA,GAAG,EAAU,aAAa,mBAAmB,KAAK,UAAU,CAAS,CAAC,IACnE,OAAS,IAEL,MAAM,EAAmB,EAAW,CAAO,EAE7C,EACH,MAAM,EAAsB,CAAS,EACrC,MAAM,EAAsB,CAClC,OAAS,EAAO,CACd,EAAc,EAAO,CAAO,CAC9B,CACF,CAMA,SAAS,EAAK,EAAsC,CAClD,OAAO,IAAU,IAAA,GACb,EAAW,EACX,EAAW,EAAuB,CAAK,CAAC,CAC9C,CAEA,eAAe,EACb,EACA,EACA,EACA,EACA,CACA,IAAM,EAAW,MAAM,EACrB,GAAG,EAAgB,QACnB,CACE,KAAM,KAAK,UAAU,CAAE,GAAG,EAAS,OAAM,CAAC,EAC1C,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,OAAQ,MACV,EACA,EACA,CACE,GAAG,EACH,QACE,iFACF,OAAQ,EACV,EACA,CAAE,GAAG,EAAS,OAAQ,EAAM,EAC5B,CACF,EACA,GAAI,CAAC,EAAS,GAAI,CAChB,IAAM,EAAa,EAAS,WAU5B,MATI,IAAe,qCACX,IAAI,EAAoB,CAC5B,GAAG,EACH,QAAS,2BACT,WAAY,GACZ,aACA,OAAQ,EAAS,SAAS,MAC5B,CAAC,EAEG,IAAI,EAAoB,CAC5B,GAAG,EACH,QAAS,uDAAuD,EAAS,SAAS,OAAO,IACzF,WAAY,EAAS,SAAS,QAAU,IACxC,OAAQ,EAAS,SAAS,MAC5B,CAAC,CACH,CACA,OAAO,EAAuB,EAAS,MAAO,EAAO,EAAS,CAAO,CACvE,CAEA,eAAe,EAAe,EAAuC,CACnE,GAAM,CAAE,UAAS,QAAO,WAAY,EAA6B,CAAK,EAChE,EAAU,CACd,KAAM,2BACN,QAAS,kDACT,UAAW,iBACb,EACA,GAAI,CACF,OAAO,MAAM,EACX,EACA,EACA,EAAQ,QACR,CACF,CACF,OAAS,EAAO,CACd,EAAc,EAAO,CAAO,CAC9B,CACF,CAEA,SAAS,EAA6B,EAAuC,CAC3E,GAAI,CACF,IAAM,EAAS,GAAyB,CAAK,EACvC,EAAW,GAA2B,CAAM,EAC5C,EAAU,EAAsB,EAAO,OAAO,EACpD,MAAO,CACL,QAAS,EAAS,QAClB,MAAO,EAAS,MAChB,QACE,EAAQ,oBAAsB,IAAA,GAC1B,CACE,GAAG,EACH,kBAAmB,EAAS,QAAQ,OAAO,OAAO,UACpD,EACA,CACR,CACF,OAAS,EAAO,CACd,GAAI,aAAiB,EACnB,MAAM,EAER,EACE,aAAiB,UACb,EAAM,QACN,iCACJ,iBACF,CACF,CACF,CAEA,SAAS,EAA4B,EAAsC,CACzE,GAAI,CACF,IAAM,EAAS,GAAwB,CAAK,EACtC,CACJ,QACA,QAAS,EACT,MAAO,GACL,EAAO,SACL,EAAU,EAAsB,CAAY,EAC5C,EAAQ,EAAW,CAAU,EAC7B,CAAE,cAAe,EACnB,EAAM,WAAa,GAAK,CAAC,EAAW,mBACtC,EACE,uDACA,iBACA,uBACF,EAEF,IAAM,EAAQ,EAAW,MAAM,KAAK,CAAC,CAAC,YAAY,EAOlD,OANI,CAAC,GAAS,IAAU,EAAQ,QAC9B,EACE,uDACA,gBACF,EAEK,CACL,QACA,UACA,QACA,WAAY,CAAE,GAAG,EAAY,OAAM,CACrC,CACF,OAAS,EAAO,CACd,GAAI,aAAiB,EACnB,MAAM,EAER,EACE,6CACA,iBACA,uBACF,CACF,CACF,CAEA,MAAO,CACL,iBACA,MAAM,iBAAiB,EAAkB,CACvC,IAAI,EACJ,GAAI,CACF,EACE,GAA2B,CAAgB,CAAC,CAAC,KAAK,CACtD,MAAQ,CACN,EACE,qDACA,oBACF,CACF,CACA,IAAM,EAAU,CACd,KAAM,wBACN,QAAS,kDACT,UAAW,oBACb,EACA,GAAI,CACF,IAAM,EAAW,MAAM,EACrB,GAAG,EAAgB,GAAG,mBAAmB,CAAmB,EAAE,SAC9D,IAAA,GACA,EACA,CACE,GAAG,EACH,QACE,+EACF,OAAQ,EACV,EACA,CAAE,GAAG,EAAS,OAAQ,EAAM,CAC9B,EACA,GAAI,CAAC,EAAS,GACZ,MAAM,IAAI,EAAoB,CAC5B,GAAG,EACH,QAAS,qDAAqD,EAAS,SAAS,OAAO,IACvF,WAAY,EAAS,SAAS,QAAU,IACxC,OAAQ,EAAS,SAAS,MAC5B,CAAC,EAEH,GAAI,EAAS,MAAM,mBAAqB,EACtC,MAAM,IAAI,EAAoB,CAAE,GAAG,EAAS,WAAY,EAAK,CAAC,EAEhE,OAAO,GAAmB,EAAS,KAAK,CAC1C,OAAS,EAAO,CACd,EAAc,EAAO,CAAO,CAC9B,CACF,EACA,OACA,MAAM,cAAc,EAAO,CACzB,GAAM,CAAE,QAAO,UAAS,QAAO,cAC7B,EAA4B,CAAK,EAC7B,EAAU,CACd,KAAM,wBACN,QAAS,wDACT,UAAW,gBACb,EACA,GAAI,CACF,IAAM,EAAW,MAAM,EACrB,GAAG,EAAgB,UACnB,CACE,KAAM,KAAK,UAAU,CACnB,kBAAmB,EAAW,kBAC9B,mBAAoB,EAAW,mBAC/B,MAAO,EAAW,MAClB,oBAAqB,EAAM,YAC3B,wBAAyB,EAAM,gBAC/B,2BAA4B,EAAM,QAAQ,mBAC1C,kCACE,EAAM,0BACR,sBAAuB,EAAM,cAC7B,wBAAyB,EAAM,gBAC/B,sBAAuB,EAAM,cAC7B,iBAAkB,EAAM,SACxB,mBAAoB,EAAM,WAC1B,GAAG,EACH,QACA,SAAU,EAAW,SACrB,UAAW,EAAW,UACtB,SAAU,EAAW,SACrB,iBAAkB,EAAM,iBACxB,MAAO,EAAW,MAClB,qBAAsB,EACtB,SAAU,EAAW,QACvB,CAAC,EACD,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,OAAQ,MACV,EACA,EACA,CACE,GAAG,EACH,QACE,uEACF,OAAQ,EACV,EACA,CAAE,GAAG,EAAS,OAAQ,EAAM,EAC5B,CACF,EACA,GAAI,CAAC,EAAS,GAAI,CAChB,IAAM,EAAa,EAAS,WAa5B,MAZI,EACI,IAAI,EAAoB,CAC5B,GAAG,EACH,QACE,IAAe,qCACX,2BACA,6CAA6C,EAAS,SAAS,OAAO,IAC5E,WAAY,GACZ,aACA,OAAQ,EAAS,SAAS,MAC5B,CAAC,EAEG,IAAI,EAAoB,CAC5B,GAAG,EACH,QAAS,6CAA6C,EAAS,SAAS,OAAO,IAC/E,WAAY,EAAS,SAAS,QAAU,IACxC,OAAQ,EAAS,SAAS,MAC5B,CAAC,CACH,CACA,GAAI,EAAS,MAAM,mBAAqB,EAAM,iBAC5C,MAAM,IAAI,EAAoB,CAAE,GAAG,EAAS,WAAY,EAAK,CAAC,EAEhE,OAAO,GAAmB,EAAS,KAAK,CAC1C,OAAS,EAAO,CACd,EAAc,EAAO,EAAS,EAAI,CACpC,CACF,CACF,CACF,CCvpBA,SAAgB,GACd,EACA,EAC6B,CAC7B,GAAM,CAAE,YAAW,GAAG,GAAiB,EACnC,EACJ,GAAI,CACF,EAAU,EAA0B,CAAY,CAClD,OAAS,EAAO,CACd,MAAU,UAAU,+BAAgC,CAAE,MAAO,CAAM,CAAC,CACtE,CACA,IAAM,EACJ,EAAQ,mBAAqB,EAAQ,OAAO,OAAO,WAC/C,CAAE,WAAW,GAAM,EACnB,CAAE,QAAO,YAAW,iBAAkB,EAC1C,EACA,CACF,EACM,EAAgB,EAAU,QAC7B,EAAO,IAAa,EAAQ,EAAS,cACtC,CACF,EACA,GACE,CAAC,OAAO,cAAc,CAAa,GACnC,GAAiB,GACjB,EAAgB,WAEhB,MAAU,UAAU,4BAA4B,EAElD,IAAM,EAA4B,EAAU,QACzC,EAAO,IACN,GAAS,EAAS,iBAAmB,EAAS,cAAgB,GAChE,CACF,EACM,EAAkB,EACpB,KAAK,MACF,EAAgB,EAAQ,cAAc,0BACrC,GACJ,EACA,EACE,EAAc,EAAgB,EAC9B,EAAa,EAAc,EACjC,GAAI,CAAC,OAAO,cAAc,CAAU,GAAK,EAAa,WACpD,MAAU,UAAU,4BAA4B,EAGlD,OAAO,EAAW,CAChB,cACA,gBAAiB,KACjB,cAAe,GACf,4BACA,cAAe,EACf,QACA,YACA,gBACA,kBACA,gBACA,WACA,YACF,CAAC,CACH"}
1
+ {"version":3,"file":"checkout.js","names":[],"sources":["../src/checkout-environment.ts","../src/checkout-schemas.ts","../src/checkout-input-schemas.ts","../src/custom-amount.ts","../src/checkout-selection.ts","../src/snapshots.ts","../src/checkout-client.ts","../src/checkout-estimate.ts"],"sourcesContent":["import { resolveResourceEnvironment } from \"./environment.ts\";\nimport type { CreateLockerverseWidgetOptions } from \"./types.ts\";\n\nexport function resolveWidgetEnvironment(\n options: CreateLockerverseWidgetOptions\n) {\n const runtime = resolveResourceEnvironment(options, \"widgetSlug\");\n return {\n ...runtime,\n widgetSlug: runtime.resourceSlug,\n widgetSlugValue: runtime.resourceSlugValue,\n };\n}\n","import {\n array,\n boolean,\n check,\n finite,\n type InferOutput,\n literal,\n looseObject,\n maxValue,\n minValue,\n nullable,\n number,\n object,\n optional,\n parser,\n picklist,\n pipe,\n regex,\n safeParse,\n string,\n transform,\n unknown,\n variant,\n} from \"valibot\";\n\nimport {\n vPaymentWidgetPaymentResultResponseDto,\n vPaymentWidgetQuoteResponseDto,\n vPublicPaymentWidgetResponseDto,\n} from \"./generated/public-api/valibot.gen.ts\";\nimport {\n customFieldsSchema,\n nonEmptyStringSchema,\n optionalNullableStringSchema,\n safeIntegerSchema,\n} from \"./schema-helpers.ts\";\n\nconst paymentOptionSchema = picklist([\n \"one-time\",\n \"monthly\",\n \"annually\",\n \"every-six-months\",\n]);\nconst fulfillmentTypeSchema = picklist([\"none\", \"event_admission\"]);\nconst nullableNonNegativeIntegerSchema = nullable(safeIntegerSchema(0));\nconst availabilityStatusSchema = picklist([\"available\", \"sold_out\"]);\nconst availabilitySchema = optional(\n object({\n listings: array(\n object({\n listingId: nonEmptyStringSchema,\n maxPurchasableQuantity: nullableNonNegativeIntegerSchema,\n remainingQuantity: nullableNonNegativeIntegerSchema,\n status: availabilityStatusSchema,\n })\n ),\n sharedLimits: array(\n object({\n id: nonEmptyStringSchema,\n listingIds: array(nonEmptyStringSchema),\n remainingQuantity: safeIntegerSchema(0),\n status: availabilityStatusSchema,\n })\n ),\n }),\n { listings: [], sharedLimits: [] }\n);\nconst publishableKeySchema = pipe(\n string(),\n regex(/^pk_(?:test|live)_\\S+$/, \"Invalid publishable key.\")\n);\n\nconst productBaseEntries = {\n description: optionalNullableStringSchema,\n fulfillmentType: fulfillmentTypeSchema,\n id: nonEmptyStringSchema,\n inventoryQuantity: nullableNonNegativeIntegerSchema,\n maxQuantity: nullableNonNegativeIntegerSchema,\n minimumAmountCents: nullableNonNegativeIntegerSchema,\n minQuantity: nullableNonNegativeIntegerSchema,\n name: nonEmptyStringSchema,\n paymentOption: paymentOptionSchema,\n};\n\nconst eventSchema = object({\n description: nullable(string()),\n endAt: nonEmptyStringSchema,\n id: nonEmptyStringSchema,\n location: nullable(string()),\n name: nonEmptyStringSchema,\n startAt: nonEmptyStringSchema,\n status: picklist([\"draft\", \"active\", \"finished\", \"cancelled\"]),\n});\n\nconst publicProductSchema = variant(\"pricingMode\", [\n object({\n ...productBaseEntries,\n amountCents: safeIntegerSchema(0),\n pricingMode: literal(\"fixed\"),\n }),\n object({\n ...productBaseEntries,\n amountCents: nullableNonNegativeIntegerSchema,\n pricingMode: literal(\"custom\"),\n }),\n]);\n\nconst productListingSchema = object({\n acceptsDiscounts: optional(boolean(), false),\n id: nonEmptyStringSchema,\n maxQuantityPerOrder: optional(nullableNonNegativeIntegerSchema, null),\n product: publicProductSchema,\n productId: nonEmptyStringSchema,\n slug: nonEmptyStringSchema,\n});\n\nconst widgetFieldsSchema = optional(\n object({\n memberId: optional(boolean(), false),\n merchSize: optional(boolean(), false),\n phone: optional(boolean(), false),\n promoCode: optional(boolean(), false),\n serviceFee: optional(boolean(), false),\n shipping: optional(boolean(), false),\n tipping: optional(boolean(), false),\n }),\n {}\n);\n\nexport const publicWidgetSchema = pipe(\n object({\n availability: availabilitySchema,\n community: optional(\n object({\n color: string(),\n memberIdLabel: optional(nullable(string())),\n name: nonEmptyStringSchema,\n thumbnail: nullable(string()),\n widgetAchEnabled: optional(boolean()),\n })\n ),\n config: optional(\n object({\n customFields: customFieldsSchema,\n fields: widgetFieldsSchema,\n })\n ),\n description: optionalNullableStringSchema,\n event: nullable(eventSchema),\n id: optional(string(), \"\"),\n name: optional(string(), \"Lockerverse widget\"),\n payment: object({\n connectedAccountId: optional(nullable(nonEmptyStringSchema), null),\n currency: literal(\"usd\"),\n publishableKey: publishableKeySchema,\n }),\n pricingPolicy: optional(\n object({\n currency: optional(literal(\"usd\"), \"usd\"),\n serviceFeeRateBasisPoints: optional(safeIntegerSchema(0), 0),\n })\n ),\n products: optional(array(productListingSchema), []),\n showCommunityBranding: optional(boolean(), true),\n title: optionalNullableStringSchema,\n }),\n transform((widget) => ({\n ...widget,\n config: {\n customFields: widget.config?.customFields ?? [],\n fields: {\n memberId: widget.config?.fields?.memberId ?? false,\n merchSize: widget.config?.fields?.merchSize ?? false,\n phone: widget.config?.fields?.phone ?? false,\n promoCode: widget.config?.fields?.promoCode ?? false,\n serviceFee: widget.config?.fields?.serviceFee ?? false,\n shipping: widget.config?.fields?.shipping ?? false,\n tipping: widget.config?.fields?.tipping ?? false,\n },\n },\n pricingPolicy: widget.pricingPolicy ?? {\n currency: \"usd\" as const,\n serviceFeeRateBasisPoints: 0,\n },\n }))\n);\n\nconst catalogProductSchema = object({\n acceptsDiscounts: boolean(),\n amountCents: nullable(safeIntegerSchema(0)),\n description: nullable(string()),\n fulfillmentType: fulfillmentTypeSchema,\n id: nonEmptyStringSchema,\n inventoryQuantity: nullableNonNegativeIntegerSchema,\n listingId: nonEmptyStringSchema,\n maximumQuantity: nullableNonNegativeIntegerSchema,\n minimumAmountCents: nullableNonNegativeIntegerSchema,\n minimumQuantity: nullableNonNegativeIntegerSchema,\n name: nonEmptyStringSchema,\n paymentOption: paymentOptionSchema,\n pricingMode: picklist([\"fixed\", \"custom\"]),\n slug: nonEmptyStringSchema,\n});\n\nconst catalogSchema = object({\n availability: availabilitySchema,\n community: nullable(\n object({\n accentColor: string(),\n imageUrl: nullable(string()),\n memberIdLabel: optional(nullable(string())),\n name: nonEmptyStringSchema,\n widgetAchEnabled: optional(boolean()),\n })\n ),\n event: nullable(eventSchema),\n payment: object({\n connectedAccountId: optional(nullable(nonEmptyStringSchema), null),\n currency: literal(\"usd\"),\n publishableKey: publishableKeySchema,\n }),\n pricingPolicy: object({\n currency: literal(\"usd\"),\n serviceFeeRateBasisPoints: safeIntegerSchema(0),\n }),\n products: array(catalogProductSchema),\n widget: object({\n customFields: customFieldsSchema,\n description: nullable(string()),\n fields: widgetFieldsSchema,\n id: string(),\n name: nonEmptyStringSchema,\n showCommunityBranding: boolean(),\n title: nullable(string()),\n }),\n});\n\nconst appliedDiscountSchema = nullable(\n object({\n percentageOff: pipe(number(), finite(), minValue(0), maxValue(100)),\n source: picklist([\"email_list\", \"promo_code\"]),\n })\n);\n\nconst checkoutLineItemSchema = object({\n acceptsDiscounts: boolean(),\n eventId: nullable(nonEmptyStringSchema),\n fulfillmentType: fulfillmentTypeSchema,\n listingId: nonEmptyStringSchema,\n listingSlug: nonEmptyStringSchema,\n paymentOption: paymentOptionSchema,\n pricingMode: picklist([\"fixed\", \"custom\"]),\n productId: nonEmptyStringSchema,\n productName: nonEmptyStringSchema,\n quantity: safeIntegerSchema(1),\n subtotalCents: safeIntegerSchema(0),\n unitAmountCents: safeIntegerSchema(0),\n});\n\nexport const checkoutQuoteSchema = pipe(\n vPaymentWidgetQuoteResponseDto,\n object({\n amountCents: safeIntegerSchema(0),\n appliedDiscount: appliedDiscountSchema,\n connectedAccountId: nullable(nonEmptyStringSchema),\n discountableSubtotalCents: safeIntegerSchema(0),\n discountCents: safeIntegerSchema(0),\n lineItems: array(checkoutLineItemSchema),\n paymentOption: paymentOptionSchema,\n serviceFeeCents: safeIntegerSchema(0),\n subtotalCents: safeIntegerSchema(0),\n tipCents: safeIntegerSchema(0),\n totalCents: safeIntegerSchema(0),\n }),\n check(({ lineItems, paymentOption }) => {\n if (\n lineItems.length === 0 ||\n lineItems.some((item) => item.paymentOption !== paymentOption)\n ) {\n return false;\n }\n return (\n paymentOption === \"one-time\" ||\n (lineItems.length === 1 &&\n lineItems[0]?.pricingMode === \"fixed\" &&\n lineItems[0].quantity === 1)\n );\n }, \"Invalid checkout cadence composition.\")\n);\n\nexport const paymentResultSchema = pipe(\n object({\n ...vPaymentWidgetPaymentResultResponseDto.entries,\n retryUrl: optional(pipe(nonEmptyStringSchema, regex(/^https:\\/\\//))),\n }),\n check((payment) => {\n if (!(payment.checkoutId.trim() && payment.paymentReference.trim())) {\n return false;\n }\n if (payment.checkoutStatus === \"action_required\") {\n return (\n payment.paymentRequired &&\n ((payment.requiresAction && Boolean(payment.clientSecret?.trim())) ||\n (!payment.requiresAction &&\n payment.clientSecret === null &&\n Boolean(payment.retryUrl)))\n );\n }\n return !payment.requiresAction && payment.clientSecret === null;\n }, \"Invalid payment result state.\")\n);\n\nexport type PublicCheckoutQuote = InferOutput<typeof checkoutQuoteSchema>;\nexport type PublicProductListing = InferOutput<typeof productListingSchema>;\nexport type PublicWidget = InferOutput<typeof publicWidgetSchema>;\n\nexport const parseCheckoutQuote = parser(checkoutQuoteSchema);\nexport const parseCatalog = parser(catalogSchema);\nexport const parsePaymentResult = parser(paymentResultSchema);\nconst parsePublicWidgetContract = parser(vPublicPaymentWidgetResponseDto);\nconst parseSdkPublicWidget = parser(publicWidgetSchema);\n\nexport function parsePublicWidget<Input>(input: Input) {\n parsePublicWidgetContract(input);\n return parseSdkPublicWidget(input);\n}\n\nexport function parsePublicWidgetLoad<Input>(input: Input) {\n const response = safeParse(\n looseObject({ quote: optional(unknown()) }),\n input\n );\n const widget = parsePublicWidget(input);\n const quote = response.success ? response.output.quote : undefined;\n return quote === undefined\n ? { widget }\n : { quote: parseCheckoutQuote(quote), widget };\n}\n","import {\n array,\n boolean,\n type InferOutput,\n literal,\n looseObject,\n minLength,\n nullable,\n object,\n optional,\n parser,\n picklist,\n pipe,\n record,\n strictObject,\n string,\n transform,\n union,\n unknown,\n} from \"valibot\";\n\nimport { parseCheckoutQuote } from \"./checkout-schemas.ts\";\nimport {\n customFieldAnswerSchema,\n nonEmptyStringSchema,\n safeIntegerSchema,\n} from \"./schema-helpers.ts\";\n\nconst checkoutPricingEntries = {\n email: optional(string()),\n includeServiceFee: optional(boolean()),\n promoCode: optional(string()),\n tipCents: optional(safeIntegerSchema(0)),\n};\n\nconst checkoutPricingInputSchema = strictObject(checkoutPricingEntries);\n\nexport const parseCheckoutPricingInput = parser(\n optional(checkoutPricingInputSchema, {})\n);\n\nconst paymentSubmissionSchema = strictObject({\n confirmationToken: optional(nonEmptyStringSchema),\n customFieldAnswers: optional(array(customFieldAnswerSchema)),\n email: string(),\n memberId: optional(string()),\n merchSize: optional(picklist([\"XS\", \"S\", \"M\", \"L\", \"XL\", \"XXL\", \"XXXL\"])),\n metadata: optional(record(string(), string())),\n paymentMethodConfiguration: optional(literal(\"explicit\")),\n phone: optional(string()),\n shipping: optional(\n strictObject({\n address: strictObject({\n city: string(),\n country: string(),\n line1: string(),\n line2: optional(string()),\n postal_code: string(),\n state: string(),\n }),\n name: string(),\n })\n ),\n});\n\nconst checkoutItemSchema = union([\n strictObject({\n amountCents: safeIntegerSchema(1),\n productId: nonEmptyStringSchema,\n }),\n strictObject({\n productId: nonEmptyStringSchema,\n quantity: safeIntegerSchema(1),\n }),\n strictObject({\n productId: nonEmptyStringSchema,\n }),\n]);\n\nconst checkoutSelectionItemSchema = union([\n strictObject({\n amountCents: safeIntegerSchema(1),\n productSlug: nonEmptyStringSchema,\n }),\n strictObject({\n productSlug: nonEmptyStringSchema,\n quantity: safeIntegerSchema(1),\n }),\n strictObject({\n productSlug: nonEmptyStringSchema,\n }),\n]);\n\nconst checkoutItemsSchema = pipe(array(checkoutItemSchema), minLength(1));\nconst checkoutSelectionItemsSchema = pipe(\n array(checkoutSelectionItemSchema),\n minLength(1)\n);\n\nconst loadCheckoutInputSchema = object({\n selection: checkoutSelectionItemsSchema,\n});\n\nconst calculateTotalInputSchema = looseObject({\n catalog: optional(unknown()),\n email: optional(unknown()),\n includeServiceFee: optional(unknown()),\n items: optional(checkoutItemsSchema),\n promoCode: optional(unknown()),\n selection: optional(checkoutSelectionItemsSchema),\n tipCents: optional(unknown()),\n});\n\nconst preparedCheckoutInputSchema = pipe(\n looseObject({\n authoritative: literal(true),\n items: checkoutItemsSchema,\n payment: object({\n connectedAccountId: nullable(nonEmptyStringSchema),\n currency: literal(\"usd\"),\n publishableKey: pipe(string(), minLength(1)),\n }),\n paymentReference: pipe(string(), minLength(1)),\n pricing: checkoutPricingInputSchema,\n }),\n transform((checkout) => {\n const { items, payment, paymentReference, pricing, ...quoteInput } =\n checkout;\n const parsedQuote = parseCheckoutQuote({\n ...quoteInput,\n connectedAccountId: payment.connectedAccountId,\n });\n const { connectedAccountId, ...quote } = parsedQuote;\n return {\n items,\n pricing,\n quote: {\n ...quote,\n authoritative: true as const,\n payment: {\n connectedAccountId,\n currency: \"usd\" as const,\n publishableKey: payment.publishableKey,\n },\n paymentOption: parsedQuote.paymentOption,\n paymentReference,\n },\n };\n })\n);\n\nconst submitPaymentInputSchema = looseObject({\n checkout: preparedCheckoutInputSchema,\n submission: paymentSubmissionSchema,\n});\n\nconst paymentReferenceInputSchema = nonEmptyStringSchema;\nconst parseCatalogInputFields = parser(looseObject({}));\n\nexport type ParsedPreparedCheckoutInput = InferOutput<\n typeof preparedCheckoutInputSchema\n>;\nexport type ParsedLoadCheckoutInput = InferOutput<\n typeof loadCheckoutInputSchema\n>;\nexport type ParsedPaymentReferenceInput = InferOutput<\n typeof paymentReferenceInputSchema\n>;\nexport type ParsedSubmitPaymentInput = InferOutput<\n typeof submitPaymentInputSchema\n>;\n\nconst parseCalculateTotalInputFields = parser(calculateTotalInputSchema);\n\nexport function parseCalculateTotalInput<Input>(input: Input) {\n const { catalog, items, selection, ...pricingInput } =\n parseCalculateTotalInputFields(input);\n let parsedCatalog: ReturnType<typeof parseCatalogInputFields>;\n try {\n parsedCatalog = parseCatalogInputFields(catalog);\n } catch (error) {\n throw new TypeError(\"A catalog is required to calculate a checkout.\", {\n cause: error,\n });\n }\n try {\n return {\n catalog: parsedCatalog,\n items,\n pricing: parseCheckoutPricingInput(pricingInput),\n selection,\n };\n } catch (error) {\n throw new TypeError(\"Checkout pricing input is invalid.\", { cause: error });\n }\n}\n\nexport type ParsedCalculateTotalInput = ReturnType<\n typeof parseCalculateTotalInput\n>;\nexport type ParsedCheckoutPricingInput = InferOutput<\n typeof checkoutPricingInputSchema\n>;\n\nexport const parseLoadCheckoutInput = parser(loadCheckoutInputSchema);\nexport const parsePaymentReferenceInput = parser(paymentReferenceInputSchema);\nexport const parsePreparedCheckoutInput = parser(preparedCheckoutInputSchema);\nexport const parseSubmitPaymentInput = parser(submitPaymentInputSchema);\n\nexport const parseCheckoutSelectionItems = parser(checkoutSelectionItemsSchema);\n","import type { LockerverseProduct } from \"./types.ts\";\n\nconst minimumCustomAmountCents = 100;\n\nexport function getLockerverseMinimumCustomAmountCents(\n product: Pick<LockerverseProduct, \"minimumAmountCents\">\n) {\n return Math.max(minimumCustomAmountCents, product.minimumAmountCents ?? 0);\n}\n","import { parseCheckoutSelectionItems } from \"./checkout-input-schemas.ts\";\nimport { getLockerverseMinimumCustomAmountCents } from \"./custom-amount.ts\";\nimport type {\n LockerverseCatalog,\n LockerverseCheckoutItem,\n LockerverseCheckoutLineItem,\n LockerverseCheckoutSelectionItem,\n LockerverseProduct,\n} from \"./types.ts\";\nimport { LockerverseSdkError } from \"./types.ts\";\n\ntype ResolvedSelectionItem = {\n checkoutItem: LockerverseCheckoutItem;\n quantity: number;\n unitAmountCents: number;\n};\n\nexport function assertCheckoutItemsAreAvailable(\n catalog: LockerverseCatalog,\n items: LockerverseCheckoutItem[]\n) {\n const listingIdByProductId = new Map(\n catalog.products.map(({ id, listingId }) => [id, listingId])\n );\n const requestedByListingId = items.reduce((requested, item) => {\n const listingId = listingIdByProductId.get(item.productId);\n if (listingId) {\n requested.set(\n listingId,\n (requested.get(listingId) ?? 0) +\n (\"quantity\" in item ? (item.quantity ?? 1) : 1)\n );\n }\n return requested;\n }, new Map<string, number>());\n const listingIsSoldOut = catalog.availability.listings.some(\n ({ listingId, maxPurchasableQuantity, status }) =>\n requestedByListingId.has(listingId) &&\n (status === \"sold_out\" ||\n (maxPurchasableQuantity !== null &&\n (requestedByListingId.get(listingId) ?? 0) > maxPurchasableQuantity))\n );\n const sharedLimitIsSoldOut = catalog.availability.sharedLimits.some(\n ({ listingIds, remainingQuantity, status }) => {\n const requestedQuantity = listingIds.reduce(\n (total, listingId) =>\n total + (requestedByListingId.get(listingId) ?? 0),\n 0\n );\n return (\n requestedQuantity > 0 &&\n (status === \"sold_out\" || requestedQuantity > remainingQuantity)\n );\n }\n );\n if (listingIsSoldOut || sharedLimitIsSoldOut) {\n throw new LockerverseSdkError({\n code: \"total_calculation_failed\",\n message: \"This option is sold out.\",\n operation: \"calculate_total\",\n reportable: false,\n serverCode: \"PAYMENT_WIDGET_SALES_LIMIT_REACHED\",\n });\n }\n}\n\nfunction resolveAmountItem(\n product: LockerverseProduct,\n amountCents: number\n): ResolvedSelectionItem {\n if (\n product.pricingMode !== \"custom\" ||\n product.paymentOption !== \"one-time\" ||\n amountCents < getLockerverseMinimumCustomAmountCents(product)\n ) {\n throw new TypeError(\"Selected Product amount is invalid.\");\n }\n return {\n checkoutItem: { amountCents, productId: product.id },\n quantity: 1,\n unitAmountCents: amountCents,\n };\n}\n\nfunction resolveFixedItem(\n product: LockerverseProduct,\n quantity: number\n): ResolvedSelectionItem {\n if (product.pricingMode !== \"fixed\" || product.amountCents === null) {\n throw new TypeError(\"Selected Product quantity is invalid.\");\n }\n if (product.paymentOption !== \"one-time\" && quantity !== 1) {\n throw new TypeError(\"Selected recurring Product is invalid.\");\n }\n if (\n (product.minimumQuantity !== null && quantity < product.minimumQuantity) ||\n (product.maximumQuantity !== null && quantity > product.maximumQuantity) ||\n (product.inventoryQuantity !== null && quantity > product.inventoryQuantity)\n ) {\n throw new TypeError(\"Selected Product quantity is invalid.\");\n }\n return {\n checkoutItem:\n product.paymentOption === \"one-time\"\n ? { productId: product.id, quantity }\n : { productId: product.id },\n quantity,\n unitAmountCents: product.amountCents,\n };\n}\n\nfunction resolveSelectionItem(\n catalog: LockerverseCatalog,\n product: LockerverseProduct,\n selection: LockerverseCheckoutSelectionItem\n) {\n const selectedQuantity = \"quantity\" in selection ? selection.quantity : 1;\n const resolved =\n \"amountCents\" in selection\n ? resolveAmountItem(product, selection.amountCents)\n : resolveFixedItem(product, selectedQuantity);\n const { checkoutItem, quantity, unitAmountCents } = resolved;\n\n return {\n checkoutItem,\n lineItem: {\n acceptsDiscounts: product.acceptsDiscounts,\n eventId:\n product.fulfillmentType === \"event_admission\" && catalog.event\n ? catalog.event.id\n : null,\n fulfillmentType: product.fulfillmentType,\n listingId: product.listingId,\n listingSlug: product.slug,\n paymentOption: product.paymentOption,\n pricingMode: product.pricingMode,\n productId: product.id,\n productName: product.name,\n quantity,\n subtotalCents: unitAmountCents * quantity,\n unitAmountCents,\n } satisfies LockerverseCheckoutLineItem,\n };\n}\n\nexport function resolveCheckoutSelection(\n catalog: LockerverseCatalog,\n input: LockerverseCheckoutSelectionItem[]\n) {\n const selection = parseCheckoutSelectionItems(input);\n const selectedProducts = new Set<string>();\n const resolved = selection.map((item) => {\n const product = catalog.products.find(\n (candidate) => candidate.slug === item.productSlug\n );\n if (!product) {\n throw new TypeError(\"Selected Product is unavailable.\");\n }\n if (selectedProducts.has(product.id)) {\n throw new TypeError(\"Each Product can appear only once per checkout.\");\n }\n selectedProducts.add(product.id);\n return resolveSelectionItem(catalog, product, item);\n });\n const paymentOption = resolved[0]?.lineItem.paymentOption;\n if (!paymentOption) {\n throw new TypeError(\"Select at least one Product.\");\n }\n if (\n resolved.length > 1 &&\n (paymentOption !== \"one-time\" ||\n resolved.some(({ lineItem }) => lineItem.paymentOption !== paymentOption))\n ) {\n throw new TypeError(\"Recurring Products must be purchased separately.\");\n }\n const items = resolved.map(({ checkoutItem }) => checkoutItem);\n assertCheckoutItemsAreAvailable(catalog, items);\n return {\n items,\n lineItems: resolved.map(({ lineItem }) => lineItem),\n paymentOption,\n };\n}\n","import type { PublicProductListing, PublicWidget } from \"./checkout-schemas.ts\";\nimport { deepFreeze } from \"./deep-freeze.ts\";\nimport type {\n LockerverseCatalog,\n LockerverseCommunityBranding,\n LockerversePaymentResult,\n LockerversePreparedCheckout,\n LockerverseProduct,\n} from \"./types.ts\";\n\nfunction mapProduct(listing: PublicProductListing): LockerverseProduct {\n const { product } = listing;\n\n return {\n acceptsDiscounts: listing.acceptsDiscounts ?? false,\n amountCents: product.amountCents,\n description: product.description ?? null,\n fulfillmentType: product.fulfillmentType,\n id: product.id,\n inventoryQuantity: product.inventoryQuantity,\n listingId: listing.id,\n maximumQuantity: listing.maxQuantityPerOrder,\n minimumAmountCents: product.minimumAmountCents,\n minimumQuantity: product.minQuantity,\n name: product.name,\n paymentOption: product.paymentOption,\n pricingMode: product.pricingMode,\n slug: listing.slug,\n };\n}\n\nfunction mapCommunity(\n community: PublicWidget[\"community\"]\n): LockerverseCommunityBranding | null {\n if (!community) {\n return null;\n }\n const branding: LockerverseCommunityBranding = {\n accentColor: community.color,\n imageUrl: community.thumbnail || null,\n name: community.name,\n };\n if (community.widgetAchEnabled !== undefined) {\n branding.widgetAchEnabled = community.widgetAchEnabled;\n }\n if (community.memberIdLabel !== undefined) {\n branding.memberIdLabel = community.memberIdLabel;\n }\n return branding;\n}\n\nexport function createCatalog(widget: PublicWidget): LockerverseCatalog {\n const fields = widget.config?.fields ?? {};\n\n return {\n availability: widget.availability,\n community: mapCommunity(widget.community),\n event: widget.event\n ? {\n description: widget.event.description,\n endAt: widget.event.endAt,\n id: widget.event.id,\n location: widget.event.location,\n name: widget.event.name,\n startAt: widget.event.startAt,\n status: widget.event.status,\n }\n : null,\n payment: {\n connectedAccountId: widget.payment.connectedAccountId,\n currency: widget.payment.currency,\n publishableKey: widget.payment.publishableKey,\n },\n pricingPolicy: {\n currency: \"usd\",\n serviceFeeRateBasisPoints:\n widget.pricingPolicy?.serviceFeeRateBasisPoints ?? 0,\n },\n products: (widget.products ?? []).map(mapProduct),\n widget: {\n customFields: widget.config?.customFields ?? [],\n description: widget.description ?? null,\n fields: {\n memberId: fields.memberId ?? false,\n merchSize: fields.merchSize ?? false,\n phone: fields.phone ?? false,\n promoCode: fields.promoCode ?? false,\n serviceFee: fields.serviceFee ?? false,\n shipping: fields.shipping ?? false,\n tipping: fields.tipping ?? false,\n },\n id: widget.id ?? \"\",\n name: widget.name ?? \"Lockerverse widget\",\n showCommunityBranding: widget.showCommunityBranding ?? true,\n title: widget.title ?? null,\n },\n };\n}\n\nexport function cloneCatalog(catalog: LockerverseCatalog): LockerverseCatalog {\n return cloneSnapshot(catalog);\n}\n\nexport function clonePreparedCheckout(\n checkout: LockerversePreparedCheckout\n): LockerversePreparedCheckout {\n return cloneSnapshot(checkout);\n}\n\nexport function clonePaymentResult(\n paymentResult: LockerversePaymentResult\n): LockerversePaymentResult {\n return cloneSnapshot(paymentResult);\n}\n\nfunction cloneSnapshot<T>(value: T): T {\n return deepFreeze(structuredClone(value));\n}\n","import { object, picklist, safeParse } from \"valibot\";\nimport { resolveWidgetEnvironment } from \"./checkout-environment.ts\";\nimport {\n type ParsedCalculateTotalInput,\n type ParsedCheckoutPricingInput,\n parseCalculateTotalInput,\n parseLoadCheckoutInput,\n parsePaymentReferenceInput,\n parseSubmitPaymentInput,\n} from \"./checkout-input-schemas.ts\";\nimport {\n parseCatalog,\n parseCheckoutQuote,\n parsePaymentResult,\n parsePublicWidgetLoad,\n} from \"./checkout-schemas.ts\";\nimport {\n assertCheckoutItemsAreAvailable,\n resolveCheckoutSelection,\n} from \"./checkout-selection.ts\";\nimport { deepFreeze } from \"./deep-freeze.ts\";\nimport { createSdkErrorReporter } from \"./error-reporting.ts\";\nimport {\n cloneCatalog,\n clonePaymentResult,\n clonePreparedCheckout,\n createCatalog,\n} from \"./snapshots.ts\";\nimport { createTransport } from \"./transport.ts\";\nimport {\n type CreateLockerverseWidgetOptions,\n type LockerverseCalculateTotalInput,\n type LockerverseCatalog,\n type LockerverseCheckoutClient,\n type LockerverseCheckoutItem,\n type LockerverseCheckoutPricingInput,\n type LockerverseCheckoutSelectionItem,\n type LockerverseLoadCheckoutInput,\n type LockerverseLoadedCheckout,\n type LockerversePreparedCheckout,\n LockerverseSdkError,\n type LockerverseSdkOperation,\n type LockerverseSdkServerCode,\n type LockerverseSubmitPaymentInput,\n} from \"./types.ts\";\n\ntype OperationErrorContext = {\n code:\n | \"payment_status_failed\"\n | \"payment_submit_failed\"\n | \"total_calculation_failed\"\n | \"widget_load_failed\";\n message: string;\n operation:\n | \"calculate_total\"\n | \"get_payment_status\"\n | \"load_widget\"\n | \"submit_payment\";\n};\n\nconst MAX_SELECTED_WIDGET_URL_LENGTH = 4000;\nconst paymentServerErrorSchema = object({\n code: picklist([\n \"PAYMENT_WIDGET_PHONE_INVALID\",\n \"PAYMENT_WIDGET_PHONE_REQUIRED\",\n \"PAYMENT_WIDGET_SALES_LIMIT_REACHED\",\n ]),\n});\n\nasync function readPaymentServerCode(\n response: Response\n): Promise<LockerverseSdkServerCode | undefined> {\n if (response.status !== 400 && response.status !== 409) {\n return;\n }\n try {\n const result = safeParse(paymentServerErrorSchema, await response.json());\n return result.success ? result.output.code : undefined;\n } catch {\n // Non-JSON error bodies do not contain a safe server code.\n }\n}\n\nfunction resolveCalculateTotalItems({\n catalog,\n items,\n selection,\n}: ParsedCalculateTotalInput) {\n if (items !== undefined && selection !== undefined) {\n throw new TypeError(\"Use items or selection, not both.\");\n }\n const selectionCatalog = cloneCatalog(parseCatalog(catalog));\n const checkoutItems =\n selection === undefined\n ? requireCheckoutItems(items)\n : resolveCheckoutSelection(selectionCatalog, selection).items;\n assertCheckoutItemsAreAvailable(selectionCatalog, checkoutItems);\n return {\n catalog: selectionCatalog,\n items: checkoutItems,\n };\n}\n\nfunction requireCheckoutItems(\n items: ParsedCalculateTotalInput[\"items\"]\n): LockerverseCheckoutItem[] {\n if (items === undefined) {\n throw new TypeError(\"Checkout selection is invalid.\");\n }\n return items;\n}\n\nexport function createLockerverseCheckoutClient(\n options: CreateLockerverseWidgetOptions\n): LockerverseCheckoutClient {\n const {\n apiBaseUrl,\n communitySlug,\n communitySlugValue,\n environment,\n fetchImplementation,\n onError,\n requestTimeoutMs,\n sentryDsn,\n widgetSlug,\n widgetSlugValue,\n } = resolveWidgetEnvironment(options);\n const reportError = createSdkErrorReporter({\n communitySlug: communitySlugValue,\n environment,\n getContext: () => ({ widgetSlug: widgetSlugValue }),\n onError,\n resourceContextName: \"lockerverse_widget\",\n sentryDsn,\n });\n const { requestJson } = createTransport(\n fetchImplementation,\n reportError,\n requestTimeoutMs\n );\n const checkoutBaseUrl = `${apiBaseUrl}/v2/community/${communitySlug}/payment-widgets/${widgetSlug}/checkout`;\n const widgetUrl = `${apiBaseUrl}/v2/community/${communitySlug}/payment-widgets/${widgetSlug}`;\n\n function invalidInput(\n message: string,\n operation: LockerverseSdkOperation,\n code: \"invalid_selection\" | \"payment_submit_failed\" = \"invalid_selection\"\n ): never {\n throw reportError(\n new LockerverseSdkError({\n code,\n message,\n operation,\n reportable: false,\n })\n );\n }\n\n function normalizeOperationError<ErrorValue>(\n error: ErrorValue,\n context: OperationErrorContext\n ) {\n return error instanceof LockerverseSdkError\n ? error\n : new LockerverseSdkError({ ...context, reportable: true });\n }\n\n function failOperation<ErrorValue>(\n error: ErrorValue,\n context: OperationErrorContext,\n recoveryMayBeRequired = false\n ): never {\n const normalized = normalizeOperationError(error, context);\n const recoveryRecommended =\n recoveryMayBeRequired &&\n (normalized.status === undefined || normalized.status >= 500);\n if (!recoveryRecommended) {\n throw reportError(normalized);\n }\n const recoveryError =\n normalized.status === undefined\n ? new LockerverseSdkError({\n code: normalized.code,\n message: normalized.message,\n operation: normalized.operation,\n recoveryRecommended: true,\n reportable: normalized.reportable,\n })\n : new LockerverseSdkError({\n code: normalized.code,\n message: normalized.message,\n operation: normalized.operation,\n recoveryRecommended: true,\n reportable: normalized.reportable,\n status: normalized.status,\n });\n throw reportError(recoveryError);\n }\n\n function normalizePricingInput(input: ParsedCheckoutPricingInput) {\n const email = input.email?.trim().toLowerCase();\n const promoCode = input.promoCode?.trim();\n const pricing: LockerverseCheckoutPricingInput = {};\n if (email) {\n pricing.email = email;\n }\n if (input.includeServiceFee !== undefined) {\n pricing.includeServiceFee = input.includeServiceFee;\n }\n if (promoCode) {\n pricing.promoCode = promoCode;\n }\n if (input.tipCents !== undefined) {\n pricing.tipCents = input.tipCents;\n }\n return pricing;\n }\n\n function normalizeLoadSelection(input: LockerverseLoadCheckoutInput) {\n try {\n return parseLoadCheckoutInput(input).selection;\n } catch {\n invalidInput(\"Checkout selection is invalid.\", \"load_widget\");\n }\n }\n\n function createPreparedCheckout(\n quote: ReturnType<typeof parseCheckoutQuote>,\n items: LockerverseCheckoutItem[],\n pricing: LockerverseCheckoutPricingInput,\n payment: LockerverseCatalog[\"payment\"]\n ): LockerversePreparedCheckout {\n const { connectedAccountId, ...checkoutQuote } = quote;\n return clonePreparedCheckout(\n deepFreeze({\n ...checkoutQuote,\n authoritative: true as const,\n items,\n payment: {\n connectedAccountId,\n currency: \"usd\" as const,\n publishableKey: payment.publishableKey,\n },\n paymentOption: quote.paymentOption,\n paymentReference: globalThis.crypto.randomUUID(),\n pricing,\n })\n );\n }\n\n function resolveSelectedCheckoutItems(\n catalog: LockerverseCatalog,\n selection: LockerverseCheckoutSelectionItem[],\n operation: LockerverseSdkOperation\n ) {\n try {\n return resolveCheckoutSelection(catalog, selection).items;\n } catch (error) {\n if (error instanceof TypeError) {\n invalidInput(error.message, operation);\n }\n throw error;\n }\n }\n\n function createSelectedCheckout(\n catalog: LockerverseCatalog,\n selection: LockerverseCheckoutSelectionItem[],\n quote: ReturnType<typeof parseCheckoutQuote> | undefined,\n context: OperationErrorContext\n ) {\n if (!quote) {\n throw new LockerverseSdkError({\n ...context,\n message: \"Lockerverse did not return the requested initial quote.\",\n reportable: true,\n });\n }\n const checkoutItems = resolveSelectedCheckoutItems(\n catalog,\n selection,\n context.operation\n );\n return deepFreeze({\n catalog: cloneCatalog(catalog),\n checkout: createPreparedCheckout(\n quote,\n checkoutItems,\n { includeServiceFee: catalog.widget.fields.serviceFee },\n catalog.payment\n ),\n });\n }\n\n function requestWidgetResource(): Promise<LockerverseCatalog>;\n function requestWidgetResource(\n selection: LockerverseCheckoutSelectionItem[]\n ): Promise<LockerverseLoadedCheckout>;\n async function requestWidgetResource(\n selection?: LockerverseCheckoutSelectionItem[]\n ): Promise<LockerverseCatalog | LockerverseLoadedCheckout> {\n const context = {\n code: \"widget_load_failed\" as const,\n message: \"Lockerverse returned an invalid widget catalog.\",\n operation: \"load_widget\" as const,\n };\n const requestUrl = selection\n ? `${widgetUrl}?selection=${encodeURIComponent(JSON.stringify(selection))}`\n : widgetUrl;\n const response = await requestJson(\n requestUrl,\n selection ? { cache: \"no-store\" } : undefined,\n parsePublicWidgetLoad,\n {\n ...context,\n message:\n \"Unable to load Lockerverse widget because the request failed.\",\n report: false,\n },\n { ...context, report: false },\n readPaymentServerCode\n );\n if (!response.ok) {\n const serverCode = response.errorValue;\n if (serverCode === \"PAYMENT_WIDGET_SALES_LIMIT_REACHED\") {\n throw new LockerverseSdkError({\n ...context,\n message: \"This option is sold out.\",\n reportable: false,\n serverCode,\n status: response.response.status,\n });\n }\n throw new LockerverseSdkError({\n ...context,\n message: `Unable to load Lockerverse widget (${response.response.status}).`,\n reportable: response.response.status >= 500,\n status: response.response.status,\n });\n }\n const catalog = deepFreeze(createCatalog(response.value.widget));\n if (!selection) {\n return cloneCatalog(catalog);\n }\n return createSelectedCheckout(\n catalog,\n selection,\n response.value.quote,\n context\n );\n }\n\n async function loadLargeSelection(\n selection: LockerverseCheckoutSelectionItem[],\n context: OperationErrorContext\n ): Promise<LockerverseLoadedCheckout> {\n const loaded = await requestWidgetResource();\n const pricing = {\n includeServiceFee: loaded.widget.fields.serviceFee,\n };\n const items = resolveSelectedCheckoutItems(\n loaded,\n selection,\n context.operation\n );\n return deepFreeze({\n catalog: loaded,\n checkout: await requestCheckoutQuote(\n items,\n pricing,\n loaded.payment,\n context\n ),\n });\n }\n\n async function loadWidget(\n selection?: LockerverseCheckoutSelectionItem[]\n ): Promise<LockerverseCatalog | LockerverseLoadedCheckout> {\n const context = {\n code: \"widget_load_failed\" as const,\n message: \"Lockerverse returned an invalid widget catalog.\",\n operation: \"load_widget\" as const,\n };\n try {\n if (\n selection &&\n `${widgetUrl}?selection=${encodeURIComponent(JSON.stringify(selection))}`\n .length > MAX_SELECTED_WIDGET_URL_LENGTH\n ) {\n return await loadLargeSelection(selection, context);\n }\n return selection\n ? await requestWidgetResource(selection)\n : await requestWidgetResource();\n } catch (error) {\n failOperation(error, context);\n }\n }\n\n function load(): Promise<LockerverseCatalog>;\n function load(\n input: LockerverseLoadCheckoutInput\n ): Promise<LockerverseLoadedCheckout>;\n function load(input?: LockerverseLoadCheckoutInput) {\n return input === undefined\n ? loadWidget()\n : loadWidget(normalizeLoadSelection(input));\n }\n\n async function requestCheckoutQuote(\n items: LockerverseCheckoutItem[],\n pricing: LockerverseCheckoutPricingInput,\n payment: LockerverseCatalog[\"payment\"],\n context: OperationErrorContext\n ) {\n const response = await requestJson(\n `${checkoutBaseUrl}/quote`,\n {\n body: JSON.stringify({ ...pricing, items }),\n headers: { \"Content-Type\": \"application/json\" },\n method: \"POST\",\n },\n parseCheckoutQuote,\n {\n ...context,\n message:\n \"Unable to calculate the Lockerverse checkout total because the request failed.\",\n report: false,\n },\n { ...context, report: false },\n readPaymentServerCode\n );\n if (!response.ok) {\n const serverCode = response.errorValue;\n if (serverCode === \"PAYMENT_WIDGET_SALES_LIMIT_REACHED\") {\n throw new LockerverseSdkError({\n ...context,\n message: \"This option is sold out.\",\n reportable: false,\n serverCode,\n status: response.response.status,\n });\n }\n throw new LockerverseSdkError({\n ...context,\n message: `Unable to calculate the Lockerverse checkout total (${response.response.status}).`,\n reportable: response.response.status >= 500,\n status: response.response.status,\n });\n }\n return createPreparedCheckout(response.value, items, pricing, payment);\n }\n\n async function calculateTotal(input: LockerverseCalculateTotalInput) {\n const { catalog, items, pricing } = normalizeCalculateTotalInput(input);\n const context = {\n code: \"total_calculation_failed\" as const,\n message: \"Lockerverse returned an invalid checkout total.\",\n operation: \"calculate_total\" as const,\n };\n try {\n return await requestCheckoutQuote(\n items,\n pricing,\n catalog.payment,\n context\n );\n } catch (error) {\n failOperation(error, context);\n }\n }\n\n function normalizeCalculateTotalInput(input: LockerverseCalculateTotalInput) {\n try {\n const parsed = parseCalculateTotalInput(input);\n const resolved = resolveCalculateTotalItems(parsed);\n const pricing = normalizePricingInput(parsed.pricing);\n return {\n catalog: resolved.catalog,\n items: resolved.items,\n pricing:\n pricing.includeServiceFee === undefined\n ? {\n ...pricing,\n includeServiceFee: resolved.catalog.widget.fields.serviceFee,\n }\n : pricing,\n };\n } catch (error) {\n if (error instanceof LockerverseSdkError) {\n throw error;\n }\n invalidInput(\n error instanceof TypeError\n ? error.message\n : \"Checkout selection is invalid.\",\n \"calculate_total\"\n );\n }\n }\n\n function normalizeSubmitPaymentInput(input: LockerverseSubmitPaymentInput) {\n try {\n const parsed = parseSubmitPaymentInput(input);\n const {\n items,\n pricing: pricingInput,\n quote: quoteInput,\n } = parsed.checkout;\n const pricing = normalizePricingInput(pricingInput);\n const quote = deepFreeze(quoteInput);\n const { submission } = parsed;\n if (quote.totalCents > 0 && !submission.confirmationToken) {\n invalidInput(\n \"Stripe confirmation is required for a paid checkout.\",\n \"submit_payment\",\n \"payment_submit_failed\"\n );\n }\n const email = submission.email.trim().toLowerCase();\n if (!email || email !== pricing.email) {\n invalidInput(\n \"Payment email must match the current checkout quote.\",\n \"submit_payment\"\n );\n }\n return {\n items,\n pricing,\n quote,\n submission: { ...submission, email },\n };\n } catch (error) {\n if (error instanceof LockerverseSdkError) {\n throw error;\n }\n invalidInput(\n \"Lockerverse payment submission is invalid.\",\n \"submit_payment\",\n \"payment_submit_failed\"\n );\n }\n }\n\n return {\n calculateTotal,\n async getPaymentStatus(paymentReference) {\n let normalizedReference: string;\n try {\n normalizedReference =\n parsePaymentReferenceInput(paymentReference).trim();\n } catch {\n invalidInput(\n \"Provide a payment reference to recover its status.\",\n \"get_payment_status\"\n );\n }\n const context = {\n code: \"payment_status_failed\" as const,\n message: \"Lockerverse returned an invalid payment status.\",\n operation: \"get_payment_status\" as const,\n };\n try {\n const response = await requestJson(\n `${checkoutBaseUrl}/${encodeURIComponent(normalizedReference)}/status`,\n undefined,\n parsePaymentResult,\n {\n ...context,\n message:\n \"Unable to recover the Lockerverse payment status because the request failed.\",\n report: false,\n },\n { ...context, report: false }\n );\n if (!response.ok) {\n throw new LockerverseSdkError({\n ...context,\n message: `Unable to recover the Lockerverse payment status (${response.response.status}).`,\n reportable: response.response.status >= 500,\n status: response.response.status,\n });\n }\n if (response.value.paymentReference !== normalizedReference) {\n throw new LockerverseSdkError({ ...context, reportable: true });\n }\n return clonePaymentResult(response.value);\n } catch (error) {\n failOperation(error, context);\n }\n },\n load,\n async submitPayment(input) {\n const { items, pricing, quote, submission } =\n normalizeSubmitPaymentInput(input);\n const context = {\n code: \"payment_submit_failed\" as const,\n message: \"Lockerverse returned an invalid payment confirmation.\",\n operation: \"submit_payment\" as const,\n };\n try {\n const response = await requestJson(\n `${checkoutBaseUrl}/confirm`,\n {\n body: JSON.stringify({\n confirmationToken: submission.confirmationToken,\n customFieldAnswers: submission.customFieldAnswers,\n email: submission.email,\n expectedAmountCents: quote.amountCents,\n expectedAppliedDiscount: quote.appliedDiscount,\n expectedConnectedAccountId: quote.payment.connectedAccountId,\n expectedDiscountableSubtotalCents:\n quote.discountableSubtotalCents,\n expectedDiscountCents: quote.discountCents,\n expectedServiceFeeCents: quote.serviceFeeCents,\n expectedSubtotalCents: quote.subtotalCents,\n expectedTipCents: quote.tipCents,\n expectedTotalCents: quote.totalCents,\n ...pricing,\n items,\n memberId: submission.memberId,\n merchSize: submission.merchSize,\n metadata: submission.metadata,\n paymentMethodConfiguration: submission.paymentMethodConfiguration,\n paymentReference: quote.paymentReference,\n phone: submission.phone,\n quoteContractVersion: 1,\n shipping: submission.shipping,\n }),\n headers: { \"Content-Type\": \"application/json\" },\n method: \"POST\",\n },\n parsePaymentResult,\n {\n ...context,\n message:\n \"Unable to submit the Lockerverse payment because the request failed.\",\n report: false,\n },\n { ...context, report: false },\n readPaymentServerCode\n );\n if (!response.ok) {\n const serverCode = response.errorValue;\n if (serverCode) {\n throw new LockerverseSdkError({\n ...context,\n message:\n serverCode === \"PAYMENT_WIDGET_SALES_LIMIT_REACHED\"\n ? \"This option is sold out.\"\n : `Unable to submit the Lockerverse payment (${response.response.status}).`,\n reportable: false,\n serverCode,\n status: response.response.status,\n });\n }\n throw new LockerverseSdkError({\n ...context,\n message: `Unable to submit the Lockerverse payment (${response.response.status}).`,\n reportable: response.response.status >= 500,\n status: response.response.status,\n });\n }\n if (response.value.paymentReference !== quote.paymentReference) {\n throw new LockerverseSdkError({ ...context, reportable: true });\n }\n return clonePaymentResult(response.value);\n } catch (error) {\n failOperation(error, context, true);\n }\n },\n };\n}\n","import { parseCheckoutPricingInput } from \"./checkout-input-schemas.ts\";\nimport { resolveCheckoutSelection } from \"./checkout-selection.ts\";\nimport { deepFreeze } from \"./deep-freeze.ts\";\nimport type {\n LockerverseCatalog,\n LockerverseCheckoutEstimate,\n LockerverseEstimateCheckoutInput,\n} from \"./types.ts\";\n\nexport function estimateLockerverseCheckout(\n catalog: LockerverseCatalog,\n input: LockerverseEstimateCheckoutInput\n): LockerverseCheckoutEstimate {\n const { selection, ...pricingInput } = input;\n let pricing: ReturnType<typeof parseCheckoutPricingInput>;\n try {\n pricing = parseCheckoutPricingInput(pricingInput);\n } catch (error) {\n throw new TypeError(\"Checkout pricing is invalid.\", { cause: error });\n }\n const includeServiceFee =\n pricing.includeServiceFee ?? catalog.widget.fields.serviceFee;\n const { tipCents = 0 } = pricing;\n const { items, lineItems, paymentOption } = resolveCheckoutSelection(\n catalog,\n selection\n );\n const subtotalCents = lineItems.reduce(\n (total, lineItem) => total + lineItem.subtotalCents,\n 0\n );\n if (\n !Number.isSafeInteger(subtotalCents) ||\n subtotalCents <= 0 ||\n subtotalCents > 2_147_483_647\n ) {\n throw new TypeError(\"Checkout total is invalid.\");\n }\n const discountableSubtotalCents = lineItems.reduce(\n (total, lineItem) =>\n total + (lineItem.acceptsDiscounts ? lineItem.subtotalCents : 0),\n 0\n );\n const serviceFeeCents = includeServiceFee\n ? Math.round(\n (subtotalCents * catalog.pricingPolicy.serviceFeeRateBasisPoints) /\n 10_000\n )\n : 0;\n const amountCents = subtotalCents + serviceFeeCents;\n const totalCents = amountCents + tipCents;\n if (!Number.isSafeInteger(totalCents) || totalCents > 2_147_483_647) {\n throw new TypeError(\"Checkout total is invalid.\");\n }\n\n return deepFreeze({\n amountCents,\n appliedDiscount: null,\n authoritative: false,\n discountableSubtotalCents,\n discountCents: 0,\n items,\n lineItems,\n paymentOption,\n serviceFeeCents,\n subtotalCents,\n tipCents,\n totalCents,\n });\n}\n"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -214,6 +214,7 @@ type LockerverseShipping = {
214
214
  };
215
215
  type LockerversePaymentSubmission = {
216
216
  confirmationToken?: string;
217
+ paymentMethodConfiguration?: "explicit";
217
218
  customFieldAnswers?: LockerverseCustomFieldAnswer[];
218
219
  email: string;
219
220
  memberId?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":";KAGY;KAKA;KACA;cAEC;KAED;EACV;EACA;EACA;EACA;EACA;EACA,iBAAiB;EACjB;EACA,eAAe;EACf;EACA;EACA;;EAEA;EACA;EACA;;KAGU;KAEA;EACV,UAAU;IACR;IACA;IACA;IACA,QAAQ;;EAEV,cAAc;IACZ;IACA;IACA;IACA,QAAQ;;;KAIA;EACV,cAAc;EACd,WAAW;EACX,OAAO;EACP,SAAS;EACT,eAAe;EACf,UAAU;EACV,QAAQ;;KAGE;EACV;EACA;EACA;EACA;EACA;EACA;EACA;;KAGU;EACV;EACA;EACA;EACA;EACA;;KAGU;EACV;EACA;;KAGU;EACV;EACA;EACA;;KAGU;EACV;EACA;EACA;EACA;EACA;EACA;EACA;;KAGU;EAAiC;EAAY;;KAEpD;EACH;EACA;EACA;EACA;;KAGU,6BAA6B;EACvC;;KAGU,gCAAgC;EAC1C;;KAGU,qCAAqC;EAC/C,SAAS;EACT;;KAGU,oCAAoC;EAC9C,SAAS;EACT;;KAGU,yBACR,gCACA,6BACA,qCACA;KAEQ,kCACV,cAAc,0BACZ,cAAc,0CAEd,cAAc;KAIN,6BACV,cAAc,yBAAyB,0BACrC,cAAc;EACZ,SAAS;EAAa,OAAO,kCAAkC;;KAGzD;EACV,cAAc;EACd;EACA,QAAQ;EACR;EACA;EACA;EACA;;KAGU;KAeA;KAeA;cAOC,4BAA4B;WAC9B,MAAM;WACN,WAAW;WACX;WACA;WACA;WACA,YAAY;WACZ;EAEG,cACV,MACA,SACA,WACA,YACA,qBACA,YACA;IAEA,MAAM;IACN;IACA,WAAW;IACX;IACA;IACA,aAAa;IACb;;;KAcQ;EACV;EACA;EACA;EACA;EACA;EACA;EACA,iBAAiB;EACjB;EACA,eAAe;EACf;EACA;EACA;;KAGU;EACV;EACA;;KAGU;EACV;EACA;EACA;EACA;EACA;EACA;EACA;;KAGU,2BAA2B;EACrC,iBAAiB;EACjB;EACA;EACA,SAAS;EACT,eAAe;EACf,WAAW;;KAGD,8BAA8B;EACxC;EACA;EACA,gBAAgB;EAChB,oBAAoB;EACpB,eAAe;;KAGL;EACV;EACA;EACA;EACA;;KAGU;KAMA;EACV;EACA;EACA,gBAAgB;EAChB;EACA;EACA;EACA;EACA;;KAGU,+BAA+B;EACzC;EACA,oBAAoB;;KAYV;EACV;IACE;IACA;IACA;IACA;IACA;IACA;;EAEF;;KAGU;EACV;EACA,qBAAqB;EACrB;EACA;EACA;EACA,WAAW;EACX;EACA,WAAW;;KAGD;EACN;EAAmB;;EACnB;EAAmB;;EACnB;;KAEM;EACN;EAAqB;;EACrB;EAAqB;;EACrB;;KAEM,mCACV;EACE,WAAW;;KAGH;EACV,WAAW;;KAGD,iCAAiC;EAC3C,SAAS;;EAGH,OAAO;EACP;;EAGA;EACA,WAAW;;KAIP,8BAA8B,SACxC;EACE,gBAAgB;EAChB,SAAS,SAAS;;KAIV,4BAA4B;EACtC,SAAS;EACT,UAAU;;KAGA;EACV,UAAU;EACV,YAAY;;KAGT;EACH;EACA,eAAe,WAAW;EAC1B,WAAW,OAAO;EAClB;EACA;EACA;;KAGU;EAEN;EACA,aAAa;;EAGb;EACA;;KAGM,iCACV,qCAAqC;KAE3B;EACV,iBACE,OAAO,mCACJ,QAAQ;EACb,mBACE,6BACG,QAAQ;EACb;QACM,QAAQ;KACX,OAAO,+BAA+B,QAAQ;;EAEjD,gBACE,OAAO,kCACJ,QAAQ"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":";KAGY;KAKA;KACA;cAEC;KAED;EACV;EACA;EACA;EACA;EACA;EACA,iBAAiB;EACjB;EACA,eAAe;EACf;EACA;EACA;;EAEA;EACA;EACA;;KAGU;KAEA;EACV,UAAU;IACR;IACA;IACA;IACA,QAAQ;;EAEV,cAAc;IACZ;IACA;IACA;IACA,QAAQ;;;KAIA;EACV,cAAc;EACd,WAAW;EACX,OAAO;EACP,SAAS;EACT,eAAe;EACf,UAAU;EACV,QAAQ;;KAGE;EACV;EACA;EACA;EACA;EACA;EACA;EACA;;KAGU;EACV;EACA;EACA;EACA;EACA;;KAGU;EACV;EACA;;KAGU;EACV;EACA;EACA;;KAGU;EACV;EACA;EACA;EACA;EACA;EACA;EACA;;KAGU;EAAiC;EAAY;;KAEpD;EACH;EACA;EACA;EACA;;KAGU,6BAA6B;EACvC;;KAGU,gCAAgC;EAC1C;;KAGU,qCAAqC;EAC/C,SAAS;EACT;;KAGU,oCAAoC;EAC9C,SAAS;EACT;;KAGU,yBACR,gCACA,6BACA,qCACA;KAEQ,kCACV,cAAc,0BACZ,cAAc,0CAEd,cAAc;KAIN,6BACV,cAAc,yBAAyB,0BACrC,cAAc;EACZ,SAAS;EAAa,OAAO,kCAAkC;;KAGzD;EACV,cAAc;EACd;EACA,QAAQ;EACR;EACA;EACA;EACA;;KAGU;KAeA;KAeA;cAOC,4BAA4B;WAC9B,MAAM;WACN,WAAW;WACX;WACA;WACA;WACA,YAAY;WACZ;EAEG,cACV,MACA,SACA,WACA,YACA,qBACA,YACA;IAEA,MAAM;IACN;IACA,WAAW;IACX;IACA;IACA,aAAa;IACb;;;KAcQ;EACV;EACA;EACA;EACA;EACA;EACA;EACA,iBAAiB;EACjB;EACA,eAAe;EACf;EACA;EACA;;KAGU;EACV;EACA;;KAGU;EACV;EACA;EACA;EACA;EACA;EACA;EACA;;KAGU,2BAA2B;EACrC,iBAAiB;EACjB;EACA;EACA,SAAS;EACT,eAAe;EACf,WAAW;;KAGD,8BAA8B;EACxC;EACA;EACA,gBAAgB;EAChB,oBAAoB;EACpB,eAAe;;KAGL;EACV;EACA;EACA;EACA;;KAGU;KAMA;EACV;EACA;EACA,gBAAgB;EAChB;EACA;EACA;EACA;EACA;;KAGU,+BAA+B;EACzC;EACA,oBAAoB;;KAYV;EACV;IACE;IACA;IACA;IACA;IACA;IACA;;EAEF;;KAGU;EACV;EACA;EACA,qBAAqB;EACrB;EACA;EACA;EACA,WAAW;EACX;EACA,WAAW;;KAGD;EACN;EAAmB;;EACnB;EAAmB;;EACnB;;KAEM;EACN;EAAqB;;EACrB;EAAqB;;EACrB;;KAEM,mCACV;EACE,WAAW;;KAGH;EACV,WAAW;;KAGD,iCAAiC;EAC3C,SAAS;;EAGH,OAAO;EACP;;EAGA;EACA,WAAW;;KAIP,8BAA8B,SACxC;EACE,gBAAgB;EAChB,SAAS,SAAS;;KAIV,4BAA4B;EACtC,SAAS;EACT,UAAU;;KAGA;EACV,UAAU;EACV,YAAY;;KAGT;EACH;EACA,eAAe,WAAW;EAC1B,WAAW,OAAO;EAClB;EACA;EACA;;KAGU;EAEN;EACA,aAAa;;EAGb;EACA;;KAGM,iCACV,qCAAqC;KAE3B;EACV,iBACE,OAAO,mCACJ,QAAQ;EACb,mBACE,6BACG,QAAQ;EACb;QACM,QAAQ;KACX,OAAO,+BAA+B,QAAQ;;EAEjD,gBACE,OAAO,kCACJ,QAAQ"}
package/dist/types.js CHANGED
@@ -1,2 +1,2 @@
1
- const e=`0.2.173`;var t=class extends Error{code;operation;reportable;recoveryRecommended;sdkVersion;serverCode;status;constructor({code:t,message:n,operation:r,reportable:i,recoveryRecommended:a=!1,serverCode:o,status:s}){super(n),this.name=`LockerverseSdkError`,this.code=t,this.operation=r,this.reportable=i,this.recoveryRecommended=a,this.sdkVersion=e,this.serverCode=o,this.status=s}};export{t as n,e as t};
1
+ const e=`0.2.174-dev.1`;var t=class extends Error{code;operation;reportable;recoveryRecommended;sdkVersion;serverCode;status;constructor({code:t,message:n,operation:r,reportable:i,recoveryRecommended:a=!1,serverCode:o,status:s}){super(n),this.name=`LockerverseSdkError`,this.code=t,this.operation=r,this.reportable=i,this.recoveryRecommended=a,this.sdkVersion=e,this.serverCode=o,this.status=s}};export{t as n,e as t};
2
2
  //# sourceMappingURL=types.js.map
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":["packageMetadata.version"],"sources":["../package.json","../src/types.ts"],"sourcesContent":["","import packageMetadata from \"../package.json\" with { type: \"json\" };\nimport type { GeneratedPaymentResult } from \"./generated/public-contract-types.ts\";\n\nexport type LockerversePaymentOption =\n | \"one-time\"\n | \"monthly\"\n | \"annually\"\n | \"every-six-months\";\nexport type LockerverseEnvironment = \"development\" | \"production\";\nexport type LockerverseFulfillmentType = \"none\" | \"event_admission\";\n\nexport const LOCKERVERSE_SDK_VERSION = packageMetadata.version;\n\nexport type LockerverseProduct = {\n id: string;\n listingId: string;\n slug: string;\n name: string;\n description: string | null;\n fulfillmentType: LockerverseFulfillmentType;\n pricingMode: \"fixed\" | \"custom\";\n paymentOption: LockerversePaymentOption;\n amountCents: number | null;\n minimumAmountCents: number | null;\n minimumQuantity: number | null;\n /** Per-order limit for this widget listing. Null means no per-order limit. */\n maximumQuantity: number | null;\n inventoryQuantity: number | null;\n acceptsDiscounts: boolean;\n};\n\nexport type LockerverseAvailabilityStatus = \"available\" | \"sold_out\";\n\nexport type LockerverseCatalogAvailability = {\n listings: Array<{\n listingId: string;\n maxPurchasableQuantity: number | null;\n remainingQuantity: number | null;\n status: LockerverseAvailabilityStatus;\n }>;\n sharedLimits: Array<{\n id: string;\n listingIds: string[];\n remainingQuantity: number;\n status: LockerverseAvailabilityStatus;\n }>;\n};\n\nexport type LockerverseCatalog = {\n availability: LockerverseCatalogAvailability;\n community: LockerverseCommunityBranding | null;\n event: LockerverseEvent | null;\n payment: LockerversePaymentConfiguration;\n pricingPolicy: LockerverseCheckoutPricingPolicy;\n products: LockerverseProduct[];\n widget: LockerverseWidgetConfiguration;\n};\n\nexport type LockerverseEvent = {\n description: string | null;\n endAt: string;\n id: string;\n location: string | null;\n name: string;\n startAt: string;\n status: \"draft\" | \"active\" | \"finished\" | \"cancelled\";\n};\n\nexport type LockerverseCommunityBranding = {\n widgetAchEnabled?: boolean | undefined;\n accentColor: string;\n imageUrl: string | null;\n memberIdLabel?: string | null | undefined;\n name: string;\n};\n\nexport type LockerverseCheckoutPricingPolicy = {\n currency: \"usd\";\n serviceFeeRateBasisPoints: number;\n};\n\nexport type LockerversePaymentConfiguration = {\n connectedAccountId: string | null;\n currency: \"usd\";\n publishableKey: string;\n};\n\nexport type LockerverseWidgetFields = {\n memberId: boolean;\n merchSize: boolean;\n phone: boolean;\n promoCode: boolean;\n serviceFee: boolean;\n shipping: boolean;\n tipping: boolean;\n};\n\nexport type LockerverseCustomFieldOption = { id: string; label: string };\n\ntype LockerverseCustomFieldBase = {\n id: string;\n label: string;\n paymentOptionIds?: string[] | undefined;\n required: boolean;\n};\n\nexport type LockerverseTextCustomField = LockerverseCustomFieldBase & {\n type: \"text\" | \"textarea\";\n};\n\nexport type LockerverseBooleanCustomField = LockerverseCustomFieldBase & {\n type: \"checkbox\";\n};\n\nexport type LockerverseSingleOptionCustomField = LockerverseCustomFieldBase & {\n options: LockerverseCustomFieldOption[];\n type: \"radio\" | \"select\";\n};\n\nexport type LockerverseMultiOptionCustomField = LockerverseCustomFieldBase & {\n options: LockerverseCustomFieldOption[];\n type: \"checkboxes\" | \"multi_select\";\n};\n\nexport type LockerverseCustomField =\n | LockerverseBooleanCustomField\n | LockerverseTextCustomField\n | LockerverseSingleOptionCustomField\n | LockerverseMultiOptionCustomField;\n\nexport type LockerverseCustomFieldAnswerValue<\n Field extends LockerverseCustomField,\n> = Field extends LockerverseBooleanCustomField\n ? boolean\n : Field extends LockerverseMultiOptionCustomField\n ? string[]\n : string;\n\nexport type LockerverseCustomFieldAnswer<\n Field extends LockerverseCustomField = LockerverseCustomField,\n> = Field extends LockerverseCustomField\n ? { fieldId: Field[\"id\"]; value: LockerverseCustomFieldAnswerValue<Field> }\n : never;\n\nexport type LockerverseWidgetConfiguration = {\n customFields: LockerverseCustomField[];\n description: string | null;\n fields: LockerverseWidgetFields;\n id: string;\n name: string;\n showCommunityBranding: boolean;\n title: string | null;\n};\n\nexport type LockerverseSdkErrorCode =\n | \"public_events_load_failed\"\n | \"auction_load_failed\"\n | \"auction_bid_failed\"\n | \"auction_purchase_failed\"\n | \"auction_purchase_status_failed\"\n | \"auction_receipt_failed\"\n | \"widget_load_failed\"\n | \"signup_load_failed\"\n | \"signup_submit_failed\"\n | \"total_calculation_failed\"\n | \"payment_submit_failed\"\n | \"payment_status_failed\"\n | \"invalid_selection\";\n\nexport type LockerverseSdkOperation =\n | \"list_public_events\"\n | \"list_auctions\"\n | \"load_auction\"\n | \"create_auction_bid\"\n | \"create_auction_purchase\"\n | \"get_auction_purchase_receipt\"\n | \"get_auction_purchase_status\"\n | \"load_widget\"\n | \"load_signup\"\n | \"submit_signup\"\n | \"calculate_total\"\n | \"submit_payment\"\n | \"get_payment_status\";\n\nexport type LockerverseSdkServerCode =\n | \"PAYMENT_WIDGET_SALES_LIMIT_REACHED\"\n | \"PAYMENT_WIDGET_PHONE_INVALID\"\n | \"PAYMENT_WIDGET_PHONE_REQUIRED\"\n | \"SIGN_UP_WIDGET_PHONE_INVALID\"\n | \"SIGN_UP_WIDGET_PHONE_REQUIRED\";\n\nexport class LockerverseSdkError extends Error {\n readonly code: LockerverseSdkErrorCode;\n readonly operation: LockerverseSdkOperation;\n readonly reportable: boolean;\n readonly recoveryRecommended: boolean;\n readonly sdkVersion: string;\n readonly serverCode: LockerverseSdkServerCode | undefined;\n readonly status: number | undefined;\n\n constructor({\n code,\n message,\n operation,\n reportable,\n recoveryRecommended = false,\n serverCode,\n status,\n }: {\n code: LockerverseSdkErrorCode;\n message: string;\n operation: LockerverseSdkOperation;\n reportable: boolean;\n recoveryRecommended?: boolean;\n serverCode?: LockerverseSdkServerCode;\n status?: number;\n }) {\n super(message);\n this.name = \"LockerverseSdkError\";\n this.code = code;\n this.operation = operation;\n this.reportable = reportable;\n this.recoveryRecommended = recoveryRecommended;\n this.sdkVersion = LOCKERVERSE_SDK_VERSION;\n this.serverCode = serverCode;\n this.status = status;\n }\n}\n\nexport type LockerverseCheckoutLineItem = {\n productId: string;\n productName: string;\n listingId: string;\n listingSlug: string;\n acceptsDiscounts: boolean;\n eventId: string | null;\n fulfillmentType: LockerverseFulfillmentType;\n pricingMode: \"fixed\" | \"custom\";\n paymentOption: LockerversePaymentOption;\n quantity: number;\n unitAmountCents: number;\n subtotalCents: number;\n};\n\nexport type LockerverseAppliedDiscount = {\n percentageOff: number;\n source: \"email_list\" | \"promo_code\";\n};\n\nexport type LockerverseCheckoutAmounts = {\n amountCents: number;\n discountableSubtotalCents: number;\n discountCents: number;\n serviceFeeCents: number;\n subtotalCents: number;\n tipCents: number;\n totalCents: number;\n};\n\nexport type LockerverseCheckoutQuote = LockerverseCheckoutAmounts & {\n appliedDiscount: LockerverseAppliedDiscount | null;\n authoritative: true;\n paymentReference: string;\n payment: LockerversePaymentConfiguration;\n paymentOption: LockerversePaymentOption;\n lineItems: LockerverseCheckoutLineItem[];\n};\n\nexport type LockerverseCheckoutEstimate = LockerverseCheckoutAmounts & {\n appliedDiscount: null;\n authoritative: false;\n items: readonly LockerverseCheckoutItem[];\n lineItems: readonly LockerverseCheckoutLineItem[];\n paymentOption: LockerversePaymentOption;\n};\n\nexport type LockerverseCheckoutPricingInput = {\n email?: string;\n includeServiceFee?: boolean;\n promoCode?: string;\n tipCents?: number;\n};\n\nexport type LockerversePaymentStatus =\n | \"action_required\"\n | \"failed\"\n | \"pending\"\n | \"success\";\n\nexport type LockerversePaymentResult = {\n checkoutId: string;\n paymentReference: string;\n checkoutStatus: LockerversePaymentStatus;\n retryUrl?: string | undefined;\n clientSecret: string | null;\n paymentRequired: boolean;\n requiresAction: boolean;\n status: string | null;\n};\n\nexport type LockerversePaymentCompletion = LockerversePaymentResult & {\n email: string | null;\n lineItems: readonly LockerverseCheckoutLineItem[] | null;\n};\n\ntype AssertPaymentContract<T extends true> = T;\ntype _PaymentResultMatchesGenerated = AssertPaymentContract<\n LockerversePaymentResult extends GeneratedPaymentResult\n ? GeneratedPaymentResult extends LockerversePaymentResult\n ? true\n : false\n : false\n>;\n\nexport type LockerverseShipping = {\n address: {\n city: string;\n country: string;\n line1: string;\n line2?: string;\n postal_code: string;\n state: string;\n };\n name: string;\n};\n\nexport type LockerversePaymentSubmission = {\n confirmationToken?: string;\n customFieldAnswers?: LockerverseCustomFieldAnswer[];\n email: string;\n memberId?: string;\n merchSize?: \"XS\" | \"S\" | \"M\" | \"L\" | \"XL\" | \"XXL\" | \"XXXL\";\n metadata?: Record<string, string>;\n phone?: string;\n shipping?: LockerverseShipping;\n};\n\nexport type LockerverseCheckoutItem =\n | { productId: string; quantity: number }\n | { productId: string; amountCents: number }\n | { productId: string };\n\nexport type LockerverseCheckoutSelectionItem =\n | { productSlug: string; quantity: number }\n | { productSlug: string; amountCents: number }\n | { productSlug: string };\n\nexport type LockerverseEstimateCheckoutInput =\n LockerverseCheckoutPricingInput & {\n selection: LockerverseCheckoutSelectionItem[];\n };\n\nexport type LockerverseLoadCheckoutInput = {\n selection: LockerverseCheckoutSelectionItem[];\n};\n\nexport type LockerverseCalculateTotalInput = LockerverseCheckoutPricingInput & {\n catalog: LockerverseCatalog;\n} & (\n | {\n items: LockerverseCheckoutItem[];\n selection?: never;\n }\n | {\n items?: never;\n selection: LockerverseCheckoutSelectionItem[];\n }\n );\n\nexport type LockerversePreparedCheckout = Readonly<\n LockerverseCheckoutQuote & {\n items: readonly LockerverseCheckoutItem[];\n pricing: Readonly<LockerverseCheckoutPricingInput>;\n }\n>;\n\nexport type LockerverseLoadedCheckout = Readonly<{\n catalog: LockerverseCatalog;\n checkout: LockerversePreparedCheckout;\n}>;\n\nexport type LockerverseSubmitPaymentInput = {\n checkout: LockerversePreparedCheckout;\n submission: LockerversePaymentSubmission;\n};\n\ntype CreateLockerverseWidgetBaseOptions = {\n communitySlug: string;\n fetch?: typeof globalThis.fetch;\n onError?: (error: LockerverseSdkError) => void;\n requestTimeoutMs?: number;\n sentryDsn?: string | null;\n widgetSlug: string;\n};\n\nexport type LockerverseResourceEnvironmentOptions =\n | {\n apiBaseUrl: string;\n environment: LockerverseEnvironment;\n }\n | {\n apiBaseUrl?: undefined;\n environment?: \"production\";\n };\n\nexport type CreateLockerverseWidgetOptions =\n CreateLockerverseWidgetBaseOptions & LockerverseResourceEnvironmentOptions;\n\nexport type LockerverseCheckoutClient = {\n calculateTotal: (\n input: LockerverseCalculateTotalInput\n ) => Promise<LockerversePreparedCheckout>;\n getPaymentStatus: (\n paymentReference: string\n ) => Promise<LockerversePaymentResult>;\n load: {\n (): Promise<LockerverseCatalog>;\n (input: LockerverseLoadCheckoutInput): Promise<LockerverseLoadedCheckout>;\n };\n submitPayment: (\n input: LockerverseSubmitPaymentInput\n ) => Promise<LockerversePaymentResult>;\n};\n"],"mappings":"ACWA,MAAa,EAA0BA,UAoLvC,IAAa,EAAb,cAAyC,KAAM,CAC7C,KACA,UACA,WACA,oBACA,WACA,WACA,OAEA,YAAY,CACV,OACA,UACA,YACA,aACA,sBAAsB,GACtB,aACA,UASC,CACD,MAAM,CAAO,EACb,KAAK,KAAO,sBACZ,KAAK,KAAO,EACZ,KAAK,UAAY,EACjB,KAAK,WAAa,EAClB,KAAK,oBAAsB,EAC3B,KAAK,WAAa,EAClB,KAAK,WAAa,EAClB,KAAK,OAAS,CAChB,CACF"}
1
+ {"version":3,"file":"types.js","names":["packageMetadata.version"],"sources":["../package.json","../src/types.ts"],"sourcesContent":["","import packageMetadata from \"../package.json\" with { type: \"json\" };\nimport type { GeneratedPaymentResult } from \"./generated/public-contract-types.ts\";\n\nexport type LockerversePaymentOption =\n | \"one-time\"\n | \"monthly\"\n | \"annually\"\n | \"every-six-months\";\nexport type LockerverseEnvironment = \"development\" | \"production\";\nexport type LockerverseFulfillmentType = \"none\" | \"event_admission\";\n\nexport const LOCKERVERSE_SDK_VERSION = packageMetadata.version;\n\nexport type LockerverseProduct = {\n id: string;\n listingId: string;\n slug: string;\n name: string;\n description: string | null;\n fulfillmentType: LockerverseFulfillmentType;\n pricingMode: \"fixed\" | \"custom\";\n paymentOption: LockerversePaymentOption;\n amountCents: number | null;\n minimumAmountCents: number | null;\n minimumQuantity: number | null;\n /** Per-order limit for this widget listing. Null means no per-order limit. */\n maximumQuantity: number | null;\n inventoryQuantity: number | null;\n acceptsDiscounts: boolean;\n};\n\nexport type LockerverseAvailabilityStatus = \"available\" | \"sold_out\";\n\nexport type LockerverseCatalogAvailability = {\n listings: Array<{\n listingId: string;\n maxPurchasableQuantity: number | null;\n remainingQuantity: number | null;\n status: LockerverseAvailabilityStatus;\n }>;\n sharedLimits: Array<{\n id: string;\n listingIds: string[];\n remainingQuantity: number;\n status: LockerverseAvailabilityStatus;\n }>;\n};\n\nexport type LockerverseCatalog = {\n availability: LockerverseCatalogAvailability;\n community: LockerverseCommunityBranding | null;\n event: LockerverseEvent | null;\n payment: LockerversePaymentConfiguration;\n pricingPolicy: LockerverseCheckoutPricingPolicy;\n products: LockerverseProduct[];\n widget: LockerverseWidgetConfiguration;\n};\n\nexport type LockerverseEvent = {\n description: string | null;\n endAt: string;\n id: string;\n location: string | null;\n name: string;\n startAt: string;\n status: \"draft\" | \"active\" | \"finished\" | \"cancelled\";\n};\n\nexport type LockerverseCommunityBranding = {\n widgetAchEnabled?: boolean | undefined;\n accentColor: string;\n imageUrl: string | null;\n memberIdLabel?: string | null | undefined;\n name: string;\n};\n\nexport type LockerverseCheckoutPricingPolicy = {\n currency: \"usd\";\n serviceFeeRateBasisPoints: number;\n};\n\nexport type LockerversePaymentConfiguration = {\n connectedAccountId: string | null;\n currency: \"usd\";\n publishableKey: string;\n};\n\nexport type LockerverseWidgetFields = {\n memberId: boolean;\n merchSize: boolean;\n phone: boolean;\n promoCode: boolean;\n serviceFee: boolean;\n shipping: boolean;\n tipping: boolean;\n};\n\nexport type LockerverseCustomFieldOption = { id: string; label: string };\n\ntype LockerverseCustomFieldBase = {\n id: string;\n label: string;\n paymentOptionIds?: string[] | undefined;\n required: boolean;\n};\n\nexport type LockerverseTextCustomField = LockerverseCustomFieldBase & {\n type: \"text\" | \"textarea\";\n};\n\nexport type LockerverseBooleanCustomField = LockerverseCustomFieldBase & {\n type: \"checkbox\";\n};\n\nexport type LockerverseSingleOptionCustomField = LockerverseCustomFieldBase & {\n options: LockerverseCustomFieldOption[];\n type: \"radio\" | \"select\";\n};\n\nexport type LockerverseMultiOptionCustomField = LockerverseCustomFieldBase & {\n options: LockerverseCustomFieldOption[];\n type: \"checkboxes\" | \"multi_select\";\n};\n\nexport type LockerverseCustomField =\n | LockerverseBooleanCustomField\n | LockerverseTextCustomField\n | LockerverseSingleOptionCustomField\n | LockerverseMultiOptionCustomField;\n\nexport type LockerverseCustomFieldAnswerValue<\n Field extends LockerverseCustomField,\n> = Field extends LockerverseBooleanCustomField\n ? boolean\n : Field extends LockerverseMultiOptionCustomField\n ? string[]\n : string;\n\nexport type LockerverseCustomFieldAnswer<\n Field extends LockerverseCustomField = LockerverseCustomField,\n> = Field extends LockerverseCustomField\n ? { fieldId: Field[\"id\"]; value: LockerverseCustomFieldAnswerValue<Field> }\n : never;\n\nexport type LockerverseWidgetConfiguration = {\n customFields: LockerverseCustomField[];\n description: string | null;\n fields: LockerverseWidgetFields;\n id: string;\n name: string;\n showCommunityBranding: boolean;\n title: string | null;\n};\n\nexport type LockerverseSdkErrorCode =\n | \"public_events_load_failed\"\n | \"auction_load_failed\"\n | \"auction_bid_failed\"\n | \"auction_purchase_failed\"\n | \"auction_purchase_status_failed\"\n | \"auction_receipt_failed\"\n | \"widget_load_failed\"\n | \"signup_load_failed\"\n | \"signup_submit_failed\"\n | \"total_calculation_failed\"\n | \"payment_submit_failed\"\n | \"payment_status_failed\"\n | \"invalid_selection\";\n\nexport type LockerverseSdkOperation =\n | \"list_public_events\"\n | \"list_auctions\"\n | \"load_auction\"\n | \"create_auction_bid\"\n | \"create_auction_purchase\"\n | \"get_auction_purchase_receipt\"\n | \"get_auction_purchase_status\"\n | \"load_widget\"\n | \"load_signup\"\n | \"submit_signup\"\n | \"calculate_total\"\n | \"submit_payment\"\n | \"get_payment_status\";\n\nexport type LockerverseSdkServerCode =\n | \"PAYMENT_WIDGET_SALES_LIMIT_REACHED\"\n | \"PAYMENT_WIDGET_PHONE_INVALID\"\n | \"PAYMENT_WIDGET_PHONE_REQUIRED\"\n | \"SIGN_UP_WIDGET_PHONE_INVALID\"\n | \"SIGN_UP_WIDGET_PHONE_REQUIRED\";\n\nexport class LockerverseSdkError extends Error {\n readonly code: LockerverseSdkErrorCode;\n readonly operation: LockerverseSdkOperation;\n readonly reportable: boolean;\n readonly recoveryRecommended: boolean;\n readonly sdkVersion: string;\n readonly serverCode: LockerverseSdkServerCode | undefined;\n readonly status: number | undefined;\n\n constructor({\n code,\n message,\n operation,\n reportable,\n recoveryRecommended = false,\n serverCode,\n status,\n }: {\n code: LockerverseSdkErrorCode;\n message: string;\n operation: LockerverseSdkOperation;\n reportable: boolean;\n recoveryRecommended?: boolean;\n serverCode?: LockerverseSdkServerCode;\n status?: number;\n }) {\n super(message);\n this.name = \"LockerverseSdkError\";\n this.code = code;\n this.operation = operation;\n this.reportable = reportable;\n this.recoveryRecommended = recoveryRecommended;\n this.sdkVersion = LOCKERVERSE_SDK_VERSION;\n this.serverCode = serverCode;\n this.status = status;\n }\n}\n\nexport type LockerverseCheckoutLineItem = {\n productId: string;\n productName: string;\n listingId: string;\n listingSlug: string;\n acceptsDiscounts: boolean;\n eventId: string | null;\n fulfillmentType: LockerverseFulfillmentType;\n pricingMode: \"fixed\" | \"custom\";\n paymentOption: LockerversePaymentOption;\n quantity: number;\n unitAmountCents: number;\n subtotalCents: number;\n};\n\nexport type LockerverseAppliedDiscount = {\n percentageOff: number;\n source: \"email_list\" | \"promo_code\";\n};\n\nexport type LockerverseCheckoutAmounts = {\n amountCents: number;\n discountableSubtotalCents: number;\n discountCents: number;\n serviceFeeCents: number;\n subtotalCents: number;\n tipCents: number;\n totalCents: number;\n};\n\nexport type LockerverseCheckoutQuote = LockerverseCheckoutAmounts & {\n appliedDiscount: LockerverseAppliedDiscount | null;\n authoritative: true;\n paymentReference: string;\n payment: LockerversePaymentConfiguration;\n paymentOption: LockerversePaymentOption;\n lineItems: LockerverseCheckoutLineItem[];\n};\n\nexport type LockerverseCheckoutEstimate = LockerverseCheckoutAmounts & {\n appliedDiscount: null;\n authoritative: false;\n items: readonly LockerverseCheckoutItem[];\n lineItems: readonly LockerverseCheckoutLineItem[];\n paymentOption: LockerversePaymentOption;\n};\n\nexport type LockerverseCheckoutPricingInput = {\n email?: string;\n includeServiceFee?: boolean;\n promoCode?: string;\n tipCents?: number;\n};\n\nexport type LockerversePaymentStatus =\n | \"action_required\"\n | \"failed\"\n | \"pending\"\n | \"success\";\n\nexport type LockerversePaymentResult = {\n checkoutId: string;\n paymentReference: string;\n checkoutStatus: LockerversePaymentStatus;\n retryUrl?: string | undefined;\n clientSecret: string | null;\n paymentRequired: boolean;\n requiresAction: boolean;\n status: string | null;\n};\n\nexport type LockerversePaymentCompletion = LockerversePaymentResult & {\n email: string | null;\n lineItems: readonly LockerverseCheckoutLineItem[] | null;\n};\n\ntype AssertPaymentContract<T extends true> = T;\ntype _PaymentResultMatchesGenerated = AssertPaymentContract<\n LockerversePaymentResult extends GeneratedPaymentResult\n ? GeneratedPaymentResult extends LockerversePaymentResult\n ? true\n : false\n : false\n>;\n\nexport type LockerverseShipping = {\n address: {\n city: string;\n country: string;\n line1: string;\n line2?: string;\n postal_code: string;\n state: string;\n };\n name: string;\n};\n\nexport type LockerversePaymentSubmission = {\n confirmationToken?: string;\n paymentMethodConfiguration?: \"explicit\";\n customFieldAnswers?: LockerverseCustomFieldAnswer[];\n email: string;\n memberId?: string;\n merchSize?: \"XS\" | \"S\" | \"M\" | \"L\" | \"XL\" | \"XXL\" | \"XXXL\";\n metadata?: Record<string, string>;\n phone?: string;\n shipping?: LockerverseShipping;\n};\n\nexport type LockerverseCheckoutItem =\n | { productId: string; quantity: number }\n | { productId: string; amountCents: number }\n | { productId: string };\n\nexport type LockerverseCheckoutSelectionItem =\n | { productSlug: string; quantity: number }\n | { productSlug: string; amountCents: number }\n | { productSlug: string };\n\nexport type LockerverseEstimateCheckoutInput =\n LockerverseCheckoutPricingInput & {\n selection: LockerverseCheckoutSelectionItem[];\n };\n\nexport type LockerverseLoadCheckoutInput = {\n selection: LockerverseCheckoutSelectionItem[];\n};\n\nexport type LockerverseCalculateTotalInput = LockerverseCheckoutPricingInput & {\n catalog: LockerverseCatalog;\n} & (\n | {\n items: LockerverseCheckoutItem[];\n selection?: never;\n }\n | {\n items?: never;\n selection: LockerverseCheckoutSelectionItem[];\n }\n );\n\nexport type LockerversePreparedCheckout = Readonly<\n LockerverseCheckoutQuote & {\n items: readonly LockerverseCheckoutItem[];\n pricing: Readonly<LockerverseCheckoutPricingInput>;\n }\n>;\n\nexport type LockerverseLoadedCheckout = Readonly<{\n catalog: LockerverseCatalog;\n checkout: LockerversePreparedCheckout;\n}>;\n\nexport type LockerverseSubmitPaymentInput = {\n checkout: LockerversePreparedCheckout;\n submission: LockerversePaymentSubmission;\n};\n\ntype CreateLockerverseWidgetBaseOptions = {\n communitySlug: string;\n fetch?: typeof globalThis.fetch;\n onError?: (error: LockerverseSdkError) => void;\n requestTimeoutMs?: number;\n sentryDsn?: string | null;\n widgetSlug: string;\n};\n\nexport type LockerverseResourceEnvironmentOptions =\n | {\n apiBaseUrl: string;\n environment: LockerverseEnvironment;\n }\n | {\n apiBaseUrl?: undefined;\n environment?: \"production\";\n };\n\nexport type CreateLockerverseWidgetOptions =\n CreateLockerverseWidgetBaseOptions & LockerverseResourceEnvironmentOptions;\n\nexport type LockerverseCheckoutClient = {\n calculateTotal: (\n input: LockerverseCalculateTotalInput\n ) => Promise<LockerversePreparedCheckout>;\n getPaymentStatus: (\n paymentReference: string\n ) => Promise<LockerversePaymentResult>;\n load: {\n (): Promise<LockerverseCatalog>;\n (input: LockerverseLoadCheckoutInput): Promise<LockerverseLoadedCheckout>;\n };\n submitPayment: (\n input: LockerverseSubmitPaymentInput\n ) => Promise<LockerversePaymentResult>;\n};\n"],"mappings":"ACWA,MAAa,EAA0BA,gBAoLvC,IAAa,EAAb,cAAyC,KAAM,CAC7C,KACA,UACA,WACA,oBACA,WACA,WACA,OAEA,YAAY,CACV,OACA,UACA,YACA,aACA,sBAAsB,GACtB,aACA,UASC,CACD,MAAM,CAAO,EACb,KAAK,KAAO,sBACZ,KAAK,KAAO,EACZ,KAAK,UAAY,EACjB,KAAK,WAAa,EAClB,KAAK,oBAAsB,EAC3B,KAAK,WAAa,EAClB,KAAK,WAAa,EAClB,KAAK,OAAS,CAChB,CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lockerverse/sdk",
3
- "version": "0.2.173",
3
+ "version": "0.2.174-dev.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/Lockerverse/lockerverse-sdk.git",