medusa-storefront-data 1.0.0 → 2.0.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/dist/cookies.d.ts +2 -2
- package/dist/cookies.d.ts.map +1 -1
- package/dist/edge.d.ts +3 -0
- package/dist/edge.d.ts.map +1 -0
- package/dist/edge.js +1 -0
- package/dist/middleware.d.ts +3 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +1 -0
- package/dist/server/cart.d.ts +9 -5
- package/dist/server/cart.d.ts.map +1 -1
- package/dist/server/cart.js +164 -194
- package/dist/server/categories.d.ts +3 -2
- package/dist/server/categories.d.ts.map +1 -1
- package/dist/server/categories.js +14 -51
- package/dist/server/collections.d.ts.map +1 -1
- package/dist/server/collections.js +16 -61
- package/dist/server/contact.d.ts +34 -0
- package/dist/server/contact.d.ts.map +1 -0
- package/dist/server/contact.js +57 -0
- package/dist/server/customer.d.ts +7 -7
- package/dist/server/customer.d.ts.map +1 -1
- package/dist/server/customer.js +95 -145
- package/dist/server/dynamic-config.d.ts.map +1 -1
- package/dist/server/dynamic-config.js +5 -2
- package/dist/server/fulfillment.d.ts +4 -3
- package/dist/server/fulfillment.d.ts.map +1 -1
- package/dist/server/fulfillment.js +16 -41
- package/dist/server/guest.d.ts +35 -63
- package/dist/server/guest.d.ts.map +1 -1
- package/dist/server/guest.js +81 -202
- package/dist/server/home.d.ts +15 -0
- package/dist/server/home.d.ts.map +1 -0
- package/dist/server/home.js +45 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -0
- package/dist/server/locale-actions.d.ts +1 -1
- package/dist/server/locale-actions.d.ts.map +1 -1
- package/dist/server/locale-actions.js +8 -13
- package/dist/server/locales.d.ts +2 -4
- package/dist/server/locales.d.ts.map +1 -1
- package/dist/server/locales.js +5 -13
- package/dist/server/orders.d.ts +5 -11
- package/dist/server/orders.d.ts.map +1 -1
- package/dist/server/orders.js +126 -267
- package/dist/server/payment-details.d.ts +4 -4
- package/dist/server/payment-details.d.ts.map +1 -1
- package/dist/server/payment-details.js +17 -42
- package/dist/server/payment.d.ts +2 -1
- package/dist/server/payment.d.ts.map +1 -1
- package/dist/server/payment.js +9 -21
- package/dist/server/pincode.d.ts +7 -0
- package/dist/server/pincode.d.ts.map +1 -0
- package/dist/server/pincode.js +30 -0
- package/dist/server/products.d.ts +15 -19
- package/dist/server/products.d.ts.map +1 -1
- package/dist/server/products.js +47 -178
- package/dist/server/regions.d.ts +1 -1
- package/dist/server/regions.d.ts.map +1 -1
- package/dist/server/regions.js +6 -3
- package/dist/server/returns.d.ts +4 -4
- package/dist/server/returns.d.ts.map +1 -1
- package/dist/server/returns.js +50 -154
- package/dist/server/swaps.d.ts +3 -3
- package/dist/server/swaps.d.ts.map +1 -1
- package/dist/server/swaps.js +22 -56
- package/dist/server/variants.d.ts.map +1 -1
- package/dist/server/variants.js +11 -22
- package/dist/server/wishlist.d.ts +11 -0
- package/dist/server/wishlist.d.ts.map +1 -0
- package/dist/server/wishlist.js +49 -0
- package/dist/util/get-locale-header.d.ts +1 -1
- package/dist/util/revalidate-cart.d.ts +2 -0
- package/dist/util/revalidate-cart.d.ts.map +1 -0
- package/dist/util/revalidate-cart.js +8 -0
- package/dist/util/sort-products.d.ts +3 -0
- package/dist/util/sort-products.d.ts.map +1 -0
- package/dist/util/sort-products.js +1 -0
- package/dist/util/store-client.d.ts +13 -0
- package/dist/util/store-client.d.ts.map +1 -0
- package/dist/util/store-client.js +77 -0
- package/package.json +95 -37
- package/src/edge.ts +2 -0
- package/src/middleware.ts +2 -2
- package/src/server/cart.ts +214 -267
- package/src/server/categories.ts +19 -72
- package/src/server/collections.ts +25 -82
- package/src/server/contact.ts +92 -0
- package/src/server/customer.ts +140 -189
- package/src/server/dynamic-config.ts +6 -2
- package/src/server/fulfillment.ts +27 -53
- package/src/server/guest.ts +159 -276
- package/src/server/home.ts +68 -0
- package/src/server/index.ts +1 -0
- package/src/server/locale-actions.ts +8 -15
- package/src/server/locales.ts +6 -18
- package/src/server/orders.ts +167 -337
- package/src/server/payment-details.ts +24 -52
- package/src/server/payment.ts +8 -28
- package/src/server/pincode.ts +49 -0
- package/src/server/products.ts +72 -235
- package/src/server/regions.ts +10 -6
- package/src/server/returns.ts +75 -189
- package/src/server/swaps.ts +90 -121
- package/src/server/variants.ts +9 -28
- package/src/util/revalidate-cart.ts +10 -0
- package/src/util/sort-products.ts +2 -47
- package/src/util/store-client.ts +93 -0
- package/src/services/middleware.ts +0 -54
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment-details.d.ts","sourceRoot":"","sources":["../../src/server/payment-details.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"payment-details.d.ts","sourceRoot":"","sources":["../../src/server/payment-details.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,kBAAkB,uEAY9B,CAAA;AAED,eAAO,MAAM,mBAAmB,GAC9B,MAAM,KAAK,GAAG,MAAM,GAAG,MAAM,EAC7B,aAAa,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,qCAIpC,CAAA;AAED,eAAO,MAAM,wBAAwB,GAAU,IAAI,MAAM,qCAGxD,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAU,IAAI,MAAM,kBAGnD,CAAA"}
|
|
@@ -1,53 +1,28 @@
|
|
|
1
1
|
"use server";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { medusaPaymentDetailCreate, medusaPaymentDetailDelete, medusaPaymentDetailMakeDefault, medusaPaymentDetailsList, } from "medusa-services/payment";
|
|
3
|
+
import { getStoreCartClientOptions } from "../util/store-client";
|
|
4
4
|
export const listPaymentDetails = async () => {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
try {
|
|
6
|
+
const options = await getStoreCartClientOptions();
|
|
7
|
+
if (!options.authorization) {
|
|
8
|
+
return [];
|
|
9
|
+
}
|
|
10
|
+
const { payment_details } = await medusaPaymentDetailsList(options);
|
|
11
|
+
return payment_details ?? [];
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
8
14
|
return [];
|
|
9
15
|
}
|
|
10
|
-
const headers = {
|
|
11
|
-
...authHeaders,
|
|
12
|
-
};
|
|
13
|
-
const next = {
|
|
14
|
-
...(await getCacheOptions("payment_details")),
|
|
15
|
-
};
|
|
16
|
-
return sdk.client
|
|
17
|
-
.fetch(`/store/payment-details`, {
|
|
18
|
-
method: "GET",
|
|
19
|
-
headers,
|
|
20
|
-
next,
|
|
21
|
-
cache: "no-store",
|
|
22
|
-
})
|
|
23
|
-
.then((res) => res.payment_details || [])
|
|
24
|
-
.catch(() => []);
|
|
25
16
|
};
|
|
26
17
|
export const createPaymentDetail = async (type, detail_json) => {
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
};
|
|
30
|
-
return sdk.client.fetch(`/store/payment-details`, {
|
|
31
|
-
method: "POST",
|
|
32
|
-
headers,
|
|
33
|
-
body: { type, detail_json },
|
|
34
|
-
});
|
|
18
|
+
const options = await getStoreCartClientOptions();
|
|
19
|
+
return medusaPaymentDetailCreate(type, detail_json, options);
|
|
35
20
|
};
|
|
36
21
|
export const makeDefaultPaymentDetail = async (id) => {
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
};
|
|
40
|
-
return sdk.client.fetch(`/store/payment-details/${id}/make-default`, {
|
|
41
|
-
method: "POST",
|
|
42
|
-
headers,
|
|
43
|
-
});
|
|
22
|
+
const options = await getStoreCartClientOptions();
|
|
23
|
+
return medusaPaymentDetailMakeDefault(id, options);
|
|
44
24
|
};
|
|
45
25
|
export const deletePaymentDetail = async (id) => {
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
};
|
|
49
|
-
return sdk.client.fetch(`/store/payment-details/${id}`, {
|
|
50
|
-
method: "DELETE",
|
|
51
|
-
headers,
|
|
52
|
-
});
|
|
26
|
+
const options = await getStoreCartClientOptions();
|
|
27
|
+
return medusaPaymentDetailDelete(id, options);
|
|
53
28
|
};
|
package/dist/server/payment.d.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
|
|
1
|
+
import { HttpTypes } from "@medusajs/types";
|
|
2
|
+
export declare const listCartPaymentMethods: (regionId: string) => Promise<HttpTypes.StorePaymentProvider[] | null>;
|
|
2
3
|
//# sourceMappingURL=payment.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment.d.ts","sourceRoot":"","sources":["../../src/server/payment.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"payment.d.ts","sourceRoot":"","sources":["../../src/server/payment.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAI3C,eAAO,MAAM,sBAAsB,GAAU,UAAU,MAAM,qDAQ5D,CAAA"}
|
package/dist/server/payment.js
CHANGED
|
@@ -1,25 +1,13 @@
|
|
|
1
1
|
"use server";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { medusaPaymentProvidersList } from "medusa-services/payment";
|
|
3
|
+
import { getStoreCartClientOptions } from "../util/store-client";
|
|
4
4
|
export const listCartPaymentMethods = async (regionId) => {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
return sdk.client
|
|
12
|
-
.fetch(`/store/payment-providers`, {
|
|
13
|
-
method: "GET",
|
|
14
|
-
query: { region_id: regionId },
|
|
15
|
-
headers,
|
|
16
|
-
next,
|
|
17
|
-
cache: "no-store",
|
|
18
|
-
})
|
|
19
|
-
.then(({ payment_providers }) => payment_providers.sort((a, b) => {
|
|
20
|
-
return a.id > b.id ? 1 : -1;
|
|
21
|
-
}))
|
|
22
|
-
.catch(() => {
|
|
5
|
+
try {
|
|
6
|
+
const options = await getStoreCartClientOptions();
|
|
7
|
+
const { payment_providers } = await medusaPaymentProvidersList(regionId, options);
|
|
8
|
+
return payment_providers.sort((a, b) => (a.id > b.id ? 1 : -1));
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
23
11
|
return null;
|
|
24
|
-
}
|
|
12
|
+
}
|
|
25
13
|
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type PincodeLookupResult = {
|
|
2
|
+
city: string;
|
|
3
|
+
province: string;
|
|
4
|
+
};
|
|
5
|
+
/** Resolve Indian pincode to district (city) and state. */
|
|
6
|
+
export declare function lookupIndianPincode(postalCode: string): Promise<PincodeLookupResult | null>;
|
|
7
|
+
//# sourceMappingURL=pincode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pincode.d.ts","sourceRoot":"","sources":["../../src/server/pincode.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAQD,2DAA2D;AAC3D,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAgCrC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use server";
|
|
2
|
+
function titleCase(value) {
|
|
3
|
+
return value
|
|
4
|
+
.toLowerCase()
|
|
5
|
+
.replace(/\b\w/g, (char) => char.toUpperCase());
|
|
6
|
+
}
|
|
7
|
+
/** Resolve Indian pincode to district (city) and state. */
|
|
8
|
+
export async function lookupIndianPincode(postalCode) {
|
|
9
|
+
const cleaned = postalCode.replace(/\D/g, "");
|
|
10
|
+
if (cleaned.length !== 6)
|
|
11
|
+
return null;
|
|
12
|
+
try {
|
|
13
|
+
const response = await fetch(`https://postal-pincode-api.vercel.app/api/v1/pincode/${cleaned}`, { next: { revalidate: 86400 } });
|
|
14
|
+
if (!response.ok)
|
|
15
|
+
return null;
|
|
16
|
+
const payload = await response.json();
|
|
17
|
+
const offices = payload?.data;
|
|
18
|
+
const match = offices?.find((office) => office.delivery) ?? offices?.[0];
|
|
19
|
+
if (match?.district && match?.state) {
|
|
20
|
+
return {
|
|
21
|
+
city: titleCase(match.district),
|
|
22
|
+
province: titleCase(match.state),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// ignore network errors
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { type SortOptions } from "../util/sort-products";
|
|
1
2
|
import { HttpTypes } from "@medusajs/types";
|
|
2
|
-
import { SortOptions } from "@modules/store/components/refinement-list/sort-products";
|
|
3
3
|
export declare const listProducts: ({ pageParam, queryParams, countryCode, regionId, }: {
|
|
4
4
|
pageParam?: number;
|
|
5
5
|
queryParams?: HttpTypes.FindParams & HttpTypes.StoreProductListParams;
|
|
@@ -13,10 +13,6 @@ export declare const listProducts: ({ pageParam, queryParams, countryCode, regio
|
|
|
13
13
|
nextPage: number | null;
|
|
14
14
|
queryParams?: HttpTypes.FindParams & HttpTypes.StoreProductListParams;
|
|
15
15
|
}>;
|
|
16
|
-
/**
|
|
17
|
-
* This will fetch 100 products to the Next.js cache and sort them based on the sortBy parameter.
|
|
18
|
-
* It will then return the paginated products based on the page and limit parameters.
|
|
19
|
-
*/
|
|
20
16
|
export declare const listProductsWithSort: ({ page, queryParams, sortBy, countryCode, }: {
|
|
21
17
|
page?: number;
|
|
22
18
|
queryParams?: HttpTypes.FindParams & HttpTypes.StoreProductParams;
|
|
@@ -30,29 +26,29 @@ export declare const listProductsWithSort: ({ page, queryParams, sortBy, country
|
|
|
30
26
|
nextPage: number | null;
|
|
31
27
|
queryParams?: HttpTypes.FindParams & HttpTypes.StoreProductParams;
|
|
32
28
|
}>;
|
|
33
|
-
/**
|
|
34
|
-
* Fetch products that have a specific tag value
|
|
35
|
-
*/
|
|
36
29
|
export declare function getProductsByTag({ tagValue, limit, countryCode, }: {
|
|
37
30
|
tagValue: string;
|
|
38
31
|
limit?: number;
|
|
39
32
|
countryCode: string;
|
|
40
33
|
}): Promise<HttpTypes.StoreProduct[]>;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
productTypes:
|
|
47
|
-
|
|
34
|
+
export declare const getDynamicFilters: (_countryCode: string) => Promise<{
|
|
35
|
+
genders: {
|
|
36
|
+
value: string;
|
|
37
|
+
label: string;
|
|
38
|
+
}[];
|
|
39
|
+
productTypes: {
|
|
40
|
+
value: string;
|
|
41
|
+
label: string;
|
|
42
|
+
}[];
|
|
43
|
+
materials: {
|
|
44
|
+
value: string;
|
|
45
|
+
label: string;
|
|
46
|
+
}[];
|
|
48
47
|
colors: {
|
|
49
48
|
value: string;
|
|
50
49
|
label: string;
|
|
51
50
|
hex: string;
|
|
52
51
|
}[];
|
|
53
52
|
}>;
|
|
54
|
-
|
|
55
|
-
* Fetch a single product by its handle
|
|
56
|
-
*/
|
|
57
|
-
export declare function getProductByHandle(handle: string): Promise<HttpTypes.StoreProduct>;
|
|
53
|
+
export declare function getProductByHandle(handle: string): Promise<HttpTypes.StoreProduct | undefined>;
|
|
58
54
|
//# sourceMappingURL=products.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"products.d.ts","sourceRoot":"","sources":["../../src/server/products.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"products.d.ts","sourceRoot":"","sources":["../../src/server/products.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAU3C,eAAO,MAAM,YAAY,GAAU,oDAKhC;IACD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,SAAS,CAAC,UAAU,GAAG,SAAS,CAAC,sBAAsB,CAAA;IACrE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,KAAG,OAAO,CAAC;IACV,QAAQ,EAAE;QAAE,QAAQ,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IAC/D,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,WAAW,CAAC,EAAE,SAAS,CAAC,UAAU,GAAG,SAAS,CAAC,sBAAsB,CAAA;CACtE,CAsCA,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAU,6CAKxC;IACD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,SAAS,CAAC,UAAU,GAAG,SAAS,CAAC,kBAAkB,CAAA;IACjE,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;CACpB,KAAG,OAAO,CAAC;IACV,QAAQ,EAAE;QAAE,QAAQ,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IAC/D,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,WAAW,CAAC,EAAE,SAAS,CAAC,UAAU,GAAG,SAAS,CAAC,kBAAkB,CAAA;CAClE,CAuBA,CAAA;AAED,wBAAsB,gBAAgB,CAAC,EACrC,QAAQ,EACR,KAAU,EACV,WAAW,GACZ,EAAE;IACD,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;CACpB,qCAYA;AAED,eAAO,MAAM,iBAAiB,GAAU,cAAc,MAAM;;;;;;;;;;;;;;;;;;EAgF3D,CAAA;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,+CAItD"}
|
package/dist/server/products.js
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
"use server";
|
|
2
|
-
import { sdk } from "../config";
|
|
3
|
-
import { getAuthHeaders, getCacheOptions } from "../cookies";
|
|
4
2
|
import { getRegion, retrieveRegion } from "./regions";
|
|
5
3
|
import Color from "color";
|
|
4
|
+
import { medusaProductByHandle, medusaProductHelperFilters, medusaProductList, } from "medusa-services/products";
|
|
5
|
+
import { getStoreClientOptions } from "../util/store-client";
|
|
6
6
|
export const listProducts = async ({ pageParam = 1, queryParams, countryCode, regionId, }) => {
|
|
7
7
|
if (!countryCode && !regionId) {
|
|
8
8
|
throw new Error("Country code or region ID is required");
|
|
9
9
|
}
|
|
10
10
|
const limit = queryParams?.limit || 12;
|
|
11
|
-
const _pageParam = Math.max(pageParam, 1);
|
|
12
|
-
const offset = _pageParam === 1 ? 0 : (_pageParam - 1) * limit;
|
|
13
11
|
let region;
|
|
14
12
|
if (countryCode) {
|
|
15
13
|
region = await getRegion(countryCode);
|
|
@@ -23,135 +21,25 @@ export const listProducts = async ({ pageParam = 1, queryParams, countryCode, re
|
|
|
23
21
|
nextPage: null,
|
|
24
22
|
};
|
|
25
23
|
}
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const next = {
|
|
30
|
-
...(await getCacheOptions("products")),
|
|
31
|
-
};
|
|
32
|
-
// 1. Standard Medusa query parameters
|
|
33
|
-
const standardQuery = {
|
|
24
|
+
const options = await getStoreClientOptions();
|
|
25
|
+
const { products, count, nextPage } = await medusaProductList(options, {
|
|
26
|
+
pageParam,
|
|
34
27
|
limit,
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
fields: "*variants.calculated_price,+variants.inventory_quantity,*variants.images,+variants.metadata,+variants.options,+metadata,+tags,+average_rating,+total_rating_count,+total_rating_sum,",
|
|
38
|
-
};
|
|
39
|
-
// 2. Identify advanced filters that require the product-helper API
|
|
40
|
-
const advancedFilterKeys = [
|
|
41
|
-
"metadata", "min_price", "max_price", "q", "collection_id", "category_id",
|
|
42
|
-
"tags", "option_value", "gender", "color", "material", "style", "brand",
|
|
43
|
-
"type", "product_type", "order"
|
|
44
|
-
];
|
|
45
|
-
const hasAdvancedFilters = !!(queryParams && Object.keys(queryParams).some(key => advancedFilterKeys.includes(key) && queryParams[key] !== undefined));
|
|
46
|
-
const endpoint = hasAdvancedFilters ? "/store/product-helper/products" : "/store/products";
|
|
47
|
-
let finalQuery = { ...standardQuery };
|
|
48
|
-
if (hasAdvancedFilters) {
|
|
49
|
-
// We use URLSearchParams to ensure correct formatting and handle repeated keys if needed
|
|
50
|
-
const params = new URLSearchParams();
|
|
51
|
-
// 1. Add standard params
|
|
52
|
-
params.append("limit", limit.toString());
|
|
53
|
-
params.append("offset", offset.toString());
|
|
54
|
-
if (region?.id)
|
|
55
|
-
params.append("region_id", region.id);
|
|
56
|
-
// Use '*' for helper endpoint to let it resolve necessary relations
|
|
57
|
-
params.append("fields", "*");
|
|
58
|
-
// 2. Map queryParams
|
|
59
|
-
for (const [key, value] of Object.entries(queryParams || {})) {
|
|
60
|
-
if (["metadata", "min_price", "max_price", "limit", "offset", "region_id", "fields"].includes(key))
|
|
61
|
-
continue;
|
|
62
|
-
const values = Array.isArray(value) ? value : [value];
|
|
63
|
-
const lowerKey = key.toLowerCase();
|
|
64
|
-
if (lowerKey === "color") {
|
|
65
|
-
// Map 'color' filter to 'option_value' which backend understands for variants
|
|
66
|
-
values.forEach(v => params.append("option_value[]", String(v)));
|
|
67
|
-
}
|
|
68
|
-
else if (["material", "gender", "product_type", "type", "style", "brand"].includes(lowerKey)) {
|
|
69
|
-
// Map these to metadata as they are defined as metadata in your config
|
|
70
|
-
const metaKey = lowerKey === "type" ? "product_type" : lowerKey;
|
|
71
|
-
values.forEach(v => params.append(`metadata[${metaKey}]`, String(v)));
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
// Standard mapping for others (tags, collection_id, etc.)
|
|
75
|
-
if (Array.isArray(value)) {
|
|
76
|
-
value.forEach(v => params.append(`${key}[]`, String(v)));
|
|
77
|
-
}
|
|
78
|
-
else if (value !== undefined && value !== null) {
|
|
79
|
-
params.append(key, String(value));
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
// 3. Map price filters (min_price -> price_min, max_price -> price_max)
|
|
84
|
-
if (queryParams.min_price)
|
|
85
|
-
params.append("price_min", String(queryParams.min_price));
|
|
86
|
-
if (queryParams.max_price)
|
|
87
|
-
params.append("price_max", String(queryParams.max_price));
|
|
88
|
-
// 4. Map metadata filters to metadata[key] format
|
|
89
|
-
if (queryParams.metadata) {
|
|
90
|
-
for (const [key, value] of Object.entries(queryParams.metadata)) {
|
|
91
|
-
const values = Array.isArray(value) ? value : [value];
|
|
92
|
-
values.forEach(v => {
|
|
93
|
-
if (key.toLowerCase() === "color") {
|
|
94
|
-
// Map color in metadata to option_value[]
|
|
95
|
-
params.append("option_value[]", String(v));
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
// Standard metadata format: metadata[key]=value
|
|
99
|
-
params.append(`metadata[${key}]`, String(v));
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
finalQuery = params;
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
// Standard endpoint - only merge known safe Medusa keys from queryParams
|
|
108
|
-
// to avoid "Unrecognized fields" errors
|
|
109
|
-
const safeKeys = ["order", "id", "handle", "status", "created_at", "updated_at", "type_id"];
|
|
110
|
-
for (const key of safeKeys) {
|
|
111
|
-
if (queryParams && queryParams[key]) {
|
|
112
|
-
finalQuery[key] = queryParams[key];
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
// Use the appended query string to avoid SDK's default serialization issues with brackets
|
|
117
|
-
const requestUrl = hasAdvancedFilters ? `${endpoint}?${finalQuery.toString()}` : endpoint;
|
|
118
|
-
return sdk.client
|
|
119
|
-
.fetch(requestUrl, {
|
|
120
|
-
method: "GET",
|
|
121
|
-
query: hasAdvancedFilters ? undefined : finalQuery,
|
|
122
|
-
headers,
|
|
123
|
-
next: {
|
|
124
|
-
...next,
|
|
125
|
-
revalidate: 0, // Disable Next.js cache for now to show logs
|
|
126
|
-
},
|
|
127
|
-
cache: "no-store", // Ensure it hits backend every time for testing
|
|
128
|
-
})
|
|
129
|
-
.then(({ products, count }) => {
|
|
130
|
-
const nextPage = count > offset + limit ? _pageParam + 1 : null;
|
|
131
|
-
if (products && products.length > 0) {
|
|
132
|
-
}
|
|
133
|
-
return {
|
|
134
|
-
response: {
|
|
135
|
-
products: products || [],
|
|
136
|
-
count: count || 0,
|
|
137
|
-
},
|
|
138
|
-
nextPage: nextPage,
|
|
139
|
-
queryParams,
|
|
140
|
-
};
|
|
141
|
-
})
|
|
142
|
-
.catch((error) => {
|
|
143
|
-
throw error;
|
|
28
|
+
regionId: region.id,
|
|
29
|
+
queryParams: queryParams,
|
|
144
30
|
});
|
|
31
|
+
return {
|
|
32
|
+
response: {
|
|
33
|
+
products: products,
|
|
34
|
+
count,
|
|
35
|
+
},
|
|
36
|
+
nextPage,
|
|
37
|
+
queryParams,
|
|
38
|
+
};
|
|
145
39
|
};
|
|
146
|
-
/**
|
|
147
|
-
* This will fetch 100 products to the Next.js cache and sort them based on the sortBy parameter.
|
|
148
|
-
* It will then return the paginated products based on the page and limit parameters.
|
|
149
|
-
*/
|
|
150
40
|
export const listProductsWithSort = async ({ page = 1, queryParams, sortBy = "created_at_desc", countryCode, }) => {
|
|
151
41
|
const limit = queryParams?.limit || 12;
|
|
152
|
-
|
|
153
|
-
// This ensures the backend terminal logs the specific request
|
|
154
|
-
const { response: { products, count }, } = await listProducts({
|
|
42
|
+
const { response: { products, count }, nextPage, } = await listProducts({
|
|
155
43
|
pageParam: page,
|
|
156
44
|
queryParams: {
|
|
157
45
|
...queryParams,
|
|
@@ -159,21 +47,15 @@ export const listProductsWithSort = async ({ page = 1, queryParams, sortBy = "cr
|
|
|
159
47
|
},
|
|
160
48
|
countryCode,
|
|
161
49
|
});
|
|
162
|
-
// Sorting is now handled natively by the backend API via the 'order' query param.
|
|
163
|
-
const finalProducts = products;
|
|
164
|
-
const nextPage = count > page * limit ? page + 1 : null;
|
|
165
50
|
return {
|
|
166
51
|
response: {
|
|
167
|
-
products
|
|
52
|
+
products,
|
|
168
53
|
count,
|
|
169
54
|
},
|
|
170
55
|
nextPage,
|
|
171
56
|
queryParams,
|
|
172
57
|
};
|
|
173
58
|
};
|
|
174
|
-
/**
|
|
175
|
-
* Fetch products that have a specific tag value
|
|
176
|
-
*/
|
|
177
59
|
export async function getProductsByTag({ tagValue, limit = 12, countryCode, }) {
|
|
178
60
|
try {
|
|
179
61
|
const result = await listProducts({
|
|
@@ -187,88 +69,77 @@ export async function getProductsByTag({ tagValue, limit = 12, countryCode, }) {
|
|
|
187
69
|
return [];
|
|
188
70
|
}
|
|
189
71
|
}
|
|
190
|
-
|
|
191
|
-
* Fetch dynamic filter options from the backend API
|
|
192
|
-
*/
|
|
193
|
-
export const getDynamicFilters = async (countryCode) => {
|
|
194
|
-
const backendUrl = process.env.MEDUSA_BACKEND_URL || "http://localhost:9000";
|
|
195
|
-
const publishableKey = process.env.NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY;
|
|
72
|
+
export const getDynamicFilters = async (_countryCode) => {
|
|
196
73
|
try {
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
const response = await fetch(`${backendUrl}/store/product-helper/filters`, {
|
|
200
|
-
method: "GET",
|
|
201
|
-
headers: {
|
|
202
|
-
"Content-Type": "application/json",
|
|
203
|
-
"x-publishable-api-key": publishableKey,
|
|
204
|
-
},
|
|
205
|
-
cache: "no-store",
|
|
206
|
-
});
|
|
207
|
-
if (!response.ok) {
|
|
74
|
+
const options = await getStoreClientOptions();
|
|
75
|
+
if (!options.publishableApiKey) {
|
|
208
76
|
return { genders: [], productTypes: [], materials: [], colors: [] };
|
|
209
77
|
}
|
|
210
|
-
const data = await
|
|
78
|
+
const data = await medusaProductHelperFilters(options);
|
|
211
79
|
const formatLabel = (str) => {
|
|
212
80
|
return str
|
|
213
81
|
.split(/[_-]/)
|
|
214
|
-
.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
215
|
-
.join(
|
|
82
|
+
.map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
83
|
+
.join(" ");
|
|
216
84
|
};
|
|
217
85
|
const metadata = data.metadata || {};
|
|
218
86
|
const variantOptions = data.variant_options || [];
|
|
219
|
-
// Gather all unique colors from all possible sources
|
|
220
87
|
const colorSet = new Set();
|
|
221
|
-
// 1. From variant options (check all options with title 'color')
|
|
222
88
|
variantOptions.forEach((o) => {
|
|
223
|
-
if (o.option_title.toLowerCase() ===
|
|
89
|
+
if (o.option_title.toLowerCase() === "color" || o.option_title.toLowerCase() === "colour") {
|
|
224
90
|
o.values?.forEach((v) => {
|
|
225
91
|
if (v)
|
|
226
92
|
colorSet.add(v.trim().toLowerCase());
|
|
227
93
|
});
|
|
228
94
|
}
|
|
229
95
|
});
|
|
230
|
-
// 2. From metadata colors (handle newline/comma separated values)
|
|
231
96
|
if (metadata.color) {
|
|
232
97
|
metadata.color.forEach((c) => {
|
|
233
98
|
if (c) {
|
|
234
|
-
const parts = c
|
|
235
|
-
|
|
99
|
+
const parts = c
|
|
100
|
+
.split(/[,/\n\r]+/)
|
|
101
|
+
.map((s) => s.trim())
|
|
102
|
+
.filter(Boolean);
|
|
103
|
+
parts.forEach((p) => colorSet.add(p.toLowerCase()));
|
|
236
104
|
}
|
|
237
105
|
});
|
|
238
106
|
}
|
|
239
107
|
return {
|
|
240
108
|
genders: (metadata.gender || []).sort().map((g) => ({
|
|
241
109
|
value: g,
|
|
242
|
-
label: formatLabel(g)
|
|
110
|
+
label: formatLabel(g),
|
|
243
111
|
})),
|
|
244
|
-
productTypes: (data.product_types || [])
|
|
112
|
+
productTypes: (data.product_types || [])
|
|
113
|
+
.sort((a, b) => a.label.localeCompare(b.label))
|
|
114
|
+
.map((t) => ({
|
|
245
115
|
value: t.label,
|
|
246
|
-
label: formatLabel(t.label)
|
|
116
|
+
label: formatLabel(t.label),
|
|
247
117
|
})),
|
|
248
118
|
materials: (metadata.material || []).sort().map((m) => ({
|
|
249
119
|
value: m,
|
|
250
|
-
label: formatLabel(m)
|
|
120
|
+
label: formatLabel(m),
|
|
251
121
|
})),
|
|
252
|
-
colors: Array.from(colorSet)
|
|
122
|
+
colors: Array.from(colorSet)
|
|
123
|
+
.sort()
|
|
124
|
+
.map((c) => {
|
|
253
125
|
let hex = "";
|
|
254
126
|
try {
|
|
255
|
-
|
|
256
|
-
hex = Color(c.replace(/\s+/g, '').toLowerCase()).hex();
|
|
127
|
+
hex = Color(c.replace(/\s+/g, "").toLowerCase()).hex();
|
|
257
128
|
}
|
|
258
|
-
catch
|
|
129
|
+
catch {
|
|
259
130
|
try {
|
|
260
131
|
hex = Color(c.toLowerCase()).hex();
|
|
261
132
|
}
|
|
262
|
-
catch
|
|
263
|
-
//
|
|
133
|
+
catch {
|
|
134
|
+
// no hex
|
|
264
135
|
}
|
|
265
136
|
}
|
|
266
137
|
return {
|
|
267
138
|
value: c,
|
|
268
139
|
label: formatLabel(c),
|
|
269
|
-
hex
|
|
140
|
+
hex,
|
|
270
141
|
};
|
|
271
|
-
})
|
|
142
|
+
}),
|
|
272
143
|
};
|
|
273
144
|
}
|
|
274
145
|
catch (error) {
|
|
@@ -276,10 +147,8 @@ export const getDynamicFilters = async (countryCode) => {
|
|
|
276
147
|
return { genders: [], productTypes: [], materials: [], colors: [] };
|
|
277
148
|
}
|
|
278
149
|
};
|
|
279
|
-
/**
|
|
280
|
-
* Fetch a single product by its handle
|
|
281
|
-
*/
|
|
282
150
|
export async function getProductByHandle(handle) {
|
|
283
|
-
const
|
|
284
|
-
|
|
151
|
+
const options = await getStoreClientOptions();
|
|
152
|
+
const product = await medusaProductByHandle(handle, options);
|
|
153
|
+
return product;
|
|
285
154
|
}
|
package/dist/server/regions.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { HttpTypes } from "@medusajs/types";
|
|
2
2
|
export declare const listRegions: () => Promise<HttpTypes.StoreRegion[]>;
|
|
3
3
|
export declare const retrieveRegion: (id: string) => Promise<HttpTypes.StoreRegion>;
|
|
4
|
-
export declare const getRegion: (countryCode: string) => Promise<HttpTypes.StoreRegion>;
|
|
4
|
+
export declare const getRegion: (countryCode: string) => Promise<HttpTypes.StoreRegion | null | undefined>;
|
|
5
5
|
//# sourceMappingURL=regions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"regions.d.ts","sourceRoot":"","sources":["../../src/server/regions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"regions.d.ts","sourceRoot":"","sources":["../../src/server/regions.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAK3C,eAAO,MAAM,WAAW,wCAavB,CAAA;AAED,eAAO,MAAM,cAAc,GAAU,IAAI,MAAM,mCAa9C,CAAA;AAID,eAAO,MAAM,SAAS,GAAU,aAAa,MAAM,sDA2BlD,CAAA"}
|
package/dist/server/regions.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
import { sdk } from "../config";
|
|
3
3
|
import medusaError from "../util/medusa-error";
|
|
4
4
|
import { getCacheOptions } from "../cookies";
|
|
5
|
+
import { medusaRegionList } from "medusa-services/regions";
|
|
6
|
+
import { getStoreCartClientOptions } from "../util/store-client";
|
|
5
7
|
export const listRegions = async () => {
|
|
6
8
|
const next = {
|
|
7
9
|
...(await getCacheOptions("regions")),
|
|
@@ -34,8 +36,9 @@ export const getRegion = async (countryCode) => {
|
|
|
34
36
|
if (regionMap.has(countryCode)) {
|
|
35
37
|
return regionMap.get(countryCode);
|
|
36
38
|
}
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
+
const options = await getStoreCartClientOptions();
|
|
40
|
+
const { regions } = await medusaRegionList(options);
|
|
41
|
+
if (!regions?.length) {
|
|
39
42
|
return null;
|
|
40
43
|
}
|
|
41
44
|
regions.forEach((region) => {
|
|
@@ -46,7 +49,7 @@ export const getRegion = async (countryCode) => {
|
|
|
46
49
|
const region = countryCode
|
|
47
50
|
? regionMap.get(countryCode)
|
|
48
51
|
: regionMap.get("us");
|
|
49
|
-
return region;
|
|
52
|
+
return region ?? null;
|
|
50
53
|
}
|
|
51
54
|
catch (e) {
|
|
52
55
|
return null;
|
package/dist/server/returns.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { HttpTypes } from "@medusajs/types";
|
|
2
|
-
export declare const listReturnReasons: () => Promise<
|
|
2
|
+
export declare const listReturnReasons: () => Promise<import("medusa-services/returns").StoreReturnReason[]>;
|
|
3
3
|
export declare const listReturnShippingOptions: (cartId: string, regionId?: string, productIds?: string[]) => Promise<HttpTypes.StoreShippingOption[]>;
|
|
4
4
|
export declare const createReturnRequest: (state: {
|
|
5
5
|
success: boolean;
|
|
@@ -15,15 +15,15 @@ export declare const createReturnRequest: (state: {
|
|
|
15
15
|
*/
|
|
16
16
|
export declare const updateReturnPayment: (returnId: string, paymentId: string) => Promise<{
|
|
17
17
|
success: boolean;
|
|
18
|
-
data:
|
|
18
|
+
data: unknown;
|
|
19
19
|
error?: undefined;
|
|
20
20
|
} | {
|
|
21
21
|
success: boolean;
|
|
22
|
-
error:
|
|
22
|
+
error: string;
|
|
23
23
|
data?: undefined;
|
|
24
24
|
}>;
|
|
25
25
|
/**
|
|
26
26
|
* List returns for an order or customer
|
|
27
27
|
*/
|
|
28
|
-
export declare const listReturns: (orderId?: string) => Promise<
|
|
28
|
+
export declare const listReturns: (orderId?: string) => Promise<import("medusa-services/returns").StoreReturnListResponse>;
|
|
29
29
|
//# sourceMappingURL=returns.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"returns.d.ts","sourceRoot":"","sources":["../../src/server/returns.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"returns.d.ts","sourceRoot":"","sources":["../../src/server/returns.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAK3C,eAAO,MAAM,iBAAiB,sEAG7B,CAAA;AAED,eAAO,MAAM,yBAAyB,GACpC,QAAQ,MAAM,EACd,WAAW,MAAM,EACjB,aAAa,MAAM,EAAE,KACpB,OAAO,CAAC,SAAS,CAAC,mBAAmB,EAAE,CAOzC,CAAA;AAED,eAAO,MAAM,mBAAmB,GAC9B,OAAO;IACL,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,MAAM,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAA;CACrC,EACD,UAAU,QAAQ,KACjB,OAAO,CAAC;IACT,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,MAAM,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAA;CACrC,CAmFA,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAU,UAAU,MAAM,EAAE,WAAW,MAAM;;;;;;;;EAa5E,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,WAAW,GAAU,UAAU,MAAM,uEA4BjD,CAAA"}
|