@sitecore-content-sdk/nextjs 1.3.0-canary.9 → 1.4.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 (234) hide show
  1. package/README.md +11 -11
  2. package/dist/cjs/client/index.js +10 -10
  3. package/dist/cjs/client/models.js +2 -2
  4. package/dist/cjs/client/sitecore-nextjs-client.js +160 -156
  5. package/dist/cjs/components/BYOCWrapper.js +31 -30
  6. package/dist/cjs/components/ComponentPropsContext.js +66 -59
  7. package/dist/cjs/components/FEaaSWrapper.js +33 -32
  8. package/dist/cjs/components/Link.js +117 -90
  9. package/dist/cjs/components/NextImage.js +66 -62
  10. package/dist/cjs/components/Placeholder.js +55 -50
  11. package/dist/cjs/components/RichText.js +133 -128
  12. package/dist/cjs/config/define-config.js +26 -25
  13. package/dist/cjs/config/index.js +5 -5
  14. package/dist/cjs/config-cli/define-cli-config.js +40 -39
  15. package/dist/cjs/config-cli/index.js +5 -5
  16. package/dist/cjs/editing/codegen/import-map.js +129 -118
  17. package/dist/cjs/editing/codegen/index.js +6 -6
  18. package/dist/cjs/editing/constants.js +10 -10
  19. package/dist/cjs/editing/editing-config-middleware.js +70 -69
  20. package/dist/cjs/editing/editing-render-middleware.js +145 -144
  21. package/dist/cjs/editing/feaas-render-middleware.js +102 -101
  22. package/dist/cjs/editing/index.js +19 -19
  23. package/dist/cjs/editing/render-middleware.js +46 -46
  24. package/dist/cjs/editing/utils.js +260 -257
  25. package/dist/cjs/index.js +132 -131
  26. package/dist/cjs/middleware/app-router-multisite-middleware.js +41 -20
  27. package/dist/cjs/middleware/index.js +30 -30
  28. package/dist/cjs/middleware/locale-middleware.js +85 -84
  29. package/dist/cjs/middleware/middleware.js +195 -192
  30. package/dist/cjs/middleware/multisite-middleware.js +141 -118
  31. package/dist/cjs/middleware/personalize-middleware.js +240 -236
  32. package/dist/cjs/middleware/redirects-middleware.js +323 -297
  33. package/dist/cjs/middleware/robots-middleware.js +45 -44
  34. package/dist/cjs/middleware/sitemap-middleware.js +50 -49
  35. package/dist/cjs/monitoring/healthcheck-middleware.js +31 -30
  36. package/dist/cjs/monitoring/index.js +5 -5
  37. package/dist/cjs/route-handler/editing-config-route-handler.js +110 -106
  38. package/dist/cjs/route-handler/editing-render-route-handler.js +270 -165
  39. package/dist/cjs/route-handler/index.js +11 -11
  40. package/dist/cjs/route-handler/robots-route-handler.js +69 -68
  41. package/dist/cjs/route-handler/sitemap-route-handler.js +66 -65
  42. package/dist/cjs/search/index.js +17 -0
  43. package/dist/cjs/services/component-props-service.js +142 -138
  44. package/dist/cjs/sharedTypes/component-props.js +2 -2
  45. package/dist/cjs/sharedTypes/sitecore-page-props.js +2 -2
  46. package/dist/cjs/site/index.js +5 -5
  47. package/dist/cjs/tools/codegen/import-map.js +15 -0
  48. package/dist/cjs/tools/component-props.loader.js +95 -95
  49. package/dist/cjs/tools/generate-map.js +317 -317
  50. package/dist/cjs/tools/index.js +14 -13
  51. package/dist/cjs/tools/templating/byoc-component.js +36 -36
  52. package/dist/cjs/tools/templating/constants.js +7 -7
  53. package/dist/cjs/tools/templating/default-component.js +35 -35
  54. package/dist/cjs/tools/templating/utils.js +200 -0
  55. package/dist/cjs/utils/index.js +14 -14
  56. package/dist/cjs/utils/utils.js +82 -73
  57. package/dist/esm/client/index.js +2 -2
  58. package/dist/esm/client/models.js +1 -1
  59. package/dist/esm/client/sitecore-nextjs-client.js +156 -152
  60. package/dist/esm/components/BYOCWrapper.js +27 -26
  61. package/dist/esm/components/ComponentPropsContext.js +28 -21
  62. package/dist/esm/components/FEaaSWrapper.js +29 -28
  63. package/dist/esm/components/Link.js +78 -51
  64. package/dist/esm/components/NextImage.js +60 -56
  65. package/dist/esm/components/Placeholder.js +18 -13
  66. package/dist/esm/components/RichText.js +96 -91
  67. package/dist/esm/config/define-config.js +21 -20
  68. package/dist/esm/config/index.js +1 -1
  69. package/dist/esm/config-cli/define-cli-config.js +36 -35
  70. package/dist/esm/config-cli/index.js +1 -1
  71. package/dist/esm/editing/codegen/import-map.js +92 -81
  72. package/dist/esm/editing/codegen/index.js +1 -1
  73. package/dist/esm/editing/constants.js +7 -7
  74. package/dist/esm/editing/editing-config-middleware.js +66 -65
  75. package/dist/esm/editing/editing-render-middleware.js +141 -140
  76. package/dist/esm/editing/feaas-render-middleware.js +98 -97
  77. package/dist/esm/editing/index.js +6 -6
  78. package/dist/esm/editing/render-middleware.js +42 -42
  79. package/dist/esm/editing/utils.js +246 -243
  80. package/dist/esm/index.js +25 -25
  81. package/dist/esm/middleware/app-router-multisite-middleware.js +37 -16
  82. package/dist/esm/middleware/index.js +11 -11
  83. package/dist/esm/middleware/locale-middleware.js +81 -80
  84. package/dist/esm/middleware/middleware.js +189 -186
  85. package/dist/esm/middleware/multisite-middleware.js +137 -114
  86. package/dist/esm/middleware/personalize-middleware.js +236 -232
  87. package/dist/esm/middleware/redirects-middleware.js +316 -290
  88. package/dist/esm/middleware/robots-middleware.js +41 -40
  89. package/dist/esm/middleware/sitemap-middleware.js +46 -45
  90. package/dist/esm/monitoring/healthcheck-middleware.js +27 -26
  91. package/dist/esm/monitoring/index.js +1 -1
  92. package/dist/esm/route-handler/editing-config-route-handler.js +106 -102
  93. package/dist/esm/route-handler/editing-render-route-handler.js +265 -160
  94. package/dist/esm/route-handler/index.js +4 -4
  95. package/dist/esm/route-handler/robots-route-handler.js +65 -64
  96. package/dist/esm/route-handler/sitemap-route-handler.js +63 -62
  97. package/dist/esm/search/index.js +1 -0
  98. package/dist/esm/services/component-props-service.js +135 -131
  99. package/dist/esm/sharedTypes/component-props.js +1 -1
  100. package/dist/esm/sharedTypes/sitecore-page-props.js +1 -1
  101. package/dist/esm/site/index.js +1 -1
  102. package/dist/esm/tools/codegen/import-map.js +11 -0
  103. package/dist/esm/tools/component-props.loader.js +59 -59
  104. package/dist/esm/tools/generate-map.js +279 -279
  105. package/dist/esm/tools/index.js +3 -2
  106. package/dist/esm/tools/templating/byoc-component.js +30 -30
  107. package/dist/esm/tools/templating/constants.js +4 -4
  108. package/dist/esm/tools/templating/default-component.js +29 -29
  109. package/dist/esm/tools/templating/utils.js +190 -0
  110. package/dist/esm/utils/index.js +3 -3
  111. package/dist/esm/utils/utils.js +74 -65
  112. package/package.json +87 -13
  113. package/search.d.ts +1 -0
  114. package/types/client/index.d.ts +3 -2
  115. package/types/client/index.d.ts.map +1 -0
  116. package/types/client/models.d.ts +9 -8
  117. package/types/client/models.d.ts.map +1 -0
  118. package/types/client/sitecore-nextjs-client.d.ts +68 -63
  119. package/types/client/sitecore-nextjs-client.d.ts.map +1 -0
  120. package/types/components/BYOCWrapper.d.ts +16 -14
  121. package/types/components/BYOCWrapper.d.ts.map +1 -0
  122. package/types/components/ComponentPropsContext.d.ts +30 -18
  123. package/types/components/ComponentPropsContext.d.ts.map +1 -0
  124. package/types/components/FEaaSWrapper.d.ts +17 -15
  125. package/types/components/FEaaSWrapper.d.ts.map +1 -0
  126. package/types/components/Link.d.ts +25 -15
  127. package/types/components/Link.d.ts.map +1 -0
  128. package/types/components/NextImage.d.ts +11 -6
  129. package/types/components/NextImage.d.ts.map +1 -0
  130. package/types/components/Placeholder.d.ts +14 -8
  131. package/types/components/Placeholder.d.ts.map +1 -0
  132. package/types/components/RichText.d.ts +35 -25
  133. package/types/components/RichText.d.ts.map +1 -0
  134. package/types/config/define-config.d.ts +42 -38
  135. package/types/config/define-config.d.ts.map +1 -0
  136. package/types/config/index.d.ts +2 -1
  137. package/types/config/index.d.ts.map +1 -0
  138. package/types/config-cli/define-cli-config.d.ts +10 -8
  139. package/types/config-cli/define-cli-config.d.ts.map +1 -0
  140. package/types/config-cli/index.d.ts +2 -1
  141. package/types/config-cli/index.d.ts.map +1 -0
  142. package/types/editing/codegen/import-map.d.ts +15 -3
  143. package/types/editing/codegen/import-map.d.ts.map +1 -0
  144. package/types/editing/codegen/index.d.ts +3 -2
  145. package/types/editing/codegen/index.d.ts.map +1 -0
  146. package/types/editing/constants.d.ts +8 -7
  147. package/types/editing/constants.d.ts.map +1 -0
  148. package/types/editing/editing-config-middleware.d.ts +37 -31
  149. package/types/editing/editing-config-middleware.d.ts.map +1 -0
  150. package/types/editing/editing-render-middleware.d.ts +47 -44
  151. package/types/editing/editing-render-middleware.d.ts.map +1 -0
  152. package/types/editing/feaas-render-middleware.d.ts +35 -32
  153. package/types/editing/feaas-render-middleware.d.ts.map +1 -0
  154. package/types/editing/index.d.ts +7 -6
  155. package/types/editing/index.d.ts.map +1 -0
  156. package/types/editing/render-middleware.d.ts +26 -25
  157. package/types/editing/render-middleware.d.ts.map +1 -0
  158. package/types/editing/utils.d.ts +110 -106
  159. package/types/editing/utils.d.ts.map +1 -0
  160. package/types/index.d.ts +25 -24
  161. package/types/index.d.ts.map +1 -0
  162. package/types/middleware/app-router-multisite-middleware.d.ts +28 -13
  163. package/types/middleware/app-router-multisite-middleware.d.ts.map +1 -0
  164. package/types/middleware/index.d.ts +12 -11
  165. package/types/middleware/index.d.ts.map +1 -0
  166. package/types/middleware/locale-middleware.d.ts +35 -32
  167. package/types/middleware/locale-middleware.d.ts.map +1 -0
  168. package/types/middleware/middleware.d.ts +135 -127
  169. package/types/middleware/middleware.d.ts.map +1 -0
  170. package/types/middleware/multisite-middleware.d.ts +54 -37
  171. package/types/middleware/multisite-middleware.d.ts.map +1 -0
  172. package/types/middleware/personalize-middleware.d.ts +81 -65
  173. package/types/middleware/personalize-middleware.d.ts.map +1 -0
  174. package/types/middleware/redirects-middleware.d.ts +68 -65
  175. package/types/middleware/redirects-middleware.d.ts.map +1 -0
  176. package/types/middleware/robots-middleware.d.ts +15 -13
  177. package/types/middleware/robots-middleware.d.ts.map +1 -0
  178. package/types/middleware/sitemap-middleware.d.ts +16 -14
  179. package/types/middleware/sitemap-middleware.d.ts.map +1 -0
  180. package/types/monitoring/healthcheck-middleware.d.ts +14 -12
  181. package/types/monitoring/healthcheck-middleware.d.ts.map +1 -0
  182. package/types/monitoring/index.d.ts +2 -1
  183. package/types/monitoring/index.d.ts.map +1 -0
  184. package/types/route-handler/editing-config-route-handler.d.ts +30 -24
  185. package/types/route-handler/editing-config-route-handler.d.ts.map +1 -0
  186. package/types/route-handler/editing-render-route-handler.d.ts +33 -25
  187. package/types/route-handler/editing-render-route-handler.d.ts.map +1 -0
  188. package/types/route-handler/index.d.ts +5 -4
  189. package/types/route-handler/index.d.ts.map +1 -0
  190. package/types/route-handler/robots-route-handler.d.ts +30 -28
  191. package/types/route-handler/robots-route-handler.d.ts.map +1 -0
  192. package/types/route-handler/sitemap-route-handler.d.ts +30 -28
  193. package/types/route-handler/sitemap-route-handler.d.ts.map +1 -0
  194. package/types/search/index.d.ts +2 -0
  195. package/types/search/index.d.ts.map +1 -0
  196. package/types/services/component-props-service.d.ts +62 -57
  197. package/types/services/component-props-service.d.ts.map +1 -0
  198. package/types/sharedTypes/component-props.d.ts +62 -47
  199. package/types/sharedTypes/component-props.d.ts.map +1 -0
  200. package/types/sharedTypes/sitecore-page-props.d.ts +14 -9
  201. package/types/sharedTypes/sitecore-page-props.d.ts.map +1 -0
  202. package/types/site/index.d.ts +2 -1
  203. package/types/site/index.d.ts.map +1 -0
  204. package/types/tools/codegen/import-map.d.ts +10 -0
  205. package/types/tools/codegen/import-map.d.ts.map +1 -0
  206. package/types/tools/component-props.loader.d.ts +8 -7
  207. package/types/tools/component-props.loader.d.ts.map +1 -0
  208. package/types/tools/generate-map.d.ts +26 -24
  209. package/types/tools/generate-map.d.ts.map +1 -0
  210. package/types/tools/index.d.ts +4 -2
  211. package/types/tools/index.d.ts.map +1 -0
  212. package/types/tools/templating/byoc-component.d.ts +3 -2
  213. package/types/tools/templating/byoc-component.d.ts.map +1 -0
  214. package/types/tools/templating/constants.d.ts +5 -4
  215. package/types/tools/templating/constants.d.ts.map +1 -0
  216. package/types/tools/templating/default-component.d.ts +3 -2
  217. package/types/tools/templating/default-component.d.ts.map +1 -0
  218. package/types/tools/templating/utils.d.ts +44 -0
  219. package/types/tools/templating/utils.d.ts.map +1 -0
  220. package/types/utils/index.d.ts +4 -3
  221. package/types/utils/index.d.ts.map +1 -0
  222. package/types/utils/utils.d.ts +34 -24
  223. package/types/utils/utils.d.ts.map +1 -0
  224. package/client.js +0 -1
  225. package/codegen.js +0 -1
  226. package/config-cli.js +0 -1
  227. package/config.js +0 -1
  228. package/editing.js +0 -1
  229. package/middleware.js +0 -1
  230. package/monitoring.js +0 -1
  231. package/route-handler.js +0 -1
  232. package/site.js +0 -1
  233. package/tools.js +0 -1
  234. package/utils.js +0 -1
