@sitecore-jss/sitecore-jss-nextjs 21.1.0-canary.7 → 21.1.0-canary.71

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 (41) hide show
  1. package/dist/cjs/components/EditingComponentPlaceholder.js +12 -0
  2. package/dist/cjs/components/Link.js +2 -2
  3. package/dist/cjs/editing/editing-data-cache.js +15 -10
  4. package/dist/cjs/editing/editing-data-middleware.js +2 -2
  5. package/dist/cjs/editing/editing-data-service.js +2 -2
  6. package/dist/cjs/editing/editing-render-middleware.js +9 -1
  7. package/dist/cjs/index.js +16 -6
  8. package/dist/cjs/middleware/index.js +5 -1
  9. package/dist/cjs/middleware/multisite-middleware.js +102 -0
  10. package/dist/cjs/middleware/personalize-middleware.js +20 -4
  11. package/dist/cjs/middleware/redirects-middleware.js +75 -42
  12. package/dist/cjs/monitoring/healthcheck-middleware.js +30 -0
  13. package/dist/cjs/monitoring/index.js +5 -0
  14. package/dist/cjs/services/graphql-sitemap-service.js +42 -19
  15. package/dist/esm/components/EditingComponentPlaceholder.js +5 -0
  16. package/dist/esm/components/Link.js +2 -2
  17. package/dist/esm/editing/editing-data-cache.js +15 -10
  18. package/dist/esm/editing/editing-data-middleware.js +2 -2
  19. package/dist/esm/editing/editing-data-service.js +2 -2
  20. package/dist/esm/editing/editing-render-middleware.js +9 -1
  21. package/dist/esm/index.js +3 -3
  22. package/dist/esm/middleware/index.js +2 -0
  23. package/dist/esm/middleware/multisite-middleware.js +98 -0
  24. package/dist/esm/middleware/personalize-middleware.js +20 -4
  25. package/dist/esm/middleware/redirects-middleware.js +75 -42
  26. package/dist/esm/monitoring/healthcheck-middleware.js +26 -0
  27. package/dist/esm/monitoring/index.js +1 -0
  28. package/dist/esm/services/graphql-sitemap-service.js +41 -18
  29. package/monitoring.d.ts +1 -0
  30. package/monitoring.js +1 -0
  31. package/package.json +16 -15
  32. package/types/components/EditingComponentPlaceholder.d.ts +4 -0
  33. package/types/editing/editing-data-cache.d.ts +4 -4
  34. package/types/index.d.ts +3 -3
  35. package/types/middleware/index.d.ts +2 -0
  36. package/types/middleware/multisite-middleware.d.ts +42 -0
  37. package/types/middleware/personalize-middleware.d.ts +11 -0
  38. package/types/middleware/redirects-middleware.d.ts +32 -3
  39. package/types/monitoring/healthcheck-middleware.d.ts +12 -0
  40. package/types/monitoring/index.d.ts +1 -0
  41. package/types/services/graphql-sitemap-service.d.ts +8 -3
@@ -10,8 +10,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  import { GraphQLRequestClient } from '@sitecore-jss/sitecore-jss/graphql';
11
11
  import { debug } from '@sitecore-jss/sitecore-jss';
12
12
  import { getPersonalizedRewrite } from '@sitecore-jss/sitecore-jss/personalize';
13
+ import { getSiteRewrite } from '@sitecore-jss/sitecore-jss/site';
13
14
  /** @private */
14
15
  export const languageError = 'The list of languages cannot be empty';
