@spree/next 0.10.1 → 0.10.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -2,9 +2,24 @@ import { createClient, SpreeError } from '@spree/sdk';
2
2
  import { cookies } from 'next/headers';
3
3
  import { revalidateTag } from 'next/cache';
4
4
 
5
+ var __defProp = Object.defineProperty;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __esm = (fn, res) => function __init() {
8
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
9
+ };
10
+ var __export = (target, all) => {
11
+ for (var name in all)
12
+ __defProp(target, name, { get: all[name], enumerable: true });
13
+ };
14
+
5
15
  // src/config.ts
6
- var _client = null;
7
- var _config = null;
16
+ var config_exports = {};
17
+ __export(config_exports, {
18
+ getClient: () => getClient,
19
+ getConfig: () => getConfig,
20
+ initSpreeNext: () => initSpreeNext,
21
+ resetClient: () => resetClient
22
+ });
8
23
  function initSpreeNext(config) {
9
24
  _config = config;
10
25
  _client = createClient({
@@ -32,6 +47,26 @@ function getConfig() {
32
47
  }
33
48
  return _config;
34
49
  }
50
+ function resetClient() {
51
+ _client = null;
52
+ _config = null;
53
+ }
54
+ var _client, _config;
55
+ var init_config = __esm({
56
+ "src/config.ts"() {
57
+ _client = null;
58
+ _config = null;
59
+ }
60
+ });
61
+
62
+ // src/index.ts
63
+ init_config();
64
+
65
+ // src/data/products.ts
66
+ init_config();
67
+
68
+ // src/locale.ts
69
+ init_config();
35
70
  var DEFAULT_COUNTRY_COOKIE = "spree_country";
36
71
  var DEFAULT_LOCALE_COOKIE = "spree_locale";
37
72
  async function getLocaleOptions() {
@@ -61,6 +96,7 @@ async function getProductFilters(params, options) {
61
96
  }
62
97
 
63
98
  // src/data/categories.ts
99
+ init_config();
64
100
  async function listCategories(params, options) {
65
101
  const resolved = options ?? await getLocaleOptions();
66
102
  return getClient().categories.list(params, resolved);
@@ -75,6 +111,7 @@ async function listCategoryProducts(categoryId, params, options) {
75
111
  }
76
112
 
77
113
  // src/data/countries.ts
114
+ init_config();
78
115
  async function listCountries(options) {
79
116
  const resolved = options ?? await getLocaleOptions();
80
117
  return getClient().countries.list(resolved);
@@ -85,18 +122,21 @@ async function getCountry(iso, params, options) {
85
122
  }
86
123
 
87
124
  // src/data/currencies.ts
125
+ init_config();
88
126
  async function listCurrencies(options) {
89
127
  const resolved = options ?? await getLocaleOptions();
90
128
  return getClient().currencies.list(resolved);
91
129
  }
92
130
 
93
131
  // src/data/locales.ts
132
+ init_config();
94
133
  async function listLocales(options) {
95
134
  const resolved = options ?? await getLocaleOptions();
96
135
  return getClient().locales.list(resolved);
97
136
  }
98
137
 
99
138
  // src/data/markets.ts
139
+ init_config();
100
140
  async function listMarkets(options) {
101
141
  const resolved = options ?? await getLocaleOptions();
102
142
  return getClient().markets.list(resolved);
@@ -117,6 +157,12 @@ async function getMarketCountry(marketId, iso, params, options) {
117
157
  const resolved = options ?? await getLocaleOptions();
118
158
  return getClient().markets.countries.get(marketId, iso, params, resolved);
119
159
  }
160
+
161
+ // src/actions/cart.ts
162
+ init_config();
163
+
164
+ // src/cookies.ts
165
+ init_config();
120
166
  var DEFAULT_CART_COOKIE = "_spree_cart_token";
121
167
  var DEFAULT_ACCESS_TOKEN_COOKIE = "_spree_jwt";
122
168
  var CART_TOKEN_MAX_AGE = 60 * 60 * 24 * 30;
@@ -142,43 +188,29 @@ async function getCartToken() {
142
188
  const cookieStore = await cookies();
143
189
  return cookieStore.get(getCartCookieName())?.value;
144
190
  }
145
- async function setCartToken(token) {
146
- const cookieStore = await cookies();
147
- cookieStore.set(getCartCookieName(), token, {
148
- httpOnly: true,
149
- secure: process.env.NODE_ENV === "production",
150
- sameSite: "lax",
151
- path: "/",
152
- maxAge: CART_TOKEN_MAX_AGE
153
- });
154
- }
155
- async function clearCartToken() {
156
- const cookieStore = await cookies();
157
- cookieStore.set(getCartCookieName(), "", {
158
- maxAge: -1,
159
- path: "/"
160
- });
161
- }
162
191
  async function getCartId() {
163
192
  const cookieStore = await cookies();
164
193
  return cookieStore.get(getCartIdCookieName())?.value;
165
194
  }
166
- async function setCartId(id) {
195
+ async function setCartCookies(id, token) {
167
196
  const cookieStore = await cookies();
168
- cookieStore.set(getCartIdCookieName(), id, {
197
+ const opts = {
169
198
  httpOnly: true,
170
199
  secure: process.env.NODE_ENV === "production",
171
200
  sameSite: "lax",
172
201
  path: "/",
173
202
  maxAge: CART_TOKEN_MAX_AGE
174
- });
203
+ };
204
+ cookieStore.set(getCartIdCookieName(), id, opts);
205
+ if (token) {
206
+ cookieStore.set(getCartCookieName(), token, opts);
207
+ }
175
208
  }
176
- async function clearCartId() {
209
+ async function clearCartCookies() {
177
210
  const cookieStore = await cookies();
178
- cookieStore.set(getCartIdCookieName(), "", {
179
- maxAge: -1,
180
- path: "/"
181
- });
211
+ const opts = { maxAge: -1, path: "/" };
212
+ cookieStore.set(getCartCookieName(), "", opts);
213
+ cookieStore.set(getCartIdCookieName(), "", opts);
182
214
  }
183
215
  async function getAccessToken() {
184
216
  const cookieStore = await cookies();
@@ -208,8 +240,18 @@ async function getCartOptions() {
208
240
  }
209
241
  async function requireCartId() {
210
242
  const cartId = await getCartId();
211
- if (!cartId) throw new Error("No cart found");
212
- return cartId;
243
+ if (cartId) return cartId;
244
+ const token = await getAccessToken();
245
+ if (token) {
246
+ const { getClient: getClient2 } = await Promise.resolve().then(() => (init_config(), config_exports));
247
+ const response = await getClient2().carts.list({ token });
248
+ if (response.data.length > 0) {
249
+ const cart = response.data[0];
250
+ await setCartCookies(cart.id, cart.token);
251
+ return cart.id;
252
+ }
253
+ }
254
+ throw new Error("No cart found");
213
255
  }
214
256
 
215
257
  // src/actions/cart.ts
@@ -226,15 +268,13 @@ async function getCart() {
226
268
  const response = await getClient().carts.list({ token });
227
269
  if (response.data.length > 0) {
228
270
  const cart = response.data[0];
229
- await setCartId(cart.id);
230
- if (cart.token) await setCartToken(cart.token);
271
+ await setCartCookies(cart.id, cart.token);
231
272
  return cart;
232
273
  }
233
274
  }
234
275
  return null;
235
276
  } catch {
236
- await clearCartToken();
237
- await clearCartId();
277
+ await clearCartCookies();
238
278
  return null;
239
279
  }
240
280
  }
@@ -244,10 +284,7 @@ async function getOrCreateCart(params) {
244
284
  const token = await getAccessToken();
245
285
  const cartParams = params && Object.keys(params).length > 0 ? params : void 0;
246
286
  const cart = await getClient().carts.create(cartParams, token ? { token } : void 0);
247
- if (cart.token) {
248
- await setCartToken(cart.token);
249
- }
250
- await setCartId(cart.id);
287
+ await setCartCookies(cart.id, cart.token);
251
288
  revalidateTag("cart");
252
289
  return cart;
253
290
  }
@@ -283,8 +320,7 @@ async function removeItem(lineItemId) {
283
320
  return cart;
284
321
  }
285
322
  async function clearCart() {
286
- await clearCartToken();
287
- await clearCartId();
323
+ await clearCartCookies();
288
324
  revalidateTag("cart");
289
325
  }
290
326
  async function associateCart() {
@@ -297,8 +333,7 @@ async function associateCart() {
297
333
  revalidateTag("cart");
298
334
  return result;
299
335
  } catch {
300
- await clearCartToken();
301
- await clearCartId();
336
+ await clearCartCookies();
302
337
  revalidateTag("cart");
303
338
  return null;
304
339
  }
@@ -343,14 +378,20 @@ async function removeCoupon(code) {
343
378
  revalidateTag("cart");
344
379
  return result;
345
380
  }
346
- async function complete() {
381
+ async function complete(explicitCartId) {
347
382
  const options = await getCartOptions();
348
- const cartId = await requireCartId();
383
+ const cartId = explicitCartId ?? await requireCartId();
349
384
  const result = await getClient().carts.complete(cartId, options);
350
385
  revalidateTag("checkout");
351
386
  revalidateTag("cart");
352
387
  return result;
353
388
  }
389
+
390
+ // src/actions/auth.ts
391
+ init_config();
392
+
393
+ // src/auth-helpers.ts
394
+ init_config();
354
395
  async function getAuthOptions() {
355
396
  const token = await getAccessToken();
356
397
  if (!token) {
@@ -447,6 +488,7 @@ async function register(params) {
447
488
  }
448
489
  async function logout() {
449
490
  await clearAccessToken();
491
+ await clearCartCookies();
450
492
  revalidateTag("customer");
451
493
  revalidateTag("cart");
452
494
  revalidateTag("addresses");
@@ -471,6 +513,7 @@ async function updateCustomer(data) {
471
513
  revalidateTag("customer");
472
514
  return result;
473
515
  }
516
+ init_config();
474
517
  async function listAddresses() {
475
518
  return withAuthRefresh(async (options) => {
476
519
  return getClient().customer.addresses.list(void 0, options);
@@ -503,6 +546,7 @@ async function deleteAddress(id) {
503
546
  }
504
547
 
505
548
  // src/actions/orders.ts
549
+ init_config();
506
550
  async function listOrders(params) {
507
551
  return withAuthRefresh(async (options) => {
508
552
  return getClient().customer.orders.list(params, options);
@@ -512,6 +556,9 @@ async function getOrder(idOrNumber, params) {
512
556
  const options = await getCartOptions();
513
557
  return getClient().orders.get(idOrNumber, params, options);
514
558
  }
559
+
560
+ // src/actions/locale.ts
561
+ init_config();
515
562
  async function setLocale(params) {
516
563
  const config = getConfig();
517
564
  const cookieStore = await cookies();
@@ -529,6 +576,7 @@ async function setLocale(params) {
529
576
  });
530
577
  }
531
578
  }
579
+ init_config();
532
580
  async function listCreditCards() {
533
581
  return withAuthRefresh(async (options) => {
534
582
  return getClient().customer.creditCards.list(void 0, options);
@@ -542,6 +590,7 @@ async function deleteCreditCard(id) {
542
590
  }
543
591
 
544
592
  // src/actions/gift-cards.ts
593
+ init_config();
545
594
  async function listGiftCards() {
546
595
  return withAuthRefresh(async (options) => {
547
596
  return getClient().customer.giftCards.list(void 0, options);
@@ -552,6 +601,9 @@ async function getGiftCard(id) {
552
601
  return getClient().customer.giftCards.get(id, options);
553
602
  });
554
603
  }
604
+
605
+ // src/actions/payments.ts
606
+ init_config();
555
607
  async function createPayment(params) {
556
608
  const options = await getCartOptions();
557
609
  const cartId = await requireCartId();
@@ -559,6 +611,9 @@ async function createPayment(params) {
559
611
  revalidateTag("checkout");
560
612
  return result;
561
613
  }
614
+
615
+ // src/actions/payment-sessions.ts
616
+ init_config();
562
617
  async function createPaymentSession(params) {
563
618
  const options = await getCartOptions();
564
619
  const cartId = await requireCartId();
@@ -587,6 +642,7 @@ async function completePaymentSession(sessionId, params) {
587
642
  }
588
643
 
589
644
  // src/actions/payment-setup-sessions.ts
645
+ init_config();
590
646
  async function createPaymentSetupSession(params) {
591
647
  return withAuthRefresh(async (options) => {
592
648
  return getClient().customer.paymentSetupSessions.create(params, options);
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/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';\nimport { getCartOptions } from '../cookies';\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 * Works for both authenticated users (JWT) and guests (spreeToken).\n */\nexport async function getOrder(\n idOrNumber: string,\n params?: Record<string, unknown>\n): Promise<Order> {\n const options = await getCartOptions();\n return getClient().orders.get(idOrNumber, params, options);\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"]}
1
+ {"version":3,"sources":["../src/config.ts","../src/index.ts","../src/data/products.ts","../src/locale.ts","../src/data/categories.ts","../src/data/countries.ts","../src/data/currencies.ts","../src/data/locales.ts","../src/data/markets.ts","../src/actions/cart.ts","../src/cookies.ts","../src/actions/auth.ts","../src/auth-helpers.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","getClient","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","// Configuration\nexport { initSpreeNext, getClient } from './config';\nexport type { SpreeNextConfig, SpreeNextOptions } from './types';\n\n// Data reads (plain async functions — wrap with \"use cache\" in your app)\nexport { listProducts, getProduct, getProductFilters } from './data/products';\nexport { listCategories, getCategory, listCategoryProducts } from './data/categories';\nexport { listCountries, getCountry } from './data/countries';\nexport { listCurrencies } from './data/currencies';\nexport { listLocales } from './data/locales';\nexport { listMarkets, getMarket, resolveMarket, listMarketCountries, getMarketCountry } from './data/markets';\n\n// Server actions (mutations + auth-dependent reads)\nexport {\n getCart,\n getOrCreateCart,\n addItem,\n updateItem,\n removeItem,\n clearCart,\n associateCart,\n updateCart,\n getShipments,\n selectShippingRate,\n applyCoupon,\n removeCoupon,\n complete,\n} from './actions/cart';\n\nexport {\n login,\n register,\n logout,\n getCustomer,\n updateCustomer,\n} from './actions/auth';\n\nexport {\n listAddresses,\n getAddress,\n createAddress,\n updateAddress,\n deleteAddress,\n} from './actions/addresses';\n\nexport { listOrders, getOrder } from './actions/orders';\nexport { setLocale } from './actions/locale';\nexport { listCreditCards, deleteCreditCard } from './actions/credit-cards';\nexport { listGiftCards, getGiftCard } from './actions/gift-cards';\n\nexport { createPayment } from './actions/payments';\n\nexport {\n createPaymentSession,\n getPaymentSession,\n updatePaymentSession,\n completePaymentSession,\n} from './actions/payment-sessions';\n\nexport {\n createPaymentSetupSession,\n getPaymentSetupSession,\n completePaymentSetupSession,\n} from './actions/payment-setup-sessions';\n\n// Re-export commonly used SDK types for convenience\nexport type {\n Cart,\n Product,\n Order,\n LineItem,\n Variant,\n Category,\n Country,\n Currency,\n Locale,\n Market,\n Address,\n Customer,\n CreditCard,\n DigitalLink,\n GiftCard,\n Shipment,\n ShippingRate,\n Payment,\n PaymentMethod,\n PaymentSession,\n PaymentSetupSession,\n Image,\n OptionType,\n OptionValue,\n Price,\n CartPromotion,\n OrderPromotion,\n PaginatedResponse,\n AddressParams,\n CreateCartParams,\n LineItemInput,\n UpdateCartParams,\n ProductFiltersResponse,\n CreatePaymentParams,\n CreatePaymentSessionParams,\n UpdatePaymentSessionParams,\n CompletePaymentSessionParams,\n CreatePaymentSetupSessionParams,\n CompletePaymentSetupSessionParams,\n SpreeError,\n} from '@spree/sdk';\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 { 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 { 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","'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, getCartId,\n setCartCookies, clearCartCookies,\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 setCartCookies(cart.id, 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 clearCartCookies();\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 await setCartCookies(cart.id, cart.token);\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 clearCartCookies();\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 clearCartCookies();\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 * @param explicitCartId - Optional cart ID to complete. If not provided, uses the cart cookie.\n */\nexport async function complete(explicitCartId?: string): Promise<Order> {\n const options = await getCartOptions();\n const cartId = explicitCartId ?? await requireCartId();\n const result = await getClient().carts.complete(cartId, options);\n revalidateTag('checkout');\n revalidateTag('cart');\n return result;\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 Cookies (token + ID always managed together) ---\n\nexport async function getCartToken(): Promise<string | undefined> {\n const cookieStore = await cookies();\n return cookieStore.get(getCartCookieName())?.value;\n}\n\nexport async function getCartId(): Promise<string | undefined> {\n const cookieStore = await cookies();\n return cookieStore.get(getCartIdCookieName())?.value;\n}\n\nexport async function setCartCookies(id: string, token?: string): Promise<void> {\n const cookieStore = await cookies();\n const opts = {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax' as const,\n path: '/',\n maxAge: CART_TOKEN_MAX_AGE,\n };\n\n cookieStore.set(getCartIdCookieName(), id, opts);\n if (token) {\n cookieStore.set(getCartCookieName(), token, opts);\n }\n}\n\nexport async function clearCartCookies(): Promise<void> {\n const cookieStore = await cookies();\n const opts = { maxAge: -1, path: '/' };\n cookieStore.set(getCartCookieName(), '', opts);\n cookieStore.set(getCartIdCookieName(), '', opts);\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) return cartId;\n\n // Authenticated user without cart ID cookie — resolve via carts.list()\n const token = await getAccessToken();\n if (token) {\n const { getClient } = await import('./config');\n const response = await getClient().carts.list({ token });\n if (response.data.length > 0) {\n const cart = response.data[0];\n await setCartCookies(cart.id, cart.token);\n return cart.id;\n }\n }\n\n throw new Error('No cart found');\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, clearCartCookies } 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 * Clears all auth and cart cookies to prevent the next guest session\n * from seeing/modifying the previous user's cart.\n */\nexport async function logout(): Promise<void> {\n await clearAccessToken();\n await clearCartCookies();\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","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 { 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';\nimport { getCartOptions } from '../cookies';\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 * Works for both authenticated users (JWT) and guests (spreeToken).\n */\nexport async function getOrder(\n idOrNumber: string,\n params?: Record<string, unknown>\n): Promise<Order> {\n const options = await getCartOptions();\n return getClient().orders.get(idOrNumber, params, options);\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spree/next",
3
- "version": "0.10.1",
3
+ "version": "0.10.3",
4
4
  "description": "Next.js integration for Spree Commerce — server actions, caching, and cookie-based auth",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",