@@ -1,12 +1,12 @@
1
- import chalk from 'chalk';
2
- import { ComponentTemplateType } from '@sitecore-content-sdk/core/config';
3
- import { COMPONENT_FILE_EXTENSION } from './constants';
4
- /**
5
- * Next.js BYOC component boilerplate
6
- * @param {string} componentName - the component name
7
- * @returns component generated template
8
- */
9
- const generateTemplate = (componentName) => {
1
+ import chalk from 'chalk';
2
+ import { ComponentTemplateType } from '@sitecore-content-sdk/core/config';
3
+ import { COMPONENT_FILE_EXTENSION } from './constants';
4
+ /**
5
+ * Next.js BYOC component boilerplate
6
+ * @param {string} componentName - the component name
7
+ * @returns component generated template
8
+ */
9
+ const generateTemplate = (componentName) => {
10
10
  return `import React from 'react';
11
11
  import * as FEAAS from '@sitecore-feaas/clientside/react';
12
12
 
@@ -46,24 +46,24 @@ FEAAS.External.registerComponent(${componentName}, {
46
46
  },
47
47
  },
48
48
  });
49
- `;
50
- };
51
- /**
52
- * Generates a list of next steps when scaffolding a component.
53
- * @param {string} componentOutputPath - The file path where the component file is generated.
54
- * @returns {string[]} An array of strings, each representing a next step.
55
- */
56
- const getNextSteps = (componentOutputPath) => {
57
- const nextSteps = [];
58
- nextSteps.push('* Modify component registration through FEAAS.External.registerComponent if needed');
59
- if (componentOutputPath) {
60
- nextSteps.push(`* Implement the component in ${chalk.green(componentOutputPath)}`);
61
- }
62
- return nextSteps;
63
- };
64
- export const byocTemplate = {
65
- name: ComponentTemplateType.BYOC,
66
- fileExtension: COMPONENT_FILE_EXTENSION,
67
- generateTemplate,
68
- getNextSteps,
69
- };
49
+ `;
50
+ };
51
+ /**
52
+ * Generates a list of next steps when scaffolding a component.
53
+ * @param {string} componentOutputPath - The file path where the component file is generated.
54
+ * @returns {string[]} An array of strings, each representing a next step.
55
+ */
56
+ const getNextSteps = (componentOutputPath) => {
57
+ const nextSteps = [];
58
+ nextSteps.push('* Modify component registration through FEAAS.External.registerComponent if needed');
59
+ if (componentOutputPath) {
60
+ nextSteps.push(`* Implement the component in ${chalk.green(componentOutputPath)}`);
61
+ }
62
+ return nextSteps;
63
+ };
64
+ export const byocTemplate = {
65
+ name: ComponentTemplateType.BYOC,
66
+ fileExtension: COMPONENT_FILE_EXTENSION,
67
+ generateTemplate,
68
+ getNextSteps,
69
+ };
@@ -1,4 +1,4 @@
1
- /**
2
- * The file extension for nextjs components
3
- */
4
- export const COMPONENT_FILE_EXTENSION = 'tsx';
1
+ /**
2
+ * The file extension for nextjs components
3
+ */
4
+ export const COMPONENT_FILE_EXTENSION = 'tsx';
@@ -1,12 +1,12 @@
1
- import chalk from 'chalk';
2
- import { ComponentTemplateType } from '@sitecore-content-sdk/core/config';
3
- import { COMPONENT_FILE_EXTENSION } from './constants';
4
- /**
5
- * Next.js component boilerplate
6
- * @param {string} componentName - the component name
7
- * @returns component generated template
8
- */
9
- const generateTemplate = (componentName) => {
1
+ import chalk from 'chalk';
2
+ import { ComponentTemplateType } from '@sitecore-content-sdk/core/config';
3
+ import { COMPONENT_FILE_EXTENSION } from './constants';
4
+ /**
5
+ * Next.js component boilerplate
6
+ * @param {string} componentName - the component name
7
+ * @returns component generated template
8
+ */
9
+ const generateTemplate = (componentName) => {
10
10
  return `import React from 'react';
11
11
  import { ComponentParams, ComponentRendering } from '@sitecore-content-sdk/nextjs';
12
12
 
@@ -26,23 +26,23 @@ export const Default = (props: ${componentName}Props): JSX.Element => {
26
26
  </div>
27
27
  );
28
28
  };
