create-sitecore-jss 22.2.0-canary.5 → 22.2.0-canary.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +17 -42
- package/dist/common/index.js +5 -3
- package/dist/common/processes/install.js +1 -1
- package/dist/common/processes/next.js +6 -3
- package/dist/common/processes/transform.js +19 -19
- package/dist/common/prompts/base.js +0 -25
- package/dist/common/prompts/proxy.js +35 -0
- package/dist/common/prompts/sxp.js +34 -0
- package/dist/common/utils/helpers.js +29 -19
- package/dist/init-runner.js +6 -3
- package/dist/initializers/angular/index.js +0 -3
- package/dist/initializers/angular/prompts.js +6 -6
- package/dist/initializers/angular-sxp/index.js +8 -2
- package/dist/initializers/angular-xmcloud/index.js +28 -4
- package/dist/initializers/nextjs/index.js +2 -2
- package/dist/initializers/nextjs/prompts.js +2 -0
- package/dist/initializers/nextjs/remove-dev-dependencies.js +2 -2
- package/dist/initializers/nextjs-multisite/index.js +1 -1
- package/dist/initializers/nextjs-styleguide/index.js +1 -1
- package/dist/initializers/nextjs-styleguide-tracking/index.js +1 -1
- package/dist/initializers/nextjs-sxa/index.js +1 -1
- package/dist/initializers/nextjs-xmcloud/index.js +1 -1
- package/dist/initializers/node-xmcloud-proxy/index.js +2 -1
- package/dist/initializers/react/index.js +3 -3
- package/dist/initializers/react/prompts.js +1 -1
- package/dist/initializers/react-native/prompts.js +1 -0
- package/dist/initializers/vue/prompts.js +1 -1
- package/dist/templates/angular/.env +4 -5
- package/dist/templates/angular/.eslintrc +1 -0
- package/dist/templates/angular/package.json +0 -2
- package/dist/templates/angular/scripts/config/plugins/fallback.ts +0 -1
- package/dist/templates/angular/scripts/generate-component-factory.ts +8 -0
- package/dist/templates/angular/scripts/generate-config.ts +25 -6
- package/dist/templates/angular/scripts/update-graphql-fragment-data.ts +21 -30
- package/dist/templates/angular/server.bundle.ts +3 -23
- package/dist/templates/angular/server.exports.ts +13 -0
- package/dist/templates/angular/src/app/JssState.ts +2 -9
- package/dist/templates/angular/src/app/app.module.ts +1 -1
- package/dist/templates/angular/src/app/jss-context.server-side.service.ts +4 -2
- package/dist/templates/angular/src/app/jss-context.service.ts +14 -11
- package/dist/templates/angular/src/app/jss-graphql.service.ts +7 -7
- package/dist/templates/angular/src/app/layout/jss-layout.service.ts +2 -2
- package/dist/templates/angular/src/app/lib/dictionary-service-factory.ts +4 -1
- package/dist/templates/angular/src/app/lib/graphql-client-factory/config.ts +21 -0
- package/dist/templates/angular/src/app/lib/graphql-client-factory/index.ts +16 -0
- package/dist/templates/angular/src/app/lib/layout-service-factory.ts +1 -1
- package/dist/templates/angular/src/app/routing/layout/layout.component.ts +10 -9
- package/dist/templates/angular-sxp/.env +2 -0
- package/dist/templates/angular-sxp/scripts/config/plugins/disconnected.ts +4 -2
- package/dist/templates/angular-sxp/src/app/components/graph-ql-layout/graph-ql-layout.component.ts +1 -1
- package/dist/templates/angular-xmcloud/.env +8 -2
- package/dist/templates/angular-xmcloud/angular.json +33 -0
- package/dist/templates/angular-xmcloud/package.json +15 -10
- package/dist/templates/angular-xmcloud/scripts/bootstrap.ts +28 -0
- package/dist/templates/angular-xmcloud/scripts/config/plugins/xmcloud.ts +16 -0
- package/dist/templates/angular-xmcloud/scripts/generate-metadata.ts +25 -0
- package/dist/templates/angular-xmcloud/server.exports.ts +24 -0
- package/dist/templates/angular-xmcloud/src/app/components/app-components.shared.module.ts +21 -0
- package/dist/templates/angular-xmcloud/src/app/components/column-splitter/column-splitter.component.html +5 -0
- package/dist/templates/angular-xmcloud/src/app/components/column-splitter/column-splitter.component.ts +40 -0
- package/dist/templates/angular-xmcloud/src/app/components/container/container.component.html +14 -0
- package/dist/templates/angular-xmcloud/src/app/components/container/container.component.ts +30 -0
- package/dist/templates/angular-xmcloud/src/app/components/image/image.component.html +36 -0
- package/dist/templates/angular-xmcloud/src/app/components/image/image.component.ts +67 -0
- package/dist/templates/angular-xmcloud/src/app/components/link-list/link-list.component.html +15 -0
- package/dist/templates/angular-xmcloud/src/app/components/link-list/link-list.component.ts +41 -0
- package/dist/templates/angular-xmcloud/src/app/components/navigation/navigation-item.component.html +23 -0
- package/dist/templates/angular-xmcloud/src/app/components/navigation/navigation-item.component.ts +65 -0
- package/dist/templates/angular-xmcloud/src/app/components/navigation/navigation.component.html +21 -0
- package/dist/templates/angular-xmcloud/src/app/components/navigation/navigation.component.ts +49 -0
- package/dist/templates/angular-xmcloud/src/app/components/page-content/page-content.component.html +5 -0
- package/dist/templates/angular-xmcloud/src/app/components/page-content/page-content.component.ts +39 -0
- package/dist/templates/angular-xmcloud/src/app/components/partial-design-dynamic-placeholder/partial-design-dynamic-placeholder.component.html +1 -0
- package/dist/templates/angular-xmcloud/src/app/components/partial-design-dynamic-placeholder/partial-design-dynamic-placeholder.component.ts +15 -0
- package/dist/templates/angular-xmcloud/src/app/components/promo/promo.component.html +21 -0
- package/dist/templates/angular-xmcloud/src/app/components/promo/promo.component.ts +13 -0
- package/dist/templates/angular-xmcloud/src/app/components/richtext/richtext.component.html +7 -12
- package/dist/templates/angular-xmcloud/src/app/components/richtext/richtext.component.ts +6 -1
- package/dist/templates/angular-xmcloud/src/app/components/row-splitter/row-splitter.component.html +11 -0
- package/dist/templates/angular-xmcloud/src/app/components/row-splitter/row-splitter.component.ts +35 -0
- package/dist/templates/angular-xmcloud/src/app/components/sxa.component.ts +4 -4
- package/dist/templates/angular-xmcloud/src/app/components/title/title.component.html +10 -0
- package/dist/templates/angular-xmcloud/src/app/components/title/title.component.ts +56 -0
- package/dist/templates/angular-xmcloud/src/app/jss-link.service.ts +55 -0
- package/dist/templates/angular-xmcloud/src/app/lib/config.ts +2 -0
- package/dist/templates/angular-xmcloud/src/app/lib/graphql-client-factory/config.ts +58 -0
- package/dist/templates/angular-xmcloud/src/app/routing/layout/layout.component.html +38 -0
- package/dist/templates/angular-xmcloud/src/app/routing/layout/layout.component.ts +104 -0
- package/dist/templates/angular-xmcloud/src/app/routing/scripts/scripts.component.html +3 -0
- package/dist/templates/angular-xmcloud/src/app/routing/scripts/scripts.module.ts +10 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/basic/_component.scss +48 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/basic/_container.scss +64 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/basic/_fonts.scss +3 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/basic/_footer.scss +31 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/basic/_header.scss +51 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/basic/_navigation.scss +150 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/basic/_promo.scss +58 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/basic/_rich-text.scss +11 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/basic/_variables.scss +10 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/basic/main.scss +8 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/main.scss +14 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/_app.scss +103 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/abstracts/_functions.scss +8 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/abstracts/_mixins.scss +121 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/abstracts/_vars.scss +3 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/abstracts/vars/_colors.scss +283 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/abstracts/vars/_fontSizes.scss +16 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/abstracts/vars/_margins.scss +11 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/fonts/_fonts.scss +1 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/fonts/index.scss +1 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/index.scss +3 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/links/_link-button.scss +26 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/links/index.scss +1 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/reset/_inputs.scss +58 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/reset/_links.scss +14 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/reset/_ui-datepicker.scss +7 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/richtext/_richtext-files-icons.scss +86 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/richtext/_richtext.scss +101 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/richtext/index.scss +2 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/typehead/_typehead.scss +95 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/typehead/index.scss +1 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/_component-column-splitter.scss +14 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/_component-container.scss +27 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/_component-image.scss +18 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/_component-navigation.scss +51 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/_component-promo.scss +42 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/_component-richtext-content.scss +19 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/common/_alignment.scss +26 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/common/_boxed.scss +16 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/common/_clearfix.scss +11 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/common/_highlighted.scss +63 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/common/_link-button.scss +16 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/common/_promoted-box.scss +3 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/common/index.scss +6 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/container/_bordered.scss +24 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/container/_title-row-box.scss +66 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/container/index.scss +1 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/image/_image-default-size.scss +6 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/image/index.scss +1 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/image-alignment/_image-left.scss +3 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/image-alignment/_image-right.scss +3 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/index.scss +17 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/layout/_acaindent.scss +5 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/layout/_background.scss +27 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/layout/index.scss +1 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/link-list/_component-link-list.scss +45 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/link-list/_list-vertical.scss +20 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/link-list/index.scss +2 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/navigation/_navigation-fat.scss +58 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/navigation/_navigation-main-horizontal-vertical.scss +176 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/navigation/_navigation-mobile.scss +85 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/navigation/_navigation-sidebar.scss +29 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/navigation/_sitemap-navigation.scss +20 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/navigation/index.scss +5 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/promo/_absolute-bottom-link.scss +8 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/promo/_promo-hero.scss +40 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/promo/_promo-shadow.scss +42 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/promo/index.scss +3 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/rich-text/_rich-text-lists.scss +63 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/rich-text/index.scss +1 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/spacing/_background-colors.scss +14 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/spacing/_indent.scss +13 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/spacing/index.scss +2 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/title/_component-title.scss +30 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/title/index.scss +1 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/main.scss +4 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/variants/index.scss +6 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/variants/link-list/index.scss +0 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/variants/navigation/index.scss +0 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/variants/page-content/index.scss +0 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/variants/promo/index.scss +0 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/variants/rich-text/index.scss +0 -0
- package/dist/templates/angular-xmcloud/src/assets/styles/sass/variants/title/index.scss +0 -0
- package/dist/templates/nextjs/package.json +1 -1
- package/dist/templates/nextjs/scripts/config/plugins/fallback.ts +0 -1
- package/dist/templates/nextjs/scripts/generate-config.ts +8 -1
- package/dist/templates/nextjs/src/lib/page-props-factory/plugins/component-props.ts +2 -1
- package/dist/templates/nextjs-styleguide/scripts/config/plugins/disconnected.ts +1 -0
- package/dist/templates/nextjs-sxa/src/assets/sass/components/_component-image.scss +1 -1
- package/dist/templates/nextjs-sxa/src/components/Container.tsx +6 -14
- package/dist/templates/nextjs-xmcloud/src/lib/page-props-factory/plugins/component-themes.ts +2 -1
- package/dist/templates/nextjs-xmcloud/src/lib/page-props-factory/plugins/preview-mode.ts +2 -1
- package/dist/templates/node-headless-ssr-proxy/src/config.ts +3 -3
- package/dist/templates/node-headless-ssr-proxy/src/httpAgents.ts +2 -2
- package/dist/templates/node-headless-ssr-proxy/src/index.ts +9 -2
- package/dist/templates/node-xmcloud-proxy/.env +7 -1
- package/dist/templates/node-xmcloud-proxy/README.md +1 -1
- package/dist/templates/node-xmcloud-proxy/package.json +3 -2
- package/dist/templates/node-xmcloud-proxy/src/config.ts +9 -3
- package/dist/templates/node-xmcloud-proxy/src/index.ts +48 -5
- package/dist/templates/node-xmcloud-proxy/src/types.ts +10 -42
- package/dist/templates/react/scripts/generate-config.js +10 -3
- package/dist/templates/vue/scripts/generate-config.js +5 -0
- package/package.json +2 -2
- package/dist/templates/angular/src/app/lib/graphql-client-factory.ts +0 -28
- package/dist/templates/angular-xmcloud/src/app/lib/graphql-client-factory.ts +0 -44
|
@@ -7,7 +7,8 @@ import { Plugin, isServerSidePropsContext } from '..';
|
|
|
7
7
|
class ComponentPropsPlugin implements Plugin {
|
|
8
8
|
private componentPropsService: ComponentPropsService;
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
// Make sure to run this plugin last to ensure that the updated layout data is used
|
|
11
|
+
order = 10;
|
|
11
12
|
|
|
12
13
|
constructor() {
|
|
13
14
|
this.componentPropsService = new ComponentPropsService();
|
|
@@ -1,14 +1,9 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
1
|
import {
|
|
3
2
|
ComponentParams,
|
|
4
3
|
ComponentRendering,
|
|
5
4
|
Placeholder,
|
|
6
|
-
useSitecoreContext,
|
|
7
5
|
} from '@sitecore-jss/sitecore-jss-nextjs';
|
|
8
|
-
|
|
9
|
-
const BACKGROUND_REG_EXP = new RegExp(
|
|
10
|
-
/[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/gi
|
|
11
|
-
);
|
|
6
|
+
import React from 'react';
|
|
12
7
|
|
|
13
8
|
interface ComponentProps {
|
|
14
9
|
rendering: ComponentRendering & { params: ComponentParams };
|
|
@@ -16,22 +11,19 @@ interface ComponentProps {
|
|
|
16
11
|
}
|
|
17
12
|
|
|
18
13
|
const DefaultContainer = (props: ComponentProps): JSX.Element => {
|
|
19
|
-
const { sitecoreContext } = useSitecoreContext();
|
|
20
14
|
const containerStyles = props.params && props.params.Styles ? props.params.Styles : '';
|
|
21
15
|
const styles = `${props.params.GridParameters} ${containerStyles}`.trimEnd();
|
|
22
16
|
const phKey = `container-${props.params.DynamicPlaceholderId}`;
|
|
23
17
|
const id = props.params.RenderingIdentifier;
|
|
18
|
+
const mediaUrlPattern = new RegExp(/mediaurl=\"([^"]*)\"/, 'i');
|
|
24
19
|
let backgroundImage = props.params.BackgroundImage as string;
|
|
25
20
|
let backgroundStyle: { [key: string]: string } = {};
|
|
26
21
|
|
|
27
|
-
if (backgroundImage) {
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
?.match(BACKGROUND_REG_EXP)
|
|
31
|
-
?.pop()
|
|
32
|
-
?.replace(/-/gi, '')}`;
|
|
22
|
+
if (backgroundImage && backgroundImage.match(mediaUrlPattern)) {
|
|
23
|
+
const mediaUrl = backgroundImage.match(mediaUrlPattern)?.[1] || '';
|
|
24
|
+
|
|
33
25
|
backgroundStyle = {
|
|
34
|
-
backgroundImage: `url('${
|
|
26
|
+
backgroundImage: `url('${mediaUrl}')`,
|
|
35
27
|
};
|
|
36
28
|
}
|
|
37
29
|
|
package/dist/templates/nextjs-xmcloud/src/lib/page-props-factory/plugins/component-themes.ts
CHANGED
|
@@ -4,7 +4,8 @@ import { Plugin } from '..';
|
|
|
4
4
|
import config from 'temp/config';
|
|
5
5
|
|
|
6
6
|
class ComponentThemesPlugin implements Plugin {
|
|
7
|
-
|
|
7
|
+
// Make sure to run this plugin after the personalization plugin, since it relies on the layout data
|
|
8
|
+
order = 10;
|
|
8
9
|
|
|
9
10
|
async exec(props: SitecorePageProps) {
|
|
10
11
|
// Collect FEAAS, BYOC, SXA component themes
|
|
@@ -20,13 +20,14 @@ class PreviewModePlugin implements Plugin {
|
|
|
20
20
|
|
|
21
21
|
// If we're in Pages preview (editing) Metadata Edit Mode, prefetch the editing data
|
|
22
22
|
if (isEditingMetadataPreviewData(context.previewData)) {
|
|
23
|
-
const { site, itemId, language, version, variantIds } = context.previewData;
|
|
23
|
+
const { site, itemId, language, version, variantIds, layoutKind } = context.previewData;
|
|
24
24
|
|
|
25
25
|
const data = await graphQLEditingService.fetchEditingData({
|
|
26
26
|
siteName: site,
|
|
27
27
|
itemId,
|
|
28
28
|
language,
|
|
29
29
|
version,
|
|
30
|
+
layoutKind,
|
|
30
31
|
});
|
|
31
32
|
|
|
32
33
|
if (!data) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { headlessProxy } from '@sitecore-jss/sitecore-jss-proxy';
|
|
2
2
|
import fs from 'fs';
|
|
3
3
|
import { RestDictionaryService } from '@sitecore-jss/sitecore-jss/i18n';
|
|
4
4
|
import { httpAgentsConfig } from './httpAgents';
|
|
@@ -13,7 +13,7 @@ let siteName = process.env.SITECORE_SITE_NAME || appName;
|
|
|
13
13
|
|
|
14
14
|
const bundlePath = process.env.SITECORE_JSS_SERVER_BUNDLE || `../dist/${appName}/server.bundle`;
|
|
15
15
|
|
|
16
|
-
const serverBundle = require(bundlePath) as ServerBundle;
|
|
16
|
+
const serverBundle = require(bundlePath) as headlessProxy.ServerBundle;
|
|
17
17
|
|
|
18
18
|
httpAgentsConfig.setUpDefaultAgents(serverBundle);
|
|
19
19
|
|
|
@@ -33,7 +33,7 @@ const dictionaryService = new RestDictionaryService({
|
|
|
33
33
|
/**
|
|
34
34
|
* @type {ProxyConfig}
|
|
35
35
|
*/
|
|
36
|
-
export const config: ProxyConfig = {
|
|
36
|
+
export const config: headlessProxy.ProxyConfig = {
|
|
37
37
|
/**
|
|
38
38
|
* The require'd server.bundle.js file from your pre-built JSS app
|
|
39
39
|
*/
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { headlessProxy } from '@sitecore-jss/sitecore-jss-proxy';
|
|
2
2
|
import keepAlive from 'agentkeepalive';
|
|
3
3
|
import http from 'http';
|
|
4
4
|
import https from 'https';
|
|
@@ -14,7 +14,7 @@ const httpAgent = new keepAlive(keepAliveConfig);
|
|
|
14
14
|
const httpsAgent = (new keepAlive.HttpsAgent(keepAliveConfig) as unknown) as https.Agent;
|
|
15
15
|
|
|
16
16
|
interface HttpAgentsConfig {
|
|
17
|
-
setUpDefaultAgents: (serverBundle: ServerBundle) => void;
|
|
17
|
+
setUpDefaultAgents: (serverBundle: headlessProxy.ServerBundle) => void;
|
|
18
18
|
getAgent: (url: string) => http.Agent | https.Agent;
|
|
19
19
|
}
|
|
20
20
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
2
|
import compression from 'compression';
|
|
3
3
|
import 'dotenv/config';
|
|
4
|
-
import
|
|
4
|
+
import { headlessProxy } from '@sitecore-jss/sitecore-jss-proxy';
|
|
5
5
|
import { config } from './config';
|
|
6
6
|
//import { cacheMiddleware } from './cacheMiddleware';
|
|
7
7
|
|
|
@@ -42,7 +42,14 @@ server.use((req, _res, next) => {
|
|
|
42
42
|
});
|
|
43
43
|
|
|
44
44
|
// For any other requests, we render app routes server-side and return them
|
|
45
|
-
server.use(
|
|
45
|
+
server.use(
|
|
46
|
+
'*',
|
|
47
|
+
headlessProxy.middleware(
|
|
48
|
+
config.serverBundle.renderView,
|
|
49
|
+
config,
|
|
50
|
+
config.serverBundle.parseRouteUrl
|
|
51
|
+
)
|
|
52
|
+
);
|
|
46
53
|
|
|
47
54
|
server.listen(port, () => {
|
|
48
55
|
console.log(`server listening on port ${port}!`);
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
#
|
|
1
|
+
# To secure the Sitecore editor endpoint exposed by your proxy app
|
|
2
|
+
# (`/api/editing/render` by default), a secret token is used.
|
|
3
|
+
# The environment variable is used by `editingRouter`
|
|
4
|
+
# We recommend an alphanumeric value of at least 16 characters.
|
|
5
|
+
JSS_EDITING_SECRET=
|
|
6
|
+
|
|
7
|
+
# Your proxy port (default: 3000)
|
|
2
8
|
PROXY_PORT=
|
|
3
9
|
|
|
4
10
|
# Your proxy server bundle path
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-xmcloud-sample",
|
|
3
|
-
"version": "22.
|
|
3
|
+
"version": "22.2.0-canary",
|
|
4
4
|
"description": "Node XM Cloud Proxy sample for running XM Cloud JSS SPA apps",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Sitecore Corporation",
|
|
@@ -10,13 +10,14 @@
|
|
|
10
10
|
"start": "ts-node ./src/index.ts"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
+
"@sitecore-jss/sitecore-jss-proxy": "~22.2.0-canary",
|
|
13
14
|
"compression": "^1.7.4",
|
|
14
15
|
"express": "^4.18.2",
|
|
15
16
|
"dotenv": "^16.0.3",
|
|
16
17
|
"http-proxy-middleware": "^3.0.0"
|
|
17
18
|
},
|
|
18
19
|
"devDependencies": {
|
|
19
|
-
"@sitecore-jss/sitecore-jss": "~22.
|
|
20
|
+
"@sitecore-jss/sitecore-jss": "~22.2.0-canary",
|
|
20
21
|
"@types/compression": "^1.7.2",
|
|
21
22
|
"@types/express": "^4.17.17",
|
|
22
23
|
"ts-node": "^10.9.1",
|
|
@@ -3,9 +3,15 @@ import { Config, ServerBundle } from './types';
|
|
|
3
3
|
/**
|
|
4
4
|
* The server.bundle.js file from your pre-built SPA app.
|
|
5
5
|
*/
|
|
6
|
-
const bundlePath = process.env.PROXY_BUNDLE_PATH ||
|
|
6
|
+
const bundlePath = process.env.PROXY_BUNDLE_PATH || '../dist/server.bundle';
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
let serverBundle: ServerBundle;
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
serverBundle = require(bundlePath);
|
|
12
|
+
} catch (error) {
|
|
13
|
+
throw new Error(`ERROR: The server.bundle.js error. ${error}`);
|
|
14
|
+
}
|
|
9
15
|
|
|
10
16
|
export const config: Config = {
|
|
11
17
|
/**
|
|
@@ -15,5 +21,5 @@ export const config: Config = {
|
|
|
15
21
|
/**
|
|
16
22
|
* Port which will be used when start the proxy
|
|
17
23
|
*/
|
|
18
|
-
port: process.env.PROXY_PORT ||
|
|
24
|
+
port: process.env.PROXY_PORT || 3000,
|
|
19
25
|
};
|
|
@@ -3,6 +3,7 @@ import express, { Response } from 'express';
|
|
|
3
3
|
import compression from 'compression';
|
|
4
4
|
import { createProxyMiddleware } from 'http-proxy-middleware';
|
|
5
5
|
import { debug } from '@sitecore-jss/sitecore-jss';
|
|
6
|
+
import { editingRouter } from '@sitecore-jss/sitecore-jss-proxy';
|
|
6
7
|
import { config } from './config';
|
|
7
8
|
|
|
8
9
|
const server = express();
|
|
@@ -21,12 +22,12 @@ const requiredProperties = [
|
|
|
21
22
|
'renderView',
|
|
22
23
|
'parseRouteUrl',
|
|
23
24
|
'clientFactory',
|
|
24
|
-
'
|
|
25
|
+
'getClientFactoryConfig',
|
|
25
26
|
'defaultLanguage',
|
|
26
27
|
'layoutServiceFactory',
|
|
27
28
|
'dictionaryServiceFactory',
|
|
28
|
-
'
|
|
29
|
-
'
|
|
29
|
+
'components',
|
|
30
|
+
'metadata',
|
|
30
31
|
];
|
|
31
32
|
|
|
32
33
|
const missingProperties = requiredProperties.filter((property) => !config.serverBundle[property]);
|
|
@@ -43,6 +44,31 @@ const layoutService = layoutServiceFactory.create();
|
|
|
43
44
|
|
|
44
45
|
const dictionaryService = dictionaryServiceFactory.create();
|
|
45
46
|
|
|
47
|
+
const clientFactoryConfig = config.serverBundle.getClientFactoryConfig();
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* GraphQL endpoint resolution to meet the requirements of the http-proxy-middleware
|
|
51
|
+
*/
|
|
52
|
+
const graphQLEndpoint = (() => {
|
|
53
|
+
try {
|
|
54
|
+
const graphQLEndpoint = new URL(clientFactoryConfig.endpoint);
|
|
55
|
+
// Browser request path to the proxy. Includes only the pathname.
|
|
56
|
+
const pathname = graphQLEndpoint.pathname;
|
|
57
|
+
// Target URL for the proxy. Can't include the query string.
|
|
58
|
+
const target = `${graphQLEndpoint.protocol}//${graphQLEndpoint.hostname}${pathname}`;
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
target,
|
|
62
|
+
path: pathname,
|
|
63
|
+
};
|
|
64
|
+
} catch (error) {
|
|
65
|
+
throw new Error(
|
|
66
|
+
`ERROR: The serverBundle should export a getClientFactoryConfig function with valid GraphQL endpoint URL returned, current value is ${clientFactoryConfig.endpoint}. ` +
|
|
67
|
+
'Please check your server bundle.'
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
})();
|
|
71
|
+
|
|
46
72
|
/**
|
|
47
73
|
* Parse requested url in order to detect current route and language
|
|
48
74
|
* @param {string} reqRoute requested route
|
|
@@ -94,13 +120,30 @@ server.use(
|
|
|
94
120
|
* Proxy browser GraphQL requests to the Sitecore GraphQL endpoint
|
|
95
121
|
*/
|
|
96
122
|
server.use(
|
|
97
|
-
|
|
123
|
+
graphQLEndpoint.path,
|
|
98
124
|
createProxyMiddleware({
|
|
99
|
-
target:
|
|
125
|
+
target: graphQLEndpoint.target,
|
|
100
126
|
changeOrigin: true,
|
|
101
127
|
})
|
|
102
128
|
);
|
|
103
129
|
|
|
130
|
+
/**
|
|
131
|
+
* Proxy editing requests through the editing router
|
|
132
|
+
*/
|
|
133
|
+
server.use(
|
|
134
|
+
'/api/editing',
|
|
135
|
+
editingRouter({
|
|
136
|
+
config: {
|
|
137
|
+
components: config.serverBundle.components,
|
|
138
|
+
metadata: config.serverBundle.metadata,
|
|
139
|
+
},
|
|
140
|
+
render: {
|
|
141
|
+
clientFactory: config.serverBundle.clientFactory,
|
|
142
|
+
renderView,
|
|
143
|
+
},
|
|
144
|
+
})
|
|
145
|
+
);
|
|
146
|
+
|
|
104
147
|
server.use(async (req, res) => {
|
|
105
148
|
debug.proxy(`performing SSR for ${req.originalUrl}`);
|
|
106
149
|
|
|
@@ -1,55 +1,23 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
GraphQLRequestClientFactory,
|
|
3
|
+
GraphQLRequestClientFactoryConfig,
|
|
4
|
+
} from '@sitecore-jss/sitecore-jss';
|
|
2
5
|
import { DictionaryService } from '@sitecore-jss/sitecore-jss/i18n';
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* The rendered HTML to return to the client
|
|
8
|
-
*/
|
|
9
|
-
html: string;
|
|
10
|
-
/**
|
|
11
|
-
* Set the HTTP status code. If not set, the status code returned from Layout Service is returned.
|
|
12
|
-
*/
|
|
13
|
-
status?: number;
|
|
14
|
-
/**
|
|
15
|
-
* Sets a redirect URL, causing the reply to send a HTTP redirect instead of the HTML content.
|
|
16
|
-
* Note: when using this you must set the status code to 301 or 302.
|
|
17
|
-
*/
|
|
18
|
-
redirect?: string;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
declare type AppRenderer = (
|
|
22
|
-
callback: (error: Error | null, result: ServerResponse | null) => void,
|
|
23
|
-
path: string,
|
|
24
|
-
/**
|
|
25
|
-
* Data returned by Layout Service. If the route does not exist, null.
|
|
26
|
-
*/
|
|
27
|
-
layoutData: LayoutServiceData,
|
|
28
|
-
viewBag: {
|
|
29
|
-
[key: string]: unknown;
|
|
30
|
-
dictionary: { [key: string]: string };
|
|
31
|
-
}
|
|
32
|
-
) => void;
|
|
33
|
-
|
|
34
|
-
declare type RouteUrlParser = (
|
|
35
|
-
url: string
|
|
36
|
-
) => {
|
|
37
|
-
sitecoreRoute?: string;
|
|
38
|
-
lang?: string;
|
|
39
|
-
qsParams?: string;
|
|
40
|
-
};
|
|
6
|
+
import { Metadata } from '@sitecore-jss/sitecore-jss/utils';
|
|
7
|
+
import { LayoutService } from '@sitecore-jss/sitecore-jss/layout';
|
|
8
|
+
import { AppRenderer, RouteUrlParser } from '@sitecore-jss/sitecore-jss-proxy';
|
|
41
9
|
|
|
42
10
|
export interface ServerBundle {
|
|
43
11
|
[key: string]: unknown;
|
|
44
12
|
renderView: AppRenderer;
|
|
45
13
|
parseRouteUrl: RouteUrlParser;
|
|
46
14
|
clientFactory: GraphQLRequestClientFactory;
|
|
47
|
-
|
|
15
|
+
getClientFactoryConfig: () => GraphQLRequestClientFactoryConfig;
|
|
48
16
|
defaultLanguage: string;
|
|
49
17
|
layoutServiceFactory: { create: () => LayoutService };
|
|
50
18
|
dictionaryServiceFactory: { create: () => DictionaryService };
|
|
51
|
-
|
|
52
|
-
|
|
19
|
+
components: string[] | Map<string, unknown>;
|
|
20
|
+
metadata: Metadata;
|
|
53
21
|
}
|
|
54
22
|
|
|
55
23
|
export interface Config {
|
|
@@ -31,6 +31,11 @@ generateConfig();
|
|
|
31
31
|
* NOTE! Any configs returned here will be written into the client-side JS bundle. DO NOT PUT SECRETS HERE.
|
|
32
32
|
*/
|
|
33
33
|
function generateConfig() {
|
|
34
|
+
// Handle undefined values
|
|
35
|
+
Object.keys(defaultConfig).forEach((prop) => {
|
|
36
|
+
defaultConfig[prop] = defaultConfig[prop] || '';
|
|
37
|
+
});
|
|
38
|
+
|
|
34
39
|
try {
|
|
35
40
|
config = jssConfigFactory.create(defaultConfig);
|
|
36
41
|
} catch (error) {
|
|
@@ -50,9 +55,11 @@ const config = {};\n`;
|
|
|
50
55
|
|
|
51
56
|
// Set base configuration values, allowing override with environment variables
|
|
52
57
|
Object.keys(config).forEach(prop => {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
58
|
+
// Handle undefined values
|
|
59
|
+
const value = config[prop] || '';
|
|
60
|
+
configText += `config.${prop} = process.env.REACT_APP_${constantCase(
|
|
61
|
+
prop
|
|
62
|
+
)} || "${value.trim()}";\n`;
|
|
56
63
|
});
|
|
57
64
|
configText += 'module.exports = config;';
|
|
58
65
|
|
|
@@ -33,6 +33,11 @@ module.exports = function generateConfig(configOverrides) {
|
|
|
33
33
|
// and finally config passed in the configOverrides param wins.
|
|
34
34
|
const config = Object.assign(defaultConfig, scjssConfig, packageJson, configOverrides);
|
|
35
35
|
|
|
36
|
+
// Handle undefined values
|
|
37
|
+
Object.keys(config).forEach((prop) => {
|
|
38
|
+
config[prop] = config[prop] || '';
|
|
39
|
+
});
|
|
40
|
+
|
|
36
41
|
// The GraphQL endpoint is an example of making a _computed_ config setting
|
|
37
42
|
// based on other config settings.
|
|
38
43
|
const computedConfig = {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-sitecore-jss",
|
|
3
|
-
"version": "22.2.0-canary.
|
|
3
|
+
"version": "22.2.0-canary.51",
|
|
4
4
|
"description": "Sitecore JSS initializer",
|
|
5
5
|
"bin": "./dist/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -63,5 +63,5 @@
|
|
|
63
63
|
"ts-node": "^10.9.1",
|
|
64
64
|
"typescript": "~4.9.5"
|
|
65
65
|
},
|
|
66
|
-
"gitHead": "
|
|
66
|
+
"gitHead": "103e009bbd767a0c753864fcc28c34eb522ab7f4"
|
|
67
67
|
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
GraphQLRequestClientFactoryConfig,
|
|
3
|
-
GraphQLRequestClient,
|
|
4
|
-
} from '@sitecore-jss/sitecore-jss-angular';
|
|
5
|
-
import { environment as env } from '../../environments/environment';
|
|
6
|
-
|
|
7
|
-
// The GraphQLRequestClientFactory serves as the central hub for executing GraphQL requests within the application
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Creates a new GraphQLRequestClientFactory instance
|
|
11
|
-
* @returns GraphQLRequestClientFactory instance
|
|
12
|
-
*/
|
|
13
|
-
export const createGraphQLClientFactory = () => {
|
|
14
|
-
let clientConfig: GraphQLRequestClientFactoryConfig;
|
|
15
|
-
|
|
16
|
-
if (env.graphQLEndpoint && env.sitecoreApiKey) {
|
|
17
|
-
clientConfig = {
|
|
18
|
-
endpoint: env.graphQLEndpoint,
|
|
19
|
-
apiKey: env.sitecoreApiKey,
|
|
20
|
-
};
|
|
21
|
-
} else {
|
|
22
|
-
throw new Error('Please configure your graphQLEndpoint and sitecoreApiKey.');
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
return GraphQLRequestClient.createClientFactory(clientConfig);
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
export const clientFactory = createGraphQLClientFactory();
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
GraphQLRequestClientFactoryConfig,
|
|
3
|
-
GraphQLRequestClient,
|
|
4
|
-
} from '@sitecore-jss/sitecore-jss-angular';
|
|
5
|
-
import { environment as env } from '../../environments/environment';
|
|
6
|
-
|
|
7
|
-
// The GraphQLRequestClientFactory serves as the central hub for executing GraphQL requests within the application
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Creates a new GraphQLRequestClientFactory instance
|
|
11
|
-
* @returns GraphQLRequestClientFactory instance
|
|
12
|
-
*/
|
|
13
|
-
export const createGraphQLClientFactory = () => {
|
|
14
|
-
let clientConfig: GraphQLRequestClientFactoryConfig;
|
|
15
|
-
|
|
16
|
-
// If we are in a production environment we are going to use Node XM Cloud proxy
|
|
17
|
-
if (env.production === 'true') {
|
|
18
|
-
if (env.proxyHost && env.sitecoreApiKey && env.graphQLEndpoint) {
|
|
19
|
-
// Server side requests should go directly to the Sitecore, browser requests should go through the proxy.
|
|
20
|
-
clientConfig = {
|
|
21
|
-
endpoint:
|
|
22
|
-
typeof window === 'undefined'
|
|
23
|
-
? env.graphQLEndpoint
|
|
24
|
-
: `${env.proxyHost}${env.graphQLEndpointPath}`,
|
|
25
|
-
apiKey: env.sitecoreApiKey,
|
|
26
|
-
};
|
|
27
|
-
} else {
|
|
28
|
-
throw new Error('Please configure your proxyHost, sitecoreApiKey, graphQLEndpoint.');
|
|
29
|
-
}
|
|
30
|
-
} else {
|
|
31
|
-
if (env.graphQLEndpoint && env.sitecoreApiKey) {
|
|
32
|
-
clientConfig = {
|
|
33
|
-
endpoint: env.graphQLEndpoint,
|
|
34
|
-
apiKey: env.sitecoreApiKey,
|
|
35
|
-
};
|
|
36
|
-
} else {
|
|
37
|
-
throw new Error('Please configure your graphQLEndpoint and sitecoreApiKey.');
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
return GraphQLRequestClient.createClientFactory(clientConfig);
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
export const clientFactory = createGraphQLClientFactory();
|