@spree/next 0.8.2 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -19
- package/dist/actions/addresses.js.map +1 -1
- package/dist/actions/auth.js +15 -6
- package/dist/actions/auth.js.map +1 -1
- package/dist/actions/cart.d.ts +37 -28
- package/dist/actions/cart.js +128 -31
- package/dist/actions/cart.js.map +1 -1
- package/dist/actions/credit-cards.js.map +1 -1
- package/dist/actions/gift-cards.js.map +1 -1
- package/dist/actions/orders.js.map +1 -1
- package/dist/actions/payment-sessions.d.ts +5 -5
- package/dist/actions/payment-sessions.js +33 -17
- package/dist/actions/payment-sessions.js.map +1 -1
- package/dist/actions/payment-setup-sessions.js.map +1 -1
- package/dist/index.d.ts +30 -62
- package/dist/index.js +128 -107
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/actions/checkout.d.ts +0 -44
- package/dist/actions/checkout.js +0 -146
- package/dist/actions/checkout.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spree/next",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
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",
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
"url": "https://github.com/spree/spree/issues"
|
|
63
63
|
},
|
|
64
64
|
"peerDependencies": {
|
|
65
|
-
"@spree/sdk": ">=0.
|
|
65
|
+
"@spree/sdk": ">=0.10.0",
|
|
66
66
|
"next": ">=15.0.0",
|
|
67
67
|
"react": ">=19.0.0"
|
|
68
68
|
},
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { Order, Shipment, UpdateOrderParams } from '@spree/sdk';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Get the current checkout order state.
|
|
5
|
-
* Includes line_items, shipments, and addresses by default.
|
|
6
|
-
*/
|
|
7
|
-
declare function getCheckout(orderId: string): Promise<Order>;
|
|
8
|
-
/**
|
|
9
|
-
* Update an order (addresses, email, currency, locale, metadata, etc.).
|
|
10
|
-
*/
|
|
11
|
-
declare function updateOrder(orderId: string, params: UpdateOrderParams): Promise<Order>;
|
|
12
|
-
/**
|
|
13
|
-
* Advance the checkout to the next step.
|
|
14
|
-
*/
|
|
15
|
-
declare function advance(orderId: string): Promise<Order>;
|
|
16
|
-
/**
|
|
17
|
-
* Move the checkout to the next step (alias for advance).
|
|
18
|
-
*/
|
|
19
|
-
declare function next(orderId: string): Promise<Order>;
|
|
20
|
-
/**
|
|
21
|
-
* Get shipments for the order (includes available shipping rates).
|
|
22
|
-
*/
|
|
23
|
-
declare function getShipments(orderId: string): Promise<{
|
|
24
|
-
data: Shipment[];
|
|
25
|
-
}>;
|
|
26
|
-
/**
|
|
27
|
-
* Select a shipping rate for a shipment.
|
|
28
|
-
* Returns the updated order with recalculated totals.
|
|
29
|
-
*/
|
|
30
|
-
declare function selectShippingRate(orderId: string, shipmentId: string, shippingRateId: string): Promise<Order>;
|
|
31
|
-
/**
|
|
32
|
-
* Apply a coupon code to the order.
|
|
33
|
-
*/
|
|
34
|
-
declare function applyCoupon(orderId: string, code: string): Promise<Order>;
|
|
35
|
-
/**
|
|
36
|
-
* Remove a coupon/promotion from the order.
|
|
37
|
-
*/
|
|
38
|
-
declare function removeCoupon(orderId: string, promotionId: string): Promise<Order>;
|
|
39
|
-
/**
|
|
40
|
-
* Complete the checkout and place the order.
|
|
41
|
-
*/
|
|
42
|
-
declare function complete(orderId: string): Promise<Order>;
|
|
43
|
-
|
|
44
|
-
export { advance, applyCoupon, complete, getCheckout, getShipments, next, removeCoupon, selectShippingRate, updateOrder };
|
package/dist/actions/checkout.js
DELETED
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
"use server";
|
|
2
|
-
|
|
3
|
-
// src/actions/checkout.ts
|
|
4
|
-
import { revalidateTag } from "next/cache";
|
|
5
|
-
|
|
6
|
-
// src/config.ts
|
|
7
|
-
import { createClient } from "@spree/sdk";
|
|
8
|
-
var _client = null;
|
|
9
|
-
var _config = null;
|
|
10
|
-
function initSpreeNext(config) {
|
|
11
|
-
_config = config;
|
|
12
|
-
_client = createClient({
|
|
13
|
-
baseUrl: config.baseUrl,
|
|
14
|
-
publishableKey: config.publishableKey
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
function getClient() {
|
|
18
|
-
if (!_client) {
|
|
19
|
-
const baseUrl = process.env.SPREE_API_URL;
|
|
20
|
-
const publishableKey = process.env.SPREE_PUBLISHABLE_KEY;
|
|
21
|
-
if (baseUrl && publishableKey) {
|
|
22
|
-
initSpreeNext({ baseUrl, publishableKey });
|
|
23
|
-
} else {
|
|
24
|
-
throw new Error(
|
|
25
|
-
"@spree/next is not configured. Either call initSpreeNext() or set SPREE_API_URL and SPREE_PUBLISHABLE_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_CART_COOKIE = "_spree_cart_token";
|
|
41
|
-
var DEFAULT_ACCESS_TOKEN_COOKIE = "_spree_jwt";
|
|
42
|
-
var CART_TOKEN_MAX_AGE = 60 * 60 * 24 * 30;
|
|
43
|
-
var ACCESS_TOKEN_MAX_AGE = 60 * 60 * 24 * 7;
|
|
44
|
-
function getCartCookieName() {
|
|
45
|
-
try {
|
|
46
|
-
return getConfig().cartCookieName ?? DEFAULT_CART_COOKIE;
|
|
47
|
-
} catch {
|
|
48
|
-
return DEFAULT_CART_COOKIE;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
function getAccessTokenCookieName() {
|
|
52
|
-
try {
|
|
53
|
-
return getConfig().accessTokenCookieName ?? DEFAULT_ACCESS_TOKEN_COOKIE;
|
|
54
|
-
} catch {
|
|
55
|
-
return DEFAULT_ACCESS_TOKEN_COOKIE;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
async function getCartToken() {
|
|
59
|
-
const cookieStore = await cookies();
|
|
60
|
-
return cookieStore.get(getCartCookieName())?.value;
|
|
61
|
-
}
|
|
62
|
-
async function getAccessToken() {
|
|
63
|
-
const cookieStore = await cookies();
|
|
64
|
-
return cookieStore.get(getAccessTokenCookieName())?.value;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// src/actions/checkout.ts
|
|
68
|
-
async function getCheckoutOptions() {
|
|
69
|
-
const orderToken = await getCartToken();
|
|
70
|
-
const token = await getAccessToken();
|
|
71
|
-
return { orderToken, token };
|
|
72
|
-
}
|
|
73
|
-
async function getCheckout(orderId) {
|
|
74
|
-
const options = await getCheckoutOptions();
|
|
75
|
-
return getClient().orders.get(
|
|
76
|
-
orderId,
|
|
77
|
-
{ expand: ["line_items", "shipments", "ship_address", "bill_address"] },
|
|
78
|
-
options
|
|
79
|
-
);
|
|
80
|
-
}
|
|
81
|
-
async function updateOrder(orderId, params) {
|
|
82
|
-
const options = await getCheckoutOptions();
|
|
83
|
-
const result = await getClient().orders.update(orderId, params, options);
|
|
84
|
-
revalidateTag("checkout");
|
|
85
|
-
return result;
|
|
86
|
-
}
|
|
87
|
-
async function advance(orderId) {
|
|
88
|
-
const options = await getCheckoutOptions();
|
|
89
|
-
const result = await getClient().orders.advance(orderId, options);
|
|
90
|
-
revalidateTag("checkout");
|
|
91
|
-
return result;
|
|
92
|
-
}
|
|
93
|
-
async function next(orderId) {
|
|
94
|
-
const options = await getCheckoutOptions();
|
|
95
|
-
const result = await getClient().orders.next(orderId, options);
|
|
96
|
-
revalidateTag("checkout");
|
|
97
|
-
return result;
|
|
98
|
-
}
|
|
99
|
-
async function getShipments(orderId) {
|
|
100
|
-
const options = await getCheckoutOptions();
|
|
101
|
-
return getClient().orders.shipments.list(orderId, options);
|
|
102
|
-
}
|
|
103
|
-
async function selectShippingRate(orderId, shipmentId, shippingRateId) {
|
|
104
|
-
const options = await getCheckoutOptions();
|
|
105
|
-
const result = await getClient().orders.shipments.update(
|
|
106
|
-
orderId,
|
|
107
|
-
shipmentId,
|
|
108
|
-
{ selected_shipping_rate_id: shippingRateId },
|
|
109
|
-
options
|
|
110
|
-
);
|
|
111
|
-
revalidateTag("checkout");
|
|
112
|
-
return result;
|
|
113
|
-
}
|
|
114
|
-
async function applyCoupon(orderId, code) {
|
|
115
|
-
const options = await getCheckoutOptions();
|
|
116
|
-
const result = await getClient().orders.couponCodes.apply(orderId, code, options);
|
|
117
|
-
revalidateTag("checkout");
|
|
118
|
-
revalidateTag("cart");
|
|
119
|
-
return result;
|
|
120
|
-
}
|
|
121
|
-
async function removeCoupon(orderId, promotionId) {
|
|
122
|
-
const options = await getCheckoutOptions();
|
|
123
|
-
const result = await getClient().orders.couponCodes.remove(orderId, promotionId, options);
|
|
124
|
-
revalidateTag("checkout");
|
|
125
|
-
revalidateTag("cart");
|
|
126
|
-
return result;
|
|
127
|
-
}
|
|
128
|
-
async function complete(orderId) {
|
|
129
|
-
const options = await getCheckoutOptions();
|
|
130
|
-
const result = await getClient().orders.complete(orderId, options);
|
|
131
|
-
revalidateTag("checkout");
|
|
132
|
-
revalidateTag("cart");
|
|
133
|
-
return result;
|
|
134
|
-
}
|
|
135
|
-
export {
|
|
136
|
-
advance,
|
|
137
|
-
applyCoupon,
|
|
138
|
-
complete,
|
|
139
|
-
getCheckout,
|
|
140
|
-
getShipments,
|
|
141
|
-
next,
|
|
142
|
-
removeCoupon,
|
|
143
|
-
selectShippingRate,
|
|
144
|
-
updateOrder
|
|
145
|
-
};
|
|
146
|
-
//# sourceMappingURL=checkout.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/actions/checkout.ts","../../src/config.ts","../../src/cookies.ts"],"sourcesContent":["'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport type { Order, Shipment, UpdateOrderParams } from '@spree/sdk';\nimport { getClient } from '../config';\nimport { getCartToken, getAccessToken } from '../cookies';\n\nasync function getCheckoutOptions() {\n const orderToken = await getCartToken();\n const token = await getAccessToken();\n return { orderToken, token };\n}\n\n/**\n * Get the current checkout order state.\n * Includes line_items, shipments, and addresses by default.\n */\nexport async function getCheckout(\n orderId: string\n): Promise<Order> {\n const options = await getCheckoutOptions();\n return getClient().orders.get(\n orderId,\n { expand: ['line_items', 'shipments', 'ship_address', 'bill_address'] },\n options\n );\n}\n\n/**\n * Update an order (addresses, email, currency, locale, metadata, etc.).\n */\nexport async function updateOrder(\n orderId: string,\n params: UpdateOrderParams\n): Promise<Order> {\n const options = await getCheckoutOptions();\n const result = await getClient().orders.update(orderId, params, options);\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Advance the checkout to the next step.\n */\nexport async function advance(orderId: string): Promise<Order> {\n const options = await getCheckoutOptions();\n const result = await getClient().orders.advance(orderId, options);\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Move the checkout to the next step (alias for advance).\n */\nexport async function next(orderId: string): Promise<Order> {\n const options = await getCheckoutOptions();\n const result = await getClient().orders.next(orderId, options);\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Get shipments for the order (includes available shipping rates).\n */\nexport async function getShipments(\n orderId: string\n): Promise<{ data: Shipment[] }> {\n const options = await getCheckoutOptions();\n return getClient().orders.shipments.list(orderId, options);\n}\n\n/**\n * Select a shipping rate for a shipment.\n * Returns the updated order with recalculated totals.\n */\nexport async function selectShippingRate(\n orderId: string,\n shipmentId: string,\n shippingRateId: string\n): Promise<Order> {\n const options = await getCheckoutOptions();\n const result = await getClient().orders.shipments.update(\n orderId,\n shipmentId,\n { selected_shipping_rate_id: shippingRateId },\n options\n );\n revalidateTag('checkout');\n return result;\n}\n\n/**\n * Apply a coupon code to the order.\n */\nexport async function applyCoupon(\n orderId: string,\n code: string\n): Promise<Order> {\n const options = await getCheckoutOptions();\n const result = await getClient().orders.couponCodes.apply(orderId, code, options);\n revalidateTag('checkout');\n revalidateTag('cart');\n return result;\n}\n\n/**\n * Remove a coupon/promotion from the order.\n */\nexport async function removeCoupon(\n orderId: string,\n promotionId: string\n): Promise<Order> {\n const options = await getCheckoutOptions();\n const result = await getClient().orders.couponCodes.remove(orderId, promotionId, options);\n revalidateTag('checkout');\n revalidateTag('cart');\n return result;\n}\n\n/**\n * Complete the checkout and place the order.\n */\nexport async function complete(orderId: string): Promise<Order> {\n const options = await getCheckoutOptions();\n const result = await getClient().orders.complete(orderId, options);\n revalidateTag('checkout');\n revalidateTag('cart');\n return result;\n}\n","import { 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_CART_COOKIE = '_spree_cart_token';\nconst DEFAULT_ACCESS_TOKEN_COOKIE = '_spree_jwt';\nconst CART_TOKEN_MAX_AGE = 60 * 60 * 24 * 30; // 30 days\nconst ACCESS_TOKEN_MAX_AGE = 60 * 60 * 24 * 7; // 7 days\n\nfunction getCartCookieName(): string {\n try {\n return getConfig().cartCookieName ?? DEFAULT_CART_COOKIE;\n } catch {\n return DEFAULT_CART_COOKIE;\n }\n}\n\nfunction getAccessTokenCookieName(): string {\n try {\n return getConfig().accessTokenCookieName ?? DEFAULT_ACCESS_TOKEN_COOKIE;\n } catch {\n return DEFAULT_ACCESS_TOKEN_COOKIE;\n }\n}\n\n// --- Cart Token ---\n\nexport async function getCartToken(): Promise<string | undefined> {\n const cookieStore = await cookies();\n return cookieStore.get(getCartCookieName())?.value;\n}\n\nexport async function setCartToken(token: string): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getCartCookieName(), token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n path: '/',\n maxAge: CART_TOKEN_MAX_AGE,\n });\n}\n\nexport async function clearCartToken(): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getCartCookieName(), '', {\n maxAge: -1,\n path: '/',\n });\n}\n\n// --- Access Token (JWT) ---\n\nexport async function getAccessToken(): Promise<string | undefined> {\n const cookieStore = await cookies();\n return cookieStore.get(getAccessTokenCookieName())?.value;\n}\n\nexport async function setAccessToken(token: string): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getAccessTokenCookieName(), token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n path: '/',\n maxAge: ACCESS_TOKEN_MAX_AGE,\n });\n}\n\nexport async function clearAccessToken(): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(getAccessTokenCookieName(), '', {\n maxAge: -1,\n path: '/',\n });\n}\n"],"mappings":"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","names":[]}
|