commerce-kit 0.0.14 → 0.0.15
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 +33 -1
- package/dist/index.js +10 -1
- package/dist/yns.d.ts +250 -1
- package/dist/yns.js +1 -1
- package/package.json +11 -5
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<Record<string, 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},K=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(K(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(K(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={stripeAccount:void 0,storeId:void 0,secretKey:void 0,config:{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"}]}]}}};return global.__ynsFindStripeAccount?await global.__ynsFindStripeAccount()??t:t};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},mt="LOG",ft=process.env.LOG_LEVEL&&process.env.LOG_LEVEL in v?process.env.LOG_LEVEL:mt,I=v[ft],d={time(t){I>v.DEBUG||console.time(t)},timeEnd(t){I>v.DEBUG||console.timeEnd(t)},log(...t){I>v.LOG||console.log(...t)},dir(t,e){I>v.LOG||console.dir(t,e)},warn(...t){I>v.WARN||console.warn(...t)},error(...t){I>v.ERROR||console.error(...t)}};var gt=(t,e)=>!t||!e?t:[...t,`prefix-${e}`,...t.map(a=>`${e}-${a}`)],f=({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(m){d.error(m)}finally{E(`cart-${e}`)}}async function N(t){let{stripeAccount:e,storeId:a,secretKey:n}=await l(),o=f({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:m})=>h?{product:h,quantity:m}: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=f({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?F(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=F(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=f({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 me({slug:t}){let{stripeAccount:e,storeId:a,secretKey:n}=await l(),r=await f({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 f({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 f({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 fe(){let{stripeAccount:t,storeId:e,secretKey:a}=await l(),o=await f({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=f({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=f({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=f({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=f({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=f({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=f({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=f({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,m=await At(),x=w.StripeCurrency==="usd"||w.StripeCurrency==="cad"?"exclusive":"inclusive",P=m.defaults.tax_behavior==="inferred_by_currency"?x:m.defaults.tax_behavior??x;m.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(A=>({...A,tax_behavior:A.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??m.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:A})=>{if(g?.default_price.unit_amount)return{product:g.id,reference:[g.metadata.slug,g.metadata.variant].filter(Boolean).join("-"),quantity:A,amount:g.default_price.unit_amount*A,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,m=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)])),A=f({secretKey:r,tagPrefix:o,cache:"no-cache"});d.time(`paymentIntents.update ${t}`);let ct=await A.paymentIntents.update(t,{...e,amount:h.amount_total,metadata:{...c,...m&&{netAmount:m},...at,...g,taxCalculationId:h.id,taxCalculationExp:h?.expires_at}},{stripeAccount:n});return d.timeEnd(`paymentIntents.update ${t}`),ct}let x=f({secretKey:r,tagPrefix:o,cache:"no-cache"});d.time(`paymentIntents.update ${t}`);let P=await x.paymentIntents.update(t,{...e,metadata:{...c,...m&&{netAmount:m},...a&&{...at,taxCalculationId:"",taxCalculationExp:""}}},{stripeAccount:n});return d.timeEnd(`paymentIntents.update ${t}`),P},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 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=F(r)+(o.default_price.unit_amount??0);try{return await T({paymentIntentId:e,data:{metadata:i,amount:h||O},clearTaxCalculation:n})}catch(m){d.error(m)}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:F({...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 At(){let{stripeAccount:t,storeId:e,secretKey:a}=await l();return await f({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 Ae=l;export{ye as accountGet,bt as calculateCartTotalNet,Pt as calculateCartTotalNetWithoutShipping,F 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,Ae as contextGet,he as fileGet,we as getAddressSchema,st as getCartWithProductsById,it as getProductsFromCart,xe as orderGet,wt as productBrowse,me as productGet,nt as productGetById,Pe as productReviewAdd,Re as productReviewBrowse,f as provider,fe as shippingBrowse,L as shippingGet,At as taxDefaultGet};
|
package/dist/yns.d.ts
CHANGED
|
@@ -1,7 +1,256 @@
|
|
|
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;
|
|
5
254
|
};
|
|
6
255
|
declare global {
|
|
7
256
|
/**
|
|
@@ -12,4 +261,4 @@ declare global {
|
|
|
12
261
|
}
|
|
13
262
|
declare const getYnsContext: () => Promise<YnsFindStripeAccountResult>;
|
|
14
263
|
|
|
15
|
-
export { getYnsContext };
|
|
264
|
+
export { type Config, configSchema, getYnsContext };
|
package/dist/yns.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"server-only";var i=async()=>{let
|
|
1
|
+
import"server-only";import{z as e}from"zod";var s=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()}))}))})}),i=async()=>{let t={stripeAccount:void 0,storeId:void 0,secretKey:void 0,config:{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"}]}]}}};return global.__ynsFindStripeAccount?await global.__ynsFindStripeAccount()??t:t};export{s as configSchema,i 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.
|
|
4
|
+
"version": "0.0.15",
|
|
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
|
-
"@
|
|
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.
|
|
61
|
+
"stripe": "^16.8.0",
|
|
57
62
|
"tsup": "8.2.4",
|
|
58
|
-
"tsx": "^4.
|
|
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.
|
|
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",
|