@sitecore-content-sdk/nextjs 0.1.0-beta.4 → 0.1.0-beta.40

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 (106) hide show
  1. package/client.d.ts +1 -0
  2. package/client.js +1 -0
  3. package/component-props-loader.d.ts +1 -0
  4. package/component-props-loader.js +3 -0
  5. package/config.d.ts +1 -0
  6. package/config.js +1 -0
  7. package/dist/cjs/client/index.js +10 -0
  8. package/dist/cjs/client/sitecore-nextjs-client.js +117 -0
  9. package/dist/cjs/components/Link.js +8 -2
  10. package/dist/cjs/components/RichText.js +16 -4
  11. package/dist/cjs/config/define-cli-config.js +30 -0
  12. package/dist/cjs/config/index.js +7 -0
  13. package/dist/cjs/editing/editing-config-middleware.js +1 -3
  14. package/dist/cjs/editing/editing-render-middleware.js +13 -9
  15. package/dist/cjs/editing/index.js +2 -2
  16. package/dist/cjs/index.js +16 -18
  17. package/dist/cjs/middleware/index.js +5 -1
  18. package/dist/cjs/middleware/middleware.js +72 -16
  19. package/dist/cjs/middleware/multisite-middleware.js +62 -55
  20. package/dist/cjs/middleware/personalize-middleware.js +108 -111
  21. package/dist/cjs/middleware/redirects-middleware.js +126 -117
  22. package/dist/cjs/middleware/sitemap-middleware.js +47 -0
  23. package/dist/cjs/services/component-props-service.js +41 -50
  24. package/dist/cjs/tools/component-props.loader.js +101 -0
  25. package/dist/cjs/tools/index.js +9 -0
  26. package/dist/cjs/tools/templating/byoc-component.js +75 -0
  27. package/dist/cjs/tools/templating/constants.js +7 -0
  28. package/dist/cjs/tools/templating/default-component.js +54 -0
  29. package/dist/cjs/tools/templating/utils.js +18 -0
  30. package/dist/cjs/utils/index.js +2 -1
  31. package/dist/cjs/utils/utils.js +10 -1
  32. package/dist/esm/client/index.js +2 -0
  33. package/dist/esm/client/sitecore-nextjs-client.js +113 -0
  34. package/dist/esm/components/Link.js +8 -2
  35. package/dist/esm/components/RichText.js +14 -2
  36. package/dist/esm/config/define-cli-config.js +26 -0
  37. package/dist/esm/config/index.js +2 -0
  38. package/dist/esm/editing/editing-config-middleware.js +1 -3
  39. package/dist/esm/editing/editing-render-middleware.js +11 -7
  40. package/dist/esm/editing/index.js +1 -1
  41. package/dist/esm/index.js +3 -5
  42. package/dist/esm/middleware/index.js +2 -1
  43. package/dist/esm/middleware/middleware.js +69 -15
  44. package/dist/esm/middleware/multisite-middleware.js +63 -56
  45. package/dist/esm/middleware/personalize-middleware.js +105 -108
  46. package/dist/esm/middleware/redirects-middleware.js +127 -118
  47. package/dist/esm/middleware/sitemap-middleware.js +43 -0
  48. package/dist/esm/services/component-props-service.js +41 -50
  49. package/dist/esm/tools/component-props.loader.js +65 -0
  50. package/dist/esm/tools/index.js +1 -0
  51. package/dist/esm/tools/templating/byoc-component.js +69 -0
  52. package/dist/esm/tools/templating/constants.js +4 -0
  53. package/dist/esm/tools/templating/default-component.js +48 -0
  54. package/dist/esm/tools/templating/utils.js +12 -0
  55. package/dist/esm/utils/index.js +1 -1
  56. package/dist/esm/utils/utils.js +8 -0
  57. package/package.json +13 -10
  58. package/tools.d.ts +1 -0
  59. package/tools.js +1 -0
  60. package/types/client/index.d.ts +2 -0
  61. package/types/client/sitecore-nextjs-client.d.ts +44 -0
  62. package/types/components/Link.d.ts +5 -0
  63. package/types/components/RichText.d.ts +7 -1
  64. package/types/config/define-cli-config.d.ts +8 -0
  65. package/types/config/index.d.ts +2 -0
  66. package/types/editing/editing-config-middleware.d.ts +4 -2
  67. package/types/editing/editing-render-middleware.d.ts +3 -31
  68. package/types/editing/index.d.ts +1 -1
  69. package/types/index.d.ts +6 -8
  70. package/types/middleware/index.d.ts +2 -1
  71. package/types/middleware/middleware.d.ts +48 -21
  72. package/types/middleware/multisite-middleware.d.ts +4 -13
  73. package/types/middleware/personalize-middleware.d.ts +7 -21
  74. package/types/middleware/redirects-middleware.d.ts +3 -13
  75. package/types/middleware/sitemap-middleware.d.ts +12 -0
  76. package/types/services/component-props-service.d.ts +10 -26
  77. package/types/sharedTypes/component-props.d.ts +18 -0
  78. package/types/sharedTypes/sitecore-page-props.d.ts +5 -0
  79. package/types/tools/component-props.loader.d.ts +7 -0
  80. package/types/tools/index.d.ts +1 -0
  81. package/types/tools/templating/byoc-component.d.ts +2 -0
  82. package/types/tools/templating/constants.d.ts +4 -0
  83. package/types/tools/templating/default-component.d.ts +2 -0
  84. package/types/tools/templating/utils.d.ts +6 -0
  85. package/types/utils/index.d.ts +1 -1
  86. package/types/utils/utils.d.ts +2 -0
  87. package/dist/cjs/ComponentBuilder.js +0 -63
  88. package/dist/cjs/graphql/index.js +0 -7
  89. package/dist/cjs/services/base-graphql-sitemap-service.js +0 -206
  90. package/dist/cjs/services/graphql-sitemap-service.js +0 -64
  91. package/dist/cjs/services/mutisite-graphql-sitemap-service.js +0 -81
  92. package/dist/esm/ComponentBuilder.js +0 -59
  93. package/dist/esm/graphql/index.js +0 -1
  94. package/dist/esm/services/base-graphql-sitemap-service.js +0 -201
  95. package/dist/esm/services/graphql-sitemap-service.js +0 -59
  96. package/dist/esm/services/mutisite-graphql-sitemap-service.js +0 -77
  97. package/graphql.d.ts +0 -1
  98. package/graphql.js +0 -1
  99. package/types/ComponentBuilder.d.ts +0 -59
  100. package/types/graphql/index.d.ts +0 -1
  101. package/types/services/base-graphql-sitemap-service.d.ts +0 -148
  102. package/types/services/graphql-sitemap-service.d.ts +0 -51
  103. package/types/services/mutisite-graphql-sitemap-service.d.ts +0 -42
  104. package/types/sharedTypes/module-factory.d.ts +0 -32
  105. /package/dist/cjs/sharedTypes/{module-factory.js → sitecore-page-props.js} +0 -0
  106. /package/dist/esm/sharedTypes/{module-factory.js → sitecore-page-props.js} +0 -0