16
+ export const sitesError = 'The list of sites cannot be empty';
15
17
  /**
16
18
  * @param {string} siteName to inject into error text
17
19
  * @private
@@ -49,7 +51,7 @@ query ${usesPersonalize ? 'PersonalizeSitemapQuery' : 'DefaultSitemapQuery'}(
49
51
  hasNext
50
52
  }
51
53
  results {
52
- path: routePath
54
+ path: routePath
53
55
  ${usesPersonalize
54
56
  ? `
55
57
  route {
@@ -62,7 +64,7 @@ query ${usesPersonalize ? 'PersonalizeSitemapQuery' : 'DefaultSitemapQuery'}(
62
64
  }
63
65
  }
64
66
  }
65
- }
67
+ }
66
68
  `;
67
69
  /**
68
70
  * Service that fetches the list of site pages using Sitecore's GraphQL API.
@@ -128,43 +130,64 @@ export class GraphQLSitemapService {
128
130
  */
129
131
  fetchSitemap(languages, formatStaticPath) {
130
132
  return __awaiter(this, void 0, void 0, function* () {
133
+ const paths = new Array();
131
134
  if (!languages.length) {
132
135
  throw new RangeError(languageError);
133
136
  }
134
- // Fetch paths using all locales
135
- const paths = yield Promise.all(languages.map((language) => {
136
- if (language === '') {
137
- throw new RangeError(languageEmptyError);
138
- }
139
- debug.sitemap('fetching sitemap data for %s', language);
140
- return this.fetchLanguageSitePaths(language).then((results) => this.transformLanguageSitePaths(results, formatStaticPath, language));
141
- }));
142
- // merge promises results into single result
137
+ // Get all sites
138
+ const sites = this.options.sites;
139
+ if (!sites || !sites.length) {
140
+ throw new RangeError(sitesError);
141
+ }
142
+ // Fetch paths for each site
143
+ for (let i = 0; i < sites.length; i++) {
144
+ const siteName = sites[i];
145
+ const multiSiteName = sites.length > 1 ? siteName : undefined;
146
+ // Fetch paths using all locales
147
+ yield Promise.all(languages.map((language) => __awaiter(this, void 0, void 0, function* () {
148
+ if (language === '') {
149
+ throw new RangeError(languageEmptyError);
150
+ }
151
+ debug.sitemap('fetching sitemap data for %s %s', language, siteName);
152
+ const results = yield this.fetchLanguageSitePaths(language, siteName);
153
+ const transformedPaths = yield this.transformLanguageSitePaths(results, formatStaticPath, language, multiSiteName);
154
+ paths.push(...transformedPaths);
155
+ })));
156
+ }
143
157
  return [].concat(...paths);
144
158
  });
145
159
  }
