@spree/next 0.1.1

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.
Files changed (47) hide show
  1. package/LICENSE +58 -0
  2. package/dist/actions/addresses.d.ts +26 -0
  3. package/dist/actions/addresses.js +157 -0
  4. package/dist/actions/addresses.js.map +1 -0
  5. package/dist/actions/auth.d.ts +48 -0
  6. package/dist/actions/auth.js +215 -0
  7. package/dist/actions/auth.js.map +1 -0
  8. package/dist/actions/cart.d.ts +39 -0
  9. package/dist/actions/cart.js +170 -0
  10. package/dist/actions/cart.js.map +1 -0
  11. package/dist/actions/checkout.d.ts +49 -0
  12. package/dist/actions/checkout.js +146 -0
  13. package/dist/actions/checkout.js.map +1 -0
  14. package/dist/actions/credit-cards.d.ts +14 -0
  15. package/dist/actions/credit-cards.js +135 -0
  16. package/dist/actions/credit-cards.js.map +1 -0
  17. package/dist/actions/gift-cards.d.ts +14 -0
  18. package/dist/actions/gift-cards.js +131 -0
  19. package/dist/actions/gift-cards.js.map +1 -0
  20. package/dist/actions/orders.d.ts +12 -0
  21. package/dist/actions/orders.js +131 -0
  22. package/dist/actions/orders.js.map +1 -0
  23. package/dist/config.d.ts +26 -0
  24. package/dist/config.js +40 -0
  25. package/dist/config.js.map +1 -0
  26. package/dist/data/countries.d.ts +15 -0
  27. package/dist/data/countries.js +42 -0
  28. package/dist/data/countries.js.map +1 -0
  29. package/dist/data/products.d.ts +19 -0
  30. package/dist/data/products.js +48 -0
  31. package/dist/data/products.js.map +1 -0
  32. package/dist/data/store.d.ts +9 -0
  33. package/dist/data/store.js +36 -0
  34. package/dist/data/store.js.map +1 -0
  35. package/dist/data/taxonomies.d.ts +13 -0
  36. package/dist/data/taxonomies.js +42 -0
  37. package/dist/data/taxonomies.js.map +1 -0
  38. package/dist/data/taxons.d.ts +17 -0
  39. package/dist/data/taxons.js +48 -0
  40. package/dist/data/taxons.js.map +1 -0
  41. package/dist/index.d.ts +192 -0
  42. package/dist/index.js +506 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/types.d.ts +22 -0
  45. package/dist/types.js +3 -0
  46. package/dist/types.js.map +1 -0
  47. package/package.json +73 -0
