@akinon/next 1.107.0-rc.86 → 1.107.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 (40) hide show
  1. package/CHANGELOG.md +37 -1299
  2. package/__tests__/next-config.test.ts +10 -1
  3. package/bin/pz-prebuild.js +0 -1
  4. package/components/input.tsx +0 -2
  5. package/components/link.tsx +12 -16
  6. package/components/plugin-module.tsx +2 -0
  7. package/components/selected-payment-option-view.tsx +9 -0
  8. package/data/client/checkout.ts +2 -4
  9. package/data/server/category.ts +24 -44
  10. package/data/server/flatpage.ts +12 -16
  11. package/data/server/landingpage.ts +12 -16
  12. package/data/server/list.ts +13 -23
  13. package/data/server/special-page.ts +12 -16
  14. package/data/urls.ts +1 -5
  15. package/hocs/server/with-segment-defaults.tsx +2 -5
  16. package/hooks/use-localization.ts +3 -2
  17. package/middlewares/complete-gpay.ts +1 -2
  18. package/middlewares/complete-masterpass.ts +1 -2
  19. package/middlewares/complete-wallet.ts +179 -0
  20. package/middlewares/default.ts +3 -0
  21. package/middlewares/index.ts +2 -0
  22. package/middlewares/locale.ts +1 -10
  23. package/middlewares/redirection-payment.ts +1 -2
  24. package/middlewares/saved-card-redirection.ts +1 -2
  25. package/middlewares/three-d-redirection.ts +1 -2
  26. package/package.json +2 -2
  27. package/plugins.d.ts +11 -7
  28. package/plugins.js +1 -0
  29. package/redux/middlewares/checkout.ts +1 -5
  30. package/redux/middlewares/index.ts +6 -7
  31. package/redux/reducers/index.ts +3 -1
  32. package/types/commerce/order.ts +0 -1
  33. package/types/index.ts +0 -6
  34. package/utils/app-fetch.ts +2 -7
  35. package/utils/redirect.ts +3 -22
  36. package/__tests__/redirect.test.ts +0 -319
  37. package/api/image-proxy.ts +0 -75
  38. package/api/similar-product-list.ts +0 -84
  39. package/api/similar-products.ts +0 -120
  40. package/data/server/basket.ts +0 -72