package/client.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './types/client/index';
package/client.js ADDED
@@ -0,0 +1 @@
1
+ module.exports = require('./dist/cjs/client/index');
@@ -0,0 +1 @@
1
+ export * from './types/tools/component-props.loader';
@@ -0,0 +1,3 @@
1
+ const loader = require('./dist/cjs/tools/component-props.loader');
2
+
3
+ module.exports = loader;
package/config.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './types/config/index';
package/config.js ADDED
@@ -0,0 +1 @@
1
+ module.exports = require('./dist/cjs/config/index');
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SitecoreClient = exports.createGraphQLClientFactory = exports.getEdgeProxyContentUrl = exports.GraphQLRequestClient = exports.DefaultRetryStrategy = void 0;
4
+ var client_1 = require("@sitecore-content-sdk/core/client");
5
+ Object.defineProperty(exports, "DefaultRetryStrategy", { enumerable: true, get: function () { return client_1.DefaultRetryStrategy; } });
6
+ Object.defineProperty(exports, "GraphQLRequestClient", { enumerable: true, get: function () { return client_1.GraphQLRequestClient; } });
7
+ Object.defineProperty(exports, "getEdgeProxyContentUrl", { enumerable: true, get: function () { return client_1.getEdgeProxyContentUrl; } });
8
+ Object.defineProperty(exports, "createGraphQLClientFactory", { enumerable: true, get: function () { return client_1.createGraphQLClientFactory; } });
9
+ var sitecore_nextjs_client_1 = require("./sitecore-nextjs-client");
10
+ Object.defineProperty(exports, "SitecoreClient", { enumerable: true, get: function () { return sitecore_nextjs_client_1.SitecoreNextjsClient; } });
@@ -0,0 +1,117 @@
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.SitecoreNextjsClient = void 0;
13
+ const client_1 = require("@sitecore-content-sdk/core/client");
14
+ const component_props_service_1 = require("../services/component-props-service");
15
+ const site_1 = require("@sitecore-content-sdk/core/site");
16
+ const personalize_1 = require("@sitecore-content-sdk/core/personalize");
17
+ class SitecoreNextjsClient extends client_1.SitecoreClient {
18
+ constructor(initOptions) {
19
+ super(initOptions);
20
+ this.initOptions = initOptions;
21
+ this.componentPropsService = this.getComponentPropsService();
22
+ }
23
+ /**
24
+ * Resolves site based on the provided path
25
+ * @param {string | string[]} path path to resolve site from
26
+ * @returns resolved site, or default site info if not found
27
+ */
28
+ resolveSiteFromPath(path) {
29
+ const resolvedPath = super.parsePath(path);
30
+ // Get site name (from path rewritten in middleware)
31
+ const siteData = (0, site_1.getSiteRewriteData)(resolvedPath, this.initOptions.defaultSite);
32
+ // Resolve site by name
33
+ return (this.siteResolver.getByName(siteData.siteName) || {
34
+ name: siteData.siteName,
35
+ hostName: '',
36
+ language: '',
37
+ });
38
+ }
39
+ /**
40
+ * Normalizes a nextjs path that could have been rewritten
41
+ * @param {string | string[]} path nextjs path
42
+ * @returns path string without nextjs prefixes
43
+ */
44
+ parsePath(path) {
45
+ const basePath = super.parsePath(path);
46
+ return (0, site_1.normalizeSiteRewrite)((0, personalize_1.normalizePersonalizedRewrite)(basePath));
47
+ }
48
+ getPage(path, pageOptions, options) {
49
+ const _super = Object.create(null, {
50
+ parsePath: { get: () => super.parsePath },
51
+ getPage: { get: () => super.getPage }
52
+ });
53
+ return __awaiter(this, void 0, void 0, function* () {
54
+ var _a;
55
+ const resolvedPath = this.parsePath(path);
56
+ // Get variant(s) for personalization (from path), must ensure path is of type string
57
+ const personalizeData = pageOptions.personalize || (0, personalize_1.getPersonalizedRewriteData)(_super.parsePath.call(this, path));
58
+ const site = pageOptions.site || ((_a = this.resolveSiteFromPath(path)) === null || _a === void 0 ? void 0 : _a.name);
59
+ const page = yield _super.getPage.call(this, resolvedPath, {
60
+ locale: pageOptions.locale,
61
+ site,
62
+ personalize: personalizeData,
63
+ }, options);
64
+ return page;
65
+ });
66
+ }
67
+ /**
68
+ * Retrieves preview page and layout details
69
+ * @param {PreviewData} previewData - The editing preview data for metadata mode.
70
+ * @param {FetchOptions} [fetchOptions] Additional fetch fetch options to override GraphQL requests (like retries and fetch)
71
+ */
72
+ getPreview(previewData, fetchOptions) {
73
+ const _super = Object.create(null, {
74
+ getPreview: { get: () => super.getPreview }
75
+ });
76
+ return __awaiter(this, void 0, void 0, function* () {
77
+ return _super.getPreview.call(this, previewData, fetchOptions);
78
+ });
79
+ }
80
+ /**
81
+ * Parses components from nextjs component map and layoutData, executes getServerProps/getStaticProps methods
82
+ * and returns resulting props from components
83
+ * @param {LayoutServiceData} layoutData layout data to parse compnents from
84
+ * @param {PreviewData} context Nextjs preview data
85
+ * @param {ComponentMap<NextjsJssComponent>} components component map to get props for
86
+ * @returns {ComponentPropsCollection} component props
87
+ */
88
+ getComponentData(layoutData, context, components) {
89
+ return __awaiter(this, void 0, void 0, function* () {
90
+ let componentProps = {};
91
+ if (!layoutData.sitecore.route)
92
+ return componentProps;
93
+ // Retrieve component props using side-effects defined on components level
94
+ componentProps = yield this.componentPropsService.fetchComponentProps({
95
+ layoutData: layoutData,
96
+ context,
97
+ components,
98
+ });
99
+ const errors = Object.keys(componentProps)
100
+ .map((id) => {
101
+ const component = componentProps[id];
102
+ return component.error
103
+ ? `\nUnable to get component props for ${component.componentName} (${id}): ${component.error}`
104
+ : '';
105
+ })
106
+ .join('');
107
+ if (errors.length) {
108
+ throw new Error(errors);
109
+ }
110
+ return componentProps;
111
+ });
112
+ }
113
+ getComponentPropsService() {
114
+ return new component_props_service_1.ComponentPropsService();
115
+ }
116
+ }
117
+ exports.SitecoreNextjsClient = SitecoreNextjsClient;
@@ -73,14 +73,20 @@ exports.Link = (0, react_1.forwardRef)((props, ref) => {
73
73
  const isFileUrl = FILE_EXTENSION_MATCHER.test(href);
74
74
  // determine if a link is a route or not. File extensions are not routes and should not be pre-fetched.
75
75
  if (isMatching && !isFileUrl) {
76
- return (react_1.default.createElement(link_1.default, Object.assign({ href: { pathname: href, query: querystring, hash: anchor }, key: "link", locale: false, title: value.title, target: value.target, className: value.class }, htmlLinkProps, { ref: ref }, (process.env.TEST ? { 'data-nextjs-link': true } : {})),
76
+ return (react_1.default.createElement(link_1.default, Object.assign({ href: { pathname: href, query: querystring, hash: anchor }, key: "link", locale: false, title: value.title, target: value.target, className: value.class, prefetch: props.prefetch }, htmlLinkProps, { ref: ref }, (process.env.TEST
77
+ ? {
78
+ 'data-nextjs-link': true,
79
+ 'data-nextjs-prefetch': props.prefetch,
80
+ }
81
+ : {})),
77
82
  text,
78
83
  children));
79
84
  }
80
85
  }
81
- // prevent passing internalLinkMatcher as it is an invalid DOM element prop
86
+ // prevent passing internalLinkMatcher or prefetch as it is an invalid DOM element prop
82
87
  const reactLinkProps = Object.assign({}, props);
83
88
  delete reactLinkProps.internalLinkMatcher;
89
+ delete reactLinkProps.prefetch;
84
90
  return (react_1.default.createElement(react_2.Link, Object.assign({}, reactLinkProps, { ref: ref }, (process.env.TEST ? { 'data-react-link': true } : {}))));
85
91
  });
86
92
  exports.Link.displayName = 'NextLink';
@@ -47,12 +47,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
47
47
  return (mod && mod.__esModule) ? mod : { "default": mod };
48
48
  };
