@akinon/next 1.82.0-rc.11 → 1.82.0-rc.13
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/CHANGELOG.md +12 -0
- package/hocs/server/with-segment-defaults.tsx +7 -1
- package/hooks/use-router.ts +5 -2
- package/localization/index.ts +2 -1
- package/middlewares/locale.ts +31 -10
- package/package.json +2 -2
- package/utils/index.ts +11 -8
- package/utils/localization.ts +4 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @akinon/next
|
|
2
2
|
|
|
3
|
+
## 1.82.0-rc.13
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 3bf63c8: ZERO-3286: Add notFound handling for chunk URLs starting with \_next
|
|
8
|
+
|
|
9
|
+
## 1.82.0-rc.12
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- ac65ca9: ZERO-3269: Enhance locale handling by adding Subdomain strategy and updating related functions
|
|
14
|
+
|
|
3
15
|
## 1.82.0-rc.11
|
|
4
16
|
|
|
5
17
|
## 1.82.0-rc.10
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import settings from 'settings';
|
|
2
2
|
import { LayoutProps, PageProps, RootLayoutProps } from '../../types';
|
|
3
|
-
import { redirect } from 'next/navigation';
|
|
3
|
+
import { redirect, notFound } from 'next/navigation';
|
|
4
4
|
import { ServerVariables } from '../../utils/server-variables';
|
|
5
5
|
import { ROUTES } from 'routes';
|
|
6
6
|
import logger from '../../utils/log';
|
|
@@ -21,6 +21,12 @@ export const withSegmentDefaults =
|
|
|
21
21
|
async (props: T) => {
|
|
22
22
|
let componentProps = { ...props };
|
|
23
23
|
|
|
24
|
+
// Handle not found chunk urls starting with _next
|
|
25
|
+
// Normally, next.js router should handle these urls and should not reach this point
|
|
26
|
+
if (props.params.commerce === '_next') {
|
|
27
|
+
return notFound();
|
|
28
|
+
}
|
|
29
|
+
|
|
24
30
|
if (options.segmentType === 'root-layout') {
|
|
25
31
|
componentProps = (await addRootLayoutProps(
|
|
26
32
|
componentProps as RootLayoutProps
|
package/hooks/use-router.ts
CHANGED
|
@@ -27,8 +27,11 @@ export const useRouter = () => {
|
|
|
27
27
|
);
|
|
28
28
|
|
|
29
29
|
url.pathname = `${
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
localeUrlStrategy === LocaleUrlStrategy.Subdomain ||
|
|
31
|
+
(locale === defaultLocale?.value &&
|
|
32
|
+
[LocaleUrlStrategy.HideDefaultLocale].includes(
|
|
33
|
+
localeUrlStrategy as LocaleUrlStrategy
|
|
34
|
+
))
|
|
32
35
|
? ''
|
|
33
36
|
: `/${locale}`
|
|
34
37
|
}${pathnameWithoutLocale}`;
|
package/localization/index.ts
CHANGED
package/middlewares/locale.ts
CHANGED
|
@@ -4,17 +4,32 @@ import { PzNextRequest } from '.';
|
|
|
4
4
|
import { LocaleUrlStrategy } from '../localization';
|
|
5
5
|
import { urlLocaleMatcherRegex } from '../utils';
|
|
6
6
|
import logger from '../utils/log';
|
|
7
|
+
import { getUrlPathWithLocale } from '../utils/localization';
|
|
7
8
|
|
|
8
|
-
const getMatchedLocale = (pathname: string) => {
|
|
9
|
+
const getMatchedLocale = (pathname: string, req: PzNextRequest) => {
|
|
9
10
|
let matchedLocale = pathname.match(urlLocaleMatcherRegex)?.[0] ?? '';
|
|
10
11
|
matchedLocale = matchedLocale.replace('/', '');
|
|
11
12
|
|
|
13
|
+
const { localeUrlStrategy, defaultLocaleValue } = settings.localization;
|
|
14
|
+
|
|
15
|
+
if (localeUrlStrategy === LocaleUrlStrategy.Subdomain) {
|
|
16
|
+
const host = req.headers.get('x-forwarded-host');
|
|
17
|
+
|
|
18
|
+
if (host) {
|
|
19
|
+
const subDomain = host.split('.')[0] || '';
|
|
20
|
+
const subDomainLocaleMatched = `/${subDomain}`.match(
|
|
21
|
+
urlLocaleMatcherRegex
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
if (subDomainLocaleMatched && subDomainLocaleMatched[0]) {
|
|
25
|
+
matchedLocale = subDomainLocaleMatched[0].slice(1);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
12
30
|
if (!matchedLocale.length) {
|
|
13
|
-
if (
|
|
14
|
-
|
|
15
|
-
LocaleUrlStrategy.ShowAllLocales
|
|
16
|
-
) {
|
|
17
|
-
matchedLocale = settings.localization.defaultLocaleValue;
|
|
31
|
+
if (localeUrlStrategy !== LocaleUrlStrategy.ShowAllLocales) {
|
|
32
|
+
matchedLocale = defaultLocaleValue;
|
|
18
33
|
}
|
|
19
34
|
}
|
|
20
35
|
|
|
@@ -28,7 +43,7 @@ const withLocale =
|
|
|
28
43
|
|
|
29
44
|
try {
|
|
30
45
|
const url = req.nextUrl.clone();
|
|
31
|
-
const matchedLocale = getMatchedLocale(url.pathname);
|
|
46
|
+
const matchedLocale = getMatchedLocale(url.pathname, req);
|
|
32
47
|
let { localeUrlStrategy, defaultLocaleValue, redirectToDefaultLocale } =
|
|
33
48
|
settings.localization;
|
|
34
49
|
|
|
@@ -50,8 +65,15 @@ const withLocale =
|
|
|
50
65
|
redirectToDefaultLocale &&
|
|
51
66
|
req.method === 'GET'
|
|
52
67
|
) {
|
|
53
|
-
|
|
54
|
-
|
|
68
|
+
// Redirect to existing or default locale
|
|
69
|
+
|
|
70
|
+
url.pathname = getUrlPathWithLocale(
|
|
71
|
+
url.pathname,
|
|
72
|
+
req.cookies.get('pz-locale')?.value
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
// Use 303 for POST requests
|
|
76
|
+
return NextResponse.redirect(url, 303);
|
|
55
77
|
}
|
|
56
78
|
|
|
57
79
|
req.middlewareParams.rewrites.locale = matchedLocale;
|
|
@@ -61,7 +83,6 @@ const withLocale =
|
|
|
61
83
|
ip
|
|
62
84
|
});
|
|
63
85
|
}
|
|
64
|
-
|
|
65
86
|
return middleware(req, event);
|
|
66
87
|
};
|
|
67
88
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@akinon/next",
|
|
3
3
|
"description": "Core package for Project Zero Next",
|
|
4
|
-
"version": "1.82.0-rc.
|
|
4
|
+
"version": "1.82.0-rc.13",
|
|
5
5
|
"private": false,
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"bin": {
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"set-cookie-parser": "2.6.0"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
|
-
"@akinon/eslint-plugin-projectzero": "1.82.0-rc.
|
|
33
|
+
"@akinon/eslint-plugin-projectzero": "1.82.0-rc.13",
|
|
34
34
|
"@types/react-redux": "7.1.30",
|
|
35
35
|
"@types/set-cookie-parser": "2.4.7",
|
|
36
36
|
"@typescript-eslint/eslint-plugin": "6.7.4",
|
package/utils/index.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import settings from 'settings';
|
|
2
2
|
import { LocaleUrlStrategy } from '../localization';
|
|
3
|
-
import { CDNOptions, ClientRequestOptions } from '../types';
|
|
3
|
+
import { CDNOptions, ClientRequestOptions, Locale } from '../types';
|
|
4
4
|
|
|
5
5
|
export * from './get-currency';
|
|
6
6
|
export * from './menu-generator';
|
|
@@ -152,14 +152,17 @@ export function buildCDNUrl(url: string, config?: CDNOptions) {
|
|
|
152
152
|
return `${rootWithoutOptions}${options}${fileExtension}`;
|
|
153
153
|
}
|
|
154
154
|
|
|
155
|
+
const { locales, localeUrlStrategy, defaultLocaleValue } =
|
|
156
|
+
settings.localization;
|
|
157
|
+
|
|
158
|
+
const isLocaleExcluded = (locale: Locale) =>
|
|
159
|
+
![LocaleUrlStrategy.ShowAllLocales, LocaleUrlStrategy.Subdomain].includes(
|
|
160
|
+
localeUrlStrategy
|
|
161
|
+
) && locale.value !== defaultLocaleValue;
|
|
162
|
+
|
|
155
163
|
export const urlLocaleMatcherRegex = new RegExp(
|
|
156
|
-
`^/(${
|
|
157
|
-
.filter((l) =>
|
|
158
|
-
settings.localization.localeUrlStrategy !==
|
|
159
|
-
LocaleUrlStrategy.ShowAllLocales
|
|
160
|
-
? l.value !== settings.localization.defaultLocaleValue
|
|
161
|
-
: l
|
|
162
|
-
)
|
|
164
|
+
`^/(${locales
|
|
165
|
+
.filter((l) => !isLocaleExcluded(l))
|
|
163
166
|
.map((l) => l.value)
|
|
164
167
|
.join('|')})(?=/|$)`
|
|
165
168
|
);
|
package/utils/localization.ts
CHANGED
|
@@ -11,6 +11,10 @@ export const getUrlPathWithLocale = (
|
|
|
11
11
|
currentLocale = defaultLocaleValue;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
+
if (localeUrlStrategy === LocaleUrlStrategy.Subdomain) {
|
|
15
|
+
return pathname;
|
|
16
|
+
}
|
|
17
|
+
|
|
14
18
|
if (localeUrlStrategy === LocaleUrlStrategy.HideAllLocales) {
|
|
15
19
|
return pathname;
|
|
16
20
|
}
|