29
- `;
30
- };
31
- /**
32
- * Generates a list of next steps when scaffolding a component.
33
- * @param {string} componentOutputPath - The file path where the component file is generated.
34
- * @returns {string[]} An array of strings, each representing a next step.
35
- */
36
- const getNextSteps = (componentOutputPath) => {
37
- const nextSteps = [];
38
- if (componentOutputPath) {
39
- nextSteps.push(`* Implement the React component in ${chalk.green(componentOutputPath)}`);
40
- }
41
- return nextSteps;
42
- };
43
- export const defaultTemplate = {
44
- name: ComponentTemplateType.DEFAULT,
45
- fileExtension: COMPONENT_FILE_EXTENSION,
46
- generateTemplate,
47
- getNextSteps,
48
- };
29
+ `;
30
+ };
31
+ /**
32
+ * Generates a list of next steps when scaffolding a component.
33
+ * @param {string} componentOutputPath - The file path where the component file is generated.
34
+ * @returns {string[]} An array of strings, each representing a next step.
35
+ */
36
+ const getNextSteps = (componentOutputPath) => {
37
+ const nextSteps = [];
38
+ if (componentOutputPath) {
39
+ nextSteps.push(`* Implement the React component in ${chalk.green(componentOutputPath)}`);
40
+ }
41
+ return nextSteps;
42
+ };
43
+ export const defaultTemplate = {
44
+ name: ComponentTemplateType.DEFAULT,
45
+ fileExtension: COMPONENT_FILE_EXTENSION,
46
+ generateTemplate,
47
+ getNextSteps,
48
+ };
@@ -0,0 +1,190 @@
1
+ import { getComponentList, } from '@sitecore-content-sdk/core/tools';
2
+ import ts from 'typescript';
3
+ import fs from 'fs';
4
+ import { defaultImportMapTemplate } from '@sitecore-content-sdk/core/tools';
5
+ /**
6
+ * Detects the Next.js router type (App Router or Pages Router) based on directory structure.
7
+ * @param {string} projectRoot - The project root directory. Defaults to current working directory.
8
+ * @returns {RouterType} 'app' if App Router is detected, 'pages' otherwise
9
+ * @internal
10
+ */
11
+ export function detectRouterType(projectRoot = process.cwd()) {
12
+ const appDirExists = fs.existsSync(`${projectRoot}/src/app`) || fs.existsSync(`${projectRoot}/app`);
13
+ const pagesDirExists = fs.existsSync(`${projectRoot}/src/pages`) || fs.existsSync(`${projectRoot}/pages`);
14
+ if (appDirExists) {
15
+ return 'app';
16
+ }
17
+ if (pagesDirExists) {
18
+ return 'pages';
19
+ }
20
+ return 'pages';
21
+ }
22
+ /**
23
+ * Detects the component type based on directives, imports, and router context.
24
+ * - Checks for 'use client' directive
25
+ * - Checks for explicit componentType export
26
+ * - Checks for server-only imports (next/headers, etc.)
27
+ * - Defaults to 'server' for App Router, 'universal' for Pages Router
28
+ * @param {string} filePath - Path to the component file
29
+ * @param {RouterType} [routerType] - Optional router type override. Auto-detected if not provided.
30
+ * @returns {ComponentType} 'server', 'client', or 'universal'
31
+ * @internal
32
+ */
33
+ export function detectComponentType(filePath, routerType) {
34
+ try {
35
+ const content = fs.readFileSync(filePath, 'utf-8');
36
+ // Parse using TypeScript AST (following patterns from import-map.ts and utils.ts)
37
+ const sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
38
+ let hasUseClientDirective = false;
39
+ let explicitComponentType = null;
40
+ let hasServerOnlyImports = false;
41
+ // Auto-detect router type if not provided
42
+ const detectedRouterType = routerType || detectRouterType();
43
+ // Track position to ensure directives come before imports/other statements
44
+ let foundFirstNonDirectiveStatement = false;
45
+ // Helper function to check if a node is a valid directive
46
+ const isValidDirective = (node) => {
47
+ return (ts.isExpressionStatement(node) &&
48
+ ts.isStringLiteral(node.expression) &&
49
+ !foundFirstNonDirectiveStatement);
50
+ };
51
+ // More comprehensive AST traversal (following patterns from import-map.ts and utils.ts)
52
+ const traverseNode = (node) => {
53
+ var _a;
54
+ // Check for 'use client'/'use server' directives (must be at top, before imports)
55
+ if (isValidDirective(node) &&
56
+ ts.isStringLiteral(node.expression)) {
57
+ const directiveText = node.expression
58
+ .text;
59
+ if (directiveText === 'use client') {
60
+ hasUseClientDirective = true;
61
+ return; // Don't mark as non-directive statement
62
+ }
63
+ if (directiveText === 'use server') {
64
+ explicitComponentType = 'server';
65
+ return; // Don't mark as non-directive statement
66
+ }
67
+ }
68
+ // Mark that we've seen a non-directive statement (imports, declarations, etc.)
69
+ if (ts.isImportDeclaration(node) ||
70
+ ts.isVariableStatement(node) ||
71
+ ts.isFunctionDeclaration(node) ||
72
+ ts.isExportDeclaration(node) ||
73
+ ts.isExportAssignment(node)) {
74
+ foundFirstNonDirectiveStatement = true;
75
+ }
76
+ // Check for import declarations with server-only modules
77
+ if (ts.isImportDeclaration(node)) {
78
+ const moduleSpecifier = node.moduleSpecifier;
79
+ if (ts.isStringLiteral(moduleSpecifier)) {
80
+ const importPath = moduleSpecifier.text;
81
+ // Expand server-only module detection
82
+ if (importPath === 'next/headers' ||
83
+ importPath === 'server-only' ||
84
+ importPath === 'next/cache' ||
85
+ importPath === 'next/cookies' ||
86
+ importPath.startsWith('node:') ||
87
+ importPath === 'fs' ||
88
+ importPath === 'path') {
89
+ hasServerOnlyImports = true;
90
+ }
91
+ }
92
+ }
93
+ // Check for explicit componentType export (improved detection)
94
+ if (ts.isVariableStatement(node)) {
95
+ const hasExportModifier = (_a = node.modifiers) === null || _a === void 0 ? void 0 : _a.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword);
96
+ if (hasExportModifier) {
97
+ node.declarationList.declarations.forEach((declaration) => {
98
+ if (ts.isIdentifier(declaration.name) &&
99
+ declaration.name.text === 'componentType' &&
100
+ declaration.initializer) {
101
+ // Handle string literal
102
+ if (ts.isStringLiteral(declaration.initializer)) {
103
+ const typeValue = declaration.initializer.text;
104
+ if (typeValue === 'server' || typeValue === 'client' || typeValue === 'universal') {
105
+ explicitComponentType = typeValue;
106
+ }
107
+ }
108
+ // Handle template literal (e.g., `client`)
109
+ else if (ts.isNoSubstitutionTemplateLiteral(declaration.initializer)) {
110
+ const typeValue = declaration.initializer.text;
111
+ if (typeValue === 'server' || typeValue === 'client' || typeValue === 'universal') {
112
+ explicitComponentType = typeValue;
113
+ }
114
+ }
115
+ }
116
+ });
117
+ }
118
+ }
119
+ // Check for named export of componentType (export const componentType = ...)
120
+ if (ts.isExportDeclaration(node) &&
121
+ node.exportClause &&
122
+ ts.isNamedExports(node.exportClause)) {
123
+ node.exportClause.elements.forEach((exportSpecifier) => {
124
+ if (exportSpecifier.name.text === 'componentType') {
125
+ // This would need additional logic to resolve the actual value, but for now
126
+ // we'll rely on the variable declaration detection above
127
+ }
128
+ });
129
+ }
130
+ // Recursively traverse child nodes (following import-map.ts pattern)
131
+ ts.forEachChild(node, traverseNode);
132
+ };
133
+ // Start traversal from the source file (following utils.ts pattern)
134
+ ts.forEachChild(sourceFile, traverseNode);
135
+ // Priority: explicit componentType export > use client/server directives > server-only imports > universal default
136
+ if (explicitComponentType) {
137
+ return explicitComponentType;
138
+ }
139
+ if (hasUseClientDirective) {
140
+ return 'client';
141
+ }
142
+ if (hasServerOnlyImports) {
143
+ return 'server';
144
+ }
145
+ // Router-aware defaults:
146
+ // - App Router: defaults to server (RSC by default)
147
+ // - Pages Router: defaults to universal (isomorphic by default)
148
+ if (detectedRouterType === 'app') {
149
+ return 'server';
150
+ }
151
+ else {
152
+ return 'universal';
153
+ }
154
+ }
155
+ catch (error) {
156
+ console.warn(`Failed to parse component file ${filePath}, defaulting to universal:`, error);
157
+ return 'universal';
158
+ }
159
+ }
160
+ /**
161
+ * Get list of components with detected types (server, client, or universal).
162
+ * @param {string[]} paths - Paths to search for components
163
+ * @param {string[]} [exclude] - Paths and glob patterns to exclude from final result
164
+ * @param {boolean} includeVariants - Whether to include variant components
165
+ * @param {RouterType} [routerType] - Optional router type override for type detection. Auto-detected if not provided.
166
+ * @returns {ComponentFileWithType[]} Array of components with their detected types
167
+ * @internal
168
+ */
169
+ export function getComponentListWithTypes(paths, exclude, includeVariants, routerType) {
170
+ const components = getComponentList(paths, exclude, includeVariants);
171
+ const detectedRouterType = routerType || detectRouterType();
172
+ return components.map((component) => (Object.assign(Object.assign({}, component), { componentType: detectComponentType(component.filePath, detectedRouterType) })));
173
+ }
174
+ /**
175
+ * React-specific import map template with 'use client' directive. Used in App Router.
176
+ * @param {Map<string, ModuleExports>} indexedImportMap import map to be processed into final import-map.client.ts file
177
+ * @returns {string} contents for resulting import map file
178
+ */
179
+ export function nextjsClientMapTemplate(indexedImportMap) {
180
+ return `'use client';
181
+ ${defaultImportMapTemplate(indexedImportMap, 'nextjs')}`;
182
+ }
183
+ /**
184
+ * React-specific import map template with 'use client' directive. Used in App Router.
185
+ * @param {Map<string, ModuleExports>} indexedImportMap import map to be processed into final import-map.client.ts file
186
+ * @returns {string} contents for resulting import map file
187
+ */
188
+ export function nextjsDefaultMapTemplate(indexedImportMap) {
189
+ return defaultImportMapTemplate(indexedImportMap, 'nextjs');
190
+ }
@@ -1,3 +1,3 @@
1
- export { handleEditorFastRefresh, extractPath, isServerSidePropsContext, parseRewriteHeader, } from './utils';
2
- export { tryParseEnvValue, resolveUrl } from '@sitecore-content-sdk/core/utils';
3
- export { isEditorActive, resetEditorChromes } from '@sitecore-content-sdk/core/editing';
1
+ export { handleEditorFastRefresh, extractPath, isServerSidePropsContext, parseRewriteHeader, } from './utils';
2
+ export { tryParseEnvValue, resolveUrl } from '@sitecore-content-sdk/core/utils';
3
+ export { isEditorActive, resetEditorChromes } from '@sitecore-content-sdk/core/editing';
@@ -1,65 +1,74 @@
1
- import { isEditorActive, resetEditorChromes } from '@sitecore-content-sdk/core/editing';
2
- import { REWRITE_HEADER_NAME } from '../middleware/middleware';
3
- /**
4
- * Since Sitecore editors do not support Fast Refresh:
5
- * 1. Subscribe on events provided by webpack.
6
- * 2. Reset editor chromes when build is finished
7
- * @param {boolean} [forceReload] force page reload instead of reset chromes
8
- */
9
- export const handleEditorFastRefresh = (forceReload = false) => {
10
- if (process.env.NODE_ENV !== 'development' || !isEditorActive()) {
11
- // Only run if development mode and editor is active
12
- return;
13
- }
14
- const eventSource = new window.EventSource('/_next/webpack-hmr');
15
- window.addEventListener('beforeunload', () => eventSource.close());
16
- eventSource.onopen = () => console.log('[Sitecore Editor Fast Refresh Listener] Online');
17
- eventSource.onmessage = (event) => {
18
- if (event.data.indexOf('{') === -1)
19
- return; // heartbeat
20
- const payload = JSON.parse(event.data);
21
- console.debug(`[Sitecore Editor Fast Refresh Listener] Saw event: ${JSON.stringify(payload)}`);
22
- if (payload.action !== 'built')
23
- return;
24
- if (forceReload)
25
- return window.location.reload();
26
- setTimeout(() => {
27
- console.log('[Sitecore Editor HMR Listener] Sitecore editor does not support Fast Refresh, reloading chromes...');
28
- resetEditorChromes();
29
- }, 500);
30
- };
31
- };
32
- export const getEditingSecret = () => {
33
- const secret = process.env.SITECORE_EDITING_SECRET;
34
- if (!secret || secret.length === 0) {
35
- throw new Error('The SITECORE_EDITING_SECRET environment variable is missing or invalid.');
36
- }
37
- return secret;
38
- };
39
- export const extractPath = (context) => {
40
- var _a;
41
- return context.params === undefined
42
- ? '/'
43
- : Array.isArray(context.params.path)
44
- ? context.params.path.join('/')
45
- : (_a = context.params.path) !== null && _a !== void 0 ? _a : '/';
46
- };
47
- /**
48
- * Determines whether context is GetServerSidePropsContext (SSR) or GetStaticPropsContext (SSG)
49
- * @param {GetServerSidePropsContext | GetStaticPropsContext} context
50
- */
51
- export const isServerSidePropsContext = (context) => {
52
- return context.req !== undefined;
53
- };
54
- /**
55
- * For App Router application, extracts the site and locale information from the rewrite header which is in format /[site]/[locale]/[...path].
56
- * @param {Headers} headers - The `Headers` object containing the rewrite header.
57
- * @returns An object containing the `site` and `locale` extracted from the rewrite header.
58
- */
59
- export const parseRewriteHeader = (headers) => {
60
- const rewriteHeader = headers.get(REWRITE_HEADER_NAME);
61
- const rewriteSegments = (rewriteHeader === null || rewriteHeader === void 0 ? void 0 : rewriteHeader.split('/').filter((segment) => segment)) || [];
62
- const site = rewriteSegments[0];
63
- const locale = rewriteSegments[1];
64
- return { site, locale };
65
- };
1
+ import { isEditorActive, resetEditorChromes } from '@sitecore-content-sdk/core/editing';
2
+ import { REWRITE_HEADER_NAME } from '../middleware/middleware';
3
+ /**
4
+ * Since Sitecore editors do not support Fast Refresh:
5
+ * 1. Subscribe on events provided by webpack.
6
+ * 2. Reset editor chromes when build is finished
7
+ * @param {boolean} [forceReload] force page reload instead of reset chromes
8
+ * @public
9
+ */
10
+ export const handleEditorFastRefresh = (forceReload = false) => {
11
+ if (process.env.NODE_ENV !== 'development' || !isEditorActive()) {
12
+ // Only run if development mode and editor is active
13
+ return;
14
+ }
15
+ const eventSource = new window.EventSource('/_next/webpack-hmr');
16
+ window.addEventListener('beforeunload', () => eventSource.close());
17
+ eventSource.onopen = () => console.log('[Sitecore Editor Fast Refresh Listener] Online');
18
+ eventSource.onmessage = (event) => {
19
+ if (event.data.indexOf('{') === -1)
20
+ return; // heartbeat
21
+ const payload = JSON.parse(event.data);
22
+ console.debug(`[Sitecore Editor Fast Refresh Listener] Saw event: ${JSON.stringify(payload)}`);
23
+ if (payload.action !== 'built')
24
+ return;
25
+ if (forceReload)
26
+ return window.location.reload();
27
+ setTimeout(() => {
28
+ console.log('[Sitecore Editor HMR Listener] Sitecore editor does not support Fast Refresh, reloading chromes...');
29
+ resetEditorChromes();
30
+ }, 500);
31
+ };
32
+ };
33
+ export const getEditingSecret = () => {
34
+ const secret = process.env.SITECORE_EDITING_SECRET;
35
+ if (!secret || secret.length === 0) {
36
+ throw new Error('The SITECORE_EDITING_SECRET environment variable is missing or invalid.');
37
+ }
38
+ return secret;
39
+ };
40
+ /**
41
+ * Extracts the path from the Next.js context parameters.
42
+ * @param {GetStaticPropsContext | GetServerSidePropsContext} context - The Next.js context parameters.
43
+ * @returns The extracted path.
44
+ * @public
45
+ */
46
+ export const extractPath = (context) => {
47
+ var _a;
48
+ return context.params === undefined
49
+ ? '/'
50
+ : Array.isArray(context.params.path)
51
+ ? context.params.path.join('/')
52
+ : (_a = context.params.path) !== null && _a !== void 0 ? _a : '/';
53
+ };
54
+ /**
55
+ * Determines whether context is GetServerSidePropsContext (SSR) or GetStaticPropsContext (SSG)
56
+ * @param {GetServerSidePropsContext | GetStaticPropsContext} context
57
+ * @public
58
+ */
59
+ export const isServerSidePropsContext = (context) => {
60
+ return context.req !== undefined;
61
+ };
62
+ /**
63
+ * For App Router application, extracts the site and locale information from the rewrite header which is in format /[site]/[locale]/[...path].
64
+ * @param {Headers} headers - The `Headers` object containing the rewrite header.
65
+ * @returns An object containing the `site` and `locale` extracted from the rewrite header.
66
+ * @public
67
+ */
68
+ export const parseRewriteHeader = (headers) => {
69
+ const rewriteHeader = headers.get(REWRITE_HEADER_NAME);
70
+ const rewriteSegments = (rewriteHeader === null || rewriteHeader === void 0 ? void 0 : rewriteHeader.split('/').filter((segment) => segment)) || [];
71
+ const site = rewriteSegments[0];
72
+ const locale = rewriteSegments[1];
73
+ return { site, locale };
74
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sitecore-content-sdk/nextjs",
3
- "version": "1.3.0-canary.9",
3
+ "version": "1.4.0-canary.2",
4
4
  "main": "dist/cjs/index.js",
5
5
  "module": "dist/esm/index.js",
6
6
  "sideEffects": false,
@@ -15,7 +15,9 @@
15
15
  "test": "mocha --require ./test/setup.js \"./src/**/*.test.ts\" \"./src/**/*.test.tsx\" --exit",
16
16
  "prepublishOnly": "npm run build",
17
17
  "coverage": "nyc npm test",
18
- "generate-docs": "npx typedoc --plugin typedoc-plugin-markdown --outputFileStrategy Members --parametersFormat table --readme none --out ../../ref-docs/nextjs --entryPoints src/index.ts --entryPoints src/monitoring/index.ts --entryPoints src/editing/index.ts --entryPoints src/middleware/index.ts --entryPoints src/context/index.ts --entryPoints src/utils/index.ts --entryPoints src/site/index.ts --entryPoints src/client/index.ts --entryPoints src/tools/index.ts --entryPoints src/editing/codegen/index.ts --entryPoints src/route-handler/index.ts --githubPages false"
18
+ "generate-docs": "npx typedoc --plugin typedoc-plugin-markdown --outputFileStrategy Members --parametersFormat table --readme none --out ../../ref-docs/nextjs --entryPoints src/index.ts --entryPoints src/monitoring/index.ts --entryPoints src/editing/index.ts --entryPoints src/middleware/index.ts --entryPoints src/context/index.ts --entryPoints src/utils/index.ts --entryPoints src/site/index.ts --entryPoints src/client/index.ts --entryPoints src/tools/index.ts --entryPoints src/editing/codegen/index.ts --entryPoints src/route-handler/index.ts --githubPages false",
19
+ "api-extractor": "npm run build && api-extractor run --local --verbose",
20
+ "api-extractor:verify": "api-extractor run"
19
21
  },