49
49
  Object.defineProperty(exports, "__esModule", { value: true });
50
- exports.RichText = void 0;
50
+ exports.RichText = exports.prefetched = void 0;
51
51
  const react_1 = __importStar(require("react"));
52
52
  const prop_types_1 = __importDefault(require("prop-types"));
53
53
  const router_1 = require("next/router");
54
54
  const react_2 = require("@sitecore-content-sdk/react");
55
- const prefetched = {};
55
+ exports.prefetched = {};
56
56
  const RichText = (props) => {
57
57
  const { internalLinksSelector = 'a[href^="/"]', prefetchLinks = true, editable = true } = props, rest = __rest(props, ["internalLinksSelector", "prefetchLinks", "editable"]);
58
58
  const hasText = props.field && props.field.value;
@@ -81,9 +81,21 @@ const RichText = (props) => {
81
81
  internalLinks.forEach((link) => {
82
82
  if (link.target === '_blank')
83
83
  return;
84
- if (prefetchLinks && !prefetched[link.pathname]) {
84
+ const prefetch = () => {
85
85
  router.prefetch(link.pathname, undefined, { locale: false });
86
- prefetched[link.pathname] = true;
86
+ exports.prefetched[link.pathname] = true;
87
+ };
88
+ if (!exports.prefetched[link.pathname] && prefetchLinks !== false) {
89
+ if (prefetchLinks === true) {
90
+ prefetch();
91
+ }
92
+ if (prefetchLinks === 'hover') {
93
+ const mouseOverHandler = () => {
94
+ prefetch();
95
+ link.removeEventListener('mouseover', mouseOverHandler);
96
+ };
97
+ link.addEventListener('mouseover', mouseOverHandler, false);
98
+ }
87
99
  }
88
100
  link.addEventListener('click', routeHandler, false);
89
101
  });
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defineCliConfig = void 0;
4
+ const config_1 = require("@sitecore-content-sdk/core/config");
5
+ const byoc_component_1 = require("../tools/templating/byoc-component");
6
+ const default_component_1 = require("../tools/templating/default-component");
7
+ /**
8
+ * Accepts a `SitecoreCliConfigInput` object and returns the Sitecore Content SDK CLI configuration from the specified file,
9
+ * updated with the required default values.
10
+ * @param {SitecoreCliConfigInput} cliConfig the cli configuration provided by the application
11
+ * @returns {SitecoreCliConfig} full sitecore cli configuration to use with cli
12
+ */
13
+ const defineCliConfig = (cliConfig) => {
14
+ addDefaultScaffoldTemplates(cliConfig);
15
+ return (0, config_1.defineCliConfig)(cliConfig);
16
+ };
17
+ exports.defineCliConfig = defineCliConfig;
18
+ /**
19
+ * Adds default scaffold templates to the CLI configuration.
20
+ * @param {SitecoreCliConfigInput} cliConfig - The CLI configuration object
21
+ */
22
+ function addDefaultScaffoldTemplates(cliConfig) {
23
+ if (!cliConfig.scaffold) {
24
+ cliConfig.scaffold = {};
25
+ }
26
+ if (!cliConfig.scaffold.templates) {
27
+ cliConfig.scaffold.templates = [];
28
+ }
29
+ cliConfig.scaffold.templates.unshift(default_component_1.defaultTemplate, byoc_component_1.byocTemplate);
30
+ }
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defineCliConfig = exports.defineConfig = void 0;
4
+ var config_1 = require("@sitecore-content-sdk/core/config");
5
+ Object.defineProperty(exports, "defineConfig", { enumerable: true, get: function () { return config_1.defineConfig; } });
6
+ var define_cli_config_1 = require("./define-cli-config");
7
+ Object.defineProperty(exports, "defineCliConfig", { enumerable: true, get: function () { return define_cli_config_1.defineCliConfig; } });
@@ -41,9 +41,7 @@ class EditingConfigMiddleware {
41
41
  // CORS headers are set by enforceCors
42
42
  return res.status(204).send(null);
43
43
  }
44
- const components = Array.isArray(this.config.components)
45
- ? this.config.components
46
- : Array.from(this.config.components.keys());
44
+ const components = Array.from(this.config.components.keys());
47
45
  return res.status(200).json({
48
46
  components,
49
47
  packages: this.config.metadata.packages,
@@ -9,27 +9,28 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.EditingRenderMiddleware = exports.isComponentLibraryPreviewData = void 0;
12
+ exports.EditingRenderMiddleware = exports.isDesignLibraryPreviewData = void 0;
13
13
  const core_1 = require("@sitecore-content-sdk/core");
14
- const layout_1 = require("@sitecore-content-sdk/core/layout");
15
14
  const editing_1 = require("@sitecore-content-sdk/core/editing");
15
+ const layout_1 = require("@sitecore-content-sdk/core/layout");
16
16
  const utils_1 = require("../utils/utils");
17
17
  const render_middleware_1 = require("./render-middleware");
18
18
  const utils_2 = require("@sitecore-content-sdk/core/utils");
19
19
  const personalize_1 = require("@sitecore-content-sdk/core/personalize");
20
+ const site_1 = require("@sitecore-content-sdk/core/site");
20
21
  /**
21
- * Type guard for Component Library mode
22
+ * Type guard for Design Library mode
22
23
  * @param {object} data preview data to check
23
24
  * @returns true if the data is EditingPreviewData
24
25
  * @see EditingPreviewData
25
26
  */
26
- const isComponentLibraryPreviewData = (data) => {
27
+ const isDesignLibraryPreviewData = (data) => {
27
28
  return (typeof data === 'object' &&
28
29
  data !== null &&
29
30
  'mode' in data &&
30
31
  data.mode === 'library');
31
32
  };
32
- exports.isComponentLibraryPreviewData = isComponentLibraryPreviewData;
33
+ exports.isDesignLibraryPreviewData = isDesignLibraryPreviewData;
33
34
  /**
34
35
  * Middleware / handler for use in the editing render Next.js API route (e.g. '/api/editing/render')
35
36
  * which is required for Sitecore editing support.
@@ -97,15 +98,12 @@ class EditingRenderMiddleware extends render_middleware_1.RenderMiddlewareBase {
97
98
  });
98
99
  }
99
100
  if (mode === 'library') {
100
- // dedicated route and layout to SSR component library
101
- query.route = '/component-library/render';
102
101
  res.setPreviewData({
103
102
  itemId: query.sc_itemid,
104
103
  componentUid: query.sc_uid,
105
104
  renderingId: query.sc_renderingId,
106
105
  language: query.sc_lang,
107
106
  site: query.sc_site,
108
- pageState: layout_1.LayoutServicePageState.Normal,
109
107
  mode: 'library',
110
108
  dataSourceId: query.sc_datasourceId,
111
109
  version: query.sc_version,
@@ -121,7 +119,7 @@ class EditingRenderMiddleware extends render_middleware_1.RenderMiddlewareBase {
121
119
  // for sc_variantId we may employ multiple variants (page-layout + component level)
122
120
  variantIds: ((_c = query.sc_variant) === null || _c === void 0 ? void 0 : _c.split(',')) || [personalize_1.DEFAULT_VARIANT],
123
121
  version: query.sc_version,
124
- pageState: query.mode,
122
+ mode: query.mode,
125
123
  layoutKind: query.sc_layoutKind,
126
124
  },
127
125
  // Cache the preview data for 3 seconds to ensure the page is rendered with the correct preview data not the cached one
@@ -149,6 +147,12 @@ class EditingRenderMiddleware extends render_middleware_1.RenderMiddlewareBase {
149
147
  }
150
148
  return cookie;
151
149
  });
150
+ // Set Preview mode identifier cookie, if the page is rendered in Sitecore Preview mode
151
+ if (mode === layout_1.LayoutServicePageState.Preview) {
152
+ const previewSite = `${site_1.SITE_KEY}=${query.sc_site}; Path=/; HttpOnly; SameSite=None; Secure`;
153
+ const previewCookie = `${editing_1.PREVIEW_KEY}=true; Path=/; HttpOnly; SameSite=None; Secure`;
154
+ modifiedCookies.push(previewSite, previewCookie);
155
+ }
152
156
  res.setHeader('Set-Cookie', modifiedCookies);
153
157
  }
154
158
  const route = ((_e = (_d = this.config) === null || _d === void 0 ? void 0 : _d.resolvePageUrl) === null || _e === void 0 ? void 0 : _e.call(_d, query.route)) || query.route;
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EDITING_COMPONENT_ID = exports.EDITING_COMPONENT_PLACEHOLDER = exports.RenderingType = exports.EditingConfigMiddleware = exports.FEAASRenderMiddleware = exports.isComponentLibraryPreviewData = exports.EditingRenderMiddleware = exports.GraphQLEditingService = void 0;
3
+ exports.EDITING_COMPONENT_ID = exports.EDITING_COMPONENT_PLACEHOLDER = exports.RenderingType = exports.EditingConfigMiddleware = exports.FEAASRenderMiddleware = exports.isDesignLibraryPreviewData = exports.EditingRenderMiddleware = exports.GraphQLEditingService = void 0;
4
4
  var editing_1 = require("@sitecore-content-sdk/core/editing");
5
5
  Object.defineProperty(exports, "GraphQLEditingService", { enumerable: true, get: function () { return editing_1.GraphQLEditingService; } });
6
6
  var editing_render_middleware_1 = require("./editing-render-middleware");
7
7
  Object.defineProperty(exports, "EditingRenderMiddleware", { enumerable: true, get: function () { return editing_render_middleware_1.EditingRenderMiddleware; } });
8
- Object.defineProperty(exports, "isComponentLibraryPreviewData", { enumerable: true, get: function () { return editing_render_middleware_1.isComponentLibraryPreviewData; } });
8
+ Object.defineProperty(exports, "isDesignLibraryPreviewData", { enumerable: true, get: function () { return editing_render_middleware_1.isDesignLibraryPreviewData; } });
9
9
  var feaas_render_middleware_1 = require("./feaas-render-middleware");
10
10
  Object.defineProperty(exports, "FEAASRenderMiddleware", { enumerable: true, get: function () { return feaas_render_middleware_1.FEAASRenderMiddleware; } });
11
11
  var editing_config_middleware_1 = require("./editing-config-middleware");
package/dist/cjs/index.js CHANGED
@@ -33,8 +33,8 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.ComponentLibraryLayout = exports.File = exports.getComponentLibraryStylesheetLinks = exports.BYOCComponent = exports.fetchFEaaSComponentServerProps = exports.FEaaSComponent = exports.DateField = exports.Text = exports.Image = exports.ComponentBuilder = exports.BYOCWrapper = exports.FEaaSWrapper = exports.NextImage = exports.Placeholder = exports.RichText = exports.Link = exports.useComponentProps = exports.ComponentPropsContext = exports.ComponentPropsReactContext = exports.normalizeSiteRewrite = exports.getSiteRewriteData = exports.getSiteRewrite = exports.GraphQLSiteInfoService = exports.SiteResolver = exports.GraphQLRobotsService = exports.GraphQLErrorPagesService = exports.GraphQLSitemapXmlService = exports.MultisiteGraphQLSitemapService = exports.GraphQLSitemapService = exports.ComponentPropsService = exports.CdpHelper = exports.normalizePersonalizedRewrite = exports.getGroomedVariantIds = exports.getPersonalizedRewriteData = exports.getPersonalizedRewrite = exports.personalizeLayout = exports.GraphQLDictionaryService = exports.mediaApi = exports.RestComponentLayoutService = exports.EditMode = exports.getContentStylesheetLink = exports.getFieldValue = exports.getChildPlaceholder = exports.GraphQLLayoutService = exports.LayoutServicePageState = exports.MemoryCacheClient = exports.debug = exports.enableDebug = exports.NativeDataFetcher = exports.constants = void 0;
37
- exports.EditingScripts = exports.withEmptyFieldEditingComponent = exports.withFieldMetadata = exports.withDatasourceCheck = exports.withPlaceholder = exports.withEditorChromes = exports.useSitecoreContext = exports.withSitecoreContext = exports.SitecoreContextReactContext = exports.SitecoreContext = exports.DefaultEmptyFieldEditingComponentText = exports.DefaultEmptyFieldEditingComponentImage = void 0;
36
+ exports.DefaultEmptyFieldEditingComponentImage = exports.DesignLibrary = exports.File = exports.getDesignLibraryStylesheetLinks = exports.BYOCComponent = exports.fetchFEaaSComponentServerProps = exports.FEaaSComponent = exports.DateField = exports.Text = exports.Image = exports.BYOCWrapper = exports.FEaaSWrapper = exports.NextImage = exports.Placeholder = exports.RichText = exports.Link = exports.useComponentProps = exports.ComponentPropsContext = exports.ComponentPropsReactContext = exports.normalizeSiteRewrite = exports.getSiteRewriteData = exports.getSiteRewrite = exports.GraphQLSiteInfoService = exports.SiteResolver = exports.GraphQLRobotsService = exports.GraphQLErrorPagesService = exports.GraphQLSitemapXmlService = exports.GraphQLSitePathService = exports.ComponentPropsService = exports.CdpHelper = exports.normalizePersonalizedRewrite = exports.getGroomedVariantIds = exports.getPersonalizedRewriteData = exports.getPersonalizedRewrite = exports.personalizeLayout = exports.GraphQLDictionaryService = exports.mediaApi = exports.RestComponentLayoutService = exports.RenderingType = exports.EditMode = exports.getContentStylesheetLink = exports.getFieldValue = exports.getChildPlaceholder = exports.GraphQLLayoutService = exports.LayoutServicePageState = exports.MemoryCacheClient = exports.debug = exports.enableDebug = exports.NativeDataFetcher = exports.constants = void 0;
37
+ exports.Form = exports.EditingScripts = exports.withEmptyFieldEditingComponent = exports.withFieldMetadata = exports.withDatasourceCheck = exports.withPlaceholder = exports.withEditorChromes = exports.useSitecoreContext = exports.withSitecoreContext = exports.SitecoreContextReactContext = exports.SitecoreContext = exports.DefaultEmptyFieldEditingComponentText = void 0;
38
38
  var core_1 = require("@sitecore-content-sdk/core");
39
39
  Object.defineProperty(exports, "constants", { enumerable: true, get: function () { return core_1.constants; } });
40
40
  // generic data access
@@ -49,6 +49,7 @@ Object.defineProperty(exports, "getChildPlaceholder", { enumerable: true, get: f
49
49
  Object.defineProperty(exports, "getFieldValue", { enumerable: true, get: function () { return layout_1.getFieldValue; } });
50
50
  Object.defineProperty(exports, "getContentStylesheetLink", { enumerable: true, get: function () { return layout_1.getContentStylesheetLink; } });
51
51
  Object.defineProperty(exports, "EditMode", { enumerable: true, get: function () { return layout_1.EditMode; } });
52
+ Object.defineProperty(exports, "RenderingType", { enumerable: true, get: function () { return layout_1.RenderingType; } });
52
53
  var editing_1 = require("@sitecore-content-sdk/core/editing");
53
54
  Object.defineProperty(exports, "RestComponentLayoutService", { enumerable: true, get: function () { return editing_1.RestComponentLayoutService; } });
54
55
  var media_1 = require("@sitecore-content-sdk/core/media");
@@ -64,19 +65,17 @@ Object.defineProperty(exports, "normalizePersonalizedRewrite", { enumerable: tru
64
65
  Object.defineProperty(exports, "CdpHelper", { enumerable: true, get: function () { return personalize_1.CdpHelper; } });
65
66
  var component_props_service_1 = require("./services/component-props-service");
66
67
  Object.defineProperty(exports, "ComponentPropsService", { enumerable: true, get: function () { return component_props_service_1.ComponentPropsService; } });
67
- var graphql_sitemap_service_1 = require("./services/graphql-sitemap-service");
68
- Object.defineProperty(exports, "GraphQLSitemapService", { enumerable: true, get: function () { return graphql_sitemap_service_1.GraphQLSitemapService; } });
69
- var mutisite_graphql_sitemap_service_1 = require("./services/mutisite-graphql-sitemap-service");
70
- Object.defineProperty(exports, "MultisiteGraphQLSitemapService", { enumerable: true, get: function () { return mutisite_graphql_sitemap_service_1.MultisiteGraphQLSitemapService; } });
71
68
  var site_1 = require("@sitecore-content-sdk/core/site");
72
- Object.defineProperty(exports, "GraphQLSitemapXmlService", { enumerable: true, get: function () { return site_1.GraphQLSitemapXmlService; } });
73
- Object.defineProperty(exports, "GraphQLErrorPagesService", { enumerable: true, get: function () { return site_1.GraphQLErrorPagesService; } });
74
- Object.defineProperty(exports, "GraphQLRobotsService", { enumerable: true, get: function () { return site_1.GraphQLRobotsService; } });
75
- Object.defineProperty(exports, "SiteResolver", { enumerable: true, get: function () { return site_1.SiteResolver; } });
76
- Object.defineProperty(exports, "GraphQLSiteInfoService", { enumerable: true, get: function () { return site_1.GraphQLSiteInfoService; } });
77
- Object.defineProperty(exports, "getSiteRewrite", { enumerable: true, get: function () { return site_1.getSiteRewrite; } });
78
- Object.defineProperty(exports, "getSiteRewriteData", { enumerable: true, get: function () { return site_1.getSiteRewriteData; } });
79
- Object.defineProperty(exports, "normalizeSiteRewrite", { enumerable: true, get: function () { return site_1.normalizeSiteRewrite; } });
69
+ Object.defineProperty(exports, "GraphQLSitePathService", { enumerable: true, get: function () { return site_1.GraphQLSitePathService; } });
70
+ var site_2 = require("@sitecore-content-sdk/core/site");
71
+ Object.defineProperty(exports, "GraphQLSitemapXmlService", { enumerable: true, get: function () { return site_2.GraphQLSitemapXmlService; } });
72
+ Object.defineProperty(exports, "GraphQLErrorPagesService", { enumerable: true, get: function () { return site_2.GraphQLErrorPagesService; } });
73
+ Object.defineProperty(exports, "GraphQLRobotsService", { enumerable: true, get: function () { return site_2.GraphQLRobotsService; } });
74
+ Object.defineProperty(exports, "SiteResolver", { enumerable: true, get: function () { return site_2.SiteResolver; } });
75
+ Object.defineProperty(exports, "GraphQLSiteInfoService", { enumerable: true, get: function () { return site_2.GraphQLSiteInfoService; } });
76
+ Object.defineProperty(exports, "getSiteRewrite", { enumerable: true, get: function () { return site_2.getSiteRewrite; } });
77
+ Object.defineProperty(exports, "getSiteRewriteData", { enumerable: true, get: function () { return site_2.getSiteRewriteData; } });
78
+ Object.defineProperty(exports, "normalizeSiteRewrite", { enumerable: true, get: function () { return site_2.normalizeSiteRewrite; } });
80
79
  var ComponentPropsContext_1 = require("./components/ComponentPropsContext");
81
80
  Object.defineProperty(exports, "ComponentPropsReactContext", { enumerable: true, get: function () { return ComponentPropsContext_1.ComponentPropsReactContext; } });
82
81
  Object.defineProperty(exports, "ComponentPropsContext", { enumerable: true, get: function () { return ComponentPropsContext_1.ComponentPropsContext; } });
@@ -93,8 +92,6 @@ const FEaaSWrapper = __importStar(require("./components/FEaaSWrapper"));
93
92
  exports.FEaaSWrapper = FEaaSWrapper;
94
93
  const BYOCWrapper = __importStar(require("./components/BYOCWrapper"));
95
94
  exports.BYOCWrapper = BYOCWrapper;
96
- var ComponentBuilder_1 = require("./ComponentBuilder");
97
- Object.defineProperty(exports, "ComponentBuilder", { enumerable: true, get: function () { return ComponentBuilder_1.ComponentBuilder; } });
98
95
  var react_1 = require("@sitecore-content-sdk/react");
99
96
  Object.defineProperty(exports, "Image", { enumerable: true, get: function () { return react_1.Image; } });
100
97
  Object.defineProperty(exports, "Text", { enumerable: true, get: function () { return react_1.Text; } });
@@ -102,9 +99,9 @@ Object.defineProperty(exports, "DateField", { enumerable: true, get: function ()
102
99
  Object.defineProperty(exports, "FEaaSComponent", { enumerable: true, get: function () { return react_1.FEaaSComponent; } });
103
100
  Object.defineProperty(exports, "fetchFEaaSComponentServerProps", { enumerable: true, get: function () { return react_1.fetchFEaaSComponentServerProps; } });
104
101
  Object.defineProperty(exports, "BYOCComponent", { enumerable: true, get: function () { return react_1.BYOCComponent; } });
105
- Object.defineProperty(exports, "getComponentLibraryStylesheetLinks", { enumerable: true, get: function () { return react_1.getComponentLibraryStylesheetLinks; } });
102
+ Object.defineProperty(exports, "getDesignLibraryStylesheetLinks", { enumerable: true, get: function () { return react_1.getDesignLibraryStylesheetLinks; } });
106
103
  Object.defineProperty(exports, "File", { enumerable: true, get: function () { return react_1.File; } });
107
- Object.defineProperty(exports, "ComponentLibraryLayout", { enumerable: true, get: function () { return react_1.ComponentLibraryLayout; } });
104
+ Object.defineProperty(exports, "DesignLibrary", { enumerable: true, get: function () { return react_1.DesignLibrary; } });
108
105
  Object.defineProperty(exports, "DefaultEmptyFieldEditingComponentImage", { enumerable: true, get: function () { return react_1.DefaultEmptyFieldEditingComponentImage; } });
109
106
  Object.defineProperty(exports, "DefaultEmptyFieldEditingComponentText", { enumerable: true, get: function () { return react_1.DefaultEmptyFieldEditingComponentText; } });
110
107
  Object.defineProperty(exports, "SitecoreContext", { enumerable: true, get: function () { return react_1.SitecoreContext; } });
@@ -117,3 +114,4 @@ Object.defineProperty(exports, "withDatasourceCheck", { enumerable: true, get: f
117
114
  Object.defineProperty(exports, "withFieldMetadata", { enumerable: true, get: function () { return react_1.withFieldMetadata; } });
118
115
  Object.defineProperty(exports, "withEmptyFieldEditingComponent", { enumerable: true, get: function () { return react_1.withEmptyFieldEditingComponent; } });
119
116
  Object.defineProperty(exports, "EditingScripts", { enumerable: true, get: function () { return react_1.EditingScripts; } });
117
+ Object.defineProperty(exports, "Form", { enumerable: true, get: function () { return react_1.Form; } });
@@ -1,13 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MultisiteMiddleware = exports.PersonalizeMiddleware = exports.RedirectsMiddleware = exports.MiddlewareBase = exports.debug = void 0;
3
+ exports.SitemapMiddleware = exports.MultisiteMiddleware = exports.PersonalizeMiddleware = exports.RedirectsMiddleware = exports.defineMiddleware = exports.Middleware = exports.MiddlewareBase = exports.debug = void 0;
4
4
  var core_1 = require("@sitecore-content-sdk/core");
5
5
  Object.defineProperty(exports, "debug", { enumerable: true, get: function () { return core_1.debug; } });
6
6
  var middleware_1 = require("./middleware");
7
7
  Object.defineProperty(exports, "MiddlewareBase", { enumerable: true, get: function () { return middleware_1.MiddlewareBase; } });
8
+ Object.defineProperty(exports, "Middleware", { enumerable: true, get: function () { return middleware_1.Middleware; } });
9
+ Object.defineProperty(exports, "defineMiddleware", { enumerable: true, get: function () { return middleware_1.defineMiddleware; } });
8
10
  var redirects_middleware_1 = require("./redirects-middleware");
9
11
  Object.defineProperty(exports, "RedirectsMiddleware", { enumerable: true, get: function () { return redirects_middleware_1.RedirectsMiddleware; } });
10
12
  var personalize_middleware_1 = require("./personalize-middleware");
11
13
  Object.defineProperty(exports, "PersonalizeMiddleware", { enumerable: true, get: function () { return personalize_middleware_1.PersonalizeMiddleware; } });
12
14
  var multisite_middleware_1 = require("./multisite-middleware");
13
15
  Object.defineProperty(exports, "MultisiteMiddleware", { enumerable: true, get: function () { return multisite_middleware_1.MultisiteMiddleware; } });
16
+ var sitemap_middleware_1 = require("./sitemap-middleware");
17
+ Object.defineProperty(exports, "SitemapMiddleware", { enumerable: true, get: function () { return sitemap_middleware_1.SitemapMiddleware; } });
@@ -1,12 +1,33 @@
1
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
+ };
2
11
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MiddlewareBase = void 0;
12
+ exports.defineMiddleware = exports.MiddlewareBase = exports.Middleware = exports.REWRITE_HEADER_NAME = void 0;
13
+ const site_1 = require("@sitecore-content-sdk/core/site");
14
+ const core_1 = require("@sitecore-content-sdk/core");
4
15
  const server_1 = require("next/server");
5
- class MiddlewareBase {
16
+ exports.REWRITE_HEADER_NAME = 'x-sc-rewrite';
17
+ /**
18
+ * Middleware class to be extended by all middleware implementations
19
+ */
20
+ class Middleware {
21
+ }
22
+ exports.Middleware = Middleware;
23
+ /**
24
+ * Base middleware class with common methods
25
+ */
26
+ class MiddlewareBase extends Middleware {
6
27
  constructor(config) {
28
+ super();
7
29
  this.config = config;
8
- this.SITE_SYMBOL = 'sc_site';
9
- this.REWRITE_HEADER_NAME = 'x-sc-rewrite';
30
+ this.siteResolver = new site_1.SiteResolver(config.sites);
10
31
  this.defaultHostname = config.defaultHostname || 'localhost';
11
32
  }
12
33
  /**
@@ -29,12 +50,12 @@ class MiddlewareBase {
29
50
  req.headers.get('purpose') === 'prefetch' || req.headers.get('Next-Router-Prefetch') === '1' // Pages Router // App Router
30
51
  );
31
52
  }
32
- excludeRoute(pathname) {
33
- var _a, _b;
53
+ disabled(req, res) {
54
+ const { pathname } = req.nextUrl;
34
55
  return (pathname.startsWith('/api/') || // Ignore Next.js API calls
35
56
  pathname.startsWith('/sitecore/') || // Ignore Sitecore API calls
36
57
  pathname.startsWith('/_next') || // Ignore next service calls
37
- (((_a = this.config) === null || _a === void 0 ? void 0 : _a.excludeRoute) && ((_b = this.config) === null || _b === void 0 ? void 0 : _b.excludeRoute(pathname))));
58
+ (this.config.skip && this.config.skip(req, res)));
38
59
  }
39
60
  /**
40
61
  * Safely extract all headers for debug logging
@@ -53,7 +74,7 @@ class MiddlewareBase {
53
74
  * @returns {string} language
54
75
  */
55
76
  getLanguage(req) {
56
- return req.nextUrl.locale || req.nextUrl.defaultLocale || 'en';
77
+ return req.nextUrl.locale || req.nextUrl.defaultLocale || this.config.defaultLanguage || 'en';
57
78
  }
58
79
  /**
59
80
  * Extract 'host' header
@@ -64,34 +85,69 @@ class MiddlewareBase {
64
85
  return (_a = req.headers.get('host')) === null || _a === void 0 ? void 0 : _a.split(':')[0];
65
86
  }
66
87
  /**
67
- * Get site information.
68
- * Can not be used in **Preview** mode, since site will not be resolved
88
+ * Get site information. If site name is stored in cookie, use it, otherwise resolve by hostname
89
+ * - If site can't be resolved by site name cookie use default site info based on provided parameters
90
+ * - If site can't be resolved by hostname throw an error
69
91
  * @param {NextRequest} req request
70
92
  * @param {NextResponse} [res] response
71
93
  * @returns {SiteInfo} site information
72
94
  */
73
95
  getSite(req, res) {
74
96
  var _a;
75
- const siteNameCookie = (_a = res === null || res === void 0 ? void 0 : res.cookies.get(this.SITE_SYMBOL)) === null || _a === void 0 ? void 0 : _a.value;
76
- if (siteNameCookie)
77
- return this.config.siteResolver.getByName(siteNameCookie);
97
+ const siteNameCookie = (_a = res === null || res === void 0 ? void 0 : res.cookies.get(site_1.SITE_KEY)) === null || _a === void 0 ? void 0 : _a.value;
78
98
  const hostname = this.getHostHeader(req) || this.defaultHostname;
79
- return this.config.siteResolver.getByHost(hostname);
99
+ if (siteNameCookie) {
100
+ // Usually we should be able to resolve site by cookie
101
+ // in case of Sitecore Preview mode, there can be a case that new site was created
102
+ // but it's not present in the sitemap, so we fallback to default site info
103
+ return (this.siteResolver.getByName(siteNameCookie) || {
104
+ name: siteNameCookie,
105
+ language: this.getLanguage(req),
106
+ hostName: '*',
107
+ });
108
+ }
109
+ return this.siteResolver.getByHost(hostname);
80
110
  }
81
111
  /**
82
112
  * Create a rewrite response
83
113
  * @param {string} rewritePath the destionation path
84
114
  * @param {NextRequest} req the current request
85
115
  * @param {NextResponse} res the current response
116
+ * @param {boolean} [skipHeader] don't write 'x-sc-rewrite' header
86
117
  */
87
- rewrite(rewritePath, req, res) {
118
+ rewrite(rewritePath, req, res, skipHeader) {
88
119
  // Note an absolute URL is required: https://nextjs.org/docs/messages/middleware-relative-urls
89
120
  const rewriteUrl = req.nextUrl.clone();
90
121
  rewriteUrl.pathname = rewritePath;
91
122
  const response = server_1.NextResponse.rewrite(rewriteUrl, res);
92
123
  // Share rewrite path with following executed middlewares
93
- response.headers.set(this.REWRITE_HEADER_NAME, rewritePath);
124
+ if (!skipHeader) {
125
+ response.headers.set(exports.REWRITE_HEADER_NAME, rewritePath);
126
+ }
94
127
  return response;
95
128
  }
96
129
  }
97
130
  exports.MiddlewareBase = MiddlewareBase;
131
+ /**
132
+ * Define a middleware with a list of middlewares
133
+ * @param {Middleware[]} middlewares List of middlewares to execute
134
+ */
135
+ const defineMiddleware = (...middlewares) => {
136
+ return {
137
+ /**
138
+ * Execute all middlewares
139
+ * @param {NextRequest} req request
140
+ * @param {NextFetchEvent} ev fetch event
141
+ * @param {NextResponse} [res] response
142
+ */
143
+ exec: (req, ev, res) => __awaiter(void 0, void 0, void 0, function* () {
144
+ const response = res || server_1.NextResponse.next();
145
+ core_1.debug.common('middleware start');
146
+ const start = Date.now();
147
+ const middlewareResponse = yield middlewares.reduce((p, middleware) => p.then((res) => middleware.handle(req, res, ev)), Promise.resolve(response));
148
+ core_1.debug.common('middleware end in %dms', Date.now() - start);
149
+ return middlewareResponse;
150
+ }),
151
+ };
152
+ };
153
+ exports.defineMiddleware = defineMiddleware;