commerce-kit 0.0.14 → 0.0.16

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 CHANGED
@@ -1,5 +1,6 @@
1
1
  import { CartMetadata, MappedCart } from './internal.js';
2
2
  export { MappedProduct, MappedShippingRate } from './internal.js';
3
+ import { Config } from './yns.js';
3
4
  import Stripe from 'stripe';
4
5
  import { z, TypeOf } from 'zod';
5
6
 
@@ -698,6 +699,37 @@ declare function cartSaveBillingAddress({ cartId, billingAddress, }: {
698
699
  }): Promise<Stripe.Response<Stripe.PaymentIntent> | undefined>;
699
700
  declare function taxDefaultGet(): Promise<Stripe.Response<Stripe.Tax.Settings>>;
700
701
  declare function cartCount(metadata: CartMetadata): number;
702
+ type Review = {
703
+ id: string;
704
+ store_id: string;
705
+ product_id: string;
706
+ created_at: string;
707
+ updated_at: string;
708
+ author: string;
709
+ email: string;
710
+ content: string;
711
+ rating: number;
712
+ };
713
+ declare function productReviewBrowse(params: {
714
+ productId: string;
715
+ first?: number;
716
+ last?: number;
717
+ offset?: number;
718
+ filter?: {};
719
+ }): Promise<Review[]>;
720
+ declare function productReviewAdd(params: {
721
+ productId: string;
722
+ author: string;
723
+ email: string;
724
+ content: string;
725
+ rating: number;
726
+ }): Promise<any>;
727
+ declare const contextGet: () => Promise<{
728
+ stripeAccount: string | undefined;
729
+ storeId: string | undefined;
730
+ secretKey: string | undefined;
731
+ config: Config;
732
+ }>;
701
733
 
