@sitecore-content-sdk/core 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 (342) hide show
  1. package/README.md +7 -7
  2. package/dist/cjs/cache-client.js +55 -54
  3. package/dist/cjs/client/constants.js +7 -7
  4. package/dist/cjs/client/edge-proxy.js +24 -22
  5. package/dist/cjs/client/index.js +15 -15
  6. package/dist/cjs/client/models.js +2 -2
  7. package/dist/cjs/client/sitecore-client.js +421 -419
  8. package/dist/cjs/client/utils.js +47 -46
  9. package/dist/cjs/config/define-config.js +194 -193
  10. package/dist/cjs/config/index.js +7 -7
  11. package/dist/cjs/config/models.js +12 -11
  12. package/dist/cjs/config-cli/define-cli-config.js +23 -22
  13. package/dist/cjs/config-cli/index.js +7 -7
  14. package/dist/cjs/config-cli/models.js +8 -7
  15. package/dist/cjs/constants.js +49 -17
  16. package/dist/cjs/debug.js +48 -46
  17. package/dist/cjs/editing/codegen/index.js +14 -9
  18. package/dist/cjs/editing/codegen/preview.js +277 -193
  19. package/dist/cjs/editing/component-layout-service.js +62 -61
  20. package/dist/cjs/editing/design-library.js +183 -126
  21. package/dist/cjs/editing/editing-service.js +75 -74
  22. package/dist/cjs/editing/index.js +33 -27
  23. package/dist/cjs/editing/metadata.js +42 -42
  24. package/dist/cjs/editing/models.js +44 -38
  25. package/dist/cjs/editing/utils.js +108 -90
  26. package/dist/cjs/form/form.js +81 -78
  27. package/dist/cjs/form/index.js +7 -7
  28. package/dist/cjs/graphql-request-client.js +108 -107
  29. package/dist/cjs/i18n/dictionary-service.js +122 -121
  30. package/dist/cjs/i18n/index.js +7 -7
  31. package/dist/cjs/i18n/utils.js +16 -15
  32. package/dist/cjs/index.js +60 -60
  33. package/dist/cjs/layout/content-styles.js +72 -71
  34. package/dist/cjs/layout/index.js +24 -24
  35. package/dist/cjs/layout/layout-service.js +62 -57
  36. package/dist/cjs/layout/models.js +39 -34
  37. package/dist/cjs/layout/themes.js +76 -75
  38. package/dist/cjs/layout/utils.js +117 -110
  39. package/dist/cjs/media/index.js +38 -38
  40. package/dist/cjs/media/media-api.js +100 -96
  41. package/dist/cjs/models.js +2 -2
  42. package/dist/cjs/native-fetcher.js +194 -179
  43. package/dist/cjs/personalize/index.js +15 -15
  44. package/dist/cjs/personalize/layout-personalizer.js +98 -97
  45. package/dist/cjs/personalize/personalize-service.js +98 -94
  46. package/dist/cjs/personalize/utils.js +143 -136
  47. package/dist/cjs/retries.js +43 -42
  48. package/dist/cjs/site/error-pages-service.js +65 -64
  49. package/dist/cjs/site/index.js +26 -26
  50. package/dist/cjs/site/models.js +2 -2
  51. package/dist/cjs/site/redirects-service.js +94 -81
  52. package/dist/cjs/site/robots-service.js +66 -65
  53. package/dist/cjs/site/site-resolver.js +73 -72
  54. package/dist/cjs/site/siteinfo-service.js +84 -80
  55. package/dist/cjs/site/sitemap-xml-service.js +84 -83
  56. package/dist/cjs/site/sitepath-service.js +165 -164
  57. package/dist/cjs/site/utils.js +55 -47
  58. package/dist/cjs/sitecore-service-base.js +36 -36
  59. package/dist/cjs/tools/auth/flow.js +65 -64
  60. package/dist/cjs/tools/auth/index.js +5 -5
  61. package/dist/cjs/tools/auth/models.js +2 -2
  62. package/dist/cjs/tools/auth/tenant-store.js +38 -38
  63. package/dist/cjs/tools/codegen/component-generation.js +52 -50
  64. package/dist/cjs/tools/codegen/extract-files.js +105 -107
  65. package/dist/cjs/tools/codegen/import-map.js +401 -349
  66. package/dist/cjs/tools/codegen/utils.js +418 -418
  67. package/dist/cjs/tools/generate-map.js +2 -2
  68. package/dist/cjs/tools/generateMetadata.js +36 -35
  69. package/dist/cjs/tools/generateSites.js +59 -58
  70. package/dist/cjs/tools/index.js +75 -73
  71. package/dist/cjs/tools/scaffold.js +60 -59
  72. package/dist/cjs/tools/templating/components.js +96 -266
  73. package/dist/cjs/tools/templating/index.js +11 -14
  74. package/dist/cjs/tools/templating/plugins.js +80 -78
  75. package/dist/cjs/tools/templating/utils.js +67 -66
  76. package/dist/cjs/utils/ensurePath.js +20 -20
  77. package/dist/cjs/utils/env.js +28 -27
  78. package/dist/cjs/utils/globalCache.js +55 -0
  79. package/dist/cjs/utils/index.js +26 -21
  80. package/dist/cjs/utils/is-server.js +11 -10
  81. package/dist/cjs/utils/normalize-url.js +5 -5
  82. package/dist/cjs/utils/timeout-promise.js +31 -31
  83. package/dist/cjs/utils/utils.js +254 -229
  84. package/dist/esm/cache-client.js +51 -50
  85. package/dist/esm/client/constants.js +4 -4
  86. package/dist/esm/client/edge-proxy.js +19 -17
  87. package/dist/esm/client/index.js +5 -5
  88. package/dist/esm/client/models.js +1 -1
  89. package/dist/esm/client/sitecore-client.js +414 -412
  90. package/dist/esm/client/utils.js +43 -42
  91. package/dist/esm/config/define-config.js +188 -187
  92. package/dist/esm/config/index.js +2 -2
  93. package/dist/esm/config/models.js +9 -8
  94. package/dist/esm/config-cli/define-cli-config.js +19 -18
  95. package/dist/esm/config-cli/index.js +2 -2
  96. package/dist/esm/config-cli/models.js +5 -4
  97. package/dist/esm/constants.js +46 -14
  98. package/dist/esm/debug.js +41 -39
  99. package/dist/esm/editing/codegen/index.js +1 -1
  100. package/dist/esm/editing/codegen/preview.js +263 -185
  101. package/dist/esm/editing/component-layout-service.js +55 -54
  102. package/dist/esm/editing/design-library.js +171 -117
  103. package/dist/esm/editing/editing-service.js +68 -67
  104. package/dist/esm/editing/index.js +6 -5
  105. package/dist/esm/editing/metadata.js +39 -39
  106. package/dist/esm/editing/models.js +41 -35
  107. package/dist/esm/editing/utils.js +98 -80
  108. package/dist/esm/form/form.js +72 -69
  109. package/dist/esm/form/index.js +1 -1
  110. package/dist/esm/graphql-request-client.js +101 -100
  111. package/dist/esm/i18n/dictionary-service.js +115 -114
  112. package/dist/esm/i18n/index.js +2 -2
  113. package/dist/esm/i18n/utils.js +13 -12
  114. package/dist/esm/index.js +13 -13
  115. package/dist/esm/layout/content-styles.js +64 -63
  116. package/dist/esm/layout/index.js +6 -6
  117. package/dist/esm/layout/layout-service.js +55 -50
  118. package/dist/esm/layout/models.js +36 -31
  119. package/dist/esm/layout/themes.js +71 -70
  120. package/dist/esm/layout/utils.js +109 -102
  121. package/dist/esm/media/index.js +2 -2
  122. package/dist/esm/media/media-api.js +90 -86
  123. package/dist/esm/models.js +1 -1
  124. package/dist/esm/native-fetcher.js +187 -172
  125. package/dist/esm/personalize/index.js +3 -3
  126. package/dist/esm/personalize/layout-personalizer.js +93 -92
  127. package/dist/esm/personalize/personalize-service.js +91 -87
  128. package/dist/esm/personalize/utils.js +135 -128
  129. package/dist/esm/retries.js +39 -38
  130. package/dist/esm/site/error-pages-service.js +58 -57
  131. package/dist/esm/site/index.js +8 -8
  132. package/dist/esm/site/models.js +1 -1
  133. package/dist/esm/site/redirects-service.js +87 -74
  134. package/dist/esm/site/robots-service.js +59 -58
  135. package/dist/esm/site/site-resolver.js +69 -68
  136. package/dist/esm/site/siteinfo-service.js +77 -73
  137. package/dist/esm/site/sitemap-xml-service.js +77 -76
  138. package/dist/esm/site/sitepath-service.js +157 -156
  139. package/dist/esm/site/utils.js +49 -41
  140. package/dist/esm/sitecore-service-base.js +29 -29
  141. package/dist/esm/tools/auth/flow.js +62 -61
  142. package/dist/esm/tools/auth/index.js +1 -1
  143. package/dist/esm/tools/auth/models.js +1 -1
  144. package/dist/esm/tools/auth/tenant-store.js +35 -35
  145. package/dist/esm/tools/codegen/component-generation.js +44 -42
  146. package/dist/esm/tools/codegen/extract-files.js +99 -101
  147. package/dist/esm/tools/codegen/import-map.js +358 -306
  148. package/dist/esm/tools/codegen/utils.js +373 -373
  149. package/dist/esm/tools/generate-map.js +1 -1
  150. package/dist/esm/tools/generateMetadata.js +29 -28
  151. package/dist/esm/tools/generateSites.js +52 -51
  152. package/dist/esm/tools/index.js +28 -27
  153. package/dist/esm/tools/scaffold.js +52 -51
  154. package/dist/esm/tools/templating/components.js +59 -223
  155. package/dist/esm/tools/templating/index.js +3 -3
  156. package/dist/esm/tools/templating/plugins.js +72 -70
  157. package/dist/esm/tools/templating/utils.js +59 -58
  158. package/dist/esm/utils/ensurePath.js +13 -13
  159. package/dist/esm/utils/env.js +24 -23
  160. package/dist/esm/utils/globalCache.js +49 -0
  161. package/dist/esm/utils/index.js +4 -3
  162. package/dist/esm/utils/is-server.js +9 -8
  163. package/dist/esm/utils/normalize-url.js +1 -1
  164. package/dist/esm/utils/timeout-promise.js +28 -28
  165. package/dist/esm/utils/utils.js +238 -213
  166. package/package.json +73 -5
  167. package/types/cache-client.d.ts +68 -64
  168. package/types/cache-client.d.ts.map +1 -0
  169. package/types/client/constants.d.ts +5 -4
  170. package/types/client/constants.d.ts.map +1 -0
  171. package/types/client/edge-proxy.d.ts +18 -15
  172. package/types/client/edge-proxy.d.ts.map +1 -0
  173. package/types/client/index.d.ts +8 -7
  174. package/types/client/index.d.ts.map +1 -0
  175. package/types/client/models.d.ts +21 -19
  176. package/types/client/models.d.ts.map +1 -0
  177. package/types/client/sitecore-client.d.ts +338 -327
  178. package/types/client/sitecore-client.d.ts.map +1 -0
  179. package/types/client/utils.d.ts +15 -9
  180. package/types/client/utils.d.ts.map +1 -0
  181. package/types/config/define-config.d.ts +20 -18
  182. package/types/config/define-config.d.ts.map +1 -0
  183. package/types/config/index.d.ts +3 -2
  184. package/types/config/index.d.ts.map +1 -0
  185. package/types/config/models.d.ts +287 -268
  186. package/types/config/models.d.ts.map +1 -0
  187. package/types/config-cli/define-cli-config.d.ts +9 -7
  188. package/types/config-cli/define-cli-config.d.ts.map +1 -0
  189. package/types/config-cli/index.d.ts +3 -2
  190. package/types/config-cli/index.d.ts.map +1 -0
  191. package/types/config-cli/models.d.ts +6 -4
  192. package/types/config-cli/models.d.ts.map +1 -0
  193. package/types/constants.d.ts +44 -11
  194. package/types/constants.d.ts.map +1 -0
  195. package/types/debug.d.ts +35 -28
  196. package/types/debug.d.ts.map +1 -0
  197. package/types/editing/codegen/index.d.ts +2 -1
  198. package/types/editing/codegen/index.d.ts.map +1 -0
  199. package/types/editing/codegen/preview.d.ts +256 -195
  200. package/types/editing/codegen/preview.d.ts.map +1 -0
  201. package/types/editing/component-layout-service.d.ts +84 -80
  202. package/types/editing/component-layout-service.d.ts.map +1 -0
  203. package/types/editing/design-library.d.ts +111 -63
  204. package/types/editing/design-library.d.ts.map +1 -0
  205. package/types/editing/editing-service.d.ts +72 -62
  206. package/types/editing/editing-service.d.ts.map +1 -0
  207. package/types/editing/index.d.ts +7 -6
  208. package/types/editing/index.d.ts.map +1 -0
  209. package/types/editing/metadata.d.ts +8 -7
  210. package/types/editing/metadata.d.ts.map +1 -0
  211. package/types/editing/models.d.ts +103 -92
  212. package/types/editing/models.d.ts.map +1 -0
  213. package/types/editing/utils.d.ts +91 -74
  214. package/types/editing/utils.d.ts.map +1 -0
  215. package/types/form/form.d.ts +25 -21
  216. package/types/form/form.d.ts.map +1 -0
  217. package/types/form/index.d.ts +2 -1
  218. package/types/form/index.d.ts.map +1 -0
  219. package/types/graphql-request-client.d.ts +112 -105
  220. package/types/graphql-request-client.d.ts.map +1 -0
  221. package/types/i18n/dictionary-service.d.ts +135 -131
  222. package/types/i18n/dictionary-service.d.ts.map +1 -0
  223. package/types/i18n/index.d.ts +3 -2
  224. package/types/i18n/index.d.ts.map +1 -0
  225. package/types/i18n/utils.d.ts +9 -7
  226. package/types/i18n/utils.d.ts.map +1 -0
  227. package/types/index.d.ts +13 -12
  228. package/types/index.d.ts.map +1 -0
  229. package/types/layout/content-styles.d.ts +20 -18
  230. package/types/layout/content-styles.d.ts.map +1 -0
  231. package/types/layout/index.d.ts +6 -5
  232. package/types/layout/index.d.ts.map +1 -0
  233. package/types/layout/layout-service.d.ts +45 -35
  234. package/types/layout/layout-service.d.ts.map +1 -0
  235. package/types/layout/models.d.ts +174 -151
  236. package/types/layout/models.d.ts.map +1 -0
  237. package/types/layout/themes.d.ts +13 -11
  238. package/types/layout/themes.d.ts.map +1 -0
  239. package/types/layout/utils.d.ts +56 -41
  240. package/types/layout/utils.d.ts.map +1 -0
  241. package/types/media/index.d.ts +3 -2
  242. package/types/media/index.d.ts.map +1 -0
  243. package/types/media/media-api.d.ts +60 -55
  244. package/types/media/media-api.d.ts.map +1 -0
  245. package/types/models.d.ts +94 -84
  246. package/types/models.d.ts.map +1 -0
  247. package/types/native-fetcher.d.ts +124 -114
  248. package/types/native-fetcher.d.ts.map +1 -0
  249. package/types/personalize/index.d.ts +4 -3
  250. package/types/personalize/index.d.ts.map +1 -0
  251. package/types/personalize/layout-personalizer.d.ts +29 -27
  252. package/types/personalize/layout-personalizer.d.ts.map +1 -0
  253. package/types/personalize/personalize-service.d.ts +90 -80
  254. package/types/personalize/personalize-service.d.ts.map +1 -0
  255. package/types/personalize/utils.d.ts +78 -69
  256. package/types/personalize/utils.d.ts.map +1 -0
  257. package/types/retries.d.ts +26 -24
  258. package/types/retries.d.ts.map +1 -0
  259. package/types/site/error-pages-service.d.ts +64 -57
  260. package/types/site/error-pages-service.d.ts.map +1 -0
  261. package/types/site/index.d.ts +10 -9
  262. package/types/site/index.d.ts.map +1 -0
  263. package/types/site/models.d.ts +23 -18
  264. package/types/site/models.d.ts.map +1 -0
  265. package/types/site/redirects-service.d.ts +92 -69
  266. package/types/site/redirects-service.d.ts.map +1 -0
  267. package/types/site/robots-service.d.ts +57 -50
  268. package/types/site/robots-service.d.ts.map +1 -0
  269. package/types/site/site-resolver.d.ts +28 -26
  270. package/types/site/site-resolver.d.ts.map +1 -0
  271. package/types/site/siteinfo-service.d.ts +65 -52
  272. package/types/site/siteinfo-service.d.ts.map +1 -0
  273. package/types/site/sitemap-xml-service.d.ts +63 -56
  274. package/types/site/sitemap-xml-service.d.ts.map +1 -0
  275. package/types/site/sitepath-service.d.ts +137 -134
  276. package/types/site/sitepath-service.d.ts.map +1 -0
  277. package/types/site/utils.d.ts +41 -28
  278. package/types/site/utils.d.ts.map +1 -0
  279. package/types/sitecore-service-base.d.ts +31 -30
  280. package/types/sitecore-service-base.d.ts.map +1 -0
  281. package/types/tools/auth/flow.d.ts +29 -27
  282. package/types/tools/auth/flow.d.ts.map +1 -0
  283. package/types/tools/auth/index.d.ts +2 -1
  284. package/types/tools/auth/index.d.ts.map +1 -0
  285. package/types/tools/auth/models.d.ts +35 -33
  286. package/types/tools/auth/models.d.ts.map +1 -0
  287. package/types/tools/auth/tenant-store.d.ts +12 -11
  288. package/types/tools/auth/tenant-store.d.ts.map +1 -0
  289. package/types/tools/codegen/component-generation.d.ts +50 -47
  290. package/types/tools/codegen/component-generation.d.ts.map +1 -0
  291. package/types/tools/codegen/extract-files.d.ts +24 -22
  292. package/types/tools/codegen/extract-files.d.ts.map +1 -0
  293. package/types/tools/codegen/import-map.d.ts +103 -70
  294. package/types/tools/codegen/import-map.d.ts.map +1 -0
  295. package/types/tools/codegen/utils.d.ts +76 -75
  296. package/types/tools/codegen/utils.d.ts.map +1 -0
  297. package/types/tools/generate-map.d.ts +36 -26
  298. package/types/tools/generate-map.d.ts.map +1 -0
  299. package/types/tools/generateMetadata.d.ts +24 -22
  300. package/types/tools/generateMetadata.d.ts.map +1 -0
  301. package/types/tools/generateSites.d.ts +25 -22
  302. package/types/tools/generateSites.d.ts.map +1 -0
  303. package/types/tools/index.d.ts +22 -20
  304. package/types/tools/index.d.ts.map +1 -0
  305. package/types/tools/scaffold.d.ts +27 -25
  306. package/types/tools/scaffold.d.ts.map +1 -0
  307. package/types/tools/templating/components.d.ts +104 -103
  308. package/types/tools/templating/components.d.ts.map +1 -0
  309. package/types/tools/templating/index.d.ts +4 -3
  310. package/types/tools/templating/index.d.ts.map +1 -0
  311. package/types/tools/templating/plugins.d.ts +71 -67
  312. package/types/tools/templating/plugins.d.ts.map +1 -0
  313. package/types/tools/templating/utils.d.ts +42 -40
  314. package/types/tools/templating/utils.d.ts.map +1 -0
  315. package/types/utils/ensurePath.d.ts +7 -6
  316. package/types/utils/ensurePath.d.ts.map +1 -0
  317. package/types/utils/env.d.ts +9 -7
  318. package/types/utils/env.d.ts.map +1 -0
  319. package/types/utils/globalCache.d.ts +37 -0
  320. package/types/utils/globalCache.d.ts.map +1 -0
  321. package/types/utils/index.d.ts +5 -3
  322. package/types/utils/index.d.ts.map +1 -0
  323. package/types/utils/is-server.d.ts +8 -6
  324. package/types/utils/is-server.d.ts.map +1 -0
  325. package/types/utils/normalize-url.d.ts +2 -1
  326. package/types/utils/normalize-url.d.ts.map +1 -0
  327. package/types/utils/timeout-promise.d.ts +18 -17
  328. package/types/utils/timeout-promise.d.ts.map +1 -0
  329. package/types/utils/utils.d.ts +104 -79
  330. package/types/utils/utils.d.ts.map +1 -0
  331. package/client.js +0 -1
  332. package/codegen.js +0 -1
  333. package/config-cli.js +0 -1
  334. package/config.js +0 -1
  335. package/editing.js +0 -1
  336. package/i18n.js +0 -1
  337. package/layout.js +0 -1
  338. package/media.js +0 -1
  339. package/personalize.js +0 -1
  340. package/site.js +0 -1
  341. package/tools.js +0 -1
  342. package/utils.js +0 -1
