create-sitecore-jss 22.2.0-canary.1 → 22.2.0-canary.2

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 (189) hide show
  1. package/dist/bin.js +69 -28
  2. package/dist/common/processes/install.js +9 -2
  3. package/dist/common/processes/transform.js +7 -2
  4. package/dist/init-runner.js +12 -8
  5. package/dist/initializers/angular/index.js +16 -0
  6. package/dist/initializers/angular/prompts.js +22 -1
  7. package/dist/initializers/angular-sxp/index.js +56 -0
  8. package/dist/initializers/angular-xmcloud/index.js +56 -0
  9. package/dist/initializers/node-xmcloud-proxy/index.js +32 -0
  10. package/dist/templates/angular/.env +5 -3
  11. package/dist/templates/angular/README.md +5 -45
  12. package/dist/templates/angular/angular.json +1 -6
  13. package/dist/templates/angular/package.json +5 -15
  14. package/dist/templates/angular/proxy.conf.js +5 -23
  15. package/dist/templates/angular/scripts/bootstrap.ts +5 -24
  16. package/dist/templates/angular/scripts/config/index.ts +28 -0
  17. package/dist/templates/angular/scripts/config/plugins/computed.ts +21 -0
  18. package/dist/templates/angular/scripts/config/plugins/fallback.ts +23 -0
  19. package/dist/templates/angular/scripts/config/plugins/package-json.ts +22 -0
  20. package/dist/templates/angular/scripts/config/plugins/scjssconfig.ts +29 -0
  21. package/dist/templates/angular/scripts/generate-config.ts +53 -73
  22. package/dist/templates/angular/scripts/generate-plugins.ts +28 -0
  23. package/dist/templates/angular/scripts/temp/gitignore +2 -0
  24. package/dist/templates/angular/scripts/update-graphql-fragment-data.ts +4 -2
  25. package/dist/templates/angular/server.bundle.ts +19 -1
  26. package/dist/templates/angular/src/app/app.module.ts +0 -2
  27. package/dist/templates/angular/src/app/components/app-components.shared.module.ts +4 -19
  28. package/dist/templates/angular/src/app/jss-context.server-side.service.ts +0 -2
  29. package/dist/templates/angular/src/app/lib/config.ts +16 -0
  30. package/dist/templates/angular/src/app/lib/dictionary-service-factory.ts +21 -13
  31. package/dist/templates/angular/src/app/lib/layout-service-factory.ts +20 -12
  32. package/dist/templates/angular/src/app/routing/layout/layout.component.html +1 -1
  33. package/dist/templates/angular/src/app/routing/layout/layout.component.ts +1 -2
  34. package/dist/templates/angular/src/app/routing/navigation/navigation.component.html +5 -6
  35. package/dist/templates/angular/src/app/routing/navigation/navigation.component.ts +1 -2
  36. package/dist/templates/angular/src/app/routing/routing.module.ts +14 -21
  37. package/dist/templates/angular/src/app/routing/scripts/scripts.component.html +1 -0
  38. package/dist/templates/angular/src/app/routing/scripts/scripts.component.ts +7 -0
  39. package/dist/templates/angular/src/app/routing/scripts/scripts.module.ts +8 -0
  40. package/dist/templates/angular/src/graphql-fragment-types.ts +0 -95
  41. package/dist/templates/angular/tsconfig.json +7 -2
  42. package/dist/templates/angular-sxp/package.json +12 -0
  43. package/dist/templates/angular-sxp/proxy.conf.js +43 -0
  44. package/dist/templates/angular-sxp/scripts/config/plugins/disconnected.ts +27 -0
  45. package/dist/templates/angular-sxp/src/app/components/app-components.shared.module.ts +35 -0
  46. package/dist/templates/{angular → angular-sxp}/src/app/jss-data-fetcher.service.ts +3 -1
  47. package/dist/templates/angular-sxp/src/app/routing/navigation/navigation.component.html +23 -0
  48. package/dist/templates/angular-sxp/src/app/routing/scripts/scripts.component.html +3 -0
  49. package/dist/templates/angular-sxp/src/app/routing/scripts/scripts.module.ts +9 -0
  50. package/dist/templates/{angular/src/app/routing → angular-sxp/src/app/routing/scripts}/visitor-identification/visitor-identification.component.ts +9 -3
  51. package/dist/templates/angular-sxp/src/graphql-fragment-types.ts +219 -0
  52. package/dist/templates/angular-xmcloud/.env +8 -0
  53. package/dist/templates/angular-xmcloud/package.json +10 -0
  54. package/dist/templates/angular-xmcloud/scripts/config/plugins/xmcloud.ts +23 -0
  55. package/dist/templates/angular-xmcloud/scripts/proxy-build.ts +15 -0
  56. package/dist/templates/angular-xmcloud/src/app/lib/config.ts +15 -0
  57. package/dist/templates/angular-xmcloud/src/app/lib/graphql-client-factory.ts +44 -0
  58. package/dist/templates/node-xmcloud-proxy/.env +8 -0
  59. package/dist/templates/node-xmcloud-proxy/README.md +36 -0
  60. package/dist/templates/node-xmcloud-proxy/package.json +25 -0
  61. package/dist/templates/node-xmcloud-proxy/src/config.ts +19 -0
  62. package/dist/templates/node-xmcloud-proxy/src/index.ts +161 -0
  63. package/dist/templates/node-xmcloud-proxy/src/types.ts +59 -0
  64. package/dist/templates/node-xmcloud-proxy/tsconfig.json +22 -0
  65. package/package.json +2 -2
  66. /package/dist/templates/angular/src/app/lib/{client-factory.ts → graphql-client-factory.ts} +0 -0
  67. /package/dist/templates/{angular → angular-sxp}/data/component-content/Styleguide/ContentReuse/LoremIpsumContentBlock/en.yml +0 -0
  68. /package/dist/templates/{angular → angular-sxp}/data/component-content/gitignore +0 -0
  69. /package/dist/templates/{angular → angular-sxp}/data/content/Styleguide/ContentListField/Item1/en.yml +0 -0
  70. /package/dist/templates/{angular → angular-sxp}/data/content/Styleguide/ContentListField/Item2/en.yml +0 -0
  71. /package/dist/templates/{angular → angular-sxp}/data/content/Styleguide/EditFrameDemo/Item1/en.yml +0 -0
  72. /package/dist/templates/{angular → angular-sxp}/data/content/Styleguide/EditFrameDemo/Item2/en.yml +0 -0
  73. /package/dist/templates/{angular → angular-sxp}/data/content/Styleguide/ItemLinkField/Item1/en.yml +0 -0
  74. /package/dist/templates/{angular → angular-sxp}/data/content/Styleguide/ItemLinkField/Item2/en.yml +0 -0
  75. /package/dist/templates/{angular → angular-sxp}/data/content/gitignore +0 -0
  76. /package/dist/templates/{angular → angular-sxp}/data/dictionary/en.yml +0 -0
  77. /package/dist/templates/{angular → angular-sxp}/data/dictionary/{{language}}.yml +0 -0
  78. /package/dist/templates/{angular → angular-sxp}/data/media/files/jss.pdf +0 -0
  79. /package/dist/templates/{angular → angular-sxp}/data/media/img/jss_logo.png +0 -0
  80. /package/dist/templates/{angular → angular-sxp}/data/media/img/sc_logo.png +0 -0
  81. /package/dist/templates/{angular → angular-sxp}/data/routes/en.yml +0 -0
  82. /package/dist/templates/{angular → angular-sxp}/data/routes/graphql/en.yml +0 -0
  83. /package/dist/templates/{angular → angular-sxp}/data/routes/graphql/sample-1/en.yml +0 -0
  84. /package/dist/templates/{angular → angular-sxp}/data/routes/graphql/sample-2/en.yml +0 -0
  85. /package/dist/templates/{angular → angular-sxp}/data/routes/styleguide/custom-route-type/en.yml +0 -0
  86. /package/dist/templates/{angular → angular-sxp}/data/routes/styleguide/en.yml +0 -0
  87. /package/dist/templates/{angular → angular-sxp}/data/routes/styleguide/{{language}}.yml +0 -0
  88. /package/dist/templates/{angular → angular-sxp}/data/routes/{{language}}.yml +0 -0
  89. /package/dist/templates/{angular → angular-sxp}/scripts/disconnected-mode-proxy.ts +0 -0
  90. /package/dist/templates/{angular → angular-sxp}/scripts/lint-yml.ts +0 -0
  91. /package/dist/templates/{angular → angular-sxp}/sitecore/config/{{appName}}.config +0 -0
  92. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/component-content.sitecore.ts +0 -0
  93. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/Styleguide-Layout-Reuse.sitecore.ts +0 -0
  94. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/Styleguide-Layout-Tabs-Tab.sitecore.ts +0 -0
  95. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/Styleguide-Layout-Tabs.sitecore.ts +0 -0
  96. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/Styleguide-Layout.sitecore.ts +0 -0
  97. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/Styleguide-Multilingual.sitecore.ts +0 -0
  98. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/Styleguide-Section.sitecore.ts +0 -0
  99. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/content-block.sitecore.ts +0 -0
  100. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/graph-ql-connected-demo.sitecore.ts +0 -0
  101. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/graph-ql-integrated-demo.sitecore.graphql +0 -0
  102. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/graph-ql-integrated-demo.sitecore.ts +0 -0
  103. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/graph-ql-layout.sitecore.ts +0 -0
  104. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/styleguide-angular-lazy-loading.sitecore.ts +0 -0
  105. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/styleguide-component-params.sitecore.ts +0 -0
  106. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/styleguide-custom-route-type.sitecore.ts +0 -0
  107. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/styleguide-edit-frame.sitecore.ts +0 -0
  108. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/styleguide-field-usage-checkbox.sitecore.ts +0 -0
  109. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/styleguide-field-usage-content-list.sitecore.ts +0 -0
  110. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/styleguide-field-usage-custom.sitecore.ts +0 -0
  111. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/styleguide-field-usage-date.sitecore.ts +0 -0
  112. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/styleguide-field-usage-file.sitecore.ts +0 -0
  113. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/styleguide-field-usage-image.sitecore.ts +0 -0
  114. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/styleguide-field-usage-item-link.sitecore.ts +0 -0
  115. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/styleguide-field-usage-link.sitecore.ts +0 -0
  116. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/styleguide-field-usage-number.sitecore.ts +0 -0
  117. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/styleguide-field-usage-rich-text.sitecore.ts +0 -0
  118. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/styleguide-field-usage-text.sitecore.ts +0 -0
  119. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/styleguide-route-fields.sitecore.ts +0 -0
  120. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/styleguide-sitecore-context.sitecore.ts +0 -0
  121. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/components/styleguide-tracking.sitecore.ts +0 -0
  122. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/config.js +0 -0
  123. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/content.sitecore.ts +0 -0
  124. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/dictionary.sitecore.ts +0 -0
  125. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/placeholders.sitecore.ts +0 -0
  126. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/routes.sitecore.ts +0 -0
  127. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/templates/Styleguide-Explanatory-Component.sitecore.ts +0 -0
  128. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/templates/styleguide-content-list-template.sitecore.ts +0 -0
  129. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/templates/styleguide-edit-frame-list-item-template.sitecore.ts +0 -0
  130. /package/dist/templates/{angular → angular-sxp}/sitecore/definitions/templates/styleguide-item-link-template.sitecore.ts +0 -0
  131. /package/dist/templates/{angular → angular-sxp}/sitecore/gitignore +0 -0
  132. /package/dist/templates/{angular → angular-sxp}/sitecore/pipelines/example.patch.ts +0 -0
  133. /package/dist/templates/{angular → angular-sxp}/src/app/components/graph-ql-connected-demo/graph-ql-connected-demo.component.graphql +0 -0
  134. /package/dist/templates/{angular → angular-sxp}/src/app/components/graph-ql-connected-demo/graph-ql-connected-demo.component.html +0 -0
  135. /package/dist/templates/{angular → angular-sxp}/src/app/components/graph-ql-connected-demo/graph-ql-connected-demo.component.ts +0 -0
  136. /package/dist/templates/{angular → angular-sxp}/src/app/components/graph-ql-integrated-demo/graph-ql-integrated-demo.component.html +0 -0
  137. /package/dist/templates/{angular → angular-sxp}/src/app/components/graph-ql-integrated-demo/graph-ql-integrated-demo.component.ts +0 -0
  138. /package/dist/templates/{angular → angular-sxp}/src/app/components/graph-ql-layout/graph-ql-layout.component.html +0 -0
  139. /package/dist/templates/{angular → angular-sxp}/src/app/components/graph-ql-layout/graph-ql-layout.component.ts +0 -0
  140. /package/dist/templates/{angular → angular-sxp}/src/app/components/shared/styleguide-specimen/styleguide-specimen.component.ts +0 -0
  141. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-angular-lazy-loading/styleguide-angular-lazy-loading.component.html +0 -0
  142. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-angular-lazy-loading/styleguide-angular-lazy-loading.component.ts +0 -0
  143. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-angular-lazy-loading/styleguide-angular-lazy-loading.module.ts +0 -0
  144. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-component-params/styleguide-component-params.component.html +0 -0
  145. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-component-params/styleguide-component-params.component.ts +0 -0
  146. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-custom-route-type/styleguide-custom-route-type.component.html +0 -0
  147. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-custom-route-type/styleguide-custom-route-type.component.ts +0 -0
  148. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-edit-frame/styleguide-edit-frame.component.html +0 -0
  149. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-edit-frame/styleguide-edit-frame.component.ts +0 -0
  150. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-field-usage-checkbox/styleguide-field-usage-checkbox.component.html +0 -0
  151. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-field-usage-checkbox/styleguide-field-usage-checkbox.component.ts +0 -0
  152. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-field-usage-content-list/styleguide-field-usage-content-list.component.html +0 -0
  153. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-field-usage-content-list/styleguide-field-usage-content-list.component.ts +0 -0
  154. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-field-usage-custom/styleguide-field-usage-custom.component.html +0 -0
  155. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-field-usage-custom/styleguide-field-usage-custom.component.ts +0 -0
  156. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-field-usage-date/styleguide-field-usage-date.component.html +0 -0
  157. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-field-usage-date/styleguide-field-usage-date.component.ts +0 -0
  158. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-field-usage-file/styleguide-field-usage-file.component.html +0 -0
  159. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-field-usage-file/styleguide-field-usage-file.component.ts +0 -0
  160. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-field-usage-image/styleguide-field-usage-image.component.html +0 -0
  161. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-field-usage-image/styleguide-field-usage-image.component.ts +0 -0
  162. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-field-usage-item-link/styleguide-field-usage-item-link.component.html +0 -0
  163. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-field-usage-item-link/styleguide-field-usage-item-link.component.ts +0 -0
  164. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-field-usage-link/styleguide-field-usage-link.component.html +0 -0
  165. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-field-usage-link/styleguide-field-usage-link.component.ts +0 -0
  166. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-field-usage-number/styleguide-field-usage-number.component.html +0 -0
  167. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-field-usage-number/styleguide-field-usage-number.component.ts +0 -0
  168. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-field-usage-rich-text/styleguide-field-usage-rich-text.component.html +0 -0
  169. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-field-usage-rich-text/styleguide-field-usage-rich-text.component.ts +0 -0
  170. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-field-usage-text/styleguide-field-usage-text.component.html +0 -0
  171. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-field-usage-text/styleguide-field-usage-text.component.ts +0 -0
  172. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-layout/styleguide-layout.component.html +0 -0
  173. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-layout/styleguide-layout.component.ts +0 -0
  174. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-layout-reuse/styleguide-layout-reuse.component.html +0 -0
  175. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-layout-reuse/styleguide-layout-reuse.component.ts +0 -0
  176. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-layout-tabs/styleguide-layout-tabs.component.html +0 -0
  177. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-layout-tabs/styleguide-layout-tabs.component.ts +0 -0
  178. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-layout-tabs-tab/styleguide-layout-tabs-tab.component.html +0 -0
  179. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-layout-tabs-tab/styleguide-layout-tabs-tab.component.ts +0 -0
  180. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-multilingual/styleguide-multilingual.component.html +0 -0
  181. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-multilingual/styleguide-multilingual.component.ts +0 -0
  182. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-route-fields/styleguide-route-fields.component.html +0 -0
  183. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-route-fields/styleguide-route-fields.component.ts +0 -0
  184. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-section/styleguide-section.component.html +0 -0
  185. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-section/styleguide-section.component.ts +0 -0
  186. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-sitecore-context/styleguide-sitecore-context.component.html +0 -0
  187. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-sitecore-context/styleguide-sitecore-context.component.ts +0 -0
  188. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-tracking/styleguide-tracking.component.html +0 -0
  189. /package/dist/templates/{angular → angular-sxp}/src/app/components/styleguide-tracking/styleguide-tracking.component.ts +0 -0
