create-sitecore-jss 22.2.0-canary.5 → 22.2.0-canary.50

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 (195) hide show
  1. package/dist/bin.js +17 -42
  2. package/dist/common/index.js +5 -3
  3. package/dist/common/processes/install.js +1 -1
  4. package/dist/common/processes/next.js +6 -3
  5. package/dist/common/processes/transform.js +19 -19
  6. package/dist/common/prompts/base.js +0 -25
  7. package/dist/common/prompts/proxy.js +35 -0
  8. package/dist/common/prompts/sxp.js +34 -0
  9. package/dist/common/utils/helpers.js +29 -19
  10. package/dist/init-runner.js +6 -3
  11. package/dist/initializers/angular/index.js +0 -3
  12. package/dist/initializers/angular/prompts.js +6 -6
  13. package/dist/initializers/angular-sxp/index.js +8 -2
  14. package/dist/initializers/angular-xmcloud/index.js +28 -4
  15. package/dist/initializers/nextjs/index.js +2 -2
  16. package/dist/initializers/nextjs/prompts.js +2 -0
  17. package/dist/initializers/nextjs/remove-dev-dependencies.js +2 -2
  18. package/dist/initializers/nextjs-multisite/index.js +1 -1
  19. package/dist/initializers/nextjs-styleguide/index.js +1 -1
  20. package/dist/initializers/nextjs-styleguide-tracking/index.js +1 -1
  21. package/dist/initializers/nextjs-sxa/index.js +1 -1
  22. package/dist/initializers/nextjs-xmcloud/index.js +1 -1
  23. package/dist/initializers/node-xmcloud-proxy/index.js +2 -1
  24. package/dist/initializers/react/index.js +3 -3
  25. package/dist/initializers/react/prompts.js +1 -1
  26. package/dist/initializers/react-native/prompts.js +1 -0
  27. package/dist/initializers/vue/prompts.js +1 -1
  28. package/dist/templates/angular/.env +4 -5
  29. package/dist/templates/angular/.eslintrc +1 -0
  30. package/dist/templates/angular/package.json +0 -2
  31. package/dist/templates/angular/scripts/config/plugins/fallback.ts +0 -1
  32. package/dist/templates/angular/scripts/generate-component-factory.ts +8 -0
  33. package/dist/templates/angular/scripts/generate-config.ts +25 -6
  34. package/dist/templates/angular/scripts/update-graphql-fragment-data.ts +21 -30
  35. package/dist/templates/angular/server.bundle.ts +3 -23
  36. package/dist/templates/angular/server.exports.ts +13 -0
  37. package/dist/templates/angular/src/app/JssState.ts +2 -9
  38. package/dist/templates/angular/src/app/app.module.ts +1 -1
  39. package/dist/templates/angular/src/app/jss-context.server-side.service.ts +4 -2
  40. package/dist/templates/angular/src/app/jss-context.service.ts +14 -11
  41. package/dist/templates/angular/src/app/jss-graphql.service.ts +7 -7
  42. package/dist/templates/angular/src/app/layout/jss-layout.service.ts +2 -2
  43. package/dist/templates/angular/src/app/lib/dictionary-service-factory.ts +4 -1
  44. package/dist/templates/angular/src/app/lib/graphql-client-factory/config.ts +21 -0
  45. package/dist/templates/angular/src/app/lib/graphql-client-factory/index.ts +16 -0
  46. package/dist/templates/angular/src/app/lib/layout-service-factory.ts +1 -1
  47. package/dist/templates/angular/src/app/routing/layout/layout.component.ts +10 -9
  48. package/dist/templates/angular-sxp/.env +2 -0
  49. package/dist/templates/angular-sxp/scripts/config/plugins/disconnected.ts +4 -2
  50. package/dist/templates/angular-sxp/src/app/components/graph-ql-layout/graph-ql-layout.component.ts +1 -1
  51. package/dist/templates/angular-xmcloud/.env +7 -1
  52. package/dist/templates/angular-xmcloud/angular.json +33 -0
  53. package/dist/templates/angular-xmcloud/package.json +15 -10
  54. package/dist/templates/angular-xmcloud/scripts/bootstrap.ts +28 -0
  55. package/dist/templates/angular-xmcloud/scripts/config/plugins/xmcloud.ts +16 -0
  56. package/dist/templates/angular-xmcloud/scripts/generate-metadata.ts +25 -0
  57. package/dist/templates/angular-xmcloud/server.exports.ts +24 -0
  58. package/dist/templates/angular-xmcloud/src/app/components/app-components.shared.module.ts +21 -0
  59. package/dist/templates/angular-xmcloud/src/app/components/column-splitter/column-splitter.component.html +5 -0
  60. package/dist/templates/angular-xmcloud/src/app/components/column-splitter/column-splitter.component.ts +40 -0
  61. package/dist/templates/angular-xmcloud/src/app/components/container/container.component.html +14 -0
  62. package/dist/templates/angular-xmcloud/src/app/components/container/container.component.ts +30 -0
  63. package/dist/templates/angular-xmcloud/src/app/components/image/image.component.html +36 -0
  64. package/dist/templates/angular-xmcloud/src/app/components/image/image.component.ts +67 -0
  65. package/dist/templates/angular-xmcloud/src/app/components/link-list/link-list.component.html +15 -0
  66. package/dist/templates/angular-xmcloud/src/app/components/link-list/link-list.component.ts +41 -0
  67. package/dist/templates/angular-xmcloud/src/app/components/navigation/navigation-item.component.html +23 -0
  68. package/dist/templates/angular-xmcloud/src/app/components/navigation/navigation-item.component.ts +65 -0
  69. package/dist/templates/angular-xmcloud/src/app/components/navigation/navigation.component.html +21 -0
  70. package/dist/templates/angular-xmcloud/src/app/components/navigation/navigation.component.ts +49 -0
  71. package/dist/templates/angular-xmcloud/src/app/components/page-content/page-content.component.html +5 -0
  72. package/dist/templates/angular-xmcloud/src/app/components/page-content/page-content.component.ts +39 -0
  73. package/dist/templates/angular-xmcloud/src/app/components/partial-design-dynamic-placeholder/partial-design-dynamic-placeholder.component.html +1 -0
  74. package/dist/templates/angular-xmcloud/src/app/components/partial-design-dynamic-placeholder/partial-design-dynamic-placeholder.component.ts +15 -0
  75. package/dist/templates/angular-xmcloud/src/app/components/promo/promo.component.html +21 -0
  76. package/dist/templates/angular-xmcloud/src/app/components/promo/promo.component.ts +13 -0
  77. package/dist/templates/angular-xmcloud/src/app/components/richtext/richtext.component.html +7 -12
  78. package/dist/templates/angular-xmcloud/src/app/components/richtext/richtext.component.ts +6 -1
  79. package/dist/templates/angular-xmcloud/src/app/components/row-splitter/row-splitter.component.html +11 -0
  80. package/dist/templates/angular-xmcloud/src/app/components/row-splitter/row-splitter.component.ts +35 -0
  81. package/dist/templates/angular-xmcloud/src/app/components/sxa.component.ts +4 -4
  82. package/dist/templates/angular-xmcloud/src/app/components/title/title.component.html +10 -0
  83. package/dist/templates/angular-xmcloud/src/app/components/title/title.component.ts +56 -0
  84. package/dist/templates/angular-xmcloud/src/app/jss-link.service.ts +55 -0
  85. package/dist/templates/angular-xmcloud/src/app/lib/config.ts +2 -0
  86. package/dist/templates/angular-xmcloud/src/app/lib/graphql-client-factory/config.ts +58 -0
  87. package/dist/templates/angular-xmcloud/src/app/routing/layout/layout.component.html +38 -0
  88. package/dist/templates/angular-xmcloud/src/app/routing/layout/layout.component.ts +104 -0
  89. package/dist/templates/angular-xmcloud/src/app/routing/scripts/scripts.component.html +3 -0
  90. package/dist/templates/angular-xmcloud/src/app/routing/scripts/scripts.module.ts +10 -0
  91. package/dist/templates/angular-xmcloud/src/assets/styles/basic/_component.scss +48 -0
  92. package/dist/templates/angular-xmcloud/src/assets/styles/basic/_container.scss +64 -0
  93. package/dist/templates/angular-xmcloud/src/assets/styles/basic/_fonts.scss +3 -0
  94. package/dist/templates/angular-xmcloud/src/assets/styles/basic/_footer.scss +31 -0
  95. package/dist/templates/angular-xmcloud/src/assets/styles/basic/_header.scss +51 -0
  96. package/dist/templates/angular-xmcloud/src/assets/styles/basic/_navigation.scss +150 -0
  97. package/dist/templates/angular-xmcloud/src/assets/styles/basic/_promo.scss +58 -0
  98. package/dist/templates/angular-xmcloud/src/assets/styles/basic/_rich-text.scss +11 -0
  99. package/dist/templates/angular-xmcloud/src/assets/styles/basic/_variables.scss +10 -0
  100. package/dist/templates/angular-xmcloud/src/assets/styles/basic/main.scss +8 -0
  101. package/dist/templates/angular-xmcloud/src/assets/styles/main.scss +14 -0
  102. package/dist/templates/angular-xmcloud/src/assets/styles/sass/_app.scss +103 -0
  103. package/dist/templates/angular-xmcloud/src/assets/styles/sass/abstracts/_functions.scss +8 -0
  104. package/dist/templates/angular-xmcloud/src/assets/styles/sass/abstracts/_mixins.scss +121 -0
  105. package/dist/templates/angular-xmcloud/src/assets/styles/sass/abstracts/_vars.scss +3 -0
  106. package/dist/templates/angular-xmcloud/src/assets/styles/sass/abstracts/vars/_colors.scss +283 -0
  107. package/dist/templates/angular-xmcloud/src/assets/styles/sass/abstracts/vars/_fontSizes.scss +16 -0
  108. package/dist/templates/angular-xmcloud/src/assets/styles/sass/abstracts/vars/_margins.scss +11 -0
  109. package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/fonts/_fonts.scss +1 -0
  110. package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/fonts/index.scss +1 -0
  111. package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/index.scss +3 -0
  112. package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/links/_link-button.scss +26 -0
  113. package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/links/index.scss +1 -0
  114. package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/reset/_inputs.scss +58 -0
  115. package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/reset/_links.scss +14 -0
  116. package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/reset/_ui-datepicker.scss +7 -0
  117. package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/richtext/_richtext-files-icons.scss +86 -0
  118. package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/richtext/_richtext.scss +101 -0
  119. package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/richtext/index.scss +2 -0
  120. package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/typehead/_typehead.scss +95 -0
  121. package/dist/templates/angular-xmcloud/src/assets/styles/sass/base/typehead/index.scss +1 -0
  122. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/_component-column-splitter.scss +14 -0
  123. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/_component-container.scss +27 -0
  124. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/_component-image.scss +18 -0
  125. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/_component-navigation.scss +51 -0
  126. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/_component-promo.scss +42 -0
  127. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/_component-richtext-content.scss +19 -0
  128. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/common/_alignment.scss +26 -0
  129. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/common/_boxed.scss +16 -0
  130. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/common/_clearfix.scss +11 -0
  131. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/common/_highlighted.scss +63 -0
  132. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/common/_link-button.scss +16 -0
  133. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/common/_promoted-box.scss +3 -0
  134. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/common/index.scss +6 -0
  135. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/container/_bordered.scss +24 -0
  136. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/container/_title-row-box.scss +66 -0
  137. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/container/index.scss +1 -0
  138. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/image/_image-default-size.scss +6 -0
  139. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/image/index.scss +1 -0
  140. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/image-alignment/_image-left.scss +3 -0
  141. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/image-alignment/_image-right.scss +3 -0
  142. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/index.scss +17 -0
  143. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/layout/_acaindent.scss +5 -0
  144. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/layout/_background.scss +27 -0
  145. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/layout/index.scss +1 -0
  146. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/link-list/_component-link-list.scss +45 -0
  147. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/link-list/_list-vertical.scss +20 -0
  148. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/link-list/index.scss +2 -0
  149. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/navigation/_navigation-fat.scss +58 -0
  150. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/navigation/_navigation-main-horizontal-vertical.scss +176 -0
  151. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/navigation/_navigation-mobile.scss +85 -0
  152. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/navigation/_navigation-sidebar.scss +29 -0
  153. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/navigation/_sitemap-navigation.scss +20 -0
  154. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/navigation/index.scss +5 -0
  155. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/promo/_absolute-bottom-link.scss +8 -0
  156. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/promo/_promo-hero.scss +40 -0
  157. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/promo/_promo-shadow.scss +42 -0
  158. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/promo/index.scss +3 -0
  159. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/rich-text/_rich-text-lists.scss +63 -0
  160. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/rich-text/index.scss +1 -0
  161. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/spacing/_background-colors.scss +14 -0
  162. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/spacing/_indent.scss +13 -0
  163. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/spacing/index.scss +2 -0
  164. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/title/_component-title.scss +30 -0
  165. package/dist/templates/angular-xmcloud/src/assets/styles/sass/components/title/index.scss +1 -0
  166. package/dist/templates/angular-xmcloud/src/assets/styles/sass/main.scss +4 -0
  167. package/dist/templates/angular-xmcloud/src/assets/styles/sass/variants/index.scss +6 -0
  168. package/dist/templates/angular-xmcloud/src/assets/styles/sass/variants/link-list/index.scss +0 -0
  169. package/dist/templates/angular-xmcloud/src/assets/styles/sass/variants/navigation/index.scss +0 -0
  170. package/dist/templates/angular-xmcloud/src/assets/styles/sass/variants/page-content/index.scss +0 -0
  171. package/dist/templates/angular-xmcloud/src/assets/styles/sass/variants/promo/index.scss +0 -0
  172. package/dist/templates/angular-xmcloud/src/assets/styles/sass/variants/rich-text/index.scss +0 -0
  173. package/dist/templates/angular-xmcloud/src/assets/styles/sass/variants/title/index.scss +0 -0
  174. package/dist/templates/nextjs/package.json +1 -1
  175. package/dist/templates/nextjs/scripts/config/plugins/fallback.ts +0 -1
  176. package/dist/templates/nextjs/scripts/generate-config.ts +8 -1
  177. package/dist/templates/nextjs/src/lib/page-props-factory/plugins/component-props.ts +2 -1
  178. package/dist/templates/nextjs-styleguide/scripts/config/plugins/disconnected.ts +1 -0
  179. package/dist/templates/nextjs-sxa/src/assets/sass/components/_component-image.scss +1 -1
  180. package/dist/templates/nextjs-sxa/src/components/Container.tsx +6 -14
  181. package/dist/templates/nextjs-xmcloud/src/lib/page-props-factory/plugins/component-themes.ts +2 -1
  182. package/dist/templates/nextjs-xmcloud/src/lib/page-props-factory/plugins/preview-mode.ts +2 -1
  183. package/dist/templates/node-headless-ssr-proxy/src/config.ts +3 -3
  184. package/dist/templates/node-headless-ssr-proxy/src/httpAgents.ts +2 -2
  185. package/dist/templates/node-headless-ssr-proxy/src/index.ts +9 -2
  186. package/dist/templates/node-xmcloud-proxy/.env +6 -0
  187. package/dist/templates/node-xmcloud-proxy/package.json +3 -2
  188. package/dist/templates/node-xmcloud-proxy/src/config.ts +8 -2
  189. package/dist/templates/node-xmcloud-proxy/src/index.ts +48 -5
  190. package/dist/templates/node-xmcloud-proxy/src/types.ts +10 -42
  191. package/dist/templates/react/scripts/generate-config.js +10 -3
  192. package/dist/templates/vue/scripts/generate-config.js +5 -0
  193. package/package.json +2 -2
  194. package/dist/templates/angular/src/app/lib/graphql-client-factory.ts +0 -28
  195. package/dist/templates/angular-xmcloud/src/app/lib/graphql-client-factory.ts +0 -44
