@lockerverse/sdk 0.2.99 → 0.2.100

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/README.md CHANGED
@@ -229,6 +229,80 @@ Create a submission reference before a request. If an error has
229
229
  `recoveryRecommended: true`, reuse that reference with the same values so
230
230
  Lockerverse can return the original submission.
231
231
 
232
+ ## Auctions
233
+
234
+ Use the auction client without React or Stripe UI dependencies:
235
+
236
+ ```ts
237
+ import { createLockerverseAuctionClient } from "@lockerverse/sdk/auctions";
238
+
239
+ const auctions = createLockerverseAuctionClient({ communitySlug: "auburn" });
240
+ const catalog = await auctions.list();
241
+ const auction = await auctions.load("community-auction");
242
+ const item = auction.items[0];
243
+ ```
244
+
245
+ The default environment is production. Set `environment: "development"`
246
+ explicitly for a development integration. `load` returns the auction, enabled
247
+ items, bid amounts, inventory, fees, and payment configuration. The payment
248
+ configuration supplies the Stripe publishable key and connected account; no
249
+ secret key belongs in a browser. Older backends can omit this configuration;
250
+ update the backend before using the built-in auction checkout.
251
+
252
+ The following functions show the raw mutation API. They do not run until your
253
+ application calls them after the customer confirms their choice:
254
+
255
+ ```ts
256
+ import type {
257
+ LockerverseAuctionBidSubmission,
258
+ LockerverseAuctionPurchaseSubmission,
259
+ } from "@lockerverse/sdk/auctions";
260
+
261
+ function submitBid(itemId: string, submission: LockerverseAuctionBidSubmission) {
262
+ return auctions.createBid(auction.path, itemId, submission);
263
+ }
264
+
265
+ function submitPurchase(itemId: string, submission: LockerverseAuctionPurchaseSubmission) {
266
+ return auctions.createPurchase(auction.path, itemId, submission);
267
+ }
268
+ ```
269
+
270
+ Create a Stripe confirmation token with the payment configuration from the
271
+ auction. Bids use card setup for later off-session settlement. Buy-now uses
272
+ immediate payment. Both submissions include the token, email, and E.164 phone.
273
+ Amounts are integer USD cents. Send the expected subtotal, service fee, and total
274
+ that the customer accepted. Handle `requiresAction` with Stripe
275
+ `handleNextAction` and the returned `clientSecret`.
276
+
277
+ - Never automatically retry a bid. The backend does not deduplicate bids and
278
+ has no public bid-status recovery endpoint. An unknown result needs support
279
+ follow-up; a submitted bid is not a winning bid or a payment receipt.
280
+ - Create one `clientRequestId` before a buy-now request. Keep that ID and the
281
+ same purchase details for recovery. Call
282
+ `getPurchaseStatus(auctionSlug, itemId, clientRequestId)` to check the existing
283
+ purchase without creating another payment. It returns a purchase result or
284
+ `null` and can reconcile Stripe status and deliver the purchase notification.
285
+ `null` means no purchase was found at that moment; it does not prove an
286
+ original in-flight request has ended. If you retry a submission, use the same
287
+ original request ID and details. Use `status === "paid"` to establish payment
288
+ completion; a pending result is not completion.
289
+ - `getPurchaseReceipt(auctionSlug, itemSlug, purchaseId)` takes the item **slug**,
290
+ while mutations take its **ID**. The receipt contains amounts and quantity,
291
+ not payment status. It is not proof of successful payment.
292
+
293
+ For card-only buy-now Elements configured with `paymentMethodTypes: ["card"]`,
294
+ pass the same `paymentMethodTypes: ["card"]` in `createPurchase`. Omit this field
295
+ when collecting payment details with automatic payment methods. Stripe requires
296
+ the client and server payment-method configuration to match. Include a
297
+ `return_url` when creating the confirmation token.
298
+
299
+ The built-in React auction checkout accepts cards only. The core client accepts
300
+ the confirmation tokens supported by the backend; a custom UI must obey its
301
+ payment-method rules.
302
+
303
+ For ready-made browsing and checkout, use `@lockerverse/react/auctions` and
304
+ `@lockerverse/react/auction-item`.
305
+
232
306
  ## Security and observability
233
307
 
234
308
  - No Stripe or Lockerverse secret is accepted by the public API.
@@ -244,7 +318,7 @@ Lockerverse can return the original submission.
244
318
  mutate the host application's Sentry client.
245
319
  - Stripe's shared publishable key is selected by environment. The authoritative
246
320
  quote supplies the community's connected account.
247
- - Analytics and auctions are intentionally out of scope.
321
+ - Analytics is intentionally out of scope.
248
322
 
249
323
  ## Commands
250
324
 
