@sitecore-content-sdk/nextjs 2.0.0-canary.1 → 2.0.0-canary.12
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/dist/cjs/editing/editing-render-middleware.js +15 -7
- package/dist/cjs/editing/types.js +2 -0
- package/dist/cjs/editing/utils.js +30 -1
- package/dist/cjs/index.js +8 -1
- package/dist/cjs/initialization/proxy/analytics-adapter.js +80 -0
- package/dist/cjs/initialization/proxy/personalize-adapter.js +81 -0
- package/dist/cjs/middleware/robots-middleware.js +3 -1
- package/dist/cjs/middleware/sitemap-middleware.js +3 -1
- package/dist/cjs/proxy/personalize-proxy.js +32 -15
- package/dist/cjs/route-handler/editing-render-route-handler.js +12 -5
- package/dist/cjs/tools/codegen/import-map.js +2 -2
- package/dist/cjs/tools/index.js +6 -6
- package/dist/cjs/tools/templating/utils.js +5 -6
- package/dist/esm/editing/editing-render-middleware.js +16 -8
- package/dist/esm/editing/types.js +1 -0
- package/dist/esm/editing/utils.js +28 -0
- package/dist/esm/index.js +4 -1
- package/dist/esm/initialization/proxy/analytics-adapter.js +75 -0
- package/dist/esm/initialization/proxy/personalize-adapter.js +78 -0
- package/dist/esm/middleware/robots-middleware.js +3 -1
- package/dist/esm/middleware/sitemap-middleware.js +3 -1
- package/dist/esm/proxy/personalize-proxy.js +32 -15
- package/dist/esm/route-handler/editing-render-route-handler.js +13 -6
- package/dist/esm/tools/codegen/import-map.js +1 -1
- package/dist/esm/tools/index.js +2 -2
- package/dist/esm/tools/templating/utils.js +1 -2
- package/package.json +10 -10
- package/types/components/Placeholder.d.ts +2 -2
- package/types/components/Placeholder.d.ts.map +1 -1
- package/types/config/define-config.d.ts.map +1 -1
- package/types/editing/editing-config-middleware.d.ts +1 -1
- package/types/editing/editing-config-middleware.d.ts.map +1 -1
- package/types/editing/editing-render-middleware.d.ts +7 -0
- package/types/editing/editing-render-middleware.d.ts.map +1 -1
- package/types/editing/index.d.ts +1 -0
- package/types/editing/index.d.ts.map +1 -1
- package/types/editing/types.d.ts +37 -0
- package/types/editing/types.d.ts.map +1 -0
- package/types/editing/utils.d.ts +11 -0
- package/types/editing/utils.d.ts.map +1 -1
- package/types/index.d.ts +7 -1
- package/types/index.d.ts.map +1 -1
- package/types/initialization/proxy/analytics-adapter.d.ts +30 -0
- package/types/initialization/proxy/analytics-adapter.d.ts.map +1 -0
- package/types/initialization/proxy/personalize-adapter.d.ts +23 -0
- package/types/initialization/proxy/personalize-adapter.d.ts.map +1 -0
- package/types/middleware/robots-middleware.d.ts.map +1 -1
- package/types/middleware/sitemap-middleware.d.ts.map +1 -1
- package/types/proxy/personalize-proxy.d.ts +2 -1
- package/types/proxy/personalize-proxy.d.ts.map +1 -1
- package/types/route-handler/editing-config-route-handler.d.ts +1 -1
- package/types/route-handler/editing-config-route-handler.d.ts.map +1 -1
- package/types/route-handler/editing-render-route-handler.d.ts +7 -0
- package/types/route-handler/editing-render-route-handler.d.ts.map +1 -1
- package/types/tools/codegen/import-map.d.ts +1 -1
- package/types/tools/codegen/import-map.d.ts.map +1 -1
- package/types/tools/index.d.ts +3 -2
- package/types/tools/index.d.ts.map +1 -1
- package/types/tools/templating/utils.d.ts +1 -1
- package/types/tools/templating/utils.d.ts.map +1 -1
|
@@ -34,7 +34,7 @@ class EditingRenderMiddleware extends render_middleware_1.RenderMiddlewareBase {
|
|
|
34
34
|
super();
|
|
35
35
|
this.config = config;
|
|
36
36
|
this.handler = (req, res) => __awaiter(this, void 0, void 0, function* () {
|
|
37
|
-
var _a, _b, _c, _d, _e;
|
|
37
|
+
var _a, _b, _c, _d, _e, _f;
|
|
38
38
|
const { body, method, headers, query } = req;
|
|
39
39
|
debug_1.default.editing('editing render middleware start: %o', {
|
|
40
40
|
method,
|
|
@@ -81,15 +81,22 @@ class EditingRenderMiddleware extends render_middleware_1.RenderMiddlewareBase {
|
|
|
81
81
|
const mode = query.mode;
|
|
82
82
|
const requiredQueryParams = (0, utils_2.getRequiredEditingParamsList)(mode);
|
|
83
83
|
const missingQueryParams = requiredQueryParams.filter((param) => !query[param]);
|
|
84
|
+
const { allowedQueryParams, missingAllowedParams } = (0, utils_2.getAllowedQueryParams)(query, (_b = this.config) === null || _b === void 0 ? void 0 : _b.allowedQueryParams);
|
|
84
85
|
// Validate query parameters
|
|
85
|
-
if (missingQueryParams.length) {
|
|
86
|
-
debug_1.default.editing('missing required query parameters: %o',
|
|
86
|
+
if (missingQueryParams.length || missingAllowedParams.length) {
|
|
87
|
+
debug_1.default.editing('missing required query parameters: %o', [
|
|
88
|
+
...missingQueryParams,
|
|
89
|
+
...missingAllowedParams,
|
|
90
|
+
]);
|
|
87
91
|
return res.status(400).json({
|
|
88
|
-
html: `<html><body>Missing required query parameters: ${
|
|
92
|
+
html: `<html><body>Missing required query parameters: ${[
|
|
93
|
+
...missingQueryParams,
|
|
94
|
+
...missingAllowedParams,
|
|
95
|
+
].join(', ')}</body></html>`,
|
|
89
96
|
});
|
|
90
97
|
}
|
|
91
98
|
const previewDataParams = (0, utils_2.mapEditingParams)(query);
|
|
92
|
-
res.setPreviewData(Object.assign(Object.assign({}, previewDataParams), { variantIds: (
|
|
99
|
+
res.setPreviewData(Object.assign(Object.assign(Object.assign({}, previewDataParams), allowedQueryParams), { variantIds: (_c = previewDataParams.variantIds) === null || _c === void 0 ? void 0 : _c.split(',') }), {
|
|
93
100
|
maxAge: 3,
|
|
94
101
|
});
|
|
95
102
|
// Set Preview mode identifier cookie, if the page is rendered in Sitecore Preview mode
|
|
@@ -101,8 +108,8 @@ class EditingRenderMiddleware extends render_middleware_1.RenderMiddlewareBase {
|
|
|
101
108
|
// Restrict the page to be rendered only within the allowed origins
|
|
102
109
|
res.setHeader('Content-Security-Policy', (0, utils_2.getCSPHeader)());
|
|
103
110
|
const encodedRoute = encodeURI(query.route);
|
|
104
|
-
const route = ((
|
|
105
|
-
const base = ((
|
|
111
|
+
const route = ((_e = (_d = this.config) === null || _d === void 0 ? void 0 : _d.resolvePageUrl) === null || _e === void 0 ? void 0 : _e.call(_d, encodedRoute)) || encodedRoute;
|
|
112
|
+
const base = ((_f = this.config) === null || _f === void 0 ? void 0 : _f.sitecoreInternalEditingHostUrl) || (0, utils_2.resolveServerUrl)(req);
|
|
106
113
|
const requestUrl = new URL(route, base);
|
|
107
114
|
const cookies = res.getHeader('Set-Cookie');
|
|
108
115
|
// Make actual render request for page route, passing on preview cookies as well as any approved query string parameters.
|
|
@@ -123,6 +130,7 @@ class EditingRenderMiddleware extends render_middleware_1.RenderMiddlewareBase {
|
|
|
123
130
|
status: 200,
|
|
124
131
|
route,
|
|
125
132
|
});
|
|
133
|
+
res.setHeader('Content-Type', 'text/html; charset=utf-8');
|
|
126
134
|
res.status(200).send(html);
|
|
127
135
|
}
|
|
128
136
|
catch (err) {
|
|
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.getCSPHeader = exports.resolveServerUrl = exports.isDesignLibraryPreviewData = exports.getEditingRequestHtml = exports.getHeadersForPropagation = exports.getQueryParamsForPropagation = exports.getRequiredEditingParamsList = exports.getPreviewCookies = exports.cleanupNextPreviewCookies = exports.mapEditingParams = exports.getEditingSecretFromRequest = void 0;
|
|
12
|
+
exports.getCSPHeader = exports.resolveServerUrl = exports.isDesignLibraryPreviewData = exports.getEditingRequestHtml = exports.getHeadersForPropagation = exports.getQueryParamsForPropagation = exports.getRequiredEditingParamsList = exports.getPreviewCookies = exports.cleanupNextPreviewCookies = exports.getAllowedQueryParams = exports.mapEditingParams = exports.getEditingSecretFromRequest = void 0;
|
|
13
13
|
const editing_1 = require("@sitecore-content-sdk/content/editing");
|
|
14
14
|
const personalize_1 = require("@sitecore-content-sdk/content/personalize");
|
|
15
15
|
const site_1 = require("@sitecore-content-sdk/content/site");
|
|
@@ -69,6 +69,35 @@ const mapEditingParams = (query) => {
|
|
|
69
69
|
return params;
|
|
70
70
|
};
|
|
71
71
|
exports.mapEditingParams = mapEditingParams;
|
|
72
|
+
/**
|
|
73
|
+
* Parses the query parameters based on the provided allowed parameters or a resolver function, to extract additional parameters that should be allowed.
|
|
74
|
+
* @param {{ [key: string]: string | undefined }} queryParams Object of query parameters from incoming URL.
|
|
75
|
+
* @param {AllowedQueryParams} allowedParams Allowed parameters to map.
|
|
76
|
+
* @returns Object containing the list of missing required parameters and the allowed query parameters that were extracted.
|
|
77
|
+
* @internal
|
|
78
|
+
*/
|
|
79
|
+
const getAllowedQueryParams = (queryParams, allowedParams) => {
|
|
80
|
+
const allowedQueryParamsList = typeof allowedParams === 'function'
|
|
81
|
+
? allowedParams(Object.keys(queryParams))
|
|
82
|
+
: Array.isArray(allowedParams)
|
|
83
|
+
? allowedParams
|
|
84
|
+
: [];
|
|
85
|
+
if (!allowedQueryParamsList.length)
|
|
86
|
+
return { missingAllowedParams: [], allowedQueryParams: {} };
|
|
87
|
+
return allowedQueryParamsList.reduce((acc, param) => {
|
|
88
|
+
const name = typeof param === 'string' ? param : param.name;
|
|
89
|
+
const required = typeof param === 'string' ? false : param.required;
|
|
90
|
+
const value = queryParams[name];
|
|
91
|
+
if (value !== undefined) {
|
|
92
|
+
acc.allowedQueryParams[name] = value;
|
|
93
|
+
return acc;
|
|
94
|
+
}
|
|
95
|
+
if (required)
|
|
96
|
+
acc.missingAllowedParams.push(name);
|
|
97
|
+
return acc;
|
|
98
|
+
}, { missingAllowedParams: [], allowedQueryParams: {} });
|
|
99
|
+
};
|
|
100
|
+
exports.getAllowedQueryParams = getAllowedQueryParams;
|
|
72
101
|
/**
|
|
73
102
|
* Filters out Next.js preview cookies from a cookie string or array
|
|
74
103
|
* @param {string | string[] | null} cookies cookie header value
|
package/dist/cjs/index.js
CHANGED
|
@@ -37,7 +37,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.BYOCWrapper = exports.FEaaSWrapper = exports.BYOCServerWrapper = exports.BYOCClientWrapper = exports.FEaaSServerWrapper = exports.FEaaSClientWrapper = exports.NextImage = exports.Placeholder = exports.RichText = exports.Link = exports.useComponentProps = exports.ComponentPropsContext = exports.ComponentPropsReactContext = exports.ComponentPropsService = exports.normalizeSiteRewrite = exports.getSiteRewriteData = exports.getSiteRewrite = exports.SiteInfoService = exports.SiteResolver = exports.RobotsService = exports.ErrorPagesService = exports.SitemapXmlService = exports.REDIRECT_TYPE_SERVER_TRANSFER = exports.REDIRECT_TYPE_302 = exports.REDIRECT_TYPE_301 = exports.RedirectsService = exports.SitePathService = exports.PersonalizeService = exports.CdpHelper = exports.normalizePersonalizedRewrite = exports.getGroomedVariantIds = exports.getPersonalizedRewriteData = exports.getPersonalizedRewrite = exports.personalizeLayout = exports.DictionaryService = exports.mediaApi = exports.ComponentLayoutService = exports.ErrorPage = exports.RenderingType = exports.EditMode = exports.getContentStylesheetLink = exports.getFieldValue = exports.getChildPlaceholder = exports.LayoutService = exports.LayoutServicePageState = exports.MemoryCacheClient = exports.enableDebug = exports.NativeDataFetcher = exports.constants = exports.debug = void 0;
|
|
40
|
-
exports.renderEmptyPlaceholder = exports.AppPlaceholder = exports.ClientEditingChromesUpdate = exports.Form = exports.EditingScripts = exports.withEmptyFieldEditingComponent = exports.withFieldMetadata = exports.withDatasourceCheck = exports.withPlaceholder = exports.withEditorChromes = exports.useSitecore = exports.withSitecore = exports.SitecoreProviderReactContext = exports.SitecoreProvider = exports.DefaultEmptyFieldEditingComponentText = exports.DefaultEmptyFieldEditingComponentImage = exports.DesignLibraryApp = exports.DesignLibrary = exports.File = exports.getDesignLibraryStylesheetLinks = exports.BYOCComponent = exports.fetchFEaaSComponentServerProps = exports.FEaaSComponent = exports.DateField = exports.Text = exports.Image = void 0;
|
|
40
|
+
exports.analyticsProxyAdapter = exports.personalizeProxyAdapter = exports.initContentSdk = exports.renderEmptyPlaceholder = exports.AppPlaceholder = exports.ClientEditingChromesUpdate = exports.Form = exports.EditingScripts = exports.withEmptyFieldEditingComponent = exports.withFieldMetadata = exports.withDatasourceCheck = exports.withPlaceholder = exports.withAppPlaceholder = exports.withEditorChromes = exports.useSitecore = exports.withSitecore = exports.SitecoreProviderReactContext = exports.SitecoreProvider = exports.DefaultEmptyFieldEditingComponentText = exports.DefaultEmptyFieldEditingComponentImage = exports.DesignLibraryApp = exports.DesignLibrary = exports.File = exports.getDesignLibraryStylesheetLinks = exports.BYOCComponent = exports.fetchFEaaSComponentServerProps = exports.FEaaSComponent = exports.DateField = exports.Text = exports.Image = void 0;
|
|
41
41
|
var debug_1 = require("./debug");
|
|
42
42
|
Object.defineProperty(exports, "debug", { enumerable: true, get: function () { return __importDefault(debug_1).default; } });
|
|
43
43
|
var core_1 = require("@sitecore-content-sdk/core");
|
|
@@ -126,6 +126,7 @@ Object.defineProperty(exports, "SitecoreProviderReactContext", { enumerable: tru
|
|
|
126
126
|
Object.defineProperty(exports, "withSitecore", { enumerable: true, get: function () { return react_2.withSitecore; } });
|
|
127
127
|
Object.defineProperty(exports, "useSitecore", { enumerable: true, get: function () { return react_2.useSitecore; } });
|
|
128
128
|
Object.defineProperty(exports, "withEditorChromes", { enumerable: true, get: function () { return react_2.withEditorChromes; } });
|
|
129
|
+
Object.defineProperty(exports, "withAppPlaceholder", { enumerable: true, get: function () { return react_2.withAppPlaceholder; } });
|
|
129
130
|
Object.defineProperty(exports, "withPlaceholder", { enumerable: true, get: function () { return react_2.withPlaceholder; } });
|
|
130
131
|
Object.defineProperty(exports, "withDatasourceCheck", { enumerable: true, get: function () { return react_2.withDatasourceCheck; } });
|
|
131
132
|
Object.defineProperty(exports, "withFieldMetadata", { enumerable: true, get: function () { return react_2.withFieldMetadata; } });
|
|
@@ -135,3 +136,9 @@ Object.defineProperty(exports, "Form", { enumerable: true, get: function () { re
|
|
|
135
136
|
Object.defineProperty(exports, "ClientEditingChromesUpdate", { enumerable: true, get: function () { return react_2.ClientEditingChromesUpdate; } });
|
|
136
137
|
Object.defineProperty(exports, "AppPlaceholder", { enumerable: true, get: function () { return react_2.AppPlaceholder; } });
|
|
137
138
|
Object.defineProperty(exports, "renderEmptyPlaceholder", { enumerable: true, get: function () { return react_2.renderEmptyPlaceholder; } });
|
|
139
|
+
var core_2 = require("@sitecore-content-sdk/core");
|
|
140
|
+
Object.defineProperty(exports, "initContentSdk", { enumerable: true, get: function () { return core_2.initContentSdk; } });
|
|
141
|
+
var personalize_adapter_1 = require("./initialization/proxy/personalize-adapter");
|
|
142
|
+
Object.defineProperty(exports, "personalizeProxyAdapter", { enumerable: true, get: function () { return personalize_adapter_1.personalizeProxyAdapter; } });
|
|
143
|
+
var analytics_adapter_1 = require("./initialization/proxy/analytics-adapter");
|
|
144
|
+
Object.defineProperty(exports, "analyticsProxyAdapter", { enumerable: true, get: function () { return analytics_adapter_1.analyticsProxyAdapter; } });
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.getClientId = void 0;
|
|
13
|
+
exports.analyticsProxyAdapter = analyticsProxyAdapter;
|
|
14
|
+
const internal_1 = require("@sitecore-content-sdk/analytics-core/internal");
|
|
15
|
+
const internal_2 = require("@sitecore-content-sdk/analytics-core/internal");
|
|
16
|
+
const core_1 = require("@sitecore-content-sdk/core");
|
|
17
|
+
/**
|
|
18
|
+
* Creates a proxy-based analytics adapter that reads and writes the visitor ID
|
|
19
|
+
* using cookies and can resolve a new client ID from the Edge proxy when needed.
|
|
20
|
+
* The adapter also provides access to the current URL search parameters.
|
|
21
|
+
* @param {NextRequest} request - The Next.js request object.
|
|
22
|
+
* @param {NextResponse} response - The Next.js response object.
|
|
23
|
+
* @returns {AnalyticsProxyAdapter} The analytics proxy adapter.
|
|
24
|
+
* @public
|
|
25
|
+
*/
|
|
26
|
+
function analyticsProxyAdapter(request, response) {
|
|
27
|
+
return {
|
|
28
|
+
type: 'proxy',
|
|
29
|
+
getClientId: () => {
|
|
30
|
+
return (0, exports.getClientId)(request);
|
|
31
|
+
},
|
|
32
|
+
setClientId: () => __awaiter(this, void 0, void 0, function* () {
|
|
33
|
+
var _a;
|
|
34
|
+
const coreConfig = (0, core_1.getCoreContext)().config;
|
|
35
|
+
const analyticsOptions = (0, internal_2.getAnalyticsPlugin)().options;
|
|
36
|
+
const cookieOptions = analyticsOptions.cookies;
|
|
37
|
+
const clientIdCookieName = cookieOptions.name;
|
|
38
|
+
const legacyClientIdCookieName = `${internal_1.COOKIE_NAME_PREFIX}${coreConfig.contextId}`;
|
|
39
|
+
const cookieAttributes = (0, internal_1.getDefaultCookieAttributes)(cookieOptions.expiryDays, cookieOptions.domain);
|
|
40
|
+
const legacyClientIdCookie = (_a = request.cookies.get(legacyClientIdCookieName)) === null || _a === void 0 ? void 0 : _a.value;
|
|
41
|
+
if (legacyClientIdCookie) {
|
|
42
|
+
request.cookies.set(clientIdCookieName, legacyClientIdCookie);
|
|
43
|
+
response.cookies.set(clientIdCookieName, legacyClientIdCookie, Object.assign(Object.assign({}, cookieAttributes), { sameSite: 'none' }));
|
|
44
|
+
request.cookies.delete(legacyClientIdCookieName);
|
|
45
|
+
response.cookies.delete(legacyClientIdCookieName);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const clientIdCookie = (0, exports.getClientId)(request);
|
|
49
|
+
let newClientIdCookieValue;
|
|
50
|
+
if (!clientIdCookie) {
|
|
51
|
+
const cookieValues = yield (0, internal_1.fetchClientIdFromEdgeProxy)(coreConfig.edgeUrl, coreConfig.contextId, analyticsOptions.timeout);
|
|
52
|
+
newClientIdCookieValue = cookieValues.clientId;
|
|
53
|
+
analyticsOptions.visitorIds = cookieValues;
|
|
54
|
+
}
|
|
55
|
+
else
|
|
56
|
+
newClientIdCookieValue = clientIdCookie;
|
|
57
|
+
if (!clientIdCookie)
|
|
58
|
+
request.cookies.set(clientIdCookieName, newClientIdCookieValue);
|
|
59
|
+
const attributes = (0, internal_1.getDefaultCookieAttributes)(cookieOptions.expiryDays, cookieOptions.domain);
|
|
60
|
+
response.cookies.set(clientIdCookieName, newClientIdCookieValue, Object.assign(Object.assign({}, attributes), { sameSite: 'none' }));
|
|
61
|
+
}),
|
|
62
|
+
location: {
|
|
63
|
+
getSearchParams: () => {
|
|
64
|
+
return request.nextUrl.searchParams.toString();
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Retrieves the client ID from the request cookies.
|
|
71
|
+
* @param {NextRequest} request
|
|
72
|
+
* @returns {string | null} The client ID or null if not found.
|
|
73
|
+
* @internal
|
|
74
|
+
*/
|
|
75
|
+
const getClientId = (request) => {
|
|
76
|
+
var _a;
|
|
77
|
+
const clientIdCookieName = (0, internal_2.getAnalyticsPlugin)().options.cookies.name;
|
|
78
|
+
return ((_a = request.cookies.get(clientIdCookieName)) === null || _a === void 0 ? void 0 : _a.value) || null;
|
|
79
|
+
};
|
|
80
|
+
exports.getClientId = getClientId;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.personalizeProxyAdapter = personalizeProxyAdapter;
|
|
13
|
+
const internal_1 = require("@sitecore-content-sdk/analytics-core/internal");
|
|
14
|
+
const internal_2 = require("@sitecore-content-sdk/analytics-core/internal");
|
|
15
|
+
const core_1 = require("@sitecore-content-sdk/core");
|
|
16
|
+
const internal_3 = require("@sitecore-content-sdk/personalize/internal");
|
|
17
|
+
const analytics_adapter_1 = require("./analytics-adapter");
|
|
18
|
+
/**
|
|
19
|
+
* Creates a proxy-based personalize adapter that reads and writes the profile ID
|
|
20
|
+
* using cookies and can resolve a new profile ID from the Edge proxy when needed.
|
|
21
|
+
* The adapter also provides access user agent from the request headers.
|
|
22
|
+
* @param {NextRequest} request - The HTTP request object.
|
|
23
|
+
* @param {NextResponse} response - The HTTP response object.
|
|
24
|
+
* @returns {PersonalizeProxyAdapter} The personalize proxy adapter.
|
|
25
|
+
* @public
|
|
26
|
+
*/
|
|
27
|
+
function personalizeProxyAdapter(request, response) {
|
|
28
|
+
return {
|
|
29
|
+
type: 'proxy',
|
|
30
|
+
getUserAgent: () => request.headers.get('user-agent') || undefined,
|
|
31
|
+
getProfileId: () => {
|
|
32
|
+
return getProfileId(request);
|
|
33
|
+
},
|
|
34
|
+
setProfileId: () => __awaiter(this, void 0, void 0, function* () {
|
|
35
|
+
var _a;
|
|
36
|
+
const coreConfig = (0, core_1.getCoreContext)().config;
|
|
37
|
+
const cookieOptions = (0, internal_2.getAnalyticsPlugin)().options.cookies;
|
|
38
|
+
const personalizePlugin = (0, internal_3.getPersonalizePlugin)();
|
|
39
|
+
const profileIdCookieName = personalizePlugin.options.cookies.name;
|
|
40
|
+
const cookieAttributes = (0, internal_1.getDefaultCookieAttributes)(cookieOptions.expiryDays, cookieOptions.domain);
|
|
41
|
+
const legacyProfileIdCookieName = `${internal_1.COOKIE_NAME_PREFIX}${coreConfig.contextId}_personalize`;
|
|
42
|
+
const legacyProfileIdCookie = (_a = request.cookies.get(legacyProfileIdCookieName)) === null || _a === void 0 ? void 0 : _a.value;
|
|
43
|
+
if (legacyProfileIdCookie) {
|
|
44
|
+
request.cookies.set(profileIdCookieName, legacyProfileIdCookie);
|
|
45
|
+
response.cookies.set(profileIdCookieName, legacyProfileIdCookie, Object.assign(Object.assign({}, cookieAttributes), { sameSite: 'none' }));
|
|
46
|
+
request.cookies.delete(legacyProfileIdCookieName);
|
|
47
|
+
response.cookies.delete(legacyProfileIdCookieName);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const cookiesValuesFromEdgeServer = (0, internal_2.getAnalyticsPlugin)().options.visitorIds;
|
|
51
|
+
const profileIdCookie = getProfileId(request);
|
|
52
|
+
const clientIdCookie = (0, analytics_adapter_1.getClientId)(request);
|
|
53
|
+
let newProfileIdCookieValue;
|
|
54
|
+
if (profileIdCookie)
|
|
55
|
+
newProfileIdCookieValue = profileIdCookie;
|
|
56
|
+
else if (cookiesValuesFromEdgeServer === null || cookiesValuesFromEdgeServer === void 0 ? void 0 : cookiesValuesFromEdgeServer.profileId)
|
|
57
|
+
newProfileIdCookieValue = cookiesValuesFromEdgeServer.profileId;
|
|
58
|
+
else if (clientIdCookie) {
|
|
59
|
+
const profileIdCookieValueFromEdgeProxy = yield (0, internal_3.fetchProfileIdFromEdgeProxy)(clientIdCookie, coreConfig.contextId, coreConfig.edgeUrl);
|
|
60
|
+
newProfileIdCookieValue = profileIdCookieValueFromEdgeProxy;
|
|
61
|
+
}
|
|
62
|
+
else
|
|
63
|
+
return;
|
|
64
|
+
if (!profileIdCookie)
|
|
65
|
+
request.cookies.set(profileIdCookieName, newProfileIdCookieValue);
|
|
66
|
+
const attributes = (0, internal_1.getDefaultCookieAttributes)(cookieOptions.expiryDays, cookieOptions.domain);
|
|
67
|
+
response.cookies.set(profileIdCookieName, newProfileIdCookieValue, Object.assign(Object.assign({}, attributes), { sameSite: 'none' }));
|
|
68
|
+
}),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Retrieves the profile ID from request cookies.
|
|
73
|
+
* @param {NextRequest} request
|
|
74
|
+
* @returns {string | null} The profile ID or null if not found.
|
|
75
|
+
* @internal
|
|
76
|
+
*/
|
|
77
|
+
function getProfileId(request) {
|
|
78
|
+
var _a;
|
|
79
|
+
const profileIdCookieName = (0, internal_3.getPersonalizePlugin)().options.cookies.name;
|
|
80
|
+
return ((_a = request.cookies.get(profileIdCookieName)) === null || _a === void 0 ? void 0 : _a.value) || null;
|
|
81
|
+
}
|
|
@@ -10,7 +10,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.RobotsMiddleware = void 0;
|
|
13
|
+
const core_1 = require("@sitecore-content-sdk/core");
|
|
13
14
|
const site_1 = require("../site");
|
|
15
|
+
const { ERROR_MESSAGES } = core_1.constants;
|
|
14
16
|
/**
|
|
15
17
|
* Middleware for handling robots.txt requests in a Next.js application.
|
|
16
18
|
* @public
|
|
@@ -37,7 +39,7 @@ class RobotsMiddleware {
|
|
|
37
39
|
res.status(200).send(robotsContent);
|
|
38
40
|
}
|
|
39
41
|
catch (_b) {
|
|
40
|
-
res.status(500).send(
|
|
42
|
+
res.status(500).send(`Internal Server Error. ${ERROR_MESSAGES.CONTACT_SUPPORT}`);
|
|
41
43
|
}
|
|
42
44
|
});
|
|
43
45
|
}
|
|
@@ -10,7 +10,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.SitemapMiddleware = void 0;
|
|
13
|
+
const core_1 = require("@sitecore-content-sdk/core");
|
|
13
14
|
const site_1 = require("../site");
|
|
15
|
+
const { ERROR_MESSAGES } = core_1.constants;
|
|
14
16
|
/**
|
|
15
17
|
* Middleware for handling sitemap requests in a Next.js application.
|
|
16
18
|
* Encapsulates all HTTP-related logic for sitemap generation and delivery.
|
|
@@ -41,7 +43,7 @@ class SitemapMiddleware {
|
|
|
41
43
|
res.redirect('/404');
|
|
42
44
|
}
|
|
43
45
|
else {
|
|
44
|
-
res.status(500).send(
|
|
46
|
+
res.status(500).send(`Internal Server Error. ${ERROR_MESSAGES.CONTACT_SUPPORT}`);
|
|
45
47
|
}
|
|
46
48
|
}
|
|
47
49
|
});
|
|
@@ -15,9 +15,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
exports.PersonalizeProxy = void 0;
|
|
16
16
|
const personalize_1 = require("@sitecore-content-sdk/content/personalize");
|
|
17
17
|
const proxy_1 = require("./proxy");
|
|
18
|
-
const
|
|
19
|
-
const
|
|
18
|
+
const core_1 = require("@sitecore-content-sdk/core");
|
|
19
|
+
const personalize_2 = require("@sitecore-content-sdk/personalize");
|
|
20
20
|
const debug_1 = __importDefault(require("../debug"));
|
|
21
|
+
const analytics_core_1 = require("@sitecore-content-sdk/analytics-core");
|
|
22
|
+
const analytics_adapter_1 = require("../initialization/proxy/analytics-adapter");
|
|
23
|
+
const personalize_3 = require("@sitecore-content-sdk/personalize");
|
|
24
|
+
const personalize_adapter_1 = require("../initialization/proxy/personalize-adapter");
|
|
21
25
|
/**
|
|
22
26
|
* Proxy / handler to support Sitecore Personalize
|
|
23
27
|
* @public
|
|
@@ -93,7 +97,7 @@ class PersonalizeProxy extends proxy_1.ProxyBase {
|
|
|
93
97
|
const executions = this.getPersonalizeExecutions(personalizeInfo, language);
|
|
94
98
|
const identifiedVariantIds = [];
|
|
95
99
|
yield Promise.all(executions.map((execution) => this.personalize(Object.assign({ friendlyId: execution.friendlyId, variantIds: execution.variantIds, params,
|
|
96
|
-
language, timeout: cdpTimeout }, (geo && { geo }))
|
|
100
|
+
language, timeout: cdpTimeout }, (geo && { geo }))).then((personalization) => {
|
|
97
101
|
const variantId = personalization.variantId;
|
|
98
102
|
if (variantId) {
|
|
99
103
|
if (!execution.variantIds.includes(variantId)) {
|
|
@@ -177,22 +181,35 @@ class PersonalizeProxy extends proxy_1.ProxyBase {
|
|
|
177
181
|
}
|
|
178
182
|
initPersonalizeServer(_a) {
|
|
179
183
|
return __awaiter(this, arguments, void 0, function* ({ hostname, siteName, request, response, }) {
|
|
180
|
-
yield (0,
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
184
|
+
yield (0, core_1.initContentSdk)({
|
|
185
|
+
config: {
|
|
186
|
+
contextId: this.config.contextId,
|
|
187
|
+
edgeUrl: this.config.edgeUrl,
|
|
188
|
+
siteName,
|
|
189
|
+
},
|
|
190
|
+
plugins: [
|
|
191
|
+
(0, analytics_core_1.analyticsPlugin)({
|
|
192
|
+
options: {
|
|
193
|
+
enableCookie: true,
|
|
194
|
+
cookieDomain: hostname,
|
|
195
|
+
},
|
|
196
|
+
adapter: (0, analytics_adapter_1.analyticsProxyAdapter)(request, response),
|
|
197
|
+
}),
|
|
198
|
+
(0, personalize_3.personalizeServerPlugin)({
|
|
199
|
+
options: {
|
|
200
|
+
enablePersonalizeCookie: true,
|
|
201
|
+
},
|
|
202
|
+
adapter: (0, personalize_adapter_1.personalizeProxyAdapter)(request, response),
|
|
203
|
+
}),
|
|
204
|
+
],
|
|
205
|
+
});
|
|
189
206
|
});
|
|
190
207
|
}
|
|
191
|
-
personalize(_a
|
|
192
|
-
return __awaiter(this, arguments, void 0, function* ({ params, friendlyId, language, timeout, variantIds, geo, }
|
|
208
|
+
personalize(_a) {
|
|
209
|
+
return __awaiter(this, arguments, void 0, function* ({ params, friendlyId, language, timeout, variantIds, geo, }) {
|
|
193
210
|
var _b;
|
|
194
211
|
debug_1.default.personalize('executing experience for %s %o', friendlyId, params);
|
|
195
|
-
return (yield (0,
|
|
212
|
+
return (yield (0, personalize_2.personalize)(Object.assign({ channel: this.config.channel || 'WEB', currency: (_b = this.config.currency) !== null && _b !== void 0 ? _b : 'USD', friendlyId,
|
|
196
213
|
params,
|
|
197
214
|
language, pageVariantIds: variantIds }, (geo && { geo })), { timeout }));
|
|
198
215
|
});
|
|
@@ -116,11 +116,18 @@ const createEditingRenderRouteHandlers = (options) => {
|
|
|
116
116
|
const mode = query.mode;
|
|
117
117
|
const requiredQueryParams = (0, utils_2.getRequiredEditingParamsList)(mode);
|
|
118
118
|
const missingQueryParams = requiredQueryParams.filter((param) => !query[param]);
|
|
119
|
+
const { allowedQueryParams, missingAllowedParams } = (0, utils_2.getAllowedQueryParams)(query, options.allowedQueryParams);
|
|
119
120
|
// Validate query parameters
|
|
120
|
-
if (missingQueryParams.length) {
|
|
121
|
-
debug_1.default.editing('missing required query parameters: %o',
|
|
121
|
+
if (missingQueryParams.length || missingAllowedParams.length) {
|
|
122
|
+
debug_1.default.editing('missing required query parameters: %o', [
|
|
123
|
+
...missingQueryParams,
|
|
124
|
+
...missingAllowedParams,
|
|
125
|
+
]);
|
|
122
126
|
return Response.json({
|
|
123
|
-
html: `<html><body>Missing required query parameters: ${
|
|
127
|
+
html: `<html><body>Missing required query parameters: ${[
|
|
128
|
+
...missingQueryParams,
|
|
129
|
+
...missingAllowedParams,
|
|
130
|
+
].join(', ')}</body></html>`,
|
|
124
131
|
}, { status: 400, headers: responseHeaders });
|
|
125
132
|
}
|
|
126
133
|
const encodedRoute = encodeURI(query.route);
|
|
@@ -156,7 +163,7 @@ const createEditingRenderRouteHandlers = (options) => {
|
|
|
156
163
|
debug_1.default.editing('fetching page route for %s', query.route);
|
|
157
164
|
// Get query string parameters to propagate on subsequent requests (e.g. for deployment protection bypass)
|
|
158
165
|
// Additionally ,in app router preview data is passed through query string instead of preview data cookie
|
|
159
|
-
const propagatedQsParams = Object.assign(Object.assign({}, (0, utils_2.getQueryParamsForPropagation)(query)), (0, utils_2.mapEditingParams)(query));
|
|
166
|
+
const propagatedQsParams = Object.assign(Object.assign(Object.assign({}, (0, utils_2.getQueryParamsForPropagation)(query)), (0, utils_2.mapEditingParams)(query)), allowedQueryParams);
|
|
160
167
|
// Get headers to propagate on subsequent requests
|
|
161
168
|
const propagatedHeaders = (0, utils_2.getHeadersForPropagation)(headers);
|
|
162
169
|
const html = yield (0, utils_2.getEditingRequestHtml)(requestUrl, propagatedQsParams, propagatedHeaders, convertedCookies, dataFetcher);
|
|
@@ -215,7 +222,7 @@ const createEditingRenderRouteHandlers = (options) => {
|
|
|
215
222
|
req.nextUrl.searchParams.forEach((value, key) => {
|
|
216
223
|
query[key] = value;
|
|
217
224
|
});
|
|
218
|
-
const propagatedQsParams = Object.assign(Object.assign({}, (0, utils_2.getQueryParamsForPropagation)(query)), (0, utils_2.mapEditingParams)(query));
|
|
225
|
+
const propagatedQsParams = Object.assign(Object.assign(Object.assign({}, (0, utils_2.getQueryParamsForPropagation)(query)), (0, utils_2.mapEditingParams)(query)), (0, utils_2.getAllowedQueryParams)(query, options.allowedQueryParams).allowedQueryParams);
|
|
219
226
|
const base = (0, utils_2.resolveServerUrl)(req);
|
|
220
227
|
const targetUrl = new URL('/', base);
|
|
221
228
|
for (const key in propagatedQsParams) {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.writeImportMap = exports.__mockDependencies = void 0;
|
|
4
|
-
const
|
|
4
|
+
const node_tools_1 = require("@sitecore-content-sdk/content/node-tools");
|
|
5
5
|
const utils_1 = require("../templating/utils");
|
|
6
|
-
let writeImportMapCore =
|
|
6
|
+
let writeImportMapCore = node_tools_1.writeImportMap;
|
|
7
7
|
const __mockDependencies = (mocks) => {
|
|
8
8
|
if (mocks.writeImportMapCore) {
|
|
9
9
|
writeImportMapCore = mocks.writeImportMapCore;
|
package/dist/cjs/tools/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.writeImportMap = exports.generateMap = exports.generateMetadata = exports.extractFiles = exports.getComponentList = exports.generateSites = void 0;
|
|
4
|
-
var
|
|
5
|
-
Object.defineProperty(exports, "generateSites", { enumerable: true, get: function () { return
|
|
6
|
-
Object.defineProperty(exports, "getComponentList", { enumerable: true, get: function () { return
|
|
7
|
-
Object.defineProperty(exports, "extractFiles", { enumerable: true, get: function () { return
|
|
8
|
-
var
|
|
9
|
-
Object.defineProperty(exports, "generateMetadata", { enumerable: true, get: function () { return
|
|
4
|
+
var node_tools_1 = require("@sitecore-content-sdk/content/node-tools");
|
|
5
|
+
Object.defineProperty(exports, "generateSites", { enumerable: true, get: function () { return node_tools_1.generateSites; } });
|
|
6
|
+
Object.defineProperty(exports, "getComponentList", { enumerable: true, get: function () { return node_tools_1.getComponentList; } });
|
|
7
|
+
Object.defineProperty(exports, "extractFiles", { enumerable: true, get: function () { return node_tools_1.extractFiles; } });
|
|
8
|
+
var node_tools_2 = require("@sitecore-content-sdk/core/node-tools");
|
|
9
|
+
Object.defineProperty(exports, "generateMetadata", { enumerable: true, get: function () { return node_tools_2.generateMetadata; } });
|
|
10
10
|
var generate_map_1 = require("./generate-map");
|
|
11
11
|
Object.defineProperty(exports, "generateMap", { enumerable: true, get: function () { return generate_map_1.generateMap; } });
|
|
12
12
|
var import_map_1 = require("./codegen/import-map");
|
|
@@ -9,10 +9,9 @@ exports.getComponentListWithTypes = getComponentListWithTypes;
|
|
|
9
9
|
exports.nextjsClientMapTemplate = nextjsClientMapTemplate;
|
|
10
10
|
exports.nextjsServertMapTemplate = nextjsServertMapTemplate;
|
|
11
11
|
exports.nextjsDefaultMapTemplate = nextjsDefaultMapTemplate;
|
|
12
|
-
const
|
|
12
|
+
const node_tools_1 = require("@sitecore-content-sdk/content/node-tools");
|
|
13
13
|
const typescript_1 = __importDefault(require("typescript"));
|
|
14
14
|
const fs_1 = __importDefault(require("fs"));
|
|
15
|
-
const tools_2 = require("@sitecore-content-sdk/content/tools");
|
|
16
15
|
/**
|
|
17
16
|
* Detects the Next.js router type (App Router or Pages Router) based on directory structure.
|
|
18
17
|
* @param {string} projectRoot - The project root directory. Defaults to current working directory.
|
|
@@ -178,7 +177,7 @@ function detectComponentType(filePath, routerType) {
|
|
|
178
177
|
* @internal
|
|
179
178
|
*/
|
|
180
179
|
function getComponentListWithTypes(paths, exclude, includeVariants, routerType) {
|
|
181
|
-
const components = (0,
|
|
180
|
+
const components = (0, node_tools_1.getComponentList)(paths, exclude, includeVariants);
|
|
182
181
|
const detectedRouterType = routerType || detectRouterType();
|
|
183
182
|
return components.map((component) => (Object.assign(Object.assign({}, component), { componentType: detectComponentType(component.filePath, detectedRouterType) })));
|
|
184
183
|
}
|
|
@@ -189,7 +188,7 @@ function getComponentListWithTypes(paths, exclude, includeVariants, routerType)
|
|
|
189
188
|
*/
|
|
190
189
|
function nextjsClientMapTemplate(indexedImportMap) {
|
|
191
190
|
return `'use client';
|
|
192
|
-
${(0,
|
|
191
|
+
${(0, node_tools_1.defaultImportMapTemplate)(indexedImportMap, 'nextjs')}`;
|
|
193
192
|
}
|
|
194
193
|
/**
|
|
195
194
|
* React-specific import map template for server side imports only. Used in App Router.
|
|
@@ -197,7 +196,7 @@ function nextjsClientMapTemplate(indexedImportMap) {
|
|
|
197
196
|
* @returns {string} contents for resulting import map file
|
|
198
197
|
*/
|
|
199
198
|
function nextjsServertMapTemplate(indexedImportMap) {
|
|
200
|
-
return (0,
|
|
199
|
+
return (0, node_tools_1.defaultImportMapTemplate)(indexedImportMap, 'nextjs', 'defaultServerImportEntries');
|
|
201
200
|
}
|
|
202
201
|
/**
|
|
203
202
|
* React-specific import map template. Used in Pages Router.
|
|
@@ -205,5 +204,5 @@ function nextjsServertMapTemplate(indexedImportMap) {
|
|
|
205
204
|
* @returns {string} contents for resulting import map file
|
|
206
205
|
*/
|
|
207
206
|
function nextjsDefaultMapTemplate(indexedImportMap) {
|
|
208
|
-
return (0,
|
|
207
|
+
return (0, node_tools_1.defaultImportMapTemplate)(indexedImportMap, 'nextjs');
|
|
209
208
|
}
|
|
@@ -14,7 +14,7 @@ import { getEditingSecret } from '../utils/utils';
|
|
|
14
14
|
import { RenderMiddlewareBase } from './render-middleware';
|
|
15
15
|
import { getEnforcedCorsHeaders } from '@sitecore-content-sdk/core/tools';
|
|
16
16
|
import debug from '../debug';
|
|
17
|
-
import { getPreviewCookies, getRequiredEditingParamsList, mapEditingParams, cleanupNextPreviewCookies, getQueryParamsForPropagation, getHeadersForPropagation, getEditingRequestHtml, getCSPHeader, resolveServerUrl, } from './utils';
|
|
17
|
+
import { getPreviewCookies, getRequiredEditingParamsList, mapEditingParams, cleanupNextPreviewCookies, getQueryParamsForPropagation, getHeadersForPropagation, getEditingRequestHtml, getCSPHeader, resolveServerUrl, getAllowedQueryParams, } from './utils';
|
|
18
18
|
/**
|
|
19
19
|
* Middleware / handler for use in the editing render Next.js API route (e.g. '/api/editing/render')
|
|
20
20
|
* which is required for Sitecore editing support.
|
|
@@ -28,7 +28,7 @@ export class EditingRenderMiddleware extends RenderMiddlewareBase {
|
|
|
28
28
|
super();
|
|
29
29
|
this.config = config;
|
|
30
30
|
this.handler = (req, res) => __awaiter(this, void 0, void 0, function* () {
|
|
31
|
-
var _a, _b, _c, _d, _e;
|
|
31
|
+
var _a, _b, _c, _d, _e, _f;
|
|
32
32
|
const { body, method, headers, query } = req;
|
|
33
33
|
debug.editing('editing render middleware start: %o', {
|
|
34
34
|
method,
|
|
@@ -75,15 +75,22 @@ export class EditingRenderMiddleware extends RenderMiddlewareBase {
|
|
|
75
75
|
const mode = query.mode;
|
|
76
76
|
const requiredQueryParams = getRequiredEditingParamsList(mode);
|
|
77
77
|
const missingQueryParams = requiredQueryParams.filter((param) => !query[param]);
|
|
78
|
+
const { allowedQueryParams, missingAllowedParams } = getAllowedQueryParams(query, (_b = this.config) === null || _b === void 0 ? void 0 : _b.allowedQueryParams);
|
|
78
79
|
// Validate query parameters
|
|
79
|
-
if (missingQueryParams.length) {
|
|
80
|
-
debug.editing('missing required query parameters: %o',
|
|
80
|
+
if (missingQueryParams.length || missingAllowedParams.length) {
|
|
81
|
+
debug.editing('missing required query parameters: %o', [
|
|
82
|
+
...missingQueryParams,
|
|
83
|
+
...missingAllowedParams,
|
|
84
|
+
]);
|
|
81
85
|
return res.status(400).json({
|
|
82
|
-
html: `<html><body>Missing required query parameters: ${
|
|
86
|
+
html: `<html><body>Missing required query parameters: ${[
|
|
87
|
+
...missingQueryParams,
|
|
88
|
+
...missingAllowedParams,
|
|
89
|
+
].join(', ')}</body></html>`,
|
|
83
90
|
});
|
|
84
91
|
}
|
|
85
92
|
const previewDataParams = mapEditingParams(query);
|
|
86
|
-
res.setPreviewData(Object.assign(Object.assign({}, previewDataParams), { variantIds: (
|
|
93
|
+
res.setPreviewData(Object.assign(Object.assign(Object.assign({}, previewDataParams), allowedQueryParams), { variantIds: (_c = previewDataParams.variantIds) === null || _c === void 0 ? void 0 : _c.split(',') }), {
|
|
87
94
|
maxAge: 3,
|
|
88
95
|
});
|
|
89
96
|
// Set Preview mode identifier cookie, if the page is rendered in Sitecore Preview mode
|
|
@@ -95,8 +102,8 @@ export class EditingRenderMiddleware extends RenderMiddlewareBase {
|
|
|
95
102
|
// Restrict the page to be rendered only within the allowed origins
|
|
96
103
|
res.setHeader('Content-Security-Policy', getCSPHeader());
|
|
97
104
|
const encodedRoute = encodeURI(query.route);
|
|
98
|
-
const route = ((
|
|
99
|
-
const base = ((
|
|
105
|
+
const route = ((_e = (_d = this.config) === null || _d === void 0 ? void 0 : _d.resolvePageUrl) === null || _e === void 0 ? void 0 : _e.call(_d, encodedRoute)) || encodedRoute;
|
|
106
|
+
const base = ((_f = this.config) === null || _f === void 0 ? void 0 : _f.sitecoreInternalEditingHostUrl) || resolveServerUrl(req);
|
|
100
107
|
const requestUrl = new URL(route, base);
|
|
101
108
|
const cookies = res.getHeader('Set-Cookie');
|
|
102
109
|
// Make actual render request for page route, passing on preview cookies as well as any approved query string parameters.
|
|
@@ -117,6 +124,7 @@ export class EditingRenderMiddleware extends RenderMiddlewareBase {
|
|
|
117
124
|
status: 200,
|
|
118
125
|
route,
|
|
119
126
|
});
|
|
127
|
+
res.setHeader('Content-Type', 'text/html; charset=utf-8');
|
|
120
128
|
res.status(200).send(html);
|
|
121
129
|
}
|
|
122
130
|
catch (err) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|