146
- transformLanguageSitePaths(sitePaths, formatStaticPath, language) {
160
+ transformLanguageSitePaths(sitePaths, formatStaticPath, language, multiSiteName) {
147
161
  return __awaiter(this, void 0, void 0, function* () {
148
162
  const formatPath = (path) => formatStaticPath(path.replace(/^\/|\/$/g, '').split('/'), language);
149
163
  const aggregatedPaths = [];
150
164
  sitePaths.forEach((item) => {
151
- var _a, _b, _c, _d;
165
+ var _a, _b, _c, _d, _e, _f;
152
166
  if (!item)
153
167
  return;
154
- aggregatedPaths.push(formatPath(item.path));
168
+ if (!multiSiteName) {
169
+ aggregatedPaths.push(formatPath(item.path));
170
+ }
171
+ else {
172
+ aggregatedPaths.push(formatPath(getSiteRewrite(item.path, { siteName: multiSiteName })));
173
+ }
155
174
  // check for type safety's sake - personalize may be empty depending on query type
156
175
  if ((_b = (_a = item.route) === null || _a === void 0 ? void 0 : _a.personalization) === null || _b === void 0 ? void 0 : _b.variantIds.length) {
157
- aggregatedPaths.push(...(_d = (_c = item.route) === null || _c === void 0 ? void 0 : _c.personalization) === null || _d === void 0 ? void 0 : _d.variantIds.map((varId) => formatPath(getPersonalizedRewrite(item.path, { variantId: varId }))));
176
+ multiSiteName
177
+ ? aggregatedPaths.push(...(_d = (_c = item.route) === null || _c === void 0 ? void 0 : _c.personalization) === null || _d === void 0 ? void 0 : _d.variantIds.map((varId) => formatPath(getPersonalizedRewrite(getSiteRewrite(item.path, { siteName: multiSiteName }), {
178
+ variantId: varId,
179
+ }))))
180
+ : aggregatedPaths.push(...(_f = (_e = item.route) === null || _e === void 0 ? void 0 : _e.personalization) === null || _f === void 0 ? void 0 : _f.variantIds.map((varId) => formatPath(getPersonalizedRewrite(item.path, { variantId: varId }))));
158
181
  }
159
182
  });
160
183
  return aggregatedPaths;
161
184
  });
162
185
  }
163
- fetchLanguageSitePaths(language) {
186
+ fetchLanguageSitePaths(language, siteName) {
164
187
  var _a, _b, _c, _d;
165
188
  return __awaiter(this, void 0, void 0, function* () {
166
189
  const args = {
167
- siteName: this.options.siteName,
190
+ siteName: siteName,
168
191
  language: language,
169
192
  pageSize: this.options.pageSize,
170
193
  includedPaths: this.options.includedPaths,
@@ -176,7 +199,7 @@ export class GraphQLSitemapService {
176
199
  while (hasNext) {
177
200
  const fetchResponse = yield this.graphQLClient.request(this.query, Object.assign(Object.assign({}, args), { after }));
178
201
  if (!((_a = fetchResponse === null || fetchResponse === void 0 ? void 0 : fetchResponse.site) === null || _a === void 0 ? void 0 : _a.siteInfo)) {
179
- throw new RangeError(getSiteEmptyError(this.options.siteName));
202
+ throw new RangeError(getSiteEmptyError(siteName));
180
203
  }
181
204
  else {
182
205
  results = results.concat((_b = fetchResponse.site.siteInfo.routes) === null || _b === void 0 ? void 0 : _b.results);
@@ -0,0 +1 @@
1
+ export * from './types/monitoring/index';
package/monitoring.js ADDED
@@ -0,0 +1 @@
1
+ module.exports = require('./dist/cjs/monitoring/index');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sitecore-jss/sitecore-jss-nextjs",
3
- "version": "21.1.0-canary.7",
3
+ "version": "21.1.0-canary.71",
4
4
  "main": "dist/cjs/index.js",
5
5
  "module": "dist/esm/index.js",
6
6
  "sideEffects": false,
@@ -11,7 +11,7 @@
11
11
  "test": "mocha --require ./test/setup.js \"./src/**/*.test.ts\" \"./src/**/*.test.tsx\" --exit",
12
12
  "prepublishOnly": "npm run build",
13
13
  "coverage": "nyc npm test",
14
- "generate-docs": "npx typedoc --plugin typedoc-plugin-markdown --readme none --out ../../ref-docs/sitecore-jss-nextjs --entryPoints src/index.ts --entryPoints src/editing/index.ts --entryPoints src/middleware/index.ts --githubPages false"
14
+ "generate-docs": "npx typedoc --plugin typedoc-plugin-markdown --readme none --out ../../ref-docs/sitecore-jss-nextjs --entryPoints src/index.ts --entryPoints src/monitoring/index.ts --entryPoints src/editing/index.ts --entryPoints src/middleware/index.ts --githubPages false"
15
15
  },
16
16
  "engines": {
17
17
  "node": ">=12",
@@ -36,8 +36,8 @@
36
36
  "@types/enzyme": "^3.10.12",
37
37
  "@types/mocha": "^9.0.0",
38
38
  "@types/node": "17.0.40",
39
- "@types/prop-types": "^15.7.4",
40
- "@types/react": "^18.0.12",
39
+ "@types/prop-types": "^15.7.5",
40
+ "@types/react": "^18.0.25",
41
41
  "@types/react-dom": "^18.0.5",
42
42
  "@types/sinon": "^7.5.0",
43
43
  "@types/sinon-chai": "^3.2.5",
@@ -54,32 +54,33 @@
54
54
  "eslint-plugin-react": "^7.21.5",
55
55
  "jsdom": "^15.1.1",
56
56
  "mocha": "^9.1.3",
57
- "next": "^12.2.5",
57
+ "next": "^12.3.1",
58
58
  "nock": "^13.0.5",
59
59
  "nyc": "^15.1.0",
60
- "react": "^18.1.0",
61
- "react-dom": "^18.1.0",
60
+ "react": "^18.2.0",
61
+ "react-dom": "^18.2.0",
62
62
  "sinon": "^7.5.0",
63
63
  "sinon-chai": "^3.7.0",
64
64
  "ts-node": "^9.0.0",
65
65
  "typescript": "~4.3.5"
66
66
  },
67
67
  "peerDependencies": {
68
- "next": "^12.2.5",
69
- "react": "^18.1.0",
70
- "react-dom": "^18.1.0"
68
+ "next": "^12.3.1",
69
+ "react": "^18.2.0",
70
+ "react-dom": "^18.2.0"
71
71
  },
72
72
  "dependencies": {
73
- "@sitecore-jss/sitecore-jss": "^21.1.0-canary.7",
74
- "@sitecore-jss/sitecore-jss-dev-tools": "^21.1.0-canary.7",
75
- "@sitecore-jss/sitecore-jss-react": "^21.1.0-canary.7",
76
- "prop-types": "^15.7.2",
73
+ "@sitecore-jss/sitecore-jss": "^21.1.0-canary.71",
74
+ "@sitecore-jss/sitecore-jss-dev-tools": "^21.1.0-canary.71",
75
+ "@sitecore-jss/sitecore-jss-react": "^21.1.0-canary.71",
76
+ "node-html-parser": "^6.0.0",
77
+ "prop-types": "^15.8.1",
77
78
  "regex-parser": "^2.2.11",
78
79
  "sync-disk-cache": "^2.1.0"
79
80
  },
80
81
  "description": "",
81
82
  "types": "types/index.d.ts",
82
- "gitHead": "2e2c14ec0fea06b866b42d8f288edc0999d44363",
83
+ "gitHead": "61fb3846e35e869452e1143a0b0e092478670d07",
83
84
  "files": [
84
85
  "dist",
85
86
  "types",
@@ -0,0 +1,4 @@
1
+ import { RouteData } from '@sitecore-jss/sitecore-jss/layout';
2
+ export declare const EditingComponentPlaceholder: ({ rendering, }: {
3
+ rendering: RouteData;
4
+ }) => JSX.Element;
@@ -3,8 +3,8 @@ import { EditingData } from './editing-data';
3
3
  * Defines an editing data cache implementation
4
4
  */
5
5
  export interface EditingDataCache {
6
- set(key: string, editingData: EditingData): void;
7
- get(key: string): EditingData | undefined;
6
+ set(key: string, editingData: EditingData): Promise<void>;
7
+ get(key: string): Promise<EditingData | undefined>;
8
8
  }
9
9
  /**
10
10
  * A disk-based editing data cache implementation (required for hosting on Vercel via Serverless Functions)
@@ -16,8 +16,8 @@ export declare class EditingDataDiskCache implements EditingDataCache {
16
16
  * @param {string} [tmpDir] Temp directory to use. Default is the OS temp directory (os.tmpdir()).
17
17
  */
18
18
  constructor(tmpDir?: string);
19
- set(key: string, editingData: EditingData): void;
20
- get(key: string): EditingData | undefined;
19
+ set(key: string, editingData: EditingData): Promise<void>;
20
+ get(key: string): Promise<EditingData | undefined>;
21
21
  }
22
22
  /** EditingDataDiskCache singleton */
23
23
  export declare const editingDataDiskCache: EditingDataDiskCache;
package/types/index.d.ts CHANGED
@@ -1,23 +1,23 @@
1
1
  export { constants, HttpDataFetcher, HttpResponse, AxiosDataFetcher, AxiosDataFetcherConfig, NativeDataFetcher, NativeDataFetcherConfig, enableDebug, } from '@sitecore-jss/sitecore-jss';
2
2
  export { isEditorActive, resetEditorChromes, resolveUrl } from '@sitecore-jss/sitecore-jss/utils';
3
- export { LayoutService, LayoutServiceData, LayoutServicePageState, LayoutServiceContext, LayoutServiceContextData, GraphQLLayoutService, GraphQLLayoutServiceConfig, RestLayoutService, RestLayoutServiceConfig, PlaceholderData, PlaceholdersData, RouteData, Field, Item, HtmlElementRendering, getChildPlaceholder, getFieldValue, ComponentRendering, ComponentFields, ComponentParams, } from '@sitecore-jss/sitecore-jss/layout';
3
+ export { LayoutService, LayoutServiceData, LayoutServicePageState, LayoutServiceContext, LayoutServiceContextData, GraphQLLayoutService, GraphQLLayoutServiceConfig, RestLayoutService, RestLayoutServiceConfig, PlaceholderData, PlaceholdersData, RouteData, Field, Item, HtmlElementRendering, getChildPlaceholder, getFieldValue, ComponentRendering, ComponentFields, ComponentParams, RenderingType, EDITING_COMPONENT_PLACEHOLDER, EDITING_COMPONENT_ID, } from '@sitecore-jss/sitecore-jss/layout';
4
4
  export { mediaApi } from '@sitecore-jss/sitecore-jss/media';
5
5
  export { trackingApi, TrackingRequestOptions, CampaignInstance, GoalInstance, OutcomeInstance, EventInstance, PageViewInstance, } from '@sitecore-jss/sitecore-jss/tracking';
6
6
  export { DictionaryPhrases, DictionaryService, GraphQLDictionaryService, GraphQLDictionaryServiceConfig, RestDictionaryService, RestDictionaryServiceConfig, } from '@sitecore-jss/sitecore-jss/i18n';
7
7
  export { personalizeLayout, getPersonalizedRewrite, getPersonalizedRewriteData, normalizePersonalizedRewrite, CdpHelper, } from '@sitecore-jss/sitecore-jss/personalize';
8
- export { RobotsQueryResult, GraphQLRobotsService, GraphQLRobotsServiceConfig, } from '@sitecore-jss/sitecore-jss/site';
9
8
  export { GraphQLRequestClient } from '@sitecore-jss/sitecore-jss';
10
9
  export { ComponentPropsCollection, GetStaticComponentProps, GetServerSideComponentProps, } from './sharedTypes/component-props';
11
10
  export { ComponentModule } from './sharedTypes/component-module';
12
11
  export { ComponentPropsService } from './services/component-props-service';
13
12
  export { DisconnectedSitemapService } from './services/disconnected-sitemap-service';
14
13
  export { GraphQLSitemapService, GraphQLSitemapServiceConfig, } from './services/graphql-sitemap-service';
15
- export { GraphQLSitemapXmlService, GraphQLSitemapXmlServiceConfig, GraphQLErrorPagesService, GraphQLErrorPagesServiceConfig, ErrorPages, } from '@sitecore-jss/sitecore-jss/site';
14
+ export { GraphQLSitemapXmlService, GraphQLSitemapXmlServiceConfig, GraphQLErrorPagesService, GraphQLErrorPagesServiceConfig, RobotsQueryResult, GraphQLRobotsService, GraphQLRobotsServiceConfig, ErrorPages, SiteInfo, SiteResolver, GraphQLSiteInfoService, GraphQLSiteInfoServiceConfig, getSiteRewrite, getSiteRewriteData, normalizeSiteRewrite, } from '@sitecore-jss/sitecore-jss/site';
16
15
  export { StaticPath } from './services/graphql-sitemap-service';
17
16
  export { ComponentPropsReactContext, ComponentPropsContextProps, ComponentPropsContext, useComponentProps, } from './components/ComponentPropsContext';
18
17
  export { handleEditorFastRefresh, getPublicUrl } from './utils';
19
18
  export { Link, LinkProps } from './components/Link';
20
19
  export { RichText, RichTextProps } from './components/RichText';
21
20
  export { Placeholder } from './components/Placeholder';
21
+ export { EditingComponentPlaceholder } from './components/EditingComponentPlaceholder';
22
22
  export { NextImage } from './components/NextImage';
23
23
  export { ComponentFactory, Image, ImageField, ImageFieldValue, ImageProps, LinkField, LinkFieldValue, Text, TextField, DateField, File, FileField, RichTextField, VisitorIdentification, PlaceholderComponentProps, SitecoreContext, SitecoreContextState, SitecoreContextValue, SitecoreContextReactContext, withSitecoreContext, useSitecoreContext, withEditorChromes, withPlaceholder, withDatasourceCheck, ImageSizeParameters, ComponentConsumerProps, WithSitecoreContextOptions, WithSitecoreContextProps, } from '@sitecore-jss/sitecore-jss-react';
@@ -1,2 +1,4 @@
1
1
  export { RedirectsMiddleware, RedirectsMiddlewareConfig } from './redirects-middleware';
2
2
  export { PersonalizeMiddleware, PersonalizeMiddlewareConfig } from './personalize-middleware';
3
+ export { MultisiteMiddleware, MultisiteMiddlewareConfig } from './multisite-middleware';
4
+ export { SiteResolver, SiteInfo } from '@sitecore-jss/sitecore-jss/site';
@@ -0,0 +1,42 @@
1
+ import { NextResponse, NextRequest } from 'next/server';
2
+ import { SiteInfo } from '@sitecore-jss/sitecore-jss/site';
3
+ export declare type MultisiteMiddlewareConfig = {
4
+ /**
5
+ * Function used to determine if route should be excluded during execution.
6
+ * By default, files (pathname.includes('.')), Next.js API routes (pathname.startsWith('/api/')), and Sitecore API routes (pathname.startsWith('/sitecore/')) are ignored.
7
+ * This is an important performance consideration since Next.js Edge middleware runs on every request.
8
+ * @param {string} pathname The pathname
9
+ * @returns {boolean} Whether to exclude the route
10
+ */
11
+ excludeRoute?: (pathname: string) => boolean;
12
+ /**
13
+ * function used to resolve site for given hostname
14
+ */
15
+ getSite: (hostname: string) => SiteInfo;
16
+ /**
17
+ * Fallback hostname in case `host` header is not present
18
+ * @default localhost
19
+ */
20
+ defaultHostname?: string;
21
+ };
22
+ /**
23
+ * Middleware / handler for multisite support
24
+ */
25
+ export declare class MultisiteMiddleware {
26
+ protected config: MultisiteMiddlewareConfig;
27
+ private defaultHostname;
28
+ /**
29
+ * @param {MultisiteMiddlewareConfig} [config] Multisite middleware config
30
+ */
31
+ constructor(config: MultisiteMiddlewareConfig);
32
+ /**
33
+ * Gets the Next.js middleware handler with error handling
34
+ * @returns middleware handler
35
+ */
36
+ getHandler(): (req: NextRequest, res?: NextResponse) => Promise<NextResponse>;
37
+ protected excludeRoute(pathname: string): boolean;
38
+ protected extractDebugHeaders(incomingHeaders: Headers): {
39
+ [key: string]: string;
40
+ };
41
+ private handler;
42
+ }
@@ -1,5 +1,6 @@
1
1
  import { NextResponse, NextRequest } from 'next/server';
2
2
  import { GraphQLPersonalizeServiceConfig, CdpServiceConfig, ExperienceParams } from '@sitecore-jss/sitecore-jss/personalize';
3
+ import { SiteInfo } from '@sitecore-jss/sitecore-jss/site';
3
4
  export declare type PersonalizeMiddlewareConfig = {
4
5
  /**
5
6
  * Function used to determine if route should be excluded from personalization.
@@ -29,6 +30,15 @@ export declare type PersonalizeMiddlewareConfig = {
29
30
  * @returns {boolean} false by default
30
31
  */
31
32
  disabled?: (req?: NextRequest, res?: NextResponse) => boolean;
33
+ /**
34
+ * function used to resolve site for given hostname
35
+ */
36
+ getSite: (hostname: string) => SiteInfo;
37
+ /**
38
+ * fallback hostname in case `host` header is not present
39
+ * @default localhost
40
+ */
41
+ defaultHostname?: string;
32
42
  };
33
43
  /**
34
44
  * Middleware / handler to support Sitecore Personalize
@@ -37,6 +47,7 @@ export declare class PersonalizeMiddleware {
37
47
  protected config: PersonalizeMiddlewareConfig;
38
48
  private personalizeService;
39
49
  private cdpService;
50
+ private defaultHostname;
40
51
  /**
41
52
  * @param {PersonalizeMiddlewareConfig} [config] Personalize middleware config
42
53
  */
@@ -1,18 +1,44 @@
1
1
  import { NextResponse, NextRequest } from 'next/server';
2
- import { GraphQLRedirectsServiceConfig } from '@sitecore-jss/sitecore-jss/site';
2
+ import { GraphQLRedirectsServiceConfig, SiteInfo } from '@sitecore-jss/sitecore-jss/site';
3
3
  /**
4
4
  * extended RedirectsMiddlewareConfig config type for RedirectsMiddleware
5
5
  */
6
6
  export declare type RedirectsMiddlewareConfig = Omit<GraphQLRedirectsServiceConfig, 'fetch'> & {
7
7
  locales: string[];
8
+ /**
9
+ * Function used to determine if route should be excluded from RedirectsMiddleware.
10
+ * By default, files (pathname.includes('.')), Next.js API routes (pathname.startsWith('/api/')), and Sitecore API routes (pathname.startsWith('/sitecore/')) are ignored.
11
+ * This is an important performance consideration since Next.js Edge middleware runs on every request.
12
+ * @param {string} pathname The pathname
13
+ * @returns {boolean} Whether to exclude the route from RedirectsMiddleware
14
+ */
15
+ excludeRoute?: (pathname: string) => boolean;
16
+ /**
17
+ * function, determines if middleware should be turned off, based on cookie, header, or other considerations
18
+ * @param {NextRequest} [req] optional: request object from middleware handler
19
+ * @param {NextResponse} [res] optional: response object from middleware handler
20
+ * @returns {boolean} false by default
21
+ */
22
+ disabled?: (req?: NextRequest, res?: NextResponse) => boolean;
23
+ /**
24
+ * function used to resolve site for given hostname
25
+ */
26
+ getSite: (hostname: string) => SiteInfo;
27
+ /**
28
+ * fallback hostname in case `host` header is not present
29
+ * @default localhost
30
+ */
31
+ defaultHostname?: string;
8
32
  };
9
33
  /**
10
34
  * Middleware / handler fetches all redirects from Sitecore instance by grapqhl service
11
35
  * compares with current url and redirects to target url
12
36
  */
13
37
  export declare class RedirectsMiddleware {
38
+ protected config: RedirectsMiddlewareConfig;
14
39
  private redirectsService;
15
40
  private locales;
41
+ private defaultHostname;
16
42
  /**
17
43
  * @param {RedirectsMiddlewareConfig} [config] redirects middleware config
18
44
  */
@@ -21,11 +47,14 @@ export declare class RedirectsMiddleware {
21
47
  * Gets the Next.js API route handler
22
48
  * @returns route handler
23
49
  */
24
- getHandler(): (req: NextRequest) => Promise<NextResponse>;
50
+ getHandler(): (req: NextRequest, res?: NextResponse) => Promise<NextResponse>;
51
+ protected excludeRoute(pathname: string): boolean;
52
+ protected getHostname(req: NextRequest): string;
25
53
  private handler;
26
54
  /**
27
55
  * Method returns RedirectInfo when matches
28
- * @param {NextRequest} req
56
+ * @param {NextRequest} req request
57
+ * @param {string} siteName site name
29
58
  * @returns Promise<RedirectInfo | undefined>
30
59
  * @private
31
60
  */
@@ -0,0 +1,12 @@
1
+ import { NextApiResponse, NextApiRequest } from 'next';
2
+ /**
3
+ * Middleware / handler for use in healthcheck Next.js API route (e.g. '/api/healthz').
4
+ */
5
+ export declare class HealthcheckMiddleware {
6
+ /**
7
+ * Gets the Next.js API route handler
8
+ * @returns route handler
9
+ */
10
+ getHandler(): (req: NextApiRequest, res: NextApiResponse) => Promise<void>;
11
+ private handler;
12
+ }
@@ -0,0 +1 @@
1
+ export { HealthcheckMiddleware } from './healthcheck-middleware';
@@ -1,6 +1,7 @@
1
1
  import { GraphQLClient, PageInfo } from '@sitecore-jss/sitecore-jss/graphql';
2
2
  /** @private */
3
3
  export declare const languageError = "The list of languages cannot be empty";
4
+ export declare const sitesError = "The list of sites cannot be empty";
4
5
  /**
5
6
  * @param {string} siteName to inject into error text
6
7
  * @private
@@ -64,7 +65,7 @@ export declare type RouteListQueryResult = {
64
65
  /**
65
66
  * Configuration options for @see GraphQLSitemapService instances
66
67
  */
67
- export interface GraphQLSitemapServiceConfig extends Omit<SiteRouteQueryVariables, 'language'> {
68
+ export interface GraphQLSitemapServiceConfig extends Omit<SiteRouteQueryVariables, 'language' | 'siteName'> {
68
69
  /**
69
70
  * Your Graphql endpoint
70
71
  */
@@ -73,6 +74,10 @@ export interface GraphQLSitemapServiceConfig extends Omit<SiteRouteQueryVariable
73
74
  * The API key to use for authentication.
74
75
  */
75
76
  apiKey: string;
77
+ /**
78
+ * Names of the configured sites
79
+ */
80
+ sites: string[];
76
81
  /**
77
82
  * A flag for whether to include personalized routes in service output - only works on XM Cloud
78
83
  * turned off by default
@@ -129,8 +134,8 @@ export declare class GraphQLSitemapService {
129
134
  * @throws {RangeError} if the any of the languages is an empty string.
130
135
  */
131
136
  protected fetchSitemap(languages: string[], formatStaticPath: (path: string[], language: string) => StaticPath): Promise<StaticPath[]>;
132
- protected transformLanguageSitePaths(sitePaths: RouteListQueryResult[], formatStaticPath: (path: string[], language: string) => StaticPath, language: string): Promise<StaticPath[]>;
133
- protected fetchLanguageSitePaths(language: string): Promise<RouteListQueryResult[]>;
137
+ protected transformLanguageSitePaths(sitePaths: RouteListQueryResult[], formatStaticPath: (path: string[], language: string) => StaticPath, language: string, multiSiteName?: string): Promise<StaticPath[]>;
138
+ protected fetchLanguageSitePaths(language: string, siteName: string): Promise<RouteListQueryResult[]>;
134
139
  /**
135
140
  * Gets a GraphQL client that can make requests to the API. Uses graphql-request as the default
136
141
  * library for fetching graphql data (@see GraphQLRequestClient). Override this method if you