@@ -1,84 +0,0 @@
1
- import { NextRequest, NextResponse } from 'next/server';
2
- import { cookies } from 'next/headers';
3
- import Settings from 'settings';
4
- import { ServerVariables } from '../utils/server-variables';
5
-
6
- export async function GET(request: NextRequest) {
7
- try {
8
- const { searchParams } = new URL(request.url);
9
- const dynamicFilter = request.headers.get('x-search-dynamic-filter');
10
- const dynamicExclude = request.headers.get('x-search-dynamic-exclude');
11
-
12
- const nextCookies = cookies();
13
- const currency =
14
- nextCookies.get('pz-currency')?.value || ServerVariables.currency;
15
- const locale =
16
- nextCookies.get('pz-locale')?.value || ServerVariables.locale;
17
-
18
- if (!dynamicFilter && !dynamicExclude) {
19
- return NextResponse.json(
20
- {
21
- error:
22
- 'Missing x-search-dynamic-filter or x-search-dynamic-exclude header'
23
- },
24
- { status: 400 }
25
- );
26
- }
27
-
28
- if (Settings.commerceUrl === 'default') {
29
- return NextResponse.json(
30
- { error: 'Commerce URL is not configured' },
31
- { status: 500 }
32
- );
33
- }
34
-
35
- const queryString = searchParams.toString();
36
- const apiUrl = `${Settings.commerceUrl}/list${
37
- queryString ? `?${queryString}` : ''
38
- }`;
39
-
40
- const headers: Record<string, string> = {
41
- Accept: 'application/json',
42
- 'Content-Type': 'application/json'
43
- };
44
-
45
- if (dynamicFilter) {
46
- headers['x-search-dynamic-filter'] = dynamicFilter;
47
- } else if (dynamicExclude) {
48
- headers['x-search-dynamic-exclude'] = dynamicExclude;
49
- }
50
-
51
- if (currency) {
52
- headers['x-currency'] = currency;
53
- }
54
-
55
- if (locale) {
56
- const currentLocale = Settings.localization.locales.find(
57
- (l) => l.value === locale
58
- );
59
- if (currentLocale) {
60
- headers['Accept-Language'] = currentLocale.apiValue;
61
- }
62
- }
63
-
64
- const response = await fetch(apiUrl, {
65
- method: 'GET',
66
- headers
67
- });
68
-
69
- if (!response.ok) {
70
- return NextResponse.json(
71
- { error: `API request failed with status: ${response.status}` },
72
- { status: response.status }
73
- );
74
- }
75
-
76
- const data = await response.json();
77
- return NextResponse.json(data);
78
- } catch (error) {
79
- return NextResponse.json(
80
- { error: (error as Error).message },
81
- { status: 500 }
82
- );
83
- }
84
- }
@@ -1,120 +0,0 @@
1
- import { NextResponse } from 'next/server';
2
- import Settings from 'settings';
3
-
4
- const IMAGE_SEARCH_API_URL = Settings.commerceUrl + '/image-search/';
5
-
6
- const errorResponse = (message: string, status: number) => {
7
- return NextResponse.json({ error: message }, { status });
8
- };
9
-
10
- export async function GET(request: Request) {
11
- const { searchParams } = new URL(request.url);
12
- const limit = searchParams.get('limit') || '20';
13
- const url = searchParams.get('url');
14
- const excludedProductIds = searchParams.get('excluded_product_ids');
15
- const text = searchParams.get('text');
16
-
17
- if (!url) {
18
- return errorResponse('URL parameter is required', 400);
19
- }
20
-
21
- if (Settings.commerceUrl === 'default') {
22
- return errorResponse('Commerce URL is not configured', 500);
23
- }
24
-
25
- const apiParams = new URLSearchParams();
26
- apiParams.append('limit', limit);
27
- apiParams.append('url', url);
28
-
29
- if (excludedProductIds) {
30
- apiParams.append('excluded_product_ids', excludedProductIds);
31
- }
32
-
33
- if (text) {
34
- apiParams.append('text', text);
35
- }
36
-
37
- const apiUrl = `${IMAGE_SEARCH_API_URL}?${apiParams.toString()}`;
38
-
39
- try {
40
- const response = await fetch(apiUrl, {
41
- method: 'GET',
42
- headers: {
43
- Accept: 'application/json'
44
- }
45
- });
46
-
47
- if (!response.ok) {
48
- const errorText = await response.text();
49
- return errorResponse(
50
- errorText || `API request failed with status: ${response.status}`,
51
- response.status
52
- );
53
- }
54
-
55
- const responseText = await response.text();
56
-
57
- return NextResponse.json(JSON.parse(responseText));
58
- } catch (error) {
59
- return errorResponse((error as Error).message, 500);
60
- }
61
- }
62
-
63
- export async function POST(request: Request) {
64
- const { searchParams } = new URL(request.url);
65
- const limit = searchParams.get('limit') || '20';
66
-
67
- if (Settings.commerceUrl === 'default') {
68
- return errorResponse('Commerce URL is not configured', 500);
69
- }
70
-
71
- let requestBody;
72
- try {
73
- requestBody = await request.json();
74
- } catch (error) {
75
- return errorResponse('Invalid JSON in request body', 400);
76
- }
77
-
78
- if (!requestBody.image) {
79
- return errorResponse('Image data is required in request body', 400);
80
- }
81
-
82
- const apiParams = new URLSearchParams();
83
- apiParams.append('limit', limit);
84
-
85
- const apiUrl = `${IMAGE_SEARCH_API_URL}?${apiParams.toString()}`;
86
-
87
- const bodyData: any = { image: requestBody.image };
88
-
89
- if (requestBody.excluded_product_ids) {
90
- bodyData.excluded_product_ids = requestBody.excluded_product_ids;
91
- }
92
-
93
- if (requestBody.text) {
94
- bodyData.text = requestBody.text;
95
- }
96
-
97
- try {
98
- const response = await fetch(apiUrl, {
99
- method: 'POST',
100
- headers: {
101
- 'Content-Type': 'application/json',
102
- Accept: 'application/json'
103
- },
104
- body: JSON.stringify(bodyData)
105
- });
106
-
107
- if (!response.ok) {
108
- const errorText = await response.text();
109
- return errorResponse(
110
- errorText || `API request failed with status: ${response.status}`,
111
- response.status
112
- );
113
- }
114
-
115
- const responseData = await response.json();
116
- return NextResponse.json(responseData);
117
- } catch (error) {
118
- return errorResponse((error as Error).message, 500);
119
- }
120
- }
@@ -1,72 +0,0 @@
1
- import { Cache, CacheKey } from '../../lib/cache';
2
- import { basket } from '../../data/urls';
3
- import { Basket } from '../../types';
4
- import appFetch from '../../utils/app-fetch';
5
- import { ServerVariables } from '../../utils/server-variables';
6
- import logger from '../../utils/log';
7
-
8
- type GetBasketParams = {
9
- locale?: string;
10
- currency?: string;
11
- namespace?: string;
12
- };
13
-
14
- const getBasketDataHandler = ({
15
- locale,
16
- currency,
17
- namespace
18
- }: GetBasketParams) => {
19
- return async function () {
20
- try {
21
- const url = namespace
22
- ? basket.getBasketDetail(namespace)
23
- : basket.getBasket;
24
-
25
- const basketData = await appFetch<{ basket: Basket }>({
26
- url,
27
- locale,
28
- currency,
29
- init: {
30
- headers: {
31
- Accept: 'application/json',
32
- 'Content-Type': 'application/json'
33
- }
34
- }
35
- });
36
-
37
- if (!basketData?.basket) {
38
- logger.warn('Basket data is undefined', {
39
- handler: 'getBasketDataHandler',
40
- namespace
41
- });
42
- }
43
-
44
- return basketData;
45
- } catch (error) {
46
- logger.error('Error fetching basket data', {
47
- handler: 'getBasketDataHandler',
48
- error,
49
- namespace
50
- });
51
- throw error;
52
- }
53
- };
54
- };
55
-
56
- export const getBasketData = async ({
57
- locale = ServerVariables.locale,
58
- currency = ServerVariables.currency,
59
- namespace
60
- }: GetBasketParams = {}) => {
61
- return Cache.wrap(
62
- CacheKey.Basket(namespace),
63
- locale,
64
- getBasketDataHandler({ locale, currency, namespace }),
65
- {
66
- expire: 0,
67
- cache: false
68
- }
69
- );
70
- };
71
-
72
-