commerce-kit 0.0.30 → 0.0.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +13 -4
- package/dist/index.js +3 -3
- package/dist/internal.d.ts +11 -1
- package/dist/internal.js +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -21,6 +21,8 @@ declare function cartGet(cartId: string): Promise<{
|
|
|
21
21
|
taxCalculationId?: string | undefined;
|
|
22
22
|
taxCalculationExp?: string | undefined;
|
|
23
23
|
taxId?: string | undefined;
|
|
24
|
+
couponCode?: string | undefined;
|
|
25
|
+
taxedAmount?: string | undefined;
|
|
24
26
|
"billingAddress.city"?: string | undefined;
|
|
25
27
|
"billingAddress.country"?: string | undefined;
|
|
26
28
|
"billingAddress.line1"?: string | undefined;
|
|
@@ -36,6 +38,7 @@ declare function cartGet(cartId: string): Promise<{
|
|
|
36
38
|
taxBreakdown4?: string | undefined;
|
|
37
39
|
taxBreakdown5?: string | undefined;
|
|
38
40
|
} & Record<string, string>;
|
|
41
|
+
customer: Stripe.Customer | null;
|
|
39
42
|
payment_method: Stripe.PaymentMethod | null;
|
|
40
43
|
taxBreakdown: {
|
|
41
44
|
taxPercentage: string;
|
|
@@ -58,7 +61,6 @@ declare function cartGet(cartId: string): Promise<{
|
|
|
58
61
|
confirmation_method: Stripe.PaymentIntent.ConfirmationMethod;
|
|
59
62
|
created: number;
|
|
60
63
|
currency: string;
|
|
61
|
-
customer: string | Stripe.Customer | Stripe.DeletedCustomer | null;
|
|
62
64
|
description: string | null;
|
|
63
65
|
invoice: string | Stripe.Invoice | null;
|
|
64
66
|
last_payment_error: Stripe.PaymentIntent.LastPaymentError | null;
|
|
@@ -129,6 +131,8 @@ declare function cartAddOptimistic({ cart, add, }: {
|
|
|
129
131
|
taxCalculationId?: string | undefined;
|
|
130
132
|
taxCalculationExp?: string | undefined;
|
|
131
133
|
taxId?: string | undefined;
|
|
134
|
+
couponCode?: string | undefined;
|
|
135
|
+
taxedAmount?: string | undefined;
|
|
132
136
|
"billingAddress.city"?: string | undefined;
|
|
133
137
|
"billingAddress.country"?: string | undefined;
|
|
134
138
|
"billingAddress.line1"?: string | undefined;
|
|
@@ -144,6 +148,7 @@ declare function cartAddOptimistic({ cart, add, }: {
|
|
|
144
148
|
taxBreakdown4?: string | undefined;
|
|
145
149
|
taxBreakdown5?: string | undefined;
|
|
146
150
|
} & Record<string, string>) | undefined;
|
|
151
|
+
customer?: Stripe.Customer | null | undefined;
|
|
147
152
|
payment_method?: Stripe.PaymentMethod | null | undefined;
|
|
148
153
|
taxBreakdown?: {
|
|
149
154
|
taxPercentage: string;
|
|
@@ -165,7 +170,6 @@ declare function cartAddOptimistic({ cart, add, }: {
|
|
|
165
170
|
confirmation_method?: Stripe.PaymentIntent.ConfirmationMethod | undefined;
|
|
166
171
|
created?: number | undefined;
|
|
167
172
|
currency?: string | undefined;
|
|
168
|
-
customer?: string | Stripe.Customer | Stripe.DeletedCustomer | null | undefined;
|
|
169
173
|
description?: string | null | undefined;
|
|
170
174
|
invoice?: string | Stripe.Invoice | null | undefined;
|
|
171
175
|
last_payment_error?: Stripe.PaymentIntent.LastPaymentError | null | undefined;
|
|
@@ -366,6 +370,8 @@ declare function orderGet(orderId: string): Promise<{
|
|
|
366
370
|
taxCalculationId?: string | undefined;
|
|
367
371
|
taxCalculationExp?: string | undefined;
|
|
368
372
|
taxId?: string | undefined;
|
|
373
|
+
couponCode?: string | undefined;
|
|
374
|
+
taxedAmount?: string | undefined;
|
|
369
375
|
"billingAddress.city"?: string | undefined;
|
|
370
376
|
"billingAddress.country"?: string | undefined;
|
|
371
377
|
"billingAddress.line1"?: string | undefined;
|
|
@@ -492,6 +498,8 @@ declare const getCartWithProductsById: (cartId: string) => Promise<{
|
|
|
492
498
|
taxCalculationId?: string | undefined;
|
|
493
499
|
taxCalculationExp?: string | undefined;
|
|
494
500
|
taxId?: string | undefined;
|
|
501
|
+
couponCode?: string | undefined;
|
|
502
|
+
taxedAmount?: string | undefined;
|
|
495
503
|
"billingAddress.city"?: string | undefined;
|
|
496
504
|
"billingAddress.country"?: string | undefined;
|
|
497
505
|
"billingAddress.line1"?: string | undefined;
|
|
@@ -507,6 +515,7 @@ declare const getCartWithProductsById: (cartId: string) => Promise<{
|
|
|
507
515
|
taxBreakdown4?: string | undefined;
|
|
508
516
|
taxBreakdown5?: string | undefined;
|
|
509
517
|
} & Record<string, string>;
|
|
518
|
+
customer: Stripe.Customer | null;
|
|
510
519
|
payment_method: Stripe.PaymentMethod | null;
|
|
511
520
|
taxBreakdown: {
|
|
512
521
|
taxPercentage: string;
|
|
@@ -529,7 +538,6 @@ declare const getCartWithProductsById: (cartId: string) => Promise<{
|
|
|
529
538
|
confirmation_method: Stripe.PaymentIntent.ConfirmationMethod;
|
|
530
539
|
created: number;
|
|
531
540
|
currency: string;
|
|
532
|
-
customer: string | Stripe.Customer | Stripe.DeletedCustomer | null;
|
|
533
541
|
description: string | null;
|
|
534
542
|
invoice: string | Stripe.Invoice | null;
|
|
535
543
|
last_payment_error: Stripe.PaymentIntent.LastPaymentError | null;
|
|
@@ -650,9 +658,10 @@ type AddressSchema = TypeOf<ReturnType<typeof getAddressSchema>>;
|
|
|
650
658
|
/**
|
|
651
659
|
* @internal
|
|
652
660
|
*/
|
|
653
|
-
declare const updatePaymentIntent: ({ paymentIntentId, data, clearTaxCalculation, }: {
|
|
661
|
+
declare const updatePaymentIntent: ({ paymentIntentId, data, customerOverride, clearTaxCalculation, }: {
|
|
654
662
|
paymentIntentId: string;
|
|
655
663
|
data: Stripe.PaymentIntentUpdateParams;
|
|
664
|
+
customerOverride?: Stripe.Customer;
|
|
656
665
|
clearTaxCalculation?: boolean;
|
|
657
666
|
}) => Promise<Stripe.Response<Stripe.PaymentIntent>>;
|
|
658
667
|
declare const calculateCartTotalPossiblyWithTax: (cart: {
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import{z as c}from"zod";function S(t,e){if(!t)throw new Error(e)}var z=async t=>{try{return[null,await t]}catch(e){return[e instanceof Error?e:new Error(String(e)),null]}},L=t=>{if(t==null)return 0;if(typeof t=="number")return t;let e=Number.parseInt(t,10);return Number.isNaN(e)?0:e},j=t=>{if(t==null)return null;try{return JSON.parse(t)}catch{return null}};var st=t=>t.toString().replace(/\\/g,"\\\\").replace(/"/g,'\\"'),U=t=>Object.entries(t).map(([e,n])=>`${e}:"${st(n)}"`).join(" AND ").trim();function M(t){return t.toSorted((e,n)=>{let a=Number(e.metadata.order),i=Number(n.metadata.order);return Number.isNaN(a)&&Number.isNaN(i)||a===i?n.updated-e.updated:Number.isNaN(a)?1:Number.isNaN(i)?-1:a-i})}var ct=c.object({category:c.string().optional(),order:c.coerce.number().optional(),slug:c.string(),variant:c.string().optional(),stock:c.coerce.number().optional().transform(t=>t===void 0?1/0:t)});function q({default_price:t,marketing_features:e,...n}){return S(t,"Product must have a default price"),S(typeof t=="object","Product default price must be an object"),{...n,default_price:t,marketing_features:e.map(a=>a.name).filter(Boolean),metadata:ct.parse(n.metadata)}}function G(t){return t.data.map(q)}function J(t){return t}function X(t){return t.data.map(J)}function Y(t){return t.filter((e,n,a)=>n===a.findIndex(i=>i.metadata.slug===e.metadata.slug))}var W=t=>!t.deleted&&t.active,K=c.object({shippingRateId:c.string().optional(),taxCalculationId:c.string().optional(),taxCalculationExp:c.string().optional(),taxId:c.string().optional(),"billingAddress.city":c.string().optional(),"billingAddress.country":c.string().optional(),"billingAddress.line1":c.string().optional(),"billingAddress.line2":c.string().optional(),"billingAddress.name":c.string().optional(),"billingAddress.postalCode":c.string().optional(),"billingAddress.state":c.string().optional(),netAmount:c.string().optional(),taxBreakdown0:c.string().optional(),taxBreakdown1:c.string().optional(),taxBreakdown2:c.string().optional(),taxBreakdown3:c.string().optional(),taxBreakdown4:c.string().optional(),taxBreakdown5:c.string().optional()}).and(c.record(c.string())),H=c.object({taxType:c.string(),taxPercentage:c.string(),taxAmount:c.number()});function D(t){let e=t.payment_method;S(typeof e!="string","Payment method is missing from cart");let n=K.parse(t.metadata),a=Object.entries(n).filter(([i])=>i.startsWith("taxBreakdown")).map(([i,r])=>{let o=H.safeParse(j(String(r)));return o.success?o.data:null}).filter(Boolean);return{...t,metadata:n,payment_method:e,taxBreakdown:a}}function Z({payment_method:t,latest_charge:e,...n}){S(typeof t=="object","Payment method is missing from order"),S(typeof e=="object","Latest charge is missing from order");let a=K.parse(n.metadata),i=Object.entries(a).filter(([r])=>r.startsWith("taxBreakdown")).map(([r,o])=>{let s=H.safeParse(j(String(o)));return s.success?s.data:null}).filter(Boolean);return{...n,payment_method:t,latest_charge:e,taxBreakdown:i,metadata:a}}import{revalidateTag as E}from"next/cache";import R from"stripe";import{z as _}from"zod";var p=async()=>{let t={stripeAccount:void 0,storeId:void 0,secretKey:void 0,publishableKey:void 0};return await global?.__ynsFindStripeAccount?.()??t};import tt from"stripe";var ut=process.env.STRIPE_SECRET_KEY,dt=process.env.STRIPE_CURRENCY,g={StripeSecretKey:ut,StripeCurrency:dt};var pt=(t,e)=>!t||!e?t:[...t,`prefix-${e}`,...t.map(n=>`${e}-${n}`)],m=({tags:t,revalidate:e,cache:n,tagPrefix:a,secretKey:i})=>{let r=i??g.StripeSecretKey;if(!r)throw new Error("Missing `secretKey` parameter and `STRIPE_SECRET_KEY` env variable.");let o=pt(t,a);return new tt(r,{typescript:!0,apiVersion:"2024-09-30.acacia",httpClient:tt.createFetchHttpClient((h,d)=>fetch(h,{...d,cache:n??d?.cache,next:{tags:o??d?.next?.tags,revalidate:e??d?.next?.revalidate}})),appInfo:{name:"Commerce SDK",version:"beta",url:"https://yournextstore.com",partner_id:"CONS-003378"}})};var b={DEBUG:0,LOG:1,WARN:2,ERROR:3},lt="LOG",mt=process.env.LOG_LEVEL&&process.env.LOG_LEVEL in b?process.env.LOG_LEVEL:lt,A=b[mt],u={time(t){A>b.DEBUG||console.time(t)},timeEnd(t){A>b.DEBUG||console.timeEnd(t)},log(...t){A>b.LOG||console.log(...t)},dir(t,e){A>b.LOG||console.dir(t,e)},warn(...t){A>b.WARN||console.warn(...t)},error(...t){A>b.ERROR||console.error(...t)}};var C=t=>t.filter(Boolean),w={accountGetById:{tags:({accountId:t})=>C(["account",t&&`account-${t}`]),revalidate:()=>{}},cartGetById:{tags:({cartId:t})=>C(["cart",`cart-${t}`]),revalidate:()=>{}},createTaxCalculation:{tags:({cartId:t})=>C(["tax-calculations",`tax-calculations-${t}`]),revalidate:()=>{}},fileGetById:{tags:({fileId:t})=>C(["files",`file-${t}`]),revalidate:()=>{}},orderGetById:{tags:({orderId:t})=>C(["order",`order-${t}`]),revalidate:()=>{}},productBrowse:{tags:({category:t})=>C(["product",t&&`category-${t}`]),revalidate:()=>{}},productGetById:{tags:({productId:t})=>C(["product",`product-${t}`]),revalidate:()=>{}},productGetBySlug:{tags:({productSlug:t})=>C(["product",`product-${t}`]),revalidate:()=>{}},shippingBrowse:{tags:()=>C(["shipping"]),revalidate:()=>{}},shippingGetById:{tags:({shippingId:t})=>C(["shipping",`shipping-${t}`]),revalidate:()=>{}},taxDefaultGet:{tags:()=>C(["tax-settings"]),revalidate:()=>{}}};import{neon as ft}from"@neondatabase/serverless";var T;process.env.DATABASE_URL&&(T=ft(process.env.DATABASE_URL));var O=1e3;function te({productId:t,cartId:e}){return e?gt({cartId:e,productId:t,operation:"INCREASE",clearTaxCalculation:!0}):yt({productId:t})}async function gt({productId:t,cartId:e,operation:n,clearTaxCalculation:a}){let[i,r]=await Promise.all([k(t),at(e)]);if(!i)throw new Error(`Product not found: ${t}`);if(!r)throw new Error(`Cart not found: ${e}`);if(i.metadata.stock<=0)throw Error(`Product ${t} is out of stock`);if(!g.StripeCurrency)throw new Error("Missing `STRIPE_CURRENCY` env variable");if(g.StripeCurrency.toLowerCase()!==i.default_price.currency.toLowerCase())throw new Error(`Product currency ${i.default_price.currency} does not match cart currency ${g.StripeCurrency}`);let o=r.cart.metadata??{},d=L(o[t])+(n==="INCREASE"?1:-1);d<=0?o[t]="":o[t]=d.toString();let y=Ct(r)+(i.default_price.unit_amount??0);try{return await I({paymentIntentId:e,data:{metadata:o,amount:y||O},clearTaxCalculation:a})}catch(l){u.error(l)}finally{E(`cart-${e}`)}}async function B(t){let{stripeAccount:e,storeId:n,secretKey:a}=await p(),i=m({secretKey:a,tagPrefix:n,tags:w.cartGetById.tags({cartId:t}),cache:"force-cache"});try{let r=await i.paymentIntents.retrieve(t,{expand:["payment_method","customer"]},{stripeAccount:e});if(rt.includes(r.status)){let o=D(r);if(!o)return null;let s=await V(o.metadata),{metadata:{shippingRateId:h}}=o,d=h&&await N(h);return{cart:o,lines:s.map(({product:y,quantity:l})=>y?{product:y,quantity:l}:null).filter(Boolean),shippingRate:d||null}}}catch(r){if(u.error(r),r instanceof R.errors.StripeError&&r.code==="resource_missing")return null;throw r}}async function yt({productId:t}={}){let{stripeAccount:e,storeId:n,secretKey:a}=await p(),i=m({secretKey:a,tagPrefix:n,cache:"no-cache"});if(!g.StripeCurrency)throw new Error("Missing `STRIPE_CURRENCY` env variable");try{let r=t?await k(t):null;if(r&&r.metadata.stock<=0)throw Error(`Product ${t} is out of stock`);return await i.paymentIntents.create({currency:g.StripeCurrency,amount:r?.default_price.unit_amount||O,automatic_payment_methods:{enabled:!0},metadata:{...r&&{[r.id]:"1"}}},{stripeAccount:e})}catch(r){throw u.error(r),r}}async function ee({cart:t,add:e}){if(!e)return t;let n=await k(e);if(!n)return u.warn(`Product not found: ${e}`),t;let i=(t?.lines.find(o=>o.product.id===e)?t.lines:[...t?.lines??[],{product:n,quantity:0}]).map(o=>o.product.id===e?{...o,quantity:o.quantity+1}:o),r=t?F(t)+(n.default_price.unit_amount??0):n.default_price.unit_amount??0;return{...t,cart:{...t?.cart,amount:r},lines:i}}async function re({cartId:t,productId:e,quantity:n}){let[a,i]=await Promise.all([Q(e),B(t)]);if(!a)throw new Error(`Product not found: ${e}`);if(!i)throw new Error(`Cart not found: ${t}`);if(g.StripeCurrency?.toLowerCase()!==a.default_price.currency.toLowerCase())throw new Error(`Product currency ${a.default_price.currency} does not match cart currency ${g.StripeCurrency}`);let r=i.cart.metadata??{};n<=0?r[e]="":r[e]=n.toString();let o=F(i)+(a.default_price.unit_amount??0);try{return await I({paymentIntentId:t,data:{metadata:r,amount:o||O}})}catch(s){u.error(s)}finally{E(`cart-${t}`)}}async function Q(t){let{stripeAccount:e,storeId:n,secretKey:a}=await p(),i=m({secretKey:a,tagPrefix:n,tags:w.productGetById.tags({productId:t}),cache:"force-cache"});try{let r=await i.products.retrieve(t,{expand:["default_price"]},{stripeAccount:e});return q(r)}catch(r){if(r instanceof R.errors.StripeError&&r.code==="resource_missing")return null;throw r}}async function ne({slug:t}){let{stripeAccount:e,storeId:n,secretKey:a}=await p(),r=await m({secretKey:a,tagPrefix:n,tags:w.productGetBySlug.tags({productSlug:t}),cache:"force-cache"}).products.search({query:U({active:!0,'metadata["slug"]':t}),expand:["data.default_price"]},{stripeAccount:e});if(r.data.length>1&&r.data.some(o=>!o.metadata.variant))throw new Error(`Multiple products found with the same slug (${t}) but no variant set.`);return await Promise.all(r.data.map(o=>Q(o.id))),M(G(r).filter(W))}async function ht(t){let{stripeAccount:e,storeId:n,secretKey:a}=await p();if(t.filter?.category){let i=t.filter?.category,o=await m({secretKey:a,tagPrefix:n,tags:w.productBrowse.tags({category:i}),cache:"force-cache"}).products.search({limit:100,query:U({active:!0,'metadata["category"]':i}),expand:["data.default_price"]},{stripeAccount:e});return M(Y(G(o)).filter(W).slice(t.offset,t.first))}else{let r=await m({secretKey:a,tagPrefix:n,tags:w.productBrowse.tags({}),cache:"force-cache"}).products.list({limit:100,active:!0,expand:["data.default_price"]},{stripeAccount:e});return M(Y(G(r)).filter(W).slice(t.offset,t.first))}}async function ae(){let{stripeAccount:t,storeId:e,secretKey:n}=await p(),i=await m({secretKey:n,tagPrefix:e,tags:w.shippingBrowse.tags(),cache:"force-cache"}).shippingRates.list({active:!0},{stripeAccount:t});return X(i)}async function N(t){let{stripeAccount:e,storeId:n,secretKey:a}=await p(),i=m({secretKey:a,tagPrefix:n,tags:w.shippingGetById.tags({shippingId:t}),cache:"force-cache"});try{let r=await i.shippingRates.retrieve(t,{},{stripeAccount:e});return r}catch(r){if(u.error(r),r instanceof R.errors.StripeError&&r.code==="resource_missing")return null;throw r}}async function ie(){let e=(await ht({first:100})).map(a=>a.metadata.category).filter(Boolean),n=new Set(e);return Array.from(n)}async function oe(t){let{stripeAccount:e,storeId:n,secretKey:a}=await p(),i=m({secretKey:a,tagPrefix:n,tags:w.fileGetById.tags({fileId:t}),cache:"force-cache"});try{return await i.fileLinks.create({file:t},{stripeAccount:e})}catch(r){if(u.error(r),r instanceof R.errors.StripeError&&r.code==="resource_missing")return null;throw r}}async function se(){let{stripeAccount:t,storeId:e,secretKey:n}=await p(),a=m({secretKey:n,tagPrefix:e,tags:w.accountGetById.tags({}),cache:"force-cache"});try{let[i,r]=await z(a.accounts.retrieve({expand:["settings.branding.logo"]},{stripeAccount:t})),o=r?.settings?.branding.logo??null;return!o||typeof o=="string"?{account:r,logo:null}:{account:r,logo:o}}catch(i){if(u.error(i),i instanceof R.errors.StripeError&&i.code==="resource_missing")return null;throw i}}async function xt(t){let{stripeAccount:e,storeId:n,secretKey:a}=await p(),i=m({secretKey:a,tagPrefix:n,tags:w.orderGetById.tags({orderId:t}),cache:"force-cache"});try{let r=await i.paymentIntents.retrieve(t,{expand:["payment_method","latest_charge","customer"]},{stripeAccount:e});return Z(r)}catch(r){if(r instanceof R.errors.StripeError&&r.code==="resource_missing")return null;throw r}}async function ce(t){let e=await xt(t);if(!e)return null;let n=nt(e.metadata),a=await Promise.all(n.map(async([o,s])=>({product:await k(o),quantity:s}))),{metadata:{shippingRateId:i}}=e,r=i&&await N(i);return{order:e,lines:a.map(({product:o,quantity:s})=>o?{product:o,quantity:s}:null).filter(Boolean),shippingRate:r||null}}var k=async t=>{let{stripeAccount:e,storeId:n,secretKey:a}=await p(),i=m({secretKey:a,tagPrefix:n,tags:w.productGetById.tags({productId:t}),cache:"force-cache"});try{let r=await i.products.retrieve(t,{expand:["default_price"]},{stripeAccount:e});return q(r)}catch(r){if(r instanceof R.errors.StripeError&&r.code==="resource_missing")return null;throw r}},rt=["requires_action","requires_confirmation","requires_capture","requires_payment_method"],nt=t=>Object.entries(t??{}).filter(([e])=>e.startsWith("prod_")).map(([e,n])=>[e,L(n)]).filter(([,e])=>e&&Number.isFinite(e)&&e>0),wt=async t=>{let{stripeAccount:e,storeId:n,secretKey:a}=await p(),i=m({secretKey:a,tagPrefix:n,tags:w.cartGetById.tags({cartId:t}),cache:"force-cache"});try{let r=await i.paymentIntents.retrieve(t,{expand:["payment_method","customer"]},{stripeAccount:e});if(rt.includes(r.status))return D(r)}catch(r){if(u.error(r),r instanceof R.errors.StripeError&&r.code==="resource_missing")return null;throw r}};async function V(t){let e=nt(t);return await Promise.all(e.map(async([a,i])=>({product:await k(a),quantity:i})))}var at=async t=>{let e=await wt(t);if(!e)return null;let n=await V(e.metadata),{metadata:{shippingRateId:a}}=e,i=a&&await N(a);return{cart:e,lines:n.map(({product:r,quantity:o})=>r?{product:r,quantity:o}:null).filter(Boolean),shippingRate:i||null}},Ct=t=>t?t.cart.metadata?.taxCalculationId?t.cart.amount:(t.shippingRate?.fixed_amount?.amount??0)+t.lines.reduce((e,{product:n,quantity:a})=>e+(n.default_price?.unit_amount??0)*a,0):0,_t=["billingAddress.country","billingAddress.postalCode","billingAddress.state","taxId","shippingRateId"];function St({oldCart:t,data:e,mergedMetadata:n,lines:a}){if(!process.env.ENABLE_STRIPE_TAX)return!1;let i=Date.now(),r=n.taxCalculationExp?Number.parseInt(n.taxCalculationExp)*1e3:null;if(!r||i>=r)return!0;let o=t.cart.metadata.netAmount||t.cart.amount,s=e.amount,h=_t.some(x=>!n[x]&&!t.cart.metadata[x]?!1:n[x]!==t.cart.metadata[x]),d=a.length!==t.lines.length||a.some(x=>{let v=t.lines.find(f=>f.product.id===x.product?.id);return x.product?.default_price.unit_amount!==v?.product.default_price.unit_amount||x.quantity!==v?.quantity});return s&&o!==s||h||d}var ue=t=>_.object({name:_.string({required_error:t.nameRequired}).min(1,t.nameRequired),city:_.string({required_error:t.cityRequired}).min(1,t.cityRequired),country:_.string({required_error:t.countryRequired}).min(1,t.countryRequired),line1:_.string({required_error:t.line1Required}).min(1,t.line1Required),line2:_.string().optional().nullable().default(""),postalCode:_.string({required_error:t.postalCodeRequired}).min(1,t.postalCodeRequired),state:_.string().optional().nullable().default(""),phone:_.string().optional().nullable().default(""),taxId:_.string().optional().nullable().default(""),email:_.string().optional().nullable().default("")}),bt=async({lineItems:t,billingAddress:e,cartId:n,shippingRateId:a,taxId:i})=>{if(!process.env.ENABLE_STRIPE_TAX)return null;if(!g.StripeCurrency)throw new Error("Missing `STRIPE_CURRENCY` env variable");let{stripeAccount:r,storeId:o,secretKey:s}=await p(),h=m({secretKey:s,tagPrefix:o,tags:w.createTaxCalculation.tags({cartId:n}),cache:"force-cache"});if(!e?.country)return null;let d=a?await N(a):null,y=typeof d?.tax_code=="string"?d.tax_code:d?.tax_code?.id,l=await vt(),x=g.StripeCurrency==="usd"||g.StripeCurrency==="cad"?"exclusive":"inclusive",v=l.defaults.tax_behavior==="inferred_by_currency"?x:l.defaults.tax_behavior??x;l.defaults.tax_behavior||u.warn(`Tax behavior not set in Stripe settings. Inferring from currency ${g.StripeCurrency}: ${x}.`),u.time("createTaxCalculation ${cartId}");let f=await h.tax.calculations.create({expand:["line_items"],line_items:t.map(P=>({...P,tax_behavior:P.tax_behavior??v})),currency:g.StripeCurrency,shipping_cost:d?.active&&d?.fixed_amount?{amount:d.fixed_amount.amount,tax_behavior:d.tax_behavior==="inclusive"?"inclusive":d.tax_behavior==="exclusive"?"exclusive":v,tax_code:y??l.defaults.tax_code??void 0}:void 0,customer_details:{tax_ids:i?[{type:"eu_vat",value:i}]:void 0,address_source:"billing",address:{country:e.country,city:e?.city,line1:e?.line1,line2:e?.line2,postal_code:e?.postalCode,state:e?.state}}},{stripeAccount:r});return u.timeEnd("createTaxCalculation ${cartId}"),f},et={taxBreakdown0:"",taxBreakdown1:"",taxBreakdown2:"",taxBreakdown3:"",taxBreakdown4:"",taxBreakdown5:""},I=async({paymentIntentId:t,data:e,clearTaxCalculation:n})=>{let{stripeAccount:a,storeId:i,secretKey:r}=await p(),o=await at(t);S(o,`Cart not found: ${t}`);let s=K.parse({...o.cart.metadata,...e.metadata});u.time("getProductsFromMetadata");let h=await V(s);u.timeEnd("getProductsFromMetadata");let y=!n&&St({oldCart:o,data:e,mergedMetadata:s,lines:h})?await bt({cartId:t,taxId:s.taxId??null,shippingRateId:s.shippingRateId??null,billingAddress:{country:s["billingAddress.country"]??"",city:s["billingAddress.city"]??"",line1:s["billingAddress.line1"]??"",line2:s["billingAddress.line2"]??"",name:s["billingAddress.name"]??"",postalCode:s["billingAddress.postalCode"]??"",state:s["billingAddress.state"]??""},lineItems:h.map(({product:f,quantity:P})=>{if(f?.default_price.unit_amount)return{product:f.id,reference:[f.metadata.slug,f.metadata.variant].filter(Boolean).join("-"),quantity:P,amount:f.default_price.unit_amount*P,tax_behavior:f.default_price.tax_behavior==="exclusive"?"exclusive":f.default_price.tax_behavior==="inclusive"?"inclusive":void 0,tax_code:f.tax_code?typeof f.tax_code=="string"?f.tax_code:f.tax_code.id:void 0}}).filter(Boolean)}):null,l=e.amount?e.amount.toString():null;if(y){let f=Object.fromEntries(y.tax_breakdown.map($=>({taxType:$.tax_rate_details.tax_type,taxPercentage:$.tax_rate_details.percentage_decimal,taxAmount:$.amount})).map(($,ot)=>[`taxBreakdown${ot}`,JSON.stringify($)])),P=m({secretKey:r,tagPrefix:i,cache:"no-cache"});u.time(`paymentIntents.update ${t}`);let it=await P.paymentIntents.update(t,{...e,amount:y.amount_total,metadata:{...s,...l&&{netAmount:l},...et,...f,taxCalculationId:y.id,taxCalculationExp:y?.expires_at}},{stripeAccount:a});return u.timeEnd(`paymentIntents.update ${t}`),it}let x=m({secretKey:r,tagPrefix:i,cache:"no-cache"});u.time(`paymentIntents.update ${t}`);let v=await x.paymentIntents.update(t,{...e,metadata:{...s,...l&&{netAmount:l},...n&&{...et,taxCalculationId:"",taxCalculationExp:""}}},{stripeAccount:a});return u.timeEnd(`paymentIntents.update ${t}`),v},F=t=>t?t.cart.metadata?.taxCalculationId?t.cart.amount:(t.shippingRate?.fixed_amount?.amount??0)+Rt(t):0,Rt=t=>t?t.lines.reduce((e,{product:n,quantity:a})=>e+(n.default_price?.unit_amount??0)*a,0):0;async function de({productId:t,cartId:e,operation:n,clearTaxCalculation:a}){let[i,r]=await Promise.all([Q(t),B(e)]);if(!i)throw new Error(`Product not found: ${t}`);if(!r)throw new Error(`Cart not found: ${e}`);if(g.StripeCurrency?.toLowerCase()!==i.default_price.currency.toLowerCase())throw new Error(`Product currency ${i.default_price.currency} does not match cart currency ${g.StripeCurrency}`);let o=r.cart.metadata??{},d=L(o[t])+(n==="INCREASE"?1:-1);d<=0?o[t]="":o[t]=d.toString();let y=F(r)+(i.default_price.unit_amount??0);try{return await I({paymentIntentId:e,data:{metadata:o,amount:y||O},clearTaxCalculation:a})}catch(l){u.error(l)}finally{E(`cart-${e}`)}}var pe=async({cartId:t,email:e})=>{let n=await B(t);if(!n)throw new Error(`Cart not found: ${t}`);try{return await I({paymentIntentId:t,data:{metadata:{...n.cart.metadata,email:e}}})}catch(a){u.error(a)}finally{E(`cart-${t}`)}},le=async({cartId:t,taxId:e})=>{let n=await B(t);if(!n)throw new Error(`Cart not found: ${t}`);try{return await I({paymentIntentId:t,data:{metadata:{...n.cart.metadata,taxId:e}}})}catch(a){u.error(a)}finally{E(`cart-${t}`)}};async function me({cartId:t,shippingRateId:e}){let n=await B(t);if(!n)throw new Error(`Cart not found: ${t}`);u.time(`cartSaveShipping ${t}`);let a=await N(e);if(u.timeEnd(`cartSaveShipping ${t}`),!a)throw new Error(`Shipping rate not found: ${e}`);try{u.time(`updatePaymentIntent ${t}`);let i=await I({paymentIntentId:t,data:{metadata:{...n.cart.metadata,shippingRateId:e},amount:F({...n,shippingRate:a})}});return u.timeEnd(`updatePaymentIntent ${t}`),i}catch(i){u.error(i)}finally{E(`cart-${t}`)}}async function fe({cartId:t,billingAddress:e}){if(!await B(t))throw new Error(`Cart not found: ${t}`);try{return await I({paymentIntentId:t,data:{metadata:{"billingAddress.name":e.name,"billingAddress.phone":e.phone,"billingAddress.city":e.city,"billingAddress.country":e.country,"billingAddress.line1":e.line1,"billingAddress.line2":e.line2??"","billingAddress.postalCode":e.postalCode,"billingAddress.state":e.state??"","billingAddress.email":e.email??""}}})}catch(a){u.error(a)}finally{E(`cart-${t}`)}}async function vt(){let{stripeAccount:t,storeId:e,secretKey:n}=await p();return await m({secretKey:n,tagPrefix:e,tags:["tax-settings"],cache:"force-cache"}).tax.settings.retrieve({},{stripeAccount:t})}function ge(t){return Object.entries(t??{}).filter(([e])=>e.startsWith("prod_")).map(([e,n])=>[e,L(n)]).filter(([,e])=>e&&Number.isFinite(e)&&e>0).length}async function ye(t){if(!T)return null;let{storeId:e}=await p();return await T`
|
|
1
|
+
import{z as c}from"zod";function b(t,e){if(!t)throw new Error(e)}var H=async t=>{try{return[null,await t]}catch(e){return[e instanceof Error?e:new Error(String(e)),null]}},L=t=>{if(t==null)return 0;if(typeof t=="number")return t;let e=Number.parseInt(t,10);return Number.isNaN(e)?0:e},Y=t=>{if(t==null)return null;try{return JSON.parse(t)}catch{return null}};var dt=t=>t.toString().replace(/\\/g,"\\\\").replace(/"/g,'\\"'),Q=t=>Object.entries(t).map(([e,n])=>`${e}:"${dt(n)}"`).join(" AND ").trim();function q(t){return t.toSorted((e,n)=>{let a=Number(e.metadata.order),o=Number(n.metadata.order);return Number.isNaN(a)&&Number.isNaN(o)||a===o?n.updated-e.updated:Number.isNaN(a)?1:Number.isNaN(o)?-1:a-o})}var pt=c.object({category:c.string().optional(),order:c.coerce.number().optional(),slug:c.string(),variant:c.string().optional(),stock:c.coerce.number().optional().transform(t=>t===void 0?1/0:t)});function W({default_price:t,marketing_features:e,...n}){return b(t,"Product must have a default price"),b(typeof t=="object","Product default price must be an object"),{...n,default_price:t,marketing_features:e.map(a=>a.name).filter(Boolean),metadata:pt.parse(n.metadata)}}function O(t){return t.data.map(W)}function Z(t){return t}function tt(t){return t.data.map(Z)}function V(t){return t.filter((e,n,a)=>n===a.findIndex(o=>o.metadata.slug===e.metadata.slug))}var K=t=>!t.deleted&&t.active,F=c.object({shippingRateId:c.string().optional(),taxCalculationId:c.string().optional(),taxCalculationExp:c.string().optional(),taxId:c.string().optional(),couponCode:c.string().optional(),taxedAmount:c.string().optional(),"billingAddress.city":c.string().optional(),"billingAddress.country":c.string().optional(),"billingAddress.line1":c.string().optional(),"billingAddress.line2":c.string().optional(),"billingAddress.name":c.string().optional(),"billingAddress.postalCode":c.string().optional(),"billingAddress.state":c.string().optional(),netAmount:c.string().optional(),taxBreakdown0:c.string().optional(),taxBreakdown1:c.string().optional(),taxBreakdown2:c.string().optional(),taxBreakdown3:c.string().optional(),taxBreakdown4:c.string().optional(),taxBreakdown5:c.string().optional()}).and(c.record(c.string())),et=c.object({taxType:c.string(),taxPercentage:c.string(),taxAmount:c.number()});function z(t){let e=t.payment_method;b(typeof e!="string","Payment method should not be a string");let n=t.customer;b(typeof n!="string"&&!n?.deleted,"Customer should not be a string");let a=F.parse(t.metadata),o=Object.entries(a).filter(([r])=>r.startsWith("taxBreakdown")).map(([r,i])=>{let u=et.safeParse(Y(String(i)));return u.success?u.data:null}).filter(Boolean);return{...t,metadata:a,customer:n,payment_method:e,taxBreakdown:o}}function rt({payment_method:t,latest_charge:e,...n}){b(typeof t=="object","Payment method is missing from order"),b(typeof e=="object","Latest charge is missing from order");let a=F.parse(n.metadata),o=Object.entries(a).filter(([r])=>r.startsWith("taxBreakdown")).map(([r,i])=>{let u=et.safeParse(Y(String(i)));return u.success?u.data:null}).filter(Boolean);return{...n,payment_method:t,latest_charge:e,taxBreakdown:o,metadata:a}}import{revalidateTag as P}from"next/cache";import v from"stripe";import{z as S}from"zod";var l=async()=>{let t={stripeAccount:void 0,storeId:void 0,secretKey:void 0,publishableKey:void 0};return await global?.__ynsFindStripeAccount?.()??t};import nt from"stripe";var lt=process.env.STRIPE_SECRET_KEY,mt=process.env.STRIPE_CURRENCY,g={StripeSecretKey:lt,StripeCurrency:mt};var ft=(t,e)=>!t||!e?t:[...t,`prefix-${e}`,...t.map(n=>`${e}-${n}`)],m=({tags:t,revalidate:e,cache:n,tagPrefix:a,secretKey:o})=>{let r=o??g.StripeSecretKey;if(!r)throw new Error("Missing `secretKey` parameter and `STRIPE_SECRET_KEY` env variable.");let i=ft(t,a);return new nt(r,{typescript:!0,apiVersion:"2024-09-30.acacia",httpClient:nt.createFetchHttpClient((h,s)=>fetch(h,{...s,cache:n??s?.cache,next:{tags:i??s?.next?.tags,revalidate:e??s?.next?.revalidate}})),appInfo:{name:"Commerce SDK",version:"beta",url:"https://yournextstore.com",partner_id:"CONS-003378"}})};var R={DEBUG:0,LOG:1,WARN:2,ERROR:3},gt="LOG",yt=process.env.LOG_LEVEL&&process.env.LOG_LEVEL in R?process.env.LOG_LEVEL:gt,T=R[yt],d={time(t){T>R.DEBUG||console.time(t)},timeEnd(t){T>R.DEBUG||console.timeEnd(t)},log(...t){T>R.LOG||console.log(...t)},dir(t,e){T>R.LOG||console.dir(t,e)},warn(...t){T>R.WARN||console.warn(...t)},error(...t){T>R.ERROR||console.error(...t)}};var _=t=>t.filter(Boolean),x={accountGetById:{tags:({accountId:t})=>_(["account",t&&`account-${t}`]),revalidate:()=>{}},cartGetById:{tags:({cartId:t})=>_(["cart",`cart-${t}`]),revalidate:()=>{}},createTaxCalculation:{tags:({cartId:t})=>_(["tax-calculations",`tax-calculations-${t}`]),revalidate:()=>{}},fileGetById:{tags:({fileId:t})=>_(["files",`file-${t}`]),revalidate:()=>{}},orderGetById:{tags:({orderId:t})=>_(["order",`order-${t}`]),revalidate:()=>{}},productBrowse:{tags:({category:t})=>_(["product",t&&`category-${t}`]),revalidate:()=>{}},productGetById:{tags:({productId:t})=>_(["product",`product-${t}`]),revalidate:()=>{}},productGetBySlug:{tags:({productSlug:t})=>_(["product",`product-${t}`]),revalidate:()=>{}},shippingBrowse:{tags:()=>_(["shipping"]),revalidate:()=>{}},shippingGetById:{tags:({shippingId:t})=>_(["shipping",`shipping-${t}`]),revalidate:()=>{}},taxDefaultGet:{tags:()=>_(["tax-settings"]),revalidate:()=>{}}};import{neon as ht}from"@neondatabase/serverless";var B;process.env.DATABASE_URL&&(B=ht(process.env.DATABASE_URL));var j=1e3;function ae({productId:t,cartId:e}){return e?xt({cartId:e,productId:t,operation:"INCREASE",clearTaxCalculation:!0}):wt({productId:t})}async function xt({productId:t,cartId:e,operation:n,clearTaxCalculation:a}){let[o,r]=await Promise.all([k(t),st(e)]);if(!o)throw new Error(`Product not found: ${t}`);if(!r)throw new Error(`Cart not found: ${e}`);if(o.metadata.stock<=0)throw Error(`Product ${t} is out of stock`);if(!g.StripeCurrency)throw new Error("Missing `STRIPE_CURRENCY` env variable");if(g.StripeCurrency.toLowerCase()!==o.default_price.currency.toLowerCase())throw new Error(`Product currency ${o.default_price.currency} does not match cart currency ${g.StripeCurrency}`);let i=r.cart.metadata??{},s=L(i[t])+(n==="INCREASE"?1:-1);s<=0?i[t]="":i[t]=s.toString();let w=bt(r)+(o.default_price.unit_amount??0);try{return await E({paymentIntentId:e,data:{metadata:i,amount:w||j},clearTaxCalculation:a})}catch(y){d.error(y)}finally{P(`cart-${e}`)}}async function $(t){let{stripeAccount:e,storeId:n,secretKey:a}=await l(),o=m({secretKey:a,tagPrefix:n,tags:x.cartGetById.tags({cartId:t}),cache:"force-cache"});try{let r=await o.paymentIntents.retrieve(t,{expand:["payment_method","customer"]},{stripeAccount:e});if(ot.includes(r.status)){let i=z(r);if(!i)return null;let u=await X(i.metadata),{metadata:{shippingRateId:h}}=i,s=h&&await N(h);return{cart:i,lines:u.map(({product:w,quantity:y})=>w?{product:w,quantity:y}:null).filter(Boolean),shippingRate:s||null}}}catch(r){if(d.error(r),r instanceof v.errors.StripeError&&r.code==="resource_missing")return null;throw r}}async function wt({productId:t}={}){let{stripeAccount:e,storeId:n,secretKey:a}=await l(),o=m({secretKey:a,tagPrefix:n,cache:"no-cache"});if(!g.StripeCurrency)throw new Error("Missing `STRIPE_CURRENCY` env variable");try{let r=t?await k(t):null;if(r&&r.metadata.stock<=0)throw Error(`Product ${t} is out of stock`);return await o.paymentIntents.create({currency:g.StripeCurrency,amount:r?.default_price.unit_amount||j,automatic_payment_methods:{enabled:!0},metadata:{...r&&{[r.id]:"1"}}},{stripeAccount:e})}catch(r){throw d.error(r),r}}async function oe({cart:t,add:e}){if(!e)return t;let n=await k(e);if(!n)return d.warn(`Product not found: ${e}`),t;let o=(t?.lines.find(i=>i.product.id===e)?t.lines:[...t?.lines??[],{product:n,quantity:0}]).map(i=>i.product.id===e?{...i,quantity:i.quantity+1}:i),r=t?U(t)+(n.default_price.unit_amount??0):n.default_price.unit_amount??0;return{...t,cart:{...t?.cart,amount:r},lines:o}}async function ie({cartId:t,productId:e,quantity:n}){let[a,o]=await Promise.all([J(e),$(t)]);if(!a)throw new Error(`Product not found: ${e}`);if(!o)throw new Error(`Cart not found: ${t}`);if(g.StripeCurrency?.toLowerCase()!==a.default_price.currency.toLowerCase())throw new Error(`Product currency ${a.default_price.currency} does not match cart currency ${g.StripeCurrency}`);let r=o.cart.metadata??{};n<=0?r[e]="":r[e]=n.toString();let i=U(o)+(a.default_price.unit_amount??0);try{return await E({paymentIntentId:t,data:{metadata:r,amount:i||j}})}catch(u){d.error(u)}finally{P(`cart-${t}`)}}async function J(t){let{stripeAccount:e,storeId:n,secretKey:a}=await l(),o=m({secretKey:a,tagPrefix:n,tags:x.productGetById.tags({productId:t}),cache:"force-cache"});try{let r=await o.products.retrieve(t,{expand:["default_price"]},{stripeAccount:e});return W(r)}catch(r){if(r instanceof v.errors.StripeError&&r.code==="resource_missing")return null;throw r}}async function se({slug:t}){let{stripeAccount:e,storeId:n,secretKey:a}=await l(),r=await m({secretKey:a,tagPrefix:n,tags:x.productGetBySlug.tags({productSlug:t}),cache:"force-cache"}).products.search({query:Q({active:!0,'metadata["slug"]':t}),expand:["data.default_price"]},{stripeAccount:e});if(r.data.length>1&&r.data.some(i=>!i.metadata.variant))throw new Error(`Multiple products found with the same slug (${t}) but no variant set.`);return await Promise.all(r.data.map(i=>J(i.id))),q(O(r).filter(K))}async function Ct(t){let{stripeAccount:e,storeId:n,secretKey:a}=await l();if(t.filter?.category){let o=t.filter?.category,i=await m({secretKey:a,tagPrefix:n,tags:x.productBrowse.tags({category:o}),cache:"force-cache"}).products.search({limit:100,query:Q({active:!0,'metadata["category"]':o}),expand:["data.default_price"]},{stripeAccount:e});return q(V(O(i)).filter(K).slice(t.offset,t.first))}else{let r=await m({secretKey:a,tagPrefix:n,tags:x.productBrowse.tags({}),cache:"force-cache"}).products.list({limit:100,active:!0,expand:["data.default_price"]},{stripeAccount:e});return q(V(O(r)).filter(K).slice(t.offset,t.first))}}async function ce(){let{stripeAccount:t,storeId:e,secretKey:n}=await l(),o=await m({secretKey:n,tagPrefix:e,tags:x.shippingBrowse.tags(),cache:"force-cache"}).shippingRates.list({active:!0},{stripeAccount:t});return tt(o)}async function N(t){let{stripeAccount:e,storeId:n,secretKey:a}=await l(),o=m({secretKey:a,tagPrefix:n,tags:x.shippingGetById.tags({shippingId:t}),cache:"force-cache"});try{let r=await o.shippingRates.retrieve(t,{},{stripeAccount:e});return r}catch(r){if(d.error(r),r instanceof v.errors.StripeError&&r.code==="resource_missing")return null;throw r}}async function ue(){let e=(await Ct({first:100})).map(a=>a.metadata.category).filter(Boolean),n=new Set(e);return Array.from(n)}async function de(t){let{stripeAccount:e,storeId:n,secretKey:a}=await l(),o=m({secretKey:a,tagPrefix:n,tags:x.fileGetById.tags({fileId:t}),cache:"force-cache"});try{return await o.fileLinks.create({file:t},{stripeAccount:e})}catch(r){if(d.error(r),r instanceof v.errors.StripeError&&r.code==="resource_missing")return null;throw r}}async function pe(){let{stripeAccount:t,storeId:e,secretKey:n}=await l(),a=m({secretKey:n,tagPrefix:e,tags:x.accountGetById.tags({}),cache:"force-cache"});try{let[o,r]=await H(a.accounts.retrieve({expand:["settings.branding.logo"]},{stripeAccount:t})),i=r?.settings?.branding.logo??null;return!i||typeof i=="string"?{account:r,logo:null}:{account:r,logo:i}}catch(o){if(d.error(o),o instanceof v.errors.StripeError&&o.code==="resource_missing")return null;throw o}}async function _t(t){let{stripeAccount:e,storeId:n,secretKey:a}=await l(),o=m({secretKey:a,tagPrefix:n,tags:x.orderGetById.tags({orderId:t}),cache:"force-cache"});try{let r=await o.paymentIntents.retrieve(t,{expand:["payment_method","latest_charge","customer"]},{stripeAccount:e});return rt(r)}catch(r){if(r instanceof v.errors.StripeError&&r.code==="resource_missing")return null;throw r}}async function le(t){let e=await _t(t);if(!e)return null;let n=it(e.metadata),a=await Promise.all(n.map(async([i,u])=>({product:await k(i),quantity:u}))),{metadata:{shippingRateId:o}}=e,r=o&&await N(o);return{order:e,lines:a.map(({product:i,quantity:u})=>i?{product:i,quantity:u}:null).filter(Boolean),shippingRate:r||null}}var k=async t=>{let{stripeAccount:e,storeId:n,secretKey:a}=await l(),o=m({secretKey:a,tagPrefix:n,tags:x.productGetById.tags({productId:t}),cache:"force-cache"});try{let r=await o.products.retrieve(t,{expand:["default_price"]},{stripeAccount:e});return W(r)}catch(r){if(r instanceof v.errors.StripeError&&r.code==="resource_missing")return null;throw r}},ot=["requires_action","requires_confirmation","requires_capture","requires_payment_method"],it=t=>Object.entries(t??{}).filter(([e])=>e.startsWith("prod_")).map(([e,n])=>[e,L(n)]).filter(([,e])=>e&&Number.isFinite(e)&&e>0),St=async t=>{let{stripeAccount:e,storeId:n,secretKey:a}=await l(),o=m({secretKey:a,tagPrefix:n,tags:x.cartGetById.tags({cartId:t}),cache:"force-cache"});try{let r=await o.paymentIntents.retrieve(t,{expand:["payment_method"]},{stripeAccount:e}),i=typeof r.customer=="string"?await ct(r.customer):null;if(ot.includes(r.status))return z({...r,customer:i})}catch(r){if(d.error(r),r instanceof v.errors.StripeError&&r.code==="resource_missing")return null;throw r}};async function X(t){let e=it(t);return await Promise.all(e.map(async([a,o])=>({product:await k(a),quantity:o})))}var st=async t=>{let e=await St(t);if(!e)return null;let n=await X(e.metadata),{metadata:{shippingRateId:a}}=e,o=a&&await N(a);return{cart:e,lines:n.map(({product:r,quantity:i})=>r?{product:r,quantity:i}:null).filter(Boolean),shippingRate:o||null}},bt=t=>t?t.cart.metadata?.taxCalculationId?t.cart.amount:(t.shippingRate?.fixed_amount?.amount??0)+t.lines.reduce((e,{product:n,quantity:a})=>e+(n.default_price?.unit_amount??0)*a,0):0,vt=["billingAddress.country","billingAddress.postalCode","billingAddress.state","taxId","shippingRateId","couponCode"];function Rt({oldCart:t,data:e,mergedMetadata:n,lines:a}){if(!process.env.ENABLE_STRIPE_TAX)return!1;let o=Date.now(),r=n.taxCalculationExp?Number.parseInt(n.taxCalculationExp)*1e3:null;if(!r||o>=r)return!0;let i=t.cart.metadata.netAmount||t.cart.amount,u=e.amount,h=vt.some(p=>!n[p]&&!t.cart.metadata[p]?!1:n[p]!==t.cart.metadata[p]),s=a.length!==t.lines.length||a.some(p=>{let C=t.lines.find(I=>I.product.id===p.product?.id);return p.product?.default_price.unit_amount!==C?.product.default_price.unit_amount||p.quantity!==C?.quantity});return u&&i!==u||h||s}var me=t=>S.object({name:S.string({required_error:t.nameRequired}).min(1,t.nameRequired),city:S.string({required_error:t.cityRequired}).min(1,t.cityRequired),country:S.string({required_error:t.countryRequired}).min(1,t.countryRequired),line1:S.string({required_error:t.line1Required}).min(1,t.line1Required),line2:S.string().optional().nullable().default(""),postalCode:S.string({required_error:t.postalCodeRequired}).min(1,t.postalCodeRequired),state:S.string().optional().nullable().default(""),phone:S.string().optional().nullable().default(""),taxId:S.string().optional().nullable().default(""),email:S.string().optional().nullable().default("")}),Pt=async({lineItems:t,billingAddress:e,cartId:n,shippingRateId:a,taxId:o})=>{if(!process.env.ENABLE_STRIPE_TAX)return null;if(!g.StripeCurrency)throw new Error("Missing `STRIPE_CURRENCY` env variable");let{stripeAccount:r,storeId:i,secretKey:u}=await l(),h=m({secretKey:u,tagPrefix:i,tags:x.createTaxCalculation.tags({cartId:n}),cache:"force-cache"});if(!e?.country)return null;let s=a?await N(a):null,w=typeof s?.tax_code=="string"?s.tax_code:s?.tax_code?.id,y=await At(),p=g.StripeCurrency==="usd"||g.StripeCurrency==="cad"?"exclusive":"inclusive",C=y.defaults.tax_behavior==="inferred_by_currency"?p:y.defaults.tax_behavior??p;y.defaults.tax_behavior||d.warn(`Tax behavior not set in Stripe settings. Inferring from currency ${g.StripeCurrency}: ${p}.`),d.time("createTaxCalculation ${cartId}");let I=await h.tax.calculations.create({expand:["line_items"],line_items:t.map(M=>({...M,tax_behavior:M.tax_behavior??C})),currency:g.StripeCurrency,shipping_cost:s?.active&&s?.fixed_amount?{amount:s.fixed_amount.amount,tax_behavior:s.tax_behavior==="inclusive"?"inclusive":s.tax_behavior==="exclusive"?"exclusive":C,tax_code:w??y.defaults.tax_code??void 0}:void 0,customer_details:{tax_ids:o?[{type:"eu_vat",value:o}]:void 0,address_source:"billing",address:{country:e.country,city:e?.city,line1:e?.line1,line2:e?.line2,postal_code:e?.postalCode,state:e?.state}}},{stripeAccount:r});return d.timeEnd("createTaxCalculation ${cartId}"),console.log(JSON.stringify(I).length),I},at={taxBreakdown0:"",taxBreakdown1:"",taxBreakdown2:"",taxBreakdown3:"",taxBreakdown4:"",taxBreakdown5:""};async function ct(t){let{stripeAccount:e,storeId:n,secretKey:a}=await l(),o=m({secretKey:a,tagPrefix:n,tags:["customers",`customers-${t}`],cache:"force-cache"});try{let r=await o.customers.retrieve(t,{},{stripeAccount:e});return r.deleted?null:r}catch(r){if(d.error(r),r instanceof v.errors.StripeError&&r.code==="resource_missing")return null;throw r}}function Et(t,e){return e.coupon.amount_off?Math.max(t-e.coupon.amount_off,0):e.coupon.percent_off?Math.floor(t*(1-e.coupon.percent_off/100)):t}var E=async({paymentIntentId:t,data:e,customerOverride:n,clearTaxCalculation:a})=>{let{stripeAccount:o,storeId:r,secretKey:i}=await l(),u=await st(t);b(u,`Cart not found: ${t}`);let h=e.amount?e.amount.toString():null,s=F.parse({...u.cart.metadata,...e.metadata});d.time("getProductsFromMetadata");let w=await X(s);d.timeEnd("getProductsFromMetadata");let y=!a&&Rt({oldCart:u,data:e,mergedMetadata:s,lines:w});console.log({shouldRecalculateTax:y});let p=y?await Pt({cartId:t,taxId:s.taxId??null,shippingRateId:s.shippingRateId??null,billingAddress:{country:s["billingAddress.country"]??"",city:s["billingAddress.city"]??"",line1:s["billingAddress.line1"]??"",line2:s["billingAddress.line2"]??"",name:s["billingAddress.name"]??"",postalCode:s["billingAddress.postalCode"]??"",state:s["billingAddress.state"]??""},lineItems:w.map(({product:f,quantity:G})=>{if(f?.default_price.unit_amount)return{product:f.id,reference:[f.metadata.slug,f.metadata.variant].filter(Boolean).join("-"),quantity:G,amount:f.default_price.unit_amount*G,tax_behavior:f.default_price.tax_behavior==="exclusive"?"exclusive":f.default_price.tax_behavior==="inclusive"?"inclusive":void 0,tax_code:f.tax_code?typeof f.tax_code=="string"?f.tax_code:f.tax_code.id:void 0}}).filter(Boolean)}):null,C=n??(e.customer?await ct(e.customer):u.cart.customer);console.log({customer:C});let I=m({secretKey:i,tagPrefix:r,cache:"no-cache"});d.time(`paymentIntents.update ${t}`);let M=p&&Object.fromEntries(p.tax_breakdown.map(f=>({taxType:f.tax_rate_details.tax_type,taxPercentage:f.tax_rate_details.percentage_decimal,taxAmount:f.amount})).map((f,G)=>[`taxBreakdown${G}`,JSON.stringify(f)])),A=p?p.amount_total:e.amount,D=A&&C?.discount?.coupon.valid?Et(A,C.discount):A;console.log({"discount.coupon.amount_off":C?.discount?.coupon.amount_off,"discount.coupon.percent_off":C?.discount?.coupon.percent_off,discountedAmount:D,taxedAmount:A,"taxCalculation.amount_total":p?.amount_total,"data.amount":e.amount,netAmount:h});let ut=await I.paymentIntents.update(t,{...e,...D&&{amount:D},metadata:{...s,...h&&{netAmount:h},...A&&{taxedAmount:A},...p?{...at,...M,taxCalculationId:p.id,taxCalculationExp:p?.expires_at}:{...a&&{...at,taxCalculationId:"",taxCalculationExp:""}}}},{stripeAccount:o});return d.timeEnd(`paymentIntents.update ${t}`),ut},U=t=>t?t.cart.metadata?.taxCalculationId?t.cart.amount:(t.shippingRate?.fixed_amount?.amount??0)+It(t):0,It=t=>t?t.lines.reduce((e,{product:n,quantity:a})=>e+(n.default_price?.unit_amount??0)*a,0):0;async function fe({productId:t,cartId:e,operation:n,clearTaxCalculation:a}){let[o,r]=await Promise.all([J(t),$(e)]);if(!o)throw new Error(`Product not found: ${t}`);if(!r)throw new Error(`Cart not found: ${e}`);if(g.StripeCurrency?.toLowerCase()!==o.default_price.currency.toLowerCase())throw new Error(`Product currency ${o.default_price.currency} does not match cart currency ${g.StripeCurrency}`);let i=r.cart.metadata??{},s=L(i[t])+(n==="INCREASE"?1:-1);s<=0?i[t]="":i[t]=s.toString();let w=U(r)+(o.default_price.unit_amount??0);try{return await E({paymentIntentId:e,data:{metadata:i,amount:w||j},clearTaxCalculation:a})}catch(y){d.error(y)}finally{P(`cart-${e}`)}}var ge=async({cartId:t,email:e})=>{let n=await $(t);if(!n)throw new Error(`Cart not found: ${t}`);try{return await E({paymentIntentId:t,data:{metadata:{...n.cart.metadata,email:e}}})}catch(a){d.error(a)}finally{P(`cart-${t}`)}},ye=async({cartId:t,taxId:e})=>{let n=await $(t);if(!n)throw new Error(`Cart not found: ${t}`);try{return await E({paymentIntentId:t,data:{metadata:{...n.cart.metadata,taxId:e}}})}catch(a){d.error(a)}finally{P(`cart-${t}`)}};async function he({cartId:t,shippingRateId:e}){let n=await $(t);if(!n)throw new Error(`Cart not found: ${t}`);d.time(`cartSaveShipping ${t}`);let a=await N(e);if(d.timeEnd(`cartSaveShipping ${t}`),!a)throw new Error(`Shipping rate not found: ${e}`);try{d.time(`updatePaymentIntent ${t}`);let o=await E({paymentIntentId:t,data:{metadata:{...n.cart.metadata,shippingRateId:e},amount:U({...n,shippingRate:a})}});return d.timeEnd(`updatePaymentIntent ${t}`),o}catch(o){d.error(o)}finally{P(`cart-${t}`)}}async function xe({cartId:t,billingAddress:e}){if(!await $(t))throw new Error(`Cart not found: ${t}`);try{return await E({paymentIntentId:t,data:{metadata:{"billingAddress.name":e.name,"billingAddress.phone":e.phone,"billingAddress.city":e.city,"billingAddress.country":e.country,"billingAddress.line1":e.line1,"billingAddress.line2":e.line2??"","billingAddress.postalCode":e.postalCode,"billingAddress.state":e.state??"","billingAddress.email":e.email??""}}})}catch(a){d.error(a)}finally{P(`cart-${t}`)}}async function At(){let{stripeAccount:t,storeId:e,secretKey:n}=await l();return await m({secretKey:n,tagPrefix:e,tags:["tax-settings"],cache:"force-cache"}).tax.settings.retrieve({},{stripeAccount:t})}function we(t){return Object.entries(t??{}).filter(([e])=>e.startsWith("prod_")).map(([e,n])=>[e,L(n)]).filter(([,e])=>e&&Number.isFinite(e)&&e>0).length}async function Ce(t){if(!B)return null;let{storeId:e}=await l();return await B`
|
|
2
2
|
select * from reviews
|
|
3
3
|
where product_id = ${t.productId} and store_id = ${e}
|
|
4
4
|
order by created_at desc
|
|
5
5
|
limit ${t.first??100}
|
|
6
6
|
offset ${t.offset??0}
|
|
7
|
-
`}async function
|
|
7
|
+
`}async function _e(t){if(!B)return null;let{storeId:e}=await l();return await B`
|
|
8
8
|
insert into reviews (store_id, product_id, author, email, content, rating, created_at, updated_at)
|
|
9
9
|
values (${e}, ${t.productId}, ${t.author}, ${t.email}, ${t.content}, ${t.rating}, now(), now())
|
|
10
|
-
`}var
|
|
10
|
+
`}var Se=l;export{pe as accountGet,bt as calculateCartTotalNet,It as calculateCartTotalNetWithoutShipping,U as calculateCartTotalPossiblyWithTax,ae as cartAdd,oe as cartAddOptimistic,fe as cartChangeQuantity,we as cartCount,wt as cartCreate,$ as cartGet,xe as cartSaveBillingAddress,ge as cartSaveEmail,he as cartSaveShipping,ye as cartSaveTax,ie as cartSetQuantity,xt as cartUpdateQuantity,ue as categoryBrowse,Se as contextGet,de as fileGet,me as getAddressSchema,st as getCartWithProductsById,it as getProductsFromCart,X as getProductsFromMetadata,le as orderGet,Ct as productBrowse,se as productGet,J as productGetById,_e as productReviewAdd,Ce as productReviewBrowse,m as provider,ce as shippingBrowse,N as shippingGet,At as taxDefaultGet,E as updatePaymentIntent};
|
package/dist/internal.d.ts
CHANGED
|
@@ -170,6 +170,8 @@ declare const cartMetadataSchema: z.ZodIntersection<z.ZodObject<{
|
|
|
170
170
|
taxCalculationId: z.ZodOptional<z.ZodString>;
|
|
171
171
|
taxCalculationExp: z.ZodOptional<z.ZodString>;
|
|
172
172
|
taxId: z.ZodOptional<z.ZodString>;
|
|
173
|
+
couponCode: z.ZodOptional<z.ZodString>;
|
|
174
|
+
taxedAmount: z.ZodOptional<z.ZodString>;
|
|
173
175
|
"billingAddress.city": z.ZodOptional<z.ZodString>;
|
|
174
176
|
"billingAddress.country": z.ZodOptional<z.ZodString>;
|
|
175
177
|
"billingAddress.line1": z.ZodOptional<z.ZodString>;
|
|
@@ -189,6 +191,8 @@ declare const cartMetadataSchema: z.ZodIntersection<z.ZodObject<{
|
|
|
189
191
|
taxCalculationId?: string | undefined;
|
|
190
192
|
taxCalculationExp?: string | undefined;
|
|
191
193
|
taxId?: string | undefined;
|
|
194
|
+
couponCode?: string | undefined;
|
|
195
|
+
taxedAmount?: string | undefined;
|
|
192
196
|
"billingAddress.city"?: string | undefined;
|
|
193
197
|
"billingAddress.country"?: string | undefined;
|
|
194
198
|
"billingAddress.line1"?: string | undefined;
|
|
@@ -208,6 +212,8 @@ declare const cartMetadataSchema: z.ZodIntersection<z.ZodObject<{
|
|
|
208
212
|
taxCalculationId?: string | undefined;
|
|
209
213
|
taxCalculationExp?: string | undefined;
|
|
210
214
|
taxId?: string | undefined;
|
|
215
|
+
couponCode?: string | undefined;
|
|
216
|
+
taxedAmount?: string | undefined;
|
|
211
217
|
"billingAddress.city"?: string | undefined;
|
|
212
218
|
"billingAddress.country"?: string | undefined;
|
|
213
219
|
"billingAddress.line1"?: string | undefined;
|
|
@@ -249,6 +255,8 @@ declare function mapCart(cart: Stripe.PaymentIntent): {
|
|
|
249
255
|
taxCalculationId?: string | undefined;
|
|
250
256
|
taxCalculationExp?: string | undefined;
|
|
251
257
|
taxId?: string | undefined;
|
|
258
|
+
couponCode?: string | undefined;
|
|
259
|
+
taxedAmount?: string | undefined;
|
|
252
260
|
"billingAddress.city"?: string | undefined;
|
|
253
261
|
"billingAddress.country"?: string | undefined;
|
|
254
262
|
"billingAddress.line1"?: string | undefined;
|
|
@@ -264,6 +272,7 @@ declare function mapCart(cart: Stripe.PaymentIntent): {
|
|
|
264
272
|
taxBreakdown4?: string | undefined;
|
|
265
273
|
taxBreakdown5?: string | undefined;
|
|
266
274
|
} & Record<string, string>;
|
|
275
|
+
customer: Stripe.Customer | null;
|
|
267
276
|
payment_method: Stripe.PaymentMethod | null;
|
|
268
277
|
taxBreakdown: {
|
|
269
278
|
taxPercentage: string;
|
|
@@ -286,7 +295,6 @@ declare function mapCart(cart: Stripe.PaymentIntent): {
|
|
|
286
295
|
confirmation_method: Stripe.PaymentIntent.ConfirmationMethod;
|
|
287
296
|
created: number;
|
|
288
297
|
currency: string;
|
|
289
|
-
customer: string | Stripe.Customer | Stripe.DeletedCustomer | null;
|
|
290
298
|
description: string | null;
|
|
291
299
|
invoice: string | Stripe.Invoice | null;
|
|
292
300
|
last_payment_error: Stripe.PaymentIntent.LastPaymentError | null;
|
|
@@ -326,6 +334,8 @@ declare function mapOrder({ payment_method, latest_charge, ...order }: Stripe.Pa
|
|
|
326
334
|
taxCalculationId?: string | undefined;
|
|
327
335
|
taxCalculationExp?: string | undefined;
|
|
328
336
|
taxId?: string | undefined;
|
|
337
|
+
couponCode?: string | undefined;
|
|
338
|
+
taxedAmount?: string | undefined;
|
|
329
339
|
"billingAddress.city"?: string | undefined;
|
|
330
340
|
"billingAddress.country"?: string | undefined;
|
|
331
341
|
"billingAddress.line1"?: string | undefined;
|
package/dist/internal.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z as e}from"zod";function i(t,r){if(!t)throw new Error(r)}var
|
|
1
|
+
import{z as e}from"zod";function i(t,r){if(!t)throw new Error(r)}var d=t=>{if(t==null)return null;try{return JSON.parse(t)}catch{return null}};var m=t=>t.toString().replace(/\\/g,"\\\\").replace(/"/g,'\\"'),y=t=>Object.entries(t).map(([r,n])=>`${r}:"${m(n)}"`).join(" AND ").trim();function w(t){return t.toSorted((r,n)=>{let a=Number(r.metadata.order),o=Number(n.metadata.order);return Number.isNaN(a)&&Number.isNaN(o)||a===o?n.updated-r.updated:Number.isNaN(a)?1:Number.isNaN(o)?-1:a-o})}var g=e.object({category:e.string().optional(),order:e.coerce.number().optional(),slug:e.string(),variant:e.string().optional(),stock:e.coerce.number().optional().transform(t=>t===void 0?1/0:t)});function f({default_price:t,marketing_features:r,...n}){return i(t,"Product must have a default price"),i(typeof t=="object","Product default price must be an object"),{...n,default_price:t,marketing_features:r.map(a=>a.name).filter(Boolean),metadata:g.parse(n.metadata)}}function k(t){return t.data.map(f)}function x(t){return t}function N(t){return t.data.map(x)}function T(t){return t.filter((r,n,a)=>n===a.findIndex(o=>o.metadata.slug===r.metadata.slug))}var B=t=>!t.deleted&&t.active,l=e.object({shippingRateId:e.string().optional(),taxCalculationId:e.string().optional(),taxCalculationExp:e.string().optional(),taxId:e.string().optional(),couponCode:e.string().optional(),taxedAmount:e.string().optional(),"billingAddress.city":e.string().optional(),"billingAddress.country":e.string().optional(),"billingAddress.line1":e.string().optional(),"billingAddress.line2":e.string().optional(),"billingAddress.name":e.string().optional(),"billingAddress.postalCode":e.string().optional(),"billingAddress.state":e.string().optional(),netAmount:e.string().optional(),taxBreakdown0:e.string().optional(),taxBreakdown1:e.string().optional(),taxBreakdown2:e.string().optional(),taxBreakdown3:e.string().optional(),taxBreakdown4:e.string().optional(),taxBreakdown5:e.string().optional()}).and(e.record(e.string())),c=e.object({taxType:e.string(),taxPercentage:e.string(),taxAmount:e.number()});function A(t){let r=t.payment_method;i(typeof r!="string","Payment method should not be a string");let n=t.customer;i(typeof n!="string"&&!n?.deleted,"Customer should not be a string");let a=l.parse(t.metadata),o=Object.entries(a).filter(([s])=>s.startsWith("taxBreakdown")).map(([s,u])=>{let p=c.safeParse(d(String(u)));return p.success?p.data:null}).filter(Boolean);return{...t,metadata:a,customer:n,payment_method:r,taxBreakdown:o}}function R({payment_method:t,latest_charge:r,...n}){i(typeof t=="object","Payment method is missing from order"),i(typeof r=="object","Latest charge is missing from order");let a=l.parse(n.metadata),o=Object.entries(a).filter(([s])=>s.startsWith("taxBreakdown")).map(([s,u])=>{let p=c.safeParse(d(String(u)));return p.success?p.data:null}).filter(Boolean);return{...n,payment_method:t,latest_charge:r,taxBreakdown:o,metadata:a}}export{l as cartMetadataSchema,c as cartMetadataTaxBreakdownSchema,T as getUniqueVariants,B as isProductAvailable,A as mapCart,R as mapOrder,f as mapProduct,k as mapProducts,x as mapShippingRate,N as mapShippingRates,y as objectToStripeQuery,m as sanitizeQueryValue,w as sortProducts};
|