20
22
  "engines": {
21
23
  "node": ">=22"
@@ -40,8 +42,8 @@
40
42
  "@types/mocha": "^10.0.10",
41
43
  "@types/node": "~22.15.14",
42
44
  "@types/proxyquire": "^1.3.31",
43
- "@types/react": "^19.1.3",
44
- "@types/react-dom": "^19.1.3",
45
+ "@types/react": "^19.2.7",
46
+ "@types/react-dom": "^19.2.3",
45
47
  "@types/sinon": "^17.0.4",
46
48
  "@types/sinon-chai": "^3.2.9",
47
49
  "@typescript-eslint/eslint-plugin": "8.39.0",
@@ -61,13 +63,13 @@
61
63
  "glob": "^11.0.2",
62
64
  "jsdom": "^26.1.0",
63
65
  "mocha": "^11.2.2",
64
- "next": "^15.3.2",
66
+ "next": "^15.5.7",
65
67
  "nock": "14.0.0-beta.7",
66
68
  "nyc": "^17.1.0",
67
69
  "prettier": "^2.8.0",
68
70
  "proxyquire": "^2.1.3",
69
- "react": "^19.1.0",
70
- "react-dom": "^19.1.0",
71
+ "react": "^19.2.1",
72
+ "react-dom": "^19.2.1",
71
73
  "sinon": "^20.0.0",
72
74
  "sinon-chai": "^3.7.0",
73
75
  "ts-node": "^10.9.2",
@@ -77,9 +79,9 @@
77
79
  "@sitecore-cloudsdk/core": "^0.5.1",
78
80
  "@sitecore-cloudsdk/events": "^0.5.1",
79
81
  "@sitecore-cloudsdk/personalize": "^0.5.1",
80
- "next": "^15.3.2",
81
- "react": "^19.1.0",
82
- "react-dom": "^19.1.0",
82
+ "next": "^15.5.7",
83
+ "react": "^19.2.1",
84
+ "react-dom": "^19.2.1",
83
85
  "typescript": "^5.4.0"
84
86
  },
