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.
Files changed (109) hide show
  1. package/dist/cookies.d.ts +2 -2
  2. package/dist/cookies.d.ts.map +1 -1
  3. package/dist/edge.d.ts +3 -0
  4. package/dist/edge.d.ts.map +1 -0
  5. package/dist/edge.js +1 -0
  6. package/dist/middleware.d.ts +3 -0
  7. package/dist/middleware.d.ts.map +1 -0
  8. package/dist/middleware.js +1 -0
  9. package/dist/server/cart.d.ts +9 -5
  10. package/dist/server/cart.d.ts.map +1 -1
  11. package/dist/server/cart.js +164 -194
  12. package/dist/server/categories.d.ts +3 -2
  13. package/dist/server/categories.d.ts.map +1 -1
  14. package/dist/server/categories.js +14 -51
  15. package/dist/server/collections.d.ts.map +1 -1
  16. package/dist/server/collections.js +16 -61
  17. package/dist/server/contact.d.ts +34 -0
  18. package/dist/server/contact.d.ts.map +1 -0
  19. package/dist/server/contact.js +57 -0
  20. package/dist/server/customer.d.ts +7 -7
  21. package/dist/server/customer.d.ts.map +1 -1
  22. package/dist/server/customer.js +95 -145
  23. package/dist/server/dynamic-config.d.ts.map +1 -1
  24. package/dist/server/dynamic-config.js +5 -2
  25. package/dist/server/fulfillment.d.ts +4 -3
  26. package/dist/server/fulfillment.d.ts.map +1 -1
  27. package/dist/server/fulfillment.js +16 -41
  28. package/dist/server/guest.d.ts +35 -63
  29. package/dist/server/guest.d.ts.map +1 -1
  30. package/dist/server/guest.js +81 -202
  31. package/dist/server/home.d.ts +15 -0
  32. package/dist/server/home.d.ts.map +1 -0
  33. package/dist/server/home.js +45 -0
  34. package/dist/server/index.d.ts +2 -0
  35. package/dist/server/index.d.ts.map +1 -1
  36. package/dist/server/index.js +2 -0
  37. package/dist/server/locale-actions.d.ts +1 -1
  38. package/dist/server/locale-actions.d.ts.map +1 -1
  39. package/dist/server/locale-actions.js +8 -13
  40. package/dist/server/locales.d.ts +2 -4
  41. package/dist/server/locales.d.ts.map +1 -1
  42. package/dist/server/locales.js +5 -13
  43. package/dist/server/orders.d.ts +5 -11
  44. package/dist/server/orders.d.ts.map +1 -1
  45. package/dist/server/orders.js +126 -267
  46. package/dist/server/payment-details.d.ts +4 -4
  47. package/dist/server/payment-details.d.ts.map +1 -1
  48. package/dist/server/payment-details.js +17 -42
  49. package/dist/server/payment.d.ts +2 -1
  50. package/dist/server/payment.d.ts.map +1 -1
  51. package/dist/server/payment.js +9 -21
  52. package/dist/server/pincode.d.ts +7 -0
  53. package/dist/server/pincode.d.ts.map +1 -0
  54. package/dist/server/pincode.js +30 -0
  55. package/dist/server/products.d.ts +15 -19
  56. package/dist/server/products.d.ts.map +1 -1
  57. package/dist/server/products.js +47 -178
  58. package/dist/server/regions.d.ts +1 -1
  59. package/dist/server/regions.d.ts.map +1 -1
  60. package/dist/server/regions.js +6 -3
  61. package/dist/server/returns.d.ts +4 -4
  62. package/dist/server/returns.d.ts.map +1 -1
  63. package/dist/server/returns.js +50 -154
  64. package/dist/server/swaps.d.ts +3 -3
  65. package/dist/server/swaps.d.ts.map +1 -1
  66. package/dist/server/swaps.js +22 -56
  67. package/dist/server/variants.d.ts.map +1 -1
  68. package/dist/server/variants.js +11 -22
  69. package/dist/server/wishlist.d.ts +11 -0
  70. package/dist/server/wishlist.d.ts.map +1 -0
  71. package/dist/server/wishlist.js +49 -0
  72. package/dist/util/get-locale-header.d.ts +1 -1
  73. package/dist/util/revalidate-cart.d.ts +2 -0
  74. package/dist/util/revalidate-cart.d.ts.map +1 -0
  75. package/dist/util/revalidate-cart.js +8 -0
  76. package/dist/util/sort-products.d.ts +3 -0
  77. package/dist/util/sort-products.d.ts.map +1 -0
  78. package/dist/util/sort-products.js +1 -0
  79. package/dist/util/store-client.d.ts +13 -0
  80. package/dist/util/store-client.d.ts.map +1 -0
  81. package/dist/util/store-client.js +77 -0
  82. package/package.json +95 -37
  83. package/src/edge.ts +2 -0
  84. package/src/middleware.ts +2 -2
  85. package/src/server/cart.ts +214 -267
  86. package/src/server/categories.ts +19 -72
  87. package/src/server/collections.ts +25 -82
  88. package/src/server/contact.ts +92 -0
  89. package/src/server/customer.ts +140 -189
  90. package/src/server/dynamic-config.ts +6 -2
  91. package/src/server/fulfillment.ts +27 -53
  92. package/src/server/guest.ts +159 -276
  93. package/src/server/home.ts +68 -0
  94. package/src/server/index.ts +1 -0
  95. package/src/server/locale-actions.ts +8 -15
  96. package/src/server/locales.ts +6 -18
  97. package/src/server/orders.ts +167 -337
  98. package/src/server/payment-details.ts +24 -52
  99. package/src/server/payment.ts +8 -28
  100. package/src/server/pincode.ts +49 -0
  101. package/src/server/products.ts +72 -235
  102. package/src/server/regions.ts +10 -6
  103. package/src/server/returns.ts +75 -189
  104. package/src/server/swaps.ts +90 -121
  105. package/src/server/variants.ts +9 -28
  106. package/src/util/revalidate-cart.ts +10 -0
  107. package/src/util/sort-products.ts +2 -47
  108. package/src/util/store-client.ts +93 -0
  109. 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":"AAKA,eAAO,MAAM,kBAAkB,oBAyB9B,CAAA;AAED,eAAO,MAAM,mBAAmB,GAC5B,MAAM,KAAK,GAAG,MAAM,GAAG,MAAM,EAC7B,aAAa,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,iBAWtC,CAAA;AAED,eAAO,MAAM,wBAAwB,GAAU,IAAI,MAAM,iBASxD,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAU,IAAI,MAAM,iBASnD,CAAA"}
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 { sdk } from "../config";
3
- import { getAuthHeaders, getCacheOptions } from "../cookies";
2
+ import { medusaPaymentDetailCreate, medusaPaymentDetailDelete, medusaPaymentDetailMakeDefault, medusaPaymentDetailsList, } from "medusa-services/payment";
3
+ import { getStoreCartClientOptions } from "../util/store-client";
4
4
  export const listPaymentDetails = async () => {
5
- const authHeaders = await getAuthHeaders();
6
- // If no auth headers (guest user), don't even try to fetch
7
- if (!authHeaders || Object.keys(authHeaders).length === 0) {
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 headers = {
28
- ...(await getAuthHeaders()),
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 headers = {
38
- ...(await getAuthHeaders()),
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 headers = {
47
- ...(await getAuthHeaders()),
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
  };
@@ -1,2 +1,3 @@
1
- export declare const listCartPaymentMethods: (regionId: string) => Promise<any>;
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":"AAMA,eAAO,MAAM,sBAAsB,GAAU,UAAU,MAAM,iBA4B5D,CAAA"}
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"}
@@ -1,25 +1,13 @@
1
1
  "use server";
2
- import { sdk } from "../config";
3
- import { getAuthHeaders, getCacheOptions } from "../cookies";
2
+ import { medusaPaymentProvidersList } from "medusa-services/payment";
3
+ import { getStoreCartClientOptions } from "../util/store-client";
4
4
  export const listCartPaymentMethods = async (regionId) => {
5
- const headers = {
6
- ...(await getAuthHeaders()),
7
- };
8
- const next = {
9
- ...(await getCacheOptions("payment_providers")),
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
- * Fetch dynamic filter options from the backend API
43
- */
44
- export declare const getDynamicFilters: (countryCode: string) => Promise<{
45
- genders: any;
46
- productTypes: any;
47
- materials: any;
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":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,yDAAyD,CAAA;AAKrF,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,CA6KA,CAAA;AAED;;;GAGG;AACH,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,CA6BA,CAAA;AAED;;GAEG;AACH,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;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAU,aAAa,MAAM;;;;;;;;;EA0F1D,CAAA;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,mCAOtD"}
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"}
@@ -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 headers = {
27
- ...(await getAuthHeaders()),
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
- offset,
36
- region_id: region?.id,
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
- // Directly fetch from backend with correct pagination
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: finalProducts,
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
- if (!publishableKey)
198
- return { genders: [], productTypes: [], materials: [], colors: [] };
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 response.json();
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() === 'color' || o.option_title.toLowerCase() === 'colour') {
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.split(/[,/\n\r]+/).map(s => s.trim()).filter(Boolean);
235
- parts.forEach(p => colorSet.add(p.toLowerCase()));
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 || []).sort((a, b) => a.label.localeCompare(b.label)).map((t) => ({
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).sort().map((c) => {
122
+ colors: Array.from(colorSet)
123
+ .sort()
124
+ .map((c) => {
253
125
  let hex = "";
254
126
  try {
255
- // Try to resolve color hex code using the Color library
256
- hex = Color(c.replace(/\s+/g, '').toLowerCase()).hex();
127
+ hex = Color(c.replace(/\s+/g, "").toLowerCase()).hex();
257
128
  }
258
- catch (e) {
129
+ catch {
259
130
  try {
260
131
  hex = Color(c.toLowerCase()).hex();
261
132
  }
262
- catch (e2) {
263
- // No hex found
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 result = await sdk.store.product.list({ handle, fields: "*variants.calculated_price,+variants.inventory_quantity,+variants.manage_inventory,+variants.allow_backorder,*variants.options,*options,*options.values,*images,*thumbnail,+metadata" }, { next: { tags: ["products"] } });
284
- return result.products[0];
151
+ const options = await getStoreClientOptions();
152
+ const product = await medusaProductByHandle(handle, options);
153
+ return product;
285
154
  }
@@ -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":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAG3C,eAAO,MAAM,WAAW,wCAavB,CAAA;AAED,eAAO,MAAM,cAAc,GAAU,IAAI,MAAM,mCAa9C,CAAA;AAID,eAAO,MAAM,SAAS,GAAU,aAAa,MAAM,mCA0BlD,CAAA"}
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"}
@@ -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 regions = await listRegions();
38
- if (!regions) {
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;
@@ -1,5 +1,5 @@
1
1
  import { HttpTypes } from "@medusajs/types";
2
- export declare const listReturnReasons: () => Promise<any[] | HttpTypes.StoreReturnReason[]>;
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: any;
18
+ data: unknown;
19
19
  error?: undefined;
20
20
  } | {
21
21
  success: boolean;
22
- error: any;
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<any>;
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":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAK3C,eAAO,MAAM,iBAAiB,sDAkB7B,CAAA;AAED,eAAO,MAAM,yBAAyB,GACpC,QAAQ,MAAM,EACd,WAAW,MAAM,EACjB,aAAa,MAAM,EAAE,KACpB,OAAO,CAAC,SAAS,CAAC,mBAAmB,EAAE,CAmEzC,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,CA2GA,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAU,UAAU,MAAM,EAAE,WAAW,MAAM;;;;;;;;EAoB5E,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,WAAW,GAAU,UAAU,MAAM,iBA4CjD,CAAA"}
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"}