@spree/next 0.2.1 → 0.2.2
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/actions/cart.d.ts +7 -4
- package/dist/actions/cart.js +6 -5
- package/dist/actions/cart.js.map +1 -1
- package/dist/actions/checkout.d.ts +2 -1
- package/dist/actions/checkout.js.map +1 -1
- package/dist/index.d.ts +9 -5
- package/dist/index.js +6 -5
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/actions/cart.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { StoreOrder } from '@spree/sdk';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Get the current cart. Returns null if no cart exists.
|
|
@@ -14,16 +14,19 @@ declare function getOrCreateCart(): Promise<StoreOrder & {
|
|
|
14
14
|
}>;
|
|
15
15
|
/**
|
|
16
16
|
* Add an item to the cart. Creates a cart if none exists.
|
|
17
|
+
* Returns the updated order with recalculated totals.
|
|
17
18
|
*/
|
|
18
|
-
declare function addItem(variantId: string, quantity?: number): Promise<
|
|
19
|
+
declare function addItem(variantId: string, quantity?: number): Promise<StoreOrder>;
|
|
19
20
|
/**
|
|
20
21
|
* Update a line item quantity in the cart.
|
|
22
|
+
* Returns the updated order with recalculated totals.
|
|
21
23
|
*/
|
|
22
|
-
declare function updateItem(lineItemId: string, quantity: number): Promise<
|
|
24
|
+
declare function updateItem(lineItemId: string, quantity: number): Promise<StoreOrder>;
|
|
23
25
|
/**
|
|
24
26
|
* Remove a line item from the cart.
|
|
27
|
+
* Returns the updated order with recalculated totals.
|
|
25
28
|
*/
|
|
26
|
-
declare function removeItem(lineItemId: string): Promise<
|
|
29
|
+
declare function removeItem(lineItemId: string): Promise<StoreOrder>;
|
|
27
30
|
/**
|
|
28
31
|
* Clear the cart (abandons the current cart).
|
|
29
32
|
*/
|
package/dist/actions/cart.js
CHANGED
|
@@ -107,38 +107,39 @@ async function addItem(variantId, quantity = 1) {
|
|
|
107
107
|
const cart = await getOrCreateCart();
|
|
108
108
|
const orderToken = cart.token;
|
|
109
109
|
const token = await getAccessToken();
|
|
110
|
-
const
|
|
110
|
+
const order = await getClient().store.orders.lineItems.create(
|
|
111
111
|
cart.id,
|
|
112
112
|
{ variant_id: variantId, quantity },
|
|
113
113
|
{ orderToken, token }
|
|
114
114
|
);
|
|
115
115
|
revalidateTag("cart");
|
|
116
|
-
return
|
|
116
|
+
return order;
|
|
117
117
|
}
|
|
118
118
|
async function updateItem(lineItemId, quantity) {
|
|
119
119
|
const orderToken = await getCartToken();
|
|
120
120
|
const token = await getAccessToken();
|
|
121
121
|
if (!orderToken && !token) throw new Error("No cart found");
|
|
122
122
|
const cart = await getClient().store.cart.get({ orderToken, token });
|
|
123
|
-
const
|
|
123
|
+
const order = await getClient().store.orders.lineItems.update(
|
|
124
124
|
cart.id,
|
|
125
125
|
lineItemId,
|
|
126
126
|
{ quantity },
|
|
127
127
|
{ orderToken, token }
|
|
128
128
|
);
|
|
129
129
|
revalidateTag("cart");
|
|
130
|
-
return
|
|
130
|
+
return order;
|
|
131
131
|
}
|
|
132
132
|
async function removeItem(lineItemId) {
|
|
133
133
|
const orderToken = await getCartToken();
|
|
134
134
|
const token = await getAccessToken();
|
|
135
135
|
if (!orderToken && !token) throw new Error("No cart found");
|
|
136
136
|
const cart = await getClient().store.cart.get({ orderToken, token });
|
|
137
|
-
await getClient().store.orders.lineItems.delete(cart.id, lineItemId, {
|
|
137
|
+
const order = await getClient().store.orders.lineItems.delete(cart.id, lineItemId, {
|
|
138
138
|
orderToken,
|
|
139
139
|
token
|
|
140
140
|
});
|
|
141
141
|
revalidateTag("cart");
|
|
142
|
+
return order;
|
|
142
143
|
}
|
|
143
144
|
async function clearCart() {
|
|
144
145
|
await clearCartToken();
|
package/dist/actions/cart.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/actions/cart.ts","../../src/config.ts","../../src/cookies.ts"],"sourcesContent":["'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type { StoreOrder, StoreLineItem } from '@spree/sdk';\nimport { getClient } from '../config';\nimport { getCartToken, setCartToken, clearCartToken, getAccessToken } from '../cookies';\n\n/**\n * Get the current cart. Returns null if no cart exists.\n */\nexport async function getCart(): Promise<(StoreOrder & { token: string }) | null> {\n const orderToken = await getCartToken();\n const token = await getAccessToken();\n if (!orderToken && !token) return null;\n\n try {\n return await getClient().store.cart.get({ orderToken, token });\n } catch {\n return null;\n }\n}\n\n/**\n * Get existing cart or create a new one.\n */\nexport async function getOrCreateCart(): Promise<StoreOrder & { token: string }> {\n const existing = await getCart();\n if (existing) return existing;\n\n const token = await getAccessToken();\n const cart = await getClient().store.cart.create(token ? { token } : undefined);\n\n if (cart.token) {\n await setCartToken(cart.token);\n }\n\n revalidateTag('cart');\n return cart;\n}\n\n/**\n * Add an item to the cart. Creates a cart if none exists.\n */\nexport async function addItem(\n variantId: string,\n quantity: number = 1\n): Promise<StoreLineItem> {\n const cart = await getOrCreateCart();\n const orderToken = cart.token;\n const token = await getAccessToken();\n\n const lineItem = await getClient().store.orders.lineItems.create(\n cart.id,\n { variant_id: variantId, quantity },\n { orderToken, token }\n );\n\n revalidateTag('cart');\n return lineItem;\n}\n\n/**\n * Update a line item quantity in the cart.\n */\nexport async function updateItem(\n lineItemId: string,\n quantity: number\n): Promise<StoreLineItem> {\n const orderToken = await getCartToken();\n const token = await getAccessToken();\n if (!orderToken && !token) throw new Error('No cart found');\n\n const cart = await getClient().store.cart.get({ orderToken, token });\n\n const lineItem = await getClient().store.orders.lineItems.update(\n cart.id,\n lineItemId,\n { quantity },\n { orderToken, token }\n );\n\n revalidateTag('cart');\n return lineItem;\n}\n\n/**\n * Remove a line item from the cart.\n */\nexport async function removeItem(lineItemId: string): Promise<void> {\n const orderToken = await getCartToken();\n const token = await getAccessToken();\n if (!orderToken && !token) throw new Error('No cart found');\n\n const cart = await getClient().store.cart.get({ orderToken, token });\n\n await getClient().store.orders.lineItems.delete(cart.id, lineItemId, {\n orderToken,\n token,\n });\n\n revalidateTag('cart');\n}\n\n/**\n * Clear the cart (abandons the current cart).\n */\nexport async function clearCart(): Promise<void> {\n await clearCartToken();\n revalidateTag('cart');\n}\n\n/**\n * Associate a guest cart with the currently authenticated user.\n * Call this after login/register when the user has an existing guest cart.\n */\nexport async function associateCart(): Promise<(StoreOrder & { token: string }) | null> {\n const orderToken = await getCartToken();\n const token = await getAccessToken();\n if (!orderToken || !token) return null;\n\n try {\n const result = await getClient().store.cart.associate({ orderToken, token });\n revalidateTag('cart');\n return result;\n } catch {\n // Cart might already belong to another user — clear it\n await clearCartToken();\n revalidateTag('cart');\n return null;\n }\n}\n","import { createSpreeClient, type SpreeClient } from '@spree/sdk';\nimport type { SpreeNextConfig } from './types';\n\nlet _client: SpreeClient | null = null;\nlet _config: SpreeNextConfig | null = null;\n\n/**\n * Initialize the Spree Next.js integration.\n * Call this once in your app (e.g., in `lib/storefront.ts`).\n * If not called, the client will auto-initialize from SPREE_API_URL and SPREE_PUBLISHABLE_KEY env vars.\n */\nexport function initSpreeNext(config: SpreeNextConfig): void {\n _config = config;\n _client = createSpreeClient({\n baseUrl: config.baseUrl,\n publishableKey: config.publishableKey,\n });\n}\n\n/**\n * Get the SpreeClient instance. Auto-initializes from env vars if needed.\n * @internal\n */\nexport function getClient(): SpreeClient {\n if (!_client) {\n const baseUrl = process.env.SPREE_API_URL;\n const publishableKey = process.env.SPREE_PUBLISHABLE_KEY;\n if (baseUrl && publishableKey) {\n initSpreeNext({ baseUrl, publishableKey });\n } else {\n throw new Error(\n '@spree/next is not configured. Either call initSpreeNext() or set SPREE_API_URL and SPREE_PUBLISHABLE_KEY environment variables.'\n );\n }\n }\n return _client!;\n}\n\n/**\n * Get the current config. Auto-initializes from env vars if needed.\n * @internal\n */\nexport function getConfig(): SpreeNextConfig {\n if (!_config) {\n getClient(); // triggers auto-init\n }\n return _config!;\n}\n\n/**\n * Reset the client (useful for testing).\n * @internal\n */\nexport function resetClient(): void {\n _client = null;\n _config = null;\n}\n","import { cookies } from 'next/headers';\nimport { getConfig } from './config';\n\nconst DEFAULT_CART_COOKIE = '_spree_cart_token';\nconst DEFAULT_ACCESS_TOKEN_COOKIE = '_spree_jwt';\nconst CART_TOKEN_MAX_AGE = 60 * 60 * 24 * 30; // 30 days\nconst ACCESS_TOKEN_MAX_AGE = 60 * 60 * 24 * 7; // 7 days\n\nfunction getCartCookieName(): string {\n try {\n return getConfig().cartCookieName ?? DEFAULT_CART_COOKIE;\n } catch {\n return DEFAULT_CART_COOKIE;\n }\n}\n\nfunction getAccessTokenCookieName(): string {\n try {\n return getConfig().accessTokenCookieName ?? DEFAULT_ACCESS_TOKEN_COOKIE;\n } catch {\n return DEFAULT_ACCESS_TOKEN_COOKIE;\n }\n}\n\n// --- Cart Token ---\n\nexport async function getCartToken(): Promise<string | undefined> {\n const cookieStore = await cookies();\n return cookieStore.get(getCartCookieName())?.value;\n}\n\nexport async function setCartToken(token: string): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getCartCookieName(), token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n path: '/',\n maxAge: CART_TOKEN_MAX_AGE,\n });\n}\n\nexport async function clearCartToken(): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getCartCookieName(), '', {\n maxAge: -1,\n path: '/',\n });\n}\n\n// --- Access Token (JWT) ---\n\nexport async function getAccessToken(): Promise<string | undefined> {\n const cookieStore = await cookies();\n return cookieStore.get(getAccessTokenCookieName())?.value;\n}\n\nexport async function setAccessToken(token: string): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getAccessTokenCookieName(), token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n path: '/',\n maxAge: ACCESS_TOKEN_MAX_AGE,\n });\n}\n\nexport async function clearAccessToken(): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getAccessTokenCookieName(), '', {\n maxAge: -1,\n path: '/',\n });\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/actions/cart.ts","../../src/config.ts","../../src/cookies.ts"],"sourcesContent":["'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type { StoreOrder } from '@spree/sdk';\nimport { getClient } from '../config';\nimport { getCartToken, setCartToken, clearCartToken, getAccessToken } from '../cookies';\n\n/**\n * Get the current cart. Returns null if no cart exists.\n */\nexport async function getCart(): Promise<(StoreOrder & { token: string }) | null> {\n const orderToken = await getCartToken();\n const token = await getAccessToken();\n if (!orderToken && !token) return null;\n\n try {\n return await getClient().store.cart.get({ orderToken, token });\n } catch {\n return null;\n }\n}\n\n/**\n * Get existing cart or create a new one.\n */\nexport async function getOrCreateCart(): Promise<StoreOrder & { token: string }> {\n const existing = await getCart();\n if (existing) return existing;\n\n const token = await getAccessToken();\n const cart = await getClient().store.cart.create(token ? { token } : undefined);\n\n if (cart.token) {\n await setCartToken(cart.token);\n }\n\n revalidateTag('cart');\n return cart;\n}\n\n/**\n * Add an item to the cart. Creates a cart if none exists.\n * Returns the updated order with recalculated totals.\n */\nexport async function addItem(\n variantId: string,\n quantity: number = 1\n): Promise<StoreOrder> {\n const cart = await getOrCreateCart();\n const orderToken = cart.token;\n const token = await getAccessToken();\n\n const order = await getClient().store.orders.lineItems.create(\n cart.id,\n { variant_id: variantId, quantity },\n { orderToken, token }\n );\n\n revalidateTag('cart');\n return order;\n}\n\n/**\n * Update a line item quantity in the cart.\n * Returns the updated order with recalculated totals.\n */\nexport async function updateItem(\n lineItemId: string,\n quantity: number\n): Promise<StoreOrder> {\n const orderToken = await getCartToken();\n const token = await getAccessToken();\n if (!orderToken && !token) throw new Error('No cart found');\n\n const cart = await getClient().store.cart.get({ orderToken, token });\n\n const order = await getClient().store.orders.lineItems.update(\n cart.id,\n lineItemId,\n { quantity },\n { orderToken, token }\n );\n\n revalidateTag('cart');\n return order;\n}\n\n/**\n * Remove a line item from the cart.\n * Returns the updated order with recalculated totals.\n */\nexport async function removeItem(lineItemId: string): Promise<StoreOrder> {\n const orderToken = await getCartToken();\n const token = await getAccessToken();\n if (!orderToken && !token) throw new Error('No cart found');\n\n const cart = await getClient().store.cart.get({ orderToken, token });\n\n const order = await getClient().store.orders.lineItems.delete(cart.id, lineItemId, {\n orderToken,\n token,\n });\n\n revalidateTag('cart');\n return order;\n}\n\n/**\n * Clear the cart (abandons the current cart).\n */\nexport async function clearCart(): Promise<void> {\n await clearCartToken();\n revalidateTag('cart');\n}\n\n/**\n * Associate a guest cart with the currently authenticated user.\n * Call this after login/register when the user has an existing guest cart.\n */\nexport async function associateCart(): Promise<(StoreOrder & { token: string }) | null> {\n const orderToken = await getCartToken();\n const token = await getAccessToken();\n if (!orderToken || !token) return null;\n\n try {\n const result = await getClient().store.cart.associate({ orderToken, token });\n revalidateTag('cart');\n return result;\n } catch {\n // Cart might already belong to another user — clear it\n await clearCartToken();\n revalidateTag('cart');\n return null;\n }\n}\n","import { createSpreeClient, type SpreeClient } from '@spree/sdk';\nimport type { SpreeNextConfig } from './types';\n\nlet _client: SpreeClient | null = null;\nlet _config: SpreeNextConfig | null = null;\n\n/**\n * Initialize the Spree Next.js integration.\n * Call this once in your app (e.g., in `lib/storefront.ts`).\n * If not called, the client will auto-initialize from SPREE_API_URL and SPREE_PUBLISHABLE_KEY env vars.\n */\nexport function initSpreeNext(config: SpreeNextConfig): void {\n _config = config;\n _client = createSpreeClient({\n baseUrl: config.baseUrl,\n publishableKey: config.publishableKey,\n });\n}\n\n/**\n * Get the SpreeClient instance. Auto-initializes from env vars if needed.\n * @internal\n */\nexport function getClient(): SpreeClient {\n if (!_client) {\n const baseUrl = process.env.SPREE_API_URL;\n const publishableKey = process.env.SPREE_PUBLISHABLE_KEY;\n if (baseUrl && publishableKey) {\n initSpreeNext({ baseUrl, publishableKey });\n } else {\n throw new Error(\n '@spree/next is not configured. Either call initSpreeNext() or set SPREE_API_URL and SPREE_PUBLISHABLE_KEY environment variables.'\n );\n }\n }\n return _client!;\n}\n\n/**\n * Get the current config. Auto-initializes from env vars if needed.\n * @internal\n */\nexport function getConfig(): SpreeNextConfig {\n if (!_config) {\n getClient(); // triggers auto-init\n }\n return _config!;\n}\n\n/**\n * Reset the client (useful for testing).\n * @internal\n */\nexport function resetClient(): void {\n _client = null;\n _config = null;\n}\n","import { cookies } from 'next/headers';\nimport { getConfig } from './config';\n\nconst DEFAULT_CART_COOKIE = '_spree_cart_token';\nconst DEFAULT_ACCESS_TOKEN_COOKIE = '_spree_jwt';\nconst CART_TOKEN_MAX_AGE = 60 * 60 * 24 * 30; // 30 days\nconst ACCESS_TOKEN_MAX_AGE = 60 * 60 * 24 * 7; // 7 days\n\nfunction getCartCookieName(): string {\n try {\n return getConfig().cartCookieName ?? DEFAULT_CART_COOKIE;\n } catch {\n return DEFAULT_CART_COOKIE;\n }\n}\n\nfunction getAccessTokenCookieName(): string {\n try {\n return getConfig().accessTokenCookieName ?? DEFAULT_ACCESS_TOKEN_COOKIE;\n } catch {\n return DEFAULT_ACCESS_TOKEN_COOKIE;\n }\n}\n\n// --- Cart Token ---\n\nexport async function getCartToken(): Promise<string | undefined> {\n const cookieStore = await cookies();\n return cookieStore.get(getCartCookieName())?.value;\n}\n\nexport async function setCartToken(token: string): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getCartCookieName(), token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n path: '/',\n maxAge: CART_TOKEN_MAX_AGE,\n });\n}\n\nexport async function clearCartToken(): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getCartCookieName(), '', {\n maxAge: -1,\n path: '/',\n });\n}\n\n// --- Access Token (JWT) ---\n\nexport async function getAccessToken(): Promise<string | undefined> {\n const cookieStore = await cookies();\n return cookieStore.get(getAccessTokenCookieName())?.value;\n}\n\nexport async function setAccessToken(token: string): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getAccessTokenCookieName(), token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n path: '/',\n maxAge: ACCESS_TOKEN_MAX_AGE,\n });\n}\n\nexport async function clearAccessToken(): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getAccessTokenCookieName(), '', {\n maxAge: -1,\n path: '/',\n });\n}\n"],"mappings":"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","names":[]}
|
|
@@ -31,8 +31,9 @@ declare function getShipments(orderId: string): Promise<{
|
|
|
31
31
|
}>;
|
|
32
32
|
/**
|
|
33
33
|
* Select a shipping rate for a shipment.
|
|
34
|
+
* Returns the updated order with recalculated totals.
|
|
34
35
|
*/
|
|
35
|
-
declare function selectShippingRate(orderId: string, shipmentId: string, shippingRateId: string): Promise<
|
|
36
|
+
declare function selectShippingRate(orderId: string, shipmentId: string, shippingRateId: string): Promise<StoreOrder>;
|
|
36
37
|
/**
|
|
37
38
|
* Apply a coupon code to the order.
|
|
38
39
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/actions/checkout.ts","../../src/config.ts","../../src/cookies.ts"],"sourcesContent":["'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type { StoreOrder, StoreShipment, AddressParams } from '@spree/sdk';\nimport { getClient } from '../config';\nimport { getCartToken, getAccessToken } from '../cookies';\n\nasync function getCheckoutOptions() {\n const orderToken = await getCartToken();\n const token = await getAccessToken();\n return { orderToken, token };\n}\n\n/**\n * Get the current checkout order state.\n * Includes line_items, shipments, and addresses by default.\n */\nexport async function getCheckout(\n orderId: string\n): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n return getClient().store.orders.get(\n orderId,\n { includes: 'line_items,shipments,ship_address,bill_address' },\n options\n );\n}\n\n/**\n * Update shipping and/or billing addresses on the order.\n */\nexport async function updateAddresses(\n orderId: string,\n params: {\n email?: string;\n ship_address?: AddressParams;\n bill_address?: AddressParams;\n ship_address_id?: string;\n bill_address_id?: string;\n }\n): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.update(orderId, params, options);\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Advance the checkout to the next step.\n */\nexport async function advance(orderId: string): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.advance(orderId, options);\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Move the checkout to the next step (alias for advance).\n */\nexport async function next(orderId: string): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.next(orderId, options);\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Get shipments for the order (includes available shipping rates).\n */\nexport async function getShipments(\n orderId: string\n): Promise<{ data: StoreShipment[] }> {\n const options = await getCheckoutOptions();\n return getClient().store.orders.shipments.list(orderId, options);\n}\n\n/**\n * Select a shipping rate for a shipment.\n */\nexport async function selectShippingRate(\n orderId: string,\n shipmentId: string,\n shippingRateId: string\n): Promise<StoreShipment> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.shipments.update(\n orderId,\n shipmentId,\n { selected_shipping_rate_id: shippingRateId },\n options\n );\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Apply a coupon code to the order.\n */\nexport async function applyCoupon(\n orderId: string,\n code: string\n): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.couponCodes.apply(orderId, code, options);\n revalidateTag('checkout');\n revalidateTag('cart');\n return result;\n}\n\n/**\n * Remove a coupon/promotion from the order.\n */\nexport async function removeCoupon(\n orderId: string,\n promotionId: string\n): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.couponCodes.remove(orderId, promotionId, options);\n revalidateTag('checkout');\n revalidateTag('cart');\n return result;\n}\n\n/**\n * Complete the checkout and place the order.\n */\nexport async function complete(orderId: string): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.complete(orderId, options);\n revalidateTag('checkout');\n revalidateTag('cart');\n return result;\n}\n","import { createSpreeClient, type SpreeClient } from '@spree/sdk';\nimport type { SpreeNextConfig } from './types';\n\nlet _client: SpreeClient | null = null;\nlet _config: SpreeNextConfig | null = null;\n\n/**\n * Initialize the Spree Next.js integration.\n * Call this once in your app (e.g., in `lib/storefront.ts`).\n * If not called, the client will auto-initialize from SPREE_API_URL and SPREE_PUBLISHABLE_KEY env vars.\n */\nexport function initSpreeNext(config: SpreeNextConfig): void {\n _config = config;\n _client = createSpreeClient({\n baseUrl: config.baseUrl,\n publishableKey: config.publishableKey,\n });\n}\n\n/**\n * Get the SpreeClient instance. Auto-initializes from env vars if needed.\n * @internal\n */\nexport function getClient(): SpreeClient {\n if (!_client) {\n const baseUrl = process.env.SPREE_API_URL;\n const publishableKey = process.env.SPREE_PUBLISHABLE_KEY;\n if (baseUrl && publishableKey) {\n initSpreeNext({ baseUrl, publishableKey });\n } else {\n throw new Error(\n '@spree/next is not configured. Either call initSpreeNext() or set SPREE_API_URL and SPREE_PUBLISHABLE_KEY environment variables.'\n );\n }\n }\n return _client!;\n}\n\n/**\n * Get the current config. Auto-initializes from env vars if needed.\n * @internal\n */\nexport function getConfig(): SpreeNextConfig {\n if (!_config) {\n getClient(); // triggers auto-init\n }\n return _config!;\n}\n\n/**\n * Reset the client (useful for testing).\n * @internal\n */\nexport function resetClient(): void {\n _client = null;\n _config = null;\n}\n","import { cookies } from 'next/headers';\nimport { getConfig } from './config';\n\nconst DEFAULT_CART_COOKIE = '_spree_cart_token';\nconst DEFAULT_ACCESS_TOKEN_COOKIE = '_spree_jwt';\nconst CART_TOKEN_MAX_AGE = 60 * 60 * 24 * 30; // 30 days\nconst ACCESS_TOKEN_MAX_AGE = 60 * 60 * 24 * 7; // 7 days\n\nfunction getCartCookieName(): string {\n try {\n return getConfig().cartCookieName ?? DEFAULT_CART_COOKIE;\n } catch {\n return DEFAULT_CART_COOKIE;\n }\n}\n\nfunction getAccessTokenCookieName(): string {\n try {\n return getConfig().accessTokenCookieName ?? DEFAULT_ACCESS_TOKEN_COOKIE;\n } catch {\n return DEFAULT_ACCESS_TOKEN_COOKIE;\n }\n}\n\n// --- Cart Token ---\n\nexport async function getCartToken(): Promise<string | undefined> {\n const cookieStore = await cookies();\n return cookieStore.get(getCartCookieName())?.value;\n}\n\nexport async function setCartToken(token: string): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getCartCookieName(), token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n path: '/',\n maxAge: CART_TOKEN_MAX_AGE,\n });\n}\n\nexport async function clearCartToken(): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getCartCookieName(), '', {\n maxAge: -1,\n path: '/',\n });\n}\n\n// --- Access Token (JWT) ---\n\nexport async function getAccessToken(): Promise<string | undefined> {\n const cookieStore = await cookies();\n return cookieStore.get(getAccessTokenCookieName())?.value;\n}\n\nexport async function setAccessToken(token: string): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getAccessTokenCookieName(), token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n path: '/',\n maxAge: ACCESS_TOKEN_MAX_AGE,\n });\n}\n\nexport async function clearAccessToken(): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getAccessTokenCookieName(), '', {\n maxAge: -1,\n path: '/',\n });\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/actions/checkout.ts","../../src/config.ts","../../src/cookies.ts"],"sourcesContent":["'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type { StoreOrder, StoreShipment, AddressParams } from '@spree/sdk';\nimport { getClient } from '../config';\nimport { getCartToken, getAccessToken } from '../cookies';\n\nasync function getCheckoutOptions() {\n const orderToken = await getCartToken();\n const token = await getAccessToken();\n return { orderToken, token };\n}\n\n/**\n * Get the current checkout order state.\n * Includes line_items, shipments, and addresses by default.\n */\nexport async function getCheckout(\n orderId: string\n): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n return getClient().store.orders.get(\n orderId,\n { includes: 'line_items,shipments,ship_address,bill_address' },\n options\n );\n}\n\n/**\n * Update shipping and/or billing addresses on the order.\n */\nexport async function updateAddresses(\n orderId: string,\n params: {\n email?: string;\n ship_address?: AddressParams;\n bill_address?: AddressParams;\n ship_address_id?: string;\n bill_address_id?: string;\n }\n): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.update(orderId, params, options);\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Advance the checkout to the next step.\n */\nexport async function advance(orderId: string): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.advance(orderId, options);\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Move the checkout to the next step (alias for advance).\n */\nexport async function next(orderId: string): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.next(orderId, options);\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Get shipments for the order (includes available shipping rates).\n */\nexport async function getShipments(\n orderId: string\n): Promise<{ data: StoreShipment[] }> {\n const options = await getCheckoutOptions();\n return getClient().store.orders.shipments.list(orderId, options);\n}\n\n/**\n * Select a shipping rate for a shipment.\n * Returns the updated order with recalculated totals.\n */\nexport async function selectShippingRate(\n orderId: string,\n shipmentId: string,\n shippingRateId: string\n): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.shipments.update(\n orderId,\n shipmentId,\n { selected_shipping_rate_id: shippingRateId },\n options\n );\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Apply a coupon code to the order.\n */\nexport async function applyCoupon(\n orderId: string,\n code: string\n): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.couponCodes.apply(orderId, code, options);\n revalidateTag('checkout');\n revalidateTag('cart');\n return result;\n}\n\n/**\n * Remove a coupon/promotion from the order.\n */\nexport async function removeCoupon(\n orderId: string,\n promotionId: string\n): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.couponCodes.remove(orderId, promotionId, options);\n revalidateTag('checkout');\n revalidateTag('cart');\n return result;\n}\n\n/**\n * Complete the checkout and place the order.\n */\nexport async function complete(orderId: string): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.complete(orderId, options);\n revalidateTag('checkout');\n revalidateTag('cart');\n return result;\n}\n","import { createSpreeClient, type SpreeClient } from '@spree/sdk';\nimport type { SpreeNextConfig } from './types';\n\nlet _client: SpreeClient | null = null;\nlet _config: SpreeNextConfig | null = null;\n\n/**\n * Initialize the Spree Next.js integration.\n * Call this once in your app (e.g., in `lib/storefront.ts`).\n * If not called, the client will auto-initialize from SPREE_API_URL and SPREE_PUBLISHABLE_KEY env vars.\n */\nexport function initSpreeNext(config: SpreeNextConfig): void {\n _config = config;\n _client = createSpreeClient({\n baseUrl: config.baseUrl,\n publishableKey: config.publishableKey,\n });\n}\n\n/**\n * Get the SpreeClient instance. Auto-initializes from env vars if needed.\n * @internal\n */\nexport function getClient(): SpreeClient {\n if (!_client) {\n const baseUrl = process.env.SPREE_API_URL;\n const publishableKey = process.env.SPREE_PUBLISHABLE_KEY;\n if (baseUrl && publishableKey) {\n initSpreeNext({ baseUrl, publishableKey });\n } else {\n throw new Error(\n '@spree/next is not configured. Either call initSpreeNext() or set SPREE_API_URL and SPREE_PUBLISHABLE_KEY environment variables.'\n );\n }\n }\n return _client!;\n}\n\n/**\n * Get the current config. Auto-initializes from env vars if needed.\n * @internal\n */\nexport function getConfig(): SpreeNextConfig {\n if (!_config) {\n getClient(); // triggers auto-init\n }\n return _config!;\n}\n\n/**\n * Reset the client (useful for testing).\n * @internal\n */\nexport function resetClient(): void {\n _client = null;\n _config = null;\n}\n","import { cookies } from 'next/headers';\nimport { getConfig } from './config';\n\nconst DEFAULT_CART_COOKIE = '_spree_cart_token';\nconst DEFAULT_ACCESS_TOKEN_COOKIE = '_spree_jwt';\nconst CART_TOKEN_MAX_AGE = 60 * 60 * 24 * 30; // 30 days\nconst ACCESS_TOKEN_MAX_AGE = 60 * 60 * 24 * 7; // 7 days\n\nfunction getCartCookieName(): string {\n try {\n return getConfig().cartCookieName ?? DEFAULT_CART_COOKIE;\n } catch {\n return DEFAULT_CART_COOKIE;\n }\n}\n\nfunction getAccessTokenCookieName(): string {\n try {\n return getConfig().accessTokenCookieName ?? DEFAULT_ACCESS_TOKEN_COOKIE;\n } catch {\n return DEFAULT_ACCESS_TOKEN_COOKIE;\n }\n}\n\n// --- Cart Token ---\n\nexport async function getCartToken(): Promise<string | undefined> {\n const cookieStore = await cookies();\n return cookieStore.get(getCartCookieName())?.value;\n}\n\nexport async function setCartToken(token: string): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getCartCookieName(), token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n path: '/',\n maxAge: CART_TOKEN_MAX_AGE,\n });\n}\n\nexport async function clearCartToken(): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getCartCookieName(), '', {\n maxAge: -1,\n path: '/',\n });\n}\n\n// --- Access Token (JWT) ---\n\nexport async function getAccessToken(): Promise<string | undefined> {\n const cookieStore = await cookies();\n return cookieStore.get(getAccessTokenCookieName())?.value;\n}\n\nexport async function setAccessToken(token: string): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getAccessTokenCookieName(), token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n path: '/',\n maxAge: ACCESS_TOKEN_MAX_AGE,\n });\n}\n\nexport async function clearAccessToken(): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getAccessTokenCookieName(), '', {\n maxAge: -1,\n path: '/',\n });\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export { getTaxon, listTaxonProducts, listTaxons } from './data/taxons.js';
|
|
|
5
5
|
export { getTaxonomy, listTaxonomies } from './data/taxonomies.js';
|
|
6
6
|
export { getStore } from './data/store.js';
|
|
7
7
|
export { getCountry, listCountries } from './data/countries.js';
|
|
8
|
-
import {
|
|
8
|
+
import { StoreOrder, StoreShipment, AddressParams, StoreCustomer, StoreAddress, PaginatedResponse, StoreCreditCard, StoreGiftCard, CompletePaymentSessionParams, StorePaymentSession, CreatePaymentSessionParams, UpdatePaymentSessionParams } from '@spree/sdk';
|
|
9
9
|
export { AddressParams, CompletePaymentSessionParams, CreatePaymentSessionParams, PaginatedResponse, ProductFiltersResponse, SpreeError, StoreAddress, StoreCountry, StoreCreditCard, StoreCustomer, StoreGiftCard, StoreImage, StoreLineItem, StoreOptionType, StoreOptionValue, StoreOrder, StoreOrderPromotion, StorePayment, StorePaymentMethod, StorePaymentSession, StorePrice, StoreProduct, StoreShipment, StoreShippingRate, StoreStore, StoreTaxon, StoreTaxonomy, StoreVariant, UpdatePaymentSessionParams } from '@spree/sdk';
|
|
10
10
|
|
|
11
11
|
/**
|
|
@@ -22,16 +22,19 @@ declare function getOrCreateCart(): Promise<StoreOrder & {
|
|
|
22
22
|
}>;
|
|
23
23
|
/**
|
|
24
24
|
* Add an item to the cart. Creates a cart if none exists.
|
|
25
|
+
* Returns the updated order with recalculated totals.
|
|
25
26
|
*/
|
|
26
|
-
declare function addItem(variantId: string, quantity?: number): Promise<
|
|
27
|
+
declare function addItem(variantId: string, quantity?: number): Promise<StoreOrder>;
|
|
27
28
|
/**
|
|
28
29
|
* Update a line item quantity in the cart.
|
|
30
|
+
* Returns the updated order with recalculated totals.
|
|
29
31
|
*/
|
|
30
|
-
declare function updateItem(lineItemId: string, quantity: number): Promise<
|
|
32
|
+
declare function updateItem(lineItemId: string, quantity: number): Promise<StoreOrder>;
|
|
31
33
|
/**
|
|
32
34
|
* Remove a line item from the cart.
|
|
35
|
+
* Returns the updated order with recalculated totals.
|
|
33
36
|
*/
|
|
34
|
-
declare function removeItem(lineItemId: string): Promise<
|
|
37
|
+
declare function removeItem(lineItemId: string): Promise<StoreOrder>;
|
|
35
38
|
/**
|
|
36
39
|
* Clear the cart (abandons the current cart).
|
|
37
40
|
*/
|
|
@@ -75,8 +78,9 @@ declare function getShipments(orderId: string): Promise<{
|
|
|
75
78
|
}>;
|
|
76
79
|
/**
|
|
77
80
|
* Select a shipping rate for a shipment.
|
|
81
|
+
* Returns the updated order with recalculated totals.
|
|
78
82
|
*/
|
|
79
|
-
declare function selectShippingRate(orderId: string, shipmentId: string, shippingRateId: string): Promise<
|
|
83
|
+
declare function selectShippingRate(orderId: string, shipmentId: string, shippingRateId: string): Promise<StoreOrder>;
|
|
80
84
|
/**
|
|
81
85
|
* Apply a coupon code to the order.
|
|
82
86
|
*/
|
package/dist/index.js
CHANGED
|
@@ -195,38 +195,39 @@ async function addItem(variantId, quantity = 1) {
|
|
|
195
195
|
const cart = await getOrCreateCart();
|
|
196
196
|
const orderToken = cart.token;
|
|
197
197
|
const token = await getAccessToken();
|
|
198
|
-
const
|
|
198
|
+
const order = await getClient().store.orders.lineItems.create(
|
|
199
199
|
cart.id,
|
|
200
200
|
{ variant_id: variantId, quantity },
|
|
201
201
|
{ orderToken, token }
|
|
202
202
|
);
|
|
203
203
|
revalidateTag("cart");
|
|
204
|
-
return
|
|
204
|
+
return order;
|
|
205
205
|
}
|
|
206
206
|
async function updateItem(lineItemId, quantity) {
|
|
207
207
|
const orderToken = await getCartToken();
|
|
208
208
|
const token = await getAccessToken();
|
|
209
209
|
if (!orderToken && !token) throw new Error("No cart found");
|
|
210
210
|
const cart = await getClient().store.cart.get({ orderToken, token });
|
|
211
|
-
const
|
|
211
|
+
const order = await getClient().store.orders.lineItems.update(
|
|
212
212
|
cart.id,
|
|
213
213
|
lineItemId,
|
|
214
214
|
{ quantity },
|
|
215
215
|
{ orderToken, token }
|
|
216
216
|
);
|
|
217
217
|
revalidateTag("cart");
|
|
218
|
-
return
|
|
218
|
+
return order;
|
|
219
219
|
}
|
|
220
220
|
async function removeItem(lineItemId) {
|
|
221
221
|
const orderToken = await getCartToken();
|
|
222
222
|
const token = await getAccessToken();
|
|
223
223
|
if (!orderToken && !token) throw new Error("No cart found");
|
|
224
224
|
const cart = await getClient().store.cart.get({ orderToken, token });
|
|
225
|
-
await getClient().store.orders.lineItems.delete(cart.id, lineItemId, {
|
|
225
|
+
const order = await getClient().store.orders.lineItems.delete(cart.id, lineItemId, {
|
|
226
226
|
orderToken,
|
|
227
227
|
token
|
|
228
228
|
});
|
|
229
229
|
revalidateTag("cart");
|
|
230
|
+
return order;
|
|
230
231
|
}
|
|
231
232
|
async function clearCart() {
|
|
232
233
|
await clearCartToken();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/data/products.ts","../src/data/taxons.ts","../src/data/taxonomies.ts","../src/data/store.ts","../src/data/countries.ts","../src/cookies.ts","../src/actions/cart.ts","../src/actions/checkout.ts","../src/auth-helpers.ts","../src/actions/auth.ts","../src/actions/addresses.ts","../src/actions/orders.ts","../src/actions/credit-cards.ts","../src/actions/gift-cards.ts","../src/actions/payment-sessions.ts"],"names":["revalidateTag","getCheckoutOptions"],"mappings":"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","file":"index.js","sourcesContent":["import { createSpreeClient, type SpreeClient } from '@spree/sdk';\nimport type { SpreeNextConfig } from './types';\n\nlet _client: SpreeClient | null = null;\nlet _config: SpreeNextConfig | null = null;\n\n/**\n * Initialize the Spree Next.js integration.\n * Call this once in your app (e.g., in `lib/storefront.ts`).\n * If not called, the client will auto-initialize from SPREE_API_URL and SPREE_PUBLISHABLE_KEY env vars.\n */\nexport function initSpreeNext(config: SpreeNextConfig): void {\n _config = config;\n _client = createSpreeClient({\n baseUrl: config.baseUrl,\n publishableKey: config.publishableKey,\n });\n}\n\n/**\n * Get the SpreeClient instance. Auto-initializes from env vars if needed.\n * @internal\n */\nexport function getClient(): SpreeClient {\n if (!_client) {\n const baseUrl = process.env.SPREE_API_URL;\n const publishableKey = process.env.SPREE_PUBLISHABLE_KEY;\n if (baseUrl && publishableKey) {\n initSpreeNext({ baseUrl, publishableKey });\n } else {\n throw new Error(\n '@spree/next is not configured. Either call initSpreeNext() or set SPREE_API_URL and SPREE_PUBLISHABLE_KEY environment variables.'\n );\n }\n }\n return _client!;\n}\n\n/**\n * Get the current config. Auto-initializes from env vars if needed.\n * @internal\n */\nexport function getConfig(): SpreeNextConfig {\n if (!_config) {\n getClient(); // triggers auto-init\n }\n return _config!;\n}\n\n/**\n * Reset the client (useful for testing).\n * @internal\n */\nexport function resetClient(): void {\n _client = null;\n _config = null;\n}\n","import type { StoreProduct, PaginatedResponse, ProductFiltersResponse } from '@spree/sdk';\nimport { getClient } from '../config';\nimport type { SpreeNextOptions } from '../types';\n\n/**\n * List products with optional filtering, sorting, and pagination.\n */\nexport async function listProducts(\n params?: Record<string, unknown>,\n options?: SpreeNextOptions\n): Promise<PaginatedResponse<StoreProduct>> {\n return getClient().store.products.list(params, {\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n\n/**\n * Get a single product by slug or ID.\n */\nexport async function getProduct(\n slugOrId: string,\n params?: { includes?: string },\n options?: SpreeNextOptions\n): Promise<StoreProduct> {\n return getClient().store.products.get(slugOrId, params, {\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n\n/**\n * Get available product filters (price ranges, option values, etc.).\n */\nexport async function getProductFilters(\n params?: Record<string, unknown>,\n options?: SpreeNextOptions\n): Promise<ProductFiltersResponse> {\n return getClient().store.products.filters(params, {\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n","import type { StoreTaxon, StoreProduct, PaginatedResponse } from '@spree/sdk';\nimport { getClient } from '../config';\nimport type { SpreeNextOptions } from '../types';\n\n/**\n * List taxons (categories) with optional filtering and pagination.\n */\nexport async function listTaxons(\n params?: Record<string, unknown>,\n options?: SpreeNextOptions\n): Promise<PaginatedResponse<StoreTaxon>> {\n return getClient().store.taxons.list(params, {\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n\n/**\n * Get a single taxon by ID or permalink.\n */\nexport async function getTaxon(\n idOrPermalink: string,\n params?: Record<string, unknown>,\n options?: SpreeNextOptions\n): Promise<StoreTaxon> {\n return getClient().store.taxons.get(idOrPermalink, params, {\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n\n/**\n * List products within a taxon.\n */\nexport async function listTaxonProducts(\n taxonId: string,\n params?: Record<string, unknown>,\n options?: SpreeNextOptions\n): Promise<PaginatedResponse<StoreProduct>> {\n return getClient().store.taxons.products.list(taxonId, params, {\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n","import type { StoreTaxonomy, PaginatedResponse } from '@spree/sdk';\nimport { getClient } from '../config';\nimport type { SpreeNextOptions } from '../types';\n\n/**\n * List taxonomies with optional filtering and pagination.\n */\nexport async function listTaxonomies(\n params?: Record<string, unknown>,\n options?: SpreeNextOptions\n): Promise<PaginatedResponse<StoreTaxonomy>> {\n return getClient().store.taxonomies.list(params, {\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n\n/**\n * Get a single taxonomy by ID.\n */\nexport async function getTaxonomy(\n id: string,\n params?: Record<string, unknown>,\n options?: SpreeNextOptions\n): Promise<StoreTaxonomy> {\n return getClient().store.taxonomies.get(id, params, {\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n","import type { StoreStore } from '@spree/sdk';\nimport { getClient } from '../config';\nimport type { SpreeNextOptions } from '../types';\n\n/**\n * Get the current store configuration.\n */\nexport async function getStore(options?: SpreeNextOptions): Promise<StoreStore> {\n return getClient().store.store.get({\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n","import type { StoreCountry } from '@spree/sdk';\nimport { getClient } from '../config';\nimport type { SpreeNextOptions } from '../types';\n\n/**\n * List all available countries.\n */\nexport async function listCountries(\n options?: SpreeNextOptions\n): Promise<{ data: StoreCountry[] }> {\n return getClient().store.countries.list({\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n\n/**\n * Get a single country by ISO code.\n */\nexport async function getCountry(\n iso: string,\n options?: SpreeNextOptions\n): Promise<StoreCountry> {\n return getClient().store.countries.get(iso, {\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n","import { cookies } from 'next/headers';\nimport { getConfig } from './config';\n\nconst DEFAULT_CART_COOKIE = '_spree_cart_token';\nconst DEFAULT_ACCESS_TOKEN_COOKIE = '_spree_jwt';\nconst CART_TOKEN_MAX_AGE = 60 * 60 * 24 * 30; // 30 days\nconst ACCESS_TOKEN_MAX_AGE = 60 * 60 * 24 * 7; // 7 days\n\nfunction getCartCookieName(): string {\n try {\n return getConfig().cartCookieName ?? DEFAULT_CART_COOKIE;\n } catch {\n return DEFAULT_CART_COOKIE;\n }\n}\n\nfunction getAccessTokenCookieName(): string {\n try {\n return getConfig().accessTokenCookieName ?? DEFAULT_ACCESS_TOKEN_COOKIE;\n } catch {\n return DEFAULT_ACCESS_TOKEN_COOKIE;\n }\n}\n\n// --- Cart Token ---\n\nexport async function getCartToken(): Promise<string | undefined> {\n const cookieStore = await cookies();\n return cookieStore.get(getCartCookieName())?.value;\n}\n\nexport async function setCartToken(token: string): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getCartCookieName(), token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n path: '/',\n maxAge: CART_TOKEN_MAX_AGE,\n });\n}\n\nexport async function clearCartToken(): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getCartCookieName(), '', {\n maxAge: -1,\n path: '/',\n });\n}\n\n// --- Access Token (JWT) ---\n\nexport async function getAccessToken(): Promise<string | undefined> {\n const cookieStore = await cookies();\n return cookieStore.get(getAccessTokenCookieName())?.value;\n}\n\nexport async function setAccessToken(token: string): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getAccessTokenCookieName(), token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n path: '/',\n maxAge: ACCESS_TOKEN_MAX_AGE,\n });\n}\n\nexport async function clearAccessToken(): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getAccessTokenCookieName(), '', {\n maxAge: -1,\n path: '/',\n });\n}\n","'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type { StoreOrder, StoreLineItem } from '@spree/sdk';\nimport { getClient } from '../config';\nimport { getCartToken, setCartToken, clearCartToken, getAccessToken } from '../cookies';\n\n/**\n * Get the current cart. Returns null if no cart exists.\n */\nexport async function getCart(): Promise<(StoreOrder & { token: string }) | null> {\n const orderToken = await getCartToken();\n const token = await getAccessToken();\n if (!orderToken && !token) return null;\n\n try {\n return await getClient().store.cart.get({ orderToken, token });\n } catch {\n return null;\n }\n}\n\n/**\n * Get existing cart or create a new one.\n */\nexport async function getOrCreateCart(): Promise<StoreOrder & { token: string }> {\n const existing = await getCart();\n if (existing) return existing;\n\n const token = await getAccessToken();\n const cart = await getClient().store.cart.create(token ? { token } : undefined);\n\n if (cart.token) {\n await setCartToken(cart.token);\n }\n\n revalidateTag('cart');\n return cart;\n}\n\n/**\n * Add an item to the cart. Creates a cart if none exists.\n */\nexport async function addItem(\n variantId: string,\n quantity: number = 1\n): Promise<StoreLineItem> {\n const cart = await getOrCreateCart();\n const orderToken = cart.token;\n const token = await getAccessToken();\n\n const lineItem = await getClient().store.orders.lineItems.create(\n cart.id,\n { variant_id: variantId, quantity },\n { orderToken, token }\n );\n\n revalidateTag('cart');\n return lineItem;\n}\n\n/**\n * Update a line item quantity in the cart.\n */\nexport async function updateItem(\n lineItemId: string,\n quantity: number\n): Promise<StoreLineItem> {\n const orderToken = await getCartToken();\n const token = await getAccessToken();\n if (!orderToken && !token) throw new Error('No cart found');\n\n const cart = await getClient().store.cart.get({ orderToken, token });\n\n const lineItem = await getClient().store.orders.lineItems.update(\n cart.id,\n lineItemId,\n { quantity },\n { orderToken, token }\n );\n\n revalidateTag('cart');\n return lineItem;\n}\n\n/**\n * Remove a line item from the cart.\n */\nexport async function removeItem(lineItemId: string): Promise<void> {\n const orderToken = await getCartToken();\n const token = await getAccessToken();\n if (!orderToken && !token) throw new Error('No cart found');\n\n const cart = await getClient().store.cart.get({ orderToken, token });\n\n await getClient().store.orders.lineItems.delete(cart.id, lineItemId, {\n orderToken,\n token,\n });\n\n revalidateTag('cart');\n}\n\n/**\n * Clear the cart (abandons the current cart).\n */\nexport async function clearCart(): Promise<void> {\n await clearCartToken();\n revalidateTag('cart');\n}\n\n/**\n * Associate a guest cart with the currently authenticated user.\n * Call this after login/register when the user has an existing guest cart.\n */\nexport async function associateCart(): Promise<(StoreOrder & { token: string }) | null> {\n const orderToken = await getCartToken();\n const token = await getAccessToken();\n if (!orderToken || !token) return null;\n\n try {\n const result = await getClient().store.cart.associate({ orderToken, token });\n revalidateTag('cart');\n return result;\n } catch {\n // Cart might already belong to another user — clear it\n await clearCartToken();\n revalidateTag('cart');\n return null;\n }\n}\n","'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type { StoreOrder, StoreShipment, AddressParams } from '@spree/sdk';\nimport { getClient } from '../config';\nimport { getCartToken, getAccessToken } from '../cookies';\n\nasync function getCheckoutOptions() {\n const orderToken = await getCartToken();\n const token = await getAccessToken();\n return { orderToken, token };\n}\n\n/**\n * Get the current checkout order state.\n * Includes line_items, shipments, and addresses by default.\n */\nexport async function getCheckout(\n orderId: string\n): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n return getClient().store.orders.get(\n orderId,\n { includes: 'line_items,shipments,ship_address,bill_address' },\n options\n );\n}\n\n/**\n * Update shipping and/or billing addresses on the order.\n */\nexport async function updateAddresses(\n orderId: string,\n params: {\n email?: string;\n ship_address?: AddressParams;\n bill_address?: AddressParams;\n ship_address_id?: string;\n bill_address_id?: string;\n }\n): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.update(orderId, params, options);\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Advance the checkout to the next step.\n */\nexport async function advance(orderId: string): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.advance(orderId, options);\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Move the checkout to the next step (alias for advance).\n */\nexport async function next(orderId: string): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.next(orderId, options);\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Get shipments for the order (includes available shipping rates).\n */\nexport async function getShipments(\n orderId: string\n): Promise<{ data: StoreShipment[] }> {\n const options = await getCheckoutOptions();\n return getClient().store.orders.shipments.list(orderId, options);\n}\n\n/**\n * Select a shipping rate for a shipment.\n */\nexport async function selectShippingRate(\n orderId: string,\n shipmentId: string,\n shippingRateId: string\n): Promise<StoreShipment> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.shipments.update(\n orderId,\n shipmentId,\n { selected_shipping_rate_id: shippingRateId },\n options\n );\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Apply a coupon code to the order.\n */\nexport async function applyCoupon(\n orderId: string,\n code: string\n): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.couponCodes.apply(orderId, code, options);\n revalidateTag('checkout');\n revalidateTag('cart');\n return result;\n}\n\n/**\n * Remove a coupon/promotion from the order.\n */\nexport async function removeCoupon(\n orderId: string,\n promotionId: string\n): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.couponCodes.remove(orderId, promotionId, options);\n revalidateTag('checkout');\n revalidateTag('cart');\n return result;\n}\n\n/**\n * Complete the checkout and place the order.\n */\nexport async function complete(orderId: string): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.complete(orderId, options);\n revalidateTag('checkout');\n revalidateTag('cart');\n return result;\n}\n","import { SpreeError } from '@spree/sdk';\nimport type { RequestOptions } from '@spree/sdk';\nimport { getClient } from './config';\nimport { getAccessToken, setAccessToken, clearAccessToken } from './cookies';\n\n/**\n * Get auth request options from the current JWT token.\n * Proactively refreshes the token if it expires within 1 hour.\n */\nexport async function getAuthOptions(): Promise<RequestOptions> {\n const token = await getAccessToken();\n if (!token) {\n return {};\n }\n\n // Check if token is close to expiry by decoding JWT payload\n try {\n const payload = JSON.parse(atob(token.split('.')[1]));\n const exp = payload.exp;\n const now = Math.floor(Date.now() / 1000);\n\n // Refresh if token expires in less than 1 hour\n if (exp && exp - now < 3600) {\n try {\n const refreshed = await getClient().store.auth.refresh({ token });\n await setAccessToken(refreshed.token);\n return { token: refreshed.token };\n } catch {\n // Refresh failed — use existing token, it might still work\n }\n }\n } catch {\n // Can't decode JWT — use it as-is, the server will reject if invalid\n }\n\n return { token };\n}\n\n/**\n * Execute an authenticated request with automatic token refresh on 401.\n * @param fn - Function that takes RequestOptions and returns a promise\n * @returns The result of the function\n * @throws SpreeError if auth fails after refresh attempt\n */\nexport async function withAuthRefresh<T>(\n fn: (options: RequestOptions) => Promise<T>\n): Promise<T> {\n const options = await getAuthOptions();\n\n if (!options.token) {\n throw new Error('Not authenticated');\n }\n\n try {\n return await fn(options);\n } catch (error: unknown) {\n // If 401, try refreshing the token once\n if (error instanceof SpreeError && error.status === 401) {\n try {\n const refreshed = await getClient().store.auth.refresh({ token: options.token });\n await setAccessToken(refreshed.token);\n return await fn({ token: refreshed.token });\n } catch {\n // Refresh failed — clear token and rethrow\n await clearAccessToken();\n throw error;\n }\n }\n throw error;\n }\n}\n","'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type { StoreCustomer } from '@spree/sdk';\nimport { getClient } from '../config';\nimport { setAccessToken, clearAccessToken, getAccessToken, getCartToken } from '../cookies';\nimport { withAuthRefresh } from '../auth-helpers';\n\n/**\n * Login with email and password.\n * Automatically associates any guest cart with the authenticated user.\n */\nexport async function login(\n email: string,\n password: string\n): Promise<{ success: boolean; user?: { id: string; email: string; first_name?: string | null; last_name?: string | null }; error?: string }> {\n try {\n const result = await getClient().store.auth.login({ email, password });\n await setAccessToken(result.token);\n\n // Associate guest cart if one exists\n const cartToken = await getCartToken();\n if (cartToken) {\n try {\n await getClient().store.cart.associate({\n token: result.token,\n orderToken: cartToken,\n });\n } catch {\n // Cart association failure is non-fatal\n }\n }\n\n revalidateTag('customer');\n revalidateTag('cart');\n return { success: true, user: result.user };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Invalid email or password',\n };\n }\n}\n\n/**\n * Register a new customer account.\n * Automatically associates any guest cart with the new account.\n */\nexport async function register(\n email: string,\n password: string,\n passwordConfirmation: string\n): Promise<{ success: boolean; user?: { id: string; email: string; first_name?: string | null; last_name?: string | null }; error?: string }> {\n try {\n const result = await getClient().store.auth.register({\n email,\n password,\n password_confirmation: passwordConfirmation,\n });\n await setAccessToken(result.token);\n\n // Associate guest cart\n const cartToken = await getCartToken();\n if (cartToken) {\n try {\n await getClient().store.cart.associate({\n token: result.token,\n orderToken: cartToken,\n });\n } catch {\n // Non-fatal\n }\n }\n\n revalidateTag('customer');\n revalidateTag('cart');\n return { success: true, user: result.user };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Registration failed',\n };\n }\n}\n\n/**\n * Logout the current user.\n */\nexport async function logout(): Promise<void> {\n await clearAccessToken();\n revalidateTag('customer');\n revalidateTag('cart');\n revalidateTag('addresses');\n revalidateTag('credit-cards');\n}\n\n/**\n * Get the currently authenticated customer. Returns null if not logged in.\n */\nexport async function getCustomer(): Promise<StoreCustomer | null> {\n const token = await getAccessToken();\n if (!token) return null;\n\n try {\n return await withAuthRefresh(async (options) => {\n return getClient().store.customer.get(options);\n });\n } catch {\n await clearAccessToken();\n return null;\n }\n}\n\n/**\n * Update the current customer's profile.\n */\nexport async function updateCustomer(\n data: { first_name?: string; last_name?: string; email?: string }\n): Promise<StoreCustomer> {\n const result = await withAuthRefresh(async (options) => {\n return getClient().store.customer.update(data, options);\n });\n revalidateTag('customer');\n return result;\n}\n","'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type { StoreAddress, AddressParams } from '@spree/sdk';\nimport { withAuthRefresh } from '../auth-helpers';\nimport { getClient } from '../config';\n\n/**\n * List the authenticated customer's addresses.\n */\nexport async function listAddresses(): Promise<{ data: StoreAddress[] }> {\n return withAuthRefresh(async (options) => {\n return getClient().store.customer.addresses.list(undefined, options);\n });\n}\n\n/**\n * Get a single address by ID.\n */\nexport async function getAddress(id: string): Promise<StoreAddress> {\n return withAuthRefresh(async (options) => {\n return getClient().store.customer.addresses.get(id, options);\n });\n}\n\n/**\n * Create a new address for the customer.\n */\nexport async function createAddress(params: AddressParams): Promise<StoreAddress> {\n const result = await withAuthRefresh(async (options) => {\n return getClient().store.customer.addresses.create(params, options);\n });\n revalidateTag('addresses');\n return result;\n}\n\n/**\n * Update an existing address.\n */\nexport async function updateAddress(\n id: string,\n params: Partial<AddressParams>\n): Promise<StoreAddress> {\n const result = await withAuthRefresh(async (options) => {\n return getClient().store.customer.addresses.update(id, params, options);\n });\n revalidateTag('addresses');\n return result;\n}\n\n/**\n * Delete an address.\n */\nexport async function deleteAddress(id: string): Promise<void> {\n await withAuthRefresh(async (options) => {\n return getClient().store.customer.addresses.delete(id, options);\n });\n revalidateTag('addresses');\n}\n","'use server';\n\nimport type { StoreOrder, PaginatedResponse } from '@spree/sdk';\nimport { withAuthRefresh } from '../auth-helpers';\nimport { getClient } from '../config';\n\n/**\n * List the authenticated customer's orders.\n */\nexport async function listOrders(\n params?: Record<string, unknown>\n): Promise<PaginatedResponse<StoreOrder>> {\n return withAuthRefresh(async (options) => {\n return getClient().store.orders.list(params, options);\n });\n}\n\n/**\n * Get a single order by ID or number.\n */\nexport async function getOrder(\n idOrNumber: string,\n params?: Record<string, unknown>\n): Promise<StoreOrder> {\n return withAuthRefresh(async (options) => {\n return getClient().store.orders.get(idOrNumber, params, options);\n });\n}\n","'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type { StoreCreditCard } from '@spree/sdk';\nimport { withAuthRefresh } from '../auth-helpers';\nimport { getClient } from '../config';\n\n/**\n * List the authenticated customer's credit cards.\n */\nexport async function listCreditCards(): Promise<{ data: StoreCreditCard[] }> {\n return withAuthRefresh(async (options) => {\n return getClient().store.customer.creditCards.list(undefined, options);\n });\n}\n\n/**\n * Delete a credit card.\n */\nexport async function deleteCreditCard(id: string): Promise<void> {\n await withAuthRefresh(async (options) => {\n return getClient().store.customer.creditCards.delete(id, options);\n });\n revalidateTag('credit-cards');\n}\n","'use server';\n\nimport type { StoreGiftCard } from '@spree/sdk';\nimport { withAuthRefresh } from '../auth-helpers';\nimport { getClient } from '../config';\n\n/**\n * List the authenticated customer's gift cards.\n */\nexport async function listGiftCards(): Promise<{ data: StoreGiftCard[] }> {\n return withAuthRefresh(async (options) => {\n return getClient().store.customer.giftCards.list(undefined, options);\n });\n}\n\n/**\n * Get a single gift card by ID.\n */\nexport async function getGiftCard(id: string): Promise<StoreGiftCard> {\n return withAuthRefresh(async (options) => {\n return getClient().store.customer.giftCards.get(id, options);\n });\n}\n","'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type {\n StorePaymentSession,\n CreatePaymentSessionParams,\n UpdatePaymentSessionParams,\n CompletePaymentSessionParams,\n} from '@spree/sdk';\nimport { getClient } from '../config';\nimport { getCartToken, getAccessToken } from '../cookies';\n\nasync function getCheckoutOptions() {\n const orderToken = await getCartToken();\n const token = await getAccessToken();\n return { orderToken, token };\n}\n\n/**\n * Create a payment session for an order.\n * Delegates to the payment gateway to initialize a provider-specific session.\n */\nexport async function createPaymentSession(\n orderId: string,\n params: CreatePaymentSessionParams\n): Promise<StorePaymentSession> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.paymentSessions.create(orderId, params, options);\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Get a payment session by ID.\n */\nexport async function getPaymentSession(\n orderId: string,\n sessionId: string\n): Promise<StorePaymentSession> {\n const options = await getCheckoutOptions();\n return getClient().store.orders.paymentSessions.get(orderId, sessionId, options);\n}\n\n/**\n * Update a payment session.\n * Delegates to the payment gateway to sync changes with the provider.\n */\nexport async function updatePaymentSession(\n orderId: string,\n sessionId: string,\n params: UpdatePaymentSessionParams\n): Promise<StorePaymentSession> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.paymentSessions.update(orderId, sessionId, params, options);\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Complete a payment session.\n * Confirms the payment with the provider, triggering capture/authorization.\n */\nexport async function completePaymentSession(\n orderId: string,\n sessionId: string,\n params?: CompletePaymentSessionParams\n): Promise<StorePaymentSession> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.paymentSessions.complete(orderId, sessionId, params, options);\n revalidateTag('checkout');\n return result;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/data/products.ts","../src/data/taxons.ts","../src/data/taxonomies.ts","../src/data/store.ts","../src/data/countries.ts","../src/cookies.ts","../src/actions/cart.ts","../src/actions/checkout.ts","../src/auth-helpers.ts","../src/actions/auth.ts","../src/actions/addresses.ts","../src/actions/orders.ts","../src/actions/credit-cards.ts","../src/actions/gift-cards.ts","../src/actions/payment-sessions.ts"],"names":["revalidateTag","getCheckoutOptions"],"mappings":"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","file":"index.js","sourcesContent":["import { createSpreeClient, type SpreeClient } from '@spree/sdk';\nimport type { SpreeNextConfig } from './types';\n\nlet _client: SpreeClient | null = null;\nlet _config: SpreeNextConfig | null = null;\n\n/**\n * Initialize the Spree Next.js integration.\n * Call this once in your app (e.g., in `lib/storefront.ts`).\n * If not called, the client will auto-initialize from SPREE_API_URL and SPREE_PUBLISHABLE_KEY env vars.\n */\nexport function initSpreeNext(config: SpreeNextConfig): void {\n _config = config;\n _client = createSpreeClient({\n baseUrl: config.baseUrl,\n publishableKey: config.publishableKey,\n });\n}\n\n/**\n * Get the SpreeClient instance. Auto-initializes from env vars if needed.\n * @internal\n */\nexport function getClient(): SpreeClient {\n if (!_client) {\n const baseUrl = process.env.SPREE_API_URL;\n const publishableKey = process.env.SPREE_PUBLISHABLE_KEY;\n if (baseUrl && publishableKey) {\n initSpreeNext({ baseUrl, publishableKey });\n } else {\n throw new Error(\n '@spree/next is not configured. Either call initSpreeNext() or set SPREE_API_URL and SPREE_PUBLISHABLE_KEY environment variables.'\n );\n }\n }\n return _client!;\n}\n\n/**\n * Get the current config. Auto-initializes from env vars if needed.\n * @internal\n */\nexport function getConfig(): SpreeNextConfig {\n if (!_config) {\n getClient(); // triggers auto-init\n }\n return _config!;\n}\n\n/**\n * Reset the client (useful for testing).\n * @internal\n */\nexport function resetClient(): void {\n _client = null;\n _config = null;\n}\n","import type { StoreProduct, PaginatedResponse, ProductFiltersResponse } from '@spree/sdk';\nimport { getClient } from '../config';\nimport type { SpreeNextOptions } from '../types';\n\n/**\n * List products with optional filtering, sorting, and pagination.\n */\nexport async function listProducts(\n params?: Record<string, unknown>,\n options?: SpreeNextOptions\n): Promise<PaginatedResponse<StoreProduct>> {\n return getClient().store.products.list(params, {\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n\n/**\n * Get a single product by slug or ID.\n */\nexport async function getProduct(\n slugOrId: string,\n params?: { includes?: string },\n options?: SpreeNextOptions\n): Promise<StoreProduct> {\n return getClient().store.products.get(slugOrId, params, {\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n\n/**\n * Get available product filters (price ranges, option values, etc.).\n */\nexport async function getProductFilters(\n params?: Record<string, unknown>,\n options?: SpreeNextOptions\n): Promise<ProductFiltersResponse> {\n return getClient().store.products.filters(params, {\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n","import type { StoreTaxon, StoreProduct, PaginatedResponse } from '@spree/sdk';\nimport { getClient } from '../config';\nimport type { SpreeNextOptions } from '../types';\n\n/**\n * List taxons (categories) with optional filtering and pagination.\n */\nexport async function listTaxons(\n params?: Record<string, unknown>,\n options?: SpreeNextOptions\n): Promise<PaginatedResponse<StoreTaxon>> {\n return getClient().store.taxons.list(params, {\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n\n/**\n * Get a single taxon by ID or permalink.\n */\nexport async function getTaxon(\n idOrPermalink: string,\n params?: Record<string, unknown>,\n options?: SpreeNextOptions\n): Promise<StoreTaxon> {\n return getClient().store.taxons.get(idOrPermalink, params, {\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n\n/**\n * List products within a taxon.\n */\nexport async function listTaxonProducts(\n taxonId: string,\n params?: Record<string, unknown>,\n options?: SpreeNextOptions\n): Promise<PaginatedResponse<StoreProduct>> {\n return getClient().store.taxons.products.list(taxonId, params, {\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n","import type { StoreTaxonomy, PaginatedResponse } from '@spree/sdk';\nimport { getClient } from '../config';\nimport type { SpreeNextOptions } from '../types';\n\n/**\n * List taxonomies with optional filtering and pagination.\n */\nexport async function listTaxonomies(\n params?: Record<string, unknown>,\n options?: SpreeNextOptions\n): Promise<PaginatedResponse<StoreTaxonomy>> {\n return getClient().store.taxonomies.list(params, {\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n\n/**\n * Get a single taxonomy by ID.\n */\nexport async function getTaxonomy(\n id: string,\n params?: Record<string, unknown>,\n options?: SpreeNextOptions\n): Promise<StoreTaxonomy> {\n return getClient().store.taxonomies.get(id, params, {\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n","import type { StoreStore } from '@spree/sdk';\nimport { getClient } from '../config';\nimport type { SpreeNextOptions } from '../types';\n\n/**\n * Get the current store configuration.\n */\nexport async function getStore(options?: SpreeNextOptions): Promise<StoreStore> {\n return getClient().store.store.get({\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n","import type { StoreCountry } from '@spree/sdk';\nimport { getClient } from '../config';\nimport type { SpreeNextOptions } from '../types';\n\n/**\n * List all available countries.\n */\nexport async function listCountries(\n options?: SpreeNextOptions\n): Promise<{ data: StoreCountry[] }> {\n return getClient().store.countries.list({\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n\n/**\n * Get a single country by ISO code.\n */\nexport async function getCountry(\n iso: string,\n options?: SpreeNextOptions\n): Promise<StoreCountry> {\n return getClient().store.countries.get(iso, {\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n","import { cookies } from 'next/headers';\nimport { getConfig } from './config';\n\nconst DEFAULT_CART_COOKIE = '_spree_cart_token';\nconst DEFAULT_ACCESS_TOKEN_COOKIE = '_spree_jwt';\nconst CART_TOKEN_MAX_AGE = 60 * 60 * 24 * 30; // 30 days\nconst ACCESS_TOKEN_MAX_AGE = 60 * 60 * 24 * 7; // 7 days\n\nfunction getCartCookieName(): string {\n try {\n return getConfig().cartCookieName ?? DEFAULT_CART_COOKIE;\n } catch {\n return DEFAULT_CART_COOKIE;\n }\n}\n\nfunction getAccessTokenCookieName(): string {\n try {\n return getConfig().accessTokenCookieName ?? DEFAULT_ACCESS_TOKEN_COOKIE;\n } catch {\n return DEFAULT_ACCESS_TOKEN_COOKIE;\n }\n}\n\n// --- Cart Token ---\n\nexport async function getCartToken(): Promise<string | undefined> {\n const cookieStore = await cookies();\n return cookieStore.get(getCartCookieName())?.value;\n}\n\nexport async function setCartToken(token: string): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getCartCookieName(), token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n path: '/',\n maxAge: CART_TOKEN_MAX_AGE,\n });\n}\n\nexport async function clearCartToken(): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getCartCookieName(), '', {\n maxAge: -1,\n path: '/',\n });\n}\n\n// --- Access Token (JWT) ---\n\nexport async function getAccessToken(): Promise<string | undefined> {\n const cookieStore = await cookies();\n return cookieStore.get(getAccessTokenCookieName())?.value;\n}\n\nexport async function setAccessToken(token: string): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getAccessTokenCookieName(), token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n path: '/',\n maxAge: ACCESS_TOKEN_MAX_AGE,\n });\n}\n\nexport async function clearAccessToken(): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getAccessTokenCookieName(), '', {\n maxAge: -1,\n path: '/',\n });\n}\n","'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type { StoreOrder } from '@spree/sdk';\nimport { getClient } from '../config';\nimport { getCartToken, setCartToken, clearCartToken, getAccessToken } from '../cookies';\n\n/**\n * Get the current cart. Returns null if no cart exists.\n */\nexport async function getCart(): Promise<(StoreOrder & { token: string }) | null> {\n const orderToken = await getCartToken();\n const token = await getAccessToken();\n if (!orderToken && !token) return null;\n\n try {\n return await getClient().store.cart.get({ orderToken, token });\n } catch {\n return null;\n }\n}\n\n/**\n * Get existing cart or create a new one.\n */\nexport async function getOrCreateCart(): Promise<StoreOrder & { token: string }> {\n const existing = await getCart();\n if (existing) return existing;\n\n const token = await getAccessToken();\n const cart = await getClient().store.cart.create(token ? { token } : undefined);\n\n if (cart.token) {\n await setCartToken(cart.token);\n }\n\n revalidateTag('cart');\n return cart;\n}\n\n/**\n * Add an item to the cart. Creates a cart if none exists.\n * Returns the updated order with recalculated totals.\n */\nexport async function addItem(\n variantId: string,\n quantity: number = 1\n): Promise<StoreOrder> {\n const cart = await getOrCreateCart();\n const orderToken = cart.token;\n const token = await getAccessToken();\n\n const order = await getClient().store.orders.lineItems.create(\n cart.id,\n { variant_id: variantId, quantity },\n { orderToken, token }\n );\n\n revalidateTag('cart');\n return order;\n}\n\n/**\n * Update a line item quantity in the cart.\n * Returns the updated order with recalculated totals.\n */\nexport async function updateItem(\n lineItemId: string,\n quantity: number\n): Promise<StoreOrder> {\n const orderToken = await getCartToken();\n const token = await getAccessToken();\n if (!orderToken && !token) throw new Error('No cart found');\n\n const cart = await getClient().store.cart.get({ orderToken, token });\n\n const order = await getClient().store.orders.lineItems.update(\n cart.id,\n lineItemId,\n { quantity },\n { orderToken, token }\n );\n\n revalidateTag('cart');\n return order;\n}\n\n/**\n * Remove a line item from the cart.\n * Returns the updated order with recalculated totals.\n */\nexport async function removeItem(lineItemId: string): Promise<StoreOrder> {\n const orderToken = await getCartToken();\n const token = await getAccessToken();\n if (!orderToken && !token) throw new Error('No cart found');\n\n const cart = await getClient().store.cart.get({ orderToken, token });\n\n const order = await getClient().store.orders.lineItems.delete(cart.id, lineItemId, {\n orderToken,\n token,\n });\n\n revalidateTag('cart');\n return order;\n}\n\n/**\n * Clear the cart (abandons the current cart).\n */\nexport async function clearCart(): Promise<void> {\n await clearCartToken();\n revalidateTag('cart');\n}\n\n/**\n * Associate a guest cart with the currently authenticated user.\n * Call this after login/register when the user has an existing guest cart.\n */\nexport async function associateCart(): Promise<(StoreOrder & { token: string }) | null> {\n const orderToken = await getCartToken();\n const token = await getAccessToken();\n if (!orderToken || !token) return null;\n\n try {\n const result = await getClient().store.cart.associate({ orderToken, token });\n revalidateTag('cart');\n return result;\n } catch {\n // Cart might already belong to another user — clear it\n await clearCartToken();\n revalidateTag('cart');\n return null;\n }\n}\n","'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type { StoreOrder, StoreShipment, AddressParams } from '@spree/sdk';\nimport { getClient } from '../config';\nimport { getCartToken, getAccessToken } from '../cookies';\n\nasync function getCheckoutOptions() {\n const orderToken = await getCartToken();\n const token = await getAccessToken();\n return { orderToken, token };\n}\n\n/**\n * Get the current checkout order state.\n * Includes line_items, shipments, and addresses by default.\n */\nexport async function getCheckout(\n orderId: string\n): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n return getClient().store.orders.get(\n orderId,\n { includes: 'line_items,shipments,ship_address,bill_address' },\n options\n );\n}\n\n/**\n * Update shipping and/or billing addresses on the order.\n */\nexport async function updateAddresses(\n orderId: string,\n params: {\n email?: string;\n ship_address?: AddressParams;\n bill_address?: AddressParams;\n ship_address_id?: string;\n bill_address_id?: string;\n }\n): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.update(orderId, params, options);\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Advance the checkout to the next step.\n */\nexport async function advance(orderId: string): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.advance(orderId, options);\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Move the checkout to the next step (alias for advance).\n */\nexport async function next(orderId: string): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.next(orderId, options);\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Get shipments for the order (includes available shipping rates).\n */\nexport async function getShipments(\n orderId: string\n): Promise<{ data: StoreShipment[] }> {\n const options = await getCheckoutOptions();\n return getClient().store.orders.shipments.list(orderId, options);\n}\n\n/**\n * Select a shipping rate for a shipment.\n * Returns the updated order with recalculated totals.\n */\nexport async function selectShippingRate(\n orderId: string,\n shipmentId: string,\n shippingRateId: string\n): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.shipments.update(\n orderId,\n shipmentId,\n { selected_shipping_rate_id: shippingRateId },\n options\n );\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Apply a coupon code to the order.\n */\nexport async function applyCoupon(\n orderId: string,\n code: string\n): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.couponCodes.apply(orderId, code, options);\n revalidateTag('checkout');\n revalidateTag('cart');\n return result;\n}\n\n/**\n * Remove a coupon/promotion from the order.\n */\nexport async function removeCoupon(\n orderId: string,\n promotionId: string\n): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.couponCodes.remove(orderId, promotionId, options);\n revalidateTag('checkout');\n revalidateTag('cart');\n return result;\n}\n\n/**\n * Complete the checkout and place the order.\n */\nexport async function complete(orderId: string): Promise<StoreOrder> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.complete(orderId, options);\n revalidateTag('checkout');\n revalidateTag('cart');\n return result;\n}\n","import { SpreeError } from '@spree/sdk';\nimport type { RequestOptions } from '@spree/sdk';\nimport { getClient } from './config';\nimport { getAccessToken, setAccessToken, clearAccessToken } from './cookies';\n\n/**\n * Get auth request options from the current JWT token.\n * Proactively refreshes the token if it expires within 1 hour.\n */\nexport async function getAuthOptions(): Promise<RequestOptions> {\n const token = await getAccessToken();\n if (!token) {\n return {};\n }\n\n // Check if token is close to expiry by decoding JWT payload\n try {\n const payload = JSON.parse(atob(token.split('.')[1]));\n const exp = payload.exp;\n const now = Math.floor(Date.now() / 1000);\n\n // Refresh if token expires in less than 1 hour\n if (exp && exp - now < 3600) {\n try {\n const refreshed = await getClient().store.auth.refresh({ token });\n await setAccessToken(refreshed.token);\n return { token: refreshed.token };\n } catch {\n // Refresh failed — use existing token, it might still work\n }\n }\n } catch {\n // Can't decode JWT — use it as-is, the server will reject if invalid\n }\n\n return { token };\n}\n\n/**\n * Execute an authenticated request with automatic token refresh on 401.\n * @param fn - Function that takes RequestOptions and returns a promise\n * @returns The result of the function\n * @throws SpreeError if auth fails after refresh attempt\n */\nexport async function withAuthRefresh<T>(\n fn: (options: RequestOptions) => Promise<T>\n): Promise<T> {\n const options = await getAuthOptions();\n\n if (!options.token) {\n throw new Error('Not authenticated');\n }\n\n try {\n return await fn(options);\n } catch (error: unknown) {\n // If 401, try refreshing the token once\n if (error instanceof SpreeError && error.status === 401) {\n try {\n const refreshed = await getClient().store.auth.refresh({ token: options.token });\n await setAccessToken(refreshed.token);\n return await fn({ token: refreshed.token });\n } catch {\n // Refresh failed — clear token and rethrow\n await clearAccessToken();\n throw error;\n }\n }\n throw error;\n }\n}\n","'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type { StoreCustomer } from '@spree/sdk';\nimport { getClient } from '../config';\nimport { setAccessToken, clearAccessToken, getAccessToken, getCartToken } from '../cookies';\nimport { withAuthRefresh } from '../auth-helpers';\n\n/**\n * Login with email and password.\n * Automatically associates any guest cart with the authenticated user.\n */\nexport async function login(\n email: string,\n password: string\n): Promise<{ success: boolean; user?: { id: string; email: string; first_name?: string | null; last_name?: string | null }; error?: string }> {\n try {\n const result = await getClient().store.auth.login({ email, password });\n await setAccessToken(result.token);\n\n // Associate guest cart if one exists\n const cartToken = await getCartToken();\n if (cartToken) {\n try {\n await getClient().store.cart.associate({\n token: result.token,\n orderToken: cartToken,\n });\n } catch {\n // Cart association failure is non-fatal\n }\n }\n\n revalidateTag('customer');\n revalidateTag('cart');\n return { success: true, user: result.user };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Invalid email or password',\n };\n }\n}\n\n/**\n * Register a new customer account.\n * Automatically associates any guest cart with the new account.\n */\nexport async function register(\n email: string,\n password: string,\n passwordConfirmation: string\n): Promise<{ success: boolean; user?: { id: string; email: string; first_name?: string | null; last_name?: string | null }; error?: string }> {\n try {\n const result = await getClient().store.auth.register({\n email,\n password,\n password_confirmation: passwordConfirmation,\n });\n await setAccessToken(result.token);\n\n // Associate guest cart\n const cartToken = await getCartToken();\n if (cartToken) {\n try {\n await getClient().store.cart.associate({\n token: result.token,\n orderToken: cartToken,\n });\n } catch {\n // Non-fatal\n }\n }\n\n revalidateTag('customer');\n revalidateTag('cart');\n return { success: true, user: result.user };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Registration failed',\n };\n }\n}\n\n/**\n * Logout the current user.\n */\nexport async function logout(): Promise<void> {\n await clearAccessToken();\n revalidateTag('customer');\n revalidateTag('cart');\n revalidateTag('addresses');\n revalidateTag('credit-cards');\n}\n\n/**\n * Get the currently authenticated customer. Returns null if not logged in.\n */\nexport async function getCustomer(): Promise<StoreCustomer | null> {\n const token = await getAccessToken();\n if (!token) return null;\n\n try {\n return await withAuthRefresh(async (options) => {\n return getClient().store.customer.get(options);\n });\n } catch {\n await clearAccessToken();\n return null;\n }\n}\n\n/**\n * Update the current customer's profile.\n */\nexport async function updateCustomer(\n data: { first_name?: string; last_name?: string; email?: string }\n): Promise<StoreCustomer> {\n const result = await withAuthRefresh(async (options) => {\n return getClient().store.customer.update(data, options);\n });\n revalidateTag('customer');\n return result;\n}\n","'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type { StoreAddress, AddressParams } from '@spree/sdk';\nimport { withAuthRefresh } from '../auth-helpers';\nimport { getClient } from '../config';\n\n/**\n * List the authenticated customer's addresses.\n */\nexport async function listAddresses(): Promise<{ data: StoreAddress[] }> {\n return withAuthRefresh(async (options) => {\n return getClient().store.customer.addresses.list(undefined, options);\n });\n}\n\n/**\n * Get a single address by ID.\n */\nexport async function getAddress(id: string): Promise<StoreAddress> {\n return withAuthRefresh(async (options) => {\n return getClient().store.customer.addresses.get(id, options);\n });\n}\n\n/**\n * Create a new address for the customer.\n */\nexport async function createAddress(params: AddressParams): Promise<StoreAddress> {\n const result = await withAuthRefresh(async (options) => {\n return getClient().store.customer.addresses.create(params, options);\n });\n revalidateTag('addresses');\n return result;\n}\n\n/**\n * Update an existing address.\n */\nexport async function updateAddress(\n id: string,\n params: Partial<AddressParams>\n): Promise<StoreAddress> {\n const result = await withAuthRefresh(async (options) => {\n return getClient().store.customer.addresses.update(id, params, options);\n });\n revalidateTag('addresses');\n return result;\n}\n\n/**\n * Delete an address.\n */\nexport async function deleteAddress(id: string): Promise<void> {\n await withAuthRefresh(async (options) => {\n return getClient().store.customer.addresses.delete(id, options);\n });\n revalidateTag('addresses');\n}\n","'use server';\n\nimport type { StoreOrder, PaginatedResponse } from '@spree/sdk';\nimport { withAuthRefresh } from '../auth-helpers';\nimport { getClient } from '../config';\n\n/**\n * List the authenticated customer's orders.\n */\nexport async function listOrders(\n params?: Record<string, unknown>\n): Promise<PaginatedResponse<StoreOrder>> {\n return withAuthRefresh(async (options) => {\n return getClient().store.orders.list(params, options);\n });\n}\n\n/**\n * Get a single order by ID or number.\n */\nexport async function getOrder(\n idOrNumber: string,\n params?: Record<string, unknown>\n): Promise<StoreOrder> {\n return withAuthRefresh(async (options) => {\n return getClient().store.orders.get(idOrNumber, params, options);\n });\n}\n","'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type { StoreCreditCard } from '@spree/sdk';\nimport { withAuthRefresh } from '../auth-helpers';\nimport { getClient } from '../config';\n\n/**\n * List the authenticated customer's credit cards.\n */\nexport async function listCreditCards(): Promise<{ data: StoreCreditCard[] }> {\n return withAuthRefresh(async (options) => {\n return getClient().store.customer.creditCards.list(undefined, options);\n });\n}\n\n/**\n * Delete a credit card.\n */\nexport async function deleteCreditCard(id: string): Promise<void> {\n await withAuthRefresh(async (options) => {\n return getClient().store.customer.creditCards.delete(id, options);\n });\n revalidateTag('credit-cards');\n}\n","'use server';\n\nimport type { StoreGiftCard } from '@spree/sdk';\nimport { withAuthRefresh } from '../auth-helpers';\nimport { getClient } from '../config';\n\n/**\n * List the authenticated customer's gift cards.\n */\nexport async function listGiftCards(): Promise<{ data: StoreGiftCard[] }> {\n return withAuthRefresh(async (options) => {\n return getClient().store.customer.giftCards.list(undefined, options);\n });\n}\n\n/**\n * Get a single gift card by ID.\n */\nexport async function getGiftCard(id: string): Promise<StoreGiftCard> {\n return withAuthRefresh(async (options) => {\n return getClient().store.customer.giftCards.get(id, options);\n });\n}\n","'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type {\n StorePaymentSession,\n CreatePaymentSessionParams,\n UpdatePaymentSessionParams,\n CompletePaymentSessionParams,\n} from '@spree/sdk';\nimport { getClient } from '../config';\nimport { getCartToken, getAccessToken } from '../cookies';\n\nasync function getCheckoutOptions() {\n const orderToken = await getCartToken();\n const token = await getAccessToken();\n return { orderToken, token };\n}\n\n/**\n * Create a payment session for an order.\n * Delegates to the payment gateway to initialize a provider-specific session.\n */\nexport async function createPaymentSession(\n orderId: string,\n params: CreatePaymentSessionParams\n): Promise<StorePaymentSession> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.paymentSessions.create(orderId, params, options);\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Get a payment session by ID.\n */\nexport async function getPaymentSession(\n orderId: string,\n sessionId: string\n): Promise<StorePaymentSession> {\n const options = await getCheckoutOptions();\n return getClient().store.orders.paymentSessions.get(orderId, sessionId, options);\n}\n\n/**\n * Update a payment session.\n * Delegates to the payment gateway to sync changes with the provider.\n */\nexport async function updatePaymentSession(\n orderId: string,\n sessionId: string,\n params: UpdatePaymentSessionParams\n): Promise<StorePaymentSession> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.paymentSessions.update(orderId, sessionId, params, options);\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Complete a payment session.\n * Confirms the payment with the provider, triggering capture/authorization.\n */\nexport async function completePaymentSession(\n orderId: string,\n sessionId: string,\n params?: CompletePaymentSessionParams\n): Promise<StorePaymentSession> {\n const options = await getCheckoutOptions();\n const result = await getClient().store.orders.paymentSessions.complete(orderId, sessionId, params, options);\n revalidateTag('checkout');\n return result;\n}\n"]}
|