85
87
  "peerDependenciesMeta": {
@@ -89,15 +91,87 @@
89
91
  },
90
92
  "dependencies": {
91
93
  "@babel/parser": "^7.27.2",
92
- "@sitecore-content-sdk/core": "1.3.0-canary.9",
93
- "@sitecore-content-sdk/react": "1.3.0-canary.9",
94
+ "@sitecore-content-sdk/core": "1.4.0-canary.2",
95
+ "@sitecore-content-sdk/react": "1.4.0-canary.2",
94
96
  "recast": "^0.23.11",
95
97
  "regex-parser": "^2.3.1",
96
98
  "sync-disk-cache": "^2.1.0"
97
99
  },
100
+ "exports": {
101
+ ".": {
102
+ "import": "./dist/esm/index.js",
103
+ "require": "./dist/cjs/index.js",
104
+ "types": "./types/index.d.ts"
105
+ },
106
+ "./client": {
107
+ "import": "./dist/esm/client/index.js",
108
+ "require": "./dist/cjs/client/index.js",
109
+ "types": "./types/client/index.d.ts"
110
+ },
111
+ "./codegen": {
112
+ "import": "./dist/esm/editing/codegen/index.js",
113
+ "require": "./dist/cjs/editing/codegen/index.js",
114
+ "types": "./types/editing/codegen/index.d.ts"
115
+ },
116
+ "./component-props-loader": {
117
+ "import": "./dist/esm/component-props-loader/index.js",
118
+ "require": "./dist/cjs/component-props-loader/index.js",
119
+ "types": "./types/component-props-loader/index.d.ts"
120
+ },
121
+ "./config": {
122
+ "import": "./dist/esm/config/index.js",
123
+ "require": "./dist/cjs/config/index.js",
124
+ "types": "./types/config/index.d.ts"
125
+ },
126
+ "./config-cli": {
127
+ "import": "./dist/esm/config-cli/index.js",
128
+ "require": "./dist/cjs/config-cli/index.js",
129
+ "types": "./types/config-cli/index.d.ts"
130
+ },
131
+ "./editing": {
132
+ "import": "./dist/esm/editing/index.js",
133
+ "require": "./dist/cjs/editing/index.js",
134
+ "types": "./types/editing/index.d.ts"
135
+ },
136
+ "./middleware": {
137
+ "import": "./dist/esm/middleware/index.js",
138
+ "require": "./dist/cjs/middleware/index.js",
139
+ "types": "./types/middleware/index.d.ts"
140
+ },
141
+ "./monitoring": {
142
+ "import": "./dist/esm/monitoring/index.js",
143
+ "require": "./dist/cjs/monitoring/index.js",
144
+ "types": "./types/monitoring/index.d.ts"
145
+ },
146
+ "./route-handler": {
147
+ "import": "./dist/esm/route-handler/index.js",
148
+ "require": "./dist/cjs/route-handler/index.js",
149
+ "types": "./types/route-handler/index.d.ts"
150
+ },
151
+ "./search": {
152
+ "import": "./dist/esm/search/index.js",
153
+ "require": "./dist/cjs/search/index.js",
154
+ "types": "./types/search/index.d.ts"
155
+ },
156
+ "./site": {
157
+ "import": "./dist/esm/site/index.js",
158
+ "require": "./dist/cjs/site/index.js",
159
+ "types": "./types/site/index.d.ts"
160
+ },
161
+ "./tools": {
162
+ "import": "./dist/esm/tools/index.js",
163
+ "require": "./dist/cjs/tools/index.js",
164
+ "types": "./types/tools/index.d.ts"
165
+ },
166
+ "./utils": {
167
+ "import": "./dist/esm/utils/index.js",
168
+ "require": "./dist/cjs/utils/index.js",
169
+ "types": "./types/utils/index.d.ts"
170
+ }
171
+ },
98
172
  "description": "",