@@ -0,0 +1,131 @@
1
+ "use server";
2
+
3
+ // src/auth-helpers.ts
4
+ import { SpreeError } from "@spree/sdk";
5
+
6
+ // src/config.ts
7
+ import { createSpreeClient } from "@spree/sdk";
8
+ var _client = null;
9
+ var _config = null;
10
+ function initSpreeNext(config) {
11
+ _config = config;
12
+ _client = createSpreeClient({
13
+ baseUrl: config.baseUrl,
14
+ apiKey: config.apiKey
15
+ });
16
+ }
17
+ function getClient() {
18
+ if (!_client) {
19
+ const baseUrl = process.env.SPREE_API_URL;
20
+ const apiKey = process.env.SPREE_API_KEY;
21
+ if (baseUrl && apiKey) {
22
+ initSpreeNext({ baseUrl, apiKey });
23
+ } else {
24
+ throw new Error(
25
+ "@spree/next is not configured. Either call initSpreeNext() or set SPREE_API_URL and SPREE_API_KEY environment variables."
26
+ );
27
+ }
28
+ }
29
+ return _client;
30
+ }
31
+ function getConfig() {
32
+ if (!_config) {
33
+ getClient();
34
+ }
35
+ return _config;
36
+ }
37
+
38
+ // src/cookies.ts
39
+ import { cookies } from "next/headers";
40
+ var DEFAULT_ACCESS_TOKEN_COOKIE = "_spree_jwt";
41
+ var CART_TOKEN_MAX_AGE = 60 * 60 * 24 * 30;
42
+ var ACCESS_TOKEN_MAX_AGE = 60 * 60 * 24 * 7;
43
+ function getAccessTokenCookieName() {
44
+ try {
45
+ return getConfig().accessTokenCookieName ?? DEFAULT_ACCESS_TOKEN_COOKIE;
46
+ } catch {
47
+ return DEFAULT_ACCESS_TOKEN_COOKIE;
48
+ }
49
+ }
50
+ async function getAccessToken() {
51
+ const cookieStore = await cookies();
52
+ return cookieStore.get(getAccessTokenCookieName())?.value;
53
+ }
54
+ async function setAccessToken(token) {
55
+ const cookieStore = await cookies();
56
+ cookieStore.set(getAccessTokenCookieName(), token, {
57
+ httpOnly: true,
58
+ secure: process.env.NODE_ENV === "production",
59
+ sameSite: "lax",
60
+ path: "/",
61
+ maxAge: ACCESS_TOKEN_MAX_AGE
62
+ });
63
+ }
64
+ async function clearAccessToken() {
65
+ const cookieStore = await cookies();
66
+ cookieStore.set(getAccessTokenCookieName(), "", {
67
+ maxAge: -1,
68
+ path: "/"
69
+ });
70
+ }
71
+
72
+ // src/auth-helpers.ts
73
+ async function getAuthOptions() {
74
+ const token = await getAccessToken();
75
+ if (!token) {
76
+ return {};
77
+ }
78
+ try {
79
+ const payload = JSON.parse(atob(token.split(".")[1]));
80
+ const exp = payload.exp;
81
+ const now = Math.floor(Date.now() / 1e3);
82
+ if (exp && exp - now < 3600) {
83
+ try {
84
+ const refreshed = await getClient().auth.refresh({ token });
85
+ await setAccessToken(refreshed.token);
86
+ return { token: refreshed.token };
87
+ } catch {
88
+ }
89
+ }
90
+ } catch {
91
+ }
92
+ return { token };
93
+ }
94
+ async function withAuthRefresh(fn) {
95
+ const options = await getAuthOptions();
96
+ if (!options.token) {
97
+ throw new Error("Not authenticated");
98
+ }
99
+ try {
100
+ return await fn(options);
101
+ } catch (error) {
102
+ if (error instanceof SpreeError && error.status === 401) {
103
+ try {
104
+ const refreshed = await getClient().auth.refresh({ token: options.token });
105
+ await setAccessToken(refreshed.token);
106
+ return await fn({ token: refreshed.token });
107
+ } catch {
108
+ await clearAccessToken();
109
+ throw error;
110
+ }
111
+ }
112
+ throw error;
113
+ }
114
+ }
115
+
116
+ // src/actions/gift-cards.ts
117
+ async function listGiftCards() {
118
+ return withAuthRefresh(async (options) => {
119
+ return getClient().customer.giftCards.list(void 0, options);
120
+ });
121
+ }
122
+ async function getGiftCard(id) {
123
+ return withAuthRefresh(async (options) => {
124
+ return getClient().customer.giftCards.get(id, options);
125
+ });
126
+ }
127
+ export {
128
+ getGiftCard,
129
+ listGiftCards
130
+ };
131
+ //# sourceMappingURL=gift-cards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/auth-helpers.ts","../../src/config.ts","../../src/cookies.ts","../../src/actions/gift-cards.ts"],"sourcesContent":["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","import { createSpreeClient, type SpreeClient } from '@spree/sdk';\nimport type { SpreeNextConfig } from './types';\n\nlet _client: SpreeClient | null = null;\nlet _config: SpreeNextConfig | null = null;\n\n/**\n * Initialize the Spree Next.js integration.\n * Call this once in your app (e.g., in `lib/storefront.ts`).\n * If not called, the client will auto-initialize from SPREE_API_URL and SPREE_API_KEY env vars.\n */\nexport function initSpreeNext(config: SpreeNextConfig): void {\n _config = config;\n _client = createSpreeClient({\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n });\n}\n\n/**\n * Get the SpreeClient instance. Auto-initializes from env vars if needed.\n * @internal\n */\nexport function getClient(): SpreeClient {\n if (!_client) {\n const baseUrl = process.env.SPREE_API_URL;\n const apiKey = process.env.SPREE_API_KEY;\n if (baseUrl && apiKey) {\n initSpreeNext({ baseUrl, apiKey });\n } else {\n throw new Error(\n '@spree/next is not configured. Either call initSpreeNext() or set SPREE_API_URL and SPREE_API_KEY environment variables.'\n );\n }\n }\n return _client!;\n}\n\n/**\n * Get the current config. Auto-initializes from env vars if needed.\n * @internal\n */\nexport function getConfig(): SpreeNextConfig {\n if (!_config) {\n getClient(); // triggers auto-init\n }\n return _config!;\n}\n\n/**\n * Reset the client (useful for testing).\n * @internal\n */\nexport function resetClient(): void {\n _client = null;\n _config = null;\n}\n","import { cookies } from 'next/headers';\nimport { getConfig } from './config';\n\nconst DEFAULT_CART_COOKIE = '_spree_cart_token';\nconst DEFAULT_ACCESS_TOKEN_COOKIE = '_spree_jwt';\nconst CART_TOKEN_MAX_AGE = 60 * 60 * 24 * 30; // 30 days\nconst ACCESS_TOKEN_MAX_AGE = 60 * 60 * 24 * 7; // 7 days\n\nfunction getCartCookieName(): string {\n try {\n return getConfig().cartCookieName ?? DEFAULT_CART_COOKIE;\n } catch {\n return DEFAULT_CART_COOKIE;\n }\n}\n\nfunction getAccessTokenCookieName(): string {\n try {\n return getConfig().accessTokenCookieName ?? DEFAULT_ACCESS_TOKEN_COOKIE;\n } catch {\n return DEFAULT_ACCESS_TOKEN_COOKIE;\n }\n}\n\n// --- Cart Token ---\n\nexport async function getCartToken(): Promise<string | undefined> {\n const cookieStore = await cookies();\n return cookieStore.get(getCartCookieName())?.value;\n}\n\nexport async function setCartToken(token: string): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getCartCookieName(), token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n path: '/',\n maxAge: CART_TOKEN_MAX_AGE,\n });\n}\n\nexport async function clearCartToken(): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getCartCookieName(), '', {\n maxAge: -1,\n path: '/',\n });\n}\n\n// --- Access Token (JWT) ---\n\nexport async function getAccessToken(): Promise<string | undefined> {\n const cookieStore = await cookies();\n return cookieStore.get(getAccessTokenCookieName())?.value;\n}\n\nexport async function setAccessToken(token: string): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getAccessTokenCookieName(), token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n path: '/',\n maxAge: ACCESS_TOKEN_MAX_AGE,\n });\n}\n\nexport async function clearAccessToken(): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getAccessTokenCookieName(), '', {\n maxAge: -1,\n path: '/',\n });\n}\n","'use server';\n\nimport type { StoreGiftCard } from '@spree/sdk';\nimport { withAuthRefresh } from '../auth-helpers';\nimport { getClient } from '../config';\n\n/**\n * List the authenticated customer's gift cards.\n */\nexport async function listGiftCards(): Promise<{ data: StoreGiftCard[] }> {\n return withAuthRefresh(async (options) => {\n return getClient().customer.giftCards.list(undefined, options);\n });\n}\n\n/**\n * Get a single gift card by ID.\n */\nexport async function getGiftCard(id: string): Promise<StoreGiftCard> {\n return withAuthRefresh(async (options) => {\n return getClient().customer.giftCards.get(id, options);\n });\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,12 @@
1
+ import { StoreOrder, PaginatedResponse } from '@spree/sdk';
2
+
3
+ /**
4
+ * List the authenticated customer's orders.
5
+ */
6
+ declare function listOrders(params?: Record<string, unknown>): Promise<PaginatedResponse<StoreOrder>>;
7
+ /**
8
+ * Get a single order by ID or number.
9
+ */
10
+ declare function getOrder(idOrNumber: string, params?: Record<string, unknown>): Promise<StoreOrder>;
11
+
12
+ export { getOrder, listOrders };
@@ -0,0 +1,131 @@
1
+ "use server";
2
+
3
+ // src/auth-helpers.ts
4
+ import { SpreeError } from "@spree/sdk";
5
+
6
+ // src/config.ts
7
+ import { createSpreeClient } from "@spree/sdk";
8
+ var _client = null;
9
+ var _config = null;
10
+ function initSpreeNext(config) {
11
+ _config = config;
12
+ _client = createSpreeClient({
13
+ baseUrl: config.baseUrl,
14
+ apiKey: config.apiKey
15
+ });
16
+ }
17
+ function getClient() {
18
+ if (!_client) {
19
+ const baseUrl = process.env.SPREE_API_URL;
20
+ const apiKey = process.env.SPREE_API_KEY;
21
+ if (baseUrl && apiKey) {
22
+ initSpreeNext({ baseUrl, apiKey });
23
+ } else {
24
+ throw new Error(
25
+ "@spree/next is not configured. Either call initSpreeNext() or set SPREE_API_URL and SPREE_API_KEY environment variables."
26
+ );
27
+ }
28
+ }
29
+ return _client;
30
+ }
31
+ function getConfig() {
32
+ if (!_config) {
33
+ getClient();
34
+ }
35
+ return _config;
36
+ }
37
+
38
+ // src/cookies.ts
39
+ import { cookies } from "next/headers";
40
+ var DEFAULT_ACCESS_TOKEN_COOKIE = "_spree_jwt";
41
+ var CART_TOKEN_MAX_AGE = 60 * 60 * 24 * 30;
42
+ var ACCESS_TOKEN_MAX_AGE = 60 * 60 * 24 * 7;
43
+ function getAccessTokenCookieName() {
44
+ try {
45
+ return getConfig().accessTokenCookieName ?? DEFAULT_ACCESS_TOKEN_COOKIE;
46
+ } catch {
47
+ return DEFAULT_ACCESS_TOKEN_COOKIE;
48
+ }
49
+ }
50
+ async function getAccessToken() {
51
+ const cookieStore = await cookies();
52
+ return cookieStore.get(getAccessTokenCookieName())?.value;
53
+ }
54
+ async function setAccessToken(token) {
55
+ const cookieStore = await cookies();
56
+ cookieStore.set(getAccessTokenCookieName(), token, {
57
+ httpOnly: true,
58
+ secure: process.env.NODE_ENV === "production",
59
+ sameSite: "lax",
60
+ path: "/",
61
+ maxAge: ACCESS_TOKEN_MAX_AGE
62
+ });
63
+ }
64
+ async function clearAccessToken() {
65
+ const cookieStore = await cookies();
66
+ cookieStore.set(getAccessTokenCookieName(), "", {
67
+ maxAge: -1,
68
+ path: "/"
69
+ });
70
+ }
71
+
72
+ // src/auth-helpers.ts
73
+ async function getAuthOptions() {
74
+ const token = await getAccessToken();
75
+ if (!token) {
76
+ return {};
77
+ }
78
+ try {
79
+ const payload = JSON.parse(atob(token.split(".")[1]));
80
+ const exp = payload.exp;
81
+ const now = Math.floor(Date.now() / 1e3);
82
+ if (exp && exp - now < 3600) {
83
+ try {
84
+ const refreshed = await getClient().auth.refresh({ token });
85
+ await setAccessToken(refreshed.token);
86
+ return { token: refreshed.token };
87
+ } catch {
88
+ }
89
+ }
90
+ } catch {
91
+ }
92
+ return { token };
93
+ }
94
+ async function withAuthRefresh(fn) {
95
+ const options = await getAuthOptions();
96
+ if (!options.token) {
97
+ throw new Error("Not authenticated");
98
+ }
99
+ try {
100
+ return await fn(options);
101
+ } catch (error) {
102
+ if (error instanceof SpreeError && error.status === 401) {
103
+ try {
104
+ const refreshed = await getClient().auth.refresh({ token: options.token });
105
+ await setAccessToken(refreshed.token);
106
+ return await fn({ token: refreshed.token });
107
+ } catch {
108
+ await clearAccessToken();
109
+ throw error;
110
+ }
111
+ }
112
+ throw error;
113
+ }
114
+ }
115
+
116
+ // src/actions/orders.ts
117
+ async function listOrders(params) {
118
+ return withAuthRefresh(async (options) => {
119
+ return getClient().orders.list(params, options);
120
+ });
121
+ }
122
+ async function getOrder(idOrNumber, params) {
123
+ return withAuthRefresh(async (options) => {
124
+ return getClient().orders.get(idOrNumber, params, options);
125
+ });
126
+ }
127
+ export {
128
+ getOrder,
129
+ listOrders
130
+ };
131
+ //# sourceMappingURL=orders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/auth-helpers.ts","../../src/config.ts","../../src/cookies.ts","../../src/actions/orders.ts"],"sourcesContent":["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","import { createSpreeClient, type SpreeClient } from '@spree/sdk';\nimport type { SpreeNextConfig } from './types';\n\nlet _client: SpreeClient | null = null;\nlet _config: SpreeNextConfig | null = null;\n\n/**\n * Initialize the Spree Next.js integration.\n * Call this once in your app (e.g., in `lib/storefront.ts`).\n * If not called, the client will auto-initialize from SPREE_API_URL and SPREE_API_KEY env vars.\n */\nexport function initSpreeNext(config: SpreeNextConfig): void {\n _config = config;\n _client = createSpreeClient({\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n });\n}\n\n/**\n * Get the SpreeClient instance. Auto-initializes from env vars if needed.\n * @internal\n */\nexport function getClient(): SpreeClient {\n if (!_client) {\n const baseUrl = process.env.SPREE_API_URL;\n const apiKey = process.env.SPREE_API_KEY;\n if (baseUrl && apiKey) {\n initSpreeNext({ baseUrl, apiKey });\n } else {\n throw new Error(\n '@spree/next is not configured. Either call initSpreeNext() or set SPREE_API_URL and SPREE_API_KEY environment variables.'\n );\n }\n }\n return _client!;\n}\n\n/**\n * Get the current config. Auto-initializes from env vars if needed.\n * @internal\n */\nexport function getConfig(): SpreeNextConfig {\n if (!_config) {\n getClient(); // triggers auto-init\n }\n return _config!;\n}\n\n/**\n * Reset the client (useful for testing).\n * @internal\n */\nexport function resetClient(): void {\n _client = null;\n _config = null;\n}\n","import { cookies } from 'next/headers';\nimport { getConfig } from './config';\n\nconst DEFAULT_CART_COOKIE = '_spree_cart_token';\nconst DEFAULT_ACCESS_TOKEN_COOKIE = '_spree_jwt';\nconst CART_TOKEN_MAX_AGE = 60 * 60 * 24 * 30; // 30 days\nconst ACCESS_TOKEN_MAX_AGE = 60 * 60 * 24 * 7; // 7 days\n\nfunction getCartCookieName(): string {\n try {\n return getConfig().cartCookieName ?? DEFAULT_CART_COOKIE;\n } catch {\n return DEFAULT_CART_COOKIE;\n }\n}\n\nfunction getAccessTokenCookieName(): string {\n try {\n return getConfig().accessTokenCookieName ?? DEFAULT_ACCESS_TOKEN_COOKIE;\n } catch {\n return DEFAULT_ACCESS_TOKEN_COOKIE;\n }\n}\n\n// --- Cart Token ---\n\nexport async function getCartToken(): Promise<string | undefined> {\n const cookieStore = await cookies();\n return cookieStore.get(getCartCookieName())?.value;\n}\n\nexport async function setCartToken(token: string): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getCartCookieName(), token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n path: '/',\n maxAge: CART_TOKEN_MAX_AGE,\n });\n}\n\nexport async function clearCartToken(): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getCartCookieName(), '', {\n maxAge: -1,\n path: '/',\n });\n}\n\n// --- Access Token (JWT) ---\n\nexport async function getAccessToken(): Promise<string | undefined> {\n const cookieStore = await cookies();\n return cookieStore.get(getAccessTokenCookieName())?.value;\n}\n\nexport async function setAccessToken(token: string): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getAccessTokenCookieName(), token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n path: '/',\n maxAge: ACCESS_TOKEN_MAX_AGE,\n });\n}\n\nexport async function clearAccessToken(): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getAccessTokenCookieName(), '', {\n maxAge: -1,\n path: '/',\n });\n}\n","'use server';\n\nimport type { StoreOrder, PaginatedResponse } from '@spree/sdk';\nimport { withAuthRefresh } from '../auth-helpers';\nimport { getClient } from '../config';\n\n/**\n * List the authenticated customer's orders.\n */\nexport async function listOrders(\n params?: Record<string, unknown>\n): Promise<PaginatedResponse<StoreOrder>> {\n return withAuthRefresh(async (options) => {\n return getClient().orders.list(params, options);\n });\n}\n\n/**\n * Get a single order by ID or number.\n */\nexport async function getOrder(\n idOrNumber: string,\n params?: Record<string, unknown>\n): Promise<StoreOrder> {\n return withAuthRefresh(async (options) => {\n return getClient().orders.get(idOrNumber, params, options);\n });\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,26 @@
1
+ import { SpreeClient } from '@spree/sdk';
2
+ import { SpreeNextConfig } from './types.js';
3
+
4
+ /**
5
+ * Initialize the Spree Next.js integration.
6
+ * Call this once in your app (e.g., in `lib/storefront.ts`).
7
+ * If not called, the client will auto-initialize from SPREE_API_URL and SPREE_API_KEY env vars.
8
+ */
9
+ declare function initSpreeNext(config: SpreeNextConfig): void;
10
+ /**
11
+ * Get the SpreeClient instance. Auto-initializes from env vars if needed.
12
+ * @internal
13
+ */
14
+ declare function getClient(): SpreeClient;
15
+ /**
16
+ * Get the current config. Auto-initializes from env vars if needed.
17
+ * @internal
18
+ */
19
+ declare function getConfig(): SpreeNextConfig;
20
+ /**
21
+ * Reset the client (useful for testing).
22
+ * @internal
23
+ */
24
+ declare function resetClient(): void;
25
+
26
+ export { getClient, getConfig, initSpreeNext, resetClient };
package/dist/config.js ADDED
@@ -0,0 +1,40 @@
1
+ import { createSpreeClient } from '@spree/sdk';
2
+
3
+ // src/config.ts
4
+ var _client = null;
5
+ var _config = null;
6
+ function initSpreeNext(config) {
7
+ _config = config;
8
+ _client = createSpreeClient({
9
+ baseUrl: config.baseUrl,
10
+ apiKey: config.apiKey
11
+ });
12
+ }
13
+ function getClient() {
14
+ if (!_client) {
15
+ const baseUrl = process.env.SPREE_API_URL;
16
+ const apiKey = process.env.SPREE_API_KEY;
17
+ if (baseUrl && apiKey) {
18
+ initSpreeNext({ baseUrl, apiKey });
19
+ } else {
20
+ throw new Error(
21
+ "@spree/next is not configured. Either call initSpreeNext() or set SPREE_API_URL and SPREE_API_KEY environment variables."
22
+ );
23
+ }
24
+ }
25
+ return _client;
26
+ }
27
+ function getConfig() {
28
+ if (!_config) {
29
+ getClient();
30
+ }
31
+ return _config;
32
+ }
33
+ function resetClient() {
34
+ _client = null;
35
+ _config = null;
36
+ }
37
+
38
+ export { getClient, getConfig, initSpreeNext, resetClient };
39
+ //# sourceMappingURL=config.js.map
40
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config.ts"],"names":[],"mappings":";;;AAGA,IAAI,OAAA,GAA8B,IAAA;AAClC,IAAI,OAAA,GAAkC,IAAA;AAO/B,SAAS,cAAc,MAAA,EAA+B;AAC3D,EAAA,OAAA,GAAU,MAAA;AACV,EAAA,OAAA,GAAU,iBAAA,CAAkB;AAAA,IAC1B,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,QAAQ,MAAA,CAAO;AAAA,GAChB,CAAA;AACH;AAMO,SAAS,SAAA,GAAyB;AACvC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,CAAI,aAAA;AAC5B,IAAA,MAAM,MAAA,GAAS,QAAQ,GAAA,CAAI,aAAA;AAC3B,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,aAAA,CAAc,EAAE,OAAA,EAAS,MAAA,EAAQ,CAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAMO,SAAS,SAAA,GAA6B;AAC3C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,SAAA,EAAU;AAAA,EACZ;AACA,EAAA,OAAO,OAAA;AACT;AAMO,SAAS,WAAA,GAAoB;AAClC,EAAA,OAAA,GAAU,IAAA;AACV,EAAA,OAAA,GAAU,IAAA;AACZ","file":"config.js","sourcesContent":["import { createSpreeClient, type SpreeClient } from '@spree/sdk';\nimport type { SpreeNextConfig } from './types';\n\nlet _client: SpreeClient | null = null;\nlet _config: SpreeNextConfig | null = null;\n\n/**\n * Initialize the Spree Next.js integration.\n * Call this once in your app (e.g., in `lib/storefront.ts`).\n * If not called, the client will auto-initialize from SPREE_API_URL and SPREE_API_KEY env vars.\n */\nexport function initSpreeNext(config: SpreeNextConfig): void {\n _config = config;\n _client = createSpreeClient({\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n });\n}\n\n/**\n * Get the SpreeClient instance. Auto-initializes from env vars if needed.\n * @internal\n */\nexport function getClient(): SpreeClient {\n if (!_client) {\n const baseUrl = process.env.SPREE_API_URL;\n const apiKey = process.env.SPREE_API_KEY;\n if (baseUrl && apiKey) {\n initSpreeNext({ baseUrl, apiKey });\n } else {\n throw new Error(\n '@spree/next is not configured. Either call initSpreeNext() or set SPREE_API_URL and SPREE_API_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"]}
@@ -0,0 +1,15 @@
1
+ import { StoreCountry } from '@spree/sdk';
2
+ import { SpreeNextOptions } from '../types.js';
3
+
4
+ /**
5
+ * List all available countries.
6
+ */
7
+ declare function listCountries(options?: SpreeNextOptions): Promise<{
8
+ data: StoreCountry[];
9
+ }>;
10
+ /**
11
+ * Get a single country by ISO code.
12
+ */
13
+ declare function getCountry(iso: string, options?: SpreeNextOptions): Promise<StoreCountry>;
14
+
15
+ export { getCountry, listCountries };
@@ -0,0 +1,42 @@
1
+ import { createSpreeClient } from '@spree/sdk';
2
+
3
+ // src/config.ts
4
+ var _client = null;
5
+ function initSpreeNext(config) {
6
+ _client = createSpreeClient({
7
+ baseUrl: config.baseUrl,
8
+ apiKey: config.apiKey
9
+ });
10
+ }
11
+ function getClient() {
12
+ if (!_client) {
13
+ const baseUrl = process.env.SPREE_API_URL;
14
+ const apiKey = process.env.SPREE_API_KEY;
15
+ if (baseUrl && apiKey) {
16
+ initSpreeNext({ baseUrl, apiKey });
17
+ } else {
18
+ throw new Error(
19
+ "@spree/next is not configured. Either call initSpreeNext() or set SPREE_API_URL and SPREE_API_KEY environment variables."
20
+ );
21
+ }
22
+ }
23
+ return _client;
24
+ }
25
+
26
+ // src/data/countries.ts
27
+ async function listCountries(options) {
28
+ return getClient().countries.list({
29
+ locale: options?.locale,
30
+ currency: options?.currency
31
+ });
32
+ }
33
+ async function getCountry(iso, options) {
34
+ return getClient().countries.get(iso, {
35
+ locale: options?.locale,
36
+ currency: options?.currency
37
+ });
38
+ }
39
+
40
+ export { getCountry, listCountries };
41
+ //# sourceMappingURL=countries.js.map
42
+ //# sourceMappingURL=countries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/config.ts","../../src/data/countries.ts"],"names":[],"mappings":";;;AAGA,IAAI,OAAA,GAA8B,IAAA;AAQ3B,SAAS,cAAc,MAAA,EAA+B;AAE3D,EAAA,OAAA,GAAU,iBAAA,CAAkB;AAAA,IAC1B,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,QAAQ,MAAA,CAAO;AAAA,GAChB,CAAA;AACH;AAMO,SAAS,SAAA,GAAyB;AACvC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,CAAI,aAAA;AAC5B,IAAA,MAAM,MAAA,GAAS,QAAQ,GAAA,CAAI,aAAA;AAC3B,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,aAAA,CAAc,EAAE,OAAA,EAAS,MAAA,EAAQ,CAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;;;AC7BA,eAAsB,cACpB,OAAA,EACmC;AACnC,EAAA,OAAO,SAAA,EAAU,CAAE,SAAA,CAAU,IAAA,CAAK;AAAA,IAChC,QAAQ,OAAA,EAAS,MAAA;AAAA,IACjB,UAAU,OAAA,EAAS;AAAA,GACpB,CAAA;AACH;AAKA,eAAsB,UAAA,CACpB,KACA,OAAA,EACuB;AACvB,EAAA,OAAO,SAAA,EAAU,CAAE,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK;AAAA,IACpC,QAAQ,OAAA,EAAS,MAAA;AAAA,IACjB,UAAU,OAAA,EAAS;AAAA,GACpB,CAAA;AACH","file":"countries.js","sourcesContent":["import { createSpreeClient, type SpreeClient } from '@spree/sdk';\nimport type { SpreeNextConfig } from './types';\n\nlet _client: SpreeClient | null = null;\nlet _config: SpreeNextConfig | null = null;\n\n/**\n * Initialize the Spree Next.js integration.\n * Call this once in your app (e.g., in `lib/storefront.ts`).\n * If not called, the client will auto-initialize from SPREE_API_URL and SPREE_API_KEY env vars.\n */\nexport function initSpreeNext(config: SpreeNextConfig): void {\n _config = config;\n _client = createSpreeClient({\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n });\n}\n\n/**\n * Get the SpreeClient instance. Auto-initializes from env vars if needed.\n * @internal\n */\nexport function getClient(): SpreeClient {\n if (!_client) {\n const baseUrl = process.env.SPREE_API_URL;\n const apiKey = process.env.SPREE_API_KEY;\n if (baseUrl && apiKey) {\n initSpreeNext({ baseUrl, apiKey });\n } else {\n throw new Error(\n '@spree/next is not configured. Either call initSpreeNext() or set SPREE_API_URL and SPREE_API_KEY environment variables.'\n );\n }\n }\n return _client!;\n}\n\n/**\n * Get the current config. Auto-initializes from env vars if needed.\n * @internal\n */\nexport function getConfig(): SpreeNextConfig {\n if (!_config) {\n getClient(); // triggers auto-init\n }\n return _config!;\n}\n\n/**\n * Reset the client (useful for testing).\n * @internal\n */\nexport function resetClient(): void {\n _client = null;\n _config = null;\n}\n","import type { StoreCountry } from '@spree/sdk';\nimport { getClient } from '../config';\nimport type { SpreeNextOptions } from '../types';\n\n/**\n * List all available countries.\n */\nexport async function listCountries(\n options?: SpreeNextOptions\n): Promise<{ data: StoreCountry[] }> {\n return getClient().countries.list({\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n\n/**\n * Get a single country by ISO code.\n */\nexport async function getCountry(\n iso: string,\n options?: SpreeNextOptions\n): Promise<StoreCountry> {\n return getClient().countries.get(iso, {\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import { StoreProduct, ProductFiltersResponse, PaginatedResponse } from '@spree/sdk';
2
+ import { SpreeNextOptions } from '../types.js';
3
+
4
+ /**
5
+ * List products with optional filtering, sorting, and pagination.
6
+ */
7
+ declare function listProducts(params?: Record<string, unknown>, options?: SpreeNextOptions): Promise<PaginatedResponse<StoreProduct>>;
8
+ /**
9
+ * Get a single product by slug or ID.
10
+ */
11
+ declare function getProduct(slugOrId: string, params?: {
12
+ includes?: string;
13
+ }, options?: SpreeNextOptions): Promise<StoreProduct>;
14
+ /**
15
+ * Get available product filters (price ranges, option values, etc.).
16
+ */
17
+ declare function getProductFilters(params?: Record<string, unknown>, options?: SpreeNextOptions): Promise<ProductFiltersResponse>;
18
+
19
+ export { getProduct, getProductFilters, listProducts };
@@ -0,0 +1,48 @@
1
+ import { createSpreeClient } from '@spree/sdk';
2
+
3
+ // src/config.ts
4
+ var _client = null;
5
+ function initSpreeNext(config) {
6
+ _client = createSpreeClient({
7
+ baseUrl: config.baseUrl,
8
+ apiKey: config.apiKey
9
+ });
10
+ }
11
+ function getClient() {
12
+ if (!_client) {
13
+ const baseUrl = process.env.SPREE_API_URL;
14
+ const apiKey = process.env.SPREE_API_KEY;
15
+ if (baseUrl && apiKey) {
16
+ initSpreeNext({ baseUrl, apiKey });
17
+ } else {
18
+ throw new Error(
19
+ "@spree/next is not configured. Either call initSpreeNext() or set SPREE_API_URL and SPREE_API_KEY environment variables."
20
+ );
21
+ }
22
+ }
23
+ return _client;
24
+ }
25
+
26
+ // src/data/products.ts
27
+ async function listProducts(params, options) {
28
+ return getClient().products.list(params, {
29
+ locale: options?.locale,
30
+ currency: options?.currency
31
+ });
32
+ }
33
+ async function getProduct(slugOrId, params, options) {
34
+ return getClient().products.get(slugOrId, params, {
35
+ locale: options?.locale,
36
+ currency: options?.currency
37
+ });
38
+ }
39
+ async function getProductFilters(params, options) {
40
+ return getClient().products.filters(params, {
41
+ locale: options?.locale,
42
+ currency: options?.currency
43
+ });
44
+ }
45
+
46
+ export { getProduct, getProductFilters, listProducts };
47
+ //# sourceMappingURL=products.js.map
48
+ //# sourceMappingURL=products.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/config.ts","../../src/data/products.ts"],"names":[],"mappings":";;;AAGA,IAAI,OAAA,GAA8B,IAAA;AAQ3B,SAAS,cAAc,MAAA,EAA+B;AAE3D,EAAA,OAAA,GAAU,iBAAA,CAAkB;AAAA,IAC1B,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,QAAQ,MAAA,CAAO;AAAA,GAChB,CAAA;AACH;AAMO,SAAS,SAAA,GAAyB;AACvC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,CAAI,aAAA;AAC5B,IAAA,MAAM,MAAA,GAAS,QAAQ,GAAA,CAAI,aAAA;AAC3B,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,aAAA,CAAc,EAAE,OAAA,EAAS,MAAA,EAAQ,CAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;;;AC7BA,eAAsB,YAAA,CACpB,QACA,OAAA,EAC0C;AAC1C,EAAA,OAAO,SAAA,EAAU,CAAE,QAAA,CAAS,IAAA,CAAK,MAAA,EAAQ;AAAA,IACvC,QAAQ,OAAA,EAAS,MAAA;AAAA,IACjB,UAAU,OAAA,EAAS;AAAA,GACpB,CAAA;AACH;AAKA,eAAsB,UAAA,CACpB,QAAA,EACA,MAAA,EACA,OAAA,EACuB;AACvB,EAAA,OAAO,SAAA,EAAU,CAAE,QAAA,CAAS,GAAA,CAAI,UAAU,MAAA,EAAQ;AAAA,IAChD,QAAQ,OAAA,EAAS,MAAA;AAAA,IACjB,UAAU,OAAA,EAAS;AAAA,GACpB,CAAA;AACH;AAKA,eAAsB,iBAAA,CACpB,QACA,OAAA,EACiC;AACjC,EAAA,OAAO,SAAA,EAAU,CAAE,QAAA,CAAS,OAAA,CAAQ,MAAA,EAAQ;AAAA,IAC1C,QAAQ,OAAA,EAAS,MAAA;AAAA,IACjB,UAAU,OAAA,EAAS;AAAA,GACpB,CAAA;AACH","file":"products.js","sourcesContent":["import { createSpreeClient, type SpreeClient } from '@spree/sdk';\nimport type { SpreeNextConfig } from './types';\n\nlet _client: SpreeClient | null = null;\nlet _config: SpreeNextConfig | null = null;\n\n/**\n * Initialize the Spree Next.js integration.\n * Call this once in your app (e.g., in `lib/storefront.ts`).\n * If not called, the client will auto-initialize from SPREE_API_URL and SPREE_API_KEY env vars.\n */\nexport function initSpreeNext(config: SpreeNextConfig): void {\n _config = config;\n _client = createSpreeClient({\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n });\n}\n\n/**\n * Get the SpreeClient instance. Auto-initializes from env vars if needed.\n * @internal\n */\nexport function getClient(): SpreeClient {\n if (!_client) {\n const baseUrl = process.env.SPREE_API_URL;\n const apiKey = process.env.SPREE_API_KEY;\n if (baseUrl && apiKey) {\n initSpreeNext({ baseUrl, apiKey });\n } else {\n throw new Error(\n '@spree/next is not configured. Either call initSpreeNext() or set SPREE_API_URL and SPREE_API_KEY environment variables.'\n );\n }\n }\n return _client!;\n}\n\n/**\n * Get the current config. Auto-initializes from env vars if needed.\n * @internal\n */\nexport function getConfig(): SpreeNextConfig {\n if (!_config) {\n getClient(); // triggers auto-init\n }\n return _config!;\n}\n\n/**\n * Reset the client (useful for testing).\n * @internal\n */\nexport function resetClient(): void {\n _client = null;\n _config = null;\n}\n","import type { StoreProduct, PaginatedResponse, ProductFiltersResponse } from '@spree/sdk';\nimport { getClient } from '../config';\nimport type { SpreeNextOptions } from '../types';\n\n/**\n * List products with optional filtering, sorting, and pagination.\n */\nexport async function listProducts(\n params?: Record<string, unknown>,\n options?: SpreeNextOptions\n): Promise<PaginatedResponse<StoreProduct>> {\n return getClient().products.list(params, {\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n\n/**\n * Get a single product by slug or ID.\n */\nexport async function getProduct(\n slugOrId: string,\n params?: { includes?: string },\n options?: SpreeNextOptions\n): Promise<StoreProduct> {\n return getClient().products.get(slugOrId, params, {\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n\n/**\n * Get available product filters (price ranges, option values, etc.).\n */\nexport async function getProductFilters(\n params?: Record<string, unknown>,\n options?: SpreeNextOptions\n): Promise<ProductFiltersResponse> {\n return getClient().products.filters(params, {\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import { StoreStore } from '@spree/sdk';
2
+ import { SpreeNextOptions } from '../types.js';
3
+
4
+ /**
5
+ * Get the current store configuration.
6
+ */
7
+ declare function getStore(options?: SpreeNextOptions): Promise<StoreStore>;
8
+
9
+ export { getStore };
@@ -0,0 +1,36 @@
1
+ import { createSpreeClient } from '@spree/sdk';
2
+
3
+ // src/config.ts
4
+ var _client = null;
5
+ function initSpreeNext(config) {
6
+ _client = createSpreeClient({
7
+ baseUrl: config.baseUrl,
8
+ apiKey: config.apiKey
9
+ });
10
+ }
11
+ function getClient() {
12
+ if (!_client) {
13
+ const baseUrl = process.env.SPREE_API_URL;
14
+ const apiKey = process.env.SPREE_API_KEY;
15
+ if (baseUrl && apiKey) {
16
+ initSpreeNext({ baseUrl, apiKey });
17
+ } else {
18
+ throw new Error(
19
+ "@spree/next is not configured. Either call initSpreeNext() or set SPREE_API_URL and SPREE_API_KEY environment variables."
20
+ );
21
+ }
22
+ }
23
+ return _client;
24
+ }
25
+
26
+ // src/data/store.ts
27
+ async function getStore(options) {
28
+ return getClient().store.get({
29
+ locale: options?.locale,
30
+ currency: options?.currency
31
+ });
32
+ }
33
+
34
+ export { getStore };
35
+ //# sourceMappingURL=store.js.map
36
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/config.ts","../../src/data/store.ts"],"names":[],"mappings":";;;AAGA,IAAI,OAAA,GAA8B,IAAA;AAQ3B,SAAS,cAAc,MAAA,EAA+B;AAE3D,EAAA,OAAA,GAAU,iBAAA,CAAkB;AAAA,IAC1B,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,QAAQ,MAAA,CAAO;AAAA,GAChB,CAAA;AACH;AAMO,SAAS,SAAA,GAAyB;AACvC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,CAAI,aAAA;AAC5B,IAAA,MAAM,MAAA,GAAS,QAAQ,GAAA,CAAI,aAAA;AAC3B,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,aAAA,CAAc,EAAE,OAAA,EAAS,MAAA,EAAQ,CAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;;;AC7BA,eAAsB,SAAS,OAAA,EAAiD;AAC9E,EAAA,OAAO,SAAA,EAAU,CAAE,KAAA,CAAM,GAAA,CAAI;AAAA,IAC3B,QAAQ,OAAA,EAAS,MAAA;AAAA,IACjB,UAAU,OAAA,EAAS;AAAA,GACpB,CAAA;AACH","file":"store.js","sourcesContent":["import { createSpreeClient, type SpreeClient } from '@spree/sdk';\nimport type { SpreeNextConfig } from './types';\n\nlet _client: SpreeClient | null = null;\nlet _config: SpreeNextConfig | null = null;\n\n/**\n * Initialize the Spree Next.js integration.\n * Call this once in your app (e.g., in `lib/storefront.ts`).\n * If not called, the client will auto-initialize from SPREE_API_URL and SPREE_API_KEY env vars.\n */\nexport function initSpreeNext(config: SpreeNextConfig): void {\n _config = config;\n _client = createSpreeClient({\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n });\n}\n\n/**\n * Get the SpreeClient instance. Auto-initializes from env vars if needed.\n * @internal\n */\nexport function getClient(): SpreeClient {\n if (!_client) {\n const baseUrl = process.env.SPREE_API_URL;\n const apiKey = process.env.SPREE_API_KEY;\n if (baseUrl && apiKey) {\n initSpreeNext({ baseUrl, apiKey });\n } else {\n throw new Error(\n '@spree/next is not configured. Either call initSpreeNext() or set SPREE_API_URL and SPREE_API_KEY environment variables.'\n );\n }\n }\n return _client!;\n}\n\n/**\n * Get the current config. Auto-initializes from env vars if needed.\n * @internal\n */\nexport function getConfig(): SpreeNextConfig {\n if (!_config) {\n getClient(); // triggers auto-init\n }\n return _config!;\n}\n\n/**\n * Reset the client (useful for testing).\n * @internal\n */\nexport function resetClient(): void {\n _client = null;\n _config = null;\n}\n","import type { StoreStore } from '@spree/sdk';\nimport { getClient } from '../config';\nimport type { SpreeNextOptions } from '../types';\n\n/**\n * Get the current store configuration.\n */\nexport async function getStore(options?: SpreeNextOptions): Promise<StoreStore> {\n return getClient().store.get({\n locale: options?.locale,\n currency: options?.currency,\n });\n}\n"]}
@@ -0,0 +1,13 @@
1
+ import { StoreTaxonomy, PaginatedResponse } from '@spree/sdk';
2
+ import { SpreeNextOptions } from '../types.js';
3
+
4
+ /**
5
+ * List taxonomies with optional filtering and pagination.
6
+ */
7
+ declare function listTaxonomies(params?: Record<string, unknown>, options?: SpreeNextOptions): Promise<PaginatedResponse<StoreTaxonomy>>;
8
+ /**
9
+ * Get a single taxonomy by ID.
10
+ */
11
+ declare function getTaxonomy(id: string, params?: Record<string, unknown>, options?: SpreeNextOptions): Promise<StoreTaxonomy>;
12
+
13
+ export { getTaxonomy, listTaxonomies };
@@ -0,0 +1,42 @@
1
+ import { createSpreeClient } from '@spree/sdk';
2
+
3
+ // src/config.ts
4
+ var _client = null;
5
+ function initSpreeNext(config) {
6
+ _client = createSpreeClient({
7
+ baseUrl: config.baseUrl,
8
+ apiKey: config.apiKey
9
+ });
10
+ }
11
+ function getClient() {
12
+ if (!_client) {
13
+ const baseUrl = process.env.SPREE_API_URL;
14
+ const apiKey = process.env.SPREE_API_KEY;
15
+ if (baseUrl && apiKey) {
16
+ initSpreeNext({ baseUrl, apiKey });
17
+ } else {
18
+ throw new Error(
19
+ "@spree/next is not configured. Either call initSpreeNext() or set SPREE_API_URL and SPREE_API_KEY environment variables."
20
+ );
21
+ }
22
+ }
23
+ return _client;
24
+ }
25
+
26
+ // src/data/taxonomies.ts
27
+ async function listTaxonomies(params, options) {
28
+ return getClient().taxonomies.list(params, {
29
+ locale: options?.locale,
30
+ currency: options?.currency
31
+ });
32
+ }
33
+ async function getTaxonomy(id, params, options) {
34
+ return getClient().taxonomies.get(id, params, {
35
+ locale: options?.locale,
36
+ currency: options?.currency
37
+ });
38
+ }
39
+
40
+ export { getTaxonomy, listTaxonomies };
41
+ //# sourceMappingURL=taxonomies.js.map
42
+ //# sourceMappingURL=taxonomies.js.map