@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.
Files changed (60) hide show
  1. package/dist/cjs/editing/editing-render-middleware.js +15 -7
  2. package/dist/cjs/editing/types.js +2 -0
  3. package/dist/cjs/editing/utils.js +30 -1
  4. package/dist/cjs/index.js +8 -1
  5. package/dist/cjs/initialization/proxy/analytics-adapter.js +80 -0
  6. package/dist/cjs/initialization/proxy/personalize-adapter.js +81 -0
  7. package/dist/cjs/middleware/robots-middleware.js +3 -1
  8. package/dist/cjs/middleware/sitemap-middleware.js +3 -1
  9. package/dist/cjs/proxy/personalize-proxy.js +32 -15
  10. package/dist/cjs/route-handler/editing-render-route-handler.js +12 -5
  11. package/dist/cjs/tools/codegen/import-map.js +2 -2
  12. package/dist/cjs/tools/index.js +6 -6
  13. package/dist/cjs/tools/templating/utils.js +5 -6
  14. package/dist/esm/editing/editing-render-middleware.js +16 -8
  15. package/dist/esm/editing/types.js +1 -0
  16. package/dist/esm/editing/utils.js +28 -0
  17. package/dist/esm/index.js +4 -1
  18. package/dist/esm/initialization/proxy/analytics-adapter.js +75 -0
  19. package/dist/esm/initialization/proxy/personalize-adapter.js +78 -0
  20. package/dist/esm/middleware/robots-middleware.js +3 -1
  21. package/dist/esm/middleware/sitemap-middleware.js +3 -1
  22. package/dist/esm/proxy/personalize-proxy.js +32 -15
  23. package/dist/esm/route-handler/editing-render-route-handler.js +13 -6
  24. package/dist/esm/tools/codegen/import-map.js +1 -1
  25. package/dist/esm/tools/index.js +2 -2
  26. package/dist/esm/tools/templating/utils.js +1 -2
  27. package/package.json +10 -10
  28. package/types/components/Placeholder.d.ts +2 -2
  29. package/types/components/Placeholder.d.ts.map +1 -1
  30. package/types/config/define-config.d.ts.map +1 -1
  31. package/types/editing/editing-config-middleware.d.ts +1 -1
  32. package/types/editing/editing-config-middleware.d.ts.map +1 -1
  33. package/types/editing/editing-render-middleware.d.ts +7 -0
  34. package/types/editing/editing-render-middleware.d.ts.map +1 -1
  35. package/types/editing/index.d.ts +1 -0
  36. package/types/editing/index.d.ts.map +1 -1
  37. package/types/editing/types.d.ts +37 -0
  38. package/types/editing/types.d.ts.map +1 -0
  39. package/types/editing/utils.d.ts +11 -0
  40. package/types/editing/utils.d.ts.map +1 -1
  41. package/types/index.d.ts +7 -1
  42. package/types/index.d.ts.map +1 -1
  43. package/types/initialization/proxy/analytics-adapter.d.ts +30 -0
  44. package/types/initialization/proxy/analytics-adapter.d.ts.map +1 -0
  45. package/types/initialization/proxy/personalize-adapter.d.ts +23 -0
  46. package/types/initialization/proxy/personalize-adapter.d.ts.map +1 -0
  47. package/types/middleware/robots-middleware.d.ts.map +1 -1
  48. package/types/middleware/sitemap-middleware.d.ts.map +1 -1
  49. package/types/proxy/personalize-proxy.d.ts +2 -1
  50. package/types/proxy/personalize-proxy.d.ts.map +1 -1
  51. package/types/route-handler/editing-config-route-handler.d.ts +1 -1
  52. package/types/route-handler/editing-config-route-handler.d.ts.map +1 -1
  53. package/types/route-handler/editing-render-route-handler.d.ts +7 -0
  54. package/types/route-handler/editing-render-route-handler.d.ts.map +1 -1
  55. package/types/tools/codegen/import-map.d.ts +1 -1
  56. package/types/tools/codegen/import-map.d.ts.map +1 -1
  57. package/types/tools/index.d.ts +3 -2
  58. package/types/tools/index.d.ts.map +1 -1
  59. package/types/tools/templating/utils.d.ts +1 -1
  60. 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', missingQueryParams);
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: ${missingQueryParams.join(', ')}</body></html>`,
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: (_b = previewDataParams.variantIds) === null || _b === void 0 ? void 0 : _b.split(',') }), {
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 = ((_d = (_c = this.config) === null || _c === void 0 ? void 0 : _c.resolvePageUrl) === null || _d === void 0 ? void 0 : _d.call(_c, encodedRoute)) || encodedRoute;
105
- const base = ((_e = this.config) === null || _e === void 0 ? void 0 : _e.sitecoreInternalEditingHostUrl) || (0, utils_2.resolveServerUrl)(req);
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) {
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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('Internal Server Error');
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('Internal Server Error');
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 server_1 = require("@sitecore-cloudsdk/core/server");
19
- const server_2 = require("@sitecore-cloudsdk/personalize/server");
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 })), req).then((personalization) => {
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, server_1.CloudSDK)(request, response, {
181
- sitecoreEdgeUrl: this.config.edgeUrl,
182
- sitecoreEdgeContextId: this.config.contextId,
183
- siteName,
184
- cookieDomain: hostname,
185
- enableServerCookie: true,
186
- })
187
- .addPersonalize({ enablePersonalizeCookie: true })
188
- .initialize();
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, request_1) {
192
- return __awaiter(this, arguments, void 0, function* ({ params, friendlyId, language, timeout, variantIds, geo, }, request) {
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, server_2.personalize)(request, Object.assign({ channel: this.config.channel || 'WEB', currency: (_b = this.config.currency) !== null && _b !== void 0 ? _b : 'USD', friendlyId,
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', missingQueryParams);
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: ${missingQueryParams.join(', ')}</body></html>`,
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 tools_1 = require("@sitecore-content-sdk/content/tools");
4
+ const node_tools_1 = require("@sitecore-content-sdk/content/node-tools");
5
5
  const utils_1 = require("../templating/utils");
