@akinon/next 1.13.0 → 1.14.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/.editorconfig +7 -0
- package/.eslintrc.js +40 -40
- package/.prettierrc +13 -13
- package/CHANGELOG.md +19 -0
- package/api/auth.ts +231 -231
- package/api/cache.ts +44 -44
- package/api/client.ts +174 -174
- package/api/logout.ts +42 -42
- package/assets/styles/index.scss +28 -28
- package/bin/pz-check-dependencies.js +98 -98
- package/bin/pz-install-plugins.js +33 -33
- package/bin/pz-install-theme.js +58 -58
- package/bin/pz-postbuild.js +1 -1
- package/bin/pz-postdev.js +1 -1
- package/bin/pz-postinstall.js +6 -6
- package/bin/pz-poststart.js +1 -1
- package/bin/pz-prebuild.js +4 -4
- package/bin/pz-predev.js +4 -4
- package/bin/pz-prestart.js +1 -1
- package/bin/run-script.js +44 -44
- package/components/accordion.tsx +52 -0
- package/components/button.tsx +46 -0
- package/components/client-root.tsx +19 -19
- package/components/icon.tsx +18 -18
- package/components/image.tsx +133 -133
- package/components/index.ts +17 -1
- package/components/input.tsx +110 -0
- package/components/lazy-component.tsx +33 -33
- package/components/loader-spinner.tsx +23 -23
- package/components/mobile-app-toggler.tsx +26 -26
- package/components/oauth-login.tsx +24 -24
- package/components/plugin-module.tsx +11 -8
- package/components/price.tsx +55 -0
- package/components/pz-providers.tsx +24 -24
- package/components/pz-root.tsx +21 -21
- package/components/radio.tsx +18 -18
- package/components/react-portal.tsx +45 -45
- package/components/redirect-three-d/content/index.tsx +74 -74
- package/components/redirect-three-d/index.tsx +17 -17
- package/components/selected-payment-option-view.tsx +7 -0
- package/components/trans.tsx +39 -39
- package/data/client/account.ts +208 -208
- package/data/client/address.ts +107 -107
- package/data/client/api.ts +85 -84
- package/data/client/b2b.ts +106 -106
- package/data/client/basket.ts +82 -82
- package/data/client/checkout.ts +516 -479
- package/data/client/misc.ts +101 -101
- package/data/client/product.ts +89 -89
- package/data/client/user.ts +99 -99
- package/data/client/wishlist.ts +118 -88
- package/data/server/category.ts +132 -128
- package/data/server/flatpage.ts +21 -21
- package/data/server/form.ts +22 -22
- package/data/server/index.ts +10 -10
- package/data/server/landingpage.ts +24 -24
- package/data/server/list.ts +67 -62
- package/data/server/menu.ts +35 -35
- package/data/server/product.ts +86 -86
- package/data/server/seo.ts +48 -48
- package/data/server/special-page.ts +47 -47
- package/data/server/widget.ts +27 -27
- package/data/urls.ts +221 -210
- package/hocs/client/index.ts +1 -1
- package/hocs/client/with-segment-defaults.tsx +25 -25
- package/hocs/server/index.ts +1 -1
- package/hocs/server/with-segment-defaults.tsx +85 -85
- package/hooks/index.ts +10 -10
- package/hooks/use-captcha.tsx +76 -76
- package/hooks/use-common-product-attributes.ts +36 -36
- package/hooks/use-debounce.ts +20 -20
- package/hooks/use-localization.ts +78 -78
- package/hooks/use-media-query.ts +36 -36
- package/hooks/use-mobile-iframe-handler.ts +23 -23
- package/hooks/use-on-click-outside.tsx +28 -28
- package/hooks/use-payment-options.ts +12 -16
- package/hooks/use-router.ts +45 -45
- package/hooks/use-translation.ts +14 -14
- package/lib/cache.ts +215 -215
- package/localization/index.ts +5 -5
- package/localization/provider.tsx +58 -58
- package/middlewares/currency.ts +100 -100
- package/middlewares/default.ts +256 -256
- package/middlewares/index.ts +29 -29
- package/middlewares/locale.ts +68 -68
- package/middlewares/oauth-login.ts +79 -79
- package/middlewares/pretty-url.ts +104 -104
- package/middlewares/redirection-payment.ts +160 -160
- package/middlewares/three-d-redirection.ts +159 -159
- package/middlewares/url-redirection.ts +65 -65
- package/package.json +2 -2
- package/plugins.js +2 -1
- package/redux/hooks.ts +7 -7
- package/redux/middlewares/checkout.ts +265 -260
- package/redux/middlewares/index.ts +50 -50
- package/redux/reducers/checkout.ts +184 -171
- package/redux/reducers/config.ts +28 -28
- package/redux/reducers/header.ts +59 -59
- package/redux/reducers/index.ts +14 -14
- package/redux/reducers/root.ts +61 -61
- package/sentry/index.ts +27 -27
- package/tailwind/rtl.js +137 -137
- package/types/commerce/account.ts +64 -64
- package/types/commerce/address.ts +94 -94
- package/types/commerce/b2b.ts +117 -117
- package/types/commerce/basket.ts +43 -43
- package/types/commerce/category.ts +114 -114
- package/types/commerce/checkout.ts +143 -136
- package/types/commerce/flatpage.ts +7 -7
- package/types/commerce/form.ts +66 -66
- package/types/commerce/index.ts +12 -12
- package/types/commerce/landingpage.ts +7 -7
- package/types/commerce/misc.ts +127 -127
- package/types/commerce/order.ts +119 -119
- package/types/commerce/product.ts +109 -109
- package/types/commerce/widget.ts +28 -28
- package/types/gtm.ts +16 -16
- package/types/index.ts +274 -237
- package/types/metadata.ts +7 -7
- package/types/next-auth.d.ts +24 -24
- package/utils/app-fetch.ts +69 -69
- package/utils/deep-merge.js +24 -24
- package/utils/generate-commerce-search-params.ts +22 -22
- package/utils/get-currency.ts +29 -29
- package/utils/image-loader.ts +31 -31
- package/utils/index.ts +150 -150
- package/utils/localization.ts +29 -29
- package/utils/log.ts +138 -138
- package/utils/menu-generator.ts +27 -27
- package/utils/mobile-3d-iframe.ts +77 -77
- package/utils/server-translation.ts +57 -57
- package/utils/server-variables.ts +9 -9
- package/with-pz-config.js +94 -94
package/middlewares/default.ts
CHANGED
|
@@ -1,256 +1,256 @@
|
|
|
1
|
-
import { NextFetchEvent, NextMiddleware, NextResponse } from 'next/server';
|
|
2
|
-
import Settings from 'settings';
|
|
3
|
-
import {
|
|
4
|
-
PzNextRequest,
|
|
5
|
-
withOauthLogin,
|
|
6
|
-
withPrettyUrl,
|
|
7
|
-
withRedirectionPayment,
|
|
8
|
-
withThreeDRedirection,
|
|
9
|
-
withUrlRedirection
|
|
10
|
-
} from '.';
|
|
11
|
-
import { urlLocaleMatcherRegex } from '../utils';
|
|
12
|
-
import withCurrency from './currency';
|
|
13
|
-
import withLocale from './locale';
|
|
14
|
-
import logger from '../utils/log';
|
|
15
|
-
import { user } from '../data/urls';
|
|
16
|
-
import { getUrlPathWithLocale } from '../utils/localization';
|
|
17
|
-
|
|
18
|
-
const withPzDefault =
|
|
19
|
-
(middleware: NextMiddleware) =>
|
|
20
|
-
async (req: PzNextRequest, event: NextFetchEvent) => {
|
|
21
|
-
const url = req.nextUrl.clone();
|
|
22
|
-
const commerceUrl = encodeURIComponent(decodeURI(Settings.commerceUrl)); // encodeURI doesn't work as expected in middleware
|
|
23
|
-
const searchParams = new URLSearchParams(url.search);
|
|
24
|
-
const ip = req.headers.get('x-forwarded-for') ?? '';
|
|
25
|
-
|
|
26
|
-
logger.debug('withPzDefault', {
|
|
27
|
-
url: url.href,
|
|
28
|
-
middlewareParams: req.middlewareParams,
|
|
29
|
-
ip
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
// Support legacy ?format=json query param
|
|
33
|
-
if (searchParams.has('json') || searchParams.get('format') === 'json') {
|
|
34
|
-
try {
|
|
35
|
-
searchParams.set('format', 'json');
|
|
36
|
-
|
|
37
|
-
const request = await fetch(
|
|
38
|
-
`${encodeURI(Settings.commerceUrl)}${url.pathname.replace(
|
|
39
|
-
urlLocaleMatcherRegex,
|
|
40
|
-
''
|
|
41
|
-
)}?${searchParams.toString()}`,
|
|
42
|
-
{
|
|
43
|
-
next: {
|
|
44
|
-
revalidate: 0
|
|
45
|
-
},
|
|
46
|
-
headers: {
|
|
47
|
-
Cookie: req.headers.get('cookie') || '',
|
|
48
|
-
Accept: 'application/json',
|
|
49
|
-
'X-Requested-With': 'XMLHttpRequest'
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
);
|
|
53
|
-
|
|
54
|
-
return NextResponse.json(await request.json());
|
|
55
|
-
} catch (error) {
|
|
56
|
-
logger.error('?format=json error', {
|
|
57
|
-
error,
|
|
58
|
-
ip
|
|
59
|
-
});
|
|
60
|
-
return NextResponse.next();
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (url.pathname === '/healthz') {
|
|
65
|
-
return NextResponse.json({ status: 'ok' });
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
if (req.nextUrl.pathname.startsWith('/.well-known')) {
|
|
69
|
-
const url = new URL(`${Settings.commerceUrl}${req.nextUrl.pathname}`);
|
|
70
|
-
const req_ = await fetch(url.toString());
|
|
71
|
-
|
|
72
|
-
if (req_.ok) {
|
|
73
|
-
return NextResponse.rewrite(url);
|
|
74
|
-
} else {
|
|
75
|
-
return NextResponse.next();
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
if (req.nextUrl.pathname.includes('/orders/hooks/')) {
|
|
80
|
-
return NextResponse.rewrite(
|
|
81
|
-
new URL(
|
|
82
|
-
`${Settings.commerceUrl}${req.nextUrl.pathname.replace(
|
|
83
|
-
urlLocaleMatcherRegex,
|
|
84
|
-
''
|
|
85
|
-
)}`
|
|
86
|
-
)
|
|
87
|
-
);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
if (req.nextUrl.pathname.startsWith('/orders/redirection/')) {
|
|
91
|
-
return NextResponse.rewrite(
|
|
92
|
-
new URL(`${encodeURI(Settings.commerceUrl)}/orders/redirection/`)
|
|
93
|
-
);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// If commerce redirects to /orders/checkout/ without locale
|
|
97
|
-
if (
|
|
98
|
-
req.nextUrl.pathname.match(new RegExp('^/orders/checkout/$')) &&
|
|
99
|
-
req.nextUrl.searchParams.size === 0 &&
|
|
100
|
-
getUrlPathWithLocale(
|
|
101
|
-
'/orders/checkout/',
|
|
102
|
-
req.cookies.get('pz-locale')?.value
|
|
103
|
-
) !== req.nextUrl.pathname
|
|
104
|
-
) {
|
|
105
|
-
const redirectUrlWithLocale = `${url.origin}${getUrlPathWithLocale(
|
|
106
|
-
'/orders/checkout/',
|
|
107
|
-
req.cookies.get('pz-locale')?.value
|
|
108
|
-
)}`;
|
|
109
|
-
|
|
110
|
-
return NextResponse.redirect(redirectUrlWithLocale, 303);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
req.middlewareParams = {
|
|
114
|
-
commerceUrl,
|
|
115
|
-
rewrites: {}
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
return withOauthLogin(
|
|
119
|
-
withLocale(
|
|
120
|
-
withCurrency(
|
|
121
|
-
withPrettyUrl(
|
|
122
|
-
withRedirectionPayment(
|
|
123
|
-
withThreeDRedirection(
|
|
124
|
-
withUrlRedirection(
|
|
125
|
-
async (req: PzNextRequest, event: NextFetchEvent) => {
|
|
126
|
-
let middlewareResult: NextResponse | void =
|
|
127
|
-
NextResponse.next();
|
|
128
|
-
|
|
129
|
-
try {
|
|
130
|
-
const { locale, prettyUrl, currency } =
|
|
131
|
-
req.middlewareParams.rewrites;
|
|
132
|
-
const { defaultLocaleValue } = Settings.localization;
|
|
133
|
-
const url = req.nextUrl.clone();
|
|
134
|
-
const pathnameWithoutLocale = url.pathname.replace(
|
|
135
|
-
urlLocaleMatcherRegex,
|
|
136
|
-
''
|
|
137
|
-
);
|
|
138
|
-
|
|
139
|
-
url.basePath = `/${commerceUrl}`;
|
|
140
|
-
url.pathname = `/${
|
|
141
|
-
locale.length ? `${locale}/` : ''
|
|
142
|
-
}${currency}${prettyUrl ?? pathnameWithoutLocale}`;
|
|
143
|
-
|
|
144
|
-
Settings.rewrites.forEach((rewrite) => {
|
|
145
|
-
url.pathname = url.pathname.replace(
|
|
146
|
-
rewrite.source,
|
|
147
|
-
rewrite.destination
|
|
148
|
-
);
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
middlewareResult = (await middleware(
|
|
152
|
-
req,
|
|
153
|
-
event
|
|
154
|
-
)) as NextResponse | void;
|
|
155
|
-
|
|
156
|
-
// if middleware.ts has a return value for current url
|
|
157
|
-
if (middlewareResult instanceof NextResponse) {
|
|
158
|
-
// pz-override-response header is used to prevent 404 page for custom responses.
|
|
159
|
-
if (
|
|
160
|
-
middlewareResult.headers.get(
|
|
161
|
-
'pz-override-response'
|
|
162
|
-
) !== 'true'
|
|
163
|
-
) {
|
|
164
|
-
middlewareResult.headers.set(
|
|
165
|
-
'x-middleware-rewrite',
|
|
166
|
-
url.href
|
|
167
|
-
);
|
|
168
|
-
}
|
|
169
|
-
} else {
|
|
170
|
-
// if middleware.ts doesn't have a return value.
|
|
171
|
-
// e.g. NextResponse.next() doesn't exist in middleware.ts
|
|
172
|
-
|
|
173
|
-
middlewareResult = NextResponse.rewrite(url);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
if (!url.pathname.startsWith(`/${currency}/orders`)) {
|
|
177
|
-
middlewareResult.cookies.set(
|
|
178
|
-
'pz-locale',
|
|
179
|
-
locale?.length > 0 ? locale : defaultLocaleValue,
|
|
180
|
-
{
|
|
181
|
-
sameSite: 'none',
|
|
182
|
-
secure: true,
|
|
183
|
-
expires: new Date(
|
|
184
|
-
Date.now() + 1000 * 60 * 60 * 24 * 7
|
|
185
|
-
) // 7 days
|
|
186
|
-
}
|
|
187
|
-
);
|
|
188
|
-
}
|
|
189
|
-
middlewareResult.cookies.set('pz-currency', currency, {
|
|
190
|
-
sameSite: 'none',
|
|
191
|
-
secure: true,
|
|
192
|
-
expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 7) // 7 days
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
if (
|
|
196
|
-
req.cookies.get('pz-locale') &&
|
|
197
|
-
req.cookies.get('pz-locale').value !== locale
|
|
198
|
-
) {
|
|
199
|
-
logger.debug('Locale changed', {
|
|
200
|
-
locale,
|
|
201
|
-
oldLocale: req.cookies.get('pz-locale')?.value,
|
|
202
|
-
ip
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
middlewareResult.headers.set(
|
|
207
|
-
'pz-url',
|
|
208
|
-
req.nextUrl.toString()
|
|
209
|
-
);
|
|
210
|
-
|
|
211
|
-
if (req.cookies.get('pz-set-currency')) {
|
|
212
|
-
middlewareResult.cookies.delete('pz-set-currency');
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
if (process.env.ACC_APP_VERSION) {
|
|
216
|
-
middlewareResult.headers.set(
|
|
217
|
-
'acc-app-version',
|
|
218
|
-
process.env.ACC_APP_VERSION
|
|
219
|
-
);
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
// Set CSRF token if not set
|
|
223
|
-
try {
|
|
224
|
-
const url = `${Settings.commerceUrl}${user.csrfToken}`;
|
|
225
|
-
|
|
226
|
-
if (!req.cookies.get('csrftoken')) {
|
|
227
|
-
const { csrf_token } = await (
|
|
228
|
-
await fetch(url)
|
|
229
|
-
).json();
|
|
230
|
-
middlewareResult.cookies.set('csrftoken', csrf_token);
|
|
231
|
-
}
|
|
232
|
-
} catch (error) {
|
|
233
|
-
logger.error('CSRF Error', {
|
|
234
|
-
error,
|
|
235
|
-
ip
|
|
236
|
-
});
|
|
237
|
-
}
|
|
238
|
-
} catch (error) {
|
|
239
|
-
logger.error('withPzDefault Error', {
|
|
240
|
-
error,
|
|
241
|
-
ip
|
|
242
|
-
});
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
return middlewareResult;
|
|
246
|
-
}
|
|
247
|
-
)
|
|
248
|
-
)
|
|
249
|
-
)
|
|
250
|
-
)
|
|
251
|
-
)
|
|
252
|
-
)
|
|
253
|
-
)(req, event);
|
|
254
|
-
};
|
|
255
|
-
|
|
256
|
-
export default withPzDefault;
|
|
1
|
+
import { NextFetchEvent, NextMiddleware, NextResponse } from 'next/server';
|
|
2
|
+
import Settings from 'settings';
|
|
3
|
+
import {
|
|
4
|
+
PzNextRequest,
|
|
5
|
+
withOauthLogin,
|
|
6
|
+
withPrettyUrl,
|
|
7
|
+
withRedirectionPayment,
|
|
8
|
+
withThreeDRedirection,
|
|
9
|
+
withUrlRedirection
|
|
10
|
+
} from '.';
|
|
11
|
+
import { urlLocaleMatcherRegex } from '../utils';
|
|
12
|
+
import withCurrency from './currency';
|
|
13
|
+
import withLocale from './locale';
|
|
14
|
+
import logger from '../utils/log';
|
|
15
|
+
import { user } from '../data/urls';
|
|
16
|
+
import { getUrlPathWithLocale } from '../utils/localization';
|
|
17
|
+
|
|
18
|
+
const withPzDefault =
|
|
19
|
+
(middleware: NextMiddleware) =>
|
|
20
|
+
async (req: PzNextRequest, event: NextFetchEvent) => {
|
|
21
|
+
const url = req.nextUrl.clone();
|
|
22
|
+
const commerceUrl = encodeURIComponent(decodeURI(Settings.commerceUrl)); // encodeURI doesn't work as expected in middleware
|
|
23
|
+
const searchParams = new URLSearchParams(url.search);
|
|
24
|
+
const ip = req.headers.get('x-forwarded-for') ?? '';
|
|
25
|
+
|
|
26
|
+
logger.debug('withPzDefault', {
|
|
27
|
+
url: url.href,
|
|
28
|
+
middlewareParams: req.middlewareParams,
|
|
29
|
+
ip
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// Support legacy ?format=json query param
|
|
33
|
+
if (searchParams.has('json') || searchParams.get('format') === 'json') {
|
|
34
|
+
try {
|
|
35
|
+
searchParams.set('format', 'json');
|
|
36
|
+
|
|
37
|
+
const request = await fetch(
|
|
38
|
+
`${encodeURI(Settings.commerceUrl)}${url.pathname.replace(
|
|
39
|
+
urlLocaleMatcherRegex,
|
|
40
|
+
''
|
|
41
|
+
)}?${searchParams.toString()}`,
|
|
42
|
+
{
|
|
43
|
+
next: {
|
|
44
|
+
revalidate: 0
|
|
45
|
+
},
|
|
46
|
+
headers: {
|
|
47
|
+
Cookie: req.headers.get('cookie') || '',
|
|
48
|
+
Accept: 'application/json',
|
|
49
|
+
'X-Requested-With': 'XMLHttpRequest'
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
return NextResponse.json(await request.json());
|
|
55
|
+
} catch (error) {
|
|
56
|
+
logger.error('?format=json error', {
|
|
57
|
+
error,
|
|
58
|
+
ip
|
|
59
|
+
});
|
|
60
|
+
return NextResponse.next();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (url.pathname === '/healthz') {
|
|
65
|
+
return NextResponse.json({ status: 'ok' });
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (req.nextUrl.pathname.startsWith('/.well-known')) {
|
|
69
|
+
const url = new URL(`${Settings.commerceUrl}${req.nextUrl.pathname}`);
|
|
70
|
+
const req_ = await fetch(url.toString());
|
|
71
|
+
|
|
72
|
+
if (req_.ok) {
|
|
73
|
+
return NextResponse.rewrite(url);
|
|
74
|
+
} else {
|
|
75
|
+
return NextResponse.next();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (req.nextUrl.pathname.includes('/orders/hooks/')) {
|
|
80
|
+
return NextResponse.rewrite(
|
|
81
|
+
new URL(
|
|
82
|
+
`${Settings.commerceUrl}${req.nextUrl.pathname.replace(
|
|
83
|
+
urlLocaleMatcherRegex,
|
|
84
|
+
''
|
|
85
|
+
)}`
|
|
86
|
+
)
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (req.nextUrl.pathname.startsWith('/orders/redirection/')) {
|
|
91
|
+
return NextResponse.rewrite(
|
|
92
|
+
new URL(`${encodeURI(Settings.commerceUrl)}/orders/redirection/`)
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// If commerce redirects to /orders/checkout/ without locale
|
|
97
|
+
if (
|
|
98
|
+
req.nextUrl.pathname.match(new RegExp('^/orders/checkout/$')) &&
|
|
99
|
+
req.nextUrl.searchParams.size === 0 &&
|
|
100
|
+
getUrlPathWithLocale(
|
|
101
|
+
'/orders/checkout/',
|
|
102
|
+
req.cookies.get('pz-locale')?.value
|
|
103
|
+
) !== req.nextUrl.pathname
|
|
104
|
+
) {
|
|
105
|
+
const redirectUrlWithLocale = `${url.origin}${getUrlPathWithLocale(
|
|
106
|
+
'/orders/checkout/',
|
|
107
|
+
req.cookies.get('pz-locale')?.value
|
|
108
|
+
)}`;
|
|
109
|
+
|
|
110
|
+
return NextResponse.redirect(redirectUrlWithLocale, 303);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
req.middlewareParams = {
|
|
114
|
+
commerceUrl,
|
|
115
|
+
rewrites: {}
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
return withOauthLogin(
|
|
119
|
+
withLocale(
|
|
120
|
+
withCurrency(
|
|
121
|
+
withPrettyUrl(
|
|
122
|
+
withRedirectionPayment(
|
|
123
|
+
withThreeDRedirection(
|
|
124
|
+
withUrlRedirection(
|
|
125
|
+
async (req: PzNextRequest, event: NextFetchEvent) => {
|
|
126
|
+
let middlewareResult: NextResponse | void =
|
|
127
|
+
NextResponse.next();
|
|
128
|
+
|
|
129
|
+
try {
|
|
130
|
+
const { locale, prettyUrl, currency } =
|
|
131
|
+
req.middlewareParams.rewrites;
|
|
132
|
+
const { defaultLocaleValue } = Settings.localization;
|
|
133
|
+
const url = req.nextUrl.clone();
|
|
134
|
+
const pathnameWithoutLocale = url.pathname.replace(
|
|
135
|
+
urlLocaleMatcherRegex,
|
|
136
|
+
''
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
url.basePath = `/${commerceUrl}`;
|
|
140
|
+
url.pathname = `/${
|
|
141
|
+
locale.length ? `${locale}/` : ''
|
|
142
|
+
}${currency}${prettyUrl ?? pathnameWithoutLocale}`;
|
|
143
|
+
|
|
144
|
+
Settings.rewrites.forEach((rewrite) => {
|
|
145
|
+
url.pathname = url.pathname.replace(
|
|
146
|
+
rewrite.source,
|
|
147
|
+
rewrite.destination
|
|
148
|
+
);
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
middlewareResult = (await middleware(
|
|
152
|
+
req,
|
|
153
|
+
event
|
|
154
|
+
)) as NextResponse | void;
|
|
155
|
+
|
|
156
|
+
// if middleware.ts has a return value for current url
|
|
157
|
+
if (middlewareResult instanceof NextResponse) {
|
|
158
|
+
// pz-override-response header is used to prevent 404 page for custom responses.
|
|
159
|
+
if (
|
|
160
|
+
middlewareResult.headers.get(
|
|
161
|
+
'pz-override-response'
|
|
162
|
+
) !== 'true'
|
|
163
|
+
) {
|
|
164
|
+
middlewareResult.headers.set(
|
|
165
|
+
'x-middleware-rewrite',
|
|
166
|
+
url.href
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
} else {
|
|
170
|
+
// if middleware.ts doesn't have a return value.
|
|
171
|
+
// e.g. NextResponse.next() doesn't exist in middleware.ts
|
|
172
|
+
|
|
173
|
+
middlewareResult = NextResponse.rewrite(url);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if (!url.pathname.startsWith(`/${currency}/orders`)) {
|
|
177
|
+
middlewareResult.cookies.set(
|
|
178
|
+
'pz-locale',
|
|
179
|
+
locale?.length > 0 ? locale : defaultLocaleValue,
|
|
180
|
+
{
|
|
181
|
+
sameSite: 'none',
|
|
182
|
+
secure: true,
|
|
183
|
+
expires: new Date(
|
|
184
|
+
Date.now() + 1000 * 60 * 60 * 24 * 7
|
|
185
|
+
) // 7 days
|
|
186
|
+
}
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
middlewareResult.cookies.set('pz-currency', currency, {
|
|
190
|
+
sameSite: 'none',
|
|
191
|
+
secure: true,
|
|
192
|
+
expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 7) // 7 days
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
if (
|
|
196
|
+
req.cookies.get('pz-locale') &&
|
|
197
|
+
req.cookies.get('pz-locale').value !== locale
|
|
198
|
+
) {
|
|
199
|
+
logger.debug('Locale changed', {
|
|
200
|
+
locale,
|
|
201
|
+
oldLocale: req.cookies.get('pz-locale')?.value,
|
|
202
|
+
ip
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
middlewareResult.headers.set(
|
|
207
|
+
'pz-url',
|
|
208
|
+
req.nextUrl.toString()
|
|
209
|
+
);
|
|
210
|
+
|
|
211
|
+
if (req.cookies.get('pz-set-currency')) {
|
|
212
|
+
middlewareResult.cookies.delete('pz-set-currency');
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
if (process.env.ACC_APP_VERSION) {
|
|
216
|
+
middlewareResult.headers.set(
|
|
217
|
+
'acc-app-version',
|
|
218
|
+
process.env.ACC_APP_VERSION
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Set CSRF token if not set
|
|
223
|
+
try {
|
|
224
|
+
const url = `${Settings.commerceUrl}${user.csrfToken}`;
|
|
225
|
+
|
|
226
|
+
if (!req.cookies.get('csrftoken')) {
|
|
227
|
+
const { csrf_token } = await (
|
|
228
|
+
await fetch(url)
|
|
229
|
+
).json();
|
|
230
|
+
middlewareResult.cookies.set('csrftoken', csrf_token);
|
|
231
|
+
}
|
|
232
|
+
} catch (error) {
|
|
233
|
+
logger.error('CSRF Error', {
|
|
234
|
+
error,
|
|
235
|
+
ip
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
} catch (error) {
|
|
239
|
+
logger.error('withPzDefault Error', {
|
|
240
|
+
error,
|
|
241
|
+
ip
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
return middlewareResult;
|
|
246
|
+
}
|
|
247
|
+
)
|
|
248
|
+
)
|
|
249
|
+
)
|
|
250
|
+
)
|
|
251
|
+
)
|
|
252
|
+
)
|
|
253
|
+
)(req, event);
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
export default withPzDefault;
|
package/middlewares/index.ts
CHANGED
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
import withPzDefault from './default';
|
|
2
|
-
import withPrettyUrl from './pretty-url';
|
|
3
|
-
import withThreeDRedirection from './three-d-redirection';
|
|
4
|
-
import withRedirectionPayment from './redirection-payment';
|
|
5
|
-
import withLocale from './locale';
|
|
6
|
-
import withOauthLogin from './oauth-login';
|
|
7
|
-
import withUrlRedirection from './url-redirection';
|
|
8
|
-
import { NextRequest } from 'next/server';
|
|
9
|
-
|
|
10
|
-
export {
|
|
11
|
-
withPzDefault,
|
|
12
|
-
withPrettyUrl,
|
|
13
|
-
withThreeDRedirection,
|
|
14
|
-
withRedirectionPayment,
|
|
15
|
-
withLocale,
|
|
16
|
-
withOauthLogin,
|
|
17
|
-
withUrlRedirection
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
export interface PzNextRequest extends NextRequest {
|
|
21
|
-
middlewareParams: {
|
|
22
|
-
commerceUrl: string;
|
|
23
|
-
rewrites: {
|
|
24
|
-
locale?: string;
|
|
25
|
-
prettyUrl?: string;
|
|
26
|
-
currency?: string;
|
|
27
|
-
};
|
|
28
|
-
};
|
|
29
|
-
}
|
|
1
|
+
import withPzDefault from './default';
|
|
2
|
+
import withPrettyUrl from './pretty-url';
|
|
3
|
+
import withThreeDRedirection from './three-d-redirection';
|
|
4
|
+
import withRedirectionPayment from './redirection-payment';
|
|
5
|
+
import withLocale from './locale';
|
|
6
|
+
import withOauthLogin from './oauth-login';
|
|
7
|
+
import withUrlRedirection from './url-redirection';
|
|
8
|
+
import { NextRequest } from 'next/server';
|
|
9
|
+
|
|
10
|
+
export {
|
|
11
|
+
withPzDefault,
|
|
12
|
+
withPrettyUrl,
|
|
13
|
+
withThreeDRedirection,
|
|
14
|
+
withRedirectionPayment,
|
|
15
|
+
withLocale,
|
|
16
|
+
withOauthLogin,
|
|
17
|
+
withUrlRedirection
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export interface PzNextRequest extends NextRequest {
|
|
21
|
+
middlewareParams: {
|
|
22
|
+
commerceUrl: string;
|
|
23
|
+
rewrites: {
|
|
24
|
+
locale?: string;
|
|
25
|
+
prettyUrl?: string;
|
|
26
|
+
currency?: string;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
}
|