@websolutespa/bom-next 3.0.0 → 3.0.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 (313) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/dist/_virtual/_rolldown/runtime.js +24 -0
  3. package/dist/client/client.d.ts +9 -0
  4. package/dist/client/client.d.ts.map +1 -0
  5. package/dist/client/client.js +18 -0
  6. package/dist/client/client.js.map +1 -0
  7. package/dist/client/extra.d.ts +17 -0
  8. package/dist/client/extra.d.ts.map +1 -0
  9. package/dist/client/extra.js +13 -0
  10. package/dist/client/extra.js.map +1 -0
  11. package/dist/client/label.d.ts +15 -0
  12. package/dist/client/label.d.ts.map +1 -0
  13. package/dist/client/label.js +20 -0
  14. package/dist/client/label.js.map +1 -0
  15. package/dist/client/layout.d.ts +18 -0
  16. package/dist/client/layout.d.ts.map +1 -0
  17. package/dist/client/layout.js +13 -0
  18. package/dist/client/layout.js.map +1 -0
  19. package/dist/client/local.collection.d.ts +32 -0
  20. package/dist/client/local.collection.d.ts.map +1 -0
  21. package/dist/client/local.collection.js +49 -0
  22. package/dist/client/local.collection.js.map +1 -0
  23. package/dist/client/metadata.d.ts +43 -0
  24. package/dist/client/metadata.d.ts.map +1 -0
  25. package/dist/client/metadata.js +146 -0
  26. package/dist/client/metadata.js.map +1 -0
  27. package/dist/client/page.d.ts +404 -0
  28. package/dist/client/page.d.ts.map +1 -0
  29. package/dist/client/page.js +13 -0
  30. package/dist/client/page.js.map +1 -0
  31. package/dist/client/useApi.d.ts +21 -0
  32. package/dist/client/useApi.d.ts.map +1 -0
  33. package/dist/client/useApi.js +65 -0
  34. package/dist/client/useApi.js.map +1 -0
  35. package/dist/client/useCollectionApi.d.ts +21 -0
  36. package/dist/client/useCollectionApi.d.ts.map +1 -0
  37. package/dist/client/useCollectionApi.js +65 -0
  38. package/dist/client/useCollectionApi.js.map +1 -0
  39. package/dist/client/useExtra.d.ts +9 -0
  40. package/dist/client/useExtra.d.ts.map +1 -0
  41. package/dist/client/useExtra.js +13 -0
  42. package/dist/client/useExtra.js.map +1 -0
  43. package/dist/client/useHttp.d.ts +15 -0
  44. package/dist/client/useHttp.d.ts.map +1 -0
  45. package/dist/client/useHttp.js +70 -0
  46. package/dist/client/useHttp.js.map +1 -0
  47. package/dist/client/useLabel.d.ts +9 -0
  48. package/dist/client/useLabel.d.ts.map +1 -0
  49. package/dist/client/useLabel.js +13 -0
  50. package/dist/client/useLabel.js.map +1 -0
  51. package/dist/client/useLayout.d.ts +9 -0
  52. package/dist/client/useLayout.d.ts.map +1 -0
  53. package/dist/client/useLayout.js +13 -0
  54. package/dist/client/useLayout.js.map +1 -0
  55. package/dist/client/useLink.d.ts +7 -0
  56. package/dist/client/useLink.d.ts.map +1 -0
  57. package/dist/client/useLink.js +15 -0
  58. package/dist/client/useLink.js.map +1 -0
  59. package/dist/client/useMetaData.d.ts +9 -0
  60. package/dist/client/useMetaData.d.ts.map +1 -0
  61. package/dist/client/useMetaData.js +13 -0
  62. package/dist/client/useMetaData.js.map +1 -0
  63. package/dist/client/usePage.d.ts +394 -0
  64. package/dist/client/usePage.d.ts.map +1 -0
  65. package/dist/client/usePage.js +13 -0
  66. package/dist/client/usePage.js.map +1 -0
  67. package/dist/client/useUser.d.ts +9 -0
  68. package/dist/client/useUser.d.ts.map +1 -0
  69. package/dist/client/useUser.js +13 -0
  70. package/dist/client/useUser.js.map +1 -0
  71. package/dist/client/user.d.ts +20 -0
  72. package/dist/client/user.d.ts.map +1 -0
  73. package/dist/client/user.js +33 -0
  74. package/dist/client/user.js.map +1 -0
  75. package/dist/exports/client.d.ts +20 -0
  76. package/dist/exports/client.js +19 -5734
  77. package/dist/exports/instrumentation.d.ts +2 -0
  78. package/dist/exports/instrumentation.js +1 -24
  79. package/dist/exports/proxy.d.ts +5 -0
  80. package/dist/exports/proxy.js +4 -253
  81. package/dist/exports/server.d.ts +19 -0
  82. package/dist/exports/server.js +18 -1973
  83. package/dist/index.d.ts +18 -0
  84. package/dist/index.js +10 -200
  85. package/dist/instrumentation/client.d.ts +8 -0
  86. package/dist/instrumentation/client.d.ts.map +1 -0
  87. package/dist/instrumentation/client.js +15 -0
  88. package/dist/instrumentation/client.js.map +1 -0
  89. package/dist/instrumentation/sentry/capture.requestError.js +10 -0
  90. package/dist/instrumentation/sentry/capture.requestError.js.map +1 -0
  91. package/dist/instrumentation/sentry/capture.routerTransitionStart.js +7 -0
  92. package/dist/instrumentation/sentry/capture.routerTransitionStart.js.map +1 -0
  93. package/dist/{exports/instrumentation-DBO6QH4d.d.ts → instrumentation/server.d.ts} +2 -2
  94. package/dist/instrumentation/server.d.ts.map +1 -0
  95. package/dist/instrumentation/server.js +19 -0
  96. package/dist/instrumentation/server.js.map +1 -0
  97. package/dist/{types-BatUTdbZ.d.ts → instrumentation/types.d.ts} +2 -2
  98. package/dist/instrumentation/types.d.ts.map +1 -0
  99. package/dist/lib/breadcrumb.d.ts +15 -0
  100. package/dist/lib/breadcrumb.d.ts.map +1 -0
  101. package/dist/lib/breadcrumb.js +20 -0
  102. package/dist/lib/breadcrumb.js.map +1 -0
  103. package/dist/lib/const.d.ts +9 -0
  104. package/dist/lib/const.d.ts.map +1 -0
  105. package/dist/lib/const.js +9 -0
  106. package/dist/lib/const.js.map +1 -0
  107. package/dist/lib/http.d.ts +36 -0
  108. package/dist/lib/http.d.ts.map +1 -0
  109. package/dist/{http-_2M-UFRx.js → lib/http.js} +2 -2
  110. package/dist/lib/http.js.map +1 -0
  111. package/dist/lib/label.d.ts +16 -0
  112. package/dist/lib/label.d.ts.map +1 -0
  113. package/dist/lib/label.js +33 -0
  114. package/dist/lib/label.js.map +1 -0
  115. package/dist/lib/layout.defaults.d.ts +9 -0
  116. package/dist/lib/layout.defaults.d.ts.map +1 -0
  117. package/dist/lib/layout.defaults.js +161 -0
  118. package/dist/lib/layout.defaults.js.map +1 -0
  119. package/dist/lib/link.d.ts +9 -0
  120. package/dist/lib/link.d.ts.map +1 -0
  121. package/dist/lib/link.js +16 -0
  122. package/dist/lib/link.js.map +1 -0
  123. package/dist/lib/meta-data.d.ts +56 -0
  124. package/dist/lib/meta-data.d.ts.map +1 -0
  125. package/dist/lib/open-graph.d.ts +143 -0
  126. package/dist/lib/open-graph.d.ts.map +1 -0
  127. package/dist/lib/pagination.d.ts +27 -0
  128. package/dist/lib/pagination.d.ts.map +1 -0
  129. package/dist/lib/pagination.js +39 -0
  130. package/dist/lib/pagination.js.map +1 -0
  131. package/dist/lib/route.d.ts +17 -0
  132. package/dist/lib/route.d.ts.map +1 -0
  133. package/dist/{route-DzFwERQP.js → lib/route.js} +2 -2
  134. package/dist/lib/route.js.map +1 -0
  135. package/dist/lib/store.d.ts +27 -0
  136. package/dist/lib/store.d.ts.map +1 -0
  137. package/dist/{store-CJzqrHsl.js → lib/store.js} +2 -25
  138. package/dist/lib/store.js.map +1 -0
  139. package/dist/lib/structured-data.d.ts +9 -0
  140. package/dist/lib/structured-data.d.ts.map +1 -0
  141. package/dist/lib/twitter-card.d.ts +43 -0
  142. package/dist/lib/twitter-card.d.ts.map +1 -0
  143. package/dist/lib/utils.d.ts +13 -0
  144. package/dist/lib/utils.d.ts.map +1 -0
  145. package/dist/lib/utils.js +35 -0
  146. package/dist/lib/utils.js.map +1 -0
  147. package/dist/mock.d.ts +127 -0
  148. package/dist/mock.d.ts.map +1 -0
  149. package/dist/node_modules/@selderee/plugin-htmlparser2/lib/hp2-builder.js +75 -0
  150. package/dist/node_modules/@selderee/plugin-htmlparser2/lib/hp2-builder.js.map +1 -0
  151. package/dist/node_modules/deepmerge/dist/cjs.js +86 -0
  152. package/dist/node_modules/deepmerge/dist/cjs.js.map +1 -0
  153. package/dist/node_modules/dom-serializer/lib/esm/foreignNames.js +105 -0
  154. package/dist/node_modules/dom-serializer/lib/esm/foreignNames.js.map +1 -0
  155. package/dist/node_modules/dom-serializer/lib/esm/index.js +146 -0
  156. package/dist/node_modules/dom-serializer/lib/esm/index.js.map +1 -0
  157. package/dist/node_modules/domelementtype/lib/esm/index.js +53 -0
  158. package/dist/node_modules/domelementtype/lib/esm/index.js.map +1 -0
  159. package/dist/node_modules/domhandler/lib/esm/index.js +130 -0
  160. package/dist/node_modules/domhandler/lib/esm/index.js.map +1 -0
  161. package/dist/node_modules/domhandler/lib/esm/node.js +307 -0
  162. package/dist/node_modules/domhandler/lib/esm/node.js.map +1 -0
  163. package/dist/node_modules/entities/lib/esm/decode.js +363 -0
  164. package/dist/node_modules/entities/lib/esm/decode.js.map +1 -0
  165. package/dist/node_modules/entities/lib/esm/decode_codepoint.js +59 -0
  166. package/dist/node_modules/entities/lib/esm/decode_codepoint.js.map +1 -0
  167. package/dist/node_modules/entities/lib/esm/escape.js +85 -0
  168. package/dist/node_modules/entities/lib/esm/escape.js.map +1 -0
  169. package/dist/node_modules/entities/lib/esm/generated/decode-data-html.js +6 -0
  170. package/dist/node_modules/entities/lib/esm/generated/decode-data-html.js.map +1 -0
  171. package/dist/node_modules/entities/lib/esm/generated/decode-data-xml.js +6 -0
  172. package/dist/node_modules/entities/lib/esm/generated/decode-data-xml.js.map +1 -0
  173. package/dist/node_modules/html-to-text/lib/html-to-text.js +1816 -0
  174. package/dist/node_modules/html-to-text/lib/html-to-text.js.map +1 -0
  175. package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/Parser.js +435 -0
  176. package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/Parser.js.map +1 -0
  177. package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/Tokenizer.js +736 -0
  178. package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/Tokenizer.js.map +1 -0
  179. package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/index.js +19 -0
  180. package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/index.js.map +1 -0
  181. package/dist/node_modules/leac/lib/leac.js +101 -0
  182. package/dist/node_modules/leac/lib/leac.js.map +1 -0
  183. package/dist/node_modules/parseley/lib/parseley.js +310 -0
  184. package/dist/node_modules/parseley/lib/parseley.js.map +1 -0
  185. package/dist/node_modules/peberminta/lib/core.js +149 -0
  186. package/dist/node_modules/peberminta/lib/core.js.map +1 -0
  187. package/dist/node_modules/selderee/lib/selderee.js +319 -0
  188. package/dist/node_modules/selderee/lib/selderee.js.map +1 -0
  189. package/dist/proxy/protected-route.d.ts +9 -0
  190. package/dist/proxy/protected-route.d.ts.map +1 -0
  191. package/dist/proxy/protected-route.js +40 -0
  192. package/dist/proxy/protected-route.js.map +1 -0
  193. package/dist/proxy/proxy.d.ts +31 -0
  194. package/dist/proxy/proxy.d.ts.map +1 -0
  195. package/dist/proxy/proxy.js +49 -0
  196. package/dist/proxy/proxy.js.map +1 -0
  197. package/dist/proxy/route-auto-detection.d.ts +12 -0
  198. package/dist/proxy/route-auto-detection.d.ts.map +1 -0
  199. package/dist/proxy/route-auto-detection.js +82 -0
  200. package/dist/proxy/route-auto-detection.js.map +1 -0
  201. package/dist/proxy/route-proxy.d.ts +36 -0
  202. package/dist/proxy/route-proxy.d.ts.map +1 -0
  203. package/dist/proxy/route-proxy.js +103 -0
  204. package/dist/proxy/route-proxy.js.map +1 -0
  205. package/dist/server/context.d.ts +30 -0
  206. package/dist/server/context.d.ts.map +1 -0
  207. package/dist/server/context.js +106 -0
  208. package/dist/server/context.js.map +1 -0
  209. package/dist/server/handlers/auth.handler.d.ts +10 -0
  210. package/dist/server/handlers/auth.handler.d.ts.map +1 -0
  211. package/dist/server/handlers/auth.handler.js +29 -0
  212. package/dist/server/handlers/auth.handler.js.map +1 -0
  213. package/dist/server/handlers/captions.handler.d.ts +10 -0
  214. package/dist/server/handlers/captions.handler.d.ts.map +1 -0
  215. package/dist/server/handlers/captions.handler.js +33 -0
  216. package/dist/server/handlers/captions.handler.js.map +1 -0
  217. package/dist/server/handlers/collection.handler.d.ts +36 -0
  218. package/dist/server/handlers/collection.handler.d.ts.map +1 -0
  219. package/dist/server/handlers/collection.handler.js +166 -0
  220. package/dist/server/handlers/collection.handler.js.map +1 -0
  221. package/dist/server/handlers/error-response.js +24 -0
  222. package/dist/server/handlers/error-response.js.map +1 -0
  223. package/dist/server/handlers/index.handler.d.ts +9 -0
  224. package/dist/server/handlers/index.handler.d.ts.map +1 -0
  225. package/dist/server/handlers/index.handler.js +145 -0
  226. package/dist/server/handlers/index.handler.js.map +1 -0
  227. package/dist/server/handlers/preview.handler.d.ts +9 -0
  228. package/dist/server/handlers/preview.handler.d.ts.map +1 -0
  229. package/dist/server/handlers/preview.handler.js +15 -0
  230. package/dist/server/handlers/preview.handler.js.map +1 -0
  231. package/dist/server/handlers/registry.handler.d.ts +16 -0
  232. package/dist/server/handlers/registry.handler.d.ts.map +1 -0
  233. package/dist/server/handlers/registry.handler.js +260 -0
  234. package/dist/server/handlers/registry.handler.js.map +1 -0
  235. package/dist/server/handlers/route.handler.d.ts +20 -0
  236. package/dist/server/handlers/route.handler.d.ts.map +1 -0
  237. package/dist/server/handlers/route.handler.js +122 -0
  238. package/dist/server/handlers/route.handler.js.map +1 -0
  239. package/dist/server/handlers/sitemap.handler.d.ts +30 -0
  240. package/dist/server/handlers/sitemap.handler.d.ts.map +1 -0
  241. package/dist/server/handlers/sitemap.handler.js +338 -0
  242. package/dist/server/handlers/sitemap.handler.js.map +1 -0
  243. package/dist/server/handlers/static-params.handler.d.ts +24 -0
  244. package/dist/server/handlers/static-params.handler.d.ts.map +1 -0
  245. package/dist/server/handlers/static-params.handler.js +56 -0
  246. package/dist/server/handlers/static-params.handler.js.map +1 -0
  247. package/dist/server/handlers/vars.handler.d.ts +10 -0
  248. package/dist/server/handlers/vars.handler.d.ts.map +1 -0
  249. package/dist/server/handlers/vars.handler.js +159 -0
  250. package/dist/server/handlers/vars.handler.js.map +1 -0
  251. package/dist/server/layout.js +88 -0
  252. package/dist/server/layout.js.map +1 -0
  253. package/dist/server/lazy.d.ts +11 -0
  254. package/dist/server/lazy.d.ts.map +1 -0
  255. package/dist/server/lazy.js +33 -0
  256. package/dist/server/lazy.js.map +1 -0
  257. package/dist/server/local-api.d.ts +9 -0
  258. package/dist/server/local-api.d.ts.map +1 -0
  259. package/dist/server/local-api.js +60 -0
  260. package/dist/server/local-api.js.map +1 -0
  261. package/dist/server/metadata.d.ts +21 -0
  262. package/dist/server/metadata.d.ts.map +1 -0
  263. package/dist/server/metadata.js +20 -0
  264. package/dist/server/metadata.js.map +1 -0
  265. package/dist/server/mixer-payload.d.ts +63 -0
  266. package/dist/server/mixer-payload.d.ts.map +1 -0
  267. package/dist/server/mixer.d.ts +214 -0
  268. package/dist/server/mixer.d.ts.map +1 -0
  269. package/dist/server/mixer.js +355 -0
  270. package/dist/server/mixer.js.map +1 -0
  271. package/dist/server/page.d.ts +22 -0
  272. package/dist/server/page.d.ts.map +1 -0
  273. package/dist/server/page.js +57 -0
  274. package/dist/server/page.js.map +1 -0
  275. package/dist/server/utils.d.ts +12 -0
  276. package/dist/server/utils.d.ts.map +1 -0
  277. package/dist/{utils-YwteTbk7.js → server/utils.js} +3 -3
  278. package/dist/server/utils.js.map +1 -0
  279. package/dist/server/utmz.d.ts +9 -0
  280. package/dist/server/utmz.d.ts.map +1 -0
  281. package/dist/server/utmz.js +14 -0
  282. package/dist/server/utmz.js.map +1 -0
  283. package/dist/types.d.ts +136 -0
  284. package/dist/types.d.ts.map +1 -0
  285. package/package.json +1 -1
  286. package/src/index.ts +0 -1
  287. package/dist/exports/client-xcFJNcG7.d.ts +0 -979
  288. package/dist/exports/client-xcFJNcG7.d.ts.map +0 -1
  289. package/dist/exports/client.js.map +0 -1
  290. package/dist/exports/instrumentation-DBO6QH4d.d.ts.map +0 -1
  291. package/dist/exports/instrumentation.js.map +0 -1
  292. package/dist/exports/proxy-Cv7QFVci.d.ts +0 -71
  293. package/dist/exports/proxy-Cv7QFVci.d.ts.map +0 -1
  294. package/dist/exports/proxy.js.map +0 -1
  295. package/dist/exports/server-BHObJHJ6.d.ts +0 -402
  296. package/dist/exports/server-BHObJHJ6.d.ts.map +0 -1
  297. package/dist/exports/server.js.map +0 -1
  298. package/dist/http-_2M-UFRx.js.map +0 -1
  299. package/dist/index-CdYcvudT.d.ts +0 -4
  300. package/dist/index-CtfAJ0y7.d.ts +0 -499
  301. package/dist/index-CtfAJ0y7.d.ts.map +0 -1
  302. package/dist/index.js.map +0 -1
  303. package/dist/route-DzFwERQP.js.map +0 -1
  304. package/dist/store-CJzqrHsl.js.map +0 -1
  305. package/dist/types-BatUTdbZ.d.ts.map +0 -1
  306. package/dist/types-D29_snYY.d.ts +0 -191
  307. package/dist/types-D29_snYY.d.ts.map +0 -1
  308. package/dist/utils-Ca7xh5mm.js +0 -78
  309. package/dist/utils-Ca7xh5mm.js.map +0 -1
  310. package/dist/utils-YwteTbk7.js.map +0 -1
  311. /package/dist/{config.client-B8As5DY0.js → instrumentation/sentry/config.client.js} +0 -0
  312. /package/dist/{config.edge-B8As5DY0.js → instrumentation/sentry/config.edge.js} +0 -0
  313. /package/dist/{config.server-B8As5DY0.js → instrumentation/sentry/config.server.js} +0 -0