99
173
  "types": "types/index.d.ts",
100
- "gitHead": "0d8d7e51f8e2936401b42dd3ace082abf748a27a",
174
+ "gitHead": "a566163f138188b5b3d22dbf2d87f373a1eb0715",
101
175
  "files": [
102
176
  "dist",
103
177
  "types",
package/search.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './types/search/index';
@@ -1,2 +1,3 @@
1
- export { GraphQLClientError, RetryStrategy, DefaultRetryStrategy, GraphQLRequestClient, GraphQLRequestClientFactory, GraphQLRequestClientFactoryConfig, getEdgeProxyContentUrl, createGraphQLClientFactory, SitecoreClientInit, } from '@sitecore-content-sdk/core/client';
2
- export { SitecoreNextjsClient as SitecoreClient } from './sitecore-nextjs-client';
1
+ export { GraphQLClientError, RetryStrategy, DefaultRetryStrategy, GraphQLRequestClient, GraphQLRequestClientFactory, GraphQLRequestClientFactoryConfig, getEdgeProxyContentUrl, createGraphQLClientFactory, SitecoreClientInit, } from '@sitecore-content-sdk/core/client';
2
+ export { SitecoreNextjsClient as SitecoreClient } from './sitecore-nextjs-client';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,2BAA2B,EAC3B,iCAAiC,EACjC,sBAAsB,EACtB,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,oBAAoB,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAC"}