6
- let writeImportMapCore = tools_1.writeImportMap;
6
+ let writeImportMapCore = node_tools_1.writeImportMap;
7
7
  const __mockDependencies = (mocks) => {
8
8
  if (mocks.writeImportMapCore) {
9
9
  writeImportMapCore = mocks.writeImportMapCore;
@@ -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 tools_1 = require("@sitecore-content-sdk/content/tools");
5
- Object.defineProperty(exports, "generateSites", { enumerable: true, get: function () { return tools_1.generateSites; } });
6
- Object.defineProperty(exports, "getComponentList", { enumerable: true, get: function () { return tools_1.getComponentList; } });
7
- Object.defineProperty(exports, "extractFiles", { enumerable: true, get: function () { return tools_1.extractFiles; } });
8
- var tools_2 = require("@sitecore-content-sdk/core/tools");
9
- Object.defineProperty(exports, "generateMetadata", { enumerable: true, get: function () { return tools_2.generateMetadata; } });
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 tools_1 = require("@sitecore-content-sdk/content/tools");
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, tools_1.getComponentList)(paths, exclude, includeVariants);
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, tools_2.defaultImportMapTemplate)(indexedImportMap, 'nextjs')}`;
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, tools_2.defaultImportMapTemplate)(indexedImportMap, 'nextjs', 'defaultServerImportEntries');
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, tools_2.defaultImportMapTemplate)(indexedImportMap, 'nextjs');
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', missingQueryParams);
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: ${missingQueryParams.join(', ')}</body></html>`,
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: (_b = previewDataParams.variantIds) === null || _b === void 0 ? void 0 : _b.split(',') }), {
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 = ((_d = (_c = this.config) === null || _c === void 0 ? void 0 : _c.resolvePageUrl) === null || _d === void 0 ? void 0 : _d.call(_c, encodedRoute)) || encodedRoute;
99
- const base = ((_e = this.config) === null || _e === void 0 ? void 0 : _e.sitecoreInternalEditingHostUrl) || resolveServerUrl(req);
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 {};