@@ -0,0 +1,132 @@
1
+ import { B as LockerverseSdkErrorCode, C as LockerverseEnvironment, H as LockerverseSdkServerCode, R as LockerverseResourceEnvironmentOptions, V as LockerverseSdkOperation, j as LockerversePaymentConfiguration, z as LockerverseSdkError } from "./types.js";
2
+ //#region src/auction-types.d.ts
3
+ type LockerverseAuctionStatus = "draft" | "active" | "finished";
4
+ type LockerverseAuctionSaleMode = "auction" | "buy_now" | "hybrid";
5
+ type LockerverseAuctionPurchaseStatus = "pending_payment" | "paid" | "payment_failed" | "expired" | "canceled" | "refunded";
6
+ type LockerverseAuctionItem = {
7
+ id: string;
8
+ name: string;
9
+ description: string | null;
10
+ path: string;
11
+ slug: string;
12
+ communityId: string;
13
+ auctionId: string;
14
+ position: number;
15
+ image: string | null;
16
+ images: string[];
17
+ minBidAmount: number | null;
18
+ bidIncrementAmount: number | null;
19
+ saleMode: LockerverseAuctionSaleMode;
20
+ buyNowPriceAmount: number | null;
21
+ inventoryQuantity: number | null;
22
+ availableQuantity: number | null;
23
+ paidQuantity: number;
24
+ reservedQuantity: number;
25
+ isSoldOut: boolean;
26
+ collectShippingAddress: boolean;
27
+ maxBidAmount: number | null;
28
+ bidCount: number;
29
+ finalizedBidCount: number;
30
+ status: LockerverseAuctionStatus;
31
+ createdAt: string;
32
+ updatedAt: string;
33
+ };
34
+ type LockerverseAuction = {
35
+ id: string;
36
+ name: string;
37
+ description: string | null;
38
+ path: string;
39
+ slug: string;
40
+ communityId: string;
41
+ position: number;
42
+ configuration: {
43
+ image: string | null;
44
+ collectShippingAddress: boolean;
45
+ serviceFeeEnabled: boolean;
46
+ serviceFeeDefaultChecked: boolean;
47
+ };
48
+ collectShippingAddress: boolean;
49
+ serviceFeeEnabled: boolean;
50
+ serviceFeeDefaultChecked: boolean;
51
+ pricingPolicy: {
52
+ currency: "usd";
53
+ serviceFeeRateBasisPoints: number;
54
+ };
55
+ payment?: LockerversePaymentConfiguration | undefined;
56
+ createdAt: string;
57
+ startAt: string;
58
+ endAt: string;
59
+ updatedAt: string;
60
+ status: LockerverseAuctionStatus;
61
+ items: LockerverseAuctionItem[];
62
+ };
63
+ type LockerverseAuctionPricing = {
64
+ subtotalCents: number;
65
+ serviceFeeCents: number;
66
+ serviceFeeRateBasisPoints: number;
67
+ totalCents: number;
68
+ };
69
+ type LockerverseAuctionBidSubmission = {
70
+ /** Integer USD cents. */
71
+ amount: number;
72
+ email: string;
73
+ phone: string;
74
+ confirmationToken: string;
75
+ includeServiceFee?: boolean;
76
+ expectedSubtotalCents?: number;
77
+ expectedServiceFeeCents?: number;
78
+ expectedTotalCents?: number;
79
+ };
80
+ type LockerverseAuctionPurchaseSubmission = Omit<LockerverseAuctionBidSubmission, "amount"> & {
81
+ /** Match card-only Stripe Elements; omit for automatic payment methods. */
82
+ paymentMethodTypes?: readonly ["card"];
83
+ quantity: number;
84
+ /** Keep the same ID and purchase details when recovering an uncertain request. */
85
+ clientRequestId: string;
86
+ };
87
+ type LockerverseAuctionBidResult = LockerverseAuctionPricing & {
88
+ clientSecret: string | null;
89
+ requiresAction: boolean;
90
+ };
91
+ type LockerverseAuctionPurchaseResult = LockerverseAuctionBidResult & {
92
+ id: string;
93
+ purchaseId: string;
94
+ status: LockerverseAuctionPurchaseStatus;
95
+ quantity: number;
96
+ totalAmount: number;
97
+ };
98
+ /** Receipt amounts are not proof of successful payment. */
99
+ type LockerverseAuctionPurchaseReceipt = LockerverseAuctionPricing & {
100
+ quantity: number;
101
+ unitAmount: number;
102
+ totalAmount: number;
103
+ };
104
+ type CreateLockerverseAuctionOptions = LockerverseResourceEnvironmentOptions & {
105
+ communitySlug: string;
106
+ fetch?: typeof globalThis.fetch;
107
+ onError?: (error: LockerverseSdkError) => void;
108
+ requestTimeoutMs?: number;
109
+ sentryDsn?: string | null;
110
+ };
111
+ type LockerverseAuctionClient = {
112
+ list: () => Promise<LockerverseAuction[]>;
113
+ load: (auctionSlug: string) => Promise<LockerverseAuction>;
114
+ /** Never retry a bid automatically: the server does not deduplicate bids. */
115
+ createBid: (auctionSlug: string, itemId: string, submission: LockerverseAuctionBidSubmission) => Promise<LockerverseAuctionBidResult>;
116
+ createPurchase: (auctionSlug: string, itemId: string, submission: LockerverseAuctionPurchaseSubmission) => Promise<LockerverseAuctionPurchaseResult>;
117
+ /** Read the existing purchase without creating or retrying a payment. */
118
+ getPurchaseStatus: (auctionSlug: string, itemId: string, clientRequestId: string) => Promise<LockerverseAuctionPurchaseResult | null>;
119
+ getPurchaseReceipt: (auctionSlug: string, itemSlug: string, purchaseId: string) => Promise<LockerverseAuctionPurchaseReceipt>;
120
+ };
121
+ //#endregion
122
+ //#region src/auction-client.d.ts
123
+ declare function createLockerverseAuctionClient(options: CreateLockerverseAuctionOptions): LockerverseAuctionClient;
124
+ //#endregion
125
+ //#region src/auction-pricing.d.ts
126
+ /** Local estimate. Send expected amounts with the submission for server validation. */
127
+ declare function calculateLockerverseAuctionPricing(auction: Pick<LockerverseAuction, "serviceFeeEnabled" | "pricingPolicy">, subtotalCents: number, includeServiceFee?: boolean): LockerverseAuctionPricing;
128
+ /** Snapshot estimate. Another accepted bid can increase the server minimum. */
129
+ declare function getLockerverseAuctionMinimumBid(item: Pick<LockerverseAuctionItem, "minBidAmount" | "bidIncrementAmount" | "maxBidAmount">): number;
130
+ //#endregion
131
+ export { type CreateLockerverseAuctionOptions, type LockerverseAuction, type LockerverseAuctionBidResult, type LockerverseAuctionBidSubmission, type LockerverseAuctionClient, type LockerverseAuctionItem, type LockerverseAuctionPricing, type LockerverseAuctionPurchaseReceipt, type LockerverseAuctionPurchaseResult, type LockerverseAuctionPurchaseStatus, type LockerverseAuctionPurchaseSubmission, type LockerverseAuctionSaleMode, type LockerverseAuctionStatus, type LockerverseEnvironment, LockerverseSdkError, type LockerverseSdkErrorCode, type LockerverseSdkOperation, type LockerverseSdkServerCode, calculateLockerverseAuctionPricing, createLockerverseAuctionClient, getLockerverseAuctionMinimumBid };
132
+ //# sourceMappingURL=auctions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auctions.d.ts","names":[],"sources":["../src/auction-types.ts","../src/auction-client.ts","../src/auction-pricing.ts"],"mappings":";;KAMY;KACA;KACA;KAOA;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,UAAU;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,QAAQ;EACR;EACA;;KAEU;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;IACE;IACA;IACA;IACA;;EAEF;EACA;EACA;EACA;IAAiB;IAAiB;;EAClC,UAAU;EACV;EACA;EACA;EACA;EACA,QAAQ;EACR,OAAO;;KAEG;EACV;EACA;EACA;EACA;;KAEU;;EAEV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;KAEU,uCAAuC,KACjD;;EAIA;EACA;;EAEA;;KAEU,8BAA8B;EACxC;EACA;;KAEU,mCAAmC;EAC7C;EACA;EACA,QAAQ;EACR;EACA;;;KAGU,oCAAoC;EAC9C;EACA;EACA;;KAEU,kCACV;EACE;EACA,eAAe,WAAW;EAC1B,WAAW,OAAO;EAClB;EACA;;KAEQ;EACV,YAAY,QAAQ;EACpB,OAAO,wBAAwB,QAAQ;;EAEvC,YACE,qBACA,gBACA,YAAY,oCACT,QAAQ;EACb,iBACE,qBACA,gBACA,YAAY,yCACT,QAAQ;;EAEb,oBACE,qBACA,gBACA,4BACG,QAAQ;EACb,qBACE,qBACA,kBACA,uBACG,QAAQ;;;;iBCjHC,+BACd,SAAS,kCACR;;;;iBCpBa,mCACd,SAAS,KAAK,4DACd,uBACA,8BACC;;iBAwBa,gCACd,MAAM,KACJ"}
@@ -0,0 +1,2 @@
1
+ import{a as e,n as t,r as n,t as r}from"./transport.js";import{n as i}from"./types.js";import{array as a,boolean as o,check as s,email as c,isoTimestamp as l,literal as u,minLength as d,minValue as f,nullable as p,number as m,object as h,optional as g,parse as _,picklist as v,pipe as y,regex as b,safeInteger as x,strictTuple as S,string as C}from"valibot";const w=y(C(),d(1)),T=y(m(),x(),f(0)),E=y(C(),l()),D=v([`draft`,`active`,`finished`]),O=h({auctionId:w,availableQuantity:p(T),bidCount:T,bidIncrementAmount:p(T),buyNowPriceAmount:p(T),collectShippingAddress:o(),communityId:w,createdAt:E,description:p(C()),finalizedBidCount:T,id:w,image:p(C()),images:a(C()),inventoryQuantity:p(T),isSoldOut:o(),maxBidAmount:p(T),minBidAmount:p(T),name:C(),paidQuantity:T,path:w,position:T,reservedQuantity:T,saleMode:v([`auction`,`buy_now`,`hybrid`]),slug:w,status:D,updatedAt:E}),k=h({collectShippingAddress:o(),communityId:w,configuration:h({collectShippingAddress:o(),image:p(C()),serviceFeeDefaultChecked:o(),serviceFeeEnabled:o()}),createdAt:E,description:p(C()),endAt:E,id:w,items:a(O),name:C(),path:w,payment:g(h({connectedAccountId:p(w),currency:u(`usd`),publishableKey:w})),position:T,pricingPolicy:h({currency:u(`usd`),serviceFeeRateBasisPoints:T}),serviceFeeDefaultChecked:o(),serviceFeeEnabled:o(),slug:w,startAt:E,status:D,updatedAt:E}),A={serviceFeeCents:T,serviceFeeRateBasisPoints:T,subtotalCents:T,totalCents:T},j=e=>e.totalCents===e.subtotalCents+e.serviceFeeCents,M={...A,clientSecret:p(w),requiresAction:o()},N=y(h(M),s(e=>j(e)),s(e=>!e.requiresAction||e.clientSecret!==null)),P=y(h({...M,id:w,purchaseId:w,quantity:y(T,f(1)),status:v([`pending_payment`,`paid`,`payment_failed`,`expired`,`canceled`,`refunded`]),totalAmount:T}),s(e=>j(e)),s(e=>e.id===e.purchaseId&&(!e.requiresAction||e.clientSecret!==null))),F=y(h({...A,quantity:y(T,f(1)),totalAmount:T,unitAmount:T}),s(e=>j(e))),I={confirmationToken:w,email:y(C(),c()),expectedServiceFeeCents:g(T),expectedSubtotalCents:g(T),expectedTotalCents:g(T),includeServiceFee:g(o()),phone:y(C(),b(/^\+[1-9]\d{1,14}$/))},L=h({...I,amount:y(T,f(100))}),R=h({...I,clientRequestId:w,paymentMethodTypes:g(S([u(`card`)])),quantity:y(T,f(1))}),z=e=>_(k,e),B=e=>_(a(k),e),V=e=>_(N,e),H=e=>_(P,e),U=e=>_(F,e),W=e=>_(L,e),G=e=>_(R,e),K=e=>_(p(P),e);function q(a){let o=n(a,`communitySlug`),s=t({communitySlug:o.communitySlugValue,environment:o.environment,getContext:()=>({}),onError:o.onError,resourceContextName:`lockerverse_auction`,sentryDsn:o.sentryDsn}),{requestJson:c}=r(o.fetchImplementation,s,o.requestTimeoutMs),l=`${o.apiBaseUrl}/auctions/communities/slug/${o.communitySlug}`;async function u(t,n,r,a){let o,u;try{o=l+n.map(e=>`/${encodeURIComponent(_(w,e))}`).join(``),a&&(u={body:JSON.stringify(a.parse(a.value)),headers:{"content-type":`application/json`},method:`POST`})}catch{throw s(new i({...t,message:`Lockerverse auction input is invalid.`,reportable:!1}))}try{let n=await c(o,u,r,{...t,report:!1},{...t,report:!1});if(!n.ok){let{status:e}=n.response;throw new i({...t,recoveryRecommended:!!a&&(e>=500||e===408),reportable:e>=500,status:e})}return e(n.value)}catch(e){throw e instanceof i?s(new i({...t,recoveryRecommended:e.recoveryRecommended||!!a&&e.status===void 0,reportable:e.reportable,...e.status===void 0?void 0:{status:e.status}})):s(new i({...t,recoveryRecommended:!!a,reportable:!0}))}}return{createBid:(e,t,n)=>u({code:`auction_bid_failed`,message:`Unable to submit Lockerverse auction bid.`,operation:`create_auction_bid`},[`path`,e,`items`,t,`bids`],V,{parse:W,value:n}),createPurchase:(e,t,n)=>u({code:`auction_purchase_failed`,message:`Unable to submit Lockerverse auction purchase.`,operation:`create_auction_purchase`},[`path`,e,`items`,t,`purchases`],H,{parse:G,value:n}),getPurchaseReceipt:(e,t,n)=>u({code:`auction_receipt_failed`,message:`Unable to load Lockerverse auction purchase receipt.`,operation:`get_auction_purchase_receipt`},[`path`,e,`items`,t,`purchases`,n],U),getPurchaseStatus:(e,t,n)=>u({code:`auction_purchase_status_failed`,message:`Unable to load Lockerverse auction purchase status.`,operation:`get_auction_purchase_status`},[`path`,e,`items`,t,`purchase-status`,n],K),list:()=>u({code:`auction_load_failed`,message:`Unable to load Lockerverse auctions.`,operation:`list_auctions`},[],B),load:e=>u({code:`auction_load_failed`,message:`Unable to load Lockerverse auction.`,operation:`load_auction`},[`path`,e],z)}}function J(e){if(!Number.isSafeInteger(e)||e<0)throw TypeError(`Auction amounts must be non-negative safe integers.`)}function Y(t,n,r=!1){if(J(n),r&&!t.serviceFeeEnabled)throw TypeError(`The service fee is not available for this auction.`);let i=r?t.pricingPolicy.serviceFeeRateBasisPoints:0;J(i);let a=Math.round(n*i/1e4),o=n+a;return J(a),J(o),e({serviceFeeCents:a,serviceFeeRateBasisPoints:i,subtotalCents:n,totalCents:o})}function X(e){let t=e.minBidAmount??100,n=e.bidIncrementAmount??100;if(J(t),J(n),e.maxBidAmount===null)return t;J(e.maxBidAmount);let r=Math.max(t,e.maxBidAmount+n);return J(r),r}export{i as LockerverseSdkError,Y as calculateLockerverseAuctionPricing,q as createLockerverseAuctionClient,X as getLockerverseAuctionMinimumBid};
2
+ //# sourceMappingURL=auctions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auctions.js","names":[],"sources":["../src/auction-schemas.ts","../src/auction-client.ts","../src/auction-pricing.ts"],"sourcesContent":["import {\n array,\n boolean,\n check,\n email,\n isoTimestamp,\n literal,\n minLength,\n minValue,\n nullable,\n number,\n object,\n optional,\n parse,\n picklist,\n pipe,\n regex,\n safeInteger,\n strictTuple,\n string,\n} from \"valibot\";\n\nexport const auctionTextSchema = pipe(string(), minLength(1));\nconst cents = pipe(number(), safeInteger(), minValue(0));\nconst date = pipe(string(), isoTimestamp());\nconst status = picklist([\"draft\", \"active\", \"finished\"]);\nconst itemSchema = object({\n auctionId: auctionTextSchema,\n availableQuantity: nullable(cents),\n bidCount: cents,\n bidIncrementAmount: nullable(cents),\n buyNowPriceAmount: nullable(cents),\n collectShippingAddress: boolean(),\n communityId: auctionTextSchema,\n createdAt: date,\n description: nullable(string()),\n finalizedBidCount: cents,\n id: auctionTextSchema,\n image: nullable(string()),\n images: array(string()),\n inventoryQuantity: nullable(cents),\n isSoldOut: boolean(),\n maxBidAmount: nullable(cents),\n minBidAmount: nullable(cents),\n name: string(),\n paidQuantity: cents,\n path: auctionTextSchema,\n position: cents,\n reservedQuantity: cents,\n saleMode: picklist([\"auction\", \"buy_now\", \"hybrid\"]),\n slug: auctionTextSchema,\n status,\n updatedAt: date,\n});\nconst auctionSchema = object({\n collectShippingAddress: boolean(),\n communityId: auctionTextSchema,\n configuration: object({\n collectShippingAddress: boolean(),\n image: nullable(string()),\n serviceFeeDefaultChecked: boolean(),\n serviceFeeEnabled: boolean(),\n }),\n createdAt: date,\n description: nullable(string()),\n endAt: date,\n id: auctionTextSchema,\n items: array(itemSchema),\n name: string(),\n path: auctionTextSchema,\n payment: optional(\n object({\n connectedAccountId: nullable(auctionTextSchema),\n currency: literal(\"usd\"),\n publishableKey: auctionTextSchema,\n })\n ),\n position: cents,\n pricingPolicy: object({\n currency: literal(\"usd\"),\n serviceFeeRateBasisPoints: cents,\n }),\n serviceFeeDefaultChecked: boolean(),\n serviceFeeEnabled: boolean(),\n slug: auctionTextSchema,\n startAt: date,\n status,\n updatedAt: date,\n});\nconst pricingEntries = {\n serviceFeeCents: cents,\n serviceFeeRateBasisPoints: cents,\n subtotalCents: cents,\n totalCents: cents,\n};\nconst pricingIsConsistent = (value: {\n subtotalCents: number;\n serviceFeeCents: number;\n totalCents: number;\n}) => value.totalCents === value.subtotalCents + value.serviceFeeCents;\nconst bidResultEntries = {\n ...pricingEntries,\n clientSecret: nullable(auctionTextSchema),\n requiresAction: boolean(),\n};\nconst bidResultSchema = pipe(\n object(bidResultEntries),\n check((value) => pricingIsConsistent(value)),\n check((value) => !value.requiresAction || value.clientSecret !== null)\n);\nconst purchaseResultSchema = pipe(\n object({\n ...bidResultEntries,\n id: auctionTextSchema,\n purchaseId: auctionTextSchema,\n quantity: pipe(cents, minValue(1)),\n status: picklist([\n \"pending_payment\",\n \"paid\",\n \"payment_failed\",\n \"expired\",\n \"canceled\",\n \"refunded\",\n ]),\n totalAmount: cents,\n }),\n check((value) => pricingIsConsistent(value)),\n check(\n (value) =>\n value.id === value.purchaseId &&\n (!value.requiresAction || value.clientSecret !== null)\n )\n);\nconst receiptSchema = pipe(\n object({\n ...pricingEntries,\n quantity: pipe(cents, minValue(1)),\n totalAmount: cents,\n unitAmount: cents,\n }),\n check((value) => pricingIsConsistent(value))\n);\nconst submissionEntries = {\n confirmationToken: auctionTextSchema,\n email: pipe(string(), email()),\n expectedServiceFeeCents: optional(cents),\n expectedSubtotalCents: optional(cents),\n expectedTotalCents: optional(cents),\n includeServiceFee: optional(boolean()),\n phone: pipe(string(), regex(/^\\+[1-9]\\d{1,14}$/)),\n};\nconst bidSubmissionSchema = object({\n ...submissionEntries,\n amount: pipe(cents, minValue(100)),\n});\nconst purchaseSubmissionSchema = object({\n ...submissionEntries,\n clientRequestId: auctionTextSchema,\n paymentMethodTypes: optional(strictTuple([literal(\"card\")])),\n quantity: pipe(cents, minValue(1)),\n});\nexport const parseAuction = <Value>(value: Value) =>\n parse(auctionSchema, value);\nexport const parseAuctions = <Value>(value: Value) =>\n parse(array(auctionSchema), value);\nexport const parseAuctionBidResult = <Value>(value: Value) =>\n parse(bidResultSchema, value);\nexport const parseAuctionPurchaseResult = <Value>(value: Value) =>\n parse(purchaseResultSchema, value);\nexport const parseAuctionPurchaseReceipt = <Value>(value: Value) =>\n parse(receiptSchema, value);\nexport const parseAuctionBidSubmission = <Value>(value: Value) =>\n parse(bidSubmissionSchema, value);\nexport const parseAuctionPurchaseSubmission = <Value>(value: Value) =>\n parse(purchaseSubmissionSchema, value);\n\nexport const parseAuctionPurchaseStatus = <Value>(value: Value) =>\n parse(nullable(purchaseResultSchema), value);\n","import { parse } from \"valibot\";\nimport {\n auctionTextSchema,\n parseAuction,\n parseAuctionBidResult,\n parseAuctionBidSubmission,\n parseAuctionPurchaseReceipt,\n parseAuctionPurchaseResult,\n parseAuctionPurchaseStatus,\n parseAuctionPurchaseSubmission,\n parseAuctions,\n} from \"./auction-schemas.ts\";\nimport type {\n CreateLockerverseAuctionOptions,\n LockerverseAuctionClient,\n} from \"./auction-types.ts\";\nimport { deepFreeze } from \"./deep-freeze.ts\";\nimport { resolveResourceEnvironment } from \"./environment.ts\";\nimport { createSdkErrorReporter } from \"./error-reporting.ts\";\nimport { createTransport } from \"./transport.ts\";\nimport {\n LockerverseSdkError,\n type LockerverseSdkErrorCode,\n type LockerverseSdkOperation,\n} from \"./types.ts\";\n\ntype RequestContext = {\n code: LockerverseSdkErrorCode;\n operation: LockerverseSdkOperation;\n message: string;\n};\n\nexport function createLockerverseAuctionClient(\n options: CreateLockerverseAuctionOptions\n): LockerverseAuctionClient {\n const runtime = resolveResourceEnvironment(options, \"communitySlug\");\n const reportError = createSdkErrorReporter({\n communitySlug: runtime.communitySlugValue,\n environment: runtime.environment,\n getContext: () => ({}),\n onError: runtime.onError,\n resourceContextName: \"lockerverse_auction\",\n sentryDsn: runtime.sentryDsn,\n });\n const { requestJson } = createTransport(\n runtime.fetchImplementation,\n reportError,\n runtime.requestTimeoutMs\n );\n const baseUrl = `${runtime.apiBaseUrl}/auctions/communities/slug/${runtime.communitySlug}`;\n\n async function request<T, Submission, ParsedSubmission>(\n context: RequestContext,\n segments: string[],\n parser: <Value>(value: Value) => T,\n submission?: {\n value: Submission;\n parse: (value: Submission) => ParsedSubmission;\n }\n ): Promise<T> {\n let url: string;\n let init: RequestInit | undefined;\n try {\n url =\n baseUrl +\n segments\n .map(\n (segment) =>\n `/${encodeURIComponent(parse(auctionTextSchema, segment))}`\n )\n .join(\"\");\n if (submission) {\n init = {\n body: JSON.stringify(submission.parse(submission.value)),\n headers: { \"content-type\": \"application/json\" },\n method: \"POST\",\n };\n }\n } catch {\n // biome-ignore lint/style/useErrorCause: Validation details can contain personal data or confirmation tokens.\n throw reportError(\n new LockerverseSdkError({\n ...context,\n message: \"Lockerverse auction input is invalid.\",\n reportable: false,\n })\n );\n }\n try {\n const response = await requestJson(\n url,\n init,\n parser,\n { ...context, report: false },\n { ...context, report: false }\n );\n if (!response.ok) {\n const { status } = response.response;\n throw new LockerverseSdkError({\n ...context,\n recoveryRecommended:\n Boolean(submission) && (status >= 500 || status === 408),\n reportable: status >= 500,\n status,\n });\n }\n return deepFreeze(response.value);\n } catch (error) {\n if (error instanceof LockerverseSdkError) {\n throw reportError(\n new LockerverseSdkError({\n ...context,\n recoveryRecommended:\n error.recoveryRecommended ||\n (Boolean(submission) && error.status === undefined),\n reportable: error.reportable,\n ...(error.status === undefined\n ? undefined\n : { status: error.status }),\n })\n );\n }\n throw reportError(\n new LockerverseSdkError({\n ...context,\n recoveryRecommended: Boolean(submission),\n reportable: true,\n })\n );\n }\n }\n\n return {\n createBid: (auctionSlug, itemId, submission) =>\n request(\n {\n code: \"auction_bid_failed\",\n message: \"Unable to submit Lockerverse auction bid.\",\n operation: \"create_auction_bid\",\n },\n [\"path\", auctionSlug, \"items\", itemId, \"bids\"],\n parseAuctionBidResult,\n { parse: parseAuctionBidSubmission, value: submission }\n ),\n createPurchase: (auctionSlug, itemId, submission) =>\n request(\n {\n code: \"auction_purchase_failed\",\n message: \"Unable to submit Lockerverse auction purchase.\",\n operation: \"create_auction_purchase\",\n },\n [\"path\", auctionSlug, \"items\", itemId, \"purchases\"],\n parseAuctionPurchaseResult,\n { parse: parseAuctionPurchaseSubmission, value: submission }\n ),\n getPurchaseReceipt: (auctionSlug, itemSlug, purchaseId) =>\n request(\n {\n code: \"auction_receipt_failed\",\n message: \"Unable to load Lockerverse auction purchase receipt.\",\n operation: \"get_auction_purchase_receipt\",\n },\n [\"path\", auctionSlug, \"items\", itemSlug, \"purchases\", purchaseId],\n parseAuctionPurchaseReceipt\n ),\n getPurchaseStatus: (auctionSlug, itemId, clientRequestId) =>\n request(\n {\n code: \"auction_purchase_status_failed\",\n message: \"Unable to load Lockerverse auction purchase status.\",\n operation: \"get_auction_purchase_status\",\n },\n [\n \"path\",\n auctionSlug,\n \"items\",\n itemId,\n \"purchase-status\",\n clientRequestId,\n ],\n parseAuctionPurchaseStatus\n ),\n list: () =>\n request(\n {\n code: \"auction_load_failed\",\n message: \"Unable to load Lockerverse auctions.\",\n operation: \"list_auctions\",\n },\n [],\n parseAuctions\n ),\n load: (auctionSlug) =>\n request(\n {\n code: \"auction_load_failed\",\n message: \"Unable to load Lockerverse auction.\",\n operation: \"load_auction\",\n },\n [\"path\", auctionSlug],\n parseAuction\n ),\n };\n}\n","import type {\n LockerverseAuction,\n LockerverseAuctionItem,\n LockerverseAuctionPricing,\n} from \"./auction-types.ts\";\nimport { deepFreeze } from \"./deep-freeze.ts\";\n\nfunction assertCents(value: number) {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new TypeError(\"Auction amounts must be non-negative safe integers.\");\n }\n}\n\n/** Local estimate. Send expected amounts with the submission for server validation. */\nexport function calculateLockerverseAuctionPricing(\n auction: Pick<LockerverseAuction, \"serviceFeeEnabled\" | \"pricingPolicy\">,\n subtotalCents: number,\n includeServiceFee = false\n): LockerverseAuctionPricing {\n assertCents(subtotalCents);\n if (includeServiceFee && !auction.serviceFeeEnabled) {\n throw new TypeError(\"The service fee is not available for this auction.\");\n }\n const serviceFeeRateBasisPoints = includeServiceFee\n ? auction.pricingPolicy.serviceFeeRateBasisPoints\n : 0;\n assertCents(serviceFeeRateBasisPoints);\n const serviceFeeCents = Math.round(\n (subtotalCents * serviceFeeRateBasisPoints) / 10_000\n );\n const totalCents = subtotalCents + serviceFeeCents;\n assertCents(serviceFeeCents);\n assertCents(totalCents);\n return deepFreeze({\n serviceFeeCents,\n serviceFeeRateBasisPoints,\n subtotalCents,\n totalCents,\n });\n}\n\n/** Snapshot estimate. Another accepted bid can increase the server minimum. */\nexport function getLockerverseAuctionMinimumBid(\n item: Pick<\n LockerverseAuctionItem,\n \"minBidAmount\" | \"bidIncrementAmount\" | \"maxBidAmount\"\n >\n): number {\n const minimum = item.minBidAmount ?? 100;\n const increment = item.bidIncrementAmount ?? 100;\n assertCents(minimum);\n assertCents(increment);\n if (item.maxBidAmount === null) {\n return minimum;\n }\n assertCents(item.maxBidAmount);\n const amount = Math.max(minimum, item.maxBidAmount + increment);\n assertCents(amount);\n return amount;\n}\n"],"mappings":"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"}
package/dist/checkout.js CHANGED
@@ -1,2 +1,2 @@
1
- import{a as e,c as t,d as n,i as r,l as i,m as a,n as o,o as s,r as c,s as l,t as u,u as d}from"./transport.js";import{n as f,t as p}from"./types.js";import{array as m,boolean as h,check as g,finite as _,literal as v,looseObject as y,maxValue as ee,minLength as b,minValue as x,nullable as S,number as C,object as w,optional as T,parser as E,picklist as D,pipe as O,record as k,regex as A,safeParse as j,strictObject as M,string as N,transform as te,union as P,unknown as F,variant as ne}from"valibot";function re(e){let t=a(e,`widgetSlug`);return{...t,widgetSlug:t.resourceSlug,widgetSlugValue:t.resourceSlugValue}}const I=D([`one-time`,`monthly`,`annually`]),L=D([`none`,`event_admission`]),R=S(t(0)),ie=D([`available`,`sold_out`]),ae=T(w({listings:m(w({listingId:s,maxPurchasableQuantity:R,remainingQuantity:R,status:ie})),sharedLimits:m(w({id:s,listingIds:m(s),remainingQuantity:t(0),status:ie}))}),{listings:[],sharedLimits:[]}),oe=O(N(),A(/^pk_(?:test|live)_\S+$/,`Invalid publishable key.`)),z={description:l,fulfillmentType:L,id:s,inventoryQuantity:R,maxQuantity:R,minimumAmountCents:R,minQuantity:R,name:s,paymentOption:I},B=w({description:S(N()),endAt:s,id:s,location:S(N()),name:s,startAt:s,status:D([`draft`,`active`,`finished`,`cancelled`])}),se=O(ne(`pricingMode`,[w({...z,amountCents:t(0),pricingMode:v(`fixed`)}),w({...z,amountCents:R,pricingMode:v(`custom`)})]),g(({maxQuantity:e,minQuantity:t})=>e===null||t===null||t<=e)),ce=w({acceptsDiscounts:T(h(),!1),id:s,product:se,productId:s,slug:s}),V=T(w({memberId:T(h(),!1),merchSize:T(h(),!1),phone:T(h(),!1),promoCode:T(h(),!1),serviceFee:T(h(),!1),shipping:T(h(),!1),tipping:T(h(),!1)}),{}),le=O(w({availability:ae,community:T(w({color:N(),memberIdLabel:T(S(N())),name:s,thumbnail:S(N())})),config:T(w({customFields:e,fields:V})),description:l,event:S(B),id:T(N(),``),name:T(N(),`Lockerverse widget`),payment:w({connectedAccountId:T(S(s),null),currency:v(`usd`),publishableKey:oe}),pricingPolicy:T(w({currency:T(v(`usd`),`usd`),serviceFeeRateBasisPoints:T(t(0),0)})),products:T(m(ce),[]),showCommunityBranding:T(h(),!0),title:l}),te(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=w({acceptsDiscounts:h(),amountCents:S(t(0)),description:S(N()),fulfillmentType:L,id:s,inventoryQuantity:R,listingId:s,maximumQuantity:R,minimumAmountCents:R,minimumQuantity:R,name:s,paymentOption:I,pricingMode:D([`fixed`,`custom`]),slug:s}),de=w({availability:ae,community:S(w({accentColor:N(),imageUrl:S(N()),memberIdLabel:T(S(N())),name:s})),event:S(B),payment:w({connectedAccountId:T(S(s),null),currency:v(`usd`),publishableKey:oe}),pricingPolicy:w({currency:v(`usd`),serviceFeeRateBasisPoints:t(0)}),products:m(ue),widget:w({customFields:e,description:S(N()),fields:V,id:N(),name:s,showCommunityBranding:h(),title:S(N())})}),fe=S(w({percentageOff:O(C(),_(),x(0),ee(100)),source:D([`email_list`,`promo_code`])})),pe=w({acceptsDiscounts:h(),eventId:S(s),fulfillmentType:L,listingId:s,listingSlug:s,paymentOption:I,pricingMode:D([`fixed`,`custom`]),productId:s,productName:s,quantity:t(1),subtotalCents:t(0),unitAmountCents:t(0)}),me=O(d,w({amountCents:t(0),appliedDiscount:fe,connectedAccountId:S(s),discountableSubtotalCents:t(0),discountCents:t(0),lineItems:m(pe),paymentOption:I,serviceFeeCents:t(0),subtotalCents:t(0),tipCents:t(0),totalCents:t(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=O(i,g(e=>e.checkoutId.trim()&&e.paymentReference.trim()?e.checkoutStatus===`action_required`?e.requiresAction&&e.paymentRequired&&!!e.clientSecret?.trim():!e.requiresAction&&e.clientSecret===null:!1,`Invalid payment result state.`)),H=E(me),ge=E(de),U=E(he),_e=E(n),ve=E(le);function ye(e){return _e(e),ve(e)}function be(e){let t=j(y({quote:T(F())}),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:T(N()),includeServiceFee:T(h()),promoCode:T(N()),tipCents:T(t(0))},W=M(xe),G=E(T(W,{})),Se=M({confirmationToken:T(s),customFieldAnswers:T(m(r)),email:N(),memberId:T(N()),merchSize:T(D([`XS`,`S`,`M`,`L`,`XL`,`XXL`,`XXXL`])),metadata:T(k(N(),N())),phone:T(N()),shipping:T(M({address:M({city:N(),country:N(),line1:N(),line2:T(N()),postal_code:N(),state:N()}),name:N()}))}),Ce=P([M({amountCents:t(1),productId:s}),M({productId:s,quantity:t(1)}),M({productId:s})]),we=P([M({amountCents:t(1),productSlug:s}),M({productSlug:s,quantity:t(1)}),M({productSlug:s})]),K=O(m(Ce),b(1)),q=O(m(we),b(1)),Te=w({selection:q}),Ee=y({catalog:T(F()),email:T(F()),includeServiceFee:T(F()),items:T(K),promoCode:T(F()),selection:T(q),tipCents:T(F())}),J=O(y({authoritative:v(!0),items:K,payment:w({connectedAccountId:S(s),currency:v(`usd`),publishableKey:O(N(),b(1))}),paymentReference:O(N(),b(1)),pricing:W}),te(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=s,ke=E(y({})),Ae=E(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=E(Te),Ne=E(Oe);E(J);const Pe=E(De),Fe=E(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 f({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:t.maxQuantity,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.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 c(structuredClone(e))}const Ge=w({code:D([`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=j(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:s,requestTimeoutMs:l,sentryDsn:d,widgetSlug:p,widgetSlugValue:m}=re(e),h=o({communitySlug:r,environment:i,getContext:()=>({widgetSlug:m}),onError:s,resourceContextName:`lockerverse_widget`,sentryDsn:d}),{requestJson:g}=u(a,h,l),_=`${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 f({code:n,message:e,operation:t,reportable:!1}))}function ee(e,t){return e instanceof f?e:new f({...t,reportable:!0})}function b(e,t,n=!1){let r=ee(e,t);if(!(n&&(r.status===void 0||r.status>=500)))throw h(r);let i=r.status===void 0?new f({code:r.code,message:r.message,operation:r.operation,recoveryRecommended:!0,reportable:r.reportable}):new f({code:r.code,message:r.message,operation:r.operation,recoveryRecommended:!0,reportable:r.reportable,status:r.status});throw h(i)}function x(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 S(e){try{return Me(e).selection}catch{y(`Checkout selection is invalid.`,`load_widget`)}}function C(e,t,n,r){let{connectedAccountId:i,...a}=e;return Ue(c({...a,authoritative:!0,items:t,payment:{connectedAccountId:i,currency:`usd`,publishableKey:r.publishableKey},paymentOption:e.paymentOption,paymentReference:globalThis.crypto.randomUUID(),pricing:n}))}function w(e,t,n){try{return X(e,t).items}catch(e){throw e instanceof TypeError&&y(e.message,n),e}}function T(e,t,n,r){if(!n)throw new f({...r,message:`Lockerverse did not return the requested initial quote.`,reportable:!0});let i=w(e,t,r.operation);return c({catalog:Z(e),checkout:C(n,i,{includeServiceFee:e.widget.fields.serviceFee},e.payment)})}async function E(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=await $(r.response);throw e===`PAYMENT_WIDGET_SALES_LIMIT_REACHED`?new f({...t,message:`This option is sold out.`,reportable:!1,serverCode:e,status:r.response.status}):new f({...t,message:`Unable to load Lockerverse widget (${r.response.status}).`,reportable:r.response.status>=500,status:r.response.status})}let i=c(He(r.value.widget));return e?T(i,e,r.value.quote,t):Z(i)}async function D(e,t){let n=await E(),r={includeServiceFee:n.widget.fields.serviceFee},i=w(n,e,t.operation);return c({catalog:n,checkout:await A(i,r,n.payment,t)})}async function O(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 D(e,t):e?await E(e):await E()}catch(e){b(e,t)}}function k(e){return e===void 0?O():O(S(e))}async function A(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=await $(i.response);throw e===`PAYMENT_WIDGET_SALES_LIMIT_REACHED`?new f({...r,message:`This option is sold out.`,reportable:!1,serverCode:e,status:i.response.status}):new f({...r,message:`Unable to calculate the Lockerverse checkout total (${i.response.status}).`,reportable:i.response.status>=500,status:i.response.status})}return C(i.value,e,t,n)}async function j(e){let{catalog:t,items:n,pricing:r}=M(e),i={code:`total_calculation_failed`,message:`Lockerverse returned an invalid checkout total.`,operation:`calculate_total`};try{return await A(n,r,t.payment,i)}catch(e){b(e,i)}}function M(e){try{let t=je(e),n=Ke(t),r=x(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 f)throw e;y(e instanceof TypeError?e.message:`Checkout selection is invalid.`,`calculate_total`)}}function N(e){try{let t=Pe(e),{items:n,pricing:r,quote:i}=t.checkout,a=x(r),o=c(i),{submission:s}=t;o.totalCents>0&&!s.confirmationToken&&y(`Stripe confirmation is required for a paid checkout.`,`submit_payment`,`payment_submit_failed`);let l=s.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:{...s,email:l}}}catch(e){if(e instanceof f)throw e;y(`Lockerverse payment submission is invalid.`,`submit_payment`,`payment_submit_failed`)}}return{calculateTotal:j,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 f({...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 f({...n,reportable:!0});return We(e.value)}catch(e){b(e,n)}},load:k,async submitPayment(e){let{items:t,pricing:n,quote:r,submission:i}=N(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=await $(e.response);throw t?new f({...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 f({...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 f({...a,reportable:!0});return We(e.value)}catch(e){b(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:s,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 c({amountCents:m,appliedDiscount:null,authoritative:!1,discountableSubtotalCents:f,discountCents:0,items:s,lineItems:l,paymentOption:u,serviceFeeCents:p,subtotalCents:d,tipCents:o,totalCents:h})}export{p as LOCKERVERSE_SDK_VERSION,f as LockerverseSdkError,Je as createLockerverseCheckoutClient,Ye as estimateLockerverseCheckout,Y as getLockerverseMinimumCustomAmountCents};
1
+ import{a as e,n as t,r as n,t as r}from"./transport.js";import{n as i,t as a}from"./types.js";import{a as o,c as s,i as c,n as l,o as u,r as d,s as f,t as p}from"./schema-helpers.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=n(e,`widgetSlug`);return{...t,widgetSlug:t.resourceSlug,widgetSlugValue:t.resourceSlugValue}}const L=O([`one-time`,`monthly`,`annually`]),R=O([`none`,`event_admission`]),z=C(o(0)),re=O([`available`,`sold_out`]),ie=E(T({listings:m(T({listingId:d,maxPurchasableQuantity:z,remainingQuantity:z,status:re})),sharedLimits:m(T({id:d,listingIds:m(d),remainingQuantity:o(0),status:re}))}),{listings:[],sharedLimits:[]}),ae=k(P(),j(/^pk_(?:test|live)_\S+$/,`Invalid publishable key.`)),oe={description:c,fulfillmentType:R,id:d,inventoryQuantity:z,maxQuantity:z,minimumAmountCents:z,minQuantity:z,name:d,paymentOption:L},B=T({description:C(P()),endAt:d,id:d,location:C(P()),name:d,startAt:d,status:O([`draft`,`active`,`finished`,`cancelled`])}),se=k(te(`pricingMode`,[T({...oe,amountCents:o(0),pricingMode:v(`fixed`)}),T({...oe,amountCents:z,pricingMode:v(`custom`)})]),g(({maxQuantity:e,minQuantity:t})=>e===null||t===null||t<=e)),ce=T({acceptsDiscounts:E(h(),!1),id:d,product:se,productId:d,slug:d}),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:d,thumbnail:C(P())})),config:E(T({customFields:l,fields:V})),description:c,event:C(B),id:E(P(),``),name:E(P(),`Lockerverse widget`),payment:T({connectedAccountId:E(C(d),null),currency:v(`usd`),publishableKey:ae}),pricingPolicy:E(T({currency:E(v(`usd`),`usd`),serviceFeeRateBasisPoints:E(o(0),0)})),products:E(m(ce),[]),showCommunityBranding:E(h(),!0),title:c}),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(o(0)),description:C(P()),fulfillmentType:R,id:d,inventoryQuantity:z,listingId:d,maximumQuantity:z,minimumAmountCents:z,minimumQuantity:z,name:d,paymentOption:L,pricingMode:O([`fixed`,`custom`]),slug:d}),de=T({availability:ie,community:C(T({accentColor:P(),imageUrl:C(P()),memberIdLabel:E(C(P())),name:d})),event:C(B),payment:T({connectedAccountId:E(C(d),null),currency:v(`usd`),publishableKey:ae}),pricingPolicy:T({currency:v(`usd`),serviceFeeRateBasisPoints:o(0)}),products:m(ue),widget:T({customFields:l,description:C(P()),fields:V,id:P(),name:d,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(d),fulfillmentType:R,listingId:d,listingSlug:d,paymentOption:L,pricingMode:O([`fixed`,`custom`]),productId:d,productName:d,quantity:o(1),subtotalCents:o(0),unitAmountCents:o(0)}),me=k(f,T({amountCents:o(0),appliedDiscount:fe,connectedAccountId:C(d),discountableSubtotalCents:o(0),discountCents:o(0),lineItems:m(pe),paymentOption:L,serviceFeeCents:o(0),subtotalCents:o(0),tipCents:o(0),totalCents:o(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(u,g(e=>e.checkoutId.trim()&&e.paymentReference.trim()?e.checkoutStatus===`action_required`?e.requiresAction&&e.paymentRequired&&!!e.clientSecret?.trim():!e.requiresAction&&e.clientSecret===null:!1,`Invalid payment result state.`)),H=D(me),ge=D(de),U=D(he),_e=D(s),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(o(0))},W=N(xe),G=D(E(W,{})),Se=N({confirmationToken:E(d),customFieldAnswers:E(m(p)),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:o(1),productId:d}),N({productId:d,quantity:o(1)}),N({productId:d})]),we=ee([N({amountCents:o(1),productSlug:d}),N({productSlug:d,quantity:o(1)}),N({productSlug:d})]),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(d),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=d,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),a=e.availability.listings.some(({listingId:e,maxPurchasableQuantity:t,status:n})=>r.has(e)&&(n===`sold_out`||t!==null&&(r.get(e)??0)>t)),o=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(a||o)throw new i({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:t.maxQuantity,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.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(t){return e(structuredClone(t))}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(n){let{apiBaseUrl:a,communitySlug:o,communitySlugValue:s,environment:c,fetchImplementation:l,onError:u,requestTimeoutMs:d,sentryDsn:f,widgetSlug:p,widgetSlugValue:m}=ne(n),h=t({communitySlug:s,environment:c,getContext:()=>({widgetSlug:m}),onError:u,resourceContextName:`lockerverse_widget`,sentryDsn:f}),{requestJson:g}=r(l,h,d),_=`${a}/v2/community/${o}/payment-widgets/${p}/checkout`,v=`${a}/v2/community/${o}/payment-widgets/${p}`;function y(e,t,n=`invalid_selection`){throw h(new i({code:n,message:e,operation:t,reportable:!1}))}function b(e,t){return e instanceof i?e:new i({...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 a=r.status===void 0?new i({code:r.code,message:r.message,operation:r.operation,recoveryRecommended:!0,reportable:r.reportable}):new i({code:r.code,message:r.message,operation:r.operation,recoveryRecommended:!0,reportable:r.reportable,status:r.status});throw h(a)}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(t,n,r,i){let{connectedAccountId:a,...o}=t;return Ue(e({...o,authoritative:!0,items:n,payment:{connectedAccountId:a,currency:`usd`,publishableKey:i.publishableKey},paymentOption:t.paymentOption,paymentReference:globalThis.crypto.randomUUID(),pricing:r}))}function T(e,t,n){try{return X(e,t).items}catch(e){throw e instanceof TypeError&&y(e.message,n),e}}function E(t,n,r,a){if(!r)throw new i({...a,message:`Lockerverse did not return the requested initial quote.`,reportable:!0});let o=T(t,n,a.operation);return e({catalog:Z(t),checkout:w(r,o,{includeServiceFee:t.widget.fields.serviceFee},t.payment)})}async function D(t){let n={code:`widget_load_failed`,message:`Lockerverse returned an invalid widget catalog.`,operation:`load_widget`},r=t?`${v}?selection=${encodeURIComponent(JSON.stringify(t))}`:v,a=await g(r,t?{cache:`no-store`}:void 0,be,{...n,message:`Unable to load Lockerverse widget because the request failed.`,report:!1},{...n,report:!1});if(!a.ok){let e=await $(a.response);throw e===`PAYMENT_WIDGET_SALES_LIMIT_REACHED`?new i({...n,message:`This option is sold out.`,reportable:!1,serverCode:e,status:a.response.status}):new i({...n,message:`Unable to load Lockerverse widget (${a.response.status}).`,reportable:a.response.status>=500,status:a.response.status})}let o=e(He(a.value.widget));return t?E(o,t,a.value.quote,n):Z(o)}async function O(t,n){let r=await D(),i={includeServiceFee:r.widget.fields.serviceFee},a=T(r,t,n.operation);return e({catalog:r,checkout:await j(a,i,r.payment,n)})}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 a=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(!a.ok){let e=await $(a.response);throw e===`PAYMENT_WIDGET_SALES_LIMIT_REACHED`?new i({...r,message:`This option is sold out.`,reportable:!1,serverCode:e,status:a.response.status}):new i({...r,message:`Unable to calculate the Lockerverse checkout total (${a.response.status}).`,reportable:a.response.status>=500,status:a.response.status})}return w(a.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 i)throw e;y(e instanceof TypeError?e.message:`Checkout selection is invalid.`,`calculate_total`)}}function P(t){try{let n=Pe(t),{items:r,pricing:i,quote:a}=n.checkout,o=S(i),s=e(a),{submission:c}=n;s.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!==o.email)&&y(`Payment email must match the current checkout quote.`,`submit_payment`),{items:r,pricing:o,quote:s,submission:{...c,email:l}}}catch(e){if(e instanceof i)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 i({...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 i({...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:a}=P(e),o={code:`payment_submit_failed`,message:`Lockerverse returned an invalid payment confirmation.`,operation:`submit_payment`};try{let e=await g(`${_}/confirm`,{body:JSON.stringify({confirmationToken:a.confirmationToken,customFieldAnswers:a.customFieldAnswers,email:a.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:a.memberId,merchSize:a.merchSize,metadata:a.metadata,paymentReference:r.paymentReference,phone:a.phone,quoteContractVersion:1,shipping:a.shipping}),headers:{"Content-Type":`application/json`},method:`POST`},U,{...o,message:`Unable to submit the Lockerverse payment because the request failed.`,report:!1},{...o,report:!1});if(!e.ok){let t=await $(e.response);throw t?new i({...o,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 i({...o,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 i({...o,reportable:!0});return We(e.value)}catch(e){x(e,o,!0)}}}}function Ye(t,n){let{selection:r,...i}=n,a;try{a=G(i)}catch(e){throw TypeError(`Checkout pricing is invalid.`,{cause:e})}let o=a.includeServiceFee??t.widget.fields.serviceFee,{tipCents:s=0}=a,{items:c,lineItems:l,paymentOption:u}=X(t,r),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=o?Math.round(d*t.pricingPolicy.serviceFeeRateBasisPoints/1e4):0,m=d+p,h=m+s;if(!Number.isSafeInteger(h)||h>2147483647)throw TypeError(`Checkout total is invalid.`);return e({amountCents:m,appliedDiscount:null,authoritative:!1,discountableSubtotalCents:f,discountCents:0,items:c,lineItems:l,paymentOption:u,serviceFeeCents:p,subtotalCents:d,tipCents:s,totalCents:h})}export{a as LOCKERVERSE_SDK_VERSION,i 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([\"one-time\", \"monthly\", \"annually\"]);\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 = pipe(\n 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 check(\n ({ maxQuantity, minQuantity }) =>\n maxQuantity === null || minQuantity === null || minQuantity <= maxQuantity\n )\n);\n\nconst productListingSchema = object({\n acceptsDiscounts: optional(boolean(), false),\n id: nonEmptyStringSchema,\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 })\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 })\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 vPaymentWidgetPaymentResultResponseDto,\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.requiresAction &&\n payment.paymentRequired &&\n Boolean(payment.clientSecret?.trim())\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: product.maxQuantity,\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.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 );\n if (!response.ok) {\n const serverCode = await readPaymentServerCode(response.response);\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 );\n if (!response.ok) {\n const serverCode = await readPaymentServerCode(response.response);\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 );\n if (!response.ok) {\n const serverCode = await readPaymentServerCode(response.response);\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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"}
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([\"one-time\", \"monthly\", \"annually\"]);\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 = pipe(\n 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 check(\n ({ maxQuantity, minQuantity }) =>\n maxQuantity === null || minQuantity === null || minQuantity <= maxQuantity\n )\n);\n\nconst productListingSchema = object({\n acceptsDiscounts: optional(boolean(), false),\n id: nonEmptyStringSchema,\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 })\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 })\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 vPaymentWidgetPaymentResultResponseDto,\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.requiresAction &&\n payment.paymentRequired &&\n Boolean(payment.clientSecret?.trim())\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: product.maxQuantity,\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.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 );\n if (!response.ok) {\n const serverCode = await readPaymentServerCode(response.response);\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 );\n if (!response.ok) {\n const serverCode = await readPaymentServerCode(response.response);\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 );\n if (!response.ok) {\n const serverCode = await readPaymentServerCode(response.response);\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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"}
@@ -0,0 +1,2 @@
1
+ import*as e from"valibot";import{array as t,boolean as n,check as r,looseObject as i,minLength as a,minValue as o,nonEmpty as s,nullable as c,number as ee,object as l,optional as u,parse as d,picklist as f,pipe as p,safeInteger as m,string as h,transform as te,union as g,unknown as _,variant as v}from"valibot";const y=e.object({percentageOff:e.number(),source:e.picklist([`email_list`,`promo_code`])}),b=e.object({acceptsDiscounts:e.boolean(),eventId:e.nullable(e.string()),fulfillmentType:e.picklist([`none`,`event_admission`]),listingId:e.string(),listingSlug:e.string(),paymentOption:e.picklist([`one-time`,`monthly`,`annually`]),pricingMode:e.picklist([`fixed`,`custom`]),productId:e.string(),productName:e.string(),quantity:e.number(),subtotalCents:e.number(),unitAmountCents:e.number()}),x=e.object({checkoutId:e.string(),checkoutStatus:e.picklist([`action_required`,`failed`,`pending`,`success`]),clientSecret:e.nullable(e.string()),paymentReference:e.string(),paymentRequired:e.boolean(),requiresAction:e.boolean(),status:e.nullable(e.string())}),S=e.object({amountCents:e.number(),appliedDiscount:e.nullable(y),connectedAccountId:e.nullable(e.string()),discountableSubtotalCents:e.number(),discountCents:e.number(),lineItems:e.array(b),paymentOption:e.picklist([`one-time`,`monthly`,`annually`]),serviceFeeCents:e.number(),subtotalCents:e.number(),tipCents:e.number(),totalCents:e.number()}),C=e.object({name:e.string(),partySize:e.pipe(e.number(),e.minValue(1))});e.object({nextCursor:e.nullable(e.string()),registrations:e.array(C),totalAttendees:e.pipe(e.number(),e.minValue(0))});const w=e.object({connectedAccountId:e.nullable(e.string()),currency:e.picklist([`usd`]),publishableKey:e.string()}),T=e.object({amountCents:e.optional(e.pipe(e.number(),e.minValue(100))),optionId:e.optional(e.pipe(e.string(),e.uuid())),productId:e.optional(e.pipe(e.string(),e.uuid())),quantity:e.optional(e.pipe(e.number(),e.minValue(1)))}),E=e.object({color:e.string(),name:e.string(),thumbnail:e.nullable(e.string())}),D=e.object({fieldId:e.string(),value:e.nullish(e.union([e.boolean(),e.string(),e.array(e.string())]))}),O=e.object({archivedAt:e.nullish(e.string()),id:e.string(),label:e.string()}),k=e.object({archivedAt:e.nullish(e.string()),id:e.string(),label:e.string(),options:e.optional(e.array(O)),required:e.boolean(),type:e.picklist([`text`,`textarea`,`select`,`multi_select`,`radio`,`checkbox`,`checkboxes`])}),A=e.object({description:e.nullable(e.string()),endAt:e.pipe(e.string(),e.isoTimestamp()),id:e.string(),location:e.nullable(e.string()),name:e.string(),startAt:e.pipe(e.string(),e.isoTimestamp()),status:e.picklist([`draft`,`active`,`finished`,`cancelled`])}),j=e.object({percentageOff:e.pipe(e.number(),e.minValue(0),e.maxValue(100)),source:e.picklist([`email_list`,`promo_code`])}),M=e.object({memberId:e.boolean(),merchSize:e.boolean(),phone:e.boolean(),promoCode:e.boolean(),serviceFee:e.boolean(),shipping:e.boolean(),tipping:e.boolean()}),N=e.object({customFields:e.array(k),fields:M}),P=e.object({currency:e.picklist([`usd`]),serviceFeeRateBasisPoints:e.number()}),F=e.object({amountCents:e.nullable(e.number()),description:e.nullable(e.string()),fulfillmentType:e.picklist([`none`,`event_admission`]),id:e.string(),inventoryQuantity:e.nullable(e.number()),maxQuantity:e.nullable(e.number()),minimumAmountCents:e.nullable(e.number()),minQuantity:e.nullable(e.number()),name:e.string(),paymentOption:e.picklist([`one-time`,`monthly`,`annually`]),pricingMode:e.picklist([`fixed`,`custom`])}),ne=e.object({acceptsDiscounts:e.boolean(),id:e.string(),maxQuantityPerOrder:e.nullable(e.number()),product:F,productId:e.string(),slug:e.string()});e.object({email:e.optional(e.pipe(e.string(),e.email())),includeServiceFee:e.optional(e.boolean()),items:e.array(T),promoCode:e.optional(e.pipe(e.string(),e.maxLength(255))),tipCents:e.optional(e.pipe(e.number(),e.minValue(0)))});const I=e.object({community:E,config:N,description:e.nullable(e.string()),event:e.nullable(A),id:e.string(),name:e.string(),payment:w,pricingPolicy:P,products:e.array(ne),quote:e.optional(S),showCommunityBranding:e.boolean(),title:e.nullable(e.string())}),L=e.object({city:e.string(),country:e.string(),line1:e.string(),line2:e.optional(e.string()),postal_code:e.string(),state:e.string()}),R=e.object({address:L,name:e.string()});e.object({confirmationToken:e.optional(e.string()),customFieldAnswers:e.optional(e.array(D)),email:e.pipe(e.string(),e.email()),expectedAmountCents:e.optional(e.pipe(e.number(),e.minValue(0))),expectedAppliedDiscount:e.nullish(j),expectedConnectedAccountId:e.nullish(e.string()),expectedDiscountableSubtotalCents:e.optional(e.pipe(e.number(),e.minValue(0))),expectedDiscountCents:e.optional(e.pipe(e.number(),e.minValue(0))),expectedServiceFeeCents:e.optional(e.pipe(e.number(),e.minValue(0))),expectedSubtotalCents:e.optional(e.pipe(e.number(),e.minValue(100))),expectedTipCents:e.optional(e.pipe(e.number(),e.minValue(0))),expectedTotalCents:e.optional(e.pipe(e.number(),e.minValue(0))),includeServiceFee:e.optional(e.boolean()),items:e.array(T),memberId:e.optional(e.string()),merchSize:e.optional(e.picklist([`XS`,`S`,`M`,`L`,`XL`,`XXL`,`XXXL`])),metadata:e.optional(e.record(e.string(),e.string())),name:e.optional(e.pipe(e.string(),e.maxLength(255))),paymentReference:e.optional(e.pipe(e.string(),e.uuid())),phone:e.optional(e.string()),promoCode:e.optional(e.string()),quoteContractVersion:e.optional(e.pipe(e.number(),e.minValue(1),e.maxValue(1))),shipping:e.optional(R),tipCents:e.optional(e.pipe(e.number(),e.minValue(0)))});const z=e.object({city:e.string(),country:e.string(),line1:e.string(),line2:e.nullish(e.string()),postalCode:e.string(),state:e.string()}),B=e.object({fieldId:e.string(),value:e.nullish(e.union([e.boolean(),e.string(),e.array(e.string())]))}),V=e.object({archivedAt:e.nullish(e.string()),id:e.string(),label:e.string()}),H=e.object({archivedAt:e.nullish(e.string()),id:e.string(),label:e.string(),options:e.optional(e.array(V)),required:e.boolean(),type:e.picklist([`text`,`textarea`,`select`,`multi_select`,`radio`,`checkbox`,`checkboxes`])}),U=e.object({enabled:e.boolean(),required:e.boolean()}),W=e.object({address:U,email:U,name:U,participantCount:U,phone:U}),G=e.object({builtInFields:W,customFields:e.array(H)}),K=e.object({config:G,coverImageUrl:e.nullable(e.string()),description:e.nullable(e.string()),eventId:e.nullish(e.pipe(e.string(),e.uuid())),id:e.string(),isActive:e.boolean(),name:e.string(),slug:e.string(),title:e.nullable(e.string())});e.object({address:e.nullish(z),answers:e.optional(e.array(B)),email:e.nullish(e.pipe(e.string(),e.email())),honeypot:e.optional(e.string()),name:e.string(),participantCount:e.nullish(e.pipe(e.number(),e.minValue(1))),phone:e.nullish(e.string()),submissionReference:e.optional(e.pipe(e.string(),e.uuid()))});const q=e.object({id:e.string(),submittedAt:e.pipe(e.string(),e.isoTimestamp())}),J=p(h(),s(),r(e=>e.trim().length>0)),Y=u(c(h()),null);function X(e){return p(ee(),m(),o(e))}const Z=p(t(_()),te(e=>e.filter(e=>{let{archivedAt:t}=d(i({archivedAt:u(c(J))}),e);return!t}))),re=l({id:J,label:J}),Q=p(Z,t(re),a(2),r(e=>new Set(e.map(({id:e})=>e)).size===e.length,`Expected unique custom field option IDs.`)),$={id:J,label:J,required:n()},ie=v(`type`,[l({...$,type:f([`text`,`textarea`])}),l({...$,type:f([`checkbox`])}),l({...$,options:Q,type:f([`radio`,`select`])}),l({...$,options:Q,type:f([`checkboxes`,`multi_select`])})]),ae=p(u(Z,[]),t(ie),r(e=>new Set(e.map(({id:e})=>e)).size===e.length,`Expected unique custom field IDs.`)),oe=l({fieldId:J,value:g([n(),h(),t(h())])});export{X as a,I as c,Y as i,K as l,ae as n,x as o,J as r,S as s,oe as t,q as u};
2
+ //# sourceMappingURL=schema-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-helpers.js","names":[],"sources":["../src/generated/public-api/valibot.gen.ts","../src/schema-helpers.ts"],"sourcesContent":["// This file is auto-generated by @hey-api/openapi-ts\n\nimport * as v from 'valibot';\n\nexport const vPaymentWidgetAppliedDiscountResponseDto = v.object({\n percentageOff: v.number(),\n source: v.picklist(['email_list', 'promo_code'])\n});\n\nexport const vPaymentWidgetCheckoutLineItemResponseDto = v.object({\n acceptsDiscounts: v.boolean(),\n eventId: v.nullable(v.string()),\n fulfillmentType: v.picklist(['none', 'event_admission']),\n listingId: v.string(),\n listingSlug: v.string(),\n paymentOption: v.picklist([\n 'one-time',\n 'monthly',\n 'annually'\n ]),\n pricingMode: v.picklist(['fixed', 'custom']),\n productId: v.string(),\n productName: v.string(),\n quantity: v.number(),\n subtotalCents: v.number(),\n unitAmountCents: v.number()\n});\n\nexport const vPaymentWidgetPaymentResultResponseDto = v.object({\n checkoutId: v.string(),\n checkoutStatus: v.picklist([\n 'action_required',\n 'failed',\n 'pending',\n 'success'\n ]),\n clientSecret: v.nullable(v.string()),\n paymentReference: v.string(),\n paymentRequired: v.boolean(),\n requiresAction: v.boolean(),\n status: v.nullable(v.string())\n});\n\nexport const vPaymentWidgetQuoteResponseDto = v.object({\n amountCents: v.number(),\n appliedDiscount: v.nullable(vPaymentWidgetAppliedDiscountResponseDto),\n connectedAccountId: v.nullable(v.string()),\n discountableSubtotalCents: v.number(),\n discountCents: v.number(),\n lineItems: v.array(vPaymentWidgetCheckoutLineItemResponseDto),\n paymentOption: v.picklist([\n 'one-time',\n 'monthly',\n 'annually'\n ]),\n serviceFeeCents: v.number(),\n subtotalCents: v.number(),\n tipCents: v.number(),\n totalCents: v.number()\n});\n\nexport const vPublicEventRegistrationDto = v.object({\n name: v.string(),\n partySize: v.pipe(v.number(), v.minValue(1))\n});\n\nexport const vPublicEventAttendeesResponseDto = v.object({\n nextCursor: v.nullable(v.string()),\n registrations: v.array(vPublicEventRegistrationDto),\n totalAttendees: v.pipe(v.number(), v.minValue(0))\n});\n\nexport const vPublicPaymentConfigurationResponseDto = v.object({\n connectedAccountId: v.nullable(v.string()),\n currency: v.picklist(['usd']),\n publishableKey: v.string()\n});\n\nexport const vPublicPaymentWidgetCheckoutItemRequestDto = v.object({\n amountCents: v.optional(v.pipe(v.number(), v.minValue(100))),\n optionId: v.optional(v.pipe(v.string(), v.uuid())),\n productId: v.optional(v.pipe(v.string(), v.uuid())),\n quantity: v.optional(v.pipe(v.number(), v.minValue(1)))\n});\n\nexport const vPublicPaymentWidgetCommunityResponseDto = v.object({\n color: v.string(),\n name: v.string(),\n thumbnail: v.nullable(v.string())\n});\n\nexport const vPublicPaymentWidgetCustomFieldAnswerRequestDto = v.object({\n fieldId: v.string(),\n value: v.nullish(v.union([\n v.boolean(),\n v.string(),\n v.array(v.string())\n ]))\n});\n\nexport const vPublicPaymentWidgetCustomFieldOptionResponseDto = v.object({\n archivedAt: v.nullish(v.string()),\n id: v.string(),\n label: v.string()\n});\n\nexport const vPublicPaymentWidgetCustomFieldResponseDto = v.object({\n archivedAt: v.nullish(v.string()),\n id: v.string(),\n label: v.string(),\n options: v.optional(v.array(vPublicPaymentWidgetCustomFieldOptionResponseDto)),\n required: v.boolean(),\n type: v.picklist([\n 'text',\n 'textarea',\n 'select',\n 'multi_select',\n 'radio',\n 'checkbox',\n 'checkboxes'\n ])\n});\n\nexport const vPublicPaymentWidgetEventResponseDto = v.object({\n description: v.nullable(v.string()),\n endAt: v.pipe(v.string(), v.isoTimestamp()),\n id: v.string(),\n location: v.nullable(v.string()),\n name: v.string(),\n startAt: v.pipe(v.string(), v.isoTimestamp()),\n status: v.picklist([\n 'draft',\n 'active',\n 'finished',\n 'cancelled'\n ])\n});\n\nexport const vPublicPaymentWidgetExpectedDiscountRequestDto = v.object({\n percentageOff: v.pipe(v.number(), v.minValue(0), v.maxValue(100)),\n source: v.picklist(['email_list', 'promo_code'])\n});\n\nexport const vPublicPaymentWidgetFieldsResponseDto = v.object({\n memberId: v.boolean(),\n merchSize: v.boolean(),\n phone: v.boolean(),\n promoCode: v.boolean(),\n serviceFee: v.boolean(),\n shipping: v.boolean(),\n tipping: v.boolean()\n});\n\nexport const vPublicPaymentWidgetConfigResponseDto = v.object({\n customFields: v.array(vPublicPaymentWidgetCustomFieldResponseDto),\n fields: vPublicPaymentWidgetFieldsResponseDto\n});\n\nexport const vPublicPaymentWidgetPricingPolicyResponseDto = v.object({\n currency: v.picklist(['usd']),\n serviceFeeRateBasisPoints: v.number()\n});\n\nexport const vPublicPaymentWidgetProductResponseDto = v.object({\n amountCents: v.nullable(v.number()),\n description: v.nullable(v.string()),\n fulfillmentType: v.picklist(['none', 'event_admission']),\n id: v.string(),\n inventoryQuantity: v.nullable(v.number()),\n maxQuantity: v.nullable(v.number()),\n minimumAmountCents: v.nullable(v.number()),\n minQuantity: v.nullable(v.number()),\n name: v.string(),\n paymentOption: v.picklist([\n 'one-time',\n 'monthly',\n 'annually'\n ]),\n pricingMode: v.picklist(['fixed', 'custom'])\n});\n\nexport const vPublicPaymentWidgetProductListingResponseDto = v.object({\n acceptsDiscounts: v.boolean(),\n id: v.string(),\n maxQuantityPerOrder: v.nullable(v.number()),\n product: vPublicPaymentWidgetProductResponseDto,\n productId: v.string(),\n slug: v.string()\n});\n\nexport const vPublicPaymentWidgetQuoteRequestDto = v.object({\n email: v.optional(v.pipe(v.string(), v.email())),\n includeServiceFee: v.optional(v.boolean()),\n items: v.array(vPublicPaymentWidgetCheckoutItemRequestDto),\n promoCode: v.optional(v.pipe(v.string(), v.maxLength(255))),\n tipCents: v.optional(v.pipe(v.number(), v.minValue(0)))\n});\n\nexport const vPublicPaymentWidgetResponseDto = v.object({\n community: vPublicPaymentWidgetCommunityResponseDto,\n config: vPublicPaymentWidgetConfigResponseDto,\n description: v.nullable(v.string()),\n event: v.nullable(vPublicPaymentWidgetEventResponseDto),\n id: v.string(),\n name: v.string(),\n payment: vPublicPaymentConfigurationResponseDto,\n pricingPolicy: vPublicPaymentWidgetPricingPolicyResponseDto,\n products: v.array(vPublicPaymentWidgetProductListingResponseDto),\n quote: v.optional(vPaymentWidgetQuoteResponseDto),\n showCommunityBranding: v.boolean(),\n title: v.nullable(v.string())\n});\n\nexport const vPublicPaymentWidgetShippingAddressRequestDto = v.object({\n city: v.string(),\n country: v.string(),\n line1: v.string(),\n line2: v.optional(v.string()),\n postal_code: v.string(),\n state: v.string()\n});\n\nexport const vPublicPaymentWidgetShippingRequestDto = v.object({\n address: vPublicPaymentWidgetShippingAddressRequestDto,\n name: v.string()\n});\n\nexport const vPublicPaymentWidgetConfirmRequestDto = v.object({\n confirmationToken: v.optional(v.string()),\n customFieldAnswers: v.optional(v.array(vPublicPaymentWidgetCustomFieldAnswerRequestDto)),\n email: v.pipe(v.string(), v.email()),\n expectedAmountCents: v.optional(v.pipe(v.number(), v.minValue(0))),\n expectedAppliedDiscount: v.nullish(vPublicPaymentWidgetExpectedDiscountRequestDto),\n expectedConnectedAccountId: v.nullish(v.string()),\n expectedDiscountableSubtotalCents: v.optional(v.pipe(v.number(), v.minValue(0))),\n expectedDiscountCents: v.optional(v.pipe(v.number(), v.minValue(0))),\n expectedServiceFeeCents: v.optional(v.pipe(v.number(), v.minValue(0))),\n expectedSubtotalCents: v.optional(v.pipe(v.number(), v.minValue(100))),\n expectedTipCents: v.optional(v.pipe(v.number(), v.minValue(0))),\n expectedTotalCents: v.optional(v.pipe(v.number(), v.minValue(0))),\n includeServiceFee: v.optional(v.boolean()),\n items: v.array(vPublicPaymentWidgetCheckoutItemRequestDto),\n memberId: v.optional(v.string()),\n merchSize: v.optional(v.picklist([\n 'XS',\n 'S',\n 'M',\n 'L',\n 'XL',\n 'XXL',\n 'XXXL'\n ])),\n metadata: v.optional(v.record(v.string(), v.string())),\n name: v.optional(v.pipe(v.string(), v.maxLength(255))),\n paymentReference: v.optional(v.pipe(v.string(), v.uuid())),\n phone: v.optional(v.string()),\n promoCode: v.optional(v.string()),\n quoteContractVersion: v.optional(v.pipe(v.number(), v.minValue(1), v.maxValue(1))),\n shipping: v.optional(vPublicPaymentWidgetShippingRequestDto),\n tipCents: v.optional(v.pipe(v.number(), v.minValue(0)))\n});\n\nexport const vPublicSignUpWidgetAddressRequestDto = v.object({\n city: v.string(),\n country: v.string(),\n line1: v.string(),\n line2: v.nullish(v.string()),\n postalCode: v.string(),\n state: v.string()\n});\n\nexport const vPublicSignUpWidgetAnswerRequestDto = v.object({\n fieldId: v.string(),\n value: v.nullish(v.union([\n v.boolean(),\n v.string(),\n v.array(v.string())\n ]))\n});\n\nexport const vPublicSignUpWidgetCustomFieldOptionResponseDto = v.object({\n archivedAt: v.nullish(v.string()),\n id: v.string(),\n label: v.string()\n});\n\nexport const vPublicSignUpWidgetCustomFieldResponseDto = v.object({\n archivedAt: v.nullish(v.string()),\n id: v.string(),\n label: v.string(),\n options: v.optional(v.array(vPublicSignUpWidgetCustomFieldOptionResponseDto)),\n required: v.boolean(),\n type: v.picklist([\n 'text',\n 'textarea',\n 'select',\n 'multi_select',\n 'radio',\n 'checkbox',\n 'checkboxes'\n ])\n});\n\nexport const vPublicSignUpWidgetFieldResponseDto = v.object({\n enabled: v.boolean(),\n required: v.boolean()\n});\n\nexport const vPublicSignUpWidgetFieldsResponseDto = v.object({\n address: vPublicSignUpWidgetFieldResponseDto,\n email: vPublicSignUpWidgetFieldResponseDto,\n name: vPublicSignUpWidgetFieldResponseDto,\n participantCount: vPublicSignUpWidgetFieldResponseDto,\n phone: vPublicSignUpWidgetFieldResponseDto\n});\n\nexport const vPublicSignUpWidgetConfigResponseDto = v.object({\n builtInFields: vPublicSignUpWidgetFieldsResponseDto,\n customFields: v.array(vPublicSignUpWidgetCustomFieldResponseDto)\n});\n\nexport const vPublicSignUpWidgetResponseDto = v.object({\n config: vPublicSignUpWidgetConfigResponseDto,\n coverImageUrl: v.nullable(v.string()),\n description: v.nullable(v.string()),\n eventId: v.nullish(v.pipe(v.string(), v.uuid())),\n id: v.string(),\n isActive: v.boolean(),\n name: v.string(),\n slug: v.string(),\n title: v.nullable(v.string())\n});\n\nexport const vPublicSignUpWidgetSubmissionRequestDto = v.object({\n address: v.nullish(vPublicSignUpWidgetAddressRequestDto),\n answers: v.optional(v.array(vPublicSignUpWidgetAnswerRequestDto)),\n email: v.nullish(v.pipe(v.string(), v.email())),\n honeypot: v.optional(v.string()),\n name: v.string(),\n participantCount: v.nullish(v.pipe(v.number(), v.minValue(1))),\n phone: v.nullish(v.string()),\n submissionReference: v.optional(v.pipe(v.string(), v.uuid()))\n});\n\nexport const vPublicSignUpWidgetSubmissionResponseDto = v.object({\n id: v.string(),\n submittedAt: v.pipe(v.string(), v.isoTimestamp())\n});\n","import {\n array,\n boolean,\n check,\n looseObject,\n minLength,\n minValue,\n nonEmpty,\n nullable,\n number,\n object,\n optional,\n parse,\n picklist,\n pipe,\n safeInteger,\n string,\n transform,\n union,\n unknown,\n variant,\n} from \"valibot\";\n\nexport const nonEmptyStringSchema = pipe(\n string(),\n nonEmpty(),\n check((value) => value.trim().length > 0)\n);\nexport const optionalNullableStringSchema = optional(nullable(string()), null);\n\nexport function safeIntegerSchema(minimum: number) {\n return pipe(number(), safeInteger(), minValue(minimum));\n}\n\nconst activeRecordsSchema = pipe(\n array(unknown()),\n transform((values) =>\n values.filter((value) => {\n const { archivedAt } = parse(\n looseObject({\n archivedAt: optional(nullable(nonEmptyStringSchema)),\n }),\n value\n );\n return !archivedAt;\n })\n )\n);\n\nconst customFieldOptionSchema = object({\n id: nonEmptyStringSchema,\n label: nonEmptyStringSchema,\n});\n\nconst customFieldOptionsSchema = pipe(\n activeRecordsSchema,\n array(customFieldOptionSchema),\n minLength(2),\n check(\n (values) => new Set(values.map(({ id }) => id)).size === values.length,\n \"Expected unique custom field option IDs.\"\n )\n);\n\nconst customFieldBaseEntries = {\n id: nonEmptyStringSchema,\n label: nonEmptyStringSchema,\n required: boolean(),\n};\n\nconst customFieldSchema = variant(\"type\", [\n object({\n ...customFieldBaseEntries,\n type: picklist([\"text\", \"textarea\"]),\n }),\n object({\n ...customFieldBaseEntries,\n type: picklist([\"checkbox\"]),\n }),\n object({\n ...customFieldBaseEntries,\n options: customFieldOptionsSchema,\n type: picklist([\"radio\", \"select\"]),\n }),\n object({\n ...customFieldBaseEntries,\n options: customFieldOptionsSchema,\n type: picklist([\"checkboxes\", \"multi_select\"]),\n }),\n]);\n\nexport const customFieldsSchema = pipe(\n optional(activeRecordsSchema, []),\n array(customFieldSchema),\n check(\n (values) => new Set(values.map(({ id }) => id)).size === values.length,\n \"Expected unique custom field IDs.\"\n )\n);\n\nexport const customFieldAnswerSchema = object({\n fieldId: nonEmptyStringSchema,\n value: union([boolean(), string(), array(string())]),\n});\n"],"mappings":"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"}
package/dist/signup.js CHANGED
@@ -1,2 +1,2 @@
1
- import{a as e,c as t,f as n,h as r,i,n as a,o,p as s,r as c,s as l,t as u}from"./transport.js";import{n as d}from"./types.js";import{array as f,boolean as p,check as m,nullable as h,object as g,optional as _,parser as v,picklist as y,pipe as b,safeParse as x,strictObject as S,string as C,transform as w}from"valibot";const T=S({city:C(),country:C(),line1:C(),line2:_(h(C())),postalCode:C(),state:C()}),E=v(S({address:_(h(T)),answers:_(f(i)),email:_(h(C())),honeypot:_(C()),name:o,participantCount:_(h(t(0))),phone:_(h(C()))})),D=g({enabled:p(),required:p()}),O=b(D,m(({enabled:e,required:t})=>e||!t,`A disabled signup field cannot be required.`)),k=b(D,m(({enabled:e,required:t})=>e&&t,`The signup name field must be enabled and required.`)),A=b(g({config:g({builtInFields:g({address:O,email:O,name:k,participantCount:O,phone:O}),customFields:e}),coverImageUrl:l,description:l,id:o,isActive:p(),name:o,slug:o,title:l}),w(({config:e,...t})=>({...t,customFields:e.customFields,fields:e.builtInFields}))),j=b(s,m(({id:e})=>!!e.trim(),`Invalid signup submission ID.`)),M=v(A),N=v(n);function P(e){return M(N(e))}const F=v(j),I=g({code:y([`SIGN_UP_WIDGET_PHONE_INVALID`,`SIGN_UP_WIDGET_PHONE_REQUIRED`])});async function L(e){if(e.status===400)try{let t=x(I,await e.json());return t.success?t.output.code:void 0}catch{}}function R(e,t,n){return e instanceof d?e:n(new d({code:`signup_submit_failed`,message:`Unable to submit Lockerverse signup.`,operation:`submit_signup`,recoveryRecommended:t,reportable:t}))}function z(e){let t=r(e),n=a({communitySlug:t.communitySlugValue,environment:t.environment,getContext:()=>({signupSlug:t.signupSlugValue}),onError:t.onError,resourceContextName:`lockerverse_signup`,sentryDsn:t.sentryDsn}),{requestJson:i}=u(t.fetchImplementation,e=>n(e.operation===`submit_signup`&&!e.recoveryRecommended?new d({code:e.code,message:e.message,operation:e.operation,recoveryRecommended:!0,reportable:e.reportable,...e.serverCode===void 0?void 0:{serverCode:e.serverCode},...e.status===void 0?void 0:{status:e.status}}):e),t.requestTimeoutMs),o=`${t.apiBaseUrl}/community/${t.communitySlug}/sign-up-widgets/${t.signupSlug}`;return{async load(){let e={code:`signup_load_failed`,message:`Unable to load Lockerverse signup.`,operation:`load_signup`},t=await i(o,void 0,P,e,e);if(!t.ok)throw n(new d({...e,reportable:t.response.status>=500,status:t.response.status}));return c(t.value)},async submit(e,t){let r=t?.submissionReference??globalThis.crypto.randomUUID(),a={code:`signup_submit_failed`,message:`Unable to submit Lockerverse signup.`,operation:`submit_signup`},s;try{s=E(e)}catch{throw n(new d({...a,message:`Lockerverse signup input is invalid.`,reportable:!1}))}let l=!1;try{let e=JSON.stringify({...s,submissionReference:r});l=!0;let t=await i(`${o}/submissions`,{body:e,headers:{"content-type":`application/json`},method:`POST`},F,a,a);if(!t.ok){let e=await L(t.response);throw n(new d({...a,recoveryRecommended:t.response.status>=500,reportable:t.response.status>=500,...e===void 0?void 0:{serverCode:e},status:t.response.status}))}let u=c(t.value);if(u.id!==r)throw n(new d({...a,recoveryRecommended:!0,reportable:!0}));return u}catch(e){throw R(e,l,n)}}}}export{z as createLockerverseSignupClient};
1
+ import{a as e,i as t,n,t as r}from"./transport.js";import{n as i}from"./types.js";import{a,i as o,l as s,n as c,r as l,t as u,u as d}from"./schema-helpers.js";import{array as f,boolean as p,check as m,nullable as h,object as g,optional as _,parser as v,picklist as y,pipe as b,safeParse as x,strictObject as S,string as C,transform as w}from"valibot";const T=S({city:C(),country:C(),line1:C(),line2:_(h(C())),postalCode:C(),state:C()}),E=v(S({address:_(h(T)),answers:_(f(u)),email:_(h(C())),honeypot:_(C()),name:l,participantCount:_(h(a(0))),phone:_(h(C()))})),D=g({enabled:p(),required:p()}),O=b(D,m(({enabled:e,required:t})=>e||!t,`A disabled signup field cannot be required.`)),k=b(D,m(({enabled:e,required:t})=>e&&t,`The signup name field must be enabled and required.`)),A=b(g({config:g({builtInFields:g({address:O,email:O,name:k,participantCount:O,phone:O}),customFields:c}),coverImageUrl:o,description:o,id:l,isActive:p(),name:l,slug:l,title:o}),w(({config:e,...t})=>({...t,customFields:e.customFields,fields:e.builtInFields}))),j=b(d,m(({id:e})=>!!e.trim(),`Invalid signup submission ID.`)),M=v(A),N=v(s);function P(e){return M(N(e))}const F=v(j),I=g({code:y([`SIGN_UP_WIDGET_PHONE_INVALID`,`SIGN_UP_WIDGET_PHONE_REQUIRED`])});async function L(e){if(e.status===400)try{let t=x(I,await e.json());return t.success?t.output.code:void 0}catch{}}function R(e,t,n){return e instanceof i?e:n(new i({code:`signup_submit_failed`,message:`Unable to submit Lockerverse signup.`,operation:`submit_signup`,recoveryRecommended:t,reportable:t}))}function z(a){let o=t(a),s=n({communitySlug:o.communitySlugValue,environment:o.environment,getContext:()=>({signupSlug:o.signupSlugValue}),onError:o.onError,resourceContextName:`lockerverse_signup`,sentryDsn:o.sentryDsn}),{requestJson:c}=r(o.fetchImplementation,e=>s(e.operation===`submit_signup`&&!e.recoveryRecommended?new i({code:e.code,message:e.message,operation:e.operation,recoveryRecommended:!0,reportable:e.reportable,...e.serverCode===void 0?void 0:{serverCode:e.serverCode},...e.status===void 0?void 0:{status:e.status}}):e),o.requestTimeoutMs),l=`${o.apiBaseUrl}/community/${o.communitySlug}/sign-up-widgets/${o.signupSlug}`;return{async load(){let t={code:`signup_load_failed`,message:`Unable to load Lockerverse signup.`,operation:`load_signup`},n=await c(l,void 0,P,t,t);if(!n.ok)throw s(new i({...t,reportable:n.response.status>=500,status:n.response.status}));return e(n.value)},async submit(t,n){let r=n?.submissionReference??globalThis.crypto.randomUUID(),a={code:`signup_submit_failed`,message:`Unable to submit Lockerverse signup.`,operation:`submit_signup`},o;try{o=E(t)}catch{throw s(new i({...a,message:`Lockerverse signup input is invalid.`,reportable:!1}))}let u=!1;try{let t=JSON.stringify({...o,submissionReference:r});u=!0;let n=await c(`${l}/submissions`,{body:t,headers:{"content-type":`application/json`},method:`POST`},F,a,a);if(!n.ok){let e=await L(n.response);throw s(new i({...a,recoveryRecommended:n.response.status>=500,reportable:n.response.status>=500,...e===void 0?void 0:{serverCode:e},status:n.response.status}))}let d=e(n.value);if(d.id!==r)throw s(new i({...a,recoveryRecommended:!0,reportable:!0}));return d}catch(e){throw R(e,u,s)}}}}export{z as createLockerverseSignupClient};
2
2
  //# sourceMappingURL=signup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"signup.js","names":[],"sources":["../src/signup-input-schema.ts","../src/signup-schemas.ts","../src/signup.ts"],"sourcesContent":["import {\n array,\n nullable,\n optional,\n parser,\n strictObject,\n string,\n} from \"valibot\";\n\nimport {\n customFieldAnswerSchema,\n nonEmptyStringSchema,\n safeIntegerSchema,\n} from \"./schema-helpers.ts\";\n\nconst signupAddressSchema = strictObject({\n city: string(),\n country: string(),\n line1: string(),\n line2: optional(nullable(string())),\n postalCode: string(),\n state: string(),\n});\n\nexport const parseSignupSubmission = parser(\n strictObject({\n address: optional(nullable(signupAddressSchema)),\n answers: optional(array(customFieldAnswerSchema)),\n email: optional(nullable(string())),\n honeypot: optional(string()),\n name: nonEmptyStringSchema,\n participantCount: optional(nullable(safeIntegerSchema(0))),\n phone: optional(nullable(string())),\n })\n);\n","import { boolean, check, object, parser, pipe, transform } from \"valibot\";\n\nimport {\n vPublicSignUpWidgetResponseDto,\n vPublicSignUpWidgetSubmissionResponseDto,\n} from \"./generated/public-api/valibot.gen.ts\";\nimport {\n customFieldsSchema,\n nonEmptyStringSchema,\n optionalNullableStringSchema,\n} from \"./schema-helpers.ts\";\n\nconst signupFieldSchema = object({\n enabled: boolean(),\n required: boolean(),\n});\n\nconst optionalSignupFieldSchema = pipe(\n signupFieldSchema,\n check(\n ({ enabled, required }) => enabled || !required,\n \"A disabled signup field cannot be required.\"\n )\n);\n\nconst requiredNameFieldSchema = pipe(\n signupFieldSchema,\n check(\n ({ enabled, required }) => enabled && required,\n \"The signup name field must be enabled and required.\"\n )\n);\n\nexport const publicSignupSchema = pipe(\n object({\n config: object({\n builtInFields: object({\n address: optionalSignupFieldSchema,\n email: optionalSignupFieldSchema,\n name: requiredNameFieldSchema,\n participantCount: optionalSignupFieldSchema,\n phone: optionalSignupFieldSchema,\n }),\n customFields: customFieldsSchema,\n }),\n coverImageUrl: optionalNullableStringSchema,\n description: optionalNullableStringSchema,\n id: nonEmptyStringSchema,\n isActive: boolean(),\n name: nonEmptyStringSchema,\n slug: nonEmptyStringSchema,\n title: optionalNullableStringSchema,\n }),\n transform(({ config, ...signup }) => ({\n ...signup,\n customFields: config.customFields,\n fields: config.builtInFields,\n }))\n);\n\nexport const signupSubmissionResultSchema = pipe(\n vPublicSignUpWidgetSubmissionResponseDto,\n check(({ id }) => Boolean(id.trim()), \"Invalid signup submission ID.\")\n);\n\nconst parseSdkPublicSignup = parser(publicSignupSchema);\nconst parsePublicSignupContract = parser(vPublicSignUpWidgetResponseDto);\n\nexport function parsePublicSignup<Input>(input: Input) {\n return parseSdkPublicSignup(parsePublicSignupContract(input));\n}\n\nexport const parseSignupSubmissionResult = parser(signupSubmissionResultSchema);\n","import { object, picklist, safeParse } from \"valibot\";\nimport { deepFreeze } from \"./deep-freeze.ts\";\nimport { resolveSignupEnvironment } from \"./environment.ts\";\nimport { createSdkErrorReporter } from \"./error-reporting.ts\";\nimport { parseSignupSubmission } from \"./signup-input-schema.ts\";\nimport {\n parsePublicSignup,\n parseSignupSubmissionResult,\n} from \"./signup-schemas.ts\";\nimport type {\n CreateLockerverseSignupOptions,\n LockerverseSignupClient,\n LockerverseSignupSubmission,\n} from \"./signup-types.ts\";\nimport { createTransport } from \"./transport.ts\";\nimport { LockerverseSdkError, type LockerverseSdkServerCode } from \"./types.ts\";\n\nconst signupSubmitServerErrorSchema = object({\n code: picklist([\n \"SIGN_UP_WIDGET_PHONE_INVALID\",\n \"SIGN_UP_WIDGET_PHONE_REQUIRED\",\n ]),\n});\n\nasync function readSignupSubmitServerCode(\n response: Response\n): Promise<LockerverseSdkServerCode | undefined> {\n if (response.status !== 400) {\n return;\n }\n try {\n const result = safeParse(\n signupSubmitServerErrorSchema,\n await response.json()\n );\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 classifySubmissionError<ErrorValue>(\n error: ErrorValue,\n requestAttempted: boolean,\n reportError: (error: LockerverseSdkError) => LockerverseSdkError\n) {\n if (error instanceof LockerverseSdkError) {\n return error;\n }\n return reportError(\n new LockerverseSdkError({\n code: \"signup_submit_failed\",\n message: \"Unable to submit Lockerverse signup.\",\n operation: \"submit_signup\",\n recoveryRecommended: requestAttempted,\n reportable: requestAttempted,\n })\n );\n}\n\nexport function createLockerverseSignupClient(\n options: CreateLockerverseSignupOptions\n): LockerverseSignupClient {\n const runtime = resolveSignupEnvironment(options);\n const reportError = createSdkErrorReporter({\n communitySlug: runtime.communitySlugValue,\n environment: runtime.environment,\n getContext: () => ({ signupSlug: runtime.signupSlugValue }),\n onError: runtime.onError,\n resourceContextName: \"lockerverse_signup\",\n sentryDsn: runtime.sentryDsn,\n });\n const { requestJson } = createTransport(\n runtime.fetchImplementation,\n (error) =>\n reportError(\n error.operation === \"submit_signup\" && !error.recoveryRecommended\n ? new LockerverseSdkError({\n code: error.code,\n message: error.message,\n operation: error.operation,\n recoveryRecommended: true,\n reportable: error.reportable,\n ...(error.serverCode === undefined\n ? undefined\n : { serverCode: error.serverCode }),\n ...(error.status === undefined\n ? undefined\n : { status: error.status }),\n })\n : error\n ),\n runtime.requestTimeoutMs\n );\n const signupUrl = `${runtime.apiBaseUrl}/community/${runtime.communitySlug}/sign-up-widgets/${runtime.signupSlug}`;\n\n return {\n async load() {\n const errorContext = {\n code: \"signup_load_failed\" as const,\n message: \"Unable to load Lockerverse signup.\",\n operation: \"load_signup\" as const,\n };\n const signupResponse = await requestJson(\n signupUrl,\n undefined,\n parsePublicSignup,\n errorContext,\n errorContext\n );\n if (!signupResponse.ok) {\n throw reportError(\n new LockerverseSdkError({\n ...errorContext,\n reportable: signupResponse.response.status >= 500,\n status: signupResponse.response.status,\n })\n );\n }\n return deepFreeze(signupResponse.value);\n },\n async submit(submission: LockerverseSignupSubmission, submitOptions) {\n const submissionReference =\n submitOptions?.submissionReference ?? globalThis.crypto.randomUUID();\n const errorContext = {\n code: \"signup_submit_failed\" as const,\n message: \"Unable to submit Lockerverse signup.\",\n operation: \"submit_signup\" as const,\n };\n let parsedSubmission: ReturnType<typeof parseSignupSubmission>;\n try {\n parsedSubmission = parseSignupSubmission(submission);\n } catch {\n // biome-ignore lint/style/useErrorCause: Raw validation errors must not escape the SDK boundary.\n throw reportError(\n new LockerverseSdkError({\n ...errorContext,\n message: \"Lockerverse signup input is invalid.\",\n reportable: false,\n })\n );\n }\n\n let requestAttempted = false;\n try {\n const body = JSON.stringify({\n ...parsedSubmission,\n submissionReference,\n });\n requestAttempted = true;\n const submissionResponse = await requestJson(\n `${signupUrl}/submissions`,\n {\n body,\n headers: { \"content-type\": \"application/json\" },\n method: \"POST\",\n },\n parseSignupSubmissionResult,\n errorContext,\n errorContext\n );\n if (!submissionResponse.ok) {\n const serverCode = await readSignupSubmitServerCode(\n submissionResponse.response\n );\n throw reportError(\n new LockerverseSdkError({\n ...errorContext,\n recoveryRecommended: submissionResponse.response.status >= 500,\n reportable: submissionResponse.response.status >= 500,\n ...(serverCode === undefined ? undefined : { serverCode }),\n status: submissionResponse.response.status,\n })\n );\n }\n const result = deepFreeze(submissionResponse.value);\n if (result.id !== submissionReference) {\n throw reportError(\n new LockerverseSdkError({\n ...errorContext,\n recoveryRecommended: true,\n reportable: true,\n })\n );\n }\n return result;\n } catch (error) {\n throw classifySubmissionError(error, requestAttempted, reportError);\n }\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"signup.js","names":[],"sources":["../src/signup-input-schema.ts","../src/signup-schemas.ts","../src/signup.ts"],"sourcesContent":["import {\n array,\n nullable,\n optional,\n parser,\n strictObject,\n string,\n} from \"valibot\";\n\nimport {\n customFieldAnswerSchema,\n nonEmptyStringSchema,\n safeIntegerSchema,\n} from \"./schema-helpers.ts\";\n\nconst signupAddressSchema = strictObject({\n city: string(),\n country: string(),\n line1: string(),\n line2: optional(nullable(string())),\n postalCode: string(),\n state: string(),\n});\n\nexport const parseSignupSubmission = parser(\n strictObject({\n address: optional(nullable(signupAddressSchema)),\n answers: optional(array(customFieldAnswerSchema)),\n email: optional(nullable(string())),\n honeypot: optional(string()),\n name: nonEmptyStringSchema,\n participantCount: optional(nullable(safeIntegerSchema(0))),\n phone: optional(nullable(string())),\n })\n);\n","import { boolean, check, object, parser, pipe, transform } from \"valibot\";\n\nimport {\n vPublicSignUpWidgetResponseDto,\n vPublicSignUpWidgetSubmissionResponseDto,\n} from \"./generated/public-api/valibot.gen.ts\";\nimport {\n customFieldsSchema,\n nonEmptyStringSchema,\n optionalNullableStringSchema,\n} from \"./schema-helpers.ts\";\n\nconst signupFieldSchema = object({\n enabled: boolean(),\n required: boolean(),\n});\n\nconst optionalSignupFieldSchema = pipe(\n signupFieldSchema,\n check(\n ({ enabled, required }) => enabled || !required,\n \"A disabled signup field cannot be required.\"\n )\n);\n\nconst requiredNameFieldSchema = pipe(\n signupFieldSchema,\n check(\n ({ enabled, required }) => enabled && required,\n \"The signup name field must be enabled and required.\"\n )\n);\n\nexport const publicSignupSchema = pipe(\n object({\n config: object({\n builtInFields: object({\n address: optionalSignupFieldSchema,\n email: optionalSignupFieldSchema,\n name: requiredNameFieldSchema,\n participantCount: optionalSignupFieldSchema,\n phone: optionalSignupFieldSchema,\n }),\n customFields: customFieldsSchema,\n }),\n coverImageUrl: optionalNullableStringSchema,\n description: optionalNullableStringSchema,\n id: nonEmptyStringSchema,\n isActive: boolean(),\n name: nonEmptyStringSchema,\n slug: nonEmptyStringSchema,\n title: optionalNullableStringSchema,\n }),\n transform(({ config, ...signup }) => ({\n ...signup,\n customFields: config.customFields,\n fields: config.builtInFields,\n }))\n);\n\nexport const signupSubmissionResultSchema = pipe(\n vPublicSignUpWidgetSubmissionResponseDto,\n check(({ id }) => Boolean(id.trim()), \"Invalid signup submission ID.\")\n);\n\nconst parseSdkPublicSignup = parser(publicSignupSchema);\nconst parsePublicSignupContract = parser(vPublicSignUpWidgetResponseDto);\n\nexport function parsePublicSignup<Input>(input: Input) {\n return parseSdkPublicSignup(parsePublicSignupContract(input));\n}\n\nexport const parseSignupSubmissionResult = parser(signupSubmissionResultSchema);\n","import { object, picklist, safeParse } from \"valibot\";\nimport { deepFreeze } from \"./deep-freeze.ts\";\nimport { resolveSignupEnvironment } from \"./environment.ts\";\nimport { createSdkErrorReporter } from \"./error-reporting.ts\";\nimport { parseSignupSubmission } from \"./signup-input-schema.ts\";\nimport {\n parsePublicSignup,\n parseSignupSubmissionResult,\n} from \"./signup-schemas.ts\";\nimport type {\n CreateLockerverseSignupOptions,\n LockerverseSignupClient,\n LockerverseSignupSubmission,\n} from \"./signup-types.ts\";\nimport { createTransport } from \"./transport.ts\";\nimport { LockerverseSdkError, type LockerverseSdkServerCode } from \"./types.ts\";\n\nconst signupSubmitServerErrorSchema = object({\n code: picklist([\n \"SIGN_UP_WIDGET_PHONE_INVALID\",\n \"SIGN_UP_WIDGET_PHONE_REQUIRED\",\n ]),\n});\n\nasync function readSignupSubmitServerCode(\n response: Response\n): Promise<LockerverseSdkServerCode | undefined> {\n if (response.status !== 400) {\n return;\n }\n try {\n const result = safeParse(\n signupSubmitServerErrorSchema,\n await response.json()\n );\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 classifySubmissionError<ErrorValue>(\n error: ErrorValue,\n requestAttempted: boolean,\n reportError: (error: LockerverseSdkError) => LockerverseSdkError\n) {\n if (error instanceof LockerverseSdkError) {\n return error;\n }\n return reportError(\n new LockerverseSdkError({\n code: \"signup_submit_failed\",\n message: \"Unable to submit Lockerverse signup.\",\n operation: \"submit_signup\",\n recoveryRecommended: requestAttempted,\n reportable: requestAttempted,\n })\n );\n}\n\nexport function createLockerverseSignupClient(\n options: CreateLockerverseSignupOptions\n): LockerverseSignupClient {\n const runtime = resolveSignupEnvironment(options);\n const reportError = createSdkErrorReporter({\n communitySlug: runtime.communitySlugValue,\n environment: runtime.environment,\n getContext: () => ({ signupSlug: runtime.signupSlugValue }),\n onError: runtime.onError,\n resourceContextName: \"lockerverse_signup\",\n sentryDsn: runtime.sentryDsn,\n });\n const { requestJson } = createTransport(\n runtime.fetchImplementation,\n (error) =>\n reportError(\n error.operation === \"submit_signup\" && !error.recoveryRecommended\n ? new LockerverseSdkError({\n code: error.code,\n message: error.message,\n operation: error.operation,\n recoveryRecommended: true,\n reportable: error.reportable,\n ...(error.serverCode === undefined\n ? undefined\n : { serverCode: error.serverCode }),\n ...(error.status === undefined\n ? undefined\n : { status: error.status }),\n })\n : error\n ),\n runtime.requestTimeoutMs\n );\n const signupUrl = `${runtime.apiBaseUrl}/community/${runtime.communitySlug}/sign-up-widgets/${runtime.signupSlug}`;\n\n return {\n async load() {\n const errorContext = {\n code: \"signup_load_failed\" as const,\n message: \"Unable to load Lockerverse signup.\",\n operation: \"load_signup\" as const,\n };\n const signupResponse = await requestJson(\n signupUrl,\n undefined,\n parsePublicSignup,\n errorContext,\n errorContext\n );\n if (!signupResponse.ok) {\n throw reportError(\n new LockerverseSdkError({\n ...errorContext,\n reportable: signupResponse.response.status >= 500,\n status: signupResponse.response.status,\n })\n );\n }\n return deepFreeze(signupResponse.value);\n },\n async submit(submission: LockerverseSignupSubmission, submitOptions) {\n const submissionReference =\n submitOptions?.submissionReference ?? globalThis.crypto.randomUUID();\n const errorContext = {\n code: \"signup_submit_failed\" as const,\n message: \"Unable to submit Lockerverse signup.\",\n operation: \"submit_signup\" as const,\n };\n let parsedSubmission: ReturnType<typeof parseSignupSubmission>;\n try {\n parsedSubmission = parseSignupSubmission(submission);\n } catch {\n // biome-ignore lint/style/useErrorCause: Raw validation errors must not escape the SDK boundary.\n throw reportError(\n new LockerverseSdkError({\n ...errorContext,\n message: \"Lockerverse signup input is invalid.\",\n reportable: false,\n })\n );\n }\n\n let requestAttempted = false;\n try {\n const body = JSON.stringify({\n ...parsedSubmission,\n submissionReference,\n });\n requestAttempted = true;\n const submissionResponse = await requestJson(\n `${signupUrl}/submissions`,\n {\n body,\n headers: { \"content-type\": \"application/json\" },\n method: \"POST\",\n },\n parseSignupSubmissionResult,\n errorContext,\n errorContext\n );\n if (!submissionResponse.ok) {\n const serverCode = await readSignupSubmitServerCode(\n submissionResponse.response\n );\n throw reportError(\n new LockerverseSdkError({\n ...errorContext,\n recoveryRecommended: submissionResponse.response.status >= 500,\n reportable: submissionResponse.response.status >= 500,\n ...(serverCode === undefined ? undefined : { serverCode }),\n status: submissionResponse.response.status,\n })\n );\n }\n const result = deepFreeze(submissionResponse.value);\n if (result.id !== submissionReference) {\n throw reportError(\n new LockerverseSdkError({\n ...errorContext,\n recoveryRecommended: true,\n reportable: true,\n })\n );\n }\n return result;\n } catch (error) {\n throw classifySubmissionError(error, requestAttempted, reportError);\n }\n },\n };\n}\n"],"mappings":"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"}
package/dist/transport.js CHANGED
@@ -1,2 +1,2 @@
1
- import{n as e}from"./types.js";import*as t from"valibot";import{ValiError as n,array as r,boolean as i,check as a,custom as o,function_ as s,is as c,looseObject as l,maxValue as u,minLength as d,minValue as f,nonEmpty as p,nullable as m,number as h,object as g,optional as _,parse as v,picklist as y,pipe as b,safeInteger as x,string as S,transform as ee,union as C,unknown as w,variant as te}from"valibot";const T=/\/+$/,E=new Set([`localhost`,`127.0.0.1`,`[::1]`]),D={development:{sentryDsn:`https://1977371f7bc44480935a7bc9726ca296@o1338376.ingest.sentry.io/6631829`},production:{sentryDsn:`https://43d2d853c129415cf77531c914511174@o1338376.ingest.us.sentry.io/4511911476133888`}};function ne(e,t){let n;try{n=new URL(e)}catch{throw TypeError(`apiBaseUrl must be a valid HTTP or HTTPS URL.`)}if(n.protocol!==`http:`&&n.protocol!==`https:`)throw TypeError(`apiBaseUrl must be a valid HTTP or HTTPS URL.`);if(n.username||n.password)throw TypeError(`apiBaseUrl must not include credentials.`);if(n.search||n.hash)throw TypeError(`apiBaseUrl must not include a query or fragment.`);if(n.protocol!==`https:`&&!(t===`development`&&E.has(n.hostname)))throw TypeError(`apiBaseUrl must use HTTPS except for development loopback endpoints.`);return n.pathname=n.pathname.replace(T,``),n.toString().replace(T,``)}function re(e,t){let r=`requestTimeoutMs must be a positive integer no greater than 2147483647.`,i=e=>b(S(`${e} must be a non-empty string.`),a(e=>e.trim().length>0,`${e} must be a non-empty string.`));try{let n=v(l({apiBaseUrl:_(S(`apiBaseUrl must be a valid HTTP or HTTPS URL.`)),communitySlug:i(`communitySlug`),environment:_(y([`development`,`production`],`environment must be either development or production.`)),fetch:_(o(e=>c(s(),e),`fetch must be a function when provided.`)),onError:_(o(e=>c(s(),e),`onError must be a function when provided.`)),requestTimeoutMs:_(b(h(r),x(r),f(1,r),u(2147483647,r))),sentryDsn:_(m(S(`sentryDsn must be a string or null when provided.`)))},`Expected an object.`),e);return{apiBaseUrl:n.apiBaseUrl,communitySlug:n.communitySlug,environment:n.environment,fetch:n.fetch,onError:n.onError,requestTimeoutMs:n.requestTimeoutMs,resourceSlugValue:v(i(t),n[t]),sentryDsn:n.sentryDsn}}catch(e){let t=e instanceof n?e.issues[0]?.message??`Invalid SDK options.`:`Invalid SDK options.`;throw TypeError(t)}}function O(e,t){let n=re(e,t),r=n.environment;if(n.apiBaseUrl!==void 0&&r===void 0)throw TypeError(`environment is required when apiBaseUrl is provided.`);if(n.apiBaseUrl===void 0&&r===`development`)throw TypeError(`apiBaseUrl is required when environment is development.`);let i=r===void 0?`production`:r,{communitySlug:a,resourceSlugValue:o}=n,s=n.fetch??globalThis.fetch,c=n.apiBaseUrl===void 0?`https://portal.lockerverse.com/api`:ne(n.apiBaseUrl,i),l=D[i],u=n.sentryDsn,d=u===null?null:u??l.sentryDsn;return{apiBaseUrl:c,communitySlug:encodeURIComponent(a),communitySlugValue:a,environment:i,fetchImplementation:s,onError:n.onError,requestTimeoutMs:n.requestTimeoutMs??2e4,resourceSlug:encodeURIComponent(o),resourceSlugValue:o,sentryDsn:d}}function ie(e){let t=O(e,`signupSlug`);return{...t,signupSlug:t.resourceSlug,signupSlugValue:t.resourceSlugValue}}const ae=t.object({percentageOff:t.number(),source:t.picklist([`email_list`,`promo_code`])}),k=t.object({acceptsDiscounts:t.boolean(),eventId:t.nullable(t.string()),fulfillmentType:t.picklist([`none`,`event_admission`]),listingId:t.string(),listingSlug:t.string(),paymentOption:t.picklist([`one-time`,`monthly`,`annually`]),pricingMode:t.picklist([`fixed`,`custom`]),productId:t.string(),productName:t.string(),quantity:t.number(),subtotalCents:t.number(),unitAmountCents:t.number()}),A=t.object({checkoutId:t.string(),checkoutStatus:t.picklist([`action_required`,`failed`,`pending`,`success`]),clientSecret:t.nullable(t.string()),paymentReference:t.string(),paymentRequired:t.boolean(),requiresAction:t.boolean(),status:t.nullable(t.string())}),j=t.object({amountCents:t.number(),appliedDiscount:t.nullable(ae),connectedAccountId:t.nullable(t.string()),discountableSubtotalCents:t.number(),discountCents:t.number(),lineItems:t.array(k),paymentOption:t.picklist([`one-time`,`monthly`,`annually`]),serviceFeeCents:t.number(),subtotalCents:t.number(),tipCents:t.number(),totalCents:t.number()}),M=t.object({name:t.string(),partySize:t.pipe(t.number(),t.minValue(1))});t.object({nextCursor:t.nullable(t.string()),registrations:t.array(M),totalAttendees:t.pipe(t.number(),t.minValue(0))});const N=t.object({connectedAccountId:t.nullable(t.string()),currency:t.picklist([`usd`]),publishableKey:t.string()}),P=t.object({amountCents:t.optional(t.pipe(t.number(),t.minValue(100))),optionId:t.optional(t.pipe(t.string(),t.uuid())),productId:t.optional(t.pipe(t.string(),t.uuid())),quantity:t.optional(t.pipe(t.number(),t.minValue(1)))}),F=t.object({color:t.string(),name:t.string(),thumbnail:t.nullable(t.string())}),I=t.object({fieldId:t.string(),value:t.nullish(t.union([t.boolean(),t.string(),t.array(t.string())]))}),L=t.object({archivedAt:t.nullish(t.string()),id:t.string(),label:t.string()}),R=t.object({archivedAt:t.nullish(t.string()),id:t.string(),label:t.string(),options:t.optional(t.array(L)),required:t.boolean(),type:t.picklist([`text`,`textarea`,`select`,`multi_select`,`radio`,`checkbox`,`checkboxes`])}),z=t.object({description:t.nullable(t.string()),endAt:t.pipe(t.string(),t.isoTimestamp()),id:t.string(),location:t.nullable(t.string()),name:t.string(),startAt:t.pipe(t.string(),t.isoTimestamp()),status:t.picklist([`draft`,`active`,`finished`,`cancelled`])}),B=t.object({percentageOff:t.pipe(t.number(),t.minValue(0),t.maxValue(100)),source:t.picklist([`email_list`,`promo_code`])}),V=t.object({memberId:t.boolean(),merchSize:t.boolean(),phone:t.boolean(),promoCode:t.boolean(),serviceFee:t.boolean(),shipping:t.boolean(),tipping:t.boolean()}),H=t.object({customFields:t.array(R),fields:V}),U=t.object({currency:t.picklist([`usd`]),serviceFeeRateBasisPoints:t.number()}),W=t.object({amountCents:t.nullable(t.number()),description:t.nullable(t.string()),fulfillmentType:t.picklist([`none`,`event_admission`]),id:t.string(),inventoryQuantity:t.nullable(t.number()),maxQuantity:t.nullable(t.number()),minimumAmountCents:t.nullable(t.number()),minQuantity:t.nullable(t.number()),name:t.string(),paymentOption:t.picklist([`one-time`,`monthly`,`annually`]),pricingMode:t.picklist([`fixed`,`custom`])}),G=t.object({acceptsDiscounts:t.boolean(),id:t.string(),maxQuantityPerOrder:t.nullable(t.number()),product:W,productId:t.string(),slug:t.string()});t.object({email:t.optional(t.pipe(t.string(),t.email())),includeServiceFee:t.optional(t.boolean()),items:t.array(P),promoCode:t.optional(t.pipe(t.string(),t.maxLength(255))),tipCents:t.optional(t.pipe(t.number(),t.minValue(0)))});const K=t.object({community:F,config:H,description:t.nullable(t.string()),event:t.nullable(z),id:t.string(),name:t.string(),payment:N,pricingPolicy:U,products:t.array(G),quote:t.optional(j),showCommunityBranding:t.boolean(),title:t.nullable(t.string())}),q=t.object({city:t.string(),country:t.string(),line1:t.string(),line2:t.optional(t.string()),postal_code:t.string(),state:t.string()}),oe=t.object({address:q,name:t.string()});t.object({confirmationToken:t.optional(t.string()),customFieldAnswers:t.optional(t.array(I)),email:t.pipe(t.string(),t.email()),expectedAmountCents:t.optional(t.pipe(t.number(),t.minValue(0))),expectedAppliedDiscount:t.nullish(B),expectedConnectedAccountId:t.nullish(t.string()),expectedDiscountableSubtotalCents:t.optional(t.pipe(t.number(),t.minValue(0))),expectedDiscountCents:t.optional(t.pipe(t.number(),t.minValue(0))),expectedServiceFeeCents:t.optional(t.pipe(t.number(),t.minValue(0))),expectedSubtotalCents:t.optional(t.pipe(t.number(),t.minValue(100))),expectedTipCents:t.optional(t.pipe(t.number(),t.minValue(0))),expectedTotalCents:t.optional(t.pipe(t.number(),t.minValue(0))),includeServiceFee:t.optional(t.boolean()),items:t.array(P),memberId:t.optional(t.string()),merchSize:t.optional(t.picklist([`XS`,`S`,`M`,`L`,`XL`,`XXL`,`XXXL`])),metadata:t.optional(t.record(t.string(),t.string())),name:t.optional(t.pipe(t.string(),t.maxLength(255))),paymentReference:t.optional(t.pipe(t.string(),t.uuid())),phone:t.optional(t.string()),promoCode:t.optional(t.string()),quoteContractVersion:t.optional(t.pipe(t.number(),t.minValue(1),t.maxValue(1))),shipping:t.optional(oe),tipCents:t.optional(t.pipe(t.number(),t.minValue(0)))});const se=t.object({city:t.string(),country:t.string(),line1:t.string(),line2:t.nullish(t.string()),postalCode:t.string(),state:t.string()}),ce=t.object({fieldId:t.string(),value:t.nullish(t.union([t.boolean(),t.string(),t.array(t.string())]))}),le=t.object({archivedAt:t.nullish(t.string()),id:t.string(),label:t.string()}),ue=t.object({archivedAt:t.nullish(t.string()),id:t.string(),label:t.string(),options:t.optional(t.array(le)),required:t.boolean(),type:t.picklist([`text`,`textarea`,`select`,`multi_select`,`radio`,`checkbox`,`checkboxes`])}),J=t.object({enabled:t.boolean(),required:t.boolean()}),de=t.object({address:J,email:J,name:J,participantCount:J,phone:J}),fe=t.object({builtInFields:de,customFields:t.array(ue)}),pe=t.object({config:fe,coverImageUrl:t.nullable(t.string()),description:t.nullable(t.string()),eventId:t.nullish(t.pipe(t.string(),t.uuid())),id:t.string(),isActive:t.boolean(),name:t.string(),slug:t.string(),title:t.nullable(t.string())});t.object({address:t.nullish(se),answers:t.optional(t.array(ce)),email:t.nullish(t.pipe(t.string(),t.email())),honeypot:t.optional(t.string()),name:t.string(),participantCount:t.nullish(t.pipe(t.number(),t.minValue(1))),phone:t.nullish(t.string()),submissionReference:t.optional(t.pipe(t.string(),t.uuid()))});const me=t.object({id:t.string(),submittedAt:t.pipe(t.string(),t.isoTimestamp())}),Y=b(S(),p(),a(e=>e.trim().length>0)),he=_(m(S()),null);function ge(e){return b(h(),x(),f(e))}const X=b(r(w()),ee(e=>e.filter(e=>{let{archivedAt:t}=v(l({archivedAt:_(m(Y))}),e);return!t}))),_e=g({id:Y,label:Y}),Z=b(X,r(_e),d(2),a(e=>new Set(e.map(({id:e})=>e)).size===e.length,`Expected unique custom field option IDs.`)),Q={id:Y,label:Y,required:i()},ve=te(`type`,[g({...Q,type:y([`text`,`textarea`])}),g({...Q,type:y([`checkbox`])}),g({...Q,options:Z,type:y([`radio`,`select`])}),g({...Q,options:Z,type:y([`checkboxes`,`multi_select`])})]),ye=b(_(X,[]),r(ve),a(e=>new Set(e.map(({id:e})=>e)).size===e.length,`Expected unique custom field IDs.`)),be=g({fieldId:Y,value:C([i(),S(),r(S())])});function $(e){let t=new Object(e);if(t!==e||Object.isFrozen(t))return e;for(let e of Object.values(t))$(e);return Object.freeze(e)}function xe(){return globalThis.window}function Se({communitySlug:e,environment:t,getContext:n,onError:r,resourceContextName:i,sentryDsn:a}){let o=null;return function(s){try{Promise.resolve(r?.(s)).catch(()=>void 0)}catch{}let c=xe();if(s.reportable&&a&&c!==void 0){let r=o??import(`./telemetry.js`);o=r;let c={communitySlug:e,...n()},l=s.status===void 0?c:{...c,status:s.status};r.then(({captureSdkError:e})=>e({context:l,contextName:i,dsn:a,environment:t,error:s})).catch(()=>{o===r&&(o=null)})}return s}}function Ce(t,n,r){function i(t){let r=new e({code:t.code,message:t.message,operation:t.operation,reportable:!0});return t.report===!1?r:n(r)}async function a(e,n,a,o,s){let c=new AbortController,l=n?.signal??void 0,u=()=>c.abort(l?.reason);l?.aborted?u():l?.addEventListener(`abort`,u,{once:!0});let d,f=new Promise((e,t)=>{d=()=>t(c.signal.reason??new DOMException(`The request was aborted.`,`AbortError`)),c.signal.aborted?d():c.signal.addEventListener(`abort`,d,{once:!0})}),p=setTimeout(()=>{c.abort(new DOMException(`The request timed out.`,`TimeoutError`))},r);try{let r;try{r=await Promise.race([t(e,{...n,signal:c.signal}),f])}catch{throw i(o)}if(!r.ok)return{ok:!1,response:r};try{let e=await Promise.race([r.json(),f]);return{ok:!0,response:r,value:a(e)}}catch{throw i(s)}}finally{clearTimeout(p),l?.removeEventListener(`abort`,u),d&&c.signal.removeEventListener(`abort`,d)}}return{requestJson:a}}export{ye as a,ge as c,K as d,pe as f,ie as h,be as i,A as l,O as m,Se as n,Y as o,me as p,$ as r,he as s,Ce as t,j as u};
1
+ import{n as e}from"./types.js";import{ValiError as t,check as n,custom as r,function_ as i,is as a,looseObject as o,maxValue as s,minValue as c,nullable as l,number as u,optional as d,parse as f,picklist as p,pipe as m,safeInteger as h,string as g}from"valibot";function _(e){let t=new Object(e);if(t!==e||Object.isFrozen(t))return e;for(let e of Object.values(t))_(e);return Object.freeze(e)}const v=/\/+$/,y=new Set([`localhost`,`127.0.0.1`,`[::1]`]),b={development:{sentryDsn:`https://1977371f7bc44480935a7bc9726ca296@o1338376.ingest.sentry.io/6631829`},production:{sentryDsn:`https://43d2d853c129415cf77531c914511174@o1338376.ingest.us.sentry.io/4511911476133888`}};function x(e,t){let n;try{n=new URL(e)}catch{throw TypeError(`apiBaseUrl must be a valid HTTP or HTTPS URL.`)}if(n.protocol!==`http:`&&n.protocol!==`https:`)throw TypeError(`apiBaseUrl must be a valid HTTP or HTTPS URL.`);if(n.username||n.password)throw TypeError(`apiBaseUrl must not include credentials.`);if(n.search||n.hash)throw TypeError(`apiBaseUrl must not include a query or fragment.`);if(n.protocol!==`https:`&&!(t===`development`&&y.has(n.hostname)))throw TypeError(`apiBaseUrl must use HTTPS except for development loopback endpoints.`);return n.pathname=n.pathname.replace(v,``),n.toString().replace(v,``)}function S(e,_){let v=`requestTimeoutMs must be a positive integer no greater than 2147483647.`,y=e=>m(g(`${e} must be a non-empty string.`),n(e=>e.trim().length>0,`${e} must be a non-empty string.`));try{let t=f(o({apiBaseUrl:d(g(`apiBaseUrl must be a valid HTTP or HTTPS URL.`)),communitySlug:y(`communitySlug`),environment:d(p([`development`,`production`],`environment must be either development or production.`)),fetch:d(r(e=>a(i(),e),`fetch must be a function when provided.`)),onError:d(r(e=>a(i(),e),`onError must be a function when provided.`)),requestTimeoutMs:d(m(u(v),h(v),c(1,v),s(2147483647,v))),sentryDsn:d(l(g(`sentryDsn must be a string or null when provided.`)))},`Expected an object.`),e);return{apiBaseUrl:t.apiBaseUrl,communitySlug:t.communitySlug,environment:t.environment,fetch:t.fetch,onError:t.onError,requestTimeoutMs:t.requestTimeoutMs,resourceSlugValue:f(y(_),t[_]),sentryDsn:t.sentryDsn}}catch(e){let n=e instanceof t?e.issues[0]?.message??`Invalid SDK options.`:`Invalid SDK options.`;throw TypeError(n)}}function C(e,t){let n=S(e,t),r=n.environment;if(n.apiBaseUrl!==void 0&&r===void 0)throw TypeError(`environment is required when apiBaseUrl is provided.`);if(n.apiBaseUrl===void 0&&r===`development`)throw TypeError(`apiBaseUrl is required when environment is development.`);let i=r===void 0?`production`:r,{communitySlug:a,resourceSlugValue:o}=n,s=n.fetch??globalThis.fetch,c=n.apiBaseUrl===void 0?`https://portal.lockerverse.com/api`:x(n.apiBaseUrl,i),l=b[i],u=n.sentryDsn,d=u===null?null:u??l.sentryDsn;return{apiBaseUrl:c,communitySlug:encodeURIComponent(a),communitySlugValue:a,environment:i,fetchImplementation:s,onError:n.onError,requestTimeoutMs:n.requestTimeoutMs??2e4,resourceSlug:encodeURIComponent(o),resourceSlugValue:o,sentryDsn:d}}function w(e){let t=C(e,`signupSlug`);return{...t,signupSlug:t.resourceSlug,signupSlugValue:t.resourceSlugValue}}function T(){return globalThis.window}function E({communitySlug:e,environment:t,getContext:n,onError:r,resourceContextName:i,sentryDsn:a}){let o=null;return function(s){try{Promise.resolve(r?.(s)).catch(()=>void 0)}catch{}let c=T();if(s.reportable&&a&&c!==void 0){let r=o??import(`./telemetry.js`);o=r;let c={communitySlug:e,...n()},l=s.status===void 0?c:{...c,status:s.status};r.then(({captureSdkError:e})=>e({context:l,contextName:i,dsn:a,environment:t,error:s})).catch(()=>{o===r&&(o=null)})}return s}}function D(t,n,r){function i(t){let r=new e({code:t.code,message:t.message,operation:t.operation,reportable:!0});return t.report===!1?r:n(r)}async function a(e,n,a,o,s){let c=new AbortController,l=n?.signal??void 0,u=()=>c.abort(l?.reason);l?.aborted?u():l?.addEventListener(`abort`,u,{once:!0});let d,f=new Promise((e,t)=>{d=()=>t(c.signal.reason??new DOMException(`The request was aborted.`,`AbortError`)),c.signal.aborted?d():c.signal.addEventListener(`abort`,d,{once:!0})}),p=setTimeout(()=>{c.abort(new DOMException(`The request timed out.`,`TimeoutError`))},r);try{let r;try{r=await Promise.race([t(e,{...n,signal:c.signal}),f])}catch{throw i(o)}if(!r.ok)return{ok:!1,response:r};try{let e=await Promise.race([r.json(),f]);return{ok:!0,response:r,value:a(e)}}catch{throw i(s)}}finally{clearTimeout(p),l?.removeEventListener(`abort`,u),d&&c.signal.removeEventListener(`abort`,d)}}return{requestJson:a}}export{_ as a,w as i,E as n,C as r,D as t};
2
2
  //# sourceMappingURL=transport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transport.js","names":[],"sources":["../src/environment.ts","../src/generated/public-api/valibot.gen.ts","../src/schema-helpers.ts","../src/deep-freeze.ts","../src/error-reporting.ts","../src/transport.ts"],"sourcesContent":["import {\n check,\n custom,\n function_,\n is,\n looseObject,\n maxValue,\n minValue,\n nullable,\n number,\n optional,\n parse,\n picklist,\n pipe,\n safeInteger,\n string,\n ValiError,\n} from \"valibot\";\n\nimport type { CreateLockerverseSignupOptions } from \"./signup-types.ts\";\nimport type { LockerverseEnvironment, LockerverseSdkError } from \"./types.ts\";\n\nconst DEFAULT_API_BASE_URL = \"https://portal.lockerverse.com/api\";\nconst DEFAULT_REQUEST_TIMEOUT_MS = 20_000;\nconst MAX_REQUEST_TIMEOUT_MS = 2_147_483_647;\nconst TRAILING_SLASHES = /\\/+$/;\nconst LOOPBACK_HOSTNAMES = new Set([\"localhost\", \"127.0.0.1\", \"[::1]\"]);\nconst ENVIRONMENT_CONFIG = {\n development: {\n sentryDsn:\n \"https://1977371f7bc44480935a7bc9726ca296@o1338376.ingest.sentry.io/6631829\",\n },\n production: {\n sentryDsn:\n \"https://43d2d853c129415cf77531c914511174@o1338376.ingest.us.sentry.io/4511911476133888\",\n },\n} as const;\n\nfunction parseApiBaseUrl(value: string, environment: LockerverseEnvironment) {\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n // biome-ignore lint/style/useErrorCause: The URL parser error can contain the rejected endpoint or credentials.\n throw new TypeError(\"apiBaseUrl must be a valid HTTP or HTTPS URL.\");\n }\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new TypeError(\"apiBaseUrl must be a valid HTTP or HTTPS URL.\");\n }\n if (url.username || url.password) {\n throw new TypeError(\"apiBaseUrl must not include credentials.\");\n }\n if (url.search || url.hash) {\n throw new TypeError(\"apiBaseUrl must not include a query or fragment.\");\n }\n if (\n url.protocol !== \"https:\" &&\n !(environment === \"development\" && LOOPBACK_HOSTNAMES.has(url.hostname))\n ) {\n throw new TypeError(\n \"apiBaseUrl must use HTTPS except for development loopback endpoints.\"\n );\n }\n url.pathname = url.pathname.replace(TRAILING_SLASHES, \"\");\n return url.toString().replace(TRAILING_SLASHES, \"\");\n}\n\nfunction parseRuntimeOptions<Options>(\n options: Options,\n resourceSlugKey: string\n) {\n const timeoutMessage =\n \"requestTimeoutMs must be a positive integer no greater than 2147483647.\";\n const slug = (name: string) =>\n pipe(\n string(`${name} must be a non-empty string.`),\n check(\n (value) => value.trim().length > 0,\n `${name} must be a non-empty string.`\n )\n );\n try {\n const runtimeOptions = parse(\n looseObject(\n {\n apiBaseUrl: optional(\n string(\"apiBaseUrl must be a valid HTTP or HTTPS URL.\")\n ),\n communitySlug: slug(\"communitySlug\"),\n environment: optional(\n picklist(\n [\"development\", \"production\"],\n \"environment must be either development or production.\"\n )\n ),\n fetch: optional(\n custom<typeof globalThis.fetch>(\n (value): value is typeof globalThis.fetch =>\n is(function_(), value),\n \"fetch must be a function when provided.\"\n )\n ),\n onError: optional(\n custom<(error: LockerverseSdkError) => void>(\n (value): value is (error: LockerverseSdkError) => void =>\n is(function_(), value),\n \"onError must be a function when provided.\"\n )\n ),\n requestTimeoutMs: optional(\n pipe(\n number(timeoutMessage),\n safeInteger(timeoutMessage),\n minValue(1, timeoutMessage),\n maxValue(MAX_REQUEST_TIMEOUT_MS, timeoutMessage)\n )\n ),\n sentryDsn: optional(\n nullable(\n string(\"sentryDsn must be a string or null when provided.\")\n )\n ),\n },\n \"Expected an object.\"\n ),\n options\n );\n return {\n apiBaseUrl: runtimeOptions.apiBaseUrl,\n communitySlug: runtimeOptions.communitySlug,\n environment: runtimeOptions.environment,\n fetch: runtimeOptions.fetch,\n onError: runtimeOptions.onError,\n requestTimeoutMs: runtimeOptions.requestTimeoutMs,\n resourceSlugValue: parse(\n slug(resourceSlugKey),\n runtimeOptions[resourceSlugKey]\n ),\n sentryDsn: runtimeOptions.sentryDsn,\n };\n } catch (error) {\n const message =\n error instanceof ValiError\n ? (error.issues[0]?.message ?? \"Invalid SDK options.\")\n : \"Invalid SDK options.\";\n // biome-ignore lint/style/useErrorCause: Validation details can contain rejected host input.\n throw new TypeError(message);\n }\n}\n\nexport function resolveResourceEnvironment<Options>(\n options: Options,\n resourceSlugKey: string\n) {\n const runtimeOptions = parseRuntimeOptions(options, resourceSlugKey);\n const requestedEnvironment = runtimeOptions.environment;\n if (\n runtimeOptions.apiBaseUrl !== undefined &&\n requestedEnvironment === undefined\n ) {\n throw new TypeError(\"environment is required when apiBaseUrl is provided.\");\n }\n if (\n runtimeOptions.apiBaseUrl === undefined &&\n requestedEnvironment === \"development\"\n ) {\n throw new TypeError(\n \"apiBaseUrl is required when environment is development.\"\n );\n }\n\n const environment =\n requestedEnvironment === undefined ? \"production\" : requestedEnvironment;\n const { communitySlug: communitySlugValue, resourceSlugValue } =\n runtimeOptions;\n\n const fetchImplementation = runtimeOptions.fetch ?? globalThis.fetch;\n const apiBaseUrl =\n runtimeOptions.apiBaseUrl === undefined\n ? DEFAULT_API_BASE_URL\n : parseApiBaseUrl(runtimeOptions.apiBaseUrl, environment);\n const environmentConfig = ENVIRONMENT_CONFIG[environment];\n const configuredSentryDsn = runtimeOptions.sentryDsn;\n const sentryDsn =\n configuredSentryDsn === null\n ? null\n : (configuredSentryDsn ?? environmentConfig.sentryDsn);\n\n return {\n apiBaseUrl,\n communitySlug: encodeURIComponent(communitySlugValue),\n communitySlugValue,\n environment,\n fetchImplementation,\n onError: runtimeOptions.onError,\n requestTimeoutMs:\n runtimeOptions.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,\n resourceSlug: encodeURIComponent(resourceSlugValue),\n resourceSlugValue,\n sentryDsn,\n };\n}\n\nexport function resolveSignupEnvironment(\n options: CreateLockerverseSignupOptions\n) {\n const runtime = resolveResourceEnvironment(options, \"signupSlug\");\n return {\n ...runtime,\n signupSlug: runtime.resourceSlug,\n signupSlugValue: runtime.resourceSlugValue,\n };\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport * as v from 'valibot';\n\nexport const vPaymentWidgetAppliedDiscountResponseDto = v.object({\n percentageOff: v.number(),\n source: v.picklist(['email_list', 'promo_code'])\n});\n\nexport const vPaymentWidgetCheckoutLineItemResponseDto = v.object({\n acceptsDiscounts: v.boolean(),\n eventId: v.nullable(v.string()),\n fulfillmentType: v.picklist(['none', 'event_admission']),\n listingId: v.string(),\n listingSlug: v.string(),\n paymentOption: v.picklist([\n 'one-time',\n 'monthly',\n 'annually'\n ]),\n pricingMode: v.picklist(['fixed', 'custom']),\n productId: v.string(),\n productName: v.string(),\n quantity: v.number(),\n subtotalCents: v.number(),\n unitAmountCents: v.number()\n});\n\nexport const vPaymentWidgetPaymentResultResponseDto = v.object({\n checkoutId: v.string(),\n checkoutStatus: v.picklist([\n 'action_required',\n 'failed',\n 'pending',\n 'success'\n ]),\n clientSecret: v.nullable(v.string()),\n paymentReference: v.string(),\n paymentRequired: v.boolean(),\n requiresAction: v.boolean(),\n status: v.nullable(v.string())\n});\n\nexport const vPaymentWidgetQuoteResponseDto = v.object({\n amountCents: v.number(),\n appliedDiscount: v.nullable(vPaymentWidgetAppliedDiscountResponseDto),\n connectedAccountId: v.nullable(v.string()),\n discountableSubtotalCents: v.number(),\n discountCents: v.number(),\n lineItems: v.array(vPaymentWidgetCheckoutLineItemResponseDto),\n paymentOption: v.picklist([\n 'one-time',\n 'monthly',\n 'annually'\n ]),\n serviceFeeCents: v.number(),\n subtotalCents: v.number(),\n tipCents: v.number(),\n totalCents: v.number()\n});\n\nexport const vPublicEventRegistrationDto = v.object({\n name: v.string(),\n partySize: v.pipe(v.number(), v.minValue(1))\n});\n\nexport const vPublicEventAttendeesResponseDto = v.object({\n nextCursor: v.nullable(v.string()),\n registrations: v.array(vPublicEventRegistrationDto),\n totalAttendees: v.pipe(v.number(), v.minValue(0))\n});\n\nexport const vPublicPaymentConfigurationResponseDto = v.object({\n connectedAccountId: v.nullable(v.string()),\n currency: v.picklist(['usd']),\n publishableKey: v.string()\n});\n\nexport const vPublicPaymentWidgetCheckoutItemRequestDto = v.object({\n amountCents: v.optional(v.pipe(v.number(), v.minValue(100))),\n optionId: v.optional(v.pipe(v.string(), v.uuid())),\n productId: v.optional(v.pipe(v.string(), v.uuid())),\n quantity: v.optional(v.pipe(v.number(), v.minValue(1)))\n});\n\nexport const vPublicPaymentWidgetCommunityResponseDto = v.object({\n color: v.string(),\n name: v.string(),\n thumbnail: v.nullable(v.string())\n});\n\nexport const vPublicPaymentWidgetCustomFieldAnswerRequestDto = v.object({\n fieldId: v.string(),\n value: v.nullish(v.union([\n v.boolean(),\n v.string(),\n v.array(v.string())\n ]))\n});\n\nexport const vPublicPaymentWidgetCustomFieldOptionResponseDto = v.object({\n archivedAt: v.nullish(v.string()),\n id: v.string(),\n label: v.string()\n});\n\nexport const vPublicPaymentWidgetCustomFieldResponseDto = v.object({\n archivedAt: v.nullish(v.string()),\n id: v.string(),\n label: v.string(),\n options: v.optional(v.array(vPublicPaymentWidgetCustomFieldOptionResponseDto)),\n required: v.boolean(),\n type: v.picklist([\n 'text',\n 'textarea',\n 'select',\n 'multi_select',\n 'radio',\n 'checkbox',\n 'checkboxes'\n ])\n});\n\nexport const vPublicPaymentWidgetEventResponseDto = v.object({\n description: v.nullable(v.string()),\n endAt: v.pipe(v.string(), v.isoTimestamp()),\n id: v.string(),\n location: v.nullable(v.string()),\n name: v.string(),\n startAt: v.pipe(v.string(), v.isoTimestamp()),\n status: v.picklist([\n 'draft',\n 'active',\n 'finished',\n 'cancelled'\n ])\n});\n\nexport const vPublicPaymentWidgetExpectedDiscountRequestDto = v.object({\n percentageOff: v.pipe(v.number(), v.minValue(0), v.maxValue(100)),\n source: v.picklist(['email_list', 'promo_code'])\n});\n\nexport const vPublicPaymentWidgetFieldsResponseDto = v.object({\n memberId: v.boolean(),\n merchSize: v.boolean(),\n phone: v.boolean(),\n promoCode: v.boolean(),\n serviceFee: v.boolean(),\n shipping: v.boolean(),\n tipping: v.boolean()\n});\n\nexport const vPublicPaymentWidgetConfigResponseDto = v.object({\n customFields: v.array(vPublicPaymentWidgetCustomFieldResponseDto),\n fields: vPublicPaymentWidgetFieldsResponseDto\n});\n\nexport const vPublicPaymentWidgetPricingPolicyResponseDto = v.object({\n currency: v.picklist(['usd']),\n serviceFeeRateBasisPoints: v.number()\n});\n\nexport const vPublicPaymentWidgetProductResponseDto = v.object({\n amountCents: v.nullable(v.number()),\n description: v.nullable(v.string()),\n fulfillmentType: v.picklist(['none', 'event_admission']),\n id: v.string(),\n inventoryQuantity: v.nullable(v.number()),\n maxQuantity: v.nullable(v.number()),\n minimumAmountCents: v.nullable(v.number()),\n minQuantity: v.nullable(v.number()),\n name: v.string(),\n paymentOption: v.picklist([\n 'one-time',\n 'monthly',\n 'annually'\n ]),\n pricingMode: v.picklist(['fixed', 'custom'])\n});\n\nexport const vPublicPaymentWidgetProductListingResponseDto = v.object({\n acceptsDiscounts: v.boolean(),\n id: v.string(),\n maxQuantityPerOrder: v.nullable(v.number()),\n product: vPublicPaymentWidgetProductResponseDto,\n productId: v.string(),\n slug: v.string()\n});\n\nexport const vPublicPaymentWidgetQuoteRequestDto = v.object({\n email: v.optional(v.pipe(v.string(), v.email())),\n includeServiceFee: v.optional(v.boolean()),\n items: v.array(vPublicPaymentWidgetCheckoutItemRequestDto),\n promoCode: v.optional(v.pipe(v.string(), v.maxLength(255))),\n tipCents: v.optional(v.pipe(v.number(), v.minValue(0)))\n});\n\nexport const vPublicPaymentWidgetResponseDto = v.object({\n community: vPublicPaymentWidgetCommunityResponseDto,\n config: vPublicPaymentWidgetConfigResponseDto,\n description: v.nullable(v.string()),\n event: v.nullable(vPublicPaymentWidgetEventResponseDto),\n id: v.string(),\n name: v.string(),\n payment: vPublicPaymentConfigurationResponseDto,\n pricingPolicy: vPublicPaymentWidgetPricingPolicyResponseDto,\n products: v.array(vPublicPaymentWidgetProductListingResponseDto),\n quote: v.optional(vPaymentWidgetQuoteResponseDto),\n showCommunityBranding: v.boolean(),\n title: v.nullable(v.string())\n});\n\nexport const vPublicPaymentWidgetShippingAddressRequestDto = v.object({\n city: v.string(),\n country: v.string(),\n line1: v.string(),\n line2: v.optional(v.string()),\n postal_code: v.string(),\n state: v.string()\n});\n\nexport const vPublicPaymentWidgetShippingRequestDto = v.object({\n address: vPublicPaymentWidgetShippingAddressRequestDto,\n name: v.string()\n});\n\nexport const vPublicPaymentWidgetConfirmRequestDto = v.object({\n confirmationToken: v.optional(v.string()),\n customFieldAnswers: v.optional(v.array(vPublicPaymentWidgetCustomFieldAnswerRequestDto)),\n email: v.pipe(v.string(), v.email()),\n expectedAmountCents: v.optional(v.pipe(v.number(), v.minValue(0))),\n expectedAppliedDiscount: v.nullish(vPublicPaymentWidgetExpectedDiscountRequestDto),\n expectedConnectedAccountId: v.nullish(v.string()),\n expectedDiscountableSubtotalCents: v.optional(v.pipe(v.number(), v.minValue(0))),\n expectedDiscountCents: v.optional(v.pipe(v.number(), v.minValue(0))),\n expectedServiceFeeCents: v.optional(v.pipe(v.number(), v.minValue(0))),\n expectedSubtotalCents: v.optional(v.pipe(v.number(), v.minValue(100))),\n expectedTipCents: v.optional(v.pipe(v.number(), v.minValue(0))),\n expectedTotalCents: v.optional(v.pipe(v.number(), v.minValue(0))),\n includeServiceFee: v.optional(v.boolean()),\n items: v.array(vPublicPaymentWidgetCheckoutItemRequestDto),\n memberId: v.optional(v.string()),\n merchSize: v.optional(v.picklist([\n 'XS',\n 'S',\n 'M',\n 'L',\n 'XL',\n 'XXL',\n 'XXXL'\n ])),\n metadata: v.optional(v.record(v.string(), v.string())),\n name: v.optional(v.pipe(v.string(), v.maxLength(255))),\n paymentReference: v.optional(v.pipe(v.string(), v.uuid())),\n phone: v.optional(v.string()),\n promoCode: v.optional(v.string()),\n quoteContractVersion: v.optional(v.pipe(v.number(), v.minValue(1), v.maxValue(1))),\n shipping: v.optional(vPublicPaymentWidgetShippingRequestDto),\n tipCents: v.optional(v.pipe(v.number(), v.minValue(0)))\n});\n\nexport const vPublicSignUpWidgetAddressRequestDto = v.object({\n city: v.string(),\n country: v.string(),\n line1: v.string(),\n line2: v.nullish(v.string()),\n postalCode: v.string(),\n state: v.string()\n});\n\nexport const vPublicSignUpWidgetAnswerRequestDto = v.object({\n fieldId: v.string(),\n value: v.nullish(v.union([\n v.boolean(),\n v.string(),\n v.array(v.string())\n ]))\n});\n\nexport const vPublicSignUpWidgetCustomFieldOptionResponseDto = v.object({\n archivedAt: v.nullish(v.string()),\n id: v.string(),\n label: v.string()\n});\n\nexport const vPublicSignUpWidgetCustomFieldResponseDto = v.object({\n archivedAt: v.nullish(v.string()),\n id: v.string(),\n label: v.string(),\n options: v.optional(v.array(vPublicSignUpWidgetCustomFieldOptionResponseDto)),\n required: v.boolean(),\n type: v.picklist([\n 'text',\n 'textarea',\n 'select',\n 'multi_select',\n 'radio',\n 'checkbox',\n 'checkboxes'\n ])\n});\n\nexport const vPublicSignUpWidgetFieldResponseDto = v.object({\n enabled: v.boolean(),\n required: v.boolean()\n});\n\nexport const vPublicSignUpWidgetFieldsResponseDto = v.object({\n address: vPublicSignUpWidgetFieldResponseDto,\n email: vPublicSignUpWidgetFieldResponseDto,\n name: vPublicSignUpWidgetFieldResponseDto,\n participantCount: vPublicSignUpWidgetFieldResponseDto,\n phone: vPublicSignUpWidgetFieldResponseDto\n});\n\nexport const vPublicSignUpWidgetConfigResponseDto = v.object({\n builtInFields: vPublicSignUpWidgetFieldsResponseDto,\n customFields: v.array(vPublicSignUpWidgetCustomFieldResponseDto)\n});\n\nexport const vPublicSignUpWidgetResponseDto = v.object({\n config: vPublicSignUpWidgetConfigResponseDto,\n coverImageUrl: v.nullable(v.string()),\n description: v.nullable(v.string()),\n eventId: v.nullish(v.pipe(v.string(), v.uuid())),\n id: v.string(),\n isActive: v.boolean(),\n name: v.string(),\n slug: v.string(),\n title: v.nullable(v.string())\n});\n\nexport const vPublicSignUpWidgetSubmissionRequestDto = v.object({\n address: v.nullish(vPublicSignUpWidgetAddressRequestDto),\n answers: v.optional(v.array(vPublicSignUpWidgetAnswerRequestDto)),\n email: v.nullish(v.pipe(v.string(), v.email())),\n honeypot: v.optional(v.string()),\n name: v.string(),\n participantCount: v.nullish(v.pipe(v.number(), v.minValue(1))),\n phone: v.nullish(v.string()),\n submissionReference: v.optional(v.pipe(v.string(), v.uuid()))\n});\n\nexport const vPublicSignUpWidgetSubmissionResponseDto = v.object({\n id: v.string(),\n submittedAt: v.pipe(v.string(), v.isoTimestamp())\n});\n","import {\n array,\n boolean,\n check,\n looseObject,\n minLength,\n minValue,\n nonEmpty,\n nullable,\n number,\n object,\n optional,\n parse,\n picklist,\n pipe,\n safeInteger,\n string,\n transform,\n union,\n unknown,\n variant,\n} from \"valibot\";\n\nexport const nonEmptyStringSchema = pipe(\n string(),\n nonEmpty(),\n check((value) => value.trim().length > 0)\n);\nexport const optionalNullableStringSchema = optional(nullable(string()), null);\n\nexport function safeIntegerSchema(minimum: number) {\n return pipe(number(), safeInteger(), minValue(minimum));\n}\n\nconst activeRecordsSchema = pipe(\n array(unknown()),\n transform((values) =>\n values.filter((value) => {\n const { archivedAt } = parse(\n looseObject({\n archivedAt: optional(nullable(nonEmptyStringSchema)),\n }),\n value\n );\n return !archivedAt;\n })\n )\n);\n\nconst customFieldOptionSchema = object({\n id: nonEmptyStringSchema,\n label: nonEmptyStringSchema,\n});\n\nconst customFieldOptionsSchema = pipe(\n activeRecordsSchema,\n array(customFieldOptionSchema),\n minLength(2),\n check(\n (values) => new Set(values.map(({ id }) => id)).size === values.length,\n \"Expected unique custom field option IDs.\"\n )\n);\n\nconst customFieldBaseEntries = {\n id: nonEmptyStringSchema,\n label: nonEmptyStringSchema,\n required: boolean(),\n};\n\nconst customFieldSchema = variant(\"type\", [\n object({\n ...customFieldBaseEntries,\n type: picklist([\"text\", \"textarea\"]),\n }),\n object({\n ...customFieldBaseEntries,\n type: picklist([\"checkbox\"]),\n }),\n object({\n ...customFieldBaseEntries,\n options: customFieldOptionsSchema,\n type: picklist([\"radio\", \"select\"]),\n }),\n object({\n ...customFieldBaseEntries,\n options: customFieldOptionsSchema,\n type: picklist([\"checkboxes\", \"multi_select\"]),\n }),\n]);\n\nexport const customFieldsSchema = pipe(\n optional(activeRecordsSchema, []),\n array(customFieldSchema),\n check(\n (values) => new Set(values.map(({ id }) => id)).size === values.length,\n \"Expected unique custom field IDs.\"\n )\n);\n\nexport const customFieldAnswerSchema = object({\n fieldId: nonEmptyStringSchema,\n value: union([boolean(), string(), array(string())]),\n});\n","export function deepFreeze<T>(value: T): T {\n const objectValue = new Object(value);\n if (objectValue !== value || Object.isFrozen(objectValue)) {\n return value;\n }\n for (const nestedValue of Object.values(objectValue)) {\n deepFreeze(nestedValue);\n }\n return Object.freeze(value);\n}\n","import type { LockerverseEnvironment, LockerverseSdkError } from \"./types.ts\";\n\ntype TelemetryValue = boolean | number | string | null;\n\nexport function getBrowserWindow(): Window | undefined {\n return globalThis.window;\n}\n\nexport function createSdkErrorReporter({\n communitySlug,\n environment,\n getContext,\n onError,\n resourceContextName,\n sentryDsn,\n}: {\n communitySlug: string;\n environment: LockerverseEnvironment;\n getContext: () => Record<string, TelemetryValue>;\n onError: ((error: LockerverseSdkError) => void) | undefined;\n resourceContextName: string;\n sentryDsn: string | null;\n}) {\n let telemetryModulePromise: Promise<typeof import(\"./telemetry.ts\")> | null =\n null;\n\n return function reportError(error: LockerverseSdkError) {\n try {\n Promise.resolve(onError?.(error)).catch(() => undefined);\n } catch {\n // Host error reporting must never interrupt an SDK workflow.\n }\n\n const browserWindow = getBrowserWindow();\n if (error.reportable && sentryDsn && browserWindow !== undefined) {\n const telemetryPromise =\n telemetryModulePromise ?? import(\"./telemetry.ts\");\n telemetryModulePromise = telemetryPromise;\n const baseContext = {\n communitySlug,\n ...getContext(),\n };\n const context =\n error.status === undefined\n ? baseContext\n : { ...baseContext, status: error.status };\n telemetryPromise\n .then(({ captureSdkError }) =>\n captureSdkError({\n context,\n contextName: resourceContextName,\n dsn: sentryDsn,\n environment,\n error,\n })\n )\n .catch(() => {\n if (telemetryModulePromise === telemetryPromise) {\n telemetryModulePromise = null;\n }\n });\n }\n\n return error;\n };\n}\n","import {\n LockerverseSdkError,\n type LockerverseSdkErrorCode,\n type LockerverseSdkOperation,\n} from \"./types.ts\";\n\ntype ErrorContext = {\n code: LockerverseSdkErrorCode;\n message: string;\n operation: LockerverseSdkOperation;\n report?: boolean;\n};\n\ntype ReportError = (error: LockerverseSdkError) => LockerverseSdkError;\n\ntype JsonResponse<T> =\n | { ok: false; response: Response }\n | { ok: true; response: Response; value: T };\n\ntype JsonValue =\n | boolean\n | number\n | string\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\nexport function createTransport(\n fetchImplementation: typeof globalThis.fetch,\n reportError: ReportError,\n requestTimeoutMs: number\n) {\n function createBoundaryError(context: ErrorContext) {\n const error = new LockerverseSdkError({\n code: context.code,\n message: context.message,\n operation: context.operation,\n reportable: true,\n });\n return context.report === false ? error : reportError(error);\n }\n\n async function requestJson<T>(\n input: string,\n init: RequestInit | undefined,\n parser: (value: JsonValue) => T,\n requestContext: ErrorContext,\n responseContext: ErrorContext\n ): Promise<JsonResponse<T>> {\n const controller = new AbortController();\n const callerSignal = init?.signal ?? undefined;\n const abortFromCaller = () => controller.abort(callerSignal?.reason);\n if (callerSignal?.aborted) {\n abortFromCaller();\n } else {\n callerSignal?.addEventListener(\"abort\", abortFromCaller, { once: true });\n }\n\n let rejectWhenAborted: (() => void) | undefined;\n const aborted = new Promise<never>((_resolve, reject) => {\n rejectWhenAborted = () =>\n reject(\n controller.signal.reason ??\n new DOMException(\"The request was aborted.\", \"AbortError\")\n );\n if (controller.signal.aborted) {\n rejectWhenAborted();\n } else {\n controller.signal.addEventListener(\"abort\", rejectWhenAborted, {\n once: true,\n });\n }\n });\n const timeout = setTimeout(() => {\n controller.abort(\n new DOMException(\"The request timed out.\", \"TimeoutError\")\n );\n }, requestTimeoutMs);\n\n try {\n let response: Response;\n try {\n response = await Promise.race([\n fetchImplementation(input, { ...init, signal: controller.signal }),\n aborted,\n ]);\n } catch {\n // biome-ignore lint/style/useErrorCause: Raw host network errors are intentionally excluded from public SDK errors and telemetry.\n throw createBoundaryError(requestContext);\n }\n\n if (!response.ok) {\n return { ok: false, response };\n }\n\n try {\n const value = await Promise.race([response.json(), aborted]);\n return { ok: true, response, value: parser(value) };\n } catch {\n // biome-ignore lint/style/useErrorCause: Raw parse and validation errors must not escape the SDK boundary.\n throw createBoundaryError(responseContext);\n }\n } finally {\n clearTimeout(timeout);\n callerSignal?.removeEventListener(\"abort\", abortFromCaller);\n if (rejectWhenAborted) {\n controller.signal.removeEventListener(\"abort\", rejectWhenAborted);\n }\n }\n }\n\n return { requestJson };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"transport.js","names":[],"sources":["../src/deep-freeze.ts","../src/environment.ts","../src/error-reporting.ts","../src/transport.ts"],"sourcesContent":["export function deepFreeze<T>(value: T): T {\n const objectValue = new Object(value);\n if (objectValue !== value || Object.isFrozen(objectValue)) {\n return value;\n }\n for (const nestedValue of Object.values(objectValue)) {\n deepFreeze(nestedValue);\n }\n return Object.freeze(value);\n}\n","import {\n check,\n custom,\n function_,\n is,\n looseObject,\n maxValue,\n minValue,\n nullable,\n number,\n optional,\n parse,\n picklist,\n pipe,\n safeInteger,\n string,\n ValiError,\n} from \"valibot\";\n\nimport type { CreateLockerverseSignupOptions } from \"./signup-types.ts\";\nimport type { LockerverseEnvironment, LockerverseSdkError } from \"./types.ts\";\n\nconst DEFAULT_API_BASE_URL = \"https://portal.lockerverse.com/api\";\nconst DEFAULT_REQUEST_TIMEOUT_MS = 20_000;\nconst MAX_REQUEST_TIMEOUT_MS = 2_147_483_647;\nconst TRAILING_SLASHES = /\\/+$/;\nconst LOOPBACK_HOSTNAMES = new Set([\"localhost\", \"127.0.0.1\", \"[::1]\"]);\nconst ENVIRONMENT_CONFIG = {\n development: {\n sentryDsn:\n \"https://1977371f7bc44480935a7bc9726ca296@o1338376.ingest.sentry.io/6631829\",\n },\n production: {\n sentryDsn:\n \"https://43d2d853c129415cf77531c914511174@o1338376.ingest.us.sentry.io/4511911476133888\",\n },\n} as const;\n\nfunction parseApiBaseUrl(value: string, environment: LockerverseEnvironment) {\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n // biome-ignore lint/style/useErrorCause: The URL parser error can contain the rejected endpoint or credentials.\n throw new TypeError(\"apiBaseUrl must be a valid HTTP or HTTPS URL.\");\n }\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new TypeError(\"apiBaseUrl must be a valid HTTP or HTTPS URL.\");\n }\n if (url.username || url.password) {\n throw new TypeError(\"apiBaseUrl must not include credentials.\");\n }\n if (url.search || url.hash) {\n throw new TypeError(\"apiBaseUrl must not include a query or fragment.\");\n }\n if (\n url.protocol !== \"https:\" &&\n !(environment === \"development\" && LOOPBACK_HOSTNAMES.has(url.hostname))\n ) {\n throw new TypeError(\n \"apiBaseUrl must use HTTPS except for development loopback endpoints.\"\n );\n }\n url.pathname = url.pathname.replace(TRAILING_SLASHES, \"\");\n return url.toString().replace(TRAILING_SLASHES, \"\");\n}\n\nfunction parseRuntimeOptions<Options>(\n options: Options,\n resourceSlugKey: string\n) {\n const timeoutMessage =\n \"requestTimeoutMs must be a positive integer no greater than 2147483647.\";\n const slug = (name: string) =>\n pipe(\n string(`${name} must be a non-empty string.`),\n check(\n (value) => value.trim().length > 0,\n `${name} must be a non-empty string.`\n )\n );\n try {\n const runtimeOptions = parse(\n looseObject(\n {\n apiBaseUrl: optional(\n string(\"apiBaseUrl must be a valid HTTP or HTTPS URL.\")\n ),\n communitySlug: slug(\"communitySlug\"),\n environment: optional(\n picklist(\n [\"development\", \"production\"],\n \"environment must be either development or production.\"\n )\n ),\n fetch: optional(\n custom<typeof globalThis.fetch>(\n (value): value is typeof globalThis.fetch =>\n is(function_(), value),\n \"fetch must be a function when provided.\"\n )\n ),\n onError: optional(\n custom<(error: LockerverseSdkError) => void>(\n (value): value is (error: LockerverseSdkError) => void =>\n is(function_(), value),\n \"onError must be a function when provided.\"\n )\n ),\n requestTimeoutMs: optional(\n pipe(\n number(timeoutMessage),\n safeInteger(timeoutMessage),\n minValue(1, timeoutMessage),\n maxValue(MAX_REQUEST_TIMEOUT_MS, timeoutMessage)\n )\n ),\n sentryDsn: optional(\n nullable(\n string(\"sentryDsn must be a string or null when provided.\")\n )\n ),\n },\n \"Expected an object.\"\n ),\n options\n );\n return {\n apiBaseUrl: runtimeOptions.apiBaseUrl,\n communitySlug: runtimeOptions.communitySlug,\n environment: runtimeOptions.environment,\n fetch: runtimeOptions.fetch,\n onError: runtimeOptions.onError,\n requestTimeoutMs: runtimeOptions.requestTimeoutMs,\n resourceSlugValue: parse(\n slug(resourceSlugKey),\n runtimeOptions[resourceSlugKey]\n ),\n sentryDsn: runtimeOptions.sentryDsn,\n };\n } catch (error) {\n const message =\n error instanceof ValiError\n ? (error.issues[0]?.message ?? \"Invalid SDK options.\")\n : \"Invalid SDK options.\";\n // biome-ignore lint/style/useErrorCause: Validation details can contain rejected host input.\n throw new TypeError(message);\n }\n}\n\nexport function resolveResourceEnvironment<Options>(\n options: Options,\n resourceSlugKey: string\n) {\n const runtimeOptions = parseRuntimeOptions(options, resourceSlugKey);\n const requestedEnvironment = runtimeOptions.environment;\n if (\n runtimeOptions.apiBaseUrl !== undefined &&\n requestedEnvironment === undefined\n ) {\n throw new TypeError(\"environment is required when apiBaseUrl is provided.\");\n }\n if (\n runtimeOptions.apiBaseUrl === undefined &&\n requestedEnvironment === \"development\"\n ) {\n throw new TypeError(\n \"apiBaseUrl is required when environment is development.\"\n );\n }\n\n const environment =\n requestedEnvironment === undefined ? \"production\" : requestedEnvironment;\n const { communitySlug: communitySlugValue, resourceSlugValue } =\n runtimeOptions;\n\n const fetchImplementation = runtimeOptions.fetch ?? globalThis.fetch;\n const apiBaseUrl =\n runtimeOptions.apiBaseUrl === undefined\n ? DEFAULT_API_BASE_URL\n : parseApiBaseUrl(runtimeOptions.apiBaseUrl, environment);\n const environmentConfig = ENVIRONMENT_CONFIG[environment];\n const configuredSentryDsn = runtimeOptions.sentryDsn;\n const sentryDsn =\n configuredSentryDsn === null\n ? null\n : (configuredSentryDsn ?? environmentConfig.sentryDsn);\n\n return {\n apiBaseUrl,\n communitySlug: encodeURIComponent(communitySlugValue),\n communitySlugValue,\n environment,\n fetchImplementation,\n onError: runtimeOptions.onError,\n requestTimeoutMs:\n runtimeOptions.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,\n resourceSlug: encodeURIComponent(resourceSlugValue),\n resourceSlugValue,\n sentryDsn,\n };\n}\n\nexport function resolveSignupEnvironment(\n options: CreateLockerverseSignupOptions\n) {\n const runtime = resolveResourceEnvironment(options, \"signupSlug\");\n return {\n ...runtime,\n signupSlug: runtime.resourceSlug,\n signupSlugValue: runtime.resourceSlugValue,\n };\n}\n","import type { LockerverseEnvironment, LockerverseSdkError } from \"./types.ts\";\n\ntype TelemetryValue = boolean | number | string | null;\n\nexport function getBrowserWindow(): Window | undefined {\n return globalThis.window;\n}\n\nexport function createSdkErrorReporter({\n communitySlug,\n environment,\n getContext,\n onError,\n resourceContextName,\n sentryDsn,\n}: {\n communitySlug: string;\n environment: LockerverseEnvironment;\n getContext: () => Record<string, TelemetryValue>;\n onError: ((error: LockerverseSdkError) => void) | undefined;\n resourceContextName: string;\n sentryDsn: string | null;\n}) {\n let telemetryModulePromise: Promise<typeof import(\"./telemetry.ts\")> | null =\n null;\n\n return function reportError(error: LockerverseSdkError) {\n try {\n Promise.resolve(onError?.(error)).catch(() => undefined);\n } catch {\n // Host error reporting must never interrupt an SDK workflow.\n }\n\n const browserWindow = getBrowserWindow();\n if (error.reportable && sentryDsn && browserWindow !== undefined) {\n const telemetryPromise =\n telemetryModulePromise ?? import(\"./telemetry.ts\");\n telemetryModulePromise = telemetryPromise;\n const baseContext = {\n communitySlug,\n ...getContext(),\n };\n const context =\n error.status === undefined\n ? baseContext\n : { ...baseContext, status: error.status };\n telemetryPromise\n .then(({ captureSdkError }) =>\n captureSdkError({\n context,\n contextName: resourceContextName,\n dsn: sentryDsn,\n environment,\n error,\n })\n )\n .catch(() => {\n if (telemetryModulePromise === telemetryPromise) {\n telemetryModulePromise = null;\n }\n });\n }\n\n return error;\n };\n}\n","import {\n LockerverseSdkError,\n type LockerverseSdkErrorCode,\n type LockerverseSdkOperation,\n} from \"./types.ts\";\n\ntype ErrorContext = {\n code: LockerverseSdkErrorCode;\n message: string;\n operation: LockerverseSdkOperation;\n report?: boolean;\n};\n\ntype ReportError = (error: LockerverseSdkError) => LockerverseSdkError;\n\ntype JsonResponse<T> =\n | { ok: false; response: Response }\n | { ok: true; response: Response; value: T };\n\ntype JsonValue =\n | boolean\n | number\n | string\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\nexport function createTransport(\n fetchImplementation: typeof globalThis.fetch,\n reportError: ReportError,\n requestTimeoutMs: number\n) {\n function createBoundaryError(context: ErrorContext) {\n const error = new LockerverseSdkError({\n code: context.code,\n message: context.message,\n operation: context.operation,\n reportable: true,\n });\n return context.report === false ? error : reportError(error);\n }\n\n async function requestJson<T>(\n input: string,\n init: RequestInit | undefined,\n parser: (value: JsonValue) => T,\n requestContext: ErrorContext,\n responseContext: ErrorContext\n ): Promise<JsonResponse<T>> {\n const controller = new AbortController();\n const callerSignal = init?.signal ?? undefined;\n const abortFromCaller = () => controller.abort(callerSignal?.reason);\n if (callerSignal?.aborted) {\n abortFromCaller();\n } else {\n callerSignal?.addEventListener(\"abort\", abortFromCaller, { once: true });\n }\n\n let rejectWhenAborted: (() => void) | undefined;\n const aborted = new Promise<never>((_resolve, reject) => {\n rejectWhenAborted = () =>\n reject(\n controller.signal.reason ??\n new DOMException(\"The request was aborted.\", \"AbortError\")\n );\n if (controller.signal.aborted) {\n rejectWhenAborted();\n } else {\n controller.signal.addEventListener(\"abort\", rejectWhenAborted, {\n once: true,\n });\n }\n });\n const timeout = setTimeout(() => {\n controller.abort(\n new DOMException(\"The request timed out.\", \"TimeoutError\")\n );\n }, requestTimeoutMs);\n\n try {\n let response: Response;\n try {\n response = await Promise.race([\n fetchImplementation(input, { ...init, signal: controller.signal }),\n aborted,\n ]);\n } catch {\n // biome-ignore lint/style/useErrorCause: Raw host network errors are intentionally excluded from public SDK errors and telemetry.\n throw createBoundaryError(requestContext);\n }\n\n if (!response.ok) {\n return { ok: false, response };\n }\n\n try {\n const value = await Promise.race([response.json(), aborted]);\n return { ok: true, response, value: parser(value) };\n } catch {\n // biome-ignore lint/style/useErrorCause: Raw parse and validation errors must not escape the SDK boundary.\n throw createBoundaryError(responseContext);\n }\n } finally {\n clearTimeout(timeout);\n callerSignal?.removeEventListener(\"abort\", abortFromCaller);\n if (rejectWhenAborted) {\n controller.signal.removeEventListener(\"abort\", rejectWhenAborted);\n }\n }\n }\n\n return { requestJson };\n}\n"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -114,8 +114,8 @@ type LockerverseWidgetConfiguration = {
114
114
  showCommunityBranding: boolean;
115
115
  title: string | null;
116
116
  };
117
- type LockerverseSdkErrorCode = "widget_load_failed" | "signup_load_failed" | "signup_submit_failed" | "total_calculation_failed" | "payment_submit_failed" | "payment_status_failed" | "invalid_selection";
118
- type LockerverseSdkOperation = "load_widget" | "load_signup" | "submit_signup" | "calculate_total" | "submit_payment" | "get_payment_status";
117
+ type LockerverseSdkErrorCode = "auction_load_failed" | "auction_bid_failed" | "auction_purchase_failed" | "auction_purchase_status_failed" | "auction_receipt_failed" | "widget_load_failed" | "signup_load_failed" | "signup_submit_failed" | "total_calculation_failed" | "payment_submit_failed" | "payment_status_failed" | "invalid_selection";
118
+ type LockerverseSdkOperation = "list_auctions" | "load_auction" | "create_auction_bid" | "create_auction_purchase" | "get_auction_purchase_receipt" | "get_auction_purchase_status" | "load_widget" | "load_signup" | "submit_signup" | "calculate_total" | "submit_payment" | "get_payment_status";
119
119
  type LockerverseSdkServerCode = "PAYMENT_WIDGET_SALES_LIMIT_REACHED" | "PAYMENT_WIDGET_PHONE_INVALID" | "PAYMENT_WIDGET_PHONE_REQUIRED" | "SIGN_UP_WIDGET_PHONE_INVALID" | "SIGN_UP_WIDGET_PHONE_REQUIRED";
120
120
  declare class LockerverseSdkError extends Error {
121
121
  readonly code: LockerverseSdkErrorCode;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":";KAGY;KACA;KACA;cAEC;KAED;EACV;EACA;EACA;EACA;EACA;EACA,iBAAiB;EACjB;EACA,eAAe;EACf;EACA;EACA;EACA;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;;KAGU;EACV;EACA;;KAGU;EACV;EACA;EACA;;KAGU;EACV;EACA;EACA;EACA;EACA;EACA;EACA;;KAGU;EAAiC;EAAY;;KAEpD;EACH;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;KASA;KAQA;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;;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;KACA;KACA;cAEC;KAED;EACV;EACA;EACA;EACA;EACA;EACA,iBAAiB;EACjB;EACA,eAAe;EACf;EACA;EACA;EACA;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;;KAGU;EACV;EACA;;KAGU;EACV;EACA;EACA;;KAGU;EACV;EACA;EACA;EACA;EACA;EACA;EACA;;KAGU;EAAiC;EAAY;;KAEpD;EACH;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;KAcA;KAcA;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;;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"}
package/dist/types.js CHANGED
@@ -1,2 +1,2 @@
1
- const e=`0.2.99`;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.100`;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 = \"one-time\" | \"monthly\" | \"annually\";\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 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 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 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 | \"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 | \"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 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":"ACOA,MAAa,EAA0BA,SAoKvC,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 = \"one-time\" | \"monthly\" | \"annually\";\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 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 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 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 | \"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_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 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":"ACOA,MAAa,EAA0BA,UA+KvC,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.99",
3
+ "version": "0.2.100",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/Lockerverse/lockerverse-sdk.git",
@@ -23,6 +23,11 @@
23
23
  "types": "./dist/signup.d.ts",
24
24
  "import": "./dist/signup.js",
25
25
  "default": "./dist/signup.js"
26
+ },
27
+ "./auctions": {
28
+ "types": "./dist/auctions.d.ts",
29
+ "import": "./dist/auctions.js",
30
+ "default": "./dist/auctions.js"
26
31
  }
27
32
  },
28
33
  "module": "./dist/index.js",