@enonic/nextjs-adapter 3.0.1 → 3.0.3
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/common/UrlProcessor.js +23 -6
- package/common/UrlProcessor.js.map +1 -1
- package/common/constants.d.ts +1 -1
- package/common/constants.js +12 -5
- package/common/constants.js.map +1 -1
- package/guillotine/fetchContentPathsForLocale.js +1 -0
- package/guillotine/fetchContentPathsForLocale.js.map +1 -1
- package/guillotine/validateShortcut.js +10 -4
- package/guillotine/validateShortcut.js.map +1 -1
- package/i18n/LocaleContext.jsx +6 -1
- package/i18n/LocaleContext.jsx.map +1 -1
- package/i18n/i18n.d.ts +1 -0
- package/i18n/i18n.js +4 -1
- package/i18n/i18n.js.map +1 -1
- package/package.json +13 -13
- package/query/Shortcut.d.ts +1 -1
- package/query/Shortcut.js +4 -0
- package/query/Shortcut.js.map +1 -1
- package/src/common/UrlProcessor.ts +28 -8
- package/src/common/constants.ts +12 -5
- package/src/guillotine/fetchContentPathsForLocale.ts +1 -0
- package/src/guillotine/validateShortcut.ts +10 -4
- package/src/i18n/LocaleContext.tsx +6 -1
- package/src/i18n/i18n.ts +4 -1
- package/src/query/Shortcut.ts +4 -0
- package/src/types/componentProps.ts +3 -6
- package/src/views/RichTextView.tsx +5 -5
- package/types/componentProps.d.ts +1 -1
- package/views/RichTextView.jsx +5 -5
- package/views/RichTextView.jsx.map +1 -1
package/common/UrlProcessor.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { RENDER_MODE } from './constants';
|
|
2
2
|
import { fixDoubleSlashes } from '../utils/fixDoubleSlashes';
|
|
3
3
|
import { getLocaleMappingByProjectId } from '../utils/getLocaleMappingByProjectId';
|
|
4
|
-
import { commonChars } from '../utils/commonChars';
|
|
5
4
|
import { addBasePath } from 'next/dist/client/add-base-path';
|
|
5
|
+
import { parseUrl } from 'next/dist/shared/lib/router/utils/parse-url';
|
|
6
6
|
export class UrlProcessor {
|
|
7
7
|
static process(url, meta, serverSide = false, isResource = false) {
|
|
8
8
|
if (this.startsWithHash(url) || !meta || (this.isAttachmentUrl(url)) && meta.renderMode === RENDER_MODE.NEXT) {
|
|
@@ -74,11 +74,28 @@ export class UrlProcessor {
|
|
|
74
74
|
}
|
|
75
75
|
static stripApiUrl(url, apiUrl) {
|
|
76
76
|
// normalise localhost-127.0.0.1 if present in urls
|
|
77
|
-
const normalUrl = url.replace(this.localhostPattern, '127.0.0.1');
|
|
78
|
-
const normalApiUrl = apiUrl.replace(this.localhostPattern, '127.0.0.1');
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
77
|
+
const normalUrl = parseUrl(url.replace(this.localhostPattern, '127.0.0.1'));
|
|
78
|
+
const normalApiUrl = parseUrl(apiUrl.replace(this.localhostPattern, '127.0.0.1'));
|
|
79
|
+
// WARNING! disregarding the protocol (http/https)
|
|
80
|
+
if (normalUrl.hostname !== normalApiUrl.hostname
|
|
81
|
+
|| normalUrl.port !== normalApiUrl.port) {
|
|
82
|
+
// can't strip apiUrl if hostnames or ports are different
|
|
83
|
+
return url;
|
|
84
|
+
}
|
|
85
|
+
const urlPathCrumbs = normalUrl.pathname.split('/');
|
|
86
|
+
const apiUrlPathCrumbs = normalApiUrl.pathname.split('/');
|
|
87
|
+
for (let i = 0; i < Math.min(apiUrlPathCrumbs.length, urlPathCrumbs.length);) {
|
|
88
|
+
const urlPathCrumb = urlPathCrumbs[i];
|
|
89
|
+
const apiUrlPathCrumb = apiUrlPathCrumbs[i];
|
|
90
|
+
if (urlPathCrumb === apiUrlPathCrumb) {
|
|
91
|
+
urlPathCrumbs.shift();
|
|
92
|
+
apiUrlPathCrumbs.shift();
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
i++;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return `/${urlPathCrumbs.join('/')}` + normalUrl.search + normalUrl.hash;
|
|
82
99
|
}
|
|
83
100
|
static isAttachmentUrl(url) {
|
|
84
101
|
return this.IMG_ATMT_REGEXP.test(url);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UrlProcessor.js","sourceRoot":"","sources":["../src/common/UrlProcessor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,WAAW,EAAC,MAAM,aAAa,CAAC;AACxC,OAAO,EAAC,gBAAgB,EAAC,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAC,2BAA2B,EAAC,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAC,WAAW,EAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"UrlProcessor.js","sourceRoot":"","sources":["../src/common/UrlProcessor.ts"],"names":[],"mappings":"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"}
|
package/common/constants.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ export declare const FRAGMENT_DEFAULT_REGION_NAME = "fragment";
|
|
|
13
13
|
* - media
|
|
14
14
|
* - paths with '/_' in them
|
|
15
15
|
*/
|
|
16
|
-
export declare const GET_STATIC_PATHS_QUERY = "query ($count: Int) {\n guillotine {\n queryDsl(\n first: $count,\n sort: {\n field: \"modifiedTime\",\n direction: DESC\n }\n query: {boolean: {mustNot: [\n
|
|
16
|
+
export declare const GET_STATIC_PATHS_QUERY = "query ($pathRegex: String!, $count: Int) {\n guillotine {\n queryDsl(\n first: $count,\n sort: {\n field: \"modifiedTime\",\n direction: DESC\n }\n query: {\n boolean: {\n mustNot: [\n {in: {field: \"type\", stringValues: [\"base:shortcut\", \"portal:fragment\", \"portal:template-folder\", \"portal:page-template\"]}}\n {like: {field: \"type\", value: \"media:*\"}}\n ]\n must: [\n {like: {field:\"_path\", value: $pathRegex}}\n ]\n }\n }\n ) {\n _name\n _path\n site {_name}\n }\n }\n}";
|
|
17
17
|
export declare enum GUILLOTINE_REQUEST_HEADERS {
|
|
18
18
|
COOKIE = "Cookie",
|
|
19
19
|
LOCALE = "locale",
|
package/common/constants.js
CHANGED
|
@@ -14,7 +14,7 @@ export const FRAGMENT_DEFAULT_REGION_NAME = 'fragment';
|
|
|
14
14
|
* - media
|
|
15
15
|
* - paths with '/_' in them
|
|
16
16
|
*/
|
|
17
|
-
export const GET_STATIC_PATHS_QUERY = `query ($count: Int) {
|
|
17
|
+
export const GET_STATIC_PATHS_QUERY = `query ($pathRegex: String!, $count: Int) {
|
|
18
18
|
guillotine {
|
|
19
19
|
queryDsl(
|
|
20
20
|
first: $count,
|
|
@@ -22,10 +22,17 @@ export const GET_STATIC_PATHS_QUERY = `query ($count: Int) {
|
|
|
22
22
|
field: "modifiedTime",
|
|
23
23
|
direction: DESC
|
|
24
24
|
}
|
|
25
|
-
query: {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
query: {
|
|
26
|
+
boolean: {
|
|
27
|
+
mustNot: [
|
|
28
|
+
{in: {field: "type", stringValues: ["base:shortcut", "portal:fragment", "portal:template-folder", "portal:page-template"]}}
|
|
29
|
+
{like: {field: "type", value: "media:*"}}
|
|
30
|
+
]
|
|
31
|
+
must: [
|
|
32
|
+
{like: {field:"_path", value: $pathRegex}}
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
}
|
|
29
36
|
) {
|
|
30
37
|
_name
|
|
31
38
|
_path
|
package/common/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/common/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC;AAE7B,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAChB,wCAA4B,CAAA;IAC5B,kCAAsB,CAAA;IACtB,wCAA4B,CAAA;IAC5B,kCAAsB,CAAA;AAC1B,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,iBAAiB,CAAC;AAC3D,MAAM,CAAC,MAAM,4BAA4B,GAAG,UAAU,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/common/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC;AAE7B,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAChB,wCAA4B,CAAA;IAC5B,kCAAsB,CAAA;IACtB,wCAA4B,CAAA;IAC5B,kCAAsB,CAAA;AAC1B,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,iBAAiB,CAAC;AAC3D,MAAM,CAAC,MAAM,4BAA4B,GAAG,UAAU,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;EAyBpC,CAAC;AAEH,8EAA8E;AAC9E,qBAAqB;AACrB,MAAM,CAAN,IAAY,0BAKX;AALD,WAAY,0BAA0B;IAClC,+CAAiB,CAAA;IACjB,+CAAiB,CAAA;IACjB,iDAAmB,CAAA;IACnB,+DAAiC,CAAA;AACrC,CAAC,EALW,0BAA0B,KAA1B,0BAA0B,QAKrC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAE9C,MAAM,CAAC,MAAM,8BAA8B,GAAG,sBAAsB,CAAC;AACrE,MAAM,CAAC,MAAM,oBAAoB,GAAG,wBAAwB,CAAC;AAC7D,MAAM,CAAC,MAAM,0BAA0B,GAAG,4BAA4B,CAAC;AACvE,MAAM,CAAC,MAAM,uBAAuB,GAAG,oBAAoB,CAAC;AAC5D,MAAM,CAAC,MAAM,iBAAiB,GAAG,wBAAwB,CAAC;AAE1D,MAAM,CAAN,IAAY,WAOX;AAPD,WAAY,WAAW;IACnB,gCAAiB,CAAA;IACjB,4BAAa,CAAA;IACb,kCAAmB,CAAA;IACnB,4BAAa,CAAA;IACb,8BAAe,CAAA;IACf,4BAAa,CAAA,CAAO,mEAAmE;AAC3F,CAAC,EAPW,WAAW,KAAX,WAAW,QAOtB;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;AAExD,MAAM,CAAC,MAAM,qBAAqB,GAAG,aAAa,CAAC;AAEnD,oHAAoH;AACpH,MAAM,CAAC,MAAM,kBAAkB,GAAG,WAAW,CAAC;AAE9C,0DAA0D;AAC1D,MAAM,CAAN,IAAY,iBAMX;AAND,WAAY,iBAAiB;IACzB,kCAAa,CAAA;IACb,sCAAiB,CAAA;IACjB,kCAAa,CAAA;IACb,0CAAqB,CAAA;IACrB,kCAAa,CAAA;AACjB,CAAC,EANW,iBAAiB,KAAjB,iBAAiB,QAM5B;AAED,MAAM,CAAN,IAAY,eAIX;AAJD,WAAY,eAAe;IACvB,0CAAuB,CAAA;IACvB,gCAAa,CAAA;IACb,gCAAa,CAAA;AACjB,CAAC,EAJW,eAAe,KAAf,eAAe,QAI1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchContentPathsForLocale.js","sourceRoot":"","sources":["../src/guillotine/fetchContentPathsForLocale.ts"],"names":[],"mappings":";;;;;;;;;AAGA,OAAO,EAAC,sBAAsB,EAAC,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAC,gBAAgB,EAAC,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAGlD,MAAM,UAAgB,0BAA0B;yDAC5C,IAAY,EACZ,MAAqB,EACrB,QAAgB,sBAAsB,EACtC,KAAK,GAAG,GAAG;QAEX,MAAM,aAAa,GAAG,gBAAgB,CAAC;YACnC,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,MAAM,CAAC,MAAM;SACxB,CAAC,CAAC;QACH,MAAM,IAAI,GAAuB;YAC7B,KAAK;YACL,SAAS,EAAE;gBACP,IAAI;gBACJ,KAAK;aACR;SACJ,CAAC;QACF,OAAO,eAAe,CAAoB,aAAa,EAAE,MAAM,EAAE,EAAC,IAAI,EAAC,CAAC,CAAC,IAAI,CAAC,CAC1E,OAAyB,EAC3B,EAAE;YACA,OAAO,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CACtC,IAAuB,EACvB,KAAU,EACZ,EAAE;;gBACA,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK,CAAA,MAAA,KAAK,CAAC,IAAI,0CAAE,KAAK,EAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACnF,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBACpD,IAAI,CAAC,IAAI,CAAC;oBACN,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC;oBACnC,MAAM,EAAE,MAAM,CAAC,MAAM;iBACxB,CAAC,CAAC;gBACH,OAAO,IAAI,CAAC;YAChB,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACP,CAAC;CAAA"}
|
|
1
|
+
{"version":3,"file":"fetchContentPathsForLocale.js","sourceRoot":"","sources":["../src/guillotine/fetchContentPathsForLocale.ts"],"names":[],"mappings":";;;;;;;;;AAGA,OAAO,EAAC,sBAAsB,EAAC,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAC,gBAAgB,EAAC,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAGlD,MAAM,UAAgB,0BAA0B;yDAC5C,IAAY,EACZ,MAAqB,EACrB,QAAgB,sBAAsB,EACtC,KAAK,GAAG,GAAG;QAEX,MAAM,aAAa,GAAG,gBAAgB,CAAC;YACnC,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,MAAM,CAAC,MAAM;SACxB,CAAC,CAAC;QACH,MAAM,IAAI,GAAuB;YAC7B,KAAK;YACL,SAAS,EAAE;gBACP,IAAI;gBACJ,SAAS,EAAE,WAAW,MAAM,CAAC,IAAI,IAAI;gBACrC,KAAK;aACR;SACJ,CAAC;QACF,OAAO,eAAe,CAAoB,aAAa,EAAE,MAAM,EAAE,EAAC,IAAI,EAAC,CAAC,CAAC,IAAI,CAAC,CAC1E,OAAyB,EAC3B,EAAE;YACA,OAAO,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CACtC,IAAuB,EACvB,KAAU,EACZ,EAAE;;gBACA,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK,CAAA,MAAA,KAAK,CAAC,IAAI,0CAAE,KAAK,EAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACnF,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBACpD,IAAI,CAAC,IAAI,CAAC;oBACN,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC;oBACnC,MAAM,EAAE,MAAM,CAAC,MAAM;iBACxB,CAAC,CAAC;gBACH,OAAO,IAAI,CAAC;YAChB,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACP,CAAC;CAAA"}
|
|
@@ -3,16 +3,22 @@ import { RENDER_MODE } from '../common/constants';
|
|
|
3
3
|
import { IS_DEV_MODE } from '../common/env';
|
|
4
4
|
import { UrlProcessor } from '../common/UrlProcessor';
|
|
5
5
|
export function validateShortcut(props) {
|
|
6
|
-
var _a, _b
|
|
6
|
+
var _a, _b;
|
|
7
7
|
const { data, meta, error } = props;
|
|
8
|
-
const
|
|
8
|
+
const dataObj = (_a = data === null || data === void 0 ? void 0 : data.get) === null || _a === void 0 ? void 0 : _a.data;
|
|
9
|
+
const pageUrl = (_b = dataObj === null || dataObj === void 0 ? void 0 : dataObj.target) === null || _b === void 0 ? void 0 : _b.pageUrl;
|
|
10
|
+
const parameters = dataObj === null || dataObj === void 0 ? void 0 : dataObj.parameters;
|
|
9
11
|
if (meta.type === 'base:shortcut' && pageUrl) {
|
|
10
12
|
if (meta.renderMode !== RENDER_MODE.NEXT) {
|
|
11
13
|
// do not show shortcut targets in preview/edit mode
|
|
12
|
-
console.warn(404, `Shortcuts are not available in ${
|
|
14
|
+
console.warn(404, `Shortcuts are not available in ${meta.renderMode} render mode`);
|
|
13
15
|
notFound();
|
|
14
16
|
}
|
|
15
|
-
|
|
17
|
+
let destination = UrlProcessor.process(pageUrl, meta, true);
|
|
18
|
+
if (parameters) {
|
|
19
|
+
const searchParams = parameters.map(({ name, value }) => `${encodeURIComponent(name)}=${encodeURIComponent(value)}`).join('&');
|
|
20
|
+
destination += '?' + searchParams;
|
|
21
|
+
}
|
|
16
22
|
console.debug(`Redirecting shortcut content [${meta.path}] to`, destination);
|
|
17
23
|
redirect(destination, RedirectType.replace);
|
|
18
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validateShortcut.js","sourceRoot":"","sources":["../src/guillotine/validateShortcut.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAC,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAC,WAAW,EAAC,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAC,YAAY,EAAC,MAAM,wBAAwB,CAAC;AAGpD,MAAM,UAAU,gBAAgB,CAAC,KAAyB;;IACtD,MAAM,EAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAC,GAAG,KAAK,CAAC;IAClC,MAAM,OAAO,GAAG,MAAA,
|
|
1
|
+
{"version":3,"file":"validateShortcut.js","sourceRoot":"","sources":["../src/guillotine/validateShortcut.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAC,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAC,WAAW,EAAC,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAC,YAAY,EAAC,MAAM,wBAAwB,CAAC;AAGpD,MAAM,UAAU,gBAAgB,CAAC,KAAyB;;IACtD,MAAM,EAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAC,GAAG,KAAK,CAAC;IAClC,MAAM,OAAO,GAAG,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,GAAG,0CAAE,IAAI,CAAC;IAChC,MAAM,OAAO,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,0CAAE,OAAO,CAAC;IACzC,MAAM,UAAU,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,UAAU,CAAC;IACvC,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,IAAI,OAAO,EAAE,CAAC;QAC3C,IAAI,IAAI,CAAC,UAAU,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC;YACvC,oDAAoD;YACpD,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,kCAAkC,IAAI,CAAC,UAAU,cAAc,CAAC,CAAC;YACnF,QAAQ,EAAE,CAAC;QACf,CAAC;QAED,IAAI,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5D,IAAI,UAAU,EAAE,CAAC;YACb,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,EAAC,IAAI,EAAE,KAAK,EAAC,EAAE,EAAE,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7H,WAAW,IAAI,GAAG,GAAG,YAAY,CAAC;QACtC,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,iCAAiC,IAAI,CAAC,IAAI,MAAM,EAAE,WAAW,CAAC,CAAC;QAC7E,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,uCAAuC;IACvC,kDAAkD;IAClD,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,KAAK,WAAW,CAAC,IAAI,CAAC;IAErF,MAAM,sBAAsB,GAAG,IAAI,CAAC,UAAU,KAAK,WAAW,CAAC,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC;IAErG,MAAM,UAAU,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,YAAY,IAAI,sBAAsB,CAAC;IAE7F,IAAI,UAAU,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,8BAA8B,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QAC9D,QAAQ,EAAE,CAAC;IACf,CAAC;AACL,CAAC"}
|
package/i18n/LocaleContext.jsx
CHANGED
|
@@ -20,10 +20,13 @@ export const useLocaleContext = () => useContext(LocaleContext);
|
|
|
20
20
|
export const LocaleContextProvider = ({ children, locale: localeProps = '', }) => {
|
|
21
21
|
const [currentLocale, setLocaleState] = useState(localeProps);
|
|
22
22
|
const [dictionary, setPhrasesState] = useState({});
|
|
23
|
+
const [isLoaded, setLoadedState] = useState(false);
|
|
23
24
|
const setLocale = (locale) => __awaiter(void 0, void 0, void 0, function* () {
|
|
24
25
|
setLocaleState(locale);
|
|
26
|
+
setLoadedState(false);
|
|
25
27
|
return loadPhrases(locale).then((phrases) => {
|
|
26
28
|
setPhrasesState(phrases);
|
|
29
|
+
setLoadedState(true);
|
|
27
30
|
return phrases;
|
|
28
31
|
});
|
|
29
32
|
});
|
|
@@ -32,7 +35,9 @@ export const LocaleContextProvider = ({ children, locale: localeProps = '', }) =
|
|
|
32
35
|
void setLocale(localeProps); // void to avoid @typescript-eslint/no-floating-promises
|
|
33
36
|
}
|
|
34
37
|
}, []);
|
|
35
|
-
const localize = (key, ...args) =>
|
|
38
|
+
const localize = (key, ...args) => {
|
|
39
|
+
return isLoaded ? getPhrase(currentLocale, dictionary, key, ...args) : key;
|
|
40
|
+
};
|
|
36
41
|
return (<LocaleContext.Provider value={{
|
|
37
42
|
setLocale,
|
|
38
43
|
locale: currentLocale,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocaleContext.jsx","sourceRoot":"","sources":["../src/i18n/LocaleContext.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;;;;;;AAGb,OAAO,KAAK,EAAE,EAAC,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AAC5E,OAAO,EAAC,SAAS,EAAE,WAAW,EAAC,MAAM,QAAQ,CAAC;AAG9C,MAAM,aAAa,GAAG,aAAa,CAAoB;IACnD,UAAU,EAAE,EAAE;IACd,MAAM,EAAE,EAAE;IACV,QAAQ,EAAE,CAAC,GAAW,EAAE,GAAG,IAAW,EAAE,EAAE,CAAC,GAAG;IAC9C,SAAS,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;CACrD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAEhE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,EAClC,QAAQ,EACR,MAAM,EAAE,WAAW,GAAG,EAAE,GAI3B,EAAE,EAAE;IACD,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC9D,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAO,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"LocaleContext.jsx","sourceRoot":"","sources":["../src/i18n/LocaleContext.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;;;;;;AAGb,OAAO,KAAK,EAAE,EAAC,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AAC5E,OAAO,EAAC,SAAS,EAAE,WAAW,EAAC,MAAM,QAAQ,CAAC;AAG9C,MAAM,aAAa,GAAG,aAAa,CAAoB;IACnD,UAAU,EAAE,EAAE;IACd,MAAM,EAAE,EAAE;IACV,QAAQ,EAAE,CAAC,GAAW,EAAE,GAAG,IAAW,EAAE,EAAE,CAAC,GAAG;IAC9C,SAAS,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;CACrD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAEhE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,EAClC,QAAQ,EACR,MAAM,EAAE,WAAW,GAAG,EAAE,GAI3B,EAAE,EAAE;IACD,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC9D,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAO,EAAE,CAAC,CAAC;IACzD,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEnD,MAAM,SAAS,GAAG,CAAO,MAAc,EAAiB,EAAE;QACtD,cAAc,CAAC,MAAM,CAAC,CAAC;QACvB,cAAc,CAAC,KAAK,CAAC,CAAC;QACtB,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YACxC,eAAe,CAAC,OAAO,CAAC,CAAC;YACzB,cAAc,CAAC,IAAI,CAAC,CAAC;YACrB,OAAO,OAAO,CAAC;QACnB,CAAC,CAAC,CAAC;IACP,CAAC,CAAA,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,WAAW,EAAE,CAAC;YACd,KAAK,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,wDAAwD;QACzF,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,GAAG,IAAW,EAAE,EAAE;QAC7C,OAAO,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC/E,CAAC,CAAC;IAEF,OAAO,CACH,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC3B,SAAS;YACT,MAAM,EAAE,aAAa;YACrB,UAAU;YACV,QAAQ;SACX,CAAC,CACE;YAAA,CAAC,QAAQ,CACb;QAAA,EAAE,aAAa,CAAC,QAAQ,CAAC,CAC5B,CAAC;AACN,CAAC,CAAC"}
|
package/i18n/i18n.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { Dict } from '../types';
|
|
|
2
2
|
export declare class I18n {
|
|
3
3
|
private static locale;
|
|
4
4
|
private static dictionary;
|
|
5
|
+
private static isLoaded;
|
|
5
6
|
static setLocale(locale: string): Promise<Dict>;
|
|
6
7
|
static localize(key: string, ...args: any[]): string;
|
|
7
8
|
static getLocale(): string;
|
package/i18n/i18n.js
CHANGED
|
@@ -11,14 +11,16 @@ export class I18n {
|
|
|
11
11
|
static setLocale(locale) {
|
|
12
12
|
return __awaiter(this, void 0, void 0, function* () {
|
|
13
13
|
this.locale = locale;
|
|
14
|
+
this.isLoaded = false;
|
|
14
15
|
return loadPhrases(locale).then((phrases) => {
|
|
15
16
|
this.dictionary = phrases;
|
|
17
|
+
this.isLoaded = true;
|
|
16
18
|
return phrases;
|
|
17
19
|
});
|
|
18
20
|
});
|
|
19
21
|
}
|
|
20
22
|
static localize(key, ...args) {
|
|
21
|
-
return getPhrase(this.locale, this.dictionary, key, ...args);
|
|
23
|
+
return this.isLoaded ? getPhrase(this.locale, this.dictionary, key, ...args) : key;
|
|
22
24
|
}
|
|
23
25
|
static getLocale() {
|
|
24
26
|
return this.locale;
|
|
@@ -29,6 +31,7 @@ export class I18n {
|
|
|
29
31
|
}
|
|
30
32
|
I18n.locale = '';
|
|
31
33
|
I18n.dictionary = {};
|
|
34
|
+
I18n.isLoaded = false;
|
|
32
35
|
export const loadPhrases = (locale) => __awaiter(void 0, void 0, void 0, function* () {
|
|
33
36
|
return import(`@phrases/${locale}.json`)
|
|
34
37
|
.then((module) => module.default)
|
package/i18n/i18n.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../src/i18n/i18n.ts"],"names":[],"mappings":";;;;;;;;;AAGA,MAAM,OAAO,IAAI;
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../src/i18n/i18n.ts"],"names":[],"mappings":";;;;;;;;;AAGA,MAAM,OAAO,IAAI;IAKN,MAAM,CAAO,SAAS,CAAC,MAAc;;YACxC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;gBACxC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;gBAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACrB,OAAO,OAAO,CAAC;YACnB,CAAC,CAAC,CAAC;QACP,CAAC;KAAA;IAEM,MAAM,CAAC,QAAQ,CAAC,GAAW,EAAE,GAAG,IAAW;QAC9C,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACvF,CAAC;IAEM,MAAM,CAAC,SAAS;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAEM,MAAM,CAAC,aAAa;QACvB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;;AAxBc,WAAM,GAAG,EAAE,CAAC;AACZ,eAAU,GAAS,EAAE,CAAC;AACtB,aAAQ,GAAG,KAAK,CAAC;AAyBpC,MAAM,CAAC,MAAM,WAAW,GAAG,CAAO,MAAc,EAAiB,EAAE;IAC/D,OAAO,MAAM,CAAC,YAAY,MAAM,OAAO,CAAC;SACnC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;SAChC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,OAAO,CAAC,KAAK,CAAC,sCAAsC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC;QAClE,OAAO,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;AACX,CAAC,CAAA,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAAc,EAAE,IAAU,EAAE,GAAW,EAAE,GAAG,IAAW,EAAE,EAAE;IACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,2CAA2C,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC;QAC7E,OAAO,IAAI,GAAG,GAAG,CAAC;IACtB,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;QACf,OAAO,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;;YAClD,KAAK,EAAE,CAAC;YACR,OAAO,MAAA,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,mCAAI,KAAK,CAAC;QACzC,CAAC,CAAC,CAAC;IACP,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@enonic/nextjs-adapter",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.3",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"author": "Pavel Milkevich <pmi@enonic.com>",
|
|
@@ -53,33 +53,33 @@
|
|
|
53
53
|
"@formatjs/intl-localematcher": "^0.5.4",
|
|
54
54
|
"html-react-parser": "^5.1.10",
|
|
55
55
|
"negotiator": "^0.6.3",
|
|
56
|
-
"next": "^14.2.
|
|
56
|
+
"next": "^14.2.4",
|
|
57
57
|
"react": "18.3.1",
|
|
58
|
-
"react-dom": "18.
|
|
58
|
+
"react-dom": "18.3.1",
|
|
59
59
|
"unescape": "^1.0.1"
|
|
60
60
|
},
|
|
61
61
|
"devDependencies": {
|
|
62
62
|
"@edge-runtime/jest-environment": "^2.3.10",
|
|
63
|
-
"@enonic-types/core": "^7.14.
|
|
63
|
+
"@enonic-types/core": "^7.14.2",
|
|
64
64
|
"@enonic/eslint-config": "^1.2.1",
|
|
65
|
-
"@testing-library/jest-dom": "^6.4.
|
|
66
|
-
"@testing-library/react": "^
|
|
65
|
+
"@testing-library/jest-dom": "^6.4.6",
|
|
66
|
+
"@testing-library/react": "^16.0.0",
|
|
67
67
|
"@types/negotiator": "^0.6.3",
|
|
68
|
-
"@types/node": "^20.
|
|
69
|
-
"@types/react": "^18.3.
|
|
70
|
-
"@types/react-dom": "^18.
|
|
71
|
-
"@typescript-eslint/eslint-plugin": "^7.
|
|
72
|
-
"@typescript-eslint/parser": "^7.
|
|
68
|
+
"@types/node": "^20.14.2",
|
|
69
|
+
"@types/react": "^18.3.3",
|
|
70
|
+
"@types/react-dom": "^18.3.0",
|
|
71
|
+
"@typescript-eslint/eslint-plugin": "^7.13.0",
|
|
72
|
+
"@typescript-eslint/parser": "^7.13.0",
|
|
73
73
|
"concurrently": "^8.2.2",
|
|
74
74
|
"cpy-cli": "^5.0.0",
|
|
75
75
|
"del-cli": "^5.1.0",
|
|
76
76
|
"eslint": "^8.57.0",
|
|
77
|
-
"eslint-plugin-react": "^7.34.
|
|
77
|
+
"eslint-plugin-react": "^7.34.2",
|
|
78
78
|
"jest": "^29.7.0",
|
|
79
79
|
"jest-environment-jsdom": "^29.7.0",
|
|
80
80
|
"madge": "^7.0.0",
|
|
81
81
|
"mkdirp": "^3.0.1",
|
|
82
|
-
"ts-jest": "^29.1.
|
|
82
|
+
"ts-jest": "^29.1.5",
|
|
83
83
|
"ts-node": "^10.9.2",
|
|
84
84
|
"typescript": "^5.4.5"
|
|
85
85
|
},
|
package/query/Shortcut.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const getShortcutQuery = "\n query($path:ID!){\n guillotine {\n get(key:$path) {\n ... on base_Shortcut {\n data {\n target {\n pageUrl(type: absolute)\n }\n }\n }\n }\n }\n }";
|
|
1
|
+
export declare const getShortcutQuery = "\n query($path:ID!){\n guillotine {\n get(key:$path) {\n ... on base_Shortcut {\n data {\n target {\n pageUrl(type: absolute)\n }\n parameters {\n name\n value\n }\n }\n }\n }\n }\n }";
|
package/query/Shortcut.js
CHANGED
package/query/Shortcut.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Shortcut.js","sourceRoot":"","sources":["../src/query/Shortcut.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG
|
|
1
|
+
{"version":3,"file":"Shortcut.js","sourceRoot":"","sources":["../src/query/Shortcut.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;IAiB5B,CAAC"}
|
|
@@ -4,8 +4,8 @@ import type {ImageData, LinkData, MetaData} from '../types';
|
|
|
4
4
|
import {RENDER_MODE} from './constants';
|
|
5
5
|
import {fixDoubleSlashes} from '../utils/fixDoubleSlashes';
|
|
6
6
|
import {getLocaleMappingByProjectId} from '../utils/getLocaleMappingByProjectId';
|
|
7
|
-
import {commonChars} from '../utils/commonChars';
|
|
8
7
|
import {addBasePath} from 'next/dist/client/add-base-path';
|
|
8
|
+
import {parseUrl} from 'next/dist/shared/lib/router/utils/parse-url';
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
export class UrlProcessor {
|
|
@@ -43,9 +43,9 @@ export class UrlProcessor {
|
|
|
43
43
|
const apiUrl = this.getApiUrl(meta);
|
|
44
44
|
normalUrl = this.stripApiUrl(url, apiUrl);
|
|
45
45
|
}
|
|
46
|
-
|
|
46
|
+
|
|
47
47
|
const baseUrl = meta?.baseUrl && meta?.baseUrl !== '/' ? meta.baseUrl : '';
|
|
48
|
-
|
|
48
|
+
|
|
49
49
|
let result: string;
|
|
50
50
|
if (meta.renderMode === RENDER_MODE.NEXT) {
|
|
51
51
|
// only add basePath and locale in next mode
|
|
@@ -100,11 +100,31 @@ export class UrlProcessor {
|
|
|
100
100
|
|
|
101
101
|
private static stripApiUrl(url: string, apiUrl: string): string {
|
|
102
102
|
// normalise localhost-127.0.0.1 if present in urls
|
|
103
|
-
const normalUrl = url.replace(this.localhostPattern, '127.0.0.1');
|
|
104
|
-
const normalApiUrl = apiUrl.replace(this.localhostPattern, '127.0.0.1');
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
103
|
+
const normalUrl = parseUrl(url.replace(this.localhostPattern, '127.0.0.1'));
|
|
104
|
+
const normalApiUrl = parseUrl(apiUrl.replace(this.localhostPattern, '127.0.0.1'));
|
|
105
|
+
|
|
106
|
+
// WARNING! disregarding the protocol (http/https)
|
|
107
|
+
|
|
108
|
+
if (normalUrl.hostname !== normalApiUrl.hostname
|
|
109
|
+
|| normalUrl.port !== normalApiUrl.port) {
|
|
110
|
+
// can't strip apiUrl if hostnames or ports are different
|
|
111
|
+
return url;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const urlPathCrumbs = normalUrl.pathname.split('/');
|
|
115
|
+
const apiUrlPathCrumbs = normalApiUrl.pathname.split('/');
|
|
116
|
+
for (let i = 0; i < Math.min(apiUrlPathCrumbs.length, urlPathCrumbs.length);) {
|
|
117
|
+
const urlPathCrumb = urlPathCrumbs[i];
|
|
118
|
+
const apiUrlPathCrumb = apiUrlPathCrumbs[i];
|
|
119
|
+
if (urlPathCrumb === apiUrlPathCrumb) {
|
|
120
|
+
urlPathCrumbs.shift();
|
|
121
|
+
apiUrlPathCrumbs.shift();
|
|
122
|
+
} else {
|
|
123
|
+
i++;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return `/${urlPathCrumbs.join('/')}` + normalUrl.search + normalUrl.hash;
|
|
108
128
|
}
|
|
109
129
|
|
|
110
130
|
private static isAttachmentUrl(url: string): boolean {
|
package/src/common/constants.ts
CHANGED
|
@@ -16,7 +16,7 @@ export const FRAGMENT_DEFAULT_REGION_NAME = 'fragment';
|
|
|
16
16
|
* - media
|
|
17
17
|
* - paths with '/_' in them
|
|
18
18
|
*/
|
|
19
|
-
export const GET_STATIC_PATHS_QUERY = `query ($count: Int) {
|
|
19
|
+
export const GET_STATIC_PATHS_QUERY = `query ($pathRegex: String!, $count: Int) {
|
|
20
20
|
guillotine {
|
|
21
21
|
queryDsl(
|
|
22
22
|
first: $count,
|
|
@@ -24,10 +24,17 @@ export const GET_STATIC_PATHS_QUERY = `query ($count: Int) {
|
|
|
24
24
|
field: "modifiedTime",
|
|
25
25
|
direction: DESC
|
|
26
26
|
}
|
|
27
|
-
query: {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
query: {
|
|
28
|
+
boolean: {
|
|
29
|
+
mustNot: [
|
|
30
|
+
{in: {field: "type", stringValues: ["base:shortcut", "portal:fragment", "portal:template-folder", "portal:page-template"]}}
|
|
31
|
+
{like: {field: "type", value: "media:*"}}
|
|
32
|
+
]
|
|
33
|
+
must: [
|
|
34
|
+
{like: {field:"_path", value: $pathRegex}}
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
}
|
|
31
38
|
) {
|
|
32
39
|
_name
|
|
33
40
|
_path
|
|
@@ -9,15 +9,21 @@ import {UrlProcessor} from '../common/UrlProcessor';
|
|
|
9
9
|
|
|
10
10
|
export function validateShortcut(props: FetchContentResult): void {
|
|
11
11
|
const {data, meta, error} = props;
|
|
12
|
-
const
|
|
12
|
+
const dataObj = data?.get?.data;
|
|
13
|
+
const pageUrl = dataObj?.target?.pageUrl;
|
|
14
|
+
const parameters = dataObj?.parameters;
|
|
13
15
|
if (meta.type === 'base:shortcut' && pageUrl) {
|
|
14
16
|
if (meta.renderMode !== RENDER_MODE.NEXT) {
|
|
15
17
|
// do not show shortcut targets in preview/edit mode
|
|
16
|
-
console.warn(404, `Shortcuts are not available in ${
|
|
18
|
+
console.warn(404, `Shortcuts are not available in ${meta.renderMode} render mode`);
|
|
17
19
|
notFound();
|
|
18
20
|
}
|
|
19
21
|
|
|
20
|
-
|
|
22
|
+
let destination = UrlProcessor.process(pageUrl, meta, true);
|
|
23
|
+
if (parameters) {
|
|
24
|
+
const searchParams = parameters.map(({name, value}) => `${encodeURIComponent(name)}=${encodeURIComponent(value)}`).join('&');
|
|
25
|
+
destination += '?' + searchParams;
|
|
26
|
+
}
|
|
21
27
|
console.debug(`Redirecting shortcut content [${meta.path}] to`, destination);
|
|
22
28
|
redirect(destination, RedirectType.replace);
|
|
23
29
|
}
|
|
@@ -34,4 +40,4 @@ export function validateShortcut(props: FetchContentResult): void {
|
|
|
34
40
|
console.warn(404, `Can not render content at [${meta.path}]`);
|
|
35
41
|
notFound();
|
|
36
42
|
}
|
|
37
|
-
}
|
|
43
|
+
}
|
|
@@ -23,11 +23,14 @@ export const LocaleContextProvider = ({
|
|
|
23
23
|
}) => {
|
|
24
24
|
const [currentLocale, setLocaleState] = useState(localeProps);
|
|
25
25
|
const [dictionary, setPhrasesState] = useState<Dict>({});
|
|
26
|
+
const [isLoaded, setLoadedState] = useState(false);
|
|
26
27
|
|
|
27
28
|
const setLocale = async (locale: string): Promise<Dict> => {
|
|
28
29
|
setLocaleState(locale);
|
|
30
|
+
setLoadedState(false);
|
|
29
31
|
return loadPhrases(locale).then((phrases) => {
|
|
30
32
|
setPhrasesState(phrases);
|
|
33
|
+
setLoadedState(true);
|
|
31
34
|
return phrases;
|
|
32
35
|
});
|
|
33
36
|
};
|
|
@@ -38,7 +41,9 @@ export const LocaleContextProvider = ({
|
|
|
38
41
|
}
|
|
39
42
|
}, []);
|
|
40
43
|
|
|
41
|
-
const localize = (key: string, ...args: any[]) =>
|
|
44
|
+
const localize = (key: string, ...args: any[]) => {
|
|
45
|
+
return isLoaded ? getPhrase(currentLocale, dictionary, key, ...args) : key;
|
|
46
|
+
};
|
|
42
47
|
|
|
43
48
|
return (
|
|
44
49
|
<LocaleContext.Provider value={{
|
package/src/i18n/i18n.ts
CHANGED
|
@@ -4,17 +4,20 @@ import type {Dict} from '../types';
|
|
|
4
4
|
export class I18n {
|
|
5
5
|
private static locale = '';
|
|
6
6
|
private static dictionary: Dict = {};
|
|
7
|
+
private static isLoaded = false;
|
|
7
8
|
|
|
8
9
|
public static async setLocale(locale: string): Promise<Dict> {
|
|
9
10
|
this.locale = locale;
|
|
11
|
+
this.isLoaded = false;
|
|
10
12
|
return loadPhrases(locale).then((phrases) => {
|
|
11
13
|
this.dictionary = phrases;
|
|
14
|
+
this.isLoaded = true;
|
|
12
15
|
return phrases;
|
|
13
16
|
});
|
|
14
17
|
}
|
|
15
18
|
|
|
16
19
|
public static localize(key: string, ...args: any[]): string {
|
|
17
|
-
return getPhrase(this.locale, this.dictionary, key, ...args);
|
|
20
|
+
return this.isLoaded ? getPhrase(this.locale, this.dictionary, key, ...args) : key;
|
|
18
21
|
}
|
|
19
22
|
|
|
20
23
|
public static getLocale() {
|
package/src/query/Shortcut.ts
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import {DOMNode} from 'html-react-parser';
|
|
2
|
-
import type {
|
|
3
|
-
RENDER_MODE,
|
|
4
|
-
XP_REQUEST_TYPE,
|
|
5
|
-
} from '../common/constants';
|
|
2
|
+
import type {RENDER_MODE, XP_REQUEST_TYPE} from '../common/constants';
|
|
6
3
|
import type {
|
|
7
4
|
FragmentData,
|
|
8
5
|
LayoutData,
|
|
@@ -130,7 +127,7 @@ export type Replacer = (
|
|
|
130
127
|
renderMacroInEditMode: boolean
|
|
131
128
|
) => ReplacerResult;
|
|
132
129
|
|
|
133
|
-
export type ReplacerResult = JSX.Element |
|
|
130
|
+
export type ReplacerResult = JSX.Element | DOMNode;
|
|
134
131
|
|
|
135
132
|
export interface RichTextViewProps {
|
|
136
133
|
data: RichTextData
|
|
@@ -139,4 +136,4 @@ export interface RichTextViewProps {
|
|
|
139
136
|
tag?: string
|
|
140
137
|
renderMacroInEditMode?: boolean
|
|
141
138
|
customReplacer?: Replacer
|
|
142
|
-
}
|
|
139
|
+
}
|
|
@@ -3,16 +3,15 @@ import type {MetaData, Replacer, ReplacerResult, RichTextData, RichTextViewProps
|
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
import {getUrl, UrlProcessor} from '../common/UrlProcessor';
|
|
6
|
-
import HTMLReactParser, {DOMNode} from 'html-react-parser';
|
|
6
|
+
import HTMLReactParser, {DOMNode, domToReact} from 'html-react-parser';
|
|
7
7
|
import {ElementType} from 'domelementtype';
|
|
8
8
|
import BaseMacro from './BaseMacro';
|
|
9
9
|
import Link from 'next/link';
|
|
10
|
-
import {Text} from 'domhandler';
|
|
11
10
|
|
|
12
11
|
|
|
13
12
|
export function createReplacer(allData: RichTextData, meta: MetaData, renderMacroInEditMode = true, customReplacer?: Replacer): (domNode: DOMNode) => ReplacerResult {
|
|
14
13
|
// eslint-disable-next-line react/display-name
|
|
15
|
-
|
|
14
|
+
const replacerFn = (domNode: DOMNode): ReplacerResult => {
|
|
16
15
|
if (domNode.type !== ElementType.Tag) {
|
|
17
16
|
return domNode;
|
|
18
17
|
}
|
|
@@ -41,8 +40,8 @@ export function createReplacer(allData: RichTextData, meta: MetaData, renderMacr
|
|
|
41
40
|
const href = el.attribs['href'];
|
|
42
41
|
|
|
43
42
|
if (ref && href) {
|
|
44
|
-
const
|
|
45
|
-
return <Link href={getUrl(href, meta)}>{
|
|
43
|
+
const domNodes = el.children as DOMNode[];
|
|
44
|
+
return <Link href={getUrl(href, meta)}>{domToReact(domNodes, {replace: replacerFn})}</Link>;
|
|
46
45
|
}
|
|
47
46
|
break;
|
|
48
47
|
case UrlProcessor.MACRO_TAG:
|
|
@@ -63,6 +62,7 @@ export function createReplacer(allData: RichTextData, meta: MetaData, renderMacr
|
|
|
63
62
|
}
|
|
64
63
|
return el;
|
|
65
64
|
};
|
|
65
|
+
return replacerFn;
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
const RichTextView = ({className, tag, data, meta, renderMacroInEditMode, customReplacer}: RichTextViewProps) => {
|
|
@@ -93,7 +93,7 @@ export interface RegionsProps {
|
|
|
93
93
|
meta: MetaData;
|
|
94
94
|
}
|
|
95
95
|
export type Replacer = (domNode: DOMNode, data: RichTextData, meta: MetaData, renderMacroInEditMode: boolean) => ReplacerResult;
|
|
96
|
-
export type ReplacerResult = JSX.Element |
|
|
96
|
+
export type ReplacerResult = JSX.Element | DOMNode;
|
|
97
97
|
export interface RichTextViewProps {
|
|
98
98
|
data: RichTextData;
|
|
99
99
|
meta: MetaData;
|
package/views/RichTextView.jsx
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { getUrl, UrlProcessor } from '../common/UrlProcessor';
|
|
2
|
-
import HTMLReactParser from 'html-react-parser';
|
|
2
|
+
import HTMLReactParser, { domToReact } from 'html-react-parser';
|
|
3
3
|
import { ElementType } from 'domelementtype';
|
|
4
4
|
import BaseMacro from './BaseMacro';
|
|
5
5
|
import Link from 'next/link';
|
|
6
6
|
export function createReplacer(allData, meta, renderMacroInEditMode = true, customReplacer) {
|
|
7
7
|
// eslint-disable-next-line react/display-name
|
|
8
|
-
|
|
9
|
-
var _a;
|
|
8
|
+
const replacerFn = (domNode) => {
|
|
10
9
|
if (domNode.type !== ElementType.Tag) {
|
|
11
10
|
return domNode;
|
|
12
11
|
}
|
|
@@ -32,8 +31,8 @@ export function createReplacer(allData, meta, renderMacroInEditMode = true, cust
|
|
|
32
31
|
ref = el.attribs[UrlProcessor.LINK_ATTR];
|
|
33
32
|
const href = el.attribs['href'];
|
|
34
33
|
if (ref && href) {
|
|
35
|
-
const
|
|
36
|
-
return <Link href={getUrl(href, meta)}>{
|
|
34
|
+
const domNodes = el.children;
|
|
35
|
+
return <Link href={getUrl(href, meta)}>{domToReact(domNodes, { replace: replacerFn })}</Link>;
|
|
37
36
|
}
|
|
38
37
|
break;
|
|
39
38
|
case UrlProcessor.MACRO_TAG:
|
|
@@ -54,6 +53,7 @@ export function createReplacer(allData, meta, renderMacroInEditMode = true, cust
|
|
|
54
53
|
}
|
|
55
54
|
return el;
|
|
56
55
|
};
|
|
56
|
+
return replacerFn;
|
|
57
57
|
}
|
|
58
58
|
const RichTextView = ({ className, tag, data, meta, renderMacroInEditMode, customReplacer }) => {
|
|
59
59
|
const CustomTag = tag || 'section';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RichTextView.jsx","sourceRoot":"","sources":["../src/views/RichTextView.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAC,MAAM,EAAE,YAAY,EAAC,MAAM,wBAAwB,CAAC;AAC5D,OAAO,
|
|
1
|
+
{"version":3,"file":"RichTextView.jsx","sourceRoot":"","sources":["../src/views/RichTextView.tsx"],"names":[],"mappings":"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"}
|