@spree/next 0.8.2 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -19
- package/dist/actions/addresses.js.map +1 -1
- package/dist/actions/auth.js +15 -6
- package/dist/actions/auth.js.map +1 -1
- package/dist/actions/cart.d.ts +37 -28
- package/dist/actions/cart.js +128 -31
- package/dist/actions/cart.js.map +1 -1
- package/dist/actions/credit-cards.js.map +1 -1
- package/dist/actions/gift-cards.js.map +1 -1
- package/dist/actions/orders.js.map +1 -1
- package/dist/actions/payment-sessions.d.ts +5 -5
- package/dist/actions/payment-sessions.js +33 -17
- package/dist/actions/payment-sessions.js.map +1 -1
- package/dist/actions/payment-setup-sessions.js.map +1 -1
- package/dist/index.d.ts +30 -62
- package/dist/index.js +128 -107
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/actions/checkout.d.ts +0 -44
- package/dist/actions/checkout.js +0 -146
- package/dist/actions/checkout.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -128,6 +128,9 @@ function getCartCookieName() {
|
|
|
128
128
|
return DEFAULT_CART_COOKIE;
|
|
129
129
|
}
|
|
130
130
|
}
|
|
131
|
+
function getCartIdCookieName() {
|
|
132
|
+
return `${getCartCookieName()}_id`;
|
|
133
|
+
}
|
|
131
134
|
function getAccessTokenCookieName() {
|
|
132
135
|
try {
|
|
133
136
|
return getConfig().accessTokenCookieName ?? DEFAULT_ACCESS_TOKEN_COOKIE;
|
|
@@ -156,6 +159,27 @@ async function clearCartToken() {
|
|
|
156
159
|
path: "/"
|
|
157
160
|
});
|
|
158
161
|
}
|
|
162
|
+
async function getCartId() {
|
|
163
|
+
const cookieStore = await cookies();
|
|
164
|
+
return cookieStore.get(getCartIdCookieName())?.value;
|
|
165
|
+
}
|
|
166
|
+
async function setCartId(id) {
|
|
167
|
+
const cookieStore = await cookies();
|
|
168
|
+
cookieStore.set(getCartIdCookieName(), id, {
|
|
169
|
+
httpOnly: true,
|
|
170
|
+
secure: process.env.NODE_ENV === "production",
|
|
171
|
+
sameSite: "lax",
|
|
172
|
+
path: "/",
|
|
173
|
+
maxAge: CART_TOKEN_MAX_AGE
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
async function clearCartId() {
|
|
177
|
+
const cookieStore = await cookies();
|
|
178
|
+
cookieStore.set(getCartIdCookieName(), "", {
|
|
179
|
+
maxAge: -1,
|
|
180
|
+
path: "/"
|
|
181
|
+
});
|
|
182
|
+
}
|
|
159
183
|
async function getAccessToken() {
|
|
160
184
|
const cookieStore = await cookies();
|
|
161
185
|
return cookieStore.get(getAccessTokenCookieName())?.value;
|
|
@@ -177,19 +201,41 @@ async function clearAccessToken() {
|
|
|
177
201
|
path: "/"
|
|
178
202
|
});
|
|
179
203
|
}
|
|
204
|
+
async function getCartOptions() {
|
|
205
|
+
const spreeToken = await getCartToken();
|
|
206
|
+
const token = await getAccessToken();
|
|
207
|
+
return { spreeToken, token };
|
|
208
|
+
}
|
|
209
|
+
async function requireCartId() {
|
|
210
|
+
const cartId = await getCartId();
|
|
211
|
+
if (!cartId) throw new Error("No cart found");
|
|
212
|
+
return cartId;
|
|
213
|
+
}
|
|
180
214
|
|
|
181
215
|
// src/actions/cart.ts
|
|
182
216
|
async function getCart() {
|
|
183
|
-
const
|
|
217
|
+
const spreeToken = await getCartToken();
|
|
184
218
|
const token = await getAccessToken();
|
|
185
|
-
|
|
219
|
+
const cartId = await getCartId();
|
|
220
|
+
if (!cartId && !token) return null;
|
|
186
221
|
try {
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
222
|
+
if (cartId) {
|
|
223
|
+
return await getClient().carts.get(cartId, { spreeToken, token });
|
|
224
|
+
}
|
|
225
|
+
if (token) {
|
|
226
|
+
const response = await getClient().carts.list({ token });
|
|
227
|
+
if (response.data.length > 0) {
|
|
228
|
+
const cart = response.data[0];
|
|
229
|
+
await setCartId(cart.id);
|
|
230
|
+
if (cart.token) await setCartToken(cart.token);
|
|
231
|
+
return cart;
|
|
232
|
+
}
|
|
191
233
|
}
|
|
192
234
|
return null;
|
|
235
|
+
} catch {
|
|
236
|
+
await clearCartToken();
|
|
237
|
+
await clearCartId();
|
|
238
|
+
return null;
|
|
193
239
|
}
|
|
194
240
|
}
|
|
195
241
|
async function getOrCreateCart(params) {
|
|
@@ -197,108 +243,83 @@ async function getOrCreateCart(params) {
|
|
|
197
243
|
if (existing) return existing;
|
|
198
244
|
const token = await getAccessToken();
|
|
199
245
|
const cartParams = params && Object.keys(params).length > 0 ? params : void 0;
|
|
200
|
-
const cart = await getClient().
|
|
246
|
+
const cart = await getClient().carts.create(cartParams, token ? { token } : void 0);
|
|
201
247
|
if (cart.token) {
|
|
202
248
|
await setCartToken(cart.token);
|
|
203
249
|
}
|
|
250
|
+
await setCartId(cart.id);
|
|
204
251
|
revalidateTag("cart");
|
|
205
252
|
return cart;
|
|
206
253
|
}
|
|
207
254
|
async function addItem(variantId, quantity = 1, metadata) {
|
|
208
255
|
const cart = await getOrCreateCart();
|
|
209
|
-
const
|
|
256
|
+
const spreeToken = await getCartToken();
|
|
210
257
|
const token = await getAccessToken();
|
|
211
|
-
const
|
|
258
|
+
const updatedCart = await getClient().carts.items.create(
|
|
212
259
|
cart.id,
|
|
213
260
|
{ variant_id: variantId, quantity, metadata },
|
|
214
|
-
{
|
|
261
|
+
{ spreeToken, token }
|
|
215
262
|
);
|
|
216
263
|
revalidateTag("cart");
|
|
217
|
-
return
|
|
264
|
+
return updatedCart;
|
|
218
265
|
}
|
|
219
266
|
async function updateItem(lineItemId, params) {
|
|
220
|
-
const
|
|
221
|
-
const
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
const order = await getClient().orders.lineItems.update(
|
|
225
|
-
cart.id,
|
|
267
|
+
const options = await getCartOptions();
|
|
268
|
+
const cartId = await requireCartId();
|
|
269
|
+
const cart = await getClient().carts.items.update(
|
|
270
|
+
cartId,
|
|
226
271
|
lineItemId,
|
|
227
272
|
params,
|
|
228
|
-
|
|
273
|
+
options
|
|
229
274
|
);
|
|
230
275
|
revalidateTag("cart");
|
|
231
|
-
return
|
|
276
|
+
return cart;
|
|
232
277
|
}
|
|
233
278
|
async function removeItem(lineItemId) {
|
|
234
|
-
const
|
|
235
|
-
const
|
|
236
|
-
|
|
237
|
-
const cart = await getClient().cart.get({ orderToken, token });
|
|
238
|
-
const order = await getClient().orders.lineItems.delete(cart.id, lineItemId, {
|
|
239
|
-
orderToken,
|
|
240
|
-
token
|
|
241
|
-
});
|
|
279
|
+
const options = await getCartOptions();
|
|
280
|
+
const cartId = await requireCartId();
|
|
281
|
+
const cart = await getClient().carts.items.delete(cartId, lineItemId, options);
|
|
242
282
|
revalidateTag("cart");
|
|
243
|
-
return
|
|
283
|
+
return cart;
|
|
244
284
|
}
|
|
245
285
|
async function clearCart() {
|
|
246
286
|
await clearCartToken();
|
|
287
|
+
await clearCartId();
|
|
247
288
|
revalidateTag("cart");
|
|
248
289
|
}
|
|
249
290
|
async function associateCart() {
|
|
250
|
-
const
|
|
291
|
+
const spreeToken = await getCartToken();
|
|
251
292
|
const token = await getAccessToken();
|
|
252
|
-
|
|
293
|
+
const cartId = await getCartId();
|
|
294
|
+
if (!cartId || !token) return null;
|
|
253
295
|
try {
|
|
254
|
-
const result = await getClient().
|
|
296
|
+
const result = await getClient().carts.associate(cartId, { spreeToken, token });
|
|
255
297
|
revalidateTag("cart");
|
|
256
298
|
return result;
|
|
257
299
|
} catch {
|
|
258
300
|
await clearCartToken();
|
|
301
|
+
await clearCartId();
|
|
259
302
|
revalidateTag("cart");
|
|
260
303
|
return null;
|
|
261
304
|
}
|
|
262
305
|
}
|
|
263
|
-
async function
|
|
264
|
-
const
|
|
265
|
-
const
|
|
266
|
-
|
|
267
|
-
}
|
|
268
|
-
async function getCheckout(orderId) {
|
|
269
|
-
const options = await getCheckoutOptions();
|
|
270
|
-
return getClient().orders.get(
|
|
271
|
-
orderId,
|
|
272
|
-
{ expand: ["line_items", "shipments", "ship_address", "bill_address"] },
|
|
273
|
-
options
|
|
274
|
-
);
|
|
275
|
-
}
|
|
276
|
-
async function updateOrder(orderId, params) {
|
|
277
|
-
const options = await getCheckoutOptions();
|
|
278
|
-
const result = await getClient().orders.update(orderId, params, options);
|
|
279
|
-
revalidateTag("checkout");
|
|
280
|
-
return result;
|
|
281
|
-
}
|
|
282
|
-
async function advance(orderId) {
|
|
283
|
-
const options = await getCheckoutOptions();
|
|
284
|
-
const result = await getClient().orders.advance(orderId, options);
|
|
306
|
+
async function updateCart(params) {
|
|
307
|
+
const options = await getCartOptions();
|
|
308
|
+
const cartId = await requireCartId();
|
|
309
|
+
const result = await getClient().carts.update(cartId, params, options);
|
|
285
310
|
revalidateTag("checkout");
|
|
286
311
|
return result;
|
|
287
312
|
}
|
|
288
|
-
async function
|
|
289
|
-
const options = await
|
|
290
|
-
const
|
|
291
|
-
|
|
292
|
-
return result;
|
|
313
|
+
async function getShipments() {
|
|
314
|
+
const options = await getCartOptions();
|
|
315
|
+
const cartId = await requireCartId();
|
|
316
|
+
return getClient().carts.shipments.list(cartId, options);
|
|
293
317
|
}
|
|
294
|
-
async function
|
|
295
|
-
const options = await
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
const options = await getCheckoutOptions();
|
|
300
|
-
const result = await getClient().orders.shipments.update(
|
|
301
|
-
orderId,
|
|
318
|
+
async function selectShippingRate(shipmentId, shippingRateId) {
|
|
319
|
+
const options = await getCartOptions();
|
|
320
|
+
const cartId = await requireCartId();
|
|
321
|
+
const result = await getClient().carts.shipments.update(
|
|
322
|
+
cartId,
|
|
302
323
|
shipmentId,
|
|
303
324
|
{ selected_shipping_rate_id: shippingRateId },
|
|
304
325
|
options
|
|
@@ -306,23 +327,26 @@ async function selectShippingRate(orderId, shipmentId, shippingRateId) {
|
|
|
306
327
|
revalidateTag("checkout");
|
|
307
328
|
return result;
|
|
308
329
|
}
|
|
309
|
-
async function applyCoupon(
|
|
310
|
-
const options = await
|
|
311
|
-
const
|
|
330
|
+
async function applyCoupon(code) {
|
|
331
|
+
const options = await getCartOptions();
|
|
332
|
+
const cartId = await requireCartId();
|
|
333
|
+
const result = await getClient().carts.couponCodes.apply(cartId, code, options);
|
|
312
334
|
revalidateTag("checkout");
|
|
313
335
|
revalidateTag("cart");
|
|
314
336
|
return result;
|
|
315
337
|
}
|
|
316
|
-
async function removeCoupon(
|
|
317
|
-
const options = await
|
|
318
|
-
const
|
|
338
|
+
async function removeCoupon(code) {
|
|
339
|
+
const options = await getCartOptions();
|
|
340
|
+
const cartId = await requireCartId();
|
|
341
|
+
const result = await getClient().carts.couponCodes.remove(cartId, code, options);
|
|
319
342
|
revalidateTag("checkout");
|
|
320
343
|
revalidateTag("cart");
|
|
321
344
|
return result;
|
|
322
345
|
}
|
|
323
|
-
async function complete(
|
|
324
|
-
const options = await
|
|
325
|
-
const
|
|
346
|
+
async function complete() {
|
|
347
|
+
const options = await getCartOptions();
|
|
348
|
+
const cartId = await requireCartId();
|
|
349
|
+
const result = await getClient().carts.complete(cartId, options);
|
|
326
350
|
revalidateTag("checkout");
|
|
327
351
|
revalidateTag("cart");
|
|
328
352
|
return result;
|
|
@@ -376,11 +400,12 @@ async function login(email, password) {
|
|
|
376
400
|
const result = await getClient().auth.login({ email, password });
|
|
377
401
|
await setAccessToken(result.token);
|
|
378
402
|
const cartToken = await getCartToken();
|
|
379
|
-
|
|
403
|
+
const cartId = await getCartId();
|
|
404
|
+
if (cartToken && cartId) {
|
|
380
405
|
try {
|
|
381
|
-
await getClient().
|
|
406
|
+
await getClient().carts.associate(cartId, {
|
|
382
407
|
token: result.token,
|
|
383
|
-
|
|
408
|
+
spreeToken: cartToken
|
|
384
409
|
});
|
|
385
410
|
} catch {
|
|
386
411
|
}
|
|
@@ -400,11 +425,12 @@ async function register(params) {
|
|
|
400
425
|
const result = await getClient().customers.create(params);
|
|
401
426
|
await setAccessToken(result.token);
|
|
402
427
|
const cartToken = await getCartToken();
|
|
403
|
-
|
|
428
|
+
const cartId = await getCartId();
|
|
429
|
+
if (cartToken && cartId) {
|
|
404
430
|
try {
|
|
405
|
-
await getClient().
|
|
431
|
+
await getClient().carts.associate(cartId, {
|
|
406
432
|
token: result.token,
|
|
407
|
-
|
|
433
|
+
spreeToken: cartToken
|
|
408
434
|
});
|
|
409
435
|
} catch {
|
|
410
436
|
}
|
|
@@ -527,41 +553,36 @@ async function getGiftCard(id) {
|
|
|
527
553
|
return getClient().customer.giftCards.get(id, options);
|
|
528
554
|
});
|
|
529
555
|
}
|
|
530
|
-
async function
|
|
531
|
-
const
|
|
532
|
-
const
|
|
533
|
-
|
|
534
|
-
}
|
|
535
|
-
async function createPayment(orderId, params) {
|
|
536
|
-
const options = await getCheckoutOptions2();
|
|
537
|
-
const result = await getClient().orders.payments.create(orderId, params, options);
|
|
556
|
+
async function createPayment(params) {
|
|
557
|
+
const options = await getCartOptions();
|
|
558
|
+
const cartId = await requireCartId();
|
|
559
|
+
const result = await getClient().carts.payments.create(cartId, params, options);
|
|
538
560
|
revalidateTag("checkout");
|
|
539
561
|
return result;
|
|
540
562
|
}
|
|
541
|
-
async function
|
|
542
|
-
const
|
|
543
|
-
const
|
|
544
|
-
|
|
545
|
-
}
|
|
546
|
-
async function createPaymentSession(orderId, params) {
|
|
547
|
-
const options = await getCheckoutOptions3();
|
|
548
|
-
const result = await getClient().orders.paymentSessions.create(orderId, params, options);
|
|
563
|
+
async function createPaymentSession(params) {
|
|
564
|
+
const options = await getCartOptions();
|
|
565
|
+
const cartId = await requireCartId();
|
|
566
|
+
const result = await getClient().carts.paymentSessions.create(cartId, params, options);
|
|
549
567
|
revalidateTag("checkout");
|
|
550
568
|
return result;
|
|
551
569
|
}
|
|
552
|
-
async function getPaymentSession(
|
|
553
|
-
const options = await
|
|
554
|
-
|
|
570
|
+
async function getPaymentSession(sessionId) {
|
|
571
|
+
const options = await getCartOptions();
|
|
572
|
+
const cartId = await requireCartId();
|
|
573
|
+
return getClient().carts.paymentSessions.get(cartId, sessionId, options);
|
|
555
574
|
}
|
|
556
|
-
async function updatePaymentSession(
|
|
557
|
-
const options = await
|
|
558
|
-
const
|
|
575
|
+
async function updatePaymentSession(sessionId, params) {
|
|
576
|
+
const options = await getCartOptions();
|
|
577
|
+
const cartId = await requireCartId();
|
|
578
|
+
const result = await getClient().carts.paymentSessions.update(cartId, sessionId, params, options);
|
|
559
579
|
revalidateTag("checkout");
|
|
560
580
|
return result;
|
|
561
581
|
}
|
|
562
|
-
async function completePaymentSession(
|
|
563
|
-
const options = await
|
|
564
|
-
const
|
|
582
|
+
async function completePaymentSession(sessionId, params) {
|
|
583
|
+
const options = await getCartOptions();
|
|
584
|
+
const cartId = await requireCartId();
|
|
585
|
+
const result = await getClient().carts.paymentSessions.complete(cartId, sessionId, params, options);
|
|
565
586
|
revalidateTag("checkout");
|
|
566
587
|
return result;
|
|
567
588
|
}
|
|
@@ -583,6 +604,6 @@ async function completePaymentSetupSession(id, params) {
|
|
|
583
604
|
});
|
|
584
605
|
}
|
|
585
606
|
|
|
586
|
-
export { addItem,
|
|
607
|
+
export { addItem, applyCoupon, associateCart, clearCart, complete, completePaymentSession, completePaymentSetupSession, createAddress, createPayment, createPaymentSession, createPaymentSetupSession, deleteAddress, deleteCreditCard, getAddress, getCart, getCategory, getClient, getCountry, getCustomer, getGiftCard, getMarket, getMarketCountry, getOrCreateCart, getOrder, getPaymentSession, getPaymentSetupSession, getProduct, getProductFilters, getShipments, initSpreeNext, listAddresses, listCategories, listCategoryProducts, listCountries, listCreditCards, listCurrencies, listGiftCards, listLocales, listMarketCountries, listMarkets, listOrders, listProducts, login, logout, register, removeCoupon, removeItem, resolveMarket, selectShippingRate, setLocale, updateAddress, updateCart, updateCustomer, updateItem, updatePaymentSession };
|
|
587
608
|
//# sourceMappingURL=index.js.map
|
|
588
609
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/locale.ts","../src/data/products.ts","../src/data/categories.ts","../src/data/countries.ts","../src/data/currencies.ts","../src/data/locales.ts","../src/data/markets.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/locale.ts","../src/actions/credit-cards.ts","../src/actions/gift-cards.ts","../src/actions/payments.ts","../src/actions/payment-sessions.ts","../src/actions/payment-setup-sessions.ts"],"names":["cookies","revalidateTag","getCheckoutOptions"],"mappings":"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","file":"index.js","sourcesContent":["import { createClient, type Client } from '@spree/sdk';\nimport type { SpreeNextConfig } from './types';\n\nlet _client: Client | 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 = createClient({\n baseUrl: config.baseUrl,\n publishableKey: config.publishableKey,\n });\n}\n\n/**\n * Get the Client instance. Auto-initializes from env vars if needed.\n * @internal\n */\nexport function getClient(): Client {\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_COUNTRY_COOKIE = 'spree_country';\nconst DEFAULT_LOCALE_COOKIE = 'spree_locale';\n\n/**\n * Read locale/currency/country from cookies (set by middleware).\n * Falls back to config defaults.\n * @internal\n */\nexport async function getLocaleOptions(): Promise<{\n locale?: string;\n currency?: string;\n country?: string;\n}> {\n const config = getConfig();\n const cookieStore = await cookies();\n\n const country = cookieStore.get(config.countryCookieName ?? DEFAULT_COUNTRY_COOKIE)?.value;\n const locale = cookieStore.get(config.localeCookieName ?? DEFAULT_LOCALE_COOKIE)?.value;\n\n return {\n locale: locale || config.defaultLocale,\n country: country || config.defaultCountry,\n // No currency — backend resolves from country via X-Spree-Country header\n };\n}\n","import type { Product, PaginatedResponse, ProductFiltersResponse, ProductListParams } from '@spree/sdk';\nimport { getClient } from '../config';\nimport { getLocaleOptions } from '../locale';\nimport type { SpreeNextOptions } from '../types';\n\n/**\n * List products with optional filtering, sorting, and pagination.\n * Locale/country are auto-read from cookies when not provided.\n */\nexport async function listProducts(\n params?: ProductListParams,\n options?: SpreeNextOptions\n): Promise<PaginatedResponse<Product>> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().products.list(params, resolved);\n}\n\n/**\n * Get a single product by slug or ID.\n * Locale/country are auto-read from cookies when not provided.\n */\nexport async function getProduct(\n slugOrId: string,\n params?: { expand?: string[] },\n options?: SpreeNextOptions\n): Promise<Product> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().products.get(slugOrId, params, resolved);\n}\n\n/**\n * Get available product filters (price ranges, option values, etc.).\n * Locale/country are auto-read from cookies when not provided.\n */\nexport async function getProductFilters(\n params?: Record<string, unknown>,\n options?: SpreeNextOptions\n): Promise<ProductFiltersResponse> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().products.filters(params, resolved);\n}\n","import type { Category, Product, PaginatedResponse, CategoryListParams, ProductListParams } from '@spree/sdk';\nimport { getClient } from '../config';\nimport { getLocaleOptions } from '../locale';\nimport type { SpreeNextOptions } from '../types';\n\n/**\n * List categories with optional filtering and pagination.\n * Locale/country are auto-read from cookies when not provided.\n */\nexport async function listCategories(\n params?: CategoryListParams,\n options?: SpreeNextOptions\n): Promise<PaginatedResponse<Category>> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().categories.list(params, resolved);\n}\n\n/**\n * Get a single category by ID or permalink.\n * Locale/country are auto-read from cookies when not provided.\n */\nexport async function getCategory(\n idOrPermalink: string,\n params?: Record<string, unknown>,\n options?: SpreeNextOptions\n): Promise<Category> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().categories.get(idOrPermalink, params, resolved);\n}\n\n/**\n * List products within a category.\n * Locale/country are auto-read from cookies when not provided.\n */\nexport async function listCategoryProducts(\n categoryId: string,\n params?: ProductListParams,\n options?: SpreeNextOptions\n): Promise<PaginatedResponse<Product>> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().categories.products.list(categoryId, params, resolved);\n}\n","import type { Country } from '@spree/sdk';\nimport { getClient } from '../config';\nimport { getLocaleOptions } from '../locale';\nimport type { SpreeNextOptions } from '../types';\n\n/**\n * List countries available in the store.\n * Use ?expand=market to expand market details (currency, locale, tax_inclusive).\n */\nexport async function listCountries(\n options?: SpreeNextOptions\n): Promise<{ data: Country[] }> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().countries.list(resolved);\n}\n\n/**\n * Get a country by ISO code.\n * @param iso - ISO 3166-1 alpha-2 code (e.g., \"US\", \"DE\")\n * @param params - Optional params (e.g., { expand: ['states'] } or { expand: ['market'] })\n */\nexport async function getCountry(\n iso: string,\n params?: { expand?: string[] },\n options?: SpreeNextOptions\n): Promise<Country> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().countries.get(iso, params, resolved);\n}\n","import type { Currency } from '@spree/sdk';\nimport { getClient } from '../config';\nimport { getLocaleOptions } from '../locale';\nimport type { SpreeNextOptions } from '../types';\n\n/**\n * List currencies supported by the store (derived from markets).\n * Locale/country are auto-read from cookies when not provided.\n */\nexport async function listCurrencies(\n options?: SpreeNextOptions\n): Promise<{ data: Currency[] }> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().currencies.list(resolved);\n}\n","import type { Locale } from '@spree/sdk';\nimport { getClient } from '../config';\nimport { getLocaleOptions } from '../locale';\nimport type { SpreeNextOptions } from '../types';\n\n/**\n * List locales supported by the store (derived from markets).\n * Locale/country are auto-read from cookies when not provided.\n */\nexport async function listLocales(\n options?: SpreeNextOptions\n): Promise<{ data: Locale[] }> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().locales.list(resolved);\n}\n","import type { Market, Country } from '@spree/sdk';\nimport { getClient } from '../config';\nimport { getLocaleOptions } from '../locale';\nimport type { SpreeNextOptions } from '../types';\n\n/**\n * List all markets for the current store.\n * Each market contains currency, locales, tax_inclusive flag, and countries.\n */\nexport async function listMarkets(\n options?: SpreeNextOptions\n): Promise<{ data: Market[] }> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().markets.list(resolved);\n}\n\n/**\n * Get a market by prefixed ID.\n * @param id - Market prefixed ID (e.g., \"mkt_k5nR8xLq\")\n */\nexport async function getMarket(\n id: string,\n options?: SpreeNextOptions\n): Promise<Market> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().markets.get(id, resolved);\n}\n\n/**\n * Resolve which market applies for a given country.\n * @param country - ISO 3166-1 alpha-2 code (e.g., \"DE\", \"US\")\n */\nexport async function resolveMarket(\n country: string,\n options?: SpreeNextOptions\n): Promise<Market> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().markets.resolve(country, resolved);\n}\n\n/**\n * List countries belonging to a market.\n * @param marketId - Market prefixed ID\n */\nexport async function listMarketCountries(\n marketId: string,\n options?: SpreeNextOptions\n): Promise<{ data: Country[] }> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().markets.countries.list(marketId, resolved);\n}\n\n/**\n * Get a country by ISO code within a market.\n * @param marketId - Market prefixed ID\n * @param iso - Country ISO code (e.g., \"DE\")\n */\nexport async function getMarketCountry(\n marketId: string,\n iso: string,\n params?: { expand?: string[] },\n options?: SpreeNextOptions\n): Promise<Country> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().markets.countries.get(marketId, iso, params, resolved);\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 { Order, CreateCartParams } 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<(Order & { 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().cart.get({ orderToken, token });\n } catch {\n // Cart not found (e.g., order was completed) — clear stale token\n if (orderToken) {\n await clearCartToken();\n }\n return null;\n }\n}\n\n/**\n * Get existing cart or create a new one.\n * @param params - Optional cart creation params (metadata, line_items)\n */\nexport async function getOrCreateCart(\n params?: CreateCartParams\n): Promise<Order & { token: string }> {\n const existing = await getCart();\n if (existing) return existing;\n\n const token = await getAccessToken();\n const cartParams = params && Object.keys(params).length > 0 ? params : undefined;\n const cart = await getClient().cart.create(cartParams, 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 metadata?: Record<string, unknown>\n): Promise<Order> {\n const cart = await getOrCreateCart();\n const orderToken = cart.token;\n const token = await getAccessToken();\n\n const order = await getClient().orders.lineItems.create(\n cart.id,\n { variant_id: variantId, quantity, metadata },\n { orderToken, token }\n );\n\n revalidateTag('cart');\n return order;\n}\n\n/**\n * Update a line item in the cart (quantity and/or metadata).\n * Returns the updated order with recalculated totals.\n *\n * @example\n * // Update quantity only\n * await updateItem(lineItemId, { quantity: 3 })\n *\n * // Update metadata only\n * await updateItem(lineItemId, { metadata: { gift_message: 'Happy Birthday!' } })\n *\n * // Update both\n * await updateItem(lineItemId, { quantity: 2, metadata: { engraving: 'J.D.' } })\n */\nexport async function updateItem(\n lineItemId: string,\n params: { quantity?: number; metadata?: Record<string, unknown> }\n): Promise<Order> {\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().cart.get({ orderToken, token });\n\n const order = await getClient().orders.lineItems.update(\n cart.id,\n lineItemId,\n params,\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<Order> {\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().cart.get({ orderToken, token });\n\n const order = await getClient().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<(Order & { 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().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 { Order, Shipment, UpdateOrderParams } 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<Order> {\n const options = await getCheckoutOptions();\n return getClient().orders.get(\n orderId,\n { expand: ['line_items', 'shipments', 'ship_address', 'bill_address'] },\n options\n );\n}\n\n/**\n * Update an order (addresses, email, currency, locale, metadata, etc.).\n */\nexport async function updateOrder(\n orderId: string,\n params: UpdateOrderParams\n): Promise<Order> {\n const options = await getCheckoutOptions();\n const result = await getClient().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<Order> {\n const options = await getCheckoutOptions();\n const result = await getClient().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<Order> {\n const options = await getCheckoutOptions();\n const result = await getClient().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: Shipment[] }> {\n const options = await getCheckoutOptions();\n return getClient().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<Order> {\n const options = await getCheckoutOptions();\n const result = await getClient().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<Order> {\n const options = await getCheckoutOptions();\n const result = await getClient().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<Order> {\n const options = await getCheckoutOptions();\n const result = await getClient().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<Order> {\n const options = await getCheckoutOptions();\n const result = await getClient().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().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().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 { Customer } 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().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().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 params: {\n email: string;\n password: string;\n password_confirmation: string;\n first_name?: string;\n last_name?: string;\n phone?: string;\n accepts_email_marketing?: boolean;\n metadata?: Record<string, unknown>;\n }\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().customers.create(params);\n await setAccessToken(result.token);\n\n // Associate guest cart\n const cartToken = await getCartToken();\n if (cartToken) {\n try {\n await getClient().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<Customer | null> {\n const token = await getAccessToken();\n if (!token) return null;\n\n try {\n return await withAuthRefresh(async (options) => {\n return getClient().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: {\n first_name?: string;\n last_name?: string;\n email?: string;\n password?: string;\n password_confirmation?: string;\n /** Required when changing email or password */\n current_password?: string;\n phone?: string;\n accepts_email_marketing?: boolean;\n metadata?: Record<string, unknown>;\n }\n): Promise<Customer> {\n const result = await withAuthRefresh(async (options) => {\n return getClient().customer.update(data, options);\n });\n revalidateTag('customer');\n return result;\n}\n","'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type { Address, 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: Address[] }> {\n return withAuthRefresh(async (options) => {\n return getClient().customer.addresses.list(undefined, options);\n });\n}\n\n/**\n * Get a single address by ID.\n */\nexport async function getAddress(id: string): Promise<Address> {\n return withAuthRefresh(async (options) => {\n return getClient().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<Address> {\n const result = await withAuthRefresh(async (options) => {\n return getClient().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<Address> {\n const result = await withAuthRefresh(async (options) => {\n return getClient().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().customer.addresses.delete(id, options);\n });\n revalidateTag('addresses');\n}\n","'use server';\n\nimport type { Order, PaginatedResponse, OrderListParams } 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?: OrderListParams\n): Promise<PaginatedResponse<Order>> {\n return withAuthRefresh(async (options) => {\n return getClient().customer.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<Order> {\n return withAuthRefresh(async (options) => {\n return getClient().orders.get(idOrNumber, params, options);\n });\n}\n","'use server';\n\nimport { cookies } from 'next/headers';\nimport { getConfig } from '../config';\n\n/**\n * Set locale/country cookies for subsequent requests.\n * Use this in country/language switchers instead of manipulating cookies directly.\n */\nexport async function setLocale(params: {\n country?: string;\n locale?: string;\n}): Promise<void> {\n const config = getConfig();\n const cookieStore = await cookies();\n const maxAge = 60 * 60 * 24 * 365; // 1 year\n\n if (params.country) {\n cookieStore.set(config.countryCookieName ?? 'spree_country', params.country, {\n path: '/',\n maxAge,\n });\n }\n if (params.locale) {\n cookieStore.set(config.localeCookieName ?? 'spree_locale', params.locale, {\n path: '/',\n maxAge,\n });\n }\n}\n","'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type { CreditCard } 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: CreditCard[] }> {\n return withAuthRefresh(async (options) => {\n return getClient().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().customer.creditCards.delete(id, options);\n });\n revalidateTag('credit-cards');\n}\n","'use server';\n\nimport type { GiftCard } 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: GiftCard[] }> {\n return withAuthRefresh(async (options) => {\n return getClient().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<GiftCard> {\n return withAuthRefresh(async (options) => {\n return getClient().customer.giftCards.get(id, options);\n });\n}\n","'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type { Payment, CreatePaymentParams } 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 for a non-session payment method (e.g. Check, Cash on Delivery, Bank Transfer).\n * For session-based payment methods (e.g. Stripe, PayPal), use createPaymentSession instead.\n */\nexport async function createPayment(\n orderId: string,\n params: CreatePaymentParams\n): Promise<Payment> {\n const options = await getCheckoutOptions();\n const result = await getClient().orders.payments.create(orderId, params, options);\n revalidateTag('checkout');\n return result;\n}\n","'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type {\n PaymentSession,\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<PaymentSession> {\n const options = await getCheckoutOptions();\n const result = await getClient().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<PaymentSession> {\n const options = await getCheckoutOptions();\n return getClient().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<PaymentSession> {\n const options = await getCheckoutOptions();\n const result = await getClient().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<PaymentSession> {\n const options = await getCheckoutOptions();\n const result = await getClient().orders.paymentSessions.complete(orderId, sessionId, params, options);\n revalidateTag('checkout');\n return result;\n}\n","'use server';\n\nimport type {\n PaymentSetupSession,\n CreatePaymentSetupSessionParams,\n CompletePaymentSetupSessionParams,\n} from '@spree/sdk';\nimport { withAuthRefresh } from '../auth-helpers';\nimport { getClient } from '../config';\n\n/**\n * Create a payment setup session for saving a payment method.\n * Delegates to the payment gateway to initialize a setup flow.\n */\nexport async function createPaymentSetupSession(\n params: CreatePaymentSetupSessionParams\n): Promise<PaymentSetupSession> {\n return withAuthRefresh(async (options) => {\n return getClient().customer.paymentSetupSessions.create(params, options);\n });\n}\n\n/**\n * Get a payment setup session by ID.\n */\nexport async function getPaymentSetupSession(\n id: string\n): Promise<PaymentSetupSession> {\n return withAuthRefresh(async (options) => {\n return getClient().customer.paymentSetupSessions.get(id, options);\n });\n}\n\n/**\n * Complete a payment setup session.\n * Confirms the setup with the provider, resulting in a saved payment method.\n */\nexport async function completePaymentSetupSession(\n id: string,\n params?: CompletePaymentSetupSessionParams\n): Promise<PaymentSetupSession> {\n return withAuthRefresh(async (options) => {\n return getClient().customer.paymentSetupSessions.complete(id, params, options);\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/locale.ts","../src/data/products.ts","../src/data/categories.ts","../src/data/countries.ts","../src/data/currencies.ts","../src/data/locales.ts","../src/data/markets.ts","../src/cookies.ts","../src/actions/cart.ts","../src/auth-helpers.ts","../src/actions/auth.ts","../src/actions/addresses.ts","../src/actions/orders.ts","../src/actions/locale.ts","../src/actions/credit-cards.ts","../src/actions/gift-cards.ts","../src/actions/payments.ts","../src/actions/payment-sessions.ts","../src/actions/payment-setup-sessions.ts"],"names":["cookies","revalidateTag"],"mappings":"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","file":"index.js","sourcesContent":["import { createClient, type Client } from '@spree/sdk';\nimport type { SpreeNextConfig } from './types';\n\nlet _client: Client | 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 = createClient({\n baseUrl: config.baseUrl,\n publishableKey: config.publishableKey,\n });\n}\n\n/**\n * Get the Client instance. Auto-initializes from env vars if needed.\n * @internal\n */\nexport function getClient(): Client {\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_COUNTRY_COOKIE = 'spree_country';\nconst DEFAULT_LOCALE_COOKIE = 'spree_locale';\n\n/**\n * Read locale/currency/country from cookies (set by middleware).\n * Falls back to config defaults.\n * @internal\n */\nexport async function getLocaleOptions(): Promise<{\n locale?: string;\n currency?: string;\n country?: string;\n}> {\n const config = getConfig();\n const cookieStore = await cookies();\n\n const country = cookieStore.get(config.countryCookieName ?? DEFAULT_COUNTRY_COOKIE)?.value;\n const locale = cookieStore.get(config.localeCookieName ?? DEFAULT_LOCALE_COOKIE)?.value;\n\n return {\n locale: locale || config.defaultLocale,\n country: country || config.defaultCountry,\n // No currency — backend resolves from country via X-Spree-Country header\n };\n}\n","import type { Product, PaginatedResponse, ProductFiltersResponse, ProductListParams } from '@spree/sdk';\nimport { getClient } from '../config';\nimport { getLocaleOptions } from '../locale';\nimport type { SpreeNextOptions } from '../types';\n\n/**\n * List products with optional filtering, sorting, and pagination.\n * Locale/country are auto-read from cookies when not provided.\n */\nexport async function listProducts(\n params?: ProductListParams,\n options?: SpreeNextOptions\n): Promise<PaginatedResponse<Product>> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().products.list(params, resolved);\n}\n\n/**\n * Get a single product by slug or ID.\n * Locale/country are auto-read from cookies when not provided.\n */\nexport async function getProduct(\n slugOrId: string,\n params?: { expand?: string[] },\n options?: SpreeNextOptions\n): Promise<Product> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().products.get(slugOrId, params, resolved);\n}\n\n/**\n * Get available product filters (price ranges, option values, etc.).\n * Locale/country are auto-read from cookies when not provided.\n */\nexport async function getProductFilters(\n params?: Record<string, unknown>,\n options?: SpreeNextOptions\n): Promise<ProductFiltersResponse> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().products.filters(params, resolved);\n}\n","import type { Category, Product, PaginatedResponse, CategoryListParams, ProductListParams } from '@spree/sdk';\nimport { getClient } from '../config';\nimport { getLocaleOptions } from '../locale';\nimport type { SpreeNextOptions } from '../types';\n\n/**\n * List categories with optional filtering and pagination.\n * Locale/country are auto-read from cookies when not provided.\n */\nexport async function listCategories(\n params?: CategoryListParams,\n options?: SpreeNextOptions\n): Promise<PaginatedResponse<Category>> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().categories.list(params, resolved);\n}\n\n/**\n * Get a single category by ID or permalink.\n * Locale/country are auto-read from cookies when not provided.\n */\nexport async function getCategory(\n idOrPermalink: string,\n params?: Record<string, unknown>,\n options?: SpreeNextOptions\n): Promise<Category> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().categories.get(idOrPermalink, params, resolved);\n}\n\n/**\n * List products within a category.\n * Locale/country are auto-read from cookies when not provided.\n */\nexport async function listCategoryProducts(\n categoryId: string,\n params?: ProductListParams,\n options?: SpreeNextOptions\n): Promise<PaginatedResponse<Product>> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().categories.products.list(categoryId, params, resolved);\n}\n","import type { Country } from '@spree/sdk';\nimport { getClient } from '../config';\nimport { getLocaleOptions } from '../locale';\nimport type { SpreeNextOptions } from '../types';\n\n/**\n * List countries available in the store.\n * Use ?expand=market to expand market details (currency, locale, tax_inclusive).\n */\nexport async function listCountries(\n options?: SpreeNextOptions\n): Promise<{ data: Country[] }> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().countries.list(resolved);\n}\n\n/**\n * Get a country by ISO code.\n * @param iso - ISO 3166-1 alpha-2 code (e.g., \"US\", \"DE\")\n * @param params - Optional params (e.g., { expand: ['states'] } or { expand: ['market'] })\n */\nexport async function getCountry(\n iso: string,\n params?: { expand?: string[] },\n options?: SpreeNextOptions\n): Promise<Country> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().countries.get(iso, params, resolved);\n}\n","import type { Currency } from '@spree/sdk';\nimport { getClient } from '../config';\nimport { getLocaleOptions } from '../locale';\nimport type { SpreeNextOptions } from '../types';\n\n/**\n * List currencies supported by the store (derived from markets).\n * Locale/country are auto-read from cookies when not provided.\n */\nexport async function listCurrencies(\n options?: SpreeNextOptions\n): Promise<{ data: Currency[] }> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().currencies.list(resolved);\n}\n","import type { Locale } from '@spree/sdk';\nimport { getClient } from '../config';\nimport { getLocaleOptions } from '../locale';\nimport type { SpreeNextOptions } from '../types';\n\n/**\n * List locales supported by the store (derived from markets).\n * Locale/country are auto-read from cookies when not provided.\n */\nexport async function listLocales(\n options?: SpreeNextOptions\n): Promise<{ data: Locale[] }> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().locales.list(resolved);\n}\n","import type { Market, Country } from '@spree/sdk';\nimport { getClient } from '../config';\nimport { getLocaleOptions } from '../locale';\nimport type { SpreeNextOptions } from '../types';\n\n/**\n * List all markets for the current store.\n * Each market contains currency, locales, tax_inclusive flag, and countries.\n */\nexport async function listMarkets(\n options?: SpreeNextOptions\n): Promise<{ data: Market[] }> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().markets.list(resolved);\n}\n\n/**\n * Get a market by prefixed ID.\n * @param id - Market prefixed ID (e.g., \"mkt_k5nR8xLq\")\n */\nexport async function getMarket(\n id: string,\n options?: SpreeNextOptions\n): Promise<Market> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().markets.get(id, resolved);\n}\n\n/**\n * Resolve which market applies for a given country.\n * @param country - ISO 3166-1 alpha-2 code (e.g., \"DE\", \"US\")\n */\nexport async function resolveMarket(\n country: string,\n options?: SpreeNextOptions\n): Promise<Market> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().markets.resolve(country, resolved);\n}\n\n/**\n * List countries belonging to a market.\n * @param marketId - Market prefixed ID\n */\nexport async function listMarketCountries(\n marketId: string,\n options?: SpreeNextOptions\n): Promise<{ data: Country[] }> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().markets.countries.list(marketId, resolved);\n}\n\n/**\n * Get a country by ISO code within a market.\n * @param marketId - Market prefixed ID\n * @param iso - Country ISO code (e.g., \"DE\")\n */\nexport async function getMarketCountry(\n marketId: string,\n iso: string,\n params?: { expand?: string[] },\n options?: SpreeNextOptions\n): Promise<Country> {\n const resolved = options ?? await getLocaleOptions();\n return getClient().markets.countries.get(marketId, iso, params, resolved);\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 getCartIdCookieName(): string {\n return `${getCartCookieName()}_id`;\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// --- Cart ID (prefixed ID stored alongside token for REST API) ---\n\nexport async function getCartId(): Promise<string | undefined> {\n const cookieStore = await cookies();\n return cookieStore.get(getCartIdCookieName())?.value;\n}\n\nexport async function setCartId(id: string): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getCartIdCookieName(), id, {\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 clearCartId(): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getCartIdCookieName(), '', {\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\n// --- Cart Options (combined cart + access tokens for cart/checkout/payment actions) ---\n\nexport async function getCartOptions(): Promise<{\n spreeToken: string | undefined;\n token: string | undefined;\n}> {\n const spreeToken = await getCartToken();\n const token = await getAccessToken();\n return { spreeToken, token };\n}\n\n// --- Cart ID (required) ---\n\nexport async function requireCartId(): Promise<string> {\n const cartId = await getCartId();\n if (!cartId) throw new Error('No cart found');\n return cartId;\n}\n","'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type { Cart, Order, Shipment, CreateCartParams, UpdateCartParams, ListResponse } from '@spree/sdk';\nimport { getClient } from '../config';\nimport {\n getCartToken, setCartToken, clearCartToken,\n getCartId, setCartId, clearCartId,\n getAccessToken,\n getCartOptions, requireCartId,\n} from '../cookies';\n\n/**\n * Get the current cart. Returns null if no cart exists.\n */\nexport async function getCart(): Promise<Cart | null> {\n const spreeToken = await getCartToken();\n const token = await getAccessToken();\n const cartId = await getCartId();\n\n if (!cartId && !token) return null;\n\n try {\n if (cartId) {\n return await getClient().carts.get(cartId, { spreeToken, token });\n }\n\n // Authenticated user without stored cart ID — find their most recent cart\n if (token) {\n const response = await getClient().carts.list({ token });\n if (response.data.length > 0) {\n const cart = response.data[0];\n await setCartId(cart.id);\n if (cart.token) await setCartToken(cart.token);\n return cart;\n }\n }\n\n return null;\n } catch {\n // Cart not found (e.g., order was completed) — clear stale cookies\n await clearCartToken();\n await clearCartId();\n return null;\n }\n}\n\n/**\n * Get existing cart or create a new one.\n * @param params - Optional cart creation params (metadata, items)\n */\nexport async function getOrCreateCart(\n params?: CreateCartParams\n): Promise<Cart> {\n const existing = await getCart();\n if (existing) return existing;\n\n const token = await getAccessToken();\n const cartParams = params && Object.keys(params).length > 0 ? params : undefined;\n const cart = await getClient().carts.create(cartParams, token ? { token } : undefined);\n\n if (cart.token) {\n await setCartToken(cart.token);\n }\n await setCartId(cart.id);\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 cart with recalculated totals.\n */\nexport async function addItem(\n variantId: string,\n quantity: number = 1,\n metadata?: Record<string, unknown>\n): Promise<Cart> {\n const cart = await getOrCreateCart();\n const spreeToken = await getCartToken();\n const token = await getAccessToken();\n\n const updatedCart = await getClient().carts.items.create(\n cart.id,\n { variant_id: variantId, quantity, metadata },\n { spreeToken, token }\n );\n\n revalidateTag('cart');\n return updatedCart;\n}\n\n/**\n * Update a line item in the cart (quantity and/or metadata).\n * Returns the updated cart with recalculated totals.\n */\nexport async function updateItem(\n lineItemId: string,\n params: { quantity?: number; metadata?: Record<string, unknown> }\n): Promise<Cart> {\n const options = await getCartOptions();\n const cartId = await requireCartId();\n\n const cart = await getClient().carts.items.update(\n cartId,\n lineItemId,\n params,\n options\n );\n\n revalidateTag('cart');\n return cart;\n}\n\n/**\n * Remove a line item from the cart.\n * Returns the updated cart with recalculated totals.\n */\nexport async function removeItem(lineItemId: string): Promise<Cart> {\n const options = await getCartOptions();\n const cartId = await requireCartId();\n\n const cart = await getClient().carts.items.delete(cartId, lineItemId, options);\n\n revalidateTag('cart');\n return cart;\n}\n\n/**\n * Clear the cart (abandons the current cart).\n */\nexport async function clearCart(): Promise<void> {\n await clearCartToken();\n await clearCartId();\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<Cart | null> {\n const spreeToken = await getCartToken();\n const token = await getAccessToken();\n const cartId = await getCartId();\n if (!cartId || !token) return null;\n\n try {\n const result = await getClient().carts.associate(cartId, { spreeToken, token });\n revalidateTag('cart');\n return result;\n } catch {\n // Cart might already belong to another user — clear it\n await clearCartToken();\n await clearCartId();\n revalidateTag('cart');\n return null;\n }\n}\n\n/**\n * Update cart info (email, addresses, special instructions).\n */\nexport async function updateCart(\n params: UpdateCartParams\n): Promise<Cart> {\n const options = await getCartOptions();\n const cartId = await requireCartId();\n const result = await getClient().carts.update(cartId, params, options);\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Get shipments with shipping rates for the current cart.\n */\nexport async function getShipments(): Promise<ListResponse<Shipment>> {\n const options = await getCartOptions();\n const cartId = await requireCartId();\n return getClient().carts.shipments.list(cartId, options);\n}\n\n/**\n * Select a shipping rate for a shipment.\n * Returns the updated cart with recalculated totals.\n */\nexport async function selectShippingRate(\n shipmentId: string,\n shippingRateId: string\n): Promise<Cart> {\n const options = await getCartOptions();\n const cartId = await requireCartId();\n const result = await getClient().carts.shipments.update(\n cartId,\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 cart.\n */\nexport async function applyCoupon(\n code: string\n): Promise<Cart> {\n const options = await getCartOptions();\n const cartId = await requireCartId();\n const result = await getClient().carts.couponCodes.apply(cartId, code, options);\n revalidateTag('checkout');\n revalidateTag('cart');\n return result;\n}\n\n/**\n * Remove a coupon code from the cart.\n */\nexport async function removeCoupon(\n code: string\n): Promise<Cart> {\n const options = await getCartOptions();\n const cartId = await requireCartId();\n const result = await getClient().carts.couponCodes.remove(cartId, code, 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(): Promise<Order> {\n const options = await getCartOptions();\n const cartId = await requireCartId();\n const result = await getClient().carts.complete(cartId, 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().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().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 { Customer } from '@spree/sdk';\nimport { getClient } from '../config';\nimport { setAccessToken, clearAccessToken, getAccessToken, getCartToken, getCartId } 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().auth.login({ email, password });\n await setAccessToken(result.token);\n\n // Associate guest cart if one exists\n const cartToken = await getCartToken();\n const cartId = await getCartId();\n if (cartToken && cartId) {\n try {\n await getClient().carts.associate(cartId, {\n token: result.token,\n spreeToken: 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 params: {\n email: string;\n password: string;\n password_confirmation: string;\n first_name?: string;\n last_name?: string;\n phone?: string;\n accepts_email_marketing?: boolean;\n metadata?: Record<string, unknown>;\n }\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().customers.create(params);\n await setAccessToken(result.token);\n\n // Associate guest cart\n const cartToken = await getCartToken();\n const cartId = await getCartId();\n if (cartToken && cartId) {\n try {\n await getClient().carts.associate(cartId, {\n token: result.token,\n spreeToken: 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<Customer | null> {\n const token = await getAccessToken();\n if (!token) return null;\n\n try {\n return await withAuthRefresh(async (options) => {\n return getClient().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: {\n first_name?: string;\n last_name?: string;\n email?: string;\n password?: string;\n password_confirmation?: string;\n /** Required when changing email or password */\n current_password?: string;\n phone?: string;\n accepts_email_marketing?: boolean;\n metadata?: Record<string, unknown>;\n }\n): Promise<Customer> {\n const result = await withAuthRefresh(async (options) => {\n return getClient().customer.update(data, options);\n });\n revalidateTag('customer');\n return result;\n}\n","'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type { Address, 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: Address[] }> {\n return withAuthRefresh(async (options) => {\n return getClient().customer.addresses.list(undefined, options);\n });\n}\n\n/**\n * Get a single address by ID.\n */\nexport async function getAddress(id: string): Promise<Address> {\n return withAuthRefresh(async (options) => {\n return getClient().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<Address> {\n const result = await withAuthRefresh(async (options) => {\n return getClient().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<Address> {\n const result = await withAuthRefresh(async (options) => {\n return getClient().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().customer.addresses.delete(id, options);\n });\n revalidateTag('addresses');\n}\n","'use server';\n\nimport type { Order, PaginatedResponse, OrderListParams } 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?: OrderListParams\n): Promise<PaginatedResponse<Order>> {\n return withAuthRefresh(async (options) => {\n return getClient().customer.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<Order> {\n return withAuthRefresh(async (options) => {\n return getClient().orders.get(idOrNumber, params, options);\n });\n}\n","'use server';\n\nimport { cookies } from 'next/headers';\nimport { getConfig } from '../config';\n\n/**\n * Set locale/country cookies for subsequent requests.\n * Use this in country/language switchers instead of manipulating cookies directly.\n */\nexport async function setLocale(params: {\n country?: string;\n locale?: string;\n}): Promise<void> {\n const config = getConfig();\n const cookieStore = await cookies();\n const maxAge = 60 * 60 * 24 * 365; // 1 year\n\n if (params.country) {\n cookieStore.set(config.countryCookieName ?? 'spree_country', params.country, {\n path: '/',\n maxAge,\n });\n }\n if (params.locale) {\n cookieStore.set(config.localeCookieName ?? 'spree_locale', params.locale, {\n path: '/',\n maxAge,\n });\n }\n}\n","'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type { CreditCard } 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: CreditCard[] }> {\n return withAuthRefresh(async (options) => {\n return getClient().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().customer.creditCards.delete(id, options);\n });\n revalidateTag('credit-cards');\n}\n","'use server';\n\nimport type { GiftCard } 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: GiftCard[] }> {\n return withAuthRefresh(async (options) => {\n return getClient().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<GiftCard> {\n return withAuthRefresh(async (options) => {\n return getClient().customer.giftCards.get(id, options);\n });\n}\n","'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type { Payment, CreatePaymentParams } from '@spree/sdk';\nimport { getClient } from '../config';\nimport { getCartOptions, requireCartId } from '../cookies';\n\n/**\n * Create a payment for a non-session payment method (e.g. Check, Cash on Delivery, Bank Transfer).\n * For session-based payment methods (e.g. Stripe, PayPal), use createPaymentSession instead.\n */\nexport async function createPayment(\n params: CreatePaymentParams\n): Promise<Payment> {\n const options = await getCartOptions();\n const cartId = await requireCartId();\n const result = await getClient().carts.payments.create(cartId, params, options);\n revalidateTag('checkout');\n return result;\n}\n","'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type {\n PaymentSession,\n CreatePaymentSessionParams,\n UpdatePaymentSessionParams,\n CompletePaymentSessionParams,\n} from '@spree/sdk';\nimport { getClient } from '../config';\nimport { getCartOptions, requireCartId } from '../cookies';\n\n/**\n * Create a payment session for the current cart.\n * Delegates to the payment gateway to initialize a provider-specific session.\n */\nexport async function createPaymentSession(\n params: CreatePaymentSessionParams\n): Promise<PaymentSession> {\n const options = await getCartOptions();\n const cartId = await requireCartId();\n const result = await getClient().carts.paymentSessions.create(cartId, params, options);\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Get a payment session by ID.\n */\nexport async function getPaymentSession(\n sessionId: string\n): Promise<PaymentSession> {\n const options = await getCartOptions();\n const cartId = await requireCartId();\n return getClient().carts.paymentSessions.get(cartId, 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 sessionId: string,\n params: UpdatePaymentSessionParams\n): Promise<PaymentSession> {\n const options = await getCartOptions();\n const cartId = await requireCartId();\n const result = await getClient().carts.paymentSessions.update(cartId, 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 sessionId: string,\n params?: CompletePaymentSessionParams\n): Promise<PaymentSession> {\n const options = await getCartOptions();\n const cartId = await requireCartId();\n const result = await getClient().carts.paymentSessions.complete(cartId, sessionId, params, options);\n revalidateTag('checkout');\n return result;\n}\n","'use server';\n\nimport type {\n PaymentSetupSession,\n CreatePaymentSetupSessionParams,\n CompletePaymentSetupSessionParams,\n} from '@spree/sdk';\nimport { withAuthRefresh } from '../auth-helpers';\nimport { getClient } from '../config';\n\n/**\n * Create a payment setup session for saving a payment method.\n * Delegates to the payment gateway to initialize a setup flow.\n */\nexport async function createPaymentSetupSession(\n params: CreatePaymentSetupSessionParams\n): Promise<PaymentSetupSession> {\n return withAuthRefresh(async (options) => {\n return getClient().customer.paymentSetupSessions.create(params, options);\n });\n}\n\n/**\n * Get a payment setup session by ID.\n */\nexport async function getPaymentSetupSession(\n id: string\n): Promise<PaymentSetupSession> {\n return withAuthRefresh(async (options) => {\n return getClient().customer.paymentSetupSessions.get(id, options);\n });\n}\n\n/**\n * Complete a payment setup session.\n * Confirms the setup with the provider, resulting in a saved payment method.\n */\nexport async function completePaymentSetupSession(\n id: string,\n params?: CompletePaymentSetupSessionParams\n): Promise<PaymentSetupSession> {\n return withAuthRefresh(async (options) => {\n return getClient().customer.paymentSetupSessions.complete(id, params, options);\n });\n}\n"]}
|