702
734
  declare const provider: ({ tags, revalidate, cache, tagPrefix, secretKey, }: {
703
735
  tags?: NextFetchRequestConfig["tags"];
@@ -707,4 +739,4 @@ declare const provider: ({ tags, revalidate, cache, tagPrefix, secretKey, }: {
707
739
  secretKey: string | undefined;
708
740
  }) => Stripe;
709
741
 
710
- export { type AddressSchema, type Cart, MappedCart, type ProductsFromMetadata, accountGet, calculateCartTotalNet, calculateCartTotalNetWithoutShipping, calculateCartTotalPossiblyWithTax, cartAdd, cartAddOptimistic, cartChangeQuantity, cartCount, cartCreate, cartGet, cartSaveBillingAddress, cartSaveShipping, cartSaveTax, cartSetQuantity, cartUpdateQuantity, categoryBrowse, fileGet, getAddressSchema, getCartWithProductsById, getProductsFromCart, orderGet, productBrowse, productGet, productGetById, provider, shippingBrowse, shippingGet, taxDefaultGet };
742
+ export { type AddressSchema, type Cart, MappedCart, type ProductsFromMetadata, accountGet, calculateCartTotalNet, calculateCartTotalNetWithoutShipping, calculateCartTotalPossiblyWithTax, cartAdd, cartAddOptimistic, cartChangeQuantity, cartCount, cartCreate, cartGet, cartSaveBillingAddress, cartSaveShipping, cartSaveTax, cartSetQuantity, cartUpdateQuantity, categoryBrowse, contextGet, fileGet, getAddressSchema, getCartWithProductsById, getProductsFromCart, orderGet, productBrowse, productGet, productGetById, productReviewAdd, productReviewBrowse, provider, shippingBrowse, shippingGet, taxDefaultGet };
package/dist/index.js CHANGED
@@ -1 +1,10 @@
1
- import"server-only";import"server-only";import{z as c}from"zod";function S(t,e){if(!t)throw new Error(e)}var V=async t=>{try{return[null,await t]}catch(e){return[e instanceof Error?e:new Error(String(e)),null]}},B=t=>{if(t==null)return 0;if(typeof t=="number")return t;let e=Number.parseInt(t,10);return Number.isNaN(e)?0:e},K=t=>{if(t==null)return null;try{return JSON.parse(t)}catch{return null}};var ct=t=>t.toString().replace(/\\/g,"\\\\").replace(/"/g,'\\"'),j=t=>Object.entries(t).map(([e,a])=>`${e}:"${ct(a)}"`).join(" AND ").trim();function k(t){return t.toSorted((e,a)=>{let n=Number(e.metadata.order),i=Number(a.metadata.order);return Number.isNaN(n)&&Number.isNaN(i)||n===i?a.updated-e.updated:Number.isNaN(n)?1:Number.isNaN(i)?-1:n-i})}var ut=c.object({category:c.string().optional(),order:c.coerce.number().optional(),slug:c.string(),variant:c.string().optional()});function M({default_price:t,marketing_features:e,...a}){return S(t,"Product must have a default price"),S(typeof t=="object","Product default price must be an object"),{...a,default_price:t,marketing_features:e.map(n=>n.name).filter(Boolean),metadata:ut.parse(a.metadata)}}function G(t){return t.data.map(M)}function Y(t){return t}function z(t){return t.data.map(Y)}function U(t){return t.filter((e,a,n)=>a===n.findIndex(i=>i.metadata.slug===e.metadata.slug))}var q=t=>!t.deleted&&t.active,W=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())),J=c.object({taxType:c.string(),taxPercentage:c.string(),taxAmount:c.number()});function Q(t){let e=t.payment_method;S(typeof e!="string","Payment method is missing from cart");let a=W.parse(t.metadata),n=Object.entries(a).filter(([i])=>i.startsWith("taxBreakdown")).map(([i,r])=>{let o=J.safeParse(K(String(r)));return o.success?o.data:null}).filter(Boolean);return{...t,metadata:a,payment_method:e,taxBreakdown:n}}function X({payment_method:t,latest_charge:e,...a}){S(typeof t=="object","Payment method is missing from order"),S(typeof e=="object","Latest charge is missing from order");let n=W.parse(a.metadata),i=Object.entries(n).filter(([r])=>r.startsWith("taxBreakdown")).map(([r,o])=>{let s=J.safeParse(K(String(o)));return s.success?s.data:null}).filter(Boolean);return{...a,payment_method:t,latest_charge:e,taxBreakdown:i,metadata:n}}import"server-only";import{revalidatePath as tt,revalidateTag as A}from"next/cache";import b from"stripe";import{z as _}from"zod";import"server-only";var f=async()=>{let t={stripeAccount:void 0,storeId:void 0,secretKey:void 0};return global.__ynsFindStripeAccount?await global.__ynsFindStripeAccount()??t:t};import"server-only";import Z from"stripe";import"server-only";var pt=process.env.STRIPE_SECRET_KEY,H=process.env.STRIPE_CURRENCY;if(!H)throw new Error("Missing STRIPE_CURRENCY");var x={StripeSecretKey:pt,StripeCurrency:H};var P={DEBUG:0,LOG:1,WARN:2,ERROR:3},dt="LOG",lt=process.env.LOG_LEVEL&&process.env.LOG_LEVEL in P?process.env.LOG_LEVEL:dt,E=P[lt],u={time(t){E>P.DEBUG||console.time(t)},timeEnd(t){E>P.DEBUG||console.timeEnd(t)},log(...t){E>P.LOG||console.log(...t)},dir(t,e){E>P.LOG||console.dir(t,e)},warn(...t){E>P.WARN||console.warn(...t)},error(...t){E>P.ERROR||console.error(...t)}};var mt=(t,e)=>!t||!e?t:[...t,`prefix-${e}`,...t.map(a=>`${e}-${a}`)],l=({tags:t,revalidate:e,cache:a,tagPrefix:n,secretKey:i})=>{let r=i??x.StripeSecretKey;if(!r)throw new Error("Missing `secretKey` parameter and `STRIPE_SECRET_KEY` env variable.");u.log(`Using Stripe secret key from ${i?"parameter":"env"}.`);let o=mt(t,n);return new Z(r,{typescript:!0,apiVersion:"2024-06-20",httpClient:Z.createFetchHttpClient((y,p)=>fetch(y,{...p,cache:a??p?.cache,next:{tags:o??p?.next?.tags,revalidate:e??p?.next?.revalidate}})),appInfo:{name:"Commerce SDK",version:"beta",url:"https://yournextstore.com",partner_id:"CONS-003378"}})};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:()=>{}}};var O=1e3;function re({productId:t,cartId:e}){return e?ft({cartId:e,productId:t,operation:"INCREASE",clearTaxCalculation:!0}):gt({productId:t})}async function ft({productId:t,cartId:e,operation:a,clearTaxCalculation:n}){let[i,r]=await Promise.all([$(t),it(e)]);if(!i)throw new Error(`Product not found: ${t}`);if(!r)throw new Error(`Cart not found: ${e}`);if(x.StripeCurrency.toLowerCase()!==i.default_price.currency.toLowerCase())throw new Error(`Product currency ${i.default_price.currency} does not match cart currency ${x.StripeCurrency}`);let o=r.cart.metadata??{},p=B(o[t])+(a==="INCREASE"?1:-1);p<=0?o[t]="":o[t]=p.toString();let g=wt(r)+(i.default_price.unit_amount??0);try{return await I({paymentIntentId:e,data:{metadata:o,amount:g||O},clearTaxCalculation:n})}catch(d){u.error(d)}finally{A(`cart-${e}`)}}async function L(t){let{stripeAccount:e,storeId:a,secretKey:n}=await f(),i=l({secretKey:n,tagPrefix:a,tags:w.cartGetById.tags({cartId:t}),cache:"force-cache"});try{let r=await i.paymentIntents.retrieve(t,{expand:["payment_method"]},{stripeAccount:e});if(at.includes(r.status)){let o=Q(r);if(!o)return null;let s=await D(o.metadata),{metadata:{shippingRateId:y}}=o,p=y&&await N(y);return{cart:o,lines:s.map(({product:g,quantity:d})=>g?{product:g,quantity:d}:null).filter(Boolean),shippingRate:p||null}}}catch(r){if(u.error(r),r instanceof b.errors.StripeError&&r.code==="resource_missing")return null;throw r}}async function gt({productId:t}={}){let{stripeAccount:e,storeId:a,secretKey:n}=await f(),i=l({secretKey:n,tagPrefix:a,cache:"no-cache"});try{let r=t?await $(t):null;return await i.paymentIntents.create({currency:x.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 ae({cart:t,add:e}){if(!e)return t;let a=await $(e);if(!a)return u.warn(`Product not found: ${e}`),t;let i=(t?.lines.find(o=>o.product.id===e)?t.lines:[...t?.lines??[],{product:a,quantity:0}]).map(o=>o.product.id===e?{...o,quantity:o.quantity+1}:o),r=t?F(t)+(a.default_price.unit_amount??0):a.default_price.unit_amount??0;return{...t,cart:{...t?.cart,amount:r},lines:i}}async function ne({cartId:t,productId:e,quantity:a}){let[n,i]=await Promise.all([rt(e),L(t)]);if(!n)throw new Error(`Product not found: ${e}`);if(!i)throw new Error(`Cart not found: ${t}`);if(x.StripeCurrency?.toLowerCase()!==n.default_price.currency.toLowerCase())throw new Error(`Product currency ${n.default_price.currency} does not match cart currency ${x.StripeCurrency}`);let r=i.cart.metadata??{};a<=0?r[e]="":r[e]=a.toString();let o=F(i)+(n.default_price.unit_amount??0);try{return await I({paymentIntentId:t,data:{metadata:r,amount:o||O}})}catch(s){u.error(s)}finally{A(`cart-${t}`),tt("/cart"),tt("/cart-overlay")}}async function rt(t){let{stripeAccount:e,storeId:a,secretKey:n}=await f(),i=l({secretKey:n,tagPrefix:a,tags:w.productGetById.tags({productId:t}),cache:"force-cache"});try{let r=await i.products.retrieve(t,{expand:["default_price"]},{stripeAccount:e});return M(r)}catch(r){if(r instanceof b.errors.StripeError&&r.code==="resource_missing")return null;throw r}}async function ie({slug:t}){let{stripeAccount:e,storeId:a,secretKey:n}=await f(),r=await l({secretKey:n,tagPrefix:a,tags:w.productGetBySlug.tags({productSlug:t}),cache:"force-cache"}).products.search({query:j({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 k(G(r).filter(q))}async function yt(t){let{stripeAccount:e,storeId:a,secretKey:n}=await f();if(t.filter?.category){let i=t.filter?.category,o=await l({secretKey:n,tagPrefix:a,tags:w.productBrowse.tags({category:i}),cache:"force-cache"}).products.search({limit:100,query:j({active:!0,'metadata["category"]':i}),expand:["data.default_price"]},{stripeAccount:e});return k(U(G(o)).filter(q).slice(t.offset,t.first))}else{let r=await l({secretKey:n,tagPrefix:a,tags:w.productBrowse.tags({}),cache:"force-cache"}).products.list({limit:100,active:!0,expand:["data.default_price"]},{stripeAccount:e});return k(U(G(r)).filter(q).slice(t.offset,t.first))}}async function oe(){let{stripeAccount:t,storeId:e,secretKey:a}=await f(),i=await l({secretKey:a,tagPrefix:e,tags:w.shippingBrowse.tags(),cache:"force-cache"}).shippingRates.list({active:!0},{stripeAccount:t});return z(i)}async function N(t){let{stripeAccount:e,storeId:a,secretKey:n}=await f(),i=l({secretKey:n,tagPrefix:a,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 b.errors.StripeError&&r.code==="resource_missing")return null;throw r}}async function se(){let e=(await yt({first:100})).map(n=>n.metadata.category).filter(Boolean),a=new Set(e);return Array.from(a)}async function ce(t){let{stripeAccount:e,storeId:a,secretKey:n}=await f(),i=l({secretKey:n,tagPrefix:a,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 b.errors.StripeError&&r.code==="resource_missing")return null;throw r}}async function ue(){let{stripeAccount:t,storeId:e,secretKey:a}=await f(),n=l({secretKey:a,tagPrefix:e,tags:w.accountGetById.tags({}),cache:"force-cache"});try{let[i,r]=await V(n.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 b.errors.StripeError&&i.code==="resource_missing")return null;throw i}}async function ht(t){let{stripeAccount:e,storeId:a,secretKey:n}=await f(),i=l({secretKey:n,tagPrefix:a,tags:w.orderGetById.tags({orderId:t}),cache:"force-cache"});try{let r=await i.paymentIntents.retrieve(t,{expand:["payment_method","latest_charge"]},{stripeAccount:e});return X(r)}catch(r){if(r instanceof b.errors.StripeError&&r.code==="resource_missing")return null;throw r}}async function pe(t){let e=await ht(t);if(!e)return null;let a=nt(e.metadata),n=await Promise.all(a.map(async([o,s])=>({product:await $(o),quantity:s}))),{metadata:{shippingRateId:i}}=e,r=i&&await N(i);return{order:e,lines:n.map(({product:o,quantity:s})=>o?{product:o,quantity:s}:null).filter(Boolean),shippingRate:r||null}}var $=async t=>{let{stripeAccount:e,storeId:a,secretKey:n}=await f(),i=l({secretKey:n,tagPrefix:a,tags:w.productGetById.tags({productId:t}),cache:"force-cache"});try{let r=await i.products.retrieve(t,{expand:["default_price"]},{stripeAccount:e});return M(r)}catch(r){if(r instanceof b.errors.StripeError&&r.code==="resource_missing")return null;throw r}},at=["requires_action","requires_confirmation","requires_capture","requires_payment_method"],nt=t=>Object.entries(t??{}).filter(([e])=>e.startsWith("prod_")).map(([e,a])=>[e,B(a)]).filter(([,e])=>e&&Number.isFinite(e)&&e>0),xt=async t=>{let{stripeAccount:e,storeId:a,secretKey:n}=await f(),i=l({secretKey:n,tagPrefix:a,tags:w.cartGetById.tags({cartId:t}),cache:"force-cache"});try{let r=await i.paymentIntents.retrieve(t,{expand:["payment_method"]},{stripeAccount:e});if(at.includes(r.status))return Q(r)}catch(r){if(u.error(r),r instanceof b.errors.StripeError&&r.code==="resource_missing")return null;throw r}};async function D(t){let e=nt(t);return await Promise.all(e.map(async([n,i])=>({product:await $(n),quantity:i})))}var it=async t=>{let e=await xt(t);if(!e)return null;let a=await D(e.metadata),{metadata:{shippingRateId:n}}=e,i=n&&await N(n);return{cart:e,lines:a.map(({product:r,quantity:o})=>r?{product:r,quantity:o}:null).filter(Boolean),shippingRate:i||null}},wt=t=>t?t.cart.metadata?.taxCalculationId?t.cart.amount:(t.shippingRate?.fixed_amount?.amount??0)+t.lines.reduce((e,{product:a,quantity:n})=>e+(a.default_price?.unit_amount??0)*n,0):0,Ct=["billingAddress.country","billingAddress.postalCode","billingAddress.state","taxId","shippingRateId"];function _t({oldCart:t,data:e,mergedMetadata:a,lines:n}){if(!process.env.ENABLE_STRIPE_TAX)return!1;let i=Date.now(),r=a.taxCalculationExp?Number.parseInt(a.taxCalculationExp)*1e3:null;if(!r||i>=r)return!0;let o=t.cart.metadata.netAmount||t.cart.amount,s=e.amount,y=Ct.some(h=>!a[h]&&!t.cart.metadata[h]?!1:a[h]!==t.cart.metadata[h]),p=n.length!==t.lines.length||n.some(h=>{let R=t.lines.find(m=>m.product.id===h.product?.id);return h.product?.default_price.unit_amount!==R?.product.default_price.unit_amount||h.quantity!==R?.quantity});return s&&o!==s||y||p}var de=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("")}),St=async({lineItems:t,billingAddress:e,cartId:a,shippingRateId:n,taxId:i})=>{if(!process.env.ENABLE_STRIPE_TAX)return null;let{stripeAccount:r,storeId:o,secretKey:s}=await f(),y=l({secretKey:s,tagPrefix:o,tags:w.createTaxCalculation.tags({cartId:a}),cache:"force-cache"});if(!e?.country)return null;let p=n?await N(n):null,g=typeof p?.tax_code=="string"?p.tax_code:p?.tax_code?.id,d=await bt(),h=x.StripeCurrency==="usd"||x.StripeCurrency==="cad"?"exclusive":"inclusive",R=d.defaults.tax_behavior==="inferred_by_currency"?h:d.defaults.tax_behavior??h;d.defaults.tax_behavior||u.warn(`Tax behavior not set in Stripe settings. Inferring from currency ${x.StripeCurrency}: ${h}.`),u.time("createTaxCalculation ${cartId}");let m=await y.tax.calculations.create({expand:["line_items"],line_items:t.map(v=>({...v,tax_behavior:v.tax_behavior??R})),currency:x.StripeCurrency,shipping_cost:p?.active&&p?.fixed_amount?{amount:p.fixed_amount.amount,tax_behavior:p.tax_behavior==="inclusive"?"inclusive":p.tax_behavior==="exclusive"?"exclusive":R,tax_code:g??d.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}"),m},et={taxBreakdown0:"",taxBreakdown1:"",taxBreakdown2:"",taxBreakdown3:"",taxBreakdown4:"",taxBreakdown5:""},I=async({paymentIntentId:t,data:e,clearTaxCalculation:a})=>{let{stripeAccount:n,storeId:i,secretKey:r}=await f(),o=await it(t);S(o,`Cart not found: ${t}`);let s=W.parse({...o.cart.metadata,...e.metadata});u.time("getProductsFromMetadata");let y=await D(s);u.timeEnd("getProductsFromMetadata");let g=!a&&_t({oldCart:o,data:e,mergedMetadata:s,lines:y})?await St({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:y.map(({product:m,quantity:v})=>{if(m?.default_price.unit_amount)return{product:m.id,reference:[m.metadata.slug,m.metadata.variant].filter(Boolean).join("-"),quantity:v,amount:m.default_price.unit_amount*v,tax_behavior:m.default_price.tax_behavior==="exclusive"?"exclusive":m.default_price.tax_behavior==="inclusive"?"inclusive":void 0,tax_code:m.tax_code?typeof m.tax_code=="string"?m.tax_code:m.tax_code.id:void 0}}).filter(Boolean)}):null,d=e.amount?e.amount.toString():null;if(g){let m=Object.fromEntries(g.tax_breakdown.map(T=>({taxType:T.tax_rate_details.tax_type,taxPercentage:T.tax_rate_details.percentage_decimal,taxAmount:T.amount})).map((T,st)=>[`taxBreakdown${st}`,JSON.stringify(T)])),v=l({secretKey:r,tagPrefix:i,cache:"no-cache"});u.time(`paymentIntents.update ${t}`);let ot=await v.paymentIntents.update(t,{...e,amount:g.amount_total,metadata:{...s,...d&&{netAmount:d},...et,...m,taxCalculationId:g.id,taxCalculationExp:g?.expires_at}},{stripeAccount:n});return u.timeEnd(`paymentIntents.update ${t}`),ot}let h=l({secretKey:r,tagPrefix:i,cache:"no-cache"});u.time(`paymentIntents.update ${t}`);let R=await h.paymentIntents.update(t,{...e,metadata:{...s,...d&&{netAmount:d},...a&&{...et,taxCalculationId:"",taxCalculationExp:""}}},{stripeAccount:n});return u.timeEnd(`paymentIntents.update ${t}`),R},F=t=>t?t.cart.metadata?.taxCalculationId?t.cart.amount:(t.shippingRate?.fixed_amount?.amount??0)+Pt(t):0,Pt=t=>t?t.lines.reduce((e,{product:a,quantity:n})=>e+(a.default_price?.unit_amount??0)*n,0):0;async function le({productId:t,cartId:e,operation:a,clearTaxCalculation:n}){let[i,r]=await Promise.all([rt(t),L(e)]);if(!i)throw new Error(`Product not found: ${t}`);if(!r)throw new Error(`Cart not found: ${e}`);if(x.StripeCurrency?.toLowerCase()!==i.default_price.currency.toLowerCase())throw new Error(`Product currency ${i.default_price.currency} does not match cart currency ${x.StripeCurrency}`);let o=r.cart.metadata??{},p=B(o[t])+(a==="INCREASE"?1:-1);p<=0?o[t]="":o[t]=p.toString();let g=F(r)+(i.default_price.unit_amount??0);try{return await I({paymentIntentId:e,data:{metadata:o,amount:g||O},clearTaxCalculation:n})}catch(d){u.error(d)}finally{A(`cart-${e}`)}}var me=async({cartId:t,taxId:e})=>{let a=await L(t);if(!a)throw new Error(`Cart not found: ${t}`);try{return await I({paymentIntentId:t,data:{metadata:{...a.cart.metadata,taxId:e}}})}catch(n){u.error(n)}finally{A(`cart-${t}`)}};async function fe({cartId:t,shippingRateId:e}){let a=await L(t);if(!a)throw new Error(`Cart not found: ${t}`);u.time(`cartSaveShipping ${t}`);let n=await N(e);if(u.timeEnd(`cartSaveShipping ${t}`),!n)throw new Error(`Shipping rate not found: ${e}`);try{u.time(`updatePaymentIntent ${t}`);let i=await I({paymentIntentId:t,data:{metadata:{...a.cart.metadata,shippingRateId:e},amount:F({...a,shippingRate:n})}});return u.timeEnd(`updatePaymentIntent ${t}`),i}catch(i){u.error(i)}finally{A(`cart-${t}`)}}async function ge({cartId:t,billingAddress:e}){if(!await L(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??""}}})}catch(n){u.error(n)}finally{A(`cart-${t}`)}}async function bt(){let{stripeAccount:t,storeId:e,secretKey:a}=await f();return await l({secretKey:a,tagPrefix:e,tags:["tax-settings"],cache:"force-cache"}).tax.settings.retrieve({},{stripeAccount:t})}function ye(t){return Object.entries(t??{}).filter(([e])=>e.startsWith("prod_")).map(([e,a])=>[e,B(a)]).filter(([,e])=>e&&Number.isFinite(e)&&e>0).length}export{ue as accountGet,wt as calculateCartTotalNet,Pt as calculateCartTotalNetWithoutShipping,F as calculateCartTotalPossiblyWithTax,re as cartAdd,ae as cartAddOptimistic,le as cartChangeQuantity,ye as cartCount,gt as cartCreate,L as cartGet,ge as cartSaveBillingAddress,fe as cartSaveShipping,me as cartSaveTax,ne as cartSetQuantity,ft as cartUpdateQuantity,se as categoryBrowse,ce as fileGet,de as getAddressSchema,it as getCartWithProductsById,nt as getProductsFromCart,pe as orderGet,yt as productBrowse,ie as productGet,rt as productGetById,l as provider,oe as shippingBrowse,N as shippingGet,bt as taxDefaultGet};
1
+ import"server-only";import"server-only";import{z as u}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]}},$=t=>{if(t==null)return 0;if(typeof t=="number")return t;let e=Number.parseInt(t,10);return Number.isNaN(e)?0:e},F=t=>{if(t==null)return null;try{return JSON.parse(t)}catch{return null}};var dt=t=>t.toString().replace(/\\/g,"\\\\").replace(/"/g,'\\"'),U=t=>Object.entries(t).map(([e,a])=>`${e}:"${dt(a)}"`).join(" AND ").trim();function G(t){return t.toSorted((e,a)=>{let n=Number(e.metadata.order),o=Number(a.metadata.order);return Number.isNaN(n)&&Number.isNaN(o)||n===o?a.updated-e.updated:Number.isNaN(n)?1:Number.isNaN(o)?-1:n-o})}var pt=u.object({category:u.string().optional(),order:u.coerce.number().optional(),slug:u.string(),variant:u.string().optional()});function M({default_price:t,marketing_features:e,...a}){return S(t,"Product must have a default price"),S(typeof t=="object","Product default price must be an object"),{...a,default_price:t,marketing_features:e.map(n=>n.name).filter(Boolean),metadata:pt.parse(a.metadata)}}function q(t){return t.data.map(M)}function H(t){return t}function J(t){return t.data.map(H)}function D(t){return t.filter((e,a,n)=>a===n.findIndex(o=>o.metadata.slug===e.metadata.slug))}var W=t=>!t.deleted&&t.active,j=u.object({shippingRateId:u.string().optional(),taxCalculationId:u.string().optional(),taxCalculationExp:u.string().optional(),taxId:u.string().optional(),"billingAddress.city":u.string().optional(),"billingAddress.country":u.string().optional(),"billingAddress.line1":u.string().optional(),"billingAddress.line2":u.string().optional(),"billingAddress.name":u.string().optional(),"billingAddress.postalCode":u.string().optional(),"billingAddress.state":u.string().optional(),netAmount:u.string().optional(),taxBreakdown0:u.string().optional(),taxBreakdown1:u.string().optional(),taxBreakdown2:u.string().optional(),taxBreakdown3:u.string().optional(),taxBreakdown4:u.string().optional(),taxBreakdown5:u.string().optional()}).and(u.record(u.string())),X=u.object({taxType:u.string(),taxPercentage:u.string(),taxAmount:u.number()});function Y(t){let e=t.payment_method;S(typeof e!="string","Payment method is missing from cart");let a=j.parse(t.metadata),n=Object.entries(a).filter(([o])=>o.startsWith("taxBreakdown")).map(([o,r])=>{let i=X.safeParse(F(String(r)));return i.success?i.data:null}).filter(Boolean);return{...t,metadata:a,payment_method:e,taxBreakdown:n}}function Z({payment_method:t,latest_charge:e,...a}){S(typeof t=="object","Payment method is missing from order"),S(typeof e=="object","Latest charge is missing from order");let n=j.parse(a.metadata),o=Object.entries(n).filter(([r])=>r.startsWith("taxBreakdown")).map(([r,i])=>{let c=X.safeParse(F(String(i)));return c.success?c.data:null}).filter(Boolean);return{...a,payment_method:t,latest_charge:e,taxBreakdown:o,metadata:n}}import"server-only";import{revalidatePath as rt,revalidateTag as E}from"next/cache";import R from"stripe";import{z as b}from"zod";import"server-only";import{z as s}from"zod";var Mt=s.object({hero:s.object({show:s.boolean(),title:s.string(),description:s.string(),button:s.object({label:s.string(),path:s.string()}),image:s.object({src:s.string(),alt:s.string()})}),categorySection:s.object({show:s.boolean()}),nav:s.object({title:s.string(),searchBar:s.object({show:s.boolean()}),links:s.array(s.object({label:s.string(),href:s.string()}))}),footer:s.object({name:s.string(),tagline:s.string(),newsletter:s.object({show:s.boolean()}),credits:s.boolean(),sections:s.array(s.object({header:s.string(),links:s.array(s.object({label:s.string(),href:s.string()}))}))})}),l=async()=>{let t={hero:{show:!0,title:"Discover our Curated Collection",description:"Explore our carefully selected products for your home and lifestyle.",button:{label:"Shop Now",path:"/"},image:{src:"https://files.stripe.com/links/MDB8YWNjdF8xT3BaeG5GSmNWbVh6bURsfGZsX3Rlc3RfaDVvWXowdU9ZbWlobUIyaHpNc1hCeDM200NBzvUjqP",alt:"Cup of coffee"}},categorySection:{show:!0},nav:{title:"Your Next Store",searchBar:{show:!0},links:[{label:"Home",href:"/"},{label:"Apparel",href:"/category/apparel"},{label:"Accessories",href:"/category/accessories"}]},footer:{name:"Your Next Store",tagline:"Handcrafted with passion in California",newsletter:{show:!0},credits:!0,sections:[{header:"Products",links:[{label:"Apparel",href:"/category/apparel"},{label:"Accessories",href:"/category/accessories"}]},{header:"Support",links:[{label:"Features",href:"https://yournextstore.com/#features"},{label:"Pricing",href:"https://yournextstore.com/#pricing"},{label:"Contact Us",href:"mailto:hi@yournextstore.com"}]}]}},e={stripeAccount:void 0,storeId:void 0,secretKey:void 0,config:t},a=await global?.__ynsFindStripeAccount?.();return a?{...a,config:a.config??t}:e};import"server-only";import et from"stripe";import"server-only";var lt=process.env.STRIPE_SECRET_KEY,tt=process.env.STRIPE_CURRENCY;if(!tt)throw new Error("Missing STRIPE_CURRENCY");var w={StripeSecretKey:lt,StripeCurrency:tt};var v={DEBUG:0,LOG:1,WARN:2,ERROR:3},ft="LOG",mt=process.env.LOG_LEVEL&&process.env.LOG_LEVEL in v?process.env.LOG_LEVEL:ft,A=v[mt],d={time(t){A>v.DEBUG||console.time(t)},timeEnd(t){A>v.DEBUG||console.timeEnd(t)},log(...t){A>v.LOG||console.log(...t)},dir(t,e){A>v.LOG||console.dir(t,e)},warn(...t){A>v.WARN||console.warn(...t)},error(...t){A>v.ERROR||console.error(...t)}};var gt=(t,e)=>!t||!e?t:[...t,`prefix-${e}`,...t.map(a=>`${e}-${a}`)],m=({tags:t,revalidate:e,cache:a,tagPrefix:n,secretKey:o})=>{let r=o??w.StripeSecretKey;if(!r)throw new Error("Missing `secretKey` parameter and `STRIPE_SECRET_KEY` env variable.");d.log(`Using Stripe secret key from ${o?"parameter":"env"}.`);let i=gt(t,n);return new et(r,{typescript:!0,apiVersion:"2024-06-20",httpClient:et.createFetchHttpClient((y,p)=>fetch(y,{...p,cache:a??p?.cache,next:{tags:i??p?.next?.tags,revalidate:e??p?.next?.revalidate}})),appInfo:{name:"Commerce SDK",version:"beta",url:"https://yournextstore.com",partner_id:"CONS-003378"}})};var _=t=>t.filter(Boolean),C={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 V=ht(process.env.DATABASE_URL);var O=1e3;function de({productId:t,cartId:e}){return e?yt({cartId:e,productId:t,operation:"INCREASE",clearTaxCalculation:!0}):xt({productId:t})}async function yt({productId:t,cartId:e,operation:a,clearTaxCalculation:n}){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(w.StripeCurrency.toLowerCase()!==o.default_price.currency.toLowerCase())throw new Error(`Product currency ${o.default_price.currency} does not match cart currency ${w.StripeCurrency}`);let i=r.cart.metadata??{},p=$(i[t])+(a==="INCREASE"?1:-1);p<=0?i[t]="":i[t]=p.toString();let h=bt(r)+(o.default_price.unit_amount??0);try{return await T({paymentIntentId:e,data:{metadata:i,amount:h||O},clearTaxCalculation:n})}catch(f){d.error(f)}finally{E(`cart-${e}`)}}async function N(t){let{stripeAccount:e,storeId:a,secretKey:n}=await l(),o=m({secretKey:n,tagPrefix:a,tags:C.cartGetById.tags({cartId:t}),cache:"force-cache"});try{let r=await o.paymentIntents.retrieve(t,{expand:["payment_method"]},{stripeAccount:e});if(ot.includes(r.status)){let i=Y(r);if(!i)return null;let c=await Q(i.metadata),{metadata:{shippingRateId:y}}=i,p=y&&await L(y);return{cart:i,lines:c.map(({product:h,quantity:f})=>h?{product:h,quantity:f}:null).filter(Boolean),shippingRate:p||null}}}catch(r){if(d.error(r),r instanceof R.errors.StripeError&&r.code==="resource_missing")return null;throw r}}async function xt({productId:t}={}){let{stripeAccount:e,storeId:a,secretKey:n}=await l(),o=m({secretKey:n,tagPrefix:a,cache:"no-cache"});try{let r=t?await k(t):null;return await o.paymentIntents.create({currency:w.StripeCurrency,amount:r?.default_price.unit_amount||O,automatic_payment_methods:{enabled:!0},metadata:{...r&&{[r.id]:"1"}}},{stripeAccount:e})}catch(r){throw d.error(r),r}}async function pe({cart:t,add:e}){if(!e)return t;let a=await k(e);if(!a)return d.warn(`Product not found: ${e}`),t;let o=(t?.lines.find(i=>i.product.id===e)?t.lines:[...t?.lines??[],{product:a,quantity:0}]).map(i=>i.product.id===e?{...i,quantity:i.quantity+1}:i),r=t?K(t)+(a.default_price.unit_amount??0):a.default_price.unit_amount??0;return{...t,cart:{...t?.cart,amount:r},lines:o}}async function le({cartId:t,productId:e,quantity:a}){let[n,o]=await Promise.all([nt(e),N(t)]);if(!n)throw new Error(`Product not found: ${e}`);if(!o)throw new Error(`Cart not found: ${t}`);if(w.StripeCurrency?.toLowerCase()!==n.default_price.currency.toLowerCase())throw new Error(`Product currency ${n.default_price.currency} does not match cart currency ${w.StripeCurrency}`);let r=o.cart.metadata??{};a<=0?r[e]="":r[e]=a.toString();let i=K(o)+(n.default_price.unit_amount??0);try{return await T({paymentIntentId:t,data:{metadata:r,amount:i||O}})}catch(c){d.error(c)}finally{E(`cart-${t}`),rt("/cart"),rt("/cart-overlay")}}async function nt(t){let{stripeAccount:e,storeId:a,secretKey:n}=await l(),o=m({secretKey:n,tagPrefix:a,tags:C.productGetById.tags({productId:t}),cache:"force-cache"});try{let r=await o.products.retrieve(t,{expand:["default_price"]},{stripeAccount:e});return M(r)}catch(r){if(r instanceof R.errors.StripeError&&r.code==="resource_missing")return null;throw r}}async function fe({slug:t}){let{stripeAccount:e,storeId:a,secretKey:n}=await l(),r=await m({secretKey:n,tagPrefix:a,tags:C.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(i=>!i.metadata.variant))throw new Error(`Multiple products found with the same slug (${t}) but no variant set.`);return G(q(r).filter(W))}async function wt(t){let{stripeAccount:e,storeId:a,secretKey:n}=await l();if(t.filter?.category){let o=t.filter?.category,i=await m({secretKey:n,tagPrefix:a,tags:C.productBrowse.tags({category:o}),cache:"force-cache"}).products.search({limit:100,query:U({active:!0,'metadata["category"]':o}),expand:["data.default_price"]},{stripeAccount:e});return G(D(q(i)).filter(W).slice(t.offset,t.first))}else{let r=await m({secretKey:n,tagPrefix:a,tags:C.productBrowse.tags({}),cache:"force-cache"}).products.list({limit:100,active:!0,expand:["data.default_price"]},{stripeAccount:e});return G(D(q(r)).filter(W).slice(t.offset,t.first))}}async function me(){let{stripeAccount:t,storeId:e,secretKey:a}=await l(),o=await m({secretKey:a,tagPrefix:e,tags:C.shippingBrowse.tags(),cache:"force-cache"}).shippingRates.list({active:!0},{stripeAccount:t});return J(o)}async function L(t){let{stripeAccount:e,storeId:a,secretKey:n}=await l(),o=m({secretKey:n,tagPrefix:a,tags:C.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 R.errors.StripeError&&r.code==="resource_missing")return null;throw r}}async function ge(){let e=(await wt({first:100})).map(n=>n.metadata.category).filter(Boolean),a=new Set(e);return Array.from(a)}async function he(t){let{stripeAccount:e,storeId:a,secretKey:n}=await l(),o=m({secretKey:n,tagPrefix:a,tags:C.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 R.errors.StripeError&&r.code==="resource_missing")return null;throw r}}async function ye(){let{stripeAccount:t,storeId:e,secretKey:a}=await l(),n=m({secretKey:a,tagPrefix:e,tags:C.accountGetById.tags({}),cache:"force-cache"});try{let[o,r]=await z(n.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 R.errors.StripeError&&o.code==="resource_missing")return null;throw o}}async function Ct(t){let{stripeAccount:e,storeId:a,secretKey:n}=await l(),o=m({secretKey:n,tagPrefix:a,tags:C.orderGetById.tags({orderId:t}),cache:"force-cache"});try{let r=await o.paymentIntents.retrieve(t,{expand:["payment_method","latest_charge"]},{stripeAccount:e});return Z(r)}catch(r){if(r instanceof R.errors.StripeError&&r.code==="resource_missing")return null;throw r}}async function xe(t){let e=await Ct(t);if(!e)return null;let a=it(e.metadata),n=await Promise.all(a.map(async([i,c])=>({product:await k(i),quantity:c}))),{metadata:{shippingRateId:o}}=e,r=o&&await L(o);return{order:e,lines:n.map(({product:i,quantity:c})=>i?{product:i,quantity:c}:null).filter(Boolean),shippingRate:r||null}}var k=async t=>{let{stripeAccount:e,storeId:a,secretKey:n}=await l(),o=m({secretKey:n,tagPrefix:a,tags:C.productGetById.tags({productId:t}),cache:"force-cache"});try{let r=await o.products.retrieve(t,{expand:["default_price"]},{stripeAccount:e});return M(r)}catch(r){if(r instanceof R.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,a])=>[e,$(a)]).filter(([,e])=>e&&Number.isFinite(e)&&e>0),_t=async t=>{let{stripeAccount:e,storeId:a,secretKey:n}=await l(),o=m({secretKey:n,tagPrefix:a,tags:C.cartGetById.tags({cartId:t}),cache:"force-cache"});try{let r=await o.paymentIntents.retrieve(t,{expand:["payment_method"]},{stripeAccount:e});if(ot.includes(r.status))return Y(r)}catch(r){if(d.error(r),r instanceof R.errors.StripeError&&r.code==="resource_missing")return null;throw r}};async function Q(t){let e=it(t);return await Promise.all(e.map(async([n,o])=>({product:await k(n),quantity:o})))}var st=async t=>{let e=await _t(t);if(!e)return null;let a=await Q(e.metadata),{metadata:{shippingRateId:n}}=e,o=n&&await L(n);return{cart:e,lines:a.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:a,quantity:n})=>e+(a.default_price?.unit_amount??0)*n,0):0,St=["billingAddress.country","billingAddress.postalCode","billingAddress.state","taxId","shippingRateId"];function vt({oldCart:t,data:e,mergedMetadata:a,lines:n}){if(!process.env.ENABLE_STRIPE_TAX)return!1;let o=Date.now(),r=a.taxCalculationExp?Number.parseInt(a.taxCalculationExp)*1e3:null;if(!r||o>=r)return!0;let i=t.cart.metadata.netAmount||t.cart.amount,c=e.amount,y=St.some(x=>!a[x]&&!t.cart.metadata[x]?!1:a[x]!==t.cart.metadata[x]),p=n.length!==t.lines.length||n.some(x=>{let P=t.lines.find(g=>g.product.id===x.product?.id);return x.product?.default_price.unit_amount!==P?.product.default_price.unit_amount||x.quantity!==P?.quantity});return c&&i!==c||y||p}var we=t=>b.object({name:b.string({required_error:t.nameRequired}).min(1,t.nameRequired),city:b.string({required_error:t.cityRequired}).min(1,t.cityRequired),country:b.string({required_error:t.countryRequired}).min(1,t.countryRequired),line1:b.string({required_error:t.line1Required}).min(1,t.line1Required),line2:b.string().optional().nullable().default(""),postalCode:b.string({required_error:t.postalCodeRequired}).min(1,t.postalCodeRequired),state:b.string().optional().nullable().default(""),phone:b.string().optional().nullable().default(""),taxId:b.string().optional().nullable().default("")}),Rt=async({lineItems:t,billingAddress:e,cartId:a,shippingRateId:n,taxId:o})=>{if(!process.env.ENABLE_STRIPE_TAX)return null;let{stripeAccount:r,storeId:i,secretKey:c}=await l(),y=m({secretKey:c,tagPrefix:i,tags:C.createTaxCalculation.tags({cartId:a}),cache:"force-cache"});if(!e?.country)return null;let p=n?await L(n):null,h=typeof p?.tax_code=="string"?p.tax_code:p?.tax_code?.id,f=await It(),x=w.StripeCurrency==="usd"||w.StripeCurrency==="cad"?"exclusive":"inclusive",P=f.defaults.tax_behavior==="inferred_by_currency"?x:f.defaults.tax_behavior??x;f.defaults.tax_behavior||d.warn(`Tax behavior not set in Stripe settings. Inferring from currency ${w.StripeCurrency}: ${x}.`),d.time("createTaxCalculation ${cartId}");let g=await y.tax.calculations.create({expand:["line_items"],line_items:t.map(I=>({...I,tax_behavior:I.tax_behavior??P})),currency:w.StripeCurrency,shipping_cost:p?.active&&p?.fixed_amount?{amount:p.fixed_amount.amount,tax_behavior:p.tax_behavior==="inclusive"?"inclusive":p.tax_behavior==="exclusive"?"exclusive":P,tax_code:h??f.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}"),g},at={taxBreakdown0:"",taxBreakdown1:"",taxBreakdown2:"",taxBreakdown3:"",taxBreakdown4:"",taxBreakdown5:""},T=async({paymentIntentId:t,data:e,clearTaxCalculation:a})=>{let{stripeAccount:n,storeId:o,secretKey:r}=await l(),i=await st(t);S(i,`Cart not found: ${t}`);let c=j.parse({...i.cart.metadata,...e.metadata});d.time("getProductsFromMetadata");let y=await Q(c);d.timeEnd("getProductsFromMetadata");let h=!a&&vt({oldCart:i,data:e,mergedMetadata:c,lines:y})?await Rt({cartId:t,taxId:c.taxId??null,shippingRateId:c.shippingRateId??null,billingAddress:{country:c["billingAddress.country"]??"",city:c["billingAddress.city"]??"",line1:c["billingAddress.line1"]??"",line2:c["billingAddress.line2"]??"",name:c["billingAddress.name"]??"",postalCode:c["billingAddress.postalCode"]??"",state:c["billingAddress.state"]??""},lineItems:y.map(({product:g,quantity:I})=>{if(g?.default_price.unit_amount)return{product:g.id,reference:[g.metadata.slug,g.metadata.variant].filter(Boolean).join("-"),quantity:I,amount:g.default_price.unit_amount*I,tax_behavior:g.default_price.tax_behavior==="exclusive"?"exclusive":g.default_price.tax_behavior==="inclusive"?"inclusive":void 0,tax_code:g.tax_code?typeof g.tax_code=="string"?g.tax_code:g.tax_code.id:void 0}}).filter(Boolean)}):null,f=e.amount?e.amount.toString():null;if(h){let g=Object.fromEntries(h.tax_breakdown.map(B=>({taxType:B.tax_rate_details.tax_type,taxPercentage:B.tax_rate_details.percentage_decimal,taxAmount:B.amount})).map((B,ut)=>[`taxBreakdown${ut}`,JSON.stringify(B)])),I=m({secretKey:r,tagPrefix:o,cache:"no-cache"});d.time(`paymentIntents.update ${t}`);let ct=await I.paymentIntents.update(t,{...e,amount:h.amount_total,metadata:{...c,...f&&{netAmount:f},...at,...g,taxCalculationId:h.id,taxCalculationExp:h?.expires_at}},{stripeAccount:n});return d.timeEnd(`paymentIntents.update ${t}`),ct}let x=m({secretKey:r,tagPrefix:o,cache:"no-cache"});d.time(`paymentIntents.update ${t}`);let P=await x.paymentIntents.update(t,{...e,metadata:{...c,...f&&{netAmount:f},...a&&{...at,taxCalculationId:"",taxCalculationExp:""}}},{stripeAccount:n});return d.timeEnd(`paymentIntents.update ${t}`),P},K=t=>t?t.cart.metadata?.taxCalculationId?t.cart.amount:(t.shippingRate?.fixed_amount?.amount??0)+Pt(t):0,Pt=t=>t?t.lines.reduce((e,{product:a,quantity:n})=>e+(a.default_price?.unit_amount??0)*n,0):0;async function Ce({productId:t,cartId:e,operation:a,clearTaxCalculation:n}){let[o,r]=await Promise.all([nt(t),N(e)]);if(!o)throw new Error(`Product not found: ${t}`);if(!r)throw new Error(`Cart not found: ${e}`);if(w.StripeCurrency?.toLowerCase()!==o.default_price.currency.toLowerCase())throw new Error(`Product currency ${o.default_price.currency} does not match cart currency ${w.StripeCurrency}`);let i=r.cart.metadata??{},p=$(i[t])+(a==="INCREASE"?1:-1);p<=0?i[t]="":i[t]=p.toString();let h=K(r)+(o.default_price.unit_amount??0);try{return await T({paymentIntentId:e,data:{metadata:i,amount:h||O},clearTaxCalculation:n})}catch(f){d.error(f)}finally{E(`cart-${e}`)}}var _e=async({cartId:t,taxId:e})=>{let a=await N(t);if(!a)throw new Error(`Cart not found: ${t}`);try{return await T({paymentIntentId:t,data:{metadata:{...a.cart.metadata,taxId:e}}})}catch(n){d.error(n)}finally{E(`cart-${t}`)}};async function be({cartId:t,shippingRateId:e}){let a=await N(t);if(!a)throw new Error(`Cart not found: ${t}`);d.time(`cartSaveShipping ${t}`);let n=await L(e);if(d.timeEnd(`cartSaveShipping ${t}`),!n)throw new Error(`Shipping rate not found: ${e}`);try{d.time(`updatePaymentIntent ${t}`);let o=await T({paymentIntentId:t,data:{metadata:{...a.cart.metadata,shippingRateId:e},amount:K({...a,shippingRate:n})}});return d.timeEnd(`updatePaymentIntent ${t}`),o}catch(o){d.error(o)}finally{E(`cart-${t}`)}}async function Se({cartId:t,billingAddress:e}){if(!await N(t))throw new Error(`Cart not found: ${t}`);try{return await T({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??""}}})}catch(n){d.error(n)}finally{E(`cart-${t}`)}}async function It(){let{stripeAccount:t,storeId:e,secretKey:a}=await l();return await m({secretKey:a,tagPrefix:e,tags:["tax-settings"],cache:"force-cache"}).tax.settings.retrieve({},{stripeAccount:t})}function ve(t){return Object.entries(t??{}).filter(([e])=>e.startsWith("prod_")).map(([e,a])=>[e,$(a)]).filter(([,e])=>e&&Number.isFinite(e)&&e>0).length}async function Re(t){let{storeId:e}=await l();return await V`
2
+ select * from reviews
3
+ where product_id = ${t.productId}
4
+ order by created_at desc
5
+ limit ${t.first??100}
6
+ offset ${t.offset??0}
7
+ `}async function Pe(t){let{storeId:e}=await l();return await V`
8
+ insert into reviews (store_id, product_id, author, email, content, rating, created_at, updated_at)
9
+ values (${e}, ${t.productId}, ${t.author}, ${t.email}, ${t.content}, ${t.rating}, now(), now())
10
+ `}var Ie=l;export{ye as accountGet,bt as calculateCartTotalNet,Pt as calculateCartTotalNetWithoutShipping,K as calculateCartTotalPossiblyWithTax,de as cartAdd,pe as cartAddOptimistic,Ce as cartChangeQuantity,ve as cartCount,xt as cartCreate,N as cartGet,Se as cartSaveBillingAddress,be as cartSaveShipping,_e as cartSaveTax,le as cartSetQuantity,yt as cartUpdateQuantity,ge as categoryBrowse,Ie as contextGet,he as fileGet,we as getAddressSchema,st as getCartWithProductsById,it as getProductsFromCart,xe as orderGet,wt as productBrowse,fe as productGet,nt as productGetById,Pe as productReviewAdd,Re as productReviewBrowse,m as provider,me as shippingBrowse,L as shippingGet,It as taxDefaultGet};
package/dist/yns.d.ts CHANGED
@@ -1,7 +1,262 @@
1
+ import { z } from 'zod';
2
+
3
+ declare const configSchema: z.ZodObject<{
4
+ hero: z.ZodObject<{
5
+ show: z.ZodBoolean;
6
+ title: z.ZodString;
7
+ description: z.ZodString;
8
+ button: z.ZodObject<{
9
+ label: z.ZodString;
10
+ path: z.ZodString;
11
+ }, "strip", z.ZodTypeAny, {
12
+ path: string;
13
+ label: string;
14
+ }, {
15
+ path: string;
16
+ label: string;
17
+ }>;
18
+ image: z.ZodObject<{
19
+ src: z.ZodString;
20
+ alt: z.ZodString;
21
+ }, "strip", z.ZodTypeAny, {
22
+ src: string;
23
+ alt: string;
24
+ }, {
25
+ src: string;
26
+ alt: string;
27
+ }>;
28
+ }, "strip", z.ZodTypeAny, {
29
+ description: string;
30
+ show: boolean;
31
+ title: string;
32
+ button: {
33
+ path: string;
34
+ label: string;
35
+ };
36
+ image: {
37
+ src: string;
38
+ alt: string;
39
+ };
40
+ }, {
41
+ description: string;
42
+ show: boolean;
43
+ title: string;
44
+ button: {
45
+ path: string;
46
+ label: string;
47
+ };
48
+ image: {
49
+ src: string;
50
+ alt: string;
51
+ };
52
+ }>;
53
+ categorySection: z.ZodObject<{
54
+ show: z.ZodBoolean;
55
+ }, "strip", z.ZodTypeAny, {
56
+ show: boolean;
57
+ }, {
58
+ show: boolean;
59
+ }>;
60
+ nav: z.ZodObject<{
61
+ title: z.ZodString;
62
+ searchBar: z.ZodObject<{
63
+ show: z.ZodBoolean;
64
+ }, "strip", z.ZodTypeAny, {
65
+ show: boolean;
66
+ }, {
67
+ show: boolean;
68
+ }>;
69
+ links: z.ZodArray<z.ZodObject<{
70
+ label: z.ZodString;
71
+ href: z.ZodString;
72
+ }, "strip", z.ZodTypeAny, {
73
+ label: string;
74
+ href: string;
75
+ }, {
76
+ label: string;
77
+ href: string;
78
+ }>, "many">;
79
+ }, "strip", z.ZodTypeAny, {
80
+ title: string;
81
+ searchBar: {
82
+ show: boolean;
83
+ };
84
+ links: {
85
+ label: string;
86
+ href: string;
87
+ }[];
88
+ }, {
89
+ title: string;
90
+ searchBar: {
91
+ show: boolean;
92
+ };
93
+ links: {
94
+ label: string;
95
+ href: string;
96
+ }[];
97
+ }>;
98
+ footer: z.ZodObject<{
99
+ name: z.ZodString;
100
+ tagline: z.ZodString;
101
+ newsletter: z.ZodObject<{
102
+ show: z.ZodBoolean;
103
+ }, "strip", z.ZodTypeAny, {
104
+ show: boolean;
105
+ }, {
106
+ show: boolean;
107
+ }>;
108
+ credits: z.ZodBoolean;
109
+ sections: z.ZodArray<z.ZodObject<{
110
+ header: z.ZodString;
111
+ links: z.ZodArray<z.ZodObject<{
112
+ label: z.ZodString;
113
+ href: z.ZodString;
114
+ }, "strip", z.ZodTypeAny, {
115
+ label: string;
116
+ href: string;
117
+ }, {
118
+ label: string;
119
+ href: string;
120
+ }>, "many">;
121
+ }, "strip", z.ZodTypeAny, {
122
+ links: {
123
+ label: string;
124
+ href: string;
125
+ }[];
126
+ header: string;
127
+ }, {
128
+ links: {
129
+ label: string;
130
+ href: string;
131
+ }[];
132
+ header: string;
133
+ }>, "many">;
134
+ }, "strip", z.ZodTypeAny, {
135
+ name: string;
136
+ tagline: string;
137
+ newsletter: {
138
+ show: boolean;
139
+ };
140
+ credits: boolean;
141
+ sections: {
142
+ links: {
143
+ label: string;
144
+ href: string;
145
+ }[];
146
+ header: string;
147
+ }[];
148
+ }, {
149
+ name: string;
150
+ tagline: string;
151
+ newsletter: {
152
+ show: boolean;
153
+ };
154
+ credits: boolean;
155
+ sections: {
156
+ links: {
157
+ label: string;
158
+ href: string;
159
+ }[];
160
+ header: string;
161
+ }[];
162
+ }>;
163
+ }, "strip", z.ZodTypeAny, {
164
+ hero: {
165
+ description: string;
166
+ show: boolean;
167
+ title: string;
168
+ button: {
169
+ path: string;
170
+ label: string;
171
+ };
172
+ image: {
173
+ src: string;
174
+ alt: string;
175
+ };
176
+ };
177
+ categorySection: {
178
+ show: boolean;
179
+ };
180
+ nav: {
181
+ title: string;
182
+ searchBar: {
183
+ show: boolean;
184
+ };
185
+ links: {
186
+ label: string;
187
+ href: string;
188
+ }[];
189
+ };
190
+ footer: {
191
+ name: string;
192
+ tagline: string;
193
+ newsletter: {
194
+ show: boolean;
195
+ };
196
+ credits: boolean;
197
+ sections: {
198
+ links: {
199
+ label: string;
200
+ href: string;
201
+ }[];
202
+ header: string;
203
+ }[];
204
+ };
205
+ }, {
206
+ hero: {
207
+ description: string;
208
+ show: boolean;
209
+ title: string;
210
+ button: {
211
+ path: string;
212
+ label: string;
213
+ };
214
+ image: {
215
+ src: string;
216
+ alt: string;
217
+ };
218
+ };
219
+ categorySection: {
220
+ show: boolean;
221
+ };
222
+ nav: {
223
+ title: string;
224
+ searchBar: {
225
+ show: boolean;
226
+ };
227
+ links: {
228
+ label: string;
229
+ href: string;
230
+ }[];
231
+ };
232
+ footer: {
233
+ name: string;
234
+ tagline: string;
235
+ newsletter: {
236
+ show: boolean;
237
+ };
238
+ credits: boolean;
239
+ sections: {
240
+ links: {
241
+ label: string;
242
+ href: string;
243
+ }[];
244
+ header: string;
245
+ }[];
246
+ };
247
+ }>;
248
+ type Config = z.infer<typeof configSchema>;
1
249
  type YnsFindStripeAccountResult = {
2
250
  stripeAccount: string | undefined;
3
251
  storeId: string | undefined;
4
252
  secretKey: string | undefined;
253
+ config: Config | undefined;
254
+ };
255
+ type YnsContextResult = {
256
+ stripeAccount: string | undefined;
257
+ storeId: string | undefined;
258
+ secretKey: string | undefined;
259
+ config: Config;
5
260
  };
6
261
  declare global {
7
262
  /**
@@ -10,6 +265,6 @@ declare global {
10
265
  */
11
266
  function __ynsFindStripeAccount(): YnsFindStripeAccountResult | undefined | Promise<YnsFindStripeAccountResult | undefined>;
12
267
  }
13
- declare const getYnsContext: () => Promise<YnsFindStripeAccountResult>;
268
+ declare const getYnsContext: () => Promise<YnsContextResult>;
14
269
 
15
- export { getYnsContext };
270
+ export { type Config, configSchema, getYnsContext };
package/dist/yns.js CHANGED
@@ -1 +1 @@
1
- import"server-only";var i=async()=>{let n={stripeAccount:void 0,storeId:void 0,secretKey:void 0};return global.__ynsFindStripeAccount?await global.__ynsFindStripeAccount()??n:n};export{i as getYnsContext};
1
+ import"server-only";import{z as e}from"zod";var i=e.object({hero:e.object({show:e.boolean(),title:e.string(),description:e.string(),button:e.object({label:e.string(),path:e.string()}),image:e.object({src:e.string(),alt:e.string()})}),categorySection:e.object({show:e.boolean()}),nav:e.object({title:e.string(),searchBar:e.object({show:e.boolean()}),links:e.array(e.object({label:e.string(),href:e.string()}))}),footer:e.object({name:e.string(),tagline:e.string(),newsletter:e.object({show:e.boolean()}),credits:e.boolean(),sections:e.array(e.object({header:e.string(),links:e.array(e.object({label:e.string(),href:e.string()}))}))})}),c=async()=>{let o={hero:{show:!0,title:"Discover our Curated Collection",description:"Explore our carefully selected products for your home and lifestyle.",button:{label:"Shop Now",path:"/"},image:{src:"https://files.stripe.com/links/MDB8YWNjdF8xT3BaeG5GSmNWbVh6bURsfGZsX3Rlc3RfaDVvWXowdU9ZbWlobUIyaHpNc1hCeDM200NBzvUjqP",alt:"Cup of coffee"}},categorySection:{show:!0},nav:{title:"Your Next Store",searchBar:{show:!0},links:[{label:"Home",href:"/"},{label:"Apparel",href:"/category/apparel"},{label:"Accessories",href:"/category/accessories"}]},footer:{name:"Your Next Store",tagline:"Handcrafted with passion in California",newsletter:{show:!0},credits:!0,sections:[{header:"Products",links:[{label:"Apparel",href:"/category/apparel"},{label:"Accessories",href:"/category/accessories"}]},{header:"Support",links:[{label:"Features",href:"https://yournextstore.com/#features"},{label:"Pricing",href:"https://yournextstore.com/#pricing"},{label:"Contact Us",href:"mailto:hi@yournextstore.com"}]}]}},n={stripeAccount:void 0,storeId:void 0,secretKey:void 0,config:o},t=await global?.__ynsFindStripeAccount?.();return t?{...t,config:t.config??o}:n};export{i as configSchema,c as getYnsContext};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package",
3
3
  "name": "commerce-kit",
4
- "version": "0.0.14",
4
+ "version": "0.0.16",
5
5
  "type": "module",
6
6
  "license": "AGPL-3.0-only",
7
7
  "keywords": [
@@ -34,6 +34,10 @@
34
34
  "./yns": {
35
35
  "import": "./dist/yns.js",
36
36
  "types": "./dist/yns.d.ts"
37
+ },
38
+ "./db": {
39
+ "import": "./dist/db.js",
40
+ "types": "./dist/db.d.ts"
37
41
  }
38
42
  },
39
43
  "files": [
@@ -44,7 +48,8 @@
44
48
  ],
45
49
  "sideEffects": false,
46
50
  "devDependencies": {
47
- "@types/node": "^22.1.0",
51
+ "@neondatabase/serverless": "^0.9.4",
52
+ "@types/node": "^22.4.2",
48
53
  "@types/react": "npm:types-react@19.0.0-rc.1",
49
54
  "@types/react-dom": "npm:types-react-dom@19.0.0-rc.1",
50
55
  "next": "15.0.0-canary.96",
@@ -53,17 +58,18 @@
53
58
  "react-dom": "^19.0.0-rc.1",
54
59
  "rimraf": "6.0.1",
55
60
  "server-only": "0.0.1",
56
- "stripe": "^16.6.0",
61
+ "stripe": "^16.8.0",
57
62
  "tsup": "8.2.4",
58
- "tsx": "^4.16.5",
63
+ "tsx": "^4.17.0",
59
64
  "vitest": "^2.0.5",
60
65
  "zod": "^3.23.8"
61
66
  },
62
67
  "peerDependencies": {
68
+ "@neondatabase/serverless": "^0.9.4",
63
69
  "@types/node": "^20.14.8",
64
70
  "@types/react": "npm:types-react@19.0.0-rc.1",
65
71
  "@types/react-dom": "npm:types-react-dom@19.0.0-rc.1",
66
- "next": "15.0.0-canary.96",
72
+ "next": "15.0.0-canary.121",
67
73
  "react": "19.0.0-rc-3208e73e-20240730",
68
74
  "react-dom": "19.0.0-rc-3208e73e-20240730",
69
75
  "server-only": "0.0.1",