@sitecore-jss/sitecore-jss-nextjs 21.5.0-canary.7 → 21.5.0-canary.9

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/README.md CHANGED
@@ -2,11 +2,8 @@
2
2
 
3
3
  This module is provided as a part of Sitecore JavaScript Rendering SDK. It contains Next.js components and integration for JSS.
4
4
 
5
- <!---
6
- @TODO: Update to next version docs before release
7
- -->
8
5
  [Documentation (Experience Platform)](https://doc.sitecore.com/xp/en/developers/hd/21/sitecore-headless-development/sitecore-javascript-rendering-sdk--jss--for-next-js.html)
9
6
 
10
7
  [Documentation (XM Cloud)](https://doc.sitecore.com/xmc/en/developers/xm-cloud/sitecore-javascript-rendering-sdk--jss--for-next-js.html)
11
8
 
12
- [API reference documentation](/ref-docs/sitecore-jss-nextjs/)
9
+ [API reference documentation](/ref-docs/sitecore-jss-nextjs/)
@@ -14,7 +14,6 @@ const server_1 = require("next/server");
14
14
  const personalize_1 = require("@sitecore-jss/sitecore-jss/personalize");
15
15
  const sitecore_jss_1 = require("@sitecore-jss/sitecore-jss");
16
16
  const middleware_1 = require("./middleware");
17
- const engage_1 = require("@sitecore/engage");
18
17
  /**
19
18
  * Middleware / handler to support Sitecore Personalize
20
19
  */
@@ -26,20 +25,19 @@ class PersonalizeMiddleware extends middleware_1.MiddlewareBase {
26
25
  super(config);
27
26
  this.config = config;
28
27
  this.handler = (req, res) => __awaiter(this, void 0, void 0, function* () {
29
- var _a;
30
28
  const pathname = req.nextUrl.pathname;
31
29
  const language = this.getLanguage(req);
32
30
  const hostname = this.getHostHeader(req) || this.defaultHostname;
33
31
  const startTimestamp = Date.now();
34
- const timeout = this.config.cdpConfig.timeout;
35
- // Response will be provided if other middleware is run before us (e.g. redirects)
36
- let response = res || server_1.NextResponse.next();
32
+ let browserId = this.getBrowserId(req);
37
33
  sitecore_jss_1.debug.personalize('personalize middleware start: %o', {
38
34
  pathname,
39
35
  language,
40
36
  hostname,
41
- headers: this.extractDebugHeaders(req.headers),
37
+ browserId,
42
38
  });
39
+ // Response will be provided if other middleware is run before us (e.g. redirects)
40
+ let response = res || server_1.NextResponse.next();
43
41
  if (this.config.disabled && this.config.disabled(req, response)) {
44
42
  sitecore_jss_1.debug.personalize('skipped (personalize middleware is disabled)');
45
43
  return response;
@@ -50,17 +48,7 @@ class PersonalizeMiddleware extends middleware_1.MiddlewareBase {
50
48
  sitecore_jss_1.debug.personalize('skipped (%s)', response.redirected ? 'redirected' : this.isPreview(req) ? 'preview' : 'route excluded');
51
49
  return response;
52
50
  }
53
- const site = this.getSite(req, response);
54
- const engageServer = this.initializeEngageServer(site, language);
55
- // creates the browser ID cookie on the server side
56
- // and includes the cookie in the response header
57
- try {
58
- yield engageServer.handleCookie(req, response, timeout);
59
- }
60
- catch (error) {
61
- sitecore_jss_1.debug.personalize('skipped (browser id generation failed)');
62
- throw error;
63
- }
51
+ const site = this.getSite(req, res);
64
52
  // Get personalization info from Experience Edge
65
53
  const personalizeInfo = yield this.personalizeService.getPersonalizeInfo(pathname, language, site.name);
66
54
  if (!personalizeInfo) {
@@ -72,24 +60,20 @@ class PersonalizeMiddleware extends middleware_1.MiddlewareBase {
72
60
  sitecore_jss_1.debug.personalize('skipped (no personalization configured)');
73
61
  return response;
74
62
  }
75
- const params = this.getExperienceParams(req);
76
- sitecore_jss_1.debug.personalize('executing experience for %s %s %o', personalizeInfo.contentId, params);
77
- const personalizationData = {
78
- channel: this.config.cdpConfig.channel || 'WEB',
79
- currency: (_a = this.config.cdpConfig.currency) !== null && _a !== void 0 ? _a : 'USA',
80
- friendlyId: personalizeInfo.contentId,
81
- params,
82
- language,
83
- };
84
- let variantId;
85
- // Execute targeted experience in CDP
86
- // eslint-disable-next-line no-useless-catch
87
- try {
88
- variantId = (yield engageServer.personalize(personalizationData, req, timeout)).variantId;
89
- }
90
- catch (error) {
91
- throw error;
63
+ if (!browserId) {
64
+ browserId = yield this.cdpService.generateBrowserId();
65
+ if (!browserId) {
66
+ sitecore_jss_1.debug.personalize('skipped (browser id generation failed)');
67
+ return response;
68
+ }
92
69
  }
70
+ // Execute targeted experience in CDP
71
+ const { ua } = (0, server_1.userAgent)(req);
72
+ const params = this.getExperienceParams(req);
73
+ const pointOfSale = this.config.getPointOfSale
74
+ ? this.config.getPointOfSale(site, language)
75
+ : personalize_1.PosResolver.resolve(site, language);
76
+ const variantId = yield this.cdpService.executeExperience(personalizeInfo.contentId, browserId, ua, pointOfSale, params);
93
77
  if (!variantId) {
94
78
  sitecore_jss_1.debug.personalize('skipped (no variant identified)');
95
79
  return response;
@@ -111,10 +95,13 @@ class PersonalizeMiddleware extends middleware_1.MiddlewareBase {
111
95
  response.headers.set('x-middleware-cache', 'no-cache');
112
96
  // Share rewrite path with following executed middlewares
113
97
  response.headers.set('x-sc-rewrite', rewritePath);
98
+ // Set browserId cookie on the response
99
+ this.setBrowserId(response, browserId);
114
100
  // Share site name with the following executed middlewares
115
101
  response.cookies.set(this.SITE_SYMBOL, site.name);
116
102
  sitecore_jss_1.debug.personalize('personalize middleware end in %dms: %o', Date.now() - startTimestamp, {
117
103
  rewritePath,
104
+ browserId,
118
105
  headers: this.extractDebugHeaders(response.headers),
119
106
  });
120
107
  return response;
@@ -122,6 +109,15 @@ class PersonalizeMiddleware extends middleware_1.MiddlewareBase {
122
109
  // NOTE: we provide native fetch for compatibility on Next.js Edge Runtime
123
110
  // (underlying default 'cross-fetch' is not currently compatible: https://github.com/lquixada/cross-fetch/issues/78)
124
111
  this.personalizeService = new personalize_1.GraphQLPersonalizeService(Object.assign(Object.assign({}, config.edgeConfig), { fetch: fetch }));
112
+ // NOTE: same here, we provide NativeDataFetcher for compatibility on Next.js Edge Runtime
113
+ this.cdpService = new personalize_1.CdpService(Object.assign(Object.assign({}, config.cdpConfig), { dataFetcherResolver: ({ timeout, headers, }) => {
114
+ const fetcher = new sitecore_jss_1.NativeDataFetcher({
115
+ debugger: sitecore_jss_1.debug.personalize,
116
+ timeout,
117
+ headers,
118
+ });
119
+ return (url, data) => fetcher.fetch(url, data);
120
+ } }));
125
121
  }
126
122
  /**
127
123
  * Gets the Next.js middleware handler with error handling
@@ -139,30 +135,31 @@ class PersonalizeMiddleware extends middleware_1.MiddlewareBase {
139
135
  }
140
136
  });
141
137
  }
142
- initializeEngageServer(site, language) {
143
- const engageServer = (0, engage_1.initServer)({
144
- clientKey: this.config.cdpConfig.clientKey,
145
- targetURL: this.config.cdpConfig.endpoint,
146
- pointOfSale: this.config.getPointOfSale
147
- ? this.config.getPointOfSale(site, language)
148
- : personalize_1.PosResolver.resolve(site, language),
149
- forceServerCookieMode: true,
150
- });
151
- return engageServer;
138
+ get browserIdCookieName() {
139
+ // Each user should have saved identifier to connect between session, CDP uses bid cookies + local storage
140
+ return `BID_${this.config.cdpConfig.clientKey}`;
141
+ }
142
+ getBrowserId(req) {
143
+ var _a;
144
+ return ((_a = req.cookies.get(this.browserIdCookieName)) === null || _a === void 0 ? void 0 : _a.value) || undefined;
145
+ }
146
+ setBrowserId(res, browserId) {
147
+ const expiryDate = new Date(new Date().setFullYear(new Date().getFullYear() + 2));
148
+ const options = { expires: expiryDate, secure: true };
149
+ res.cookies.set(this.browserIdCookieName, browserId, options);
152
150
  }
153
151
  getExperienceParams(req) {
154
- const utm = {
155
- campaign: req.nextUrl.searchParams.get('utm_campaign') || undefined,
156
- content: req.nextUrl.searchParams.get('utm_content') || undefined,
157
- medium: req.nextUrl.searchParams.get('utm_medium') || undefined,
158
- source: req.nextUrl.searchParams.get('utm_source') || undefined,
159
- };
160
152
  return {
161
153
  // It's expected that the header name "referer" is actually a misspelling of the word "referrer"
162
154
  // req.referrer is used during fetching to determine the value of the Referer header of the request being made,
163
155
  // used as a fallback
164
156
  referrer: req.headers.get('referer') || req.referrer,
165
- utm: utm,
157
+ utm: {
158
+ campaign: req.nextUrl.searchParams.get('utm_campaign'),
159
+ content: req.nextUrl.searchParams.get('utm_content'),
160
+ medium: req.nextUrl.searchParams.get('utm_medium'),
161
+ source: req.nextUrl.searchParams.get('utm_source'),
162
+ },
166
163
  };
167
164
  }
168
165
  excludeRoute(pathname) {
@@ -7,11 +7,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import { NextResponse } from 'next/server';
11
- import { GraphQLPersonalizeService, getPersonalizedRewrite, PosResolver, } from '@sitecore-jss/sitecore-jss/personalize';
12
- import { debug } from '@sitecore-jss/sitecore-jss';
10
+ import { NextResponse, userAgent } from 'next/server';
11
+ import { GraphQLPersonalizeService, CdpService, getPersonalizedRewrite, PosResolver, } from '@sitecore-jss/sitecore-jss/personalize';
12
+ import { debug, NativeDataFetcher } from '@sitecore-jss/sitecore-jss';
13
13
  import { MiddlewareBase } from './middleware';
14
- import { initServer } from '@sitecore/engage';
15
14
  /**
16
15
  * Middleware / handler to support Sitecore Personalize
17
16
  */
@@ -23,20 +22,19 @@ export class PersonalizeMiddleware extends MiddlewareBase {
23
22
  super(config);
24
23
  this.config = config;
25
24
  this.handler = (req, res) => __awaiter(this, void 0, void 0, function* () {
26
- var _a;
27
25
  const pathname = req.nextUrl.pathname;
28
26
  const language = this.getLanguage(req);
29
27
  const hostname = this.getHostHeader(req) || this.defaultHostname;
30
28
  const startTimestamp = Date.now();
31
- const timeout = this.config.cdpConfig.timeout;
32
- // Response will be provided if other middleware is run before us (e.g. redirects)
33
- let response = res || NextResponse.next();
29
+ let browserId = this.getBrowserId(req);
34
30
  debug.personalize('personalize middleware start: %o', {
35
31
  pathname,
36
32
  language,
37
33
  hostname,
38
- headers: this.extractDebugHeaders(req.headers),
34
+ browserId,
39
35
  });
36
+ // Response will be provided if other middleware is run before us (e.g. redirects)
37
+ let response = res || NextResponse.next();
40
38
  if (this.config.disabled && this.config.disabled(req, response)) {
41
39
  debug.personalize('skipped (personalize middleware is disabled)');
42
40
  return response;
@@ -47,17 +45,7 @@ export class PersonalizeMiddleware extends MiddlewareBase {
47
45
  debug.personalize('skipped (%s)', response.redirected ? 'redirected' : this.isPreview(req) ? 'preview' : 'route excluded');
48
46
  return response;
49
47
  }
50
- const site = this.getSite(req, response);
51
- const engageServer = this.initializeEngageServer(site, language);
52
- // creates the browser ID cookie on the server side
53
- // and includes the cookie in the response header
54
- try {
55
- yield engageServer.handleCookie(req, response, timeout);
56
- }
57
- catch (error) {
58
- debug.personalize('skipped (browser id generation failed)');
59
- throw error;
60
- }
48
+ const site = this.getSite(req, res);
61
49
  // Get personalization info from Experience Edge
62
50
  const personalizeInfo = yield this.personalizeService.getPersonalizeInfo(pathname, language, site.name);
63
51
  if (!personalizeInfo) {
@@ -69,24 +57,20 @@ export class PersonalizeMiddleware extends MiddlewareBase {
69
57
  debug.personalize('skipped (no personalization configured)');
70
58
  return response;
71
59
  }
72
- const params = this.getExperienceParams(req);
73
- debug.personalize('executing experience for %s %s %o', personalizeInfo.contentId, params);
74
- const personalizationData = {
75
- channel: this.config.cdpConfig.channel || 'WEB',
76
- currency: (_a = this.config.cdpConfig.currency) !== null && _a !== void 0 ? _a : 'USA',
77
- friendlyId: personalizeInfo.contentId,
78
- params,
79
- language,
80
- };
81
- let variantId;
82
- // Execute targeted experience in CDP
83
- // eslint-disable-next-line no-useless-catch
84
- try {
85
- variantId = (yield engageServer.personalize(personalizationData, req, timeout)).variantId;
86
- }
87
- catch (error) {
88
- throw error;
60
+ if (!browserId) {
61
+ browserId = yield this.cdpService.generateBrowserId();
62
+ if (!browserId) {
63
+ debug.personalize('skipped (browser id generation failed)');
64
+ return response;
65
+ }
89
66
  }
67
+ // Execute targeted experience in CDP
68
+ const { ua } = userAgent(req);
69
+ const params = this.getExperienceParams(req);
70
+ const pointOfSale = this.config.getPointOfSale
71
+ ? this.config.getPointOfSale(site, language)
72
+ : PosResolver.resolve(site, language);
73
+ const variantId = yield this.cdpService.executeExperience(personalizeInfo.contentId, browserId, ua, pointOfSale, params);
90
74
  if (!variantId) {
91
75
  debug.personalize('skipped (no variant identified)');
92
76
  return response;
@@ -108,10 +92,13 @@ export class PersonalizeMiddleware extends MiddlewareBase {
108
92
  response.headers.set('x-middleware-cache', 'no-cache');
109
93
  // Share rewrite path with following executed middlewares
110
94
  response.headers.set('x-sc-rewrite', rewritePath);
95
+ // Set browserId cookie on the response
96
+ this.setBrowserId(response, browserId);
111
97
  // Share site name with the following executed middlewares
112
98
  response.cookies.set(this.SITE_SYMBOL, site.name);
113
99
  debug.personalize('personalize middleware end in %dms: %o', Date.now() - startTimestamp, {
114
100
  rewritePath,
101
+ browserId,
115
102
  headers: this.extractDebugHeaders(response.headers),
116
103
  });
117
104
  return response;
@@ -119,6 +106,15 @@ export class PersonalizeMiddleware extends MiddlewareBase {
119
106
  // NOTE: we provide native fetch for compatibility on Next.js Edge Runtime
120
107
  // (underlying default 'cross-fetch' is not currently compatible: https://github.com/lquixada/cross-fetch/issues/78)
121
108
  this.personalizeService = new GraphQLPersonalizeService(Object.assign(Object.assign({}, config.edgeConfig), { fetch: fetch }));
109
+ // NOTE: same here, we provide NativeDataFetcher for compatibility on Next.js Edge Runtime
110
+ this.cdpService = new CdpService(Object.assign(Object.assign({}, config.cdpConfig), { dataFetcherResolver: ({ timeout, headers, }) => {
111
+ const fetcher = new NativeDataFetcher({
112
+ debugger: debug.personalize,
113
+ timeout,
114
+ headers,
115
+ });
116
+ return (url, data) => fetcher.fetch(url, data);
117
+ } }));
122
118
  }
123
119
  /**
124
120
  * Gets the Next.js middleware handler with error handling
@@ -136,30 +132,31 @@ export class PersonalizeMiddleware extends MiddlewareBase {
136
132
  }
137
133
  });
138
134
  }
139
- initializeEngageServer(site, language) {
140
- const engageServer = initServer({
141
- clientKey: this.config.cdpConfig.clientKey,
142
- targetURL: this.config.cdpConfig.endpoint,
143
- pointOfSale: this.config.getPointOfSale
144
- ? this.config.getPointOfSale(site, language)
145
- : PosResolver.resolve(site, language),
146
- forceServerCookieMode: true,
147
- });
148
- return engageServer;
135
+ get browserIdCookieName() {
136
+ // Each user should have saved identifier to connect between session, CDP uses bid cookies + local storage
137
+ return `BID_${this.config.cdpConfig.clientKey}`;
138
+ }
139
+ getBrowserId(req) {
140
+ var _a;
141
+ return ((_a = req.cookies.get(this.browserIdCookieName)) === null || _a === void 0 ? void 0 : _a.value) || undefined;
142
+ }
143
+ setBrowserId(res, browserId) {
144
+ const expiryDate = new Date(new Date().setFullYear(new Date().getFullYear() + 2));
145
+ const options = { expires: expiryDate, secure: true };
146
+ res.cookies.set(this.browserIdCookieName, browserId, options);
149
147
  }
150
148
  getExperienceParams(req) {
151
- const utm = {
152
- campaign: req.nextUrl.searchParams.get('utm_campaign') || undefined,
153
- content: req.nextUrl.searchParams.get('utm_content') || undefined,
154
- medium: req.nextUrl.searchParams.get('utm_medium') || undefined,
155
- source: req.nextUrl.searchParams.get('utm_source') || undefined,
156
- };
157
149
  return {
158
150
  // It's expected that the header name "referer" is actually a misspelling of the word "referrer"
159
151
  // req.referrer is used during fetching to determine the value of the Referer header of the request being made,
160
152
  // used as a fallback
161
153
  referrer: req.headers.get('referer') || req.referrer,
162
- utm: utm,
154
+ utm: {
155
+ campaign: req.nextUrl.searchParams.get('utm_campaign'),
156
+ content: req.nextUrl.searchParams.get('utm_content'),
157
+ medium: req.nextUrl.searchParams.get('utm_medium'),
158
+ source: req.nextUrl.searchParams.get('utm_source'),
159
+ },
163
160
  };
164
161
  }
165
162
  excludeRoute(pathname) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sitecore-jss/sitecore-jss-nextjs",
3
- "version": "21.5.0-canary.7",
3
+ "version": "21.5.0-canary.9",
4
4
  "main": "dist/cjs/index.js",
5
5
  "module": "dist/esm/index.js",
6
6
  "sideEffects": false,
@@ -30,7 +30,6 @@
30
30
  "url": "https://github.com/sitecore/jss/issues"
31
31
  },
32
32
  "devDependencies": {
33
- "@sitecore/engage": "^1.4.0",
34
33
  "@types/chai": "^4.3.4",
35
34
  "@types/chai-as-promised": "^7.1.5",
36
35
  "@types/chai-string": "^1.4.2",
@@ -66,15 +65,14 @@
66
65
  "typescript": "~4.9.4"
67
66
  },
68
67
  "peerDependencies": {
69
- "@sitecore/engage": "^1.4.0",
70
68
  "next": "^13.4.16",
71
69
  "react": "^18.2.0",
72
70
  "react-dom": "^18.2.0"
73
71
  },
74
72
  "dependencies": {
75
- "@sitecore-jss/sitecore-jss": "^21.5.0-canary.7",
76
- "@sitecore-jss/sitecore-jss-dev-tools": "^21.5.0-canary.7",
77
- "@sitecore-jss/sitecore-jss-react": "^21.5.0-canary.7",
73
+ "@sitecore-jss/sitecore-jss": "^21.5.0-canary.9",
74
+ "@sitecore-jss/sitecore-jss-dev-tools": "^21.5.0-canary.9",
75
+ "@sitecore-jss/sitecore-jss-react": "^21.5.0-canary.9",
78
76
  "@vercel/kv": "^0.2.1",
79
77
  "node-html-parser": "^6.1.4",
80
78
  "prop-types": "^15.8.1",
@@ -83,7 +81,7 @@
83
81
  },
84
82
  "description": "",
85
83
  "types": "types/index.d.ts",
86
- "gitHead": "d8ec6f1406ef037098b7cbbd75ed42136c8144c3",
84
+ "gitHead": "d04cef72a0eafdaa6654c7741d7fa4ab325a7f38",
87
85
  "files": [
88
86
  "dist",
89
87
  "types",
@@ -1,30 +1,7 @@
1
1
  import { NextResponse, NextRequest } from 'next/server';
2
- import { GraphQLPersonalizeServiceConfig } from '@sitecore-jss/sitecore-jss/personalize';
3
- import { SiteInfo } from '@sitecore-jss/sitecore-jss/site';
2
+ import { GraphQLPersonalizeServiceConfig, CdpServiceConfig, ExperienceParams } from '@sitecore-jss/sitecore-jss/personalize';
4
3
  import { MiddlewareBase, MiddlewareBaseConfig } from './middleware';
5
- import { EngageServer } from '@sitecore/engage';
6
- export type CdpServiceConfig = {
7
- /**
8
- * Your Sitecore CDP API endpoint
9
- */
10
- endpoint: string;
11
- /**
12
- * The client key to use for authentication
13
- */
14
- clientKey: string;
15
- /**
16
- * The Sitecore CDP channel to use for events. Uses 'WEB' by default.
17
- */
18
- channel?: string;
19
- /**
20
- * Currency for CDP request. Uses 'USA' as default.
21
- */
22
- currency?: string;
23
- /**
24
- * Timeout (ms) for CDP request. Default is 400.
25
- */
26
- timeout?: number;
27
- };
4
+ import { SiteInfo } from '@sitecore-jss/sitecore-jss/site';
28
5
  export type PersonalizeMiddlewareConfig = MiddlewareBaseConfig & {
29
6
  /**
30
7
  * Configuration for your Sitecore Experience Edge endpoint
@@ -33,7 +10,7 @@ export type PersonalizeMiddlewareConfig = MiddlewareBaseConfig & {
33
10
  /**
34
11
  * Configuration for your Sitecore CDP endpoint
35
12
  */
36
- cdpConfig: CdpServiceConfig;
13
+ cdpConfig: Omit<CdpServiceConfig, 'dataFetcherResolver'>;
37
14
  /**
38
15
  * function to resolve point of sale for a site
39
16
  * @param {Siteinfo} site to get info from
@@ -42,25 +19,13 @@ export type PersonalizeMiddlewareConfig = MiddlewareBaseConfig & {
42
19
  */
43
20
  getPointOfSale?: (site: SiteInfo, language: string) => string;
44
21
  };
45
- /**
46
- * Object model of Experience Context data
47
- */
48
- export type ExperienceParams = {
49
- referrer: string;
50
- utm: {
51
- [key: string]: string | undefined;
52
- campaign: string | undefined;
53
- source: string | undefined;
54
- medium: string | undefined;
55
- content: string | undefined;
56
- };
57
- };
58
22
  /**
59
23
  * Middleware / handler to support Sitecore Personalize
60
24
  */
61
25
  export declare class PersonalizeMiddleware extends MiddlewareBase {
62
26
  protected config: PersonalizeMiddlewareConfig;
63
27
  private personalizeService;
28
+ private cdpService;
64
29
  /**
65
30
  * @param {PersonalizeMiddlewareConfig} [config] Personalize middleware config
66
31
  */
@@ -70,7 +35,9 @@ export declare class PersonalizeMiddleware extends MiddlewareBase {
70
35
  * @returns middleware handler
71
36
  */
72
37
  getHandler(): (req: NextRequest, res?: NextResponse) => Promise<NextResponse>;
73
- protected initializeEngageServer(site: SiteInfo, language: string): EngageServer;
38
+ protected get browserIdCookieName(): string;
39
+ protected getBrowserId(req: NextRequest): string | undefined;
40
+ protected setBrowserId(res: NextResponse, browserId: string): void;
74
41
  protected getExperienceParams(req: NextRequest): ExperienceParams;
75
42
  protected excludeRoute(pathname: string): boolean | undefined;
76
43
  private handler;