@@ -9,12 +9,12 @@ import { JssMetaService } from '../../jss-meta.service';
9
9
  enum LayoutState {
10
10
  Layout,
11
11
  NotFound,
12
- Error
12
+ Error,
13
13
  }
14
14
 
15
15
  interface RouteFields {
16
16
  [name: string]: unknown;
17
- pageTitle: Field<string>;
17
+ pageTitle?: Field<string>;
18
18
  }
19
19
 
20
20
  @Component({
@@ -28,14 +28,11 @@ export class LayoutComponent implements OnInit, OnDestroy {
28
28
  subscription: Subscription;
29
29
  errorContextData: LayoutServiceContextData;
30
30
 
31
- constructor(
32
- private activatedRoute: ActivatedRoute,
33
- private readonly meta: JssMetaService,
34
- ) { }
31
+ constructor(private activatedRoute: ActivatedRoute, private readonly meta: JssMetaService) {}
35
32
 
36
33
  ngOnInit() {
37
34
  // route data is populated by the JssRouteResolver
38
- this.subscription = this.activatedRoute.data.subscribe((data: { jssState: JssState<RouteFields> }) => {
35
+ this.subscription = this.activatedRoute.data.subscribe((data: { jssState: JssState }) => {
39
36
  if (!data.jssState) {
40
37
  this.state = LayoutState.NotFound;
41
38
  return;
@@ -48,13 +45,17 @@ export class LayoutComponent implements OnInit, OnDestroy {
48
45
  }
49
46
 
50
47
  if (data.jssState.routeFetchError) {
51
- if (data.jssState.routeFetchError.status >= 400 && data.jssState.routeFetchError.status < 500) {
48
+ if (
49
+ data.jssState.routeFetchError.status >= 400 &&
50
+ data.jssState.routeFetchError.status < 500
51
+ ) {
52
52
  this.state = LayoutState.NotFound;
53
53
  } else {
54
54
  this.state = LayoutState.Error;
55
55
  }
56
56
 
57
- this.errorContextData = data.jssState.routeFetchError.data && data.jssState.routeFetchError.data.sitecore;
57
+ this.errorContextData =
58
+ data.jssState.routeFetchError.data && data.jssState.routeFetchError.data.sitecore;
58
59
  }
59
60
  });
60
61
  }
@@ -0,0 +1,2 @@
1
+ # The way in which layout and dictionary data is fetched from Sitecore
2
+ FETCH_WITH=<%- fetchWith %>
@@ -8,7 +8,7 @@ const chalk = require('chalk');
8
8
  */
9
9
  class DisconnectedPlugin implements ConfigPlugin {
10
10
  // should come before other plugins
11
- order = 0;
11
+ order = 2;
12
12
 
13
13
  async exec(config: JssConfig) {
14
14
  const disconnected = process.env.JSS_MODE === constants.JSS_MODE.DISCONNECTED;
@@ -20,7 +20,9 @@ class DisconnectedPlugin implements ConfigPlugin {
20
20
  );
21
21
  }
22
22
 
23
- return config;
23
+ return Object.assign({}, config, {
24
+ sitecoreApiKey: config.sitecoreApiKey || 'no-api-key-set',
25
+ });
24
26
  }
25
27
  }
26
28
 
@@ -13,6 +13,6 @@ export class GraphQLLayoutComponent implements OnInit {
13
13
  constructor(private contextService: JssContextService) { }
14
14
 
15
15
  ngOnInit() {
16
- this.disconnectedMode = this.contextService.state.value.sitecore.route.itemId === 'available-in-connected-mode';
16
+ this.disconnectedMode = this.contextService.stateValue.sitecore.route.itemId === 'available-in-connected-mode';
17
17
  }
18
18
  }
@@ -1,8 +1,14 @@
1
1
 
2
+ # ========== Sitecore Edge Platform ===========
3
+
4
+ # Your unified Sitecore Edge Context Id.
5
+ # This will be used over any Sitecore Preview / Delivery Edge variables (above).
6
+ SITECORE_EDGE_CONTEXT_ID=
7
+
2
8
  # ========== XM Cloud Proxy ===========
3
9
 
4
10
  # Your XM Cloud Proxy hostname is needed to build the app and execute the client-side requests against the proxy server.
5
11
  PROXY_HOST=http://localhost:3001
6
12
 
7
13
  # Your XM Cloud Proxy server path is needed to build the app. The build output will be copied to the proxy server path.
8
- PROXY_BUILD_PATH=<%- proxyAppDestination %>/dist
14
+ PROXY_BUILD_PATH=<%- locals.relativeProxyAppDestination.replace(/\\/g, '\\\\') %>dist
@@ -0,0 +1,33 @@
1
+ {
2
+ "projects": {
3
+ "<%- appName %>": {
4
+ "architect": {
5
+ "build": {
6
+ "options": {
7
+ "styles": [
8
+ "src/styles.css",
9
+ "src/assets/styles/main.scss"
10
+ ],
11
+ "stylePreprocessorOptions": {
12
+ "includePaths": ["src/assets/styles", "node_modules"]
13
+ }
14
+ }
15
+ },
16
+ "test": {
17
+ "options": {
18
+ "styles": ["src/styles.css", "src/assets/styles/main.scss"],
19
+ "stylePreprocessorOptions": {
20
+ "includePaths": ["src/assets/styles", "node_modules"]
21
+ }
22
+ }
23
+ }
24
+ }
25
+ }
26
+ },
27
+ "schematics": {
28
+ "@schematics/angular:component": {
29
+ "prefix": "app",
30
+ "style": "scss"
31
+ }
32
+ }
33
+ }
@@ -1,10 +1,15 @@
1
- {
2
- "config": {
3
- "sitecoreDistPath": "/dist"
4
- },
5
- "scripts": {
6
- "postbuild:server": "npm-run-all --serial prepare:build prepare:proxy-build",
7
- "prepare:build": "move-cli ./dist/main.js ./dist/server.bundle.js",
8
- "prepare:proxy-build": "ts-node --project src/tsconfig.webpack-server.json ./scripts/proxy-build.ts"
9
- }
10
- }
1
+ {
2
+ "config": {
3
+ "sitecoreDistPath": "/dist"
4
+ },
5
+ "scripts": {
6
+ "postbuild:server": "npm-run-all --serial prepare:build prepare:proxy-build",
7
+ "prepare:build": "move-cli ./dist/main.js ./dist/server.bundle.js",
8
+ "prepare:proxy-build": "ts-node --project src/tsconfig.webpack-server.json ./scripts/proxy-build.ts"
9
+ },
10
+ "dependencies": {
11
+ "font-awesome": "^4.7.0",
12
+ "sass": "^1.52.3",
13
+ "sass-alias": "^1.0.5"
14
+ }
15
+ }
@@ -0,0 +1,28 @@
1
+ import 'dotenv/config';
2
+
3
+ /*
4
+ BOOTSTRAPPING
5
+ The bootstrap process runs before build, and generates TS that needs to be
6
+ included into the build - specifically, the component name to component mapping,
7
+ and the global config module.
8
+ */
9
+
10
+ /*
11
+ PLUGINS GENERATION
12
+ */
13
+ require('./generate-plugins');
14
+
15
+ /*
16
+ CONFIG GENERATION
17
+ */
18
+ require('./generate-config');
19
+
20
+ /*
21
+ COMPONENT FACTORY GENERATION
22
+ */
23
+ require('./generate-component-factory');
24
+
25
+ /*
26
+ METADATA GENERATION
27
+ */
28
+ require('./generate-metadata');
@@ -1,6 +1,7 @@
1
1
  import { JssConfig } from 'lib/config';
2
2
  import { ConfigPlugin } from '..';
3
3
  import { constantCase } from 'constant-case';
4
+ import chalk from 'chalk';
4
5
 
5
6
  /**
6
7
  * This plugin will set XM Cloud related config props.
@@ -13,9 +14,24 @@ class XMCloudPlugin implements ConfigPlugin {
13
14
  const proxyBuildPath = process.env[`${constantCase('proxyBuildPath')}`]?.replace(/\/$/, '');
14
15
  const proxyHost = process.env[`${constantCase('proxyHost')}`];
15
16
 
17
+ const sitecoreEdgeUrl =
18
+ process.env[`${constantCase('sitecoreEdgeUrl')}`]?.replace(/\/$/, '') ||
19
+ 'https://edge-platform.sitecorecloud.io';
20
+ const sitecoreEdgeContextId = process.env[`${constantCase('sitecoreEdgeContextId')}`];
21
+
22
+ if (config.sitecoreApiKey && sitecoreEdgeContextId) {
23
+ console.log(
24
+ chalk.yellow(
25
+ "You have configured both 'sitecoreApiKey' and 'sitecoreEdgeContextId' values. The 'sitecoreEdgeContextId' is used instead."
26
+ )
27
+ );
28
+ }
29
+
16
30
  return Object.assign({}, config, {
17
31
  proxyBuildPath,
18
32
  proxyHost,
33
+ sitecoreEdgeUrl,
34
+ sitecoreEdgeContextId,
19
35
  });
20
36
  }
21
37
  }
@@ -0,0 +1,25 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { Metadata, getMetadata } from '@sitecore-jss/sitecore-jss-dev-tools';
4
+
5
+ /*
6
+ METADATA GENERATION
7
+ Generates the /src/environments/metadata.json file which contains application
8
+ configuration metadata that is used for Sitecore XM Cloud integration.
9
+ */
10
+ generateMetadata();
11
+
12
+ function generateMetadata(): void {
13
+ const metadata: Metadata = getMetadata();
14
+ writeMetadata(metadata);
15
+ }
16
+
17
+ /**
18
+ * Writes the metadata object to disk.
19
+ * @param {Metadata} metadata metadata to write.
20
+ */
21
+ function writeMetadata(metadata: Metadata): void {
22
+ const filePath = path.resolve('src/environments/metadata.json');
23
+ console.log(`Writing metadata to ${filePath}`);
24
+ fs.writeFileSync(filePath, JSON.stringify(metadata, null, 2), { encoding: 'utf8' });
25
+ }
@@ -0,0 +1,24 @@
1
+ import clientFactory from './src/app/lib/graphql-client-factory';
2
+ import { getGraphQLClientFactoryConfig } from './src/app/lib/graphql-client-factory/config';
3
+ import { dictionaryServiceFactory } from './src/app/lib/dictionary-service-factory';
4
+ import { layoutServiceFactory } from './src/app/lib/layout-service-factory';
5
+ import { environment } from './src/environments/environment';
6
+ import { components } from './src/app/components/app-components.module';
7
+ import metadata from './src/environments/metadata.json';
8
+
9
+ /**
10
+ * Define the required configuration values to be exported from the server.bundle.ts.
11
+ */
12
+
13
+ const defaultLanguage = environment.defaultLanguage;
14
+ const getClientFactoryConfig = getGraphQLClientFactoryConfig;
15
+
16
+ export {
17
+ clientFactory,
18
+ getClientFactoryConfig,
19
+ dictionaryServiceFactory,
20
+ layoutServiceFactory,
21
+ defaultLanguage,
22
+ components,
23
+ metadata,
24
+ };
@@ -0,0 +1,21 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { TranslateModule } from '@ngx-translate/core';
5
+ import { RouterModule } from '@angular/router';
6
+ import { JssModule } from '@sitecore-jss/sitecore-jss-angular';
7
+ import { NavigationItemComponent } from './navigation/navigation-item.component';
8
+
9
+ /*
10
+ This module is imported by the generated app-components.module.ts.
11
+ You can use this module to provide shared Angular components that are not
12
+ JSS components, etc to the generated module.
13
+
14
+ Don't want code generation? See ./.gitignore for instructions to turn it off.
15
+ */
16
+ @NgModule({
17
+ imports: [CommonModule, TranslateModule, RouterModule, JssModule, FormsModule],
18
+ exports: [CommonModule, TranslateModule, RouterModule, FormsModule, NavigationItemComponent],
19
+ declarations: [NavigationItemComponent],
20
+ })
21
+ export class AppComponentsSharedModule {}
@@ -0,0 +1,5 @@
1
+ <div *ngFor="let ph of enabledPlaceholders" [ngClass]="getColumnClass(+ph - 1)">
2
+ <div class="row">
3
+ <sc-placeholder [name]="getPlaceholderName(ph)" [rendering]="rendering"> </sc-placeholder>
4
+ </div>
5
+ </div>
@@ -0,0 +1,40 @@
1
+ import { Component } from '@angular/core';
2
+ import { SxaComponent } from '../sxa.component';
3
+
4
+ @Component({
5
+ selector: 'app-column-splitter',
6
+ templateUrl: './column-splitter.component.html',
7
+ host: {
8
+ 'class': 'row component column-splitter',
9
+ '[class]': 'columnSplitterStyles',
10
+ '[id]' : 'id'
11
+ }
12
+ })
13
+ export class ColumnSplitterComponent extends SxaComponent {
14
+ get columnSplitterStyles(): string {
15
+ return `${this.rendering.params.GridParameters ?? ''} ${this.rendering.params.Styles ??
16
+ ''}`.trimEnd();
17
+ }
18
+
19
+ get columnWidths(): string[] {
20
+ return Array.from({ length: 8 }, (_, i) => this.rendering.params[`ColumnWidth${i + 1}`]);
21
+ }
22
+
23
+ get columnStyles(): string[] {
24
+ return Array.from({ length: 8 }, (_, i) => this.rendering.params[`Styles${i + 1}`]);
25
+ }
26
+
27
+ get enabledPlaceholders(): string[] {
28
+ return this.rendering.params.EnabledPlaceholders.split(',');
29
+ }
30
+
31
+ getColumnClass(index: number): string {
32
+ const widthClass = this.columnWidths[index] || '';
33
+ const styleClass = this.columnStyles[index] || '';
34
+ return `${widthClass} ${styleClass}`.trim();
35
+ }
36
+
37
+ getPlaceholderName(ph: string): string {
38
+ return `column-${ph}-{*}`;
39
+ }
40
+ }
@@ -0,0 +1,14 @@
1
+ <div class="container-wrapper" *ngIf="wrapped; else default">
2
+ <ng-container *ngTemplateOutlet="default"></ng-container>
3
+ </div>
4
+ <ng-template #default>
5
+ <div class="component container-default {{ styles }}" [attr.id]="id">
6
+ <div class="component-content" [ngStyle]="backgroundStyle">
7
+ <sc-placeholder
8
+ [name]="placeholderName"
9
+ [rendering]="rendering"
10
+ class="row">
11
+ </sc-placeholder>
12
+ </div>
13
+ </div>
14
+ </ng-template>
@@ -0,0 +1,30 @@
1
+ import { Component, OnInit } from '@angular/core';
2
+ import { SxaComponent } from '../sxa.component';
3
+
4
+ @Component({
5
+ selector: 'app-container',
6
+ templateUrl: './container.component.html',
7
+ })
8
+ export class ContainerComponent extends SxaComponent implements OnInit {
9
+ placeholderName: string;
10
+ wrapped: boolean;
11
+
12
+ override ngOnInit() {
13
+ super.ngOnInit();
14
+
15
+ this.placeholderName = `container-${this.rendering.params?.DynamicPlaceholderId}`;
16
+ this.wrapped = this.rendering.params?.Styles?.split(' ').includes('container');
17
+ }
18
+
19
+ get backgroundStyle() {
20
+ const backgroundImage = this.rendering.params?.BackgroundImage;
21
+ const mediaUrlPattern = new RegExp(/mediaurl=\"([^"]*)\"/, 'i');
22
+ if (!backgroundImage || !backgroundImage.match(mediaUrlPattern)) {
23
+ return {};
24
+ }
25
+ const mediaUrl = backgroundImage.match(mediaUrlPattern)[1];
26
+ return {
27
+ backgroundImage: `url('${mediaUrl}')`,
28
+ };
29
+ }
30
+ }
@@ -0,0 +1,36 @@
1
+ <ng-container [ngTemplateOutlet]="variant"></ng-container>
2
+
3
+ <ng-template #default>
4
+ <div class="component image {{ styles }}" [attr.id]="id" *ngIf="rendering.fields; else empty">
5
+ <div class="component-content">
6
+ <ng-container *ngIf="isEditing || !rendering.fields.TargetUrl?.value?.href; else withLink">
7
+ <img *scImage="rendering.fields.Image" />
8
+ </ng-container>
9
+ <span class="image-caption field-imagecaption" *scText="rendering.fields.ImageCaption"></span>
10
+ </div>
11
+ </div>
12
+ </ng-template>
13
+
14
+ <ng-template #banner>
15
+ <div class="component hero-banner {{ styles }} {{ classHeroBannerEmpty }}" [attr.id]="id">
16
+ <div class="component-content sc-sxa-image-hero-banner" [ngStyle]="backgroundStyle">
17
+ <ng-container *ngIf="isEditing">
18
+ <img *scImage="modifyImageProps" />
19
+ </ng-container>
20
+ </div>
21
+ </div>
22
+ </ng-template>
23
+
24
+ <ng-template #withLink>
25
+ <a *scLink="rendering.fields.TargetUrl">
26
+ <img *scImage="rendering.fields.Image" />
27
+ </a>
28
+ </ng-template>
29
+
30
+ <ng-template #empty>
31
+ <div class="component image {{ styles }}">
32
+ <div class="component-content">
33
+ <span class="is-empty-hint">Image</span>
34
+ </div>
35
+ </div>
36
+ </ng-template>
@@ -0,0 +1,67 @@
1
+ import { Component, OnInit, OnDestroy, ViewChild, TemplateRef } from '@angular/core';
2
+ import { Subscription } from 'rxjs';
3
+ import { EditMode, ImageField } from '@sitecore-jss/sitecore-jss-angular';
4
+ import { SxaComponent } from '../sxa.component';
5
+ import { JssContextService } from '../../jss-context.service';
6
+
7
+ @Component({
8
+ selector: 'app-image',
9
+ templateUrl: './image.component.html',
10
+ })
11
+ export class ImageComponent extends SxaComponent implements OnInit, OnDestroy {
12
+ @ViewChild('default', { static: true }) defaultVariant: TemplateRef<any>;
13
+ @ViewChild('banner', { static: true }) bannerVariant: TemplateRef<any>;
14
+ classHeroBannerEmpty = '';
15
+ backgroundStyle = {};
16
+ modifyImageProps = {};
17
+ isEditing = false;
18
+ private contextSubscription: Subscription;
19
+
20
+ constructor(private jssContext: JssContextService) {
21
+ super();
22
+ }
23
+
24
+ ngOnInit() {
25
+ super.ngOnInit();
26
+
27
+ const imageField = this.rendering.fields?.Image as ImageField;
28
+ this.backgroundStyle = imageField?.value?.src && {
29
+ 'background-image': `url('${imageField.value.src}')`,
30
+ };
31
+
32
+ this.contextSubscription = this.jssContext.state.subscribe((newState) => {
33
+ this.isEditing = newState.sitecore && newState.sitecore.context.pageEditing;
34
+
35
+ this.classHeroBannerEmpty =
36
+ this.isEditing && imageField?.value?.class === 'scEmptyImage' ? 'hero-banner-empty' : '';
37
+
38
+ const isMetadataMode = newState.sitecore?.context?.editMode === EditMode.Metadata;
39
+ this.modifyImageProps = !isMetadataMode
40
+ ? {
41
+ ...imageField,
42
+ editable: imageField?.editable
43
+ ?.replace(`width="${imageField?.value?.width}"`, 'width="100%"')
44
+ .replace(`height="${imageField?.value?.height}"`, 'height="100%"'),
45
+ }
46
+ : {
47
+ ...imageField,
48
+ value: {
49
+ ...imageField?.value,
50
+ style: { width: '100%', height: '100%' },
51
+ },
52
+ };
53
+ });
54
+ }
55
+
56
+ ngOnDestroy() {
57
+ if (this.contextSubscription) {
58
+ this.contextSubscription.unsubscribe();
59
+ }
60
+ }
61
+
62
+ public get variant(): TemplateRef<any> {
63
+ return this.rendering.params?.FieldNames === 'Banner'
64
+ ? this.bannerVariant
65
+ : this.defaultVariant;
66
+ }
67
+ }
@@ -0,0 +1,15 @@
1
+ <div class="component-content">
2
+ <ng-container *ngIf="title; else defaultTitle">
3
+ <h3 *scText="title"></h3>
4
+ </ng-container>
5
+ <ul>
6
+ <li *ngFor="let fieldLink of fieldLinks; index as i" [ngClass]="getFieldLinkClass(i)">
7
+ <div class="field-link">
8
+ <a *scLink="fieldLink"></a>
9
+ </div>
10
+ </li>
11
+ </ul>
12
+ </div>
13
+ <ng-template #defaultTitle>
14
+ <span class="is-empty-hint">Link list</span>
15
+ </ng-template>
@@ -0,0 +1,41 @@
1
+ import { Component, OnInit } from '@angular/core';
2
+ import { SxaComponent } from '../sxa.component';
3
+ import { Field, LinkField, SxaLinkListFields } from '@sitecore-jss/sitecore-jss-angular';
4
+
5
+ @Component({
6
+ selector: 'app-link-list',
7
+ templateUrl: './link-list.component.html',
8
+ host: {
9
+ 'class': 'component link-list',
10
+ '[class]': 'styles',
11
+ '[attr.id]': 'id',
12
+ }
13
+ })
14
+ export class LinkListComponent extends SxaComponent<SxaLinkListFields> implements OnInit {
15
+ title?: Field<string>;
16
+ fieldLinks: LinkField[] = [];
17
+
18
+ getFieldLinkClass(index: number): string {
19
+ let className = `item${index}`;
20
+ className += (index + 1) % 2 == 0 ? ' even' : ' odd';
21
+ if (index === 0) {
22
+ className += ' first';
23
+ }
24
+ if (index + 1 === this.fieldLinks.length) {
25
+ className += ' last';
26
+ }
27
+ return className;
28
+ }
29
+
30
+ ngOnInit() {
31
+ super.ngOnInit();
32
+ const datasource = this.rendering.fields?.data?.datasource;
33
+ if (datasource) {
34
+ this.title = datasource.field?.title as Field<string>;
35
+ datasource.children.results.forEach(item => {
36
+ if (item.field?.link)
37
+ this.fieldLinks.push(item.field.link as LinkField);
38
+ });
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,23 @@
1
+ <li [class]="cssClasses" [ngClass]="{ active: isActive }" tabIndex="0">
2
+ <div [ngClass]="{ 'navigation-title': true, child: hasChildren }" (click)="isActive = !isActive">
3
+ <a *scLink="linkField" (click)="onClick($event)">
4
+ <ng-container *ngIf="navItemFields.NavigationTitle"
5
+ ><span *scText="navItemFields.NavigationTitle"></span
6
+ ></ng-container>
7
+ <ng-container *ngIf="!navItemFields.NavigationTitle && navItemFields.Title">
8
+ <span *scText="navItemFields.Title"></span
9
+ ></ng-container>
10
+ <ng-container *ngIf="!navItemFields.NavigationTitle && !navItemFields.Title">{{
11
+ navItemFields.DisplayName
12
+ }}</ng-container>
13
+ </a>
14
+ </div>
15
+ <ul *ngIf="hasChildren" class="clearfix">
16
+ <app-navigation-item
17
+ *ngFor="let childNavItemFields of navItemFields.Children"
18
+ [navItemFields]="childNavItemFields"
19
+ [relativeLevel]="childrenRelativeLevel"
20
+ (childLinkClickEvent)="onClick($event)"
21
+ ></app-navigation-item>
22
+ </ul>
23
+ </li>
@@ -0,0 +1,65 @@
1
+ import { Component, Input, OnInit, Output, EventEmitter } from '@angular/core';
2
+ import { LinkField } from '@sitecore-jss/sitecore-jss-angular';
3
+ import { Field } from '@sitecore-jss/sitecore-jss-angular';
4
+
5
+ export interface NavItemFields {
6
+ Id: string;
7
+ DisplayName: string;
8
+ Title: Field<string>;
9
+ NavigationTitle: Field<string>;
10
+ Href: string;
11
+ Querystring: string;
12
+ Children: Array<NavItemFields>;
13
+ Styles: string[];
14
+ }
15
+
16
+ @Component({
17
+ selector: 'app-navigation-item',
18
+ templateUrl: './navigation-item.component.html',
19
+ })
20
+ export class NavigationItemComponent implements OnInit {
21
+ @Input() navItemFields: NavItemFields;
22
+ @Input() relativeLevel: number;
23
+ @Output() childLinkClickEvent: EventEmitter<Event> = new EventEmitter<Event>();
24
+ cssClasses = '';
25
+ isActive = false;
26
+ linkField = {};
27
+ childrenRelativeLevel = 0;
28
+ hasChildren = false;
29
+
30
+ constructor() {}
31
+
32
+ ngOnInit() {
33
+ this.cssClasses = `${this.navItemFields.Styles.concat('rel-level' + this.relativeLevel).join(
34
+ ' '
35
+ )}`;
36
+ this.linkField = this.getLinkField(this.navItemFields);
37
+ this.hasChildren = this.navItemFields.Children && this.navItemFields.Children.length != 0;
38
+ this.childrenRelativeLevel = this.relativeLevel + 1;
39
+ }
40
+
41
+ onClick(event: Event) {
42
+ this.childLinkClickEvent.emit(event);
43
+ }
44
+
45
+ private getLinkField = (navItemFields: NavItemFields): LinkField => ({
46
+ value: {
47
+ href: navItemFields.Href,
48
+ title: this.getLinkTitle(navItemFields),
49
+ querystring: navItemFields.Querystring,
50
+ },
51
+ });
52
+
53
+ private getLinkTitle = (navItemFields: NavItemFields): string | undefined => {
54
+ let title;
55
+ if (navItemFields.NavigationTitle?.value) {
56
+ title = navItemFields.NavigationTitle.value.toString();
57
+ } else if (navItemFields.Title?.value) {
58
+ title = navItemFields.Title.value.toString();
59
+ } else {
60
+ title = navItemFields.DisplayName;
61
+ }
62
+
63
+ return title;
64
+ };
65
+ }
@@ -0,0 +1,21 @@
1
+ <label class="menu-mobile-navigate-wrapper">
2
+ <input
3
+ type="checkbox"
4
+ class="menu-mobile-navigate"
5
+ [checked]="isOpenMenu"
6
+ (change)="toggleMenu($event)"
7
+ />
8
+ <div class="menu-humburger"></div>
9
+ <div class="component-content">
10
+ <nav>
11
+ <ul class="clearfix">
12
+ <app-navigation-item
13
+ *ngFor="let navItemFields of rendering.fields"
14
+ [navItemFields]="navItemFields"
15
+ [relativeLevel]="baseLevel"
16
+ (childLinkClickEvent)="toggleMenu($event, false)"
17
+ ></app-navigation-item>
18
+ </ul>
19
+ </nav>
20
+ </div>
21
+ </label>