@@ -0,0 +1,338 @@
1
+ import { getPayload } from "../mixer.js";
2
+ import { getHandlerErrorResponse } from "./error-response.js";
3
+ import { defaultLocale, defaultMarket, eachMarketLocale } from "@websolutespa/bom-core";
4
+ //#region src/server/handlers/sitemap.handler.ts
5
+ const origin = process.env.NEXT_PUBLIC_URL || "";
6
+ function getSiteMapIndex(config) {
7
+ return async function(request) {
8
+ try {
9
+ const { getContext } = await getPayload({ config });
10
+ const { markets, locales, routes } = await getContext(defaultMarket, defaultLocale);
11
+ const sitemaps = [];
12
+ const getTime = (date) => {
13
+ return typeof date !== "undefined" ? (typeof date === "string" ? new Date(date) : date).getTime() : 0;
14
+ };
15
+ eachMarketLocale(markets, locales, (market, locale, markets, locales) => {
16
+ const sitemapRoutes = routes.filter((x) => x.market === market.id && x.locale === locale.id);
17
+ sitemapRoutes.sort((a, b) => getTime(a.updatedAt) - getTime(b.updatedAt));
18
+ sitemaps.push({
19
+ id: `/${market.id}/${locale.id}/sitemap.xml`,
20
+ updatedAt: sitemapRoutes.length > 0 ? sitemapRoutes[sitemapRoutes.length - 1].updatedAt : void 0
21
+ });
22
+ });
23
+ const body = `<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="${origin}/sitemap.xsl"?>
24
+ <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
25
+ ${sitemaps.map((sitemap) => `
26
+ <sitemap>
27
+ <loc>${escapeHtml(encodeURI(`${origin}${sitemap.id}`))}</loc>${sitemap.updatedAt ? `
28
+ <lastmod>${escapeHtml(String(sitemap.updatedAt))}</lastmod>` : ""}
29
+ </sitemap>
30
+ `).join("")}
31
+ </sitemapindex>`;
32
+ return new Response(body, {
33
+ status: 200,
34
+ headers: {
35
+ "Content-Type": "application/xml; charset=UTF-8",
36
+ "X-Frame-Options": "SAMEORIGIN",
37
+ "X-Robots-Tag": "noindex, follow"
38
+ }
39
+ });
40
+ } catch (error) {
41
+ const response = getHandlerErrorResponse(error);
42
+ console.error("storeHandler.sitemapIndex.error", response.status, error);
43
+ return response;
44
+ }
45
+ };
46
+ }
47
+ function getSiteMapXML(config) {
48
+ return async function(request, { params: getParams }) {
49
+ try {
50
+ const params = await getParams;
51
+ const market = params?.market || defaultMarket;
52
+ const locale = params?.locale || defaultLocale;
53
+ const { getContext } = await getPayload({ config });
54
+ const { markets, locales, routes } = await getContext(market, locale);
55
+ const selectedMarket = markets.find((x) => market ? x.id === market : x.isDefault) || markets[0];
56
+ const selectedLocale = locales.find((x) => locale ? x.id === locale : x.isDefault) || locales[0];
57
+ const selectedMarketLocale = selectedMarket && selectedMarket.defaultLanguage ? selectedMarket.defaultLanguage : selectedLocale.id;
58
+ const isCanonicalRoute = market && locale ? (route) => {
59
+ return route.noindex !== true && route.market === selectedMarket.id && route.locale === selectedLocale.id;
60
+ } : (route) => {
61
+ return route.noindex !== true && route.market === selectedMarket.id && route.locale === selectedMarketLocale;
62
+ };
63
+ const getCanonicalAlternates = market && locale ? (canonical) => {
64
+ return [];
65
+ } : (canonical) => {
66
+ return routes.filter((alternate) => {
67
+ return alternate !== canonical && alternate.schema === canonical.schema && alternate.page === canonical.page;
68
+ });
69
+ };
70
+ const routeToRouteCanonical = (canonical) => {
71
+ const alternates = getCanonicalAlternates(canonical);
72
+ return {
73
+ ...canonical,
74
+ alternates
75
+ };
76
+ };
77
+ const canonicalRoutes = routes.filter(isCanonicalRoute).map(routeToRouteCanonical);
78
+ const body = `<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="${origin}/sitemap.xsl"?>
79
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
80
+ xmlns:xhtml="http://www.w3.org/1999/xhtml"
81
+ xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
82
+ ${getSiteMapXMLUrls(origin, canonicalRoutes)}
83
+ </urlset>
84
+ `;
85
+ return new Response(body, {
86
+ status: 200,
87
+ headers: {
88
+ "Content-Type": "application/xml; charset=UTF-8",
89
+ "X-Frame-Options": "SAMEORIGIN",
90
+ "X-Robots-Tag": "noindex, follow"
91
+ }
92
+ });
93
+ } catch (error) {
94
+ const response = getHandlerErrorResponse(error);
95
+ console.error("storeHandler.sitemapXml.error", response.status, error);
96
+ return response;
97
+ }
98
+ };
99
+ }
100
+ function getSiteMapXSL(config) {
101
+ return async function(request, { params: getParams }) {
102
+ try {
103
+ const body = `<?xml version="1.0" encoding="UTF-8"?>
104
+ <xsl:stylesheet version="2.0"
105
+ xmlns:html="http://www.w3.org/TR/REC-html40"
106
+ xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"
107
+ xmlns:sitemap="http://www.sitemaps.org/schemas/sitemap/0.9"
108
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
109
+ <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
110
+ <xsl:template match="/">
111
+ <html lang="${(await getParams)?.locale || defaultLocale}" xmlns="http://www.w3.org/1999/xhtml">
112
+ <head>
113
+ <title>XML Sitemap</title>
114
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
115
+ <style type="text/css">
116
+ html {
117
+ padding: 0;
118
+ background: #09090A;
119
+ color: #fefefe;
120
+ }
121
+ body {
122
+ padding: 15px;
123
+ font-family: Inter,-apple-system,'Helvetica Neue','Segoe UI',Roboto,Arial,'Noto Sans',sans-serif;
124
+ font-size: 13px;
125
+ background: #09090A;
126
+ color: #fefefe;
127
+ }
128
+ .container {
129
+ margin: 0 auto;
130
+ max-width: 1280px;
131
+ }
132
+ a {
133
+ color: #fefefe;
134
+ text-decoration: none;
135
+ }
136
+ a:visited {
137
+ color: #9e9e9e;
138
+ }
139
+ a:hover {
140
+ text-decoration: underline;
141
+ }
142
+ table {
143
+ width: 100%;
144
+ margin: 10px 0;
145
+ border: none;
146
+ border-collapse: collapse;
147
+ }
148
+ td,
149
+ th {
150
+ text-align: left;
151
+ font-size: 12px;
152
+ padding: 3px;
153
+ }
154
+ th:not(:last-child),
155
+ td:not(:last-child) {
156
+ padding-right: 30px;
157
+ }
158
+ thead th {
159
+ border-bottom: 1px solid #0e0e0f;
160
+ }
161
+ #sitemap tr:nth-child(odd) td {
162
+ background-color: #0e0e0f;
163
+ }
164
+ #sitemap tbody tr:hover td {
165
+ background-color: #1A1A1B;
166
+ }
167
+ #sitemap tbody tr:hover td,
168
+ #sitemap tbody tr:hover td a {
169
+ color: #fefefe;
170
+ }
171
+ .wysiwyg {
172
+ margin: 0;
173
+ padding: 0 0 10px 0;
174
+ line-height: 1.2em;
175
+ }
176
+ .wysiwyg a {
177
+ color: #00ea4e;
178
+ font-weight: 600;
179
+ }
180
+ .wysiwyg a:visited {
181
+ color: #00ea4e;
182
+ }
183
+ </style>
184
+ </head>
185
+ <body>
186
+ <div class="container">
187
+ <h1>XML Sitemap</h1>
188
+ <p class="wysiwyg">
189
+ This is an XML Sitemap meant for consumption by search engines, generated by <a href="https://github.com/websolutespa/bom" target="_blank" rel="noopener">Mixer</a>.
190
+ </p>
191
+ <p class="wysiwyg">
192
+ You can find more information about XML sitemaps on <a href="https://sitemaps.org" target="_blank" rel="noopener">sitemaps.org</a>.
193
+ </p>
194
+ <xsl:if test="count(sitemap:sitemapindex/sitemap:sitemap) &gt; 0">
195
+ <p class="wysiwyg">
196
+ This sitemap index file contains <xsl:value-of select="count(sitemap:sitemapindex/sitemap:sitemap)"/> sitemaps.
197
+ </p>
198
+ <table id="sitemap" cellpadding="3">
199
+ <thead>
200
+ <tr>
201
+ <th width="75%">Sitemap</th>
202
+ <th width="25%" title="Last Modification Time">Updated At</th>
203
+ </tr>
204
+ </thead>
205
+ <tbody>
206
+ <xsl:for-each select="sitemap:sitemapindex/sitemap:sitemap">
207
+ <xsl:variable name="sitemapURL">
208
+ <xsl:value-of select="sitemap:loc"/>
209
+ </xsl:variable>
210
+ <tr>
211
+ <td>
212
+ <a href="{$sitemapURL}"><xsl:value-of select="sitemap:loc"/></a>
213
+ </td>
214
+ <td>
215
+ <xsl:value-of select="concat(substring(sitemap:lastmod,0,11),concat(' ', substring(sitemap:lastmod,12,5)),concat(' ', substring(sitemap:lastmod,20,6)))"/>
216
+ </td>
217
+ </tr>
218
+ </xsl:for-each>
219
+ </tbody>
220
+ </table>
221
+ </xsl:if>
222
+ <xsl:if test="count(sitemap:sitemapindex/sitemap:sitemap) &lt; 1">
223
+ <p class="wysiwyg">
224
+ This sitemap contains <xsl:value-of select="count(sitemap:urlset/sitemap:url)"/> URLs.
225
+ </p>
226
+ <table id="sitemap" cellpadding="3">
227
+ <thead>
228
+ <tr>
229
+ <th width="75%">URL</th>
230
+ <th width="15%" title="Last Modification Time">Updated At</th>
231
+ <th width="10%">Images</th>
232
+ </tr>
233
+ </thead>
234
+ <tbody>
235
+ <xsl:variable name="lower" select="'abcdefghijklmnopqrstuvwxyz'"/>
236
+ <xsl:variable name="upper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
237
+ <xsl:for-each select="sitemap:urlset/sitemap:url">
238
+ <tr>
239
+ <td>
240
+ <xsl:variable name="itemURL">
241
+ <xsl:value-of select="sitemap:loc"/>
242
+ </xsl:variable>
243
+ <a href="{$itemURL}">
244
+ <xsl:value-of select="sitemap:loc"/>
245
+ </a>
246
+ </td>
247
+ <td>
248
+ <xsl:value-of select="concat(substring(sitemap:lastmod,0,11),concat(' ', substring(sitemap:lastmod,12,5)),concat(' ', substring(sitemap:lastmod,20,6)))"/>
249
+ </td>
250
+ <td>
251
+ <xsl:value-of select="count(image:image)"/>
252
+ </td>
253
+ </tr>
254
+ </xsl:for-each>
255
+ </tbody>
256
+ </table>
257
+ </xsl:if>
258
+ </div>
259
+ </body>
260
+ </html>
261
+ </xsl:template>
262
+ </xsl:stylesheet>`;
263
+ return new Response(body, {
264
+ status: 200,
265
+ headers: {
266
+ "Content-Type": "application/xml; charset=UTF-8",
267
+ "X-Frame-Options": "SAMEORIGIN",
268
+ "X-Robots-Tag": "noindex, follow"
269
+ }
270
+ });
271
+ } catch (error) {
272
+ const response = getHandlerErrorResponse(error);
273
+ console.error("storeHandler.sitemapXsl.error", response.status, error);
274
+ return response;
275
+ }
276
+ };
277
+ }
278
+ function getSiteMapXMLLastMod(canonical) {
279
+ return canonical.updatedAt ? `
280
+ <lastmod>${escapeHtml(String(canonical.updatedAt))}</lastmod>` : "";
281
+ }
282
+ function getSiteMapXMLImage(canonical) {
283
+ return canonical.media ? `
284
+ <image:image>
285
+ <image:loc>${escapeHtml(encodeURI(`${canonical.media.src || canonical.media.url}`))}</image:loc>
286
+ </image:image>` : "";
287
+ }
288
+ function getSiteMapXMLAlternates(origin, canonical) {
289
+ return canonical.alternates.map((alternate) => `
290
+ <xhtml:link href="${escapeHtml(encodeURI(`${origin}${alternate.id}`))}" hreflang="${alternate.locale}-${alternate.market}" rel="alternate" />`).join("");
291
+ }
292
+ function getSiteMapXMLUrl(origin, canonical) {
293
+ return `
294
+ <url>
295
+ <loc>${escapeHtml(encodeURI(`${origin}${canonical.id}`))}</loc>${getSiteMapXMLLastMod(canonical)}${getSiteMapXMLAlternates(origin, canonical)}${getSiteMapXMLImage(canonical)}
296
+ </url>`;
297
+ }
298
+ function escapeHtml(string) {
299
+ const matchHtmlRegExp = /["'&<>]/;
300
+ const str = "" + string;
301
+ const match = matchHtmlRegExp.exec(str);
302
+ if (!match) return str;
303
+ let escape;
304
+ let html = "";
305
+ let index = 0;
306
+ let lastIndex = 0;
307
+ for (index = match.index; index < str.length; index++) {
308
+ switch (str.charCodeAt(index)) {
309
+ case 34:
310
+ escape = "&quot;";
311
+ break;
312
+ case 38:
313
+ escape = "&amp;";
314
+ break;
315
+ case 39:
316
+ escape = "&#39;";
317
+ break;
318
+ case 60:
319
+ escape = "&lt;";
320
+ break;
321
+ case 62:
322
+ escape = "&gt;";
323
+ break;
324
+ default: continue;
325
+ }
326
+ if (lastIndex !== index) html += str.substring(lastIndex, index);
327
+ lastIndex = index + 1;
328
+ html += escape;
329
+ }
330
+ return lastIndex !== index ? html + str.substring(lastIndex, index) : html;
331
+ }
332
+ function getSiteMapXMLUrls(origin, canonicalRoutes) {
333
+ return canonicalRoutes.map((canonicalRoute) => getSiteMapXMLUrl(origin, canonicalRoute)).join("");
334
+ }
335
+ //#endregion
336
+ export { getSiteMapIndex, getSiteMapXML, getSiteMapXSL };
337
+
338
+ //# sourceMappingURL=sitemap.handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sitemap.handler.js","names":[],"sources":["../../../src/server/handlers/sitemap.handler.ts"],"sourcesContent":["import { IRoute, IRouteCanonical, defaultLocale, defaultMarket, eachMarketLocale } from '@websolutespa/bom-core';\r\nimport { NextRequest } from 'next/server';\r\nimport { SanitizedConfig } from 'payload';\r\nimport { getPayload } from '../mixer';\r\nimport { getHandlerErrorResponse } from './error-response';\r\n\r\nconst origin = process.env.NEXT_PUBLIC_URL || '';\r\n\r\nexport type ISiteMap = {\r\n id: string;\r\n updatedAt?: string | Date;\r\n};\r\n\r\nexport function getSiteMapIndex(config: Promise<SanitizedConfig>) {\r\n return async function (request: NextRequest) {\r\n try {\r\n const { getContext } = await getPayload({ config });\r\n const { markets, locales, routes } = await getContext(defaultMarket, defaultLocale);\r\n const sitemaps: ISiteMap[] = [];\r\n const getTime = (date: Date | string | undefined) => {\r\n return typeof date !== 'undefined' ? (typeof date === 'string' ? new Date(date) : date).getTime() : 0;\r\n };\r\n eachMarketLocale(markets, locales, (market, locale, markets, locales) => {\r\n const sitemapRoutes = routes.filter(x => x.market === market.id && x.locale === locale.id);\r\n sitemapRoutes.sort((a, b) => getTime(a.updatedAt) - getTime(b.updatedAt));\r\n // console.log(sitemapRoutes.shift(), sitemapRoutes.pop());\r\n sitemaps.push({\r\n id: `/${market.id}/${locale.id}/sitemap.xml`,\r\n updatedAt: sitemapRoutes.length > 0 ? sitemapRoutes[sitemapRoutes.length - 1]!.updatedAt : undefined,\r\n });\r\n });\r\n const body = `<?xml version=\"1.0\" encoding=\"UTF-8\"?><?xml-stylesheet type=\"text/xsl\" href=\"${origin}/sitemap.xsl\"?>\r\n<sitemapindex xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\r\n${sitemaps.map(sitemap => `\r\n <sitemap>\r\n <loc>${escapeHtml(encodeURI(`${origin}${sitemap.id}`))}</loc>${sitemap.updatedAt ? `\r\n <lastmod>${escapeHtml(String(sitemap.updatedAt))}</lastmod>` : ''}\r\n </sitemap>\r\n`).join('')}\r\n</sitemapindex>`;\r\n return new Response(body, {\r\n status: 200,\r\n headers: {\r\n 'Content-Type': 'application/xml; charset=UTF-8',\r\n 'X-Frame-Options': 'SAMEORIGIN',\r\n 'X-Robots-Tag': 'noindex, follow',\r\n },\r\n });\r\n } catch (error: unknown) {\r\n const response = getHandlerErrorResponse(error);\r\n console.error('storeHandler.sitemapIndex.error', response.status, error);\r\n return response;\r\n }\r\n };\r\n}\r\n\r\nexport function getSiteMapXML(config: Promise<SanitizedConfig>) {\r\n return async function (request: NextRequest, {\r\n params: getParams,\r\n }: {\r\n params: Promise<{ market?: string; locale?: string; }>;\r\n }) {\r\n try {\r\n const params = await getParams;\r\n const market = params?.market || defaultMarket;\r\n const locale = params?.locale || defaultLocale;\r\n const { getContext } = await getPayload({ config });\r\n const { markets, locales, routes } = await getContext(market, locale);\r\n const selectedMarket = markets.find(x => market ? x.id === market : x.isDefault) || markets[0]!;\r\n const selectedLocale = locales.find(x => locale ? x.id === locale : x.isDefault) || locales[0]!;\r\n const selectedMarketLocale = selectedMarket && selectedMarket.defaultLanguage ? selectedMarket.defaultLanguage : selectedLocale.id;\r\n const isCanonicalRoute: (route: IRoute) => boolean = (market && locale) ? (route) => {\r\n return route.noindex !== true && route.market === selectedMarket.id && route.locale === selectedLocale.id;\r\n } : (route) => {\r\n return route.noindex !== true && route.market === selectedMarket.id && route.locale === selectedMarketLocale;\r\n };\r\n const getCanonicalAlternates: (canonical: IRoute) => IRoute[] = (market && locale) ? (canonical) => {\r\n return [];\r\n } : (canonical) => {\r\n return routes.filter(alternate => {\r\n return alternate !== canonical && alternate.schema === canonical.schema && alternate.page === canonical.page;\r\n });\r\n };\r\n const routeToRouteCanonical: (canonical: IRoute) => IRouteCanonical = (canonical) => {\r\n const alternates = getCanonicalAlternates(canonical);\r\n return { ...canonical, alternates };\r\n };\r\n const canonicalRoutes: IRouteCanonical[] = routes.filter(isCanonicalRoute).map(routeToRouteCanonical);\r\n const body = `<?xml version=\"1.0\" encoding=\"UTF-8\"?><?xml-stylesheet type=\"text/xsl\" href=\"${origin}/sitemap.xsl\"?>\r\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\r\n xmlns:xhtml=\"http://www.w3.org/1999/xhtml\"\r\n xmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\">\r\n${getSiteMapXMLUrls(origin, canonicalRoutes)}\r\n</urlset>\r\n `;\r\n return new Response(body, {\r\n status: 200,\r\n headers: {\r\n 'Content-Type': 'application/xml; charset=UTF-8',\r\n 'X-Frame-Options': 'SAMEORIGIN',\r\n 'X-Robots-Tag': 'noindex, follow',\r\n },\r\n });\r\n } catch (error: unknown) {\r\n const response = getHandlerErrorResponse(error);\r\n console.error('storeHandler.sitemapXml.error', response.status, error);\r\n return response;\r\n }\r\n };\r\n}\r\n\r\nexport function getSiteMapXSL(config: Promise<SanitizedConfig>) {\r\n return async function (request: NextRequest, {\r\n params: getParams,\r\n }: {\r\n params: Promise<{ market?: string; locale?: string; }>;\r\n }) {\r\n try {\r\n const params = await getParams;\r\n const locale = params?.locale || defaultLocale;\r\n const body = /* html */`<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n\t<xsl:stylesheet version=\"2.0\"\r\n\t\txmlns:html=\"http://www.w3.org/TR/REC-html40\"\r\n\t\txmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\"\r\n\t\txmlns:sitemap=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\r\n\t\txmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">\r\n\t<xsl:output method=\"html\" version=\"1.0\" encoding=\"UTF-8\" indent=\"yes\"/>\r\n\t<xsl:template match=\"/\">\r\n\t\t<html lang=\"${locale}\" xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\t\t<head>\r\n\t\t\t<title>XML Sitemap</title>\r\n\t\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n\t\t\t<style type=\"text/css\">\r\n html {\r\n padding: 0;\r\n background: #09090A;\r\n\t\t\t\t\tcolor: #fefefe;\r\n }\r\n\t\t\t\tbody {\r\n padding: 15px;\r\n\t\t\t\t\tfont-family: Inter,-apple-system,'Helvetica Neue','Segoe UI',Roboto,Arial,'Noto Sans',sans-serif;\r\n\t\t\t\t\tfont-size: 13px;\r\n background: #09090A;\r\n\t\t\t\t\tcolor: #fefefe;\r\n\t\t\t\t}\r\n\t\t\t\t.container {\r\n\t\t\t\t\tmargin: 0 auto;\r\n\t\t\t\t\tmax-width: 1280px;\r\n\t\t\t\t}\r\n\t\t\t\ta {\r\n\t\t\t\t\tcolor: #fefefe;\r\n\t\t\t\t\ttext-decoration: none;\r\n\t\t\t\t}\r\n\t\t\t\ta:visited {\r\n\t\t\t\t\tcolor: #9e9e9e;\r\n\t\t\t\t}\r\n\t\t\t\ta:hover {\r\n\t\t\t\t\ttext-decoration: underline;\r\n\t\t\t\t}\r\n\t\t\t\ttable {\r\n width: 100%;\r\n margin: 10px 0;\r\n\t\t\t\t\tborder: none;\r\n\t\t\t\t\tborder-collapse: collapse;\r\n\t\t\t\t}\r\n\t\t\t\ttd,\r\n th {\r\n\t\t\t\t\ttext-align: left;\r\n\t\t\t\t\tfont-size: 12px;\r\n padding: 3px;\r\n\t\t\t\t}\r\n\t\t\t\tth:not(:last-child),\r\n td:not(:last-child) {\r\n\t\t\t\t\tpadding-right: 30px;\r\n\t\t\t\t}\r\n\t\t\t\tthead th {\r\n\t\t\t\t\tborder-bottom: 1px solid #0e0e0f;\r\n\t\t\t\t}\r\n\t\t\t\t#sitemap tr:nth-child(odd) td {\r\n\t\t\t\t\tbackground-color: #0e0e0f;\r\n\t\t\t\t}\r\n\t\t\t\t#sitemap tbody tr:hover td {\r\n\t\t\t\t\tbackground-color: #1A1A1B;\r\n\t\t\t\t}\r\n\t\t\t\t#sitemap tbody tr:hover td,\r\n #sitemap tbody tr:hover td a {\r\n\t\t\t\t\tcolor: #fefefe;\r\n\t\t\t\t}\r\n\t\t\t\t.wysiwyg {\r\n margin: 0;\r\n\t\t\t\t\tpadding: 0 0 10px 0;\r\n\t\t\t\t\tline-height: 1.2em;\r\n\t\t\t\t}\r\n\t\t\t\t.wysiwyg a {\r\n\t\t\t\t\tcolor: #00ea4e;\r\n\t\t\t\t\tfont-weight: 600;\r\n\t\t\t\t}\r\n\t\t\t\t.wysiwyg a:visited {\r\n\t\t\t\t\tcolor: #00ea4e;\r\n\t\t\t\t}\r\n\t\t\t</style>\r\n\t\t</head>\r\n\t\t<body>\r\n\t\t<div class=\"container\">\r\n\t\t\t<h1>XML Sitemap</h1>\r\n\t\t\t<p class=\"wysiwyg\">\r\n This is an XML Sitemap meant for consumption by search engines, generated by <a href=\"https://github.com/websolutespa/bom\" target=\"_blank\" rel=\"noopener\">Mixer</a>.\r\n </p>\r\n <p class=\"wysiwyg\">\r\n\t\t\t\tYou can find more information about XML sitemaps on <a href=\"https://sitemaps.org\" target=\"_blank\" rel=\"noopener\">sitemaps.org</a>.\r\n\t\t\t</p>\r\n\t\t\t<xsl:if test=\"count(sitemap:sitemapindex/sitemap:sitemap) &gt; 0\">\r\n\t\t\t\t<p class=\"wysiwyg\">\r\n\t\t\t\t\tThis sitemap index file contains <xsl:value-of select=\"count(sitemap:sitemapindex/sitemap:sitemap)\"/> sitemaps.\r\n\t\t\t\t</p>\r\n\t\t\t\t<table id=\"sitemap\" cellpadding=\"3\">\r\n\t\t\t\t\t<thead>\r\n <tr>\r\n <th width=\"75%\">Sitemap</th>\r\n <th width=\"25%\" title=\"Last Modification Time\">Updated At</th>\r\n </tr>\r\n\t\t\t\t\t</thead>\r\n\t\t\t\t\t<tbody>\r\n\t\t\t\t\t<xsl:for-each select=\"sitemap:sitemapindex/sitemap:sitemap\">\r\n\t\t\t\t\t\t<xsl:variable name=\"sitemapURL\">\r\n\t\t\t\t\t\t\t<xsl:value-of select=\"sitemap:loc\"/>\r\n\t\t\t\t\t\t</xsl:variable>\r\n\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<a href=\"{$sitemapURL}\"><xsl:value-of select=\"sitemap:loc\"/></a>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<xsl:value-of select=\"concat(substring(sitemap:lastmod,0,11),concat(' ', substring(sitemap:lastmod,12,5)),concat(' ', substring(sitemap:lastmod,20,6)))\"/>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</xsl:for-each>\r\n\t\t\t\t\t</tbody>\r\n\t\t\t\t</table>\r\n\t\t\t</xsl:if>\r\n\t\t\t<xsl:if test=\"count(sitemap:sitemapindex/sitemap:sitemap) &lt; 1\">\r\n\t\t\t\t<p class=\"wysiwyg\">\r\n\t\t\t\t\tThis sitemap contains <xsl:value-of select=\"count(sitemap:urlset/sitemap:url)\"/> URLs.\r\n\t\t\t\t</p>\r\n\t\t\t\t<table id=\"sitemap\" cellpadding=\"3\">\r\n\t\t\t\t\t<thead>\r\n\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t<th width=\"75%\">URL</th>\r\n\t\t\t\t\t\t<th width=\"15%\" title=\"Last Modification Time\">Updated At</th>\r\n\t\t\t\t\t\t<th width=\"10%\">Images</th>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t\t</thead>\r\n\t\t\t\t\t<tbody>\r\n\t\t\t\t\t<xsl:variable name=\"lower\" select=\"'abcdefghijklmnopqrstuvwxyz'\"/>\r\n\t\t\t\t\t<xsl:variable name=\"upper\" select=\"'ABCDEFGHIJKLMNOPQRSTUVWXYZ'\"/>\r\n\t\t\t\t\t<xsl:for-each select=\"sitemap:urlset/sitemap:url\">\r\n\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<xsl:variable name=\"itemURL\">\r\n\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"sitemap:loc\"/>\r\n\t\t\t\t\t\t\t\t</xsl:variable>\r\n\t\t\t\t\t\t\t\t<a href=\"{$itemURL}\">\r\n\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"sitemap:loc\"/>\r\n\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<xsl:value-of select=\"concat(substring(sitemap:lastmod,0,11),concat(' ', substring(sitemap:lastmod,12,5)),concat(' ', substring(sitemap:lastmod,20,6)))\"/>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<xsl:value-of select=\"count(image:image)\"/>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</xsl:for-each>\r\n\t\t\t\t\t</tbody>\r\n\t\t\t\t</table>\r\n\t\t\t</xsl:if>\r\n\t\t</div>\r\n\t\t</body>\r\n\t\t</html>\r\n\t</xsl:template>\r\n\t</xsl:stylesheet>`;\r\n return new Response(body, {\r\n status: 200,\r\n headers: {\r\n 'Content-Type': 'application/xml; charset=UTF-8',\r\n 'X-Frame-Options': 'SAMEORIGIN',\r\n 'X-Robots-Tag': 'noindex, follow',\r\n },\r\n });\r\n } catch (error: unknown) {\r\n const response = getHandlerErrorResponse(error);\r\n console.error('storeHandler.sitemapXsl.error', response.status, error);\r\n return response;\r\n }\r\n };\r\n}\r\n\r\nfunction getSiteMapXMLLastMod(canonical: IRouteCanonical): string {\r\n return canonical.updatedAt ? `\r\n <lastmod>${escapeHtml(String(canonical.updatedAt))}</lastmod>` : '';\r\n}\r\n\r\nfunction getSiteMapXMLImage(canonical: IRouteCanonical): string {\r\n return canonical.media ? `\r\n <image:image>\r\n <image:loc>${escapeHtml(encodeURI(`${canonical.media.src || canonical.media.url}`))}</image:loc>\r\n </image:image>` : '';\r\n}\r\n\r\nfunction getSiteMapXMLAlternates(origin: string, canonical: IRouteCanonical): string {\r\n return canonical.alternates.map(alternate => `\r\n <xhtml:link href=\"${escapeHtml(encodeURI(`${origin}${alternate.id}`))}\" hreflang=\"${alternate.locale}-${alternate.market}\" rel=\"alternate\" />`).join('');\r\n}\r\n\r\nfunction getSiteMapXMLUrl(origin: string, canonical: IRouteCanonical): string {\r\n return `\r\n <url>\r\n <loc>${escapeHtml(encodeURI(`${origin}${canonical.id}`))}</loc>${getSiteMapXMLLastMod(canonical)}${getSiteMapXMLAlternates(origin, canonical)}${getSiteMapXMLImage(canonical)}\r\n </url>`;\r\n}\r\n\r\n/*\r\n Character\t Escape Code\r\n Ampersand\t &\t &amp;\r\n Single Quote\t'\t &apos;\r\n Double Quote\t\"\t &quot;\r\n Greater Than\t>\t &gt;\r\n Less Than\t <\t &lt;\r\n */\r\n\r\nfunction escapeHtml(string: string) {\r\n const matchHtmlRegExp = /[\"'&<>]/;\r\n const str = '' + string;\r\n const match = matchHtmlRegExp.exec(str);\r\n if (!match) {\r\n return str;\r\n }\r\n let escape: string;\r\n let html = '';\r\n let index = 0;\r\n let lastIndex = 0;\r\n for (index = match.index; index < str.length; index++) {\r\n switch (str.charCodeAt(index)) {\r\n case 34: // \"\r\n escape = '&quot;';\r\n break;\r\n case 38: // &\r\n escape = '&amp;';\r\n break;\r\n case 39: // '\r\n escape = '&#39;';\r\n break;\r\n case 60: // <\r\n escape = '&lt;';\r\n break;\r\n case 62: // >\r\n escape = '&gt;';\r\n break;\r\n default:\r\n continue;\r\n }\r\n if (lastIndex !== index) {\r\n html += str.substring(lastIndex, index);\r\n }\r\n lastIndex = index + 1;\r\n html += escape;\r\n }\r\n return lastIndex !== index\r\n ? html + str.substring(lastIndex, index)\r\n : html;\r\n}\r\n\r\nfunction getSiteMapXMLUrls(origin: string, canonicalRoutes: IRouteCanonical[]): string {\r\n return canonicalRoutes.map((canonicalRoute) => getSiteMapXMLUrl(origin, canonicalRoute)).join('');\r\n}\r\n"],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { PageParams } from "../../types.js";
2
+ import { CollectionSlug, SanitizedConfig } from "payload";
3
+
4
+ //#region src/server/handlers/static-params.handler.d.ts
5
+
6
+ /**
7
+ * Returns a generateStaticParams function for a given page collection slug.
8
+ */
9
+ declare function getStaticParams<TSlug extends CollectionSlug>(slug: TSlug, config: Promise<SanitizedConfig>): () => Promise<PageParams[]>;
10
+ declare function getStaticParams_(schema: string): () => Promise<{
11
+ market: string;
12
+ locale: string;
13
+ id: string;
14
+ }[]>;
15
+ declare function getStaticParamsFromPayload(schema: string, config: Promise<SanitizedConfig>): () => Promise<{
16
+ market: string;
17
+ locale: string;
18
+ id: string;
19
+ }[]>;
20
+ //# sourceMappingURL=static-params.handler.d.ts.map
21
+
22
+ //#endregion
23
+ export { getStaticParams, getStaticParamsFromPayload, getStaticParams_ };
24
+ //# sourceMappingURL=static-params.handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-params.handler.d.ts","names":[],"sources":["../../../src/server/handlers/static-params.handler.ts"],"mappings":";;;;;;;AAWA;AAA+B,iBAAf,eAAe,CAAA,cAAe,cAAf,CAAA,CAAA,IAAA,EAAqC,KAArC,EAAA,MAAA,EAAoD,OAApD,CAA4D,eAA5D,CAAA,CAAA,EAAA,GAAA,GACiB,OADjB,CACyB,UADzB,EAAA,CAAA;AAAe,iBAqB9B,gBAAA,CArB8B,MAAA,EAAA,MAAA,CAAA,EAAA,GAAA,GAsBE,OAtBF,CAAA;EAAsB,MAAA,EAAA,MAAA;EAAuB,MAAA,EAAA,MAAA;EAAR,EAAA,EAAA,MAAA;AAC3B,CAAA,EAAA,CAAA;AAAR,iBAuDhC,0BAAA,CAvDgC,MAAA,EAAA,MAAA,EAAA,MAAA,EAuDmB,OAvDnB,CAuD2B,eAvD3B,CAAA,CAAA,EAAA,GAAA,GAwDA,OAxDA,CAAA;EAAO,MAAA,EAAA,MAAA;EAoBvC,MAAA,EAAA,MAAA;EAmCA,EAAA,EAAA,MAAA;AAA0B,CAAA,EAAA,CAAA;AAAiC"}
@@ -0,0 +1,56 @@
1
+ import { guest } from "../../lib/const.js";
2
+ import { localApiGet } from "../../lib/http.js";
3
+ import { buildStrategy } from "../../lib/store.js";
4
+ import { getPayload, getPayloadInstance, getRoutes } from "../mixer.js";
5
+ import { isDevelopment, qsSerialize } from "@websolutespa/bom-core";
6
+ //#region src/server/handlers/static-params.handler.ts
7
+ /**
8
+ * Returns a generateStaticParams function for a given page collection slug.
9
+ */
10
+ function getStaticParams(slug, config) {
11
+ return async function generateStaticParams() {
12
+ if (isDevelopment || buildStrategy === "runtime") return [];
13
+ const { getContext } = await getPayload({ config });
14
+ const { routes } = await getContext("all", "all");
15
+ return routes.filter((r) => r.schema === slug).map((route) => ({
16
+ market: route.market,
17
+ locale: route.locale,
18
+ id: String(route.page)
19
+ }));
20
+ };
21
+ }
22
+ function getStaticParams_(schema) {
23
+ return async function generateStaticParams() {
24
+ if (isDevelopment || buildStrategy === "runtime") return [];
25
+ const query = qsSerialize({ where: { or: [{
26
+ schema: { equals: schema },
27
+ template: { equals: schema }
28
+ }] } });
29
+ return (await localApiGet(`/-route?${query}`)).map((route) => ({
30
+ market: route.market,
31
+ locale: route.locale,
32
+ id: String(route.page)
33
+ }));
34
+ };
35
+ }
36
+ function getStaticParamsFromPayload(schema, config) {
37
+ return async function generateStaticParams() {
38
+ if (isDevelopment || buildStrategy === "runtime") return [];
39
+ const payload = await getPayloadInstance({ config });
40
+ return (await getRoutes({
41
+ payload,
42
+ market: "all",
43
+ locale: "all",
44
+ user: guest,
45
+ draft: false
46
+ })).filter((route) => route.schema === schema || route.template === schema).map((route) => ({
47
+ market: route.market,
48
+ locale: route.locale,
49
+ id: String(route.page)
50
+ }));
51
+ };
52
+ }
53
+ //#endregion
54
+ export { getStaticParams, getStaticParamsFromPayload, getStaticParams_ };
55
+
56
+ //# sourceMappingURL=static-params.handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-params.handler.js","names":[],"sources":["../../../src/server/handlers/static-params.handler.ts"],"sourcesContent":["import { isDevelopment, qsSerialize, type IRoute } from '@websolutespa/bom-core';\r\nimport type { CollectionSlug, SanitizedConfig } from 'payload';\r\nimport { guest } from '../../lib/const';\r\nimport { localApiGet } from '../../lib/http';\r\nimport { BuildStrategy, buildStrategy } from '../../lib/store';\r\nimport { PageParams } from '../../types';\r\nimport { getPayload, getPayloadInstance, getRoutes } from '../mixer';\r\n\r\n/**\r\n * Returns a generateStaticParams function for a given page collection slug.\r\n */\r\nexport function getStaticParams<TSlug extends CollectionSlug>(slug: TSlug, config: Promise<SanitizedConfig>) {\r\n return async function generateStaticParams(): Promise<PageParams[]> {\r\n if (\r\n isDevelopment ||\r\n buildStrategy === BuildStrategy.Runtime\r\n ) {\r\n return [];\r\n }\r\n const { getContext } = await getPayload({ config });\r\n const { routes } = await getContext('all', 'all');\r\n return (routes)\r\n .filter(r => r.schema === slug)\r\n .map(route => ({\r\n market: route.market,\r\n locale: route.locale,\r\n id: String(route.page),\r\n }));\r\n };\r\n}\r\n\r\n// unused\r\nexport function getStaticParams_(schema: string) {\r\n return async function generateStaticParams(): Promise<{\r\n market: string;\r\n locale: string;\r\n id: string;\r\n }[]> {\r\n if (\r\n isDevelopment ||\r\n buildStrategy === BuildStrategy.Runtime\r\n ) {\r\n return [];\r\n }\r\n const query = qsSerialize({\r\n where: {\r\n or: [{\r\n schema: {\r\n equals: schema,\r\n },\r\n template: {\r\n equals: schema,\r\n },\r\n }],\r\n },\r\n });\r\n const routes: IRoute[] = await localApiGet(`/-route?${query}`);\r\n return (routes)\r\n .map(route => ({\r\n market: route.market,\r\n locale: route.locale,\r\n id: String(route.page),\r\n }));\r\n };\r\n}\r\n\r\n// unused\r\nexport function getStaticParamsFromPayload(schema: string, config: Promise<SanitizedConfig>) {\r\n return async function generateStaticParams(): Promise<{\r\n market: string;\r\n locale: string;\r\n id: string;\r\n }[]> {\r\n if (\r\n isDevelopment ||\r\n buildStrategy === BuildStrategy.Runtime\r\n ) {\r\n return [];\r\n }\r\n\r\n const payload = await getPayloadInstance({ config });\r\n const routes = await getRoutes({\r\n payload,\r\n market: 'all',\r\n locale: 'all',\r\n user: guest,\r\n draft: false,\r\n });\r\n\r\n return routes\r\n .filter(route => (\r\n route.schema === schema ||\r\n route.template === schema\r\n ))\r\n .map(route => ({\r\n market: route.market,\r\n locale: route.locale,\r\n id: String(route.page),\r\n }));\r\n };\r\n}\r\n\r\n/*\r\nGood to know:\r\nYou can use the dynamicParams segment config option to control what happens when a dynamic segment is visited that was not generated with generateStaticParams.\r\nYou must return an empty array from generateStaticParams or utilize export const dynamic = 'force-static' in order to revalidate (ISR) paths at runtime.\r\nDuring next dev, generateStaticParams will be called when you navigate to a route.\r\nDuring next build, generateStaticParams runs before the corresponding Layouts or Pages are generated.\r\nDuring revalidation (ISR), generateStaticParams will not be called again.\r\ngenerateStaticParams replaces the getStaticPaths function in the Pages Router.\r\n*/\r\n"],"mappings":";;;;;;;;;AAWA,SAAgB,gBAA8C,MAAa,QAAkC;CAC3G,OAAO,eAAe,uBAA8C;EAClE,IACE,iBACA,kBAAA,WAEA,OAAO,CAAC;EAEV,MAAM,EAAE,eAAe,MAAM,WAAW,EAAE,OAAO,CAAC;EAClD,MAAM,EAAE,WAAW,MAAM,WAAW,OAAO,KAAK;EAChD,OAAQ,OACL,QAAO,MAAK,EAAE,WAAW,IAAI,CAAC,CAC9B,KAAI,WAAU;GACb,QAAQ,MAAM;GACd,QAAQ,MAAM;GACd,IAAI,OAAO,MAAM,IAAI;EACvB,EAAE;CACN;AACF;AAGA,SAAgB,iBAAiB,QAAgB;CAC/C,OAAO,eAAe,uBAIjB;EACH,IACE,iBACA,kBAAA,WAEA,OAAO,CAAC;EAEV,MAAM,QAAQ,YAAY,EACxB,OAAO,EACL,IAAI,CAAC;GACH,QAAQ,EACN,QAAQ,OACV;GACA,UAAU,EACR,QAAQ,OACV;EACF,CAAC,EACH,EACF,CAAC;EAED,QAAQ,MADuB,YAAY,WAAW,OAAO,EAAA,CAE1D,KAAI,WAAU;GACb,QAAQ,MAAM;GACd,QAAQ,MAAM;GACd,IAAI,OAAO,MAAM,IAAI;EACvB,EAAE;CACN;AACF;AAGA,SAAgB,2BAA2B,QAAgB,QAAkC;CAC3F,OAAO,eAAe,uBAIjB;EACH,IACE,iBACA,kBAAA,WAEA,OAAO,CAAC;EAGV,MAAM,UAAU,MAAM,mBAAmB,EAAE,OAAO,CAAC;EASnD,QAAO,MARc,UAAU;GAC7B;GACA,QAAQ;GACR,QAAQ;GACR,MAAM;GACN,OAAO;EACT,CAAC,EAAA,CAGE,QAAO,UACN,MAAM,WAAW,UACjB,MAAM,aAAa,MACpB,CAAC,CACD,KAAI,WAAU;GACb,QAAQ,MAAM;GACd,QAAQ,MAAM;GACd,IAAI,OAAO,MAAM,IAAI;EACvB,EAAE;CACN;AACF"}
@@ -0,0 +1,10 @@
1
+ import { NextRequest } from "next/server";
2
+ import { SanitizedConfig } from "payload";
3
+
4
+ //#region src/server/handlers/vars.handler.d.ts
5
+ declare function getVarsHandler(config: Promise<SanitizedConfig>): (request: NextRequest) => Promise<Response>;
6
+ //# sourceMappingURL=vars.handler.d.ts.map
7
+
8
+ //#endregion
9
+ export { getVarsHandler };
10
+ //# sourceMappingURL=vars.handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vars.handler.d.ts","names":[],"sources":["../../../src/server/handlers/vars.handler.ts"],"mappings":";;;;iBA0BgB,cAAA,SAAuB,QAAQ,6BACb,gBAAW,QAAA"}
@@ -0,0 +1,159 @@
1
+ import { getPayload, getSearchParams } from "../mixer.js";
2
+ import { getLayout } from "../layout.js";
3
+ import { getHandlerErrorResponse } from "./error-response.js";
4
+ import { getHost, getOrigin, isDevelopment, isProduction } from "@websolutespa/bom-core";
5
+ import { headers } from "next/headers";
6
+ //#region src/server/handlers/vars.handler.ts
7
+ const DISALLOWED_KEYS = ["__NEXT_PRIVATE_STANDALONE_CONFIG"];
8
+ const getFilteredEnv = (env) => {
9
+ const entries = Object.entries(env).filter(([k, v]) => !DISALLOWED_KEYS.includes(k) && typeof v === "string");
10
+ entries.sort();
11
+ return Object.fromEntries(entries);
12
+ };
13
+ const sortKeys = (object) => {
14
+ const entries = Object.entries(object || {});
15
+ entries.sort();
16
+ return Object.fromEntries(entries);
17
+ };
18
+ function getVarsHandler(config) {
19
+ return async function(request) {
20
+ try {
21
+ const searchParams = request.nextUrl.searchParams;
22
+ const { market, locale, defaultMarket, defaultLocale, params } = getSearchParams(request);
23
+ const headers$1 = await headers();
24
+ const { payload, user, getContext } = await getPayload({
25
+ config,
26
+ headers: headers$1
27
+ });
28
+ if (!(user?.roles || []).includes("admin")) throw {
29
+ status: 401,
30
+ message: "Unauthorized"
31
+ };
32
+ const context = await getContext(market || defaultMarket, locale || defaultLocale);
33
+ const layout = await getLayout(market || defaultMarket, locale || defaultLocale, payload, user, context);
34
+ const info = {
35
+ production: isProduction,
36
+ development: isDevelopment,
37
+ origin: getOrigin(headers$1),
38
+ host: getHost(headers$1),
39
+ params: {},
40
+ searchParams: { ...sortKeys(Object.fromEntries(searchParams)) },
41
+ headers: { ...sortKeys(Object.fromEntries(headers$1)) },
42
+ env: { ...getFilteredEnv(process.env) },
43
+ user: { ...sortKeys(user) },
44
+ context: { ...sortKeys(context) },
45
+ layout: { ...sortKeys(layout) }
46
+ };
47
+ const accept = headers$1.get("accept");
48
+ if (!accept || !accept.includes("text/html")) return Response.json(info, { status: 200 });
49
+ return new Response(`<!DOCTYPE html>
50
+ <html>
51
+ <head>
52
+ <meta charSet="utf-8"/>
53
+ <style>
54
+ html, body {
55
+ background: #282828;
56
+ color: #7cacf8;
57
+ }
58
+ body {
59
+ padding: 0;
60
+ margin: 0;
61
+ font-family: monospace;
62
+ font-size: 14px;
63
+ line-height: 1.16;
64
+ font-weight: 100;
65
+ }
66
+ json-viewer {
67
+ padding: 20px;
68
+ min-height: 100vh;
69
+ box-sizing: border-box;
70
+ line-height: 1.2;
71
+ --background-color: #282828;
72
+ --color: #e3e3e3;
73
+ --property-color: #7cacf8;
74
+ --string-color: #53d5fb;
75
+ --number-color: #7b80ff;
76
+ --boolean-color: #9980ff;
77
+ --null-color: #6f6f6f;
78
+ --preview-color: #8f8f8f;
79
+ --highlight-color: #7b0000;
80
+ --font-family: monospace;
81
+ --font-size: 14px;
82
+ --indent-size: 1em;
83
+ --indentguide-size: 1px;
84
+ --indentguide-style: solid;
85
+ --indentguide-color: #333;
86
+ --indentguide-color-active: #666;
87
+ --indentguide: var(--indentguide-size) var(--indentguide-style) var(--indentguide-color);
88
+ --indentguide-active: var(--indentguide-size) var(--indentguide-style) var(--indentguide-color-active);
89
+ }
90
+
91
+ :root {
92
+ --scrollbar-size: 8px;
93
+ --scrollbar-border-radius: 2px;
94
+ --scrollbar-track-color: transparent;
95
+ --scrollbar-track-hover-color: transparent;
96
+ --scrollbar-thumb-color: #888888;
97
+ --scrollbar-thumb-hover-color: #aaaaaa;
98
+ }
99
+
100
+ ::-webkit-scrollbar {
101
+ width: var(--scrollbar-size);
102
+ height: var(--scrollbar-size);
103
+ border-radius: 0;
104
+ }
105
+
106
+ ::-webkit-scrollbar-button {
107
+ display: none;
108
+ }
109
+
110
+ ::-webkit-scrollbar-button:hover {
111
+ display: none;
112
+ }
113
+
114
+ ::-webkit-scrollbar-thumb {
115
+ background-color: var(--scrollbar-thumb-color);
116
+ box-shadow: none;
117
+ border-radius: calc(var(--scrollbar-size) * 0.5);
118
+ }
119
+
120
+ ::-webkit-scrollbar-thumb:hover {
121
+ background-color: var(--scrollbar-thumb-hover-color);
122
+ }
123
+
124
+ ::-webkit-scrollbar-track {
125
+ background-color: var(--scrollbar-track-color);
126
+ border-radius: 0;
127
+ }
128
+
129
+ ::-webkit-scrollbar-track:hover {
130
+ background-color: var(--scrollbar-track-hover-color);
131
+ }
132
+
133
+ </style>
134
+ <script src="https://unpkg.com/@alenaksu/json-viewer@2.0.0/dist/json-viewer.bundle.js"><\/script>
135
+ <script>
136
+ document.addEventListener('DOMContentLoaded', () => {
137
+ const viewer = document.querySelector('#json-viewer');
138
+ viewer.data = ${JSON.stringify(info)};
139
+ viewer.expand(/headers|env/);
140
+ });
141
+ <\/script>
142
+ </head>
143
+ <body>
144
+ <json-viewer id="json-viewer"></json-viewer>
145
+ </body>
146
+ </html>`, {
147
+ status: 200,
148
+ headers: { "Content-Type": "text/html" }
149
+ });
150
+ } catch (error) {
151
+ console.log("getVarsHandler.error", error);
152
+ return getHandlerErrorResponse(error);
153
+ }
154
+ };
155
+ }
156
+ //#endregion
157
+ export { getVarsHandler };
158
+
159
+ //# sourceMappingURL=vars.handler.js.map