@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,295 +1,295 @@
1
- import { detectRouterType, getComponentListWithTypes, filterComponentsByType, } from '@sitecore-content-sdk/core/tools';
2
- import * as path from 'path';
3
- import * as fs from 'fs';
4
- // Common builder for Next.js component map content
5
- const prepareComponentsForMap = (components, opts) => {
6
- const groups = new Map();
7
- const getPrefix = (name) => {
8
- const index = name.indexOf('.');
9
- return index === -1 ? name : name.slice(0, index);
10
- };
11
- for (const file of components) {
12
- const dir = path.dirname(file.filePath).replace(/\\/g, '/');
13
- const prefix = getPrefix(file.componentName);
14
- const key = `${dir}::${prefix}`;
15
- let group = groups.get(key);
16
- if (!group) {
17
- group = { dir, prefix, neighbors: [] };
18
- groups.set(key, group);
19
- }
20
- if (file.componentName === prefix)
21
- group.base = file;
22
- else
23
- group.neighbors.push(file);
24
- }
25
- const entries = [];
26
- for (const group of groups.values()) {
27
- const imports = [];
28
- if (opts.includeVariants) {
29
- const spreads = [];
30
- for (const neighbor of group.neighbors) {
31
- imports.push(`import * as ${neighbor.moduleName} from '${neighbor.importPath}';`);
32
- spreads.push(`...${neighbor.moduleName}`);
33
- }
34
- if (group.base) {
35
- imports.push(`import * as ${group.base.moduleName} from '${group.base.importPath}';`);
36
- spreads.push(`...${group.base.moduleName}`);
37
- }
38
- const annotateClient = !!group.base && 'componentType' in group.base && group.base.componentType === 'client';
39
- let valueExpr;
40
- if (spreads.length) {
41
- valueExpr = spreads.join(', ');
42
- }
43
- else {
44
- valueExpr = group.base
45
- ? group.base.moduleName
46
- : group.neighbors[0].moduleName;
47
- }
48
- entries.push({
49
- key: group.prefix,
50
- imports,
51
- valueExpr,
52
- annotateClient,
53
- });
54
- }
55
- else {
56
- // Variants disabled: single entry per group
57
- if (group.base) {
58
- imports.push(`import * as ${group.base.moduleName} from '${group.base.importPath}';`);
59
- const annotateClient = 'componentType' in group.base && group.base.componentType === 'client';
60
- entries.push({
61
- key: group.prefix,
62
- imports,
63
- valueExpr: group.base.moduleName,
64
- annotateClient,
65
- });
66
- }
67
- else if (group.neighbors.length) {
68
- const first = group.neighbors[0];
69
- imports.push(`import * as ${first.moduleName} from '${first.importPath}';`);
70
- entries.push({
71
- key: group.prefix,
72
- imports,
73
- valueExpr: first.moduleName,
74
- annotateClient: false,
75
- });
76
- }
77
- }
78
- }
79
- return entries;
80
- };
81
- const buildNextjsMapContent = (entries, componentImports, options = {}) => {
82
- const { headerComment = "Below are built-in components that are available in the app, it's recommended to keep them as is", isClientMap = false, } = options;
83
- const wildcardImports = [];
84
- const namedImports = [];
85
- const builtInImports = options.builtInImports ||
1
+ import { filterComponentsByType, } from '@sitecore-content-sdk/core/tools';
2
+ import * as path from 'path';
3
+ import * as fs from 'fs';
4
+ import { detectRouterType, getComponentListWithTypes } from './templating/utils';
5
+ // Common builder for Next.js component map content
6
+ const prepareComponentsForMap = (components, opts) => {
7
+ const groups = new Map();
8
+ const getPrefix = (name) => {
9
+ const index = name.indexOf('.');
10
+ return index === -1 ? name : name.slice(0, index);
11
+ };
12
+ for (const file of components) {
13
+ const dir = path.dirname(file.filePath).replace(/\\/g, '/');
14
+ const prefix = getPrefix(file.componentName);
15
+ const key = `${dir}::${prefix}`;
16
+ let group = groups.get(key);
17
+ if (!group) {
18
+ group = { dir, prefix, neighbors: [] };
19
+ groups.set(key, group);
20
+ }
21
+ if (file.componentName === prefix)
22
+ group.base = file;
23
+ else
24
+ group.neighbors.push(file);
25
+ }
26
+ const entries = [];
27
+ for (const group of groups.values()) {
28
+ const imports = [];
29
+ if (opts.includeVariants) {
30
+ const spreads = [];
31
+ for (const neighbor of group.neighbors) {
32
+ imports.push(`import * as ${neighbor.moduleName} from '${neighbor.importPath}';`);
33
+ spreads.push(`...${neighbor.moduleName}`);
34
+ }
35
+ if (group.base) {
36
+ imports.push(`import * as ${group.base.moduleName} from '${group.base.importPath}';`);
37
+ spreads.push(`...${group.base.moduleName}`);
38
+ }
39
+ const annotateClient = !!group.base && 'componentType' in group.base && group.base.componentType === 'client';
40
+ let valueExpr;
41
+ if (spreads.length) {
42
+ valueExpr = spreads.join(', ');
43
+ }
44
+ else {
45
+ valueExpr = group.base ? group.base.moduleName : group.neighbors[0].moduleName;
46
+ }
47
+ entries.push({
48
+ key: group.prefix,
49
+ imports,
50
+ valueExpr,
51
+ annotateClient,
52
+ });
53
+ }
54
+ else {
55
+ // Variants disabled: single entry per group
56
+ if (group.base) {
57
+ imports.push(`import * as ${group.base.moduleName} from '${group.base.importPath}';`);
58
+ const annotateClient = 'componentType' in group.base && group.base.componentType === 'client';
59
+ entries.push({
60
+ key: group.prefix,
61
+ imports,
62
+ valueExpr: group.base.moduleName,
63
+ annotateClient,
64
+ });
65
+ }
66
+ else if (group.neighbors.length) {
67
+ const first = group.neighbors[0];
68
+ imports.push(`import * as ${first.moduleName} from '${first.importPath}';`);
69
+ entries.push({
70
+ key: group.prefix,
71
+ imports,
72
+ valueExpr: first.moduleName,
73
+ annotateClient: false,
74
+ });
75
+ }
76
+ }
77
+ }
78
+ return entries;
79
+ };
80
+ const buildNextjsMapContent = (entries, componentImports, options = {}) => {
81
+ const { headerComment = "Below are built-in components that are available in the app, it's recommended to keep them as is", isClientMap = false, } = options;
82
+ const wildcardImports = [];
83
+ const namedImports = [];
84
+ const builtInImports = options.builtInImports ||
86
85
  `
87
86
  import { BYOCWrapper, NextjsContentSdkComponent, FEaaSWrapper } from '@sitecore-content-sdk/nextjs';
88
87
  import { Form } from '@sitecore-content-sdk/nextjs';
89
- `;
90
- const builtInMapEntries = options.builtInMapEntries || [
91
- `['BYOCWrapper', BYOCWrapper]`,
92
- `['FEaaSWrapper', FEaaSWrapper]`,
93
- `['Form', Form]`,
94
- ];
95
- // Add per-entry imports
96
- entries.forEach((e) => wildcardImports.push(...e.imports));
97
- // Handle package imports
98
- componentImports === null || componentImports === void 0 ? void 0 : componentImports.forEach((pkg) => {
99
- if (pkg.importInfo.namedImports) {
100
- namedImports.push(`import { ${pkg.importInfo.namedImports.join(', ')} } from '${pkg.importInfo.importFrom}';`);
101
- }
102
- else {
103
- wildcardImports.push(`import * as ${pkg.importName} from '${pkg.importInfo.importFrom}';`);
104
- }
105
- });
106
- const importLines = [
107
- headerComment.includes('built-in') ? '// end of built-in components' : null,
108
- ...wildcardImports,
109
- ...namedImports,
110
- ].filter(Boolean);
111
- const importsSection = importLines.length ? `\n${importLines.join('\n')}` : '';
112
- // Build entry lines (package named imports are appended below)
113
- const componentMapEntries = builtInMapEntries;
114
- for (const e of entries) {
115
- const value = !isClientMap && e.annotateClient
116
- ? `{ ${e.valueExpr}, componentType: 'client' }`
117
- : e.valueExpr.includes('...')
118
- ? `{ ${e.valueExpr} }`
119
- : e.valueExpr;
120
- componentMapEntries.push(`['${e.key}', ${value}]`);
121
- }
122
- // Add package-based entries
123
- componentImports === null || componentImports === void 0 ? void 0 : componentImports.forEach((pkg) => {
124
- if (pkg.importInfo.namedImports) {
125
- pkg.importInfo.namedImports.forEach((name) => {
126
- componentMapEntries.push(`['${name}', ${name}]`);
127
- });
128
- }
129
- else {
130
- componentMapEntries.push(`['${pkg.importName}', ${pkg.importName}]`);
131
- }
132
- });
88
+ `;
89
+ const builtInMapEntries = options.builtInMapEntries || [
90
+ `['BYOCWrapper', BYOCWrapper]`,
91
+ `['FEaaSWrapper', FEaaSWrapper]`,
92
+ `['Form', Form]`,
93
+ ];
94
+ // Add per-entry imports
95
+ entries.forEach((e) => wildcardImports.push(...e.imports));
96
+ // Handle package imports
97
+ componentImports === null || componentImports === void 0 ? void 0 : componentImports.forEach((pkg) => {
98
+ if (pkg.importInfo.namedImports) {
99
+ namedImports.push(`import { ${pkg.importInfo.namedImports.join(', ')} } from '${pkg.importInfo.importFrom}';`);
100
+ }
101
+ else {
102
+ wildcardImports.push(`import * as ${pkg.importName} from '${pkg.importInfo.importFrom}';`);
103
+ }
104
+ });
105
+ const importLines = [
106
+ headerComment.includes('built-in') ? '// end of built-in components' : null,
107
+ ...wildcardImports,
108
+ ...namedImports,
109
+ ].filter(Boolean);
110
+ const importsSection = importLines.length ? `\n${importLines.join('\n')}` : '';
111
+ // Build entry lines (package named imports are appended below)
112
+ const componentMapEntries = builtInMapEntries;
113
+ for (const e of entries) {
114
+ const value = !isClientMap && e.annotateClient
115
+ ? `{ ${e.valueExpr}, componentType: 'client' }`
116
+ : e.valueExpr.includes('...')
117
+ ? `{ ${e.valueExpr} }`
118
+ : e.valueExpr;
119
+ componentMapEntries.push(`['${e.key}', ${value}]`);
120
+ }
121
+ // Add package-based entries
122
+ componentImports === null || componentImports === void 0 ? void 0 : componentImports.forEach((pkg) => {
123
+ if (pkg.importInfo.namedImports) {
124
+ pkg.importInfo.namedImports.forEach((name) => {
125
+ componentMapEntries.push(`['${name}', ${name}]`);
126
+ });
127
+ }
128
+ else {
129
+ componentMapEntries.push(`['${pkg.importName}', ${pkg.importName}]`);
130
+ }
131
+ });
133
132
  return `// ${headerComment}
134
133
  ${builtInImports}${importsSection}
135
134
 
136
135
  export const componentMap = new Map<string, NextjsContentSdkComponent>([
137
- ${componentMapEntries
138
- .map((component) => {
139
- return ` ${component},\n`;
140
- })
136
+ ${componentMapEntries
137
+ .map((component) => {
138
+ return ` ${component},\n`;
139
+ })
141
140
  .join('')}]);
142
141
 
143
142
  export default componentMap;
144
- `;
145
- };
146
- // default client template
147
- export const defaultClientMapTemplate = (components, componentImports, ctx) => {
148
- var _a, _b;
143
+ `;
144
+ };
145
+ // default client template
146
+ export const defaultClientMapTemplate = (components, componentImports, ctx) => {
147
+ var _a, _b;
149
148
  const builtInImports = `
150
149
  import { BYOCClientWrapper, NextjsContentSdkComponent, FEaaSClientWrapper } from '@sitecore-content-sdk/nextjs';
151
150
  import { Form } from '@sitecore-content-sdk/nextjs';
152
- `;
153
- const builtInMapEntries = [
154
- `['BYOCWrapper', BYOCClientWrapper]`,
155
- `['FEaaSWrapper', FEaaSClientWrapper]`,
156
- `['Form', Form]`,
157
- ];
158
- const entries = (_a = ctx === null || ctx === void 0 ? void 0 : ctx.entries) !== null && _a !== void 0 ? _a : prepareComponentsForMap(components, {
159
- includeVariants: (_b = ctx === null || ctx === void 0 ? void 0 : ctx.includeVariants) !== null && _b !== void 0 ? _b : true,
160
- });
161
- return buildNextjsMapContent(entries, componentImports, {
162
- headerComment: 'Client-safe component map for App Router',
163
- isClientMap: true,
164
- builtInImports,
165
- builtInMapEntries,
166
- });
167
- };
168
- // Collect components from specified paths, apply exclude and type filter, and prepare map entries.
169
- const collectComponents = (opts) => {
170
- const withTypes = getComponentListWithTypes(opts.paths, opts.exclude, opts.includeVariants);
171
- const filtered = opts.filter === 'client'
172
- ? filterComponentsByType(withTypes, ['client', 'universal'])
173
- : withTypes;
174
- for (const file of filtered) {
175
- console.debug(`Registering Content SDK component ${file.componentName}`);
176
- }
177
- return {
178
- raw: filtered,
179
- entries: prepareComponentsForMap(filtered, { includeVariants: opts.includeVariants }),
180
- };
181
- };
182
- /**
183
- * Generate and write componentMap.ts files based on provided params.
184
- *
185
- * When clientComponentMap is true, generates:
186
- * - component-map.ts : Full component map with all components (server, client, universal)
187
- * - component-map.client.ts : Client-safe map with only client + universal components
188
- *
189
- * When clientComponentMap is false, generates:
190
- * - component-map.ts : Single component map (traditional behavior)
191
- *
192
- * When includeVariants is true (in either mode):
193
- * - Includes component **variants** in the generated map(s) alongside base components
194
- * - Preserves the same client/server filtering rules (variants obey clientComponentMap filtering)
195
- * - Variant entries are emitted using the same naming/keys convention as their base components
196
- *
197
- * Template Customization:
198
- * - mapTemplate: Custom template for main component map (works for both single and dual map modes)
199
- * - clientMapTemplate: Custom template for client component map (only used when clientComponentMap is true)
200
- * @param {GenerateMapArgs} param0 params for generateMap
201
- */
202
- export const generateMap = ({ paths, destination = '.sitecore', exclude, componentImports, mapTemplate, clientMapTemplate, clientComponentMap, includeVariants = true, }) => {
203
- const isAppRouter = detectRouterType() === 'app';
204
- const shouldGenerateClientMap = clientComponentMap !== null && clientComponentMap !== void 0 ? clientComponentMap : isAppRouter;
205
- if (shouldGenerateClientMap) {
206
- // App Router case, main map
207
- const getComponents = collectComponents({ paths, exclude, includeVariants, filter: 'all' });
208
- let mainContent;
209
- if (mapTemplate) {
210
- mainContent = mapTemplate(getComponents.raw, componentImports, {
211
- entries: getComponents.entries,
212
- includeVariants,
213
- isClientMap: false,
214
- });
215
- }
216
- else {
217
- // default app router server map
151
+ `;
152
+ const builtInMapEntries = [
153
+ `['BYOCWrapper', BYOCClientWrapper]`,
154
+ `['FEaaSWrapper', FEaaSClientWrapper]`,
155
+ `['Form', Form]`,
156
+ ];
157
+ const entries = (_a = ctx === null || ctx === void 0 ? void 0 : ctx.entries) !== null && _a !== void 0 ? _a : prepareComponentsForMap(components, {
158
+ includeVariants: (_b = ctx === null || ctx === void 0 ? void 0 : ctx.includeVariants) !== null && _b !== void 0 ? _b : true,
159
+ });
160
+ return buildNextjsMapContent(entries, componentImports, {
161
+ headerComment: 'Client-safe component map for App Router',
162
+ isClientMap: true,
163
+ builtInImports,
164
+ builtInMapEntries,
165
+ });
166
+ };
167
+ // Collect components from specified paths, apply exclude and type filter, and prepare map entries.
168
+ const collectComponents = (opts) => {
169
+ const withTypes = getComponentListWithTypes(opts.paths, opts.exclude, opts.includeVariants);
170
+ const filtered = opts.filter === 'client'
171
+ ? filterComponentsByType(withTypes, ['client', 'universal'])
172
+ : withTypes;
173
+ for (const file of filtered) {
174
+ console.debug(`Registering Content SDK component ${file.componentName}`);
175
+ }
176
+ return {
177
+ raw: filtered,
178
+ entries: prepareComponentsForMap(filtered, { includeVariants: opts.includeVariants }),
179
+ };
180
+ };
181
+ /**
182
+ * Generate and write componentMap.ts files based on provided params.
183
+ *
184
+ * When clientComponentMap is true, generates:
185
+ * - component-map.ts : Full component map with all components (server, client, universal)
186
+ * - component-map.client.ts : Client-safe map with only client + universal components
187
+ *
188
+ * When clientComponentMap is false, generates:
189
+ * - component-map.ts : Single component map (traditional behavior)
190
+ *
191
+ * When includeVariants is true (in either mode):
192
+ * - Includes component **variants** in the generated map(s) alongside base components
193
+ * - Preserves the same client/server filtering rules (variants obey clientComponentMap filtering)
194
+ * - Variant entries are emitted using the same naming/keys convention as their base components
195
+ *
196
+ * Template Customization:
197
+ * - mapTemplate: Custom template for main component map (works for both single and dual map modes)
198
+ * - clientMapTemplate: Custom template for client component map (only used when clientComponentMap is true)
199
+ * @param {GenerateMapArgs} params - The parameters for the generateMap function.
200
+ * @public
201
+ */
202
+ export const generateMap = ({ paths, destination = '.sitecore', exclude, componentImports, mapTemplate, clientMapTemplate, clientComponentMap, includeVariants = true, }) => {
203
+ const isAppRouter = detectRouterType() === 'app';
204
+ const shouldGenerateClientMap = clientComponentMap !== null && clientComponentMap !== void 0 ? clientComponentMap : isAppRouter;
205
+ if (shouldGenerateClientMap) {
206
+ // App Router case, main map
207
+ const getComponents = collectComponents({ paths, exclude, includeVariants, filter: 'all' });
208
+ let mainContent;
209
+ if (mapTemplate) {
210
+ mainContent = mapTemplate(getComponents.raw, componentImports, {
211
+ entries: getComponents.entries,
212
+ includeVariants,
213
+ isClientMap: false,
214
+ });
215
+ }
216
+ else {
217
+ // default app router server map
218
218
  const builtInImports = `
219
219
  import { BYOCServerWrapper, NextjsContentSdkComponent, FEaaSServerWrapper } from '@sitecore-content-sdk/nextjs';
220
220
  import { Form } from '@sitecore-content-sdk/nextjs';
221
- `;
222
- const builtInMapEntries = [
223
- `['BYOCWrapper', BYOCServerWrapper]`,
224
- `['FEaaSWrapper', FEaaSServerWrapper]`,
225
- `['Form', Form]`,
226
- ];
227
- mainContent = buildNextjsMapContent(getComponents.entries, componentImports, {
228
- headerComment: "Below are built-in components that are available in the app, it's recommended to keep them as is",
229
- isClientMap: false,
230
- builtInImports,
231
- builtInMapEntries,
232
- });
233
- }
234
- fs.writeFileSync(path.join(process.cwd(), destination, 'component-map.ts'), mainContent, 'utf8');
235
- // App Router, client map
236
- const clientComponents = collectComponents({
237
- paths,
238
- exclude,
239
- includeVariants,
240
- filter: 'client',
241
- });
242
- const clientTemplate = clientMapTemplate || defaultClientMapTemplate;
243
- let clientContent;
244
- if (clientTemplate.length >= 2) {
245
- clientContent = clientTemplate(clientComponents.raw, componentImports);
246
- }
247
- else {
248
- clientContent = clientTemplate(clientComponents.raw, componentImports, {
249
- entries: clientComponents.entries,
250
- includeVariants,
251
- isClientMap: true,
252
- });
253
- }
254
- fs.writeFileSync(path.join(process.cwd(), destination, 'component-map.client.ts'), clientContent, 'utf8');
255
- }
256
- else {
257
- // Either in pages/app router or clientComponentMap = false
258
- const components = collectComponents({
259
- paths,
260
- exclude,
261
- includeVariants,
262
- filter: 'all',
263
- }).entries;
264
- const content = buildNextjsMapContent(components, componentImports, {
265
- headerComment: "Below are built-in components that are available in the app, it's recommended to keep them as is",
266
- isClientMap: false,
267
- });
268
- fs.writeFileSync(path.join(process.cwd(), destination, 'component-map.ts'), content, 'utf8');
269
- // For App Router compatibility, always generate client map file even when clientComponentMap is false
270
- // When clientComponentMap is false, only include built-in components (no custom client components)
271
- if (shouldGenerateClientMap || isAppRouter) {
272
- const clientMapTemplateToUse = clientMapTemplate || defaultClientMapTemplate;
273
- const components = collectComponents({ paths: [], includeVariants, filter: 'all' });
274
- let clientMapContent;
275
- if (clientMapTemplateToUse.length >= 2) {
276
- clientMapContent = clientMapTemplateToUse([], componentImports);
277
- }
278
- else {
279
- clientMapContent = clientMapTemplateToUse([], componentImports, {
280
- entries: components.entries,
281
- includeVariants,
282
- isClientMap: true,
283
- });
284
- }
285
- const clientMapFile = path.join(process.cwd(), destination, 'component-map.client.ts');
286
- try {
287
- fs.writeFileSync(clientMapFile, clientMapContent, { encoding: 'utf8' });
288
- }
289
- catch (error) {
290
- console.error(`Client Component Map generation failed. Error writing to file ${destination}:`, error);
291
- throw error;
292
- }
293
- }
294
- }
295
- };
221
+ `;
222
+ const builtInMapEntries = [
223
+ `['BYOCWrapper', BYOCServerWrapper]`,
224
+ `['FEaaSWrapper', FEaaSServerWrapper]`,
225
+ `['Form', Form]`,
226
+ ];
227
+ mainContent = buildNextjsMapContent(getComponents.entries, componentImports, {
228
+ headerComment: "Below are built-in components that are available in the app, it's recommended to keep them as is",
229
+ isClientMap: false,
230
+ builtInImports,
231
+ builtInMapEntries,
232
+ });
233
+ }
234
+ fs.writeFileSync(path.join(process.cwd(), destination, 'component-map.ts'), mainContent, 'utf8');
235
+ // App Router, client map
236
+ const clientComponents = collectComponents({
237
+ paths,
238
+ exclude,
239
+ includeVariants,
240
+ filter: 'client',
241
+ });
242
+ const clientTemplate = clientMapTemplate || defaultClientMapTemplate;
243
+ let clientContent;
244
+ if (clientTemplate.length >= 2) {
245
+ clientContent = clientTemplate(clientComponents.raw, componentImports);
246
+ }
247
+ else {
248
+ clientContent = clientTemplate(clientComponents.raw, componentImports, {
249
+ entries: clientComponents.entries,
250
+ includeVariants,
251
+ isClientMap: true,
252
+ });
253
+ }
254
+ fs.writeFileSync(path.join(process.cwd(), destination, 'component-map.client.ts'), clientContent, 'utf8');
255
+ }
256
+ else {
257
+ // Either in pages/app router or clientComponentMap = false
258
+ const components = collectComponents({
259
+ paths,
260
+ exclude,
261
+ includeVariants,
262
+ filter: 'all',
263
+ }).entries;
264
+ const content = buildNextjsMapContent(components, componentImports, {
265
+ headerComment: "Below are built-in components that are available in the app, it's recommended to keep them as is",
266
+ isClientMap: false,
267
+ });
268
+ fs.writeFileSync(path.join(process.cwd(), destination, 'component-map.ts'), content, 'utf8');
269
+ // For App Router compatibility, always generate client map file even when clientComponentMap is false
270
+ // When clientComponentMap is false, only include built-in components (no custom client components)
271
+ if (shouldGenerateClientMap || isAppRouter) {
272
+ const clientMapTemplateToUse = clientMapTemplate || defaultClientMapTemplate;
273
+ const components = collectComponents({ paths: [], includeVariants, filter: 'all' });
274
+ let clientMapContent;
275
+ if (clientMapTemplateToUse.length >= 2) {
276
+ clientMapContent = clientMapTemplateToUse([], componentImports);
277
+ }
278
+ else {
279
+ clientMapContent = clientMapTemplateToUse([], componentImports, {
280
+ entries: components.entries,
281
+ includeVariants,
282
+ isClientMap: true,
283
+ });
284
+ }
285
+ const clientMapFile = path.join(process.cwd(), destination, 'component-map.client.ts');
286
+ try {
287
+ fs.writeFileSync(clientMapFile, clientMapContent, { encoding: 'utf8' });
288
+ }
289
+ catch (error) {
290
+ console.error(`Client Component Map generation failed. Error writing to file ${destination}:`, error);
291
+ throw error;
292
+ }
293
+ }
294
+ }
295
+ };
@@ -1,2 +1,3 @@
1
- export { generateSites, generateMetadata, getComponentList, generatePlugins, ModuleType, extractFiles, writeImportMap, } from '@sitecore-content-sdk/core/tools';
2
- export { generateMap } from './generate-map';
1
+ export { generateSites, generateMetadata, getComponentList, generatePlugins, ModuleType, extractFiles, } from '@sitecore-content-sdk/core/tools';
2
+ export { generateMap } from './generate-map';
3
+ export { writeImportMap } from './codegen/import-map';