@@ -0,0 +1,23 @@
1
+ import { JssConfig } from 'lib/config';
2
+ import { ConfigPlugin } from '..';
3
+ import { constantCase } from 'constant-case';
4
+
5
+ /**
6
+ * This plugin will set XM Cloud related config props.
7
+ */
8
+ class XMCloudPlugin implements ConfigPlugin {
9
+ // should come after other plugins (but before fallback)
10
+ order = 10;
11
+
12
+ async exec(config: JssConfig) {
13
+ const proxyBuildPath = process.env[`${constantCase('proxyBuildPath')}`]?.replace(/\/$/, '');
14
+ const proxyHost = process.env[`${constantCase('proxyHost')}`];
15
+
16
+ return Object.assign({}, config, {
17
+ proxyBuildPath,
18
+ proxyHost,
19
+ });
20
+ }
21
+ }
22
+
23
+ export const xmcloudPlugin = new XMCloudPlugin();
@@ -0,0 +1,15 @@
1
+ import { execSync } from 'child_process';
2
+ import { environment } from '../src/environments/environment';
3
+
4
+ // Executed at the end of the build process (jss build) to move the build output to the proxy build path
5
+
6
+ try {
7
+ console.log('Moving build output to proxy build path:', environment.proxyBuildPath);
8
+
9
+ execSync(`del-cli ${environment.proxyBuildPath} --force`, { stdio: 'inherit' });
10
+ execSync(`move-cli ./dist ${environment.proxyBuildPath}`, { stdio: 'inherit' });
11
+
12
+ console.log('Proxy build prepared successfully!');
13
+ } catch (error) {
14
+ console.error('Error preparing proxy build:', error);
15
+ }
@@ -0,0 +1,15 @@
1
+ /*
2
+ * Represents the type of config object available within the generated /environments/environment.js
3
+ */
4
+ export interface JssConfig extends Record<string, string | boolean | undefined> {
5
+ production?: false;
6
+ sitecoreApiKey?: string;
7
+ sitecoreApiHost?: string;
8
+ sitecoreSiteName?: string;
9
+ defaultLanguage?: string;
10
+ graphQLEndpoint?: string;
11
+ graphQLEndpointPath?: string;
12
+ defaultServerRoute?: string;
13
+ proxyBuildPath?: string;
14
+ proxyHost?: string;
15
+ }
@@ -0,0 +1,44 @@
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();
@@ -0,0 +1,8 @@
1
+ # Your proxy port (default: 3001)
2
+ PROXY_PORT=
3
+
4
+ # Your proxy server bundle path
5
+ PROXY_BUNDLE_PATH=
6
+
7
+ # Set the DEBUG environment variable to 'sitecore-jss:*,sitecore-jss:proxy,http-proxy-middleware*' to see all logs:
8
+ #DEBUG=sitecore-jss:*,http-proxy-middleware*
@@ -0,0 +1,36 @@
1
+ # Node XM Cloud Proxy
2
+
3
+ > Sitecore JSS Proxy for XM Cloud is considered experimental.
4
+
5
+ [Documentation](<TODO>)
6
+
7
+ This is a sample setup showing one of how you can configure XM Cloud rendering server.
8
+
9
+ ## Pre-requisites
10
+
11
+ 1. SPA sample supports XM Cloud out of the box.
12
+
13
+ 1. Build your SPA app bundle with `jss build`. The build output should be placed in the `dist` folder.
14
+
15
+ ## Setup
16
+
17
+ Open `config.js` and specify your application settings.
18
+
19
+ ### Environment Variables
20
+
21
+ The following environment variables can be set to configure the Proxy sample instead of modifying `config.js`. You can use the `.env` file located in the root of the app or set these directly in the environment (for example, in containers).
22
+
23
+ | Parameter | Description |
24
+ | -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
25
+ | `PROXY_BUNDLE_PATH` | Path to the JSS SPA app's `server.bundle.js`. Default can be seen in [config.js](./config.js) file. |
26
+ | `PROXY_PORT` | Optional. Port which will be used when start sample. Default can be seen in [config.js](./config.js) file. |
27
+ | `DEBUG` | Optional. Debug level for the proxy. Set the DEBUG environment variable to 'sitecore-jss:*,proxy*,http-proxy-middleware*' to see all logs. |
28
+
29
+ ## Build & run
30
+
31
+ 1. Run `npm install`
32
+
33
+ 1. Run `npm run start`
34
+
35
+ You should be able to see the following message:
36
+ `server listening on port 3001!`.
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "node-xmcloud-sample",
3
+ "version": "22.1.0-canary",
4
+ "description": "Node XM Cloud Proxy sample for running XM Cloud JSS SPA apps",
5
+ "author": {
6
+ "name": "Sitecore Corporation",
7
+ "url": "https://jss.sitecore.com"
8
+ },
9
+ "scripts": {
10
+ "start": "ts-node ./src/index.ts"
11
+ },
12
+ "dependencies": {
13
+ "compression": "^1.7.4",
14
+ "express": "^4.18.2",
15
+ "dotenv": "^16.0.3",
16
+ "http-proxy-middleware": "^3.0.0"
17
+ },
18
+ "devDependencies": {
19
+ "@sitecore-jss/sitecore-jss": "~22.1.0-canary",
20
+ "@types/compression": "^1.7.2",
21
+ "@types/express": "^4.17.17",
22
+ "ts-node": "^10.9.1",
23
+ "typescript": "~4.9.5"
24
+ }
25
+ }
@@ -0,0 +1,19 @@
1
+ import { Config, ServerBundle } from './types';
2
+
3
+ /**
4
+ * The server.bundle.js file from your pre-built SPA app.
5
+ */
6
+ const bundlePath = process.env.PROXY_BUNDLE_PATH || `../dist/server.bundle`;
7
+
8
+ const serverBundle: ServerBundle = require(bundlePath);
9
+
10
+ export const config: Config = {
11
+ /**
12
+ * The require'd server.bundle.js file from your pre-built SPA app.
13
+ */
14
+ serverBundle,
15
+ /**
16
+ * Port which will be used when start the proxy
17
+ */
18
+ port: process.env.PROXY_PORT || 3001,
19
+ };
@@ -0,0 +1,161 @@
1
+ import 'dotenv/config';
2
+ import express, { Response } from 'express';
3
+ import compression from 'compression';
4
+ import { createProxyMiddleware } from 'http-proxy-middleware';
5
+ import { debug } from '@sitecore-jss/sitecore-jss';
6
+ import { config } from './config';
7
+
8
+ const server = express();
9
+
10
+ const {
11
+ renderView,
12
+ parseRouteUrl,
13
+ dictionaryServiceFactory,
14
+ layoutServiceFactory,
15
+ } = config.serverBundle;
16
+
17
+ /**
18
+ * Required server bundle properties
19
+ */
20
+ const requiredProperties = [
21
+ 'renderView',
22
+ 'parseRouteUrl',
23
+ 'clientFactory',
24
+ 'siteName',
25
+ 'defaultLanguage',
26
+ 'layoutServiceFactory',
27
+ 'dictionaryServiceFactory',
28
+ 'graphQLEndpointPath',
29
+ 'graphQLEndpoint',
30
+ ];
31
+
32
+ const missingProperties = requiredProperties.filter((property) => !config.serverBundle[property]);
33
+
34
+ if (missingProperties.length > 0) {
35
+ throw new Error(
36
+ `ERROR: The serverBundle should export the following properties: ${missingProperties.join(
37
+ ', '
38
+ )}. Please check your server bundle.`
39
+ );
40
+ }
41
+
42
+ const layoutService = layoutServiceFactory.create();
43
+
44
+ const dictionaryService = dictionaryServiceFactory.create();
45
+
46
+ /**
47
+ * Parse requested url in order to detect current route and language
48
+ * @param {string} reqRoute requested route
49
+ */
50
+ const getRouteParams = (reqRoute: string) => {
51
+ const routeParams = parseRouteUrl(reqRoute);
52
+ let lang;
53
+ let route;
54
+
55
+ if (routeParams) {
56
+ route = routeParams.sitecoreRoute || '/';
57
+
58
+ if (!route.startsWith('/')) {
59
+ route = `/${route}`;
60
+ }
61
+
62
+ lang = routeParams.lang || '';
63
+ }
64
+
65
+ return { route, lang };
66
+ };
67
+
68
+ /**
69
+ * Handle unexpected error
70
+ * @param {Response} res server response
71
+ * @param {Error} err error
72
+ */
73
+ const handleError = (res: Response, err: unknown) => {
74
+ debug.proxy('response error %o', err);
75
+
76
+ res.status(500).send('Internal Server Error');
77
+ };
78
+
79
+ // enable gzip compression for appropriate file types
80
+ server.use(compression());
81
+
82
+ // turn off x-powered-by http header
83
+ server.settings['x-powered-by'] = false;
84
+
85
+ // Serve static app assets from local /dist folder
86
+ server.use(
87
+ '/dist',
88
+ express.static('dist', {
89
+ fallthrough: false, // force 404 for unknown assets under /dist
90
+ })
91
+ );
92
+
93
+ /**
94
+ * Proxy browser GraphQL requests to the Sitecore GraphQL endpoint
95
+ */
96
+ server.use(
97
+ config.serverBundle.graphQLEndpointPath,
98
+ createProxyMiddleware({
99
+ target: config.serverBundle.graphQLEndpoint,
100
+ changeOrigin: true,
101
+ })
102
+ );
103
+
104
+ server.use(async (req, res) => {
105
+ debug.proxy(`performing SSR for ${req.originalUrl}`);
106
+
107
+ try {
108
+ const { route, lang } = getRouteParams(req.originalUrl);
109
+
110
+ if (!route) {
111
+ debug.proxy('no route detected, returning 404');
112
+
113
+ res.sendStatus(404);
114
+
115
+ return;
116
+ }
117
+
118
+ // Language is required. In case it's not specified in the requested URL, fallback to the default language from the app configuration.
119
+ const layoutData = await layoutService.fetchLayoutData(
120
+ route,
121
+ lang || config.serverBundle.defaultLanguage
122
+ );
123
+
124
+ const viewBag = { dictionary: {} };
125
+
126
+ viewBag.dictionary = await dictionaryService.fetchDictionaryData(
127
+ layoutData.sitecore.context.language || config.serverBundle.defaultLanguage
128
+ );
129
+
130
+ renderView(
131
+ (err, result) => {
132
+ if (err) {
133
+ handleError(res, err);
134
+ return;
135
+ }
136
+
137
+ if (!result) {
138
+ debug.proxy('no result returned from renderView, returning 204');
139
+
140
+ res.status(204).send();
141
+ return;
142
+ }
143
+
144
+ const statusCode = layoutData.sitecore.route ? 200 : 404;
145
+
146
+ debug.proxy('sending response with status %s', statusCode);
147
+
148
+ res.status(statusCode).send(result.html);
149
+ },
150
+ route,
151
+ layoutData,
152
+ viewBag
153
+ );
154
+ } catch (err) {
155
+ handleError(res, err);
156
+ }
157
+ });
158
+
159
+ server.listen(config.port, () => {
160
+ console.log(`server listening on port ${config.port}!`);
161
+ });
@@ -0,0 +1,59 @@
1
+ import { GraphQLRequestClientFactory } from '@sitecore-jss/sitecore-jss';
2
+ import { DictionaryService } from '@sitecore-jss/sitecore-jss/i18n';
3
+ import { LayoutService, LayoutServiceData } from '@sitecore-jss/sitecore-jss/layout';
4
+
5
+ interface ServerResponse {
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
+ };
41
+
42
+ export interface ServerBundle {
43
+ [key: string]: unknown;
44
+ renderView: AppRenderer;
45
+ parseRouteUrl: RouteUrlParser;
46
+ clientFactory: GraphQLRequestClientFactory;
47
+ siteName: string;
48
+ defaultLanguage: string;
49
+ layoutServiceFactory: { create: () => LayoutService };
50
+ dictionaryServiceFactory: { create: () => DictionaryService };
51
+ graphQLEndpointPath: string;
52
+ graphQLEndpoint: string;
53
+ }
54
+
55
+ export interface Config {
56
+ [key: string]: unknown;
57
+ port: string | number;
58
+ serverBundle: ServerBundle;
59
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "compilerOptions": {
3
+ "newLine": "LF",
4
+ "emitDecoratorMetadata": true,
5
+ "experimentalDecorators": true,
6
+ "noFallthroughCasesInSwitch": true,
7
+ "rootDir": ".",
8
+ "esModuleInterop": true,
9
+ "forceConsistentCasingInFileNames": true,
10
+ "strict": true,
11
+ "noImplicitAny": true,
12
+ "noUnusedLocals": true,
13
+ "noUnusedParameters": true,
14
+ "noImplicitReturns": true,
15
+ "strictFunctionTypes": false,
16
+ "downlevelIteration": true,
17
+ "moduleResolution": "node",
18
+ "isolatedModules": true,
19
+ "allowSyntheticDefaultImports": true
20
+ },
21
+ "exclude": ["node_modules", "dist"]
22
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-sitecore-jss",
3
- "version": "22.2.0-canary.1",
3
+ "version": "22.2.0-canary.2",
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": "7dd64ce5a019e4579596beae31315db262a4700f"
66
+ "gitHead": "ba1b71ef1209c0e3bdd3557d315a0e2a46ba4580"
67
67
  }