@@ -1,213 +1,238 @@
1
- import isServer from './is-server';
2
- /**
3
- * note: encodeURIComponent is available via browser (window) or natively in node.js
4
- * if you use another js engine for server-side rendering you may not have native encodeURIComponent
5
- * and would then need to install a package for that functionality
6
- * @param {ParsedUrlQueryInput} params query string parameters
7
- * @returns {string} query string
8
- */
9
- function getQueryString(params) {
10
- return Object.keys(params)
11
- .map((k) => `${encodeURIComponent(k)}=${encodeURIComponent(String(params[k]))}`)
12
- .join('&');
13
- }
14
- /**
15
- * Resolves a base URL that may contain query string parameters and an additional set of query
16
- * string parameters into a unified string representation.
17
- * @param {string} urlBase the base URL that may contain query string parameters
18
- * @param {ParsedUrlQueryInput} params query string parameters
19
- * @returns a URL string
20
- * @throws {RangeError} if the provided url is an empty string
21
- */
22
- export function resolveUrl(urlBase, params = {}) {
23
- if (!urlBase) {
24
- throw new RangeError('url must be a non-empty string');
25
- }
26
- // This is a better way to work with URLs since it handles different user input
27
- // edge cases. This works in Node and all browser except IE11.
28
- // https://developer.mozilla.org/en-US/docs/Web/API/URL
29
- // TODO: Verify our browser support requirements.
30
- if (isServer()) {
31
- const url = new URL(urlBase);
32
- for (const key in params) {
33
- if ({}.hasOwnProperty.call(params, key)) {
34
- url.searchParams.append(key, String(params[key]));
35
- }
36
- }
37
- const result = url.toString();
38
- return result;
39
- }
40
- const qs = getQueryString(params);
41
- const result = urlBase.indexOf('?') !== -1 ? `${urlBase}&${qs}` : `${urlBase}?${qs}`;
42
- return result;
43
- }
44
- export const isAbsoluteUrl = (url) => {
45
- if (!url) {
46
- return false;
47
- }
48
- if (typeof url !== 'string') {
49
- throw new TypeError('Expected a string');
50
- }
51
- return /^[a-z][a-z0-9+.-]*:/.test(url);
52
- };
53
- /**
54
- * Indicates whether the error is a timeout error
55
- * @param {unknown} error error
56
- * @returns {boolean} is timeout error
57
- */
58
- export const isTimeoutError = (error) => {
59
- var _a;
60
- return ((_a = error.response) === null || _a === void 0 ? void 0 : _a.status) === 408 || error.name === 'AbortError';
61
- };
62
- /**
63
- * Converts a string value in a regex pattern allowing wildcard matching
64
- * @param {string} pattern input with wildcards i.e. site.*.com
65
- * @returns {string} modified string that can be used as regexp input
66
- */
67
- const convertToWildcardRegex = (pattern) => {
68
- return '^' + pattern.replace(/\//g, '\\/').replace(/\./g, '\\.').replace(/\*/g, '.*') + '$';
69
- };
70
- /**
71
- * Gets allowed origins from JSS_ALLOWED_ORIGINS env variable
72
- * @returns {string[]} list of allowed origins from JSS_ALLOWED_ORIGINS env variable
73
- */
74
- export const getAllowedOriginsFromEnv = () => process.env.JSS_ALLOWED_ORIGINS
75
- ? process.env.JSS_ALLOWED_ORIGINS.replace(' ', '').split(',')
76
- : [];
77
- /**
78
- * Tests origin from incoming request against allowed origins list that can be
79
- * set in JSS's JSS_ALLOWED_ORIGINS env variable, passed via allowedOrigins param and/or
80
- * be already set in Access-Control-Allow-Origin by other logic.
81
- * Applies Access-Control-Allow-Origin and Access-Control-Allow-Methods on match
82
- * Also applies Access-Control-Allow-Headers for preflight requests
83
- * @param {IncomingMessage} req incoming request
84
- * @param {OutgoingMessage} res response to set CORS headers for
85
- * @param {string[]} [allowedOrigins] additional list of origins to test against
86
- * @returns true if incoming origin matches the allowed lists, false when it does not
87
- * @deprecated use getEnforcedCorsHeaders instead
88
- */
89
- export const enforceCors = (req, res, allowedOrigins) => {
90
- // origin in not present for non-CORS requests (e.g. server-side) - so we skip the checks
91
- if (!req.headers.origin) {
92
- return true;
93
- }
94
- // 3 sources of allowed origins are considered:
95
- // the env value
96
- const defaultAllowedOrigins = getAllowedOriginsFromEnv();
97
- // the allowedOrigins prop
98
- allowedOrigins = defaultAllowedOrigins.concat(allowedOrigins || []);
99
- // and the existing CORS header, if present (i.e. set by nextjs config)
100
- const presetCors = res.getHeader('Access-Control-Allow-Origin');
101
- if (presetCors) {
102
- allowedOrigins.push(presetCors);
103
- }
104
- const origin = req.headers.origin;
105
- if (origin &&
106
- allowedOrigins.some((allowedOrigin) => origin === allowedOrigin || new RegExp(convertToWildcardRegex(allowedOrigin)).test(origin))) {
107
- res.setHeader('Access-Control-Allow-Origin', origin);
108
- res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, DELETE, PUT, PATCH');
109
- // set the allowed headers for preflight requests
110
- if (req.method === 'OPTIONS') {
111
- res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
112
- }
113
- return true;
114
- }
115
- return false;
116
- };
117
- export const getEnforcedCorsHeaders = ({ requestMethod, headers, presetCorsHeader, allowedOrigins = [], }) => {
118
- // ugly but gotta satisfy both node.js and web fetch Headers interface somehow
119
- const origin = headers.get
120
- ? headers.get('origin')
121
- : headers.origin;
122
- if (!origin) {
123
- return {};
124
- }
125
- // 3 sources of allowed origins are considered:
126
- // the env value
127
- const defaultAllowedOrigins = getAllowedOriginsFromEnv();
128
- // the allowedOrigins prop
129
- allowedOrigins = defaultAllowedOrigins.concat(allowedOrigins || []);
130
- // and the existing CORS header, if provided (i.e. from nextjs config)
131
- if (presetCorsHeader) {
132
- allowedOrigins.push(presetCorsHeader);
133
- }
134
- if (origin &&
135
- allowedOrigins.some((allowedOrigin) => origin === allowedOrigin || new RegExp(convertToWildcardRegex(allowedOrigin)).test(origin))) {
136
- const corsHeaders = {
137
- 'Access-Control-Allow-Origin': origin,
138
- 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS, DELETE, PUT, PATCH',
139
- };
140
- // set the allowed headers for preflight requests
141
- if (requestMethod === 'OPTIONS') {
142
- corsHeaders['Access-Control-Allow-Headers'] = 'Content-Type, Authorization';
143
- }
144
- return corsHeaders;
145
- }
146
- return null;
147
- };
148
- /**
149
- * Determines whether the given input is a regular expression or resembles a URL.
150
- * @param {string} input - The input string to evaluate.
151
- * @returns {'regex' | 'url'} - Returns 'url' if the input looks like a URL, otherwise 'regex'.
152
- */
153
- export const isRegexOrUrl = (input) => {
154
- // Remove the trailing slash.
155
- input = input.slice(0, -1);
156
- // Check if the string resembles a URL.
157
- const isUrlLike = /^\/[a-zA-Z0-9\-\/]+(\?([a-zA-Z0-9\-_]+=[a-zA-Z0-9\-_]+)(&[a-zA-Z0-9\-_]+=[a-zA-Z0-9\-_]+)*)?$/.test(input);
158
- if (isUrlLike) {
159
- return 'url';
160
- }
161
- // If it doesn't resemble a URL, it's likely a regular expression.
162
- return 'regex';
163
- };
164
- /**
165
- * Compares two URLSearchParams objects to determine if they are equal.
166
- * @param {URLSearchParams} params1 - The first set of URL search parameters.
167
- * @param {URLSearchParams} params2 - The second set of URL search parameters.
168
- * @returns {boolean} - Returns true if the parameters are equal, otherwise false.
169
- */
170
- export const areURLSearchParamsEqual = (params1, params2) => {
171
- // Generates a sorted string representation of URL search parameters.
172
- const getSortedParamsString = (params) => {
173
- return [...params.entries()]
174
- .sort(([keyA], [keyB]) => keyA.localeCompare(keyB))
175
- .map(([key, value]) => `${key}=${value}`)
176
- .join('&');
177
- };
178
- // Compare the sorted strings of both parameter sets.
179
- return getSortedParamsString(params1) === getSortedParamsString(params2);
180
- };
181
- /**
182
- * Escapes non-special "?" characters in a string or regex.
183
- * - For regex patterns that start with `^` or end with `$`, it returns the pattern unchanged.
184
- * - For other strings, it escapes literal "?" characters but preserves regex quantifiers and special patterns.
185
- * @param {string} input - The input string or regex pattern.
186
- * @returns {string} - The modified string or regex with non-special "?" characters escaped.
187
- */
188
- export const escapeNonSpecialQuestionMarks = (input) => {
189
- // If the input is already a regex pattern (starts with ^ or ends with $), return it unchanged
190
- if (input.startsWith('^') || input.endsWith('$')) {
191
- return input;
192
- }
193
- // For non-regex strings, escape literal "?" characters
194
- return input.replace(/\?/g, '\\?');
195
- };
196
- /**
197
- * Merges two URLSearchParams objects. If both objects contain the same key, the value from the second object overrides the first.
198
- * @param {URLSearchParams} params1 - The first set of URL search parameters.
199
- * @param {URLSearchParams} params2 - The second set of URL search parameters.
200
- * @returns {string} - A string representation of the merged URL search parameters.
201
- */
202
- export const mergeURLSearchParams = (params1, params2) => {
203
- const merged = new URLSearchParams();
204
- // Add all keys and values from the first object.
205
- for (const [key, value] of params1.entries()) {
206
- merged.set(key, value);
207
- }
208
- // Add all keys and values from the second object, replacing existing ones.
209
- for (const [key, value] of params2.entries()) {
210
- merged.set(key, value);
211
- }
212
- return merged.toString();
213
- };
1
+ import isServer from './is-server';
2
+ /**
3
+ * note: encodeURIComponent is available via browser (window) or natively in node.js
4
+ * if you use another js engine for server-side rendering you may not have native encodeURIComponent
5
+ * and would then need to install a package for that functionality
6
+ * @param {ParsedUrlQueryInput} params query string parameters
7
+ * @returns {string} query string
8
+ */
9
+ function getQueryString(params) {
10
+ return Object.keys(params)
11
+ .map((k) => `${encodeURIComponent(k)}=${encodeURIComponent(String(params[k]))}`)
12
+ .join('&');
13
+ }
14
+ /**
15
+ * Resolves a base URL that may contain query string parameters and an additional set of query
16
+ * string parameters into a unified string representation.
17
+ * @param {string} urlBase the base URL that may contain query string parameters
18
+ * @param {ParsedUrlQueryInput} params query string parameters
19
+ * @returns a URL string
20
+ * @throws {RangeError} if the provided url is an empty string
21
+ * @public
22
+ */
23
+ export function resolveUrl(urlBase, params = {}) {
24
+ if (!urlBase) {
25
+ throw new RangeError('url must be a non-empty string');
26
+ }
27
+ // This is a better way to work with URLs since it handles different user input
28
+ // edge cases. This works in Node and all browser except IE11.
29
+ // https://developer.mozilla.org/en-US/docs/Web/API/URL
30
+ // TODO: Verify our browser support requirements.
31
+ if (isServer()) {
32
+ const url = new URL(urlBase);
33
+ for (const key in params) {
34
+ if ({}.hasOwnProperty.call(params, key)) {
35
+ url.searchParams.append(key, String(params[key]));
36
+ }
37
+ }
38
+ const result = url.toString();
39
+ return result;
40
+ }
41
+ const qs = getQueryString(params);
42
+ const result = urlBase.indexOf('?') !== -1 ? `${urlBase}&${qs}` : `${urlBase}?${qs}`;
43
+ return result;
44
+ }
45
+ /**
46
+ * Checks if the given URL is an absolute URL
47
+ * @param {string} url - The URL to check.
48
+ * @returns {boolean} - Returns true if the URL is an absolute URL, otherwise false.
49
+ * @public
50
+ */
51
+ export const isAbsoluteUrl = (url) => {
52
+ if (!url) {
53
+ return false;
54
+ }
55
+ if (typeof url !== 'string') {
56
+ throw new TypeError('Expected a string');
57
+ }
58
+ return /^[a-z][a-z0-9+.-]*:/.test(url);
59
+ };
60
+ /**
61
+ * Indicates whether the error is a timeout error
62
+ * @param {unknown} error error
63
+ * @returns {boolean} is timeout error
64
+ * @public
65
+ */
66
+ export const isTimeoutError = (error) => {
67
+ var _a;
68
+ return ((_a = error.response) === null || _a === void 0 ? void 0 : _a.status) === 408 || error.name === 'AbortError';
69
+ };
70
+ /**
71
+ * Converts a string value in a regex pattern allowing wildcard matching
72
+ * @param {string} pattern input with wildcards i.e. site.*.com
73
+ * @returns {string} modified string that can be used as regexp input
74
+ */
75
+ const convertToWildcardRegex = (pattern) => {
76
+ return '^' + pattern.replace(/\//g, '\\/').replace(/\./g, '\\.').replace(/\*/g, '.*') + '$';
77
+ };
78
+ /**
79
+ * Gets allowed origins from JSS_ALLOWED_ORIGINS env variable
80
+ * @returns {string[]} list of allowed origins from JSS_ALLOWED_ORIGINS env variable
81
+ * @public
82
+ */
83
+ export const getAllowedOriginsFromEnv = () => process.env.JSS_ALLOWED_ORIGINS
84
+ ? process.env.JSS_ALLOWED_ORIGINS.replace(' ', '').split(',')
85
+ : [];
86
+ /**
87
+ * Tests origin from incoming request against allowed origins list that can be
88
+ * set in JSS's JSS_ALLOWED_ORIGINS env variable, passed via allowedOrigins param and/or
89
+ * be already set in Access-Control-Allow-Origin by other logic.
90
+ * Applies Access-Control-Allow-Origin and Access-Control-Allow-Methods on match
91
+ * Also applies Access-Control-Allow-Headers for preflight requests
92
+ * @param {IncomingMessage} req incoming request
93
+ * @param {OutgoingMessage} res response to set CORS headers for
94
+ * @param {string[]} [allowedOrigins] additional list of origins to test against
95
+ * @returns true if incoming origin matches the allowed lists, false when it does not
96
+ * @deprecated use getEnforcedCorsHeaders instead
97
+ * @public
98
+ */
99
+ export const enforceCors = (req, res, allowedOrigins) => {
100
+ // origin in not present for non-CORS requests (e.g. server-side) - so we skip the checks
101
+ if (!req.headers.origin) {
102
+ return true;
103
+ }
104
+ // 3 sources of allowed origins are considered:
105
+ // the env value
106
+ const defaultAllowedOrigins = getAllowedOriginsFromEnv();
107
+ // the allowedOrigins prop
108
+ allowedOrigins = defaultAllowedOrigins.concat(allowedOrigins || []);
109
+ // and the existing CORS header, if present (i.e. set by nextjs config)
110
+ const presetCors = res.getHeader('Access-Control-Allow-Origin');
111
+ if (presetCors) {
112
+ allowedOrigins.push(presetCors);
113
+ }
114
+ const origin = req.headers.origin;
115
+ if (origin &&
116
+ allowedOrigins.some((allowedOrigin) => origin === allowedOrigin || new RegExp(convertToWildcardRegex(allowedOrigin)).test(origin))) {
117
+ res.setHeader('Access-Control-Allow-Origin', origin);
118
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, DELETE, PUT, PATCH');
119
+ // set the allowed headers for preflight requests
120
+ if (req.method === 'OPTIONS') {
121
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
122
+ }
123
+ return true;
124
+ }
125
+ return false;
126
+ };
127
+ /**
128
+ * Gets enforced CORS headers
129
+ * @param {string} requestMethod - The HTTP method of the request.
130
+ * @param {IncomingHttpHeaders | Headers} headers - The headers of the request.
131
+ * @param {string | string[]} presetCorsHeader - The preset CORS header.
132
+ * @param {string[]} [allowedOrigins] - The allowed origins.
133
+ * @returns {Record<string, string>} - The enforced CORS headers.
134
+ * @public
135
+ */
136
+ export const getEnforcedCorsHeaders = ({ requestMethod, headers, presetCorsHeader, allowedOrigins = [], }) => {
137
+ // ugly but gotta satisfy both node.js and web fetch Headers interface somehow
138
+ const origin = headers.get
139
+ ? headers.get('origin')
140
+ : headers.origin;
141
+ if (!origin) {
142
+ return {};
143
+ }
144
+ // 3 sources of allowed origins are considered:
145
+ // the env value
146
+ const defaultAllowedOrigins = getAllowedOriginsFromEnv();
147
+ // the allowedOrigins prop
148
+ allowedOrigins = defaultAllowedOrigins.concat(allowedOrigins || []);
149
+ // and the existing CORS header, if provided (i.e. from nextjs config)
150
+ if (presetCorsHeader) {
151
+ allowedOrigins.push(presetCorsHeader);
152
+ }
153
+ if (origin &&
154
+ allowedOrigins.some((allowedOrigin) => origin === allowedOrigin || new RegExp(convertToWildcardRegex(allowedOrigin)).test(origin))) {
155
+ const corsHeaders = {
156
+ 'Access-Control-Allow-Origin': origin,
157
+ 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS, DELETE, PUT, PATCH',
158
+ 'x-middleware-cache': 'no-cache',
159
+ 'Cache-Control': 'no-store, must-revalidate',
160
+ };
161
+ // set the allowed headers for preflight requests
162
+ if (requestMethod === 'OPTIONS') {
163
+ corsHeaders['Access-Control-Allow-Headers'] = 'Content-Type, Authorization';
164
+ }
165
+ return corsHeaders;
166
+ }
167
+ return null;
168
+ };
169
+ /**
170
+ * Determines whether the given input is a regular expression or resembles a URL.
171
+ * @param {string} input - The input string to evaluate.
172
+ * @returns {'regex' | 'url'} - Returns 'url' if the input looks like a URL, otherwise 'regex'.
173
+ * @public
174
+ */
175
+ export const isRegexOrUrl = (input) => {
176
+ // Remove the trailing slash.
177
+ input = input.slice(0, -1);
178
+ // Check if the string resembles a URL.
179
+ const isUrlLike = /^\/[a-zA-Z0-9\-\/]+(\?([a-zA-Z0-9\-_]+=[a-zA-Z0-9\-_]+)(&[a-zA-Z0-9\-_]+=[a-zA-Z0-9\-_]+)*)?$/.test(input);
180
+ if (isUrlLike) {
181
+ return 'url';
182
+ }
183
+ // If it doesn't resemble a URL, it's likely a regular expression.
184
+ return 'regex';
185
+ };
186
+ /**
187
+ * Compares two URLSearchParams objects to determine if they are equal.
188
+ * @param {URLSearchParams} params1 - The first set of URL search parameters.
189
+ * @param {URLSearchParams} params2 - The second set of URL search parameters.
190
+ * @returns {boolean} - Returns true if the parameters are equal, otherwise false.
191
+ * @public
192
+ */
193
+ export const areURLSearchParamsEqual = (params1, params2) => {
194
+ // Generates a sorted string representation of URL search parameters.
195
+ const getSortedParamsString = (params) => {
196
+ return [...params.entries()]
197
+ .sort(([keyA], [keyB]) => keyA.localeCompare(keyB))
198
+ .map(([key, value]) => `${key}=${value}`)
199
+ .join('&');
200
+ };
201
+ // Compare the sorted strings of both parameter sets.
202
+ return getSortedParamsString(params1) === getSortedParamsString(params2);
203
+ };
204
+ /**
205
+ * Escapes non-special "?" characters in a string or regex.
206
+ * - For regex patterns that start with `^` or end with `$`, it returns the pattern unchanged.
207
+ * - For other strings, it escapes literal "?" characters but preserves regex quantifiers and special patterns.
208
+ * @param {string} input - The input string or regex pattern.
209
+ * @returns {string} - The modified string or regex with non-special "?" characters escaped.
210
+ * @public
211
+ */
212
+ export const escapeNonSpecialQuestionMarks = (input) => {
213
+ // If the input is already a regex pattern (starts with ^ or ends with $), return it unchanged
214
+ if (input.startsWith('^') || input.endsWith('$')) {
215
+ return input;
216
+ }
217
+ // For non-regex strings, escape literal "?" characters
218
+ return input.replace(/\?/g, '\\?');
219
+ };
220
+ /**
221
+ * Merges two URLSearchParams objects. If both objects contain the same key, the value from the second object overrides the first.
222
+ * @param {URLSearchParams} params1 - The first set of URL search parameters.
223
+ * @param {URLSearchParams} params2 - The second set of URL search parameters.
224
+ * @returns {string} - A string representation of the merged URL search parameters.
225
+ * @public
226
+ */
227
+ export const mergeURLSearchParams = (params1, params2) => {
228
+ const merged = new URLSearchParams();
229
+ // Add all keys and values from the first object.
230
+ for (const [key, value] of params1.entries()) {
231
+ merged.set(key, value);
232
+ }
233
+ // Add all keys and values from the second object, replacing existing ones.
234
+ for (const [key, value] of params2.entries()) {
235
+ merged.set(key, value);
236
+ }
237
+ return merged.toString();
238
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sitecore-content-sdk/core",
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 \"./src/**/*.test.ts\"",
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/core --entryPoints src/index.ts --entryPoints src/config/index.ts --entryPoints src/client/index.ts --entryPoints src/i18n/index.ts --entryPoints src/layout/index.ts --entryPoints src/media/index.ts --entryPoints src/personalize/index.ts --entryPoints src/site/index.ts --entryPoints src/tracking/index.ts --entryPoints src/utils/index.ts --entryPoints src/editing/index.ts --entryPoints src/tools/index.ts --entryPoints src/codegen/index.ts --githubPages false"
18
+ "generate-docs": "npx typedoc --plugin typedoc-plugin-markdown --outputFileStrategy Members --parametersFormat table --readme none --out ../../ref-docs/core --entryPoints src/index.ts --entryPoints src/config/index.ts --entryPoints src/client/index.ts --entryPoints src/i18n/index.ts --entryPoints src/layout/index.ts --entryPoints src/media/index.ts --entryPoints src/personalize/index.ts --entryPoints src/site/index.ts --entryPoints src/tracking/index.ts --entryPoints src/utils/index.ts --entryPoints src/editing/index.ts --entryPoints src/tools/index.ts --entryPoints src/codegen/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"
@@ -85,11 +87,77 @@
85
87
  },
86
88
  "description": "",
87
89
  "types": "types/index.d.ts",
88
- "gitHead": "0d8d7e51f8e2936401b42dd3ace082abf748a27a",
90
+ "gitHead": "a566163f138188b5b3d22dbf2d87f373a1eb0715",
89
91
  "files": [
90
92
  "dist",
91
93
  "types",
92
- "/*.js",
93
94
  "/*.d.ts"
94
- ]
95
+ ],
96
+ "exports": {
97
+ ".": {
98
+ "import": "./dist/esm/index.js",
99
+ "require": "./dist/cjs/index.js",
100
+ "types": "./types/index.d.ts"
101
+ },
102
+ "./client": {
103
+ "import": "./dist/esm/client/index.js",
104
+ "require": "./dist/cjs/client/index.js",
105
+ "types": "./types/client/index.d.ts"
106
+ },
107
+ "./config": {
108
+ "import": "./dist/esm/config/index.js",
109
+ "require": "./dist/cjs/config/index.js",
110
+ "types": "./types/config/index.d.ts"
111
+ },
112
+ "./config-cli": {
113
+ "import": "./dist/esm/config-cli/index.js",
114
+ "require": "./dist/cjs/config-cli/index.js",
115
+ "types": "./types/config-cli/index.d.ts"
116
+ },
117
+ "./codegen": {
118
+ "import": "./dist/esm/editing/codegen/index.js",
119
+ "require": "./dist/cjs/editing/codegen/index.js",
120
+ "types": "./types/editing/codegen/index.d.ts"
121
+ },
122
+ "./editing": {
123
+ "import": "./dist/esm/editing/index.js",
124
+ "require": "./dist/cjs/editing/index.js",
125
+ "types": "./types/editing/index.d.ts"
126
+ },
127
+ "./i18n": {
128
+ "import": "./dist/esm/i18n/index.js",
129
+ "require": "./dist/cjs/i18n/index.js",
130
+ "types": "./types/i18n/index.d.ts"
131
+ },
132
+ "./layout": {
133
+ "import": "./dist/esm/layout/index.js",
134
+ "require": "./dist/cjs/layout/index.js",
135
+ "types": "./types/layout/index.d.ts"
136
+ },
137
+ "./media": {
138
+ "import": "./dist/esm/media/index.js",
139
+ "require": "./dist/cjs/media/index.js",
140
+ "types": "./types/media/index.d.ts"
141
+ },
142
+ "./personalize": {
143
+ "import": "./dist/esm/personalize/index.js",
144
+ "require": "./dist/cjs/personalize/index.js",
145
+ "types": "./types/personalize/index.d.ts"
146
+ },
147
+ "./site": {
148
+ "import": "./dist/esm/site/index.js",
149
+ "require": "./dist/cjs/site/index.js",
150
+ "types": "./types/site/index.d.ts"
151
+ },
152
+ "./tools": {
153
+ "import": "./dist/esm/tools/index.js",
154
+ "require": "./dist/cjs/tools/index.js",
155
+ "types": "./types/tools/index.d.ts"
156
+ },
157
+ "./utils": {
158
+ "import": "./dist/esm/utils/index.js",
159
+ "require": "./dist/cjs/utils/index.js",
160
+ "types": "./types/utils/index.d.ts"
161
+ }
162
+ }
95
163
  }