@websolutespa/bom-next 3.0.2 → 4.0.0-next.1

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 (264) hide show
  1. package/CHANGELOG.md +37 -7
  2. package/README.md +28 -0
  3. package/dist/_virtual/{_rolldown/runtime.js → rolldown_runtime.js} +7 -4
  4. package/dist/client/client.d.ts.map +1 -1
  5. package/dist/client/client.js +17 -6
  6. package/dist/client/client.js.map +1 -1
  7. package/dist/client/extra.d.ts +3 -3
  8. package/dist/client/extra.d.ts.map +1 -1
  9. package/dist/client/extra.js +10 -5
  10. package/dist/client/extra.js.map +1 -1
  11. package/dist/client/label.d.ts +3 -3
  12. package/dist/client/label.d.ts.map +1 -1
  13. package/dist/client/label.js +10 -5
  14. package/dist/client/label.js.map +1 -1
  15. package/dist/client/layout.d.ts +3 -3
  16. package/dist/client/layout.d.ts.map +1 -1
  17. package/dist/client/layout.js +10 -5
  18. package/dist/client/layout.js.map +1 -1
  19. package/dist/client/local.collection.d.ts.map +1 -1
  20. package/dist/client/local.collection.js +4 -2
  21. package/dist/client/local.collection.js.map +1 -1
  22. package/dist/client/metadata.d.ts +3 -3
  23. package/dist/client/metadata.d.ts.map +1 -1
  24. package/dist/client/metadata.js +48 -40
  25. package/dist/client/metadata.js.map +1 -1
  26. package/dist/client/page.d.ts +3 -3
  27. package/dist/client/page.d.ts.map +1 -1
  28. package/dist/client/page.js +10 -5
  29. package/dist/client/page.js.map +1 -1
  30. package/dist/client/useApi.d.ts +7 -7
  31. package/dist/client/useApi.d.ts.map +1 -1
  32. package/dist/client/useApi.js +2 -1
  33. package/dist/client/useApi.js.map +1 -1
  34. package/dist/client/useCollectionApi.d.ts +6 -6
  35. package/dist/client/useCollectionApi.d.ts.map +1 -1
  36. package/dist/client/useCollectionApi.js +4 -2
  37. package/dist/client/useCollectionApi.js.map +1 -1
  38. package/dist/client/useExtra.d.ts.map +1 -1
  39. package/dist/client/useExtra.js +5 -2
  40. package/dist/client/useExtra.js.map +1 -1
  41. package/dist/client/useHttp.d.ts.map +1 -1
  42. package/dist/client/useHttp.js +9 -6
  43. package/dist/client/useHttp.js.map +1 -1
  44. package/dist/client/useLabel.d.ts.map +1 -1
  45. package/dist/client/useLabel.js +5 -2
  46. package/dist/client/useLabel.js.map +1 -1
  47. package/dist/client/useLayout.d.ts.map +1 -1
  48. package/dist/client/useLayout.js +5 -2
  49. package/dist/client/useLayout.js.map +1 -1
  50. package/dist/client/useLink.d.ts.map +1 -1
  51. package/dist/client/useLink.js +7 -3
  52. package/dist/client/useLink.js.map +1 -1
  53. package/dist/client/useMetaData.d.ts.map +1 -1
  54. package/dist/client/useMetaData.js +5 -2
  55. package/dist/client/useMetaData.js.map +1 -1
  56. package/dist/client/usePage.d.ts.map +1 -1
  57. package/dist/client/usePage.js +5 -2
  58. package/dist/client/usePage.js.map +1 -1
  59. package/dist/client/useUser.d.ts.map +1 -1
  60. package/dist/client/useUser.js +5 -2
  61. package/dist/client/useUser.js.map +1 -1
  62. package/dist/client/user.d.ts.map +1 -1
  63. package/dist/client/user.js +17 -11
  64. package/dist/client/user.js.map +1 -1
  65. package/dist/exports/client.js +2 -1
  66. package/dist/exports/instrumentation.js +2 -1
  67. package/dist/exports/proxy.js +2 -1
  68. package/dist/exports/server.d.ts +5 -4
  69. package/dist/exports/server.js +7 -5
  70. package/dist/index.d.ts +3 -3
  71. package/dist/index.js +3 -2
  72. package/dist/instrumentation/client.d.ts.map +1 -1
  73. package/dist/instrumentation/client.js +2 -1
  74. package/dist/instrumentation/client.js.map +1 -1
  75. package/dist/instrumentation/sentry/capture.requestError.js +4 -1
  76. package/dist/instrumentation/sentry/capture.requestError.js.map +1 -1
  77. package/dist/instrumentation/sentry/capture.routerTransitionStart.js +2 -1
  78. package/dist/instrumentation/sentry/capture.routerTransitionStart.js.map +1 -1
  79. package/dist/instrumentation/sentry/config.client.js +10 -2
  80. package/dist/instrumentation/sentry/config.client.js.map +1 -0
  81. package/dist/instrumentation/sentry/config.edge.js +10 -2
  82. package/dist/instrumentation/sentry/config.edge.js.map +1 -0
  83. package/dist/instrumentation/sentry/config.server.js +10 -2
  84. package/dist/instrumentation/sentry/config.server.js.map +1 -0
  85. package/dist/instrumentation/server.d.ts.map +1 -1
  86. package/dist/instrumentation/server.js +8 -5
  87. package/dist/instrumentation/server.js.map +1 -1
  88. package/dist/instrumentation/types.d.ts.map +1 -1
  89. package/dist/lib/breadcrumb.d.ts.map +1 -1
  90. package/dist/lib/breadcrumb.js +6 -1
  91. package/dist/lib/breadcrumb.js.map +1 -1
  92. package/dist/lib/const.d.ts +14 -2
  93. package/dist/lib/const.d.ts.map +1 -1
  94. package/dist/lib/const.js +24 -2
  95. package/dist/lib/const.js.map +1 -1
  96. package/dist/lib/http.d.ts +9 -0
  97. package/dist/lib/http.d.ts.map +1 -1
  98. package/dist/lib/http.js +27 -4
  99. package/dist/lib/http.js.map +1 -1
  100. package/dist/lib/label.d.ts.map +1 -1
  101. package/dist/lib/label.js +4 -3
  102. package/dist/lib/label.js.map +1 -1
  103. package/dist/lib/layout.defaults.d.ts.map +1 -1
  104. package/dist/lib/layout.defaults.js +1 -1
  105. package/dist/lib/layout.defaults.js.map +1 -1
  106. package/dist/lib/link.d.ts.map +1 -1
  107. package/dist/lib/link.js +2 -1
  108. package/dist/lib/link.js.map +1 -1
  109. package/dist/lib/meta-data.d.ts.map +1 -1
  110. package/dist/lib/open-graph.d.ts.map +1 -1
  111. package/dist/lib/pagination.d.ts.map +1 -1
  112. package/dist/lib/pagination.js +4 -2
  113. package/dist/lib/pagination.js.map +1 -1
  114. package/dist/lib/route.d.ts.map +1 -1
  115. package/dist/lib/route.js +9 -3
  116. package/dist/lib/route.js.map +1 -1
  117. package/dist/lib/store.d.ts.map +1 -1
  118. package/dist/lib/store.js +31 -31
  119. package/dist/lib/store.js.map +1 -1
  120. package/dist/lib/structured-data.d.ts.map +1 -1
  121. package/dist/lib/twitter-card.d.ts.map +1 -1
  122. package/dist/lib/utils.d.ts.map +1 -1
  123. package/dist/lib/utils.js +3 -2
  124. package/dist/lib/utils.js.map +1 -1
  125. package/dist/mock.d.ts.map +1 -1
  126. package/dist/node_modules/@selderee/plugin-htmlparser2/lib/hp2-builder.js +3 -2
  127. package/dist/node_modules/@selderee/plugin-htmlparser2/lib/hp2-builder.js.map +1 -1
  128. package/dist/node_modules/deepmerge/dist/cjs.js +17 -9
  129. package/dist/node_modules/deepmerge/dist/cjs.js.map +1 -1
  130. package/dist/node_modules/dom-serializer/lib/esm/foreignNames.js +2 -2
  131. package/dist/node_modules/dom-serializer/lib/esm/foreignNames.js.map +1 -1
  132. package/dist/node_modules/dom-serializer/lib/esm/index.js +10 -15
  133. package/dist/node_modules/dom-serializer/lib/esm/index.js.map +1 -1
  134. package/dist/node_modules/domelementtype/lib/esm/index.js +12 -12
  135. package/dist/node_modules/domelementtype/lib/esm/index.js.map +1 -1
  136. package/dist/node_modules/domhandler/lib/esm/index.js +4 -3
  137. package/dist/node_modules/domhandler/lib/esm/index.js.map +1 -1
  138. package/dist/node_modules/domhandler/lib/esm/node.js +8 -7
  139. package/dist/node_modules/domhandler/lib/esm/node.js.map +1 -1
  140. package/dist/node_modules/entities/lib/esm/decode.js +33 -32
  141. package/dist/node_modules/entities/lib/esm/decode.js.map +1 -1
  142. package/dist/node_modules/entities/lib/esm/decode_codepoint.js +5 -5
  143. package/dist/node_modules/entities/lib/esm/decode_codepoint.js.map +1 -1
  144. package/dist/node_modules/entities/lib/esm/escape.js +14 -6
  145. package/dist/node_modules/entities/lib/esm/escape.js.map +1 -1
  146. package/dist/node_modules/entities/lib/esm/generated/decode-data-html.js +2 -2
  147. package/dist/node_modules/entities/lib/esm/generated/decode-data-html.js.map +1 -1
  148. package/dist/node_modules/entities/lib/esm/generated/decode-data-xml.js +2 -2
  149. package/dist/node_modules/entities/lib/esm/generated/decode-data-xml.js.map +1 -1
  150. package/dist/node_modules/html-to-text/lib/html-to-text.js +45 -33
  151. package/dist/node_modules/html-to-text/lib/html-to-text.js.map +1 -1
  152. package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/Parser.js +25 -25
  153. package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/Parser.js.map +1 -1
  154. package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/Tokenizer.js +76 -73
  155. package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/Tokenizer.js.map +1 -1
  156. package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/index.js +4 -3
  157. package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/index.js.map +1 -1
  158. package/dist/node_modules/leac/lib/leac.js +72 -72
  159. package/dist/node_modules/leac/lib/leac.js.map +1 -1
  160. package/dist/node_modules/parseley/lib/parseley.js +37 -33
  161. package/dist/node_modules/parseley/lib/parseley.js.map +1 -1
  162. package/dist/node_modules/peberminta/lib/core.js +4 -4
  163. package/dist/node_modules/peberminta/lib/core.js.map +1 -1
  164. package/dist/node_modules/selderee/lib/selderee.js +16 -10
  165. package/dist/node_modules/selderee/lib/selderee.js.map +1 -1
  166. package/dist/proxy/protected-route.d.ts.map +1 -1
  167. package/dist/proxy/protected-route.js +11 -6
  168. package/dist/proxy/protected-route.js.map +1 -1
  169. package/dist/proxy/proxy.d.ts +5 -4
  170. package/dist/proxy/proxy.d.ts.map +1 -1
  171. package/dist/proxy/proxy.js +26 -6
  172. package/dist/proxy/proxy.js.map +1 -1
  173. package/dist/proxy/route-auto-detection.d.ts.map +1 -1
  174. package/dist/proxy/route-auto-detection.js +26 -14
  175. package/dist/proxy/route-auto-detection.js.map +1 -1
  176. package/dist/proxy/route-proxy.d.ts.map +1 -1
  177. package/dist/proxy/route-proxy.js +22 -5
  178. package/dist/proxy/route-proxy.js.map +1 -1
  179. package/dist/server/context.d.ts +31 -15
  180. package/dist/server/context.d.ts.map +1 -1
  181. package/dist/server/context.js +156 -69
  182. package/dist/server/context.js.map +1 -1
  183. package/dist/server/handlers/auth.handler.d.ts.map +1 -1
  184. package/dist/server/handlers/auth.handler.js +4 -2
  185. package/dist/server/handlers/auth.handler.js.map +1 -1
  186. package/dist/server/handlers/captions.handler.d.ts.map +1 -1
  187. package/dist/server/handlers/captions.handler.js +4 -2
  188. package/dist/server/handlers/captions.handler.js.map +1 -1
  189. package/dist/server/handlers/collection.handler.d.ts.map +1 -1
  190. package/dist/server/handlers/collection.handler.js +2 -1
  191. package/dist/server/handlers/collection.handler.js.map +1 -1
  192. package/dist/server/handlers/error-response.js +6 -2
  193. package/dist/server/handlers/error-response.js.map +1 -1
  194. package/dist/server/handlers/index.handler.d.ts.map +1 -1
  195. package/dist/server/handlers/index.handler.js +2 -1
  196. package/dist/server/handlers/index.handler.js.map +1 -1
  197. package/dist/server/handlers/preview.handler.d.ts.map +1 -1
  198. package/dist/server/handlers/preview.handler.js +6 -3
  199. package/dist/server/handlers/preview.handler.js.map +1 -1
  200. package/dist/server/handlers/registry.handler.d.ts.map +1 -1
  201. package/dist/server/handlers/registry.handler.js +14 -9
  202. package/dist/server/handlers/registry.handler.js.map +1 -1
  203. package/dist/server/handlers/route.handler.d.ts.map +1 -1
  204. package/dist/server/handlers/route.handler.js +12 -3
  205. package/dist/server/handlers/route.handler.js.map +1 -1
  206. package/dist/server/handlers/sitemap.handler.d.ts.map +1 -1
  207. package/dist/server/handlers/sitemap.handler.js +12 -9
  208. package/dist/server/handlers/sitemap.handler.js.map +1 -1
  209. package/dist/server/handlers/static-params.handler.d.ts.map +1 -1
  210. package/dist/server/handlers/static-params.handler.js +13 -8
  211. package/dist/server/handlers/static-params.handler.js.map +1 -1
  212. package/dist/server/handlers/vars.handler.d.ts.map +1 -1
  213. package/dist/server/handlers/vars.handler.js +5 -4
  214. package/dist/server/handlers/vars.handler.js.map +1 -1
  215. package/dist/server/helpers.d.ts +50 -0
  216. package/dist/server/helpers.d.ts.map +1 -0
  217. package/dist/server/helpers.js +60 -0
  218. package/dist/server/helpers.js.map +1 -0
  219. package/dist/server/layout.js +69 -34
  220. package/dist/server/layout.js.map +1 -1
  221. package/dist/server/lazy.d.ts +1 -0
  222. package/dist/server/lazy.d.ts.map +1 -1
  223. package/dist/server/lazy.js +3 -2
  224. package/dist/server/lazy.js.map +1 -1
  225. package/dist/server/local-api.d.ts.map +1 -1
  226. package/dist/server/local-api.js +12 -6
  227. package/dist/server/local-api.js.map +1 -1
  228. package/dist/server/metadata.d.ts +8 -5
  229. package/dist/server/metadata.d.ts.map +1 -1
  230. package/dist/server/metadata.js +21 -7
  231. package/dist/server/metadata.js.map +1 -1
  232. package/dist/server/mixer-payload.d.ts +1 -1
  233. package/dist/server/mixer-payload.d.ts.map +1 -1
  234. package/dist/server/mixer.d.ts +48 -6
  235. package/dist/server/mixer.d.ts.map +1 -1
  236. package/dist/server/mixer.js +235 -68
  237. package/dist/server/mixer.js.map +1 -1
  238. package/dist/server/page.d.ts +21 -5
  239. package/dist/server/page.d.ts.map +1 -1
  240. package/dist/server/page.js +74 -15
  241. package/dist/server/page.js.map +1 -1
  242. package/dist/server/utils.d.ts.map +1 -1
  243. package/dist/server/utils.js +4 -2
  244. package/dist/server/utils.js.map +1 -1
  245. package/dist/server/utmz.d.ts.map +1 -1
  246. package/dist/server/utmz.js +1 -1
  247. package/dist/server/utmz.js.map +1 -1
  248. package/dist/types.d.ts +79 -8
  249. package/dist/types.d.ts.map +1 -1
  250. package/package.json +16 -15
  251. package/src/exports/server.ts +1 -0
  252. package/src/lib/const.ts +15 -0
  253. package/src/lib/http.ts +15 -4
  254. package/src/proxy/proxy.ts +11 -4
  255. package/src/server/context.test.ts +467 -0
  256. package/src/server/context.ts +237 -78
  257. package/src/server/context.type-test.ts +106 -0
  258. package/src/server/helpers.ts +58 -0
  259. package/src/server/layout.ts +45 -39
  260. package/src/server/lazy.ts +1 -1
  261. package/src/server/metadata.ts +15 -7
  262. package/src/server/mixer.ts +57 -9
  263. package/src/server/page.ts +62 -17
  264. package/src/types.ts +109 -7
@@ -1,29 +1,87 @@
1
- "use server";
2
1
  import { buildBreadcrumb } from "../lib/breadcrumb.js";
3
- import { buildBaseOptions } from "./mixer.js";
2
+ import { buildReadOptions } from "./mixer.js";
4
3
  import { getCategorySegments } from "@websolutespa/bom-core";
4
+ import "server-only";
5
+
5
6
  //#region src/server/page.ts
6
7
  /**
8
+
9
+ * Fields `getPage` needs to build the envelope (href, alternates, breadcrumb,
10
+
11
+ * segments) and that templates rely on (meta, template). They are always
12
+
13
+ * kept, whatever `select` the caller passes.
14
+
15
+ */
16
+ const PAGE_ENVELOPE_FIELDS = [
17
+ "id",
18
+ "slug",
19
+ "title",
20
+ "category",
21
+ "markets",
22
+ "meta",
23
+ "template"
24
+ ];
25
+ function isExcludeSelect(select) {
26
+ return Object.values(select).some((value) => value === false || typeof value === "object" && value !== null && isExcludeSelect(value));
27
+ }
28
+ /**
29
+
30
+ * Merges the envelope fields into a Payload select.
31
+
32
+ * - include mode (`true` values): envelope keys are added.
33
+
34
+ * - exclude mode (`false` values): envelope keys are removed from the exclusion list.
35
+
36
+ */
37
+ function withEnvelopeSelect(select) {
38
+ if (!select || Object.keys(select).length === 0) return select;
39
+ const merged = { ...select };
40
+ if (isExcludeSelect(select)) for (const key of PAGE_ENVELOPE_FIELDS) delete merged[key];
41
+ else for (const key of PAGE_ENVELOPE_FIELDS) if (merged[key] === void 0) merged[key] = true;
42
+ return merged;
43
+ }
44
+ /**
45
+
7
46
  * Fetches a single page document by ID using Payload local API and assembles
47
+
8
48
  * the IPage envelope (routes, alternates, breadcrumb, parentRoute).
49
+
9
50
  *
51
+
10
52
  * All data required for the envelope comes from mixerContext — no store calls.
53
+
11
54
  * - routes/alternates : mixerContext.routes filtered by schema+id
55
+
12
56
  * - segments : getCategorySegments() from bom-core (pure)
57
+
13
58
  * - breadcrumb : findRouteOfCategory() from bom-core + mixerContext.currentRoutes
59
+
60
+ *
61
+
62
+ * Returns undefined when the document is not found; any other error is logged and rethrown.
63
+
64
+ * The last argument accepts read options (depth, draft, select, populate, joins);
65
+
66
+ * a boolean is still accepted as the legacy `draftMode` flag (depth 0).
67
+
14
68
  */
15
- async function getPage(slug, id, market, locale, payload, user, mixerContext, draftMode) {
69
+ async function getPage(slug, id, market, locale, payload, user, mixerContext, readOptions) {
70
+ const options = typeof readOptions === "object" ? readOptions : {
71
+ draft: readOptions,
72
+ depth: 0
73
+ };
74
+ const read = buildReadOptions({
75
+ ...options,
76
+ select: withEnvelopeSelect(options.select),
77
+ user,
78
+ locale
79
+ });
16
80
  try {
17
- const base = buildBaseOptions(user, locale, draftMode);
18
81
  const page = await payload.findByID({
82
+ ...read,
19
83
  collection: slug,
20
84
  id,
21
- locale: base.locale,
22
- fallbackLocale: base.fallbackLocale,
23
- draft: base.draft,
24
- depth: base.depth,
25
- user: base.user,
26
- overrideAccess: base.overrideAccess,
27
85
  disableErrors: true,
28
86
  context: mixerContext
29
87
  });
@@ -45,13 +103,14 @@ async function getPage(slug, id, market, locale, payload, user, mixerContext, dr
45
103
  };
46
104
  } else {
47
105
  console.log("PageService.getPage.notfound", slug, id, locale);
48
- return;
106
+ return void 0;
49
107
  }
50
- } catch {
51
- return;
108
+ } catch (error) {
109
+ console.error("PageService.getPage.error", slug, id, locale, error);
110
+ throw error;
52
111
  }
53
112
  }
54
- //#endregion
55
- export { getPage };
56
113
 
114
+ //#endregion
115
+ export { PAGE_ENVELOPE_FIELDS, getPage, withEnvelopeSelect };
57
116
  //# sourceMappingURL=page.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"page.js","names":[],"sources":["../../src/server/page.ts"],"sourcesContent":["'use server';\r\n\r\nimport { getCategorySegments, ICategorized, ICategory, IRoute, IRouteLink } from '@websolutespa/bom-core';\r\nimport type { User } from '@websolutespa/payload-plugin-bowl';\r\nimport type { CollectionSlug } from 'payload';\r\nimport { buildBreadcrumb } from '../lib/breadcrumb';\r\nimport type { MixerContext, TypedPage } from '../types';\r\nimport { buildBaseOptions } from './mixer';\r\nimport type { MixerPayload } from './mixer-payload';\r\n\r\n/**\r\n * Fetches a single page document by ID using Payload local API and assembles\r\n * the IPage envelope (routes, alternates, breadcrumb, parentRoute).\r\n *\r\n * All data required for the envelope comes from mixerContext — no store calls.\r\n * - routes/alternates : mixerContext.routes filtered by schema+id\r\n * - segments : getCategorySegments() from bom-core (pure)\r\n * - breadcrumb : findRouteOfCategory() from bom-core + mixerContext.currentRoutes\r\n */\r\nexport async function getPage<TSlug extends CollectionSlug>(\r\n slug: TSlug,\r\n id: string,\r\n market: string,\r\n locale: string,\r\n payload: MixerPayload,\r\n user: User,\r\n mixerContext: MixerContext,\r\n draftMode?: boolean\r\n): Promise<TypedPage<TSlug> | undefined> {\r\n try {\r\n const base = buildBaseOptions(user, locale, draftMode);\r\n const page = await payload.findByID({\r\n collection: slug,\r\n id,\r\n locale: base.locale,\r\n fallbackLocale: base.fallbackLocale,\r\n draft: base.draft,\r\n depth: base.depth,\r\n user: base.user,\r\n overrideAccess: base.overrideAccess,\r\n disableErrors: true,\r\n context: mixerContext,\r\n });\r\n if (page) {\r\n // All routes for this schema+document across every market/locale (for alternates)\r\n const routes = (mixerContext.routes as IRoute[]).filter(\r\n r => r.schema === slug && String(r.page) === String(id)\r\n );\r\n const currentRoute = routes.find(r => r.market === market && r.locale === locale);\r\n const alternates = routes;\r\n\r\n // Segments derived from categories already present in mixerContext (pure, no I/O)\r\n const categories = mixerContext.categories as unknown as ICategory[];\r\n const segments = getCategorySegments(categories, page as unknown as ICategorized);\r\n\r\n // Breadcrumb built from currentRoutes (pre-filtered to market+locale by mixer)\r\n const currentRoutes = mixerContext.currentRoutes as IRoute[];\r\n const breadcrumb: IRouteLink[] = currentRoute\r\n ? buildBreadcrumb(segments, currentRoute, currentRoutes)\r\n : [];\r\n\r\n const parentRoute: IRouteLink | undefined = breadcrumb.length > 1\r\n ? breadcrumb[breadcrumb.length - 2]\r\n : undefined;\r\n\r\n return {\r\n ...page,\r\n href: currentRoute?.id,\r\n alternates,\r\n breadcrumb,\r\n parentRoute,\r\n } as unknown as TypedPage<TSlug>;\r\n } else {\r\n console.log('PageService.getPage.notfound', slug, id, locale);\r\n return undefined;\r\n }\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\n/*\r\nexport function asServerProps(props: any): any {\r\n return JSON.parse(JSON.stringify(props));\r\n}\r\n*/\r\n"],"mappings":";;;;;;;;;;;;;;AAmBA,eAAsB,QACpB,MACA,IACA,QACA,QACA,SACA,MACA,cACA,WACuC;CACvC,IAAI;EACF,MAAM,OAAO,iBAAiB,MAAM,QAAQ,SAAS;EACrD,MAAM,OAAO,MAAM,QAAQ,SAAS;GAClC,YAAY;GACZ;GACA,QAAQ,KAAK;GACb,gBAAgB,KAAK;GACrB,OAAO,KAAK;GACZ,OAAO,KAAK;GACZ,MAAM,KAAK;GACX,gBAAgB,KAAK;GACrB,eAAe;GACf,SAAS;EACX,CAAC;EACD,IAAI,MAAM;GAER,MAAM,SAAU,aAAa,OAAoB,QAC/C,MAAK,EAAE,WAAW,QAAQ,OAAO,EAAE,IAAI,MAAM,OAAO,EAAE,CACxD;GACA,MAAM,eAAe,OAAO,MAAK,MAAK,EAAE,WAAW,UAAU,EAAE,WAAW,MAAM;GAChF,MAAM,aAAa;GAGnB,MAAM,aAAa,aAAa;GAChC,MAAM,WAAW,oBAAoB,YAAY,IAA+B;GAGhF,MAAM,gBAAgB,aAAa;GACnC,MAAM,aAA2B,eAC7B,gBAAgB,UAAU,cAAc,aAAa,IACrD,CAAC;GAEL,MAAM,cAAsC,WAAW,SAAS,IAC5D,WAAW,WAAW,SAAS,KAC/B,KAAA;GAEJ,OAAO;IACL,GAAG;IACH,MAAM,cAAc;IACpB;IACA;IACA;GACF;EACF,OAAO;GACL,QAAQ,IAAI,gCAAgC,MAAM,IAAI,MAAM;GAC5D;EACF;CACF,QAAQ;EACN;CACF;AACF"}
1
+ {"version":3,"file":"page.js","names":["select: SelectType","select: T","merged: Record<string, unknown>","slug: TSlug","id: string","market: string","locale: string","payload: MixerPayload","user: User","mixerContext: MixerContext","readOptions?: ReadOptions | boolean","options: ReadOptions","breadcrumb: IRouteLink[]","parentRoute: IRouteLink | undefined"],"sources":["../../src/server/page.ts"],"sourcesContent":["import 'server-only';\r\n\r\nimport { getCategorySegments, ICategorized, ICategory, IRoute, IRouteLink } from '@websolutespa/bom-core';\r\nimport type { User } from '@websolutespa/payload-plugin-bowl';\r\nimport type { CollectionSlug, SelectType } from 'payload';\r\nimport { buildBreadcrumb } from '../lib/breadcrumb';\r\nimport type { MixerContext, PageEnvelopeField, PageSelect, ReadOptions, TypedPage } from '../types';\r\nimport { buildReadOptions } from './mixer';\r\nimport type { MixerPayload } from './mixer-payload';\r\n\r\n/**\r\n * Fields `getPage` needs to build the envelope (href, alternates, breadcrumb,\r\n * segments) and that templates rely on (meta, template). They are always\r\n * kept, whatever `select` the caller passes.\r\n */\r\nexport const PAGE_ENVELOPE_FIELDS = ['id', 'slug', 'title', 'category', 'markets', 'meta', 'template'] as const satisfies readonly PageEnvelopeField[];\r\n\r\nfunction isExcludeSelect(select: SelectType): boolean {\r\n return Object.values(select).some(value =>\r\n value === false || (typeof value === 'object' && value !== null && isExcludeSelect(value as SelectType))\r\n );\r\n}\r\n\r\n/**\r\n * Merges the envelope fields into a Payload select.\r\n * - include mode (`true` values): envelope keys are added.\r\n * - exclude mode (`false` values): envelope keys are removed from the exclusion list.\r\n */\r\nexport function withEnvelopeSelect<T extends SelectType | undefined>(select: T): T {\r\n if (!select || Object.keys(select).length === 0) {\r\n return select;\r\n }\r\n const merged: Record<string, unknown> = { ...select };\r\n if (isExcludeSelect(select)) {\r\n for (const key of PAGE_ENVELOPE_FIELDS) {\r\n delete merged[key];\r\n }\r\n } else {\r\n for (const key of PAGE_ENVELOPE_FIELDS) {\r\n if (merged[key] === undefined) {\r\n merged[key] = true;\r\n }\r\n }\r\n }\r\n return merged as T;\r\n}\r\n\r\n/**\r\n * Fetches a single page document by ID using Payload local API and assembles\r\n * the IPage envelope (routes, alternates, breadcrumb, parentRoute).\r\n *\r\n * All data required for the envelope comes from mixerContext — no store calls.\r\n * - routes/alternates : mixerContext.routes filtered by schema+id\r\n * - segments : getCategorySegments() from bom-core (pure)\r\n * - breadcrumb : findRouteOfCategory() from bom-core + mixerContext.currentRoutes\r\n *\r\n * Returns undefined when the document is not found; any other error is logged and rethrown.\r\n * The last argument accepts read options (depth, draft, select, populate, joins);\r\n * a boolean is still accepted as the legacy `draftMode` flag (depth 0).\r\n */\r\nexport async function getPage<TSlug extends CollectionSlug, TSelect extends PageSelect<TSlug> = undefined>(\r\n slug: TSlug,\r\n id: string,\r\n market: string,\r\n locale: string,\r\n payload: MixerPayload,\r\n user: User,\r\n mixerContext: MixerContext,\r\n readOptions?: ReadOptions | boolean\r\n): Promise<TypedPage<TSlug, TSelect> | undefined> {\r\n const options: ReadOptions = typeof readOptions === 'object'\r\n ? readOptions\r\n : { draft: readOptions, depth: 0 };\r\n const read = buildReadOptions({\r\n ...options,\r\n select: withEnvelopeSelect(options.select),\r\n user,\r\n locale,\r\n });\r\n try {\r\n const page = await payload.findByID({\r\n ...read,\r\n collection: slug,\r\n id,\r\n disableErrors: true,\r\n context: mixerContext,\r\n });\r\n if (page) {\r\n // All routes for this schema+document across every market/locale (for alternates)\r\n const routes = (mixerContext.routes as IRoute[]).filter(\r\n r => r.schema === slug && String(r.page) === String(id)\r\n );\r\n const currentRoute = routes.find(r => r.market === market && r.locale === locale);\r\n const alternates = routes;\r\n\r\n // Segments derived from categories already present in mixerContext (pure, no I/O)\r\n const categories = mixerContext.categories as unknown as ICategory[];\r\n const segments = getCategorySegments(categories, page as unknown as ICategorized);\r\n\r\n // Breadcrumb built from currentRoutes (pre-filtered to market+locale by mixer)\r\n const currentRoutes = mixerContext.currentRoutes as IRoute[];\r\n const breadcrumb: IRouteLink[] = currentRoute\r\n ? buildBreadcrumb(segments, currentRoute, currentRoutes)\r\n : [];\r\n\r\n const parentRoute: IRouteLink | undefined = breadcrumb.length > 1\r\n ? breadcrumb[breadcrumb.length - 2]\r\n : undefined;\r\n\r\n return {\r\n ...page,\r\n href: currentRoute?.id,\r\n alternates,\r\n breadcrumb,\r\n parentRoute,\r\n } as unknown as TypedPage<TSlug, TSelect>;\r\n } else {\r\n console.log('PageService.getPage.notfound', slug, id, locale);\r\n return undefined;\r\n }\r\n } catch (error) {\r\n console.error('PageService.getPage.error', slug, id, locale, error);\r\n throw error;\r\n }\r\n}\r\n\r\n/*\r\nexport function asServerProps(props: any): any {\r\n return JSON.parse(JSON.stringify(props));\r\n}\r\n*/\r\n"],"mappings":";;;;;;;;;;;;;;;AAeA,MAAa,uBAAuB;CAAC;CAAM;CAAQ;CAAS;CAAY;CAAW;CAAQ;AAAW;AAEtG,SAAS,gBAAgBA,QAA6B;AACpD,QAAO,OAAO,OAAO,OAAO,CAAC,KAAK,WAChC,UAAU,SAAU,OAAO,UAAU,YAAY,UAAU,QAAQ,gBAAgB,MAAoB,CACxG;AACF;;;;;;;;;;AAOD,SAAgB,mBAAqDC,QAAc;AACjF,KAAI,CAAC,UAAU,OAAO,KAAK,OAAO,CAAC,WAAW,EAC5C,QAAO;CAET,MAAMC,SAAkC,EAAE,GAAG,OAAQ;AACrD,KAAI,gBAAgB,OAAO,CACzB,MAAK,MAAM,OAAO,sBAChB,OAAO,OAAO;KAGhB,MAAK,MAAM,OAAO,qBAChB,KAAI,OAAO,SAAS,QAClB,OAAO,OAAO;AAIpB,QAAO;AACR;;;;;;;;;;;;;;;;;;;;;;;;;;AAeD,eAAsB,QACpBC,MACAC,IACAC,QACAC,QACAC,SACAC,MACAC,cACAC,aACgD;CAChD,MAAMC,UAAuB,OAAO,gBAAgB,WAChD,cACA;EAAE,OAAO;EAAa,OAAO;CAAG;CACpC,MAAM,OAAO,iBAAiB;EAC5B,GAAG;EACH,QAAQ,mBAAmB,QAAQ,OAAO;EAC1C;EACA;CACD,EAAC;AACF,KAAI;EACF,MAAM,OAAO,MAAM,QAAQ,SAAS;GAClC,GAAG;GACH,YAAY;GACZ;GACA,eAAe;GACf,SAAS;EACV,EAAC;AACF,MAAI,MAAM;GAER,MAAM,SAAU,aAAa,OAAoB,OAC/C,OAAK,EAAE,WAAW,QAAQ,OAAO,EAAE,KAAK,KAAK,OAAO,GAAG,CACxD;GACD,MAAM,eAAe,OAAO,KAAK,OAAK,EAAE,WAAW,UAAU,EAAE,WAAW,OAAO;GACjF,MAAM,aAAa;GAGnB,MAAM,aAAa,aAAa;GAChC,MAAM,WAAW,oBAAoB,YAAY,KAAgC;GAGjF,MAAM,gBAAgB,aAAa;GACnC,MAAMC,aAA2B,eAC7B,gBAAgB,UAAU,cAAc,cAAc,GACtD,CAAE;GAEN,MAAMC,cAAsC,WAAW,SAAS,IAC5D,WAAW,WAAW,SAAS,KAC/B;AAEJ,UAAO;IACL,GAAG;IACH,MAAM,cAAc;IACpB;IACA;IACA;GACD;EACF,OAAM;GACL,QAAQ,IAAI,gCAAgC,MAAM,IAAI,OAAO;AAC7D,UAAO;EACR;CACF,SAAQ,OAAO;EACd,QAAQ,MAAM,6BAA6B,MAAM,IAAI,QAAQ,MAAM;AACnE,QAAM;CACP;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","names":[],"sources":["../../src/server/utils.ts"],"mappings":";;;;;iBAIgB,UAAA,UAAoB,oBAAoB,SAAM,8BAAA,CAAA;iBAQ9C,qBAAA,UAA+B"}
1
+ {"version":3,"file":"utils.d.ts","names":[],"sources":["../../src/server/utils.ts"],"sourcesContent":[],"mappings":";;;;;iBAIgB,UAAA,UAAoB,oBAAoB,SAAM,8BAAA,CAAA;iBAQ9C,qBAAA,UAA+B"}
@@ -1,9 +1,11 @@
1
1
  import { resolveRoute } from "../lib/route.js";
2
2
  import { getHost } from "@websolutespa/bom-core";
3
+
3
4
  //#region src/server/utils.ts
4
5
  function getNextUrl(request, route) {
5
6
  const nextUrl = request.nextUrl.clone();
6
- nextUrl.pathname = resolveRoute(route);
7
+ const resolvedPathname = resolveRoute(route);
8
+ nextUrl.pathname = resolvedPathname;
7
9
  return nextUrl;
8
10
  }
9
11
  function getHrefBeforeRedirect(request) {
@@ -17,7 +19,7 @@ function getHrefBeforeRedirect(request) {
17
19
  }
18
20
  return hrefBeforeRedirect;
19
21
  }
22
+
20
23
  //#endregion
21
24
  export { getHrefBeforeRedirect, getNextUrl };
22
-
23
25
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../src/server/utils.ts"],"sourcesContent":["import { getHost, IRoute } from '@websolutespa/bom-core';\r\nimport { NextRequest } from 'next/server';\r\nimport { resolveRoute } from '../lib/route';\r\n\r\nexport function getNextUrl(request: NextRequest, route: IRoute) {\r\n const nextUrl = request.nextUrl.clone();\r\n const resolvedPathname = resolveRoute(route);\r\n // console.log('getNextUrl.resolvedPathname', resolvedPathname);\r\n nextUrl.pathname = resolvedPathname;\r\n return nextUrl;\r\n}\r\n\r\nexport function getHrefBeforeRedirect(request: NextRequest): string | null {\r\n let hrefBeforeRedirect: string | null = null;\r\n const urlBeforeRedirect = request.nextUrl.clone();\r\n const host = getHost(request.headers);\r\n if (host) {\r\n urlBeforeRedirect.host = host;\r\n urlBeforeRedirect.port = host.split(':')[1] || '';\r\n hrefBeforeRedirect = urlBeforeRedirect.href;\r\n }\r\n return hrefBeforeRedirect;\r\n}\r\n"],"mappings":";;;AAIA,SAAgB,WAAW,SAAsB,OAAe;CAC9D,MAAM,UAAU,QAAQ,QAAQ,MAAM;CAGtC,QAAQ,WAFiB,aAAa,KAEJ;CAClC,OAAO;AACT;AAEA,SAAgB,sBAAsB,SAAqC;CACzE,IAAI,qBAAoC;CACxC,MAAM,oBAAoB,QAAQ,QAAQ,MAAM;CAChD,MAAM,OAAO,QAAQ,QAAQ,OAAO;CACpC,IAAI,MAAM;EACR,kBAAkB,OAAO;EACzB,kBAAkB,OAAO,KAAK,MAAM,GAAG,CAAC,CAAC,MAAM;EAC/C,qBAAqB,kBAAkB;CACzC;CACA,OAAO;AACT"}
1
+ {"version":3,"file":"utils.js","names":["request: NextRequest","route: IRoute","hrefBeforeRedirect: string | null"],"sources":["../../src/server/utils.ts"],"sourcesContent":["import { getHost, IRoute } from '@websolutespa/bom-core';\r\nimport { NextRequest } from 'next/server';\r\nimport { resolveRoute } from '../lib/route';\r\n\r\nexport function getNextUrl(request: NextRequest, route: IRoute) {\r\n const nextUrl = request.nextUrl.clone();\r\n const resolvedPathname = resolveRoute(route);\r\n // console.log('getNextUrl.resolvedPathname', resolvedPathname);\r\n nextUrl.pathname = resolvedPathname;\r\n return nextUrl;\r\n}\r\n\r\nexport function getHrefBeforeRedirect(request: NextRequest): string | null {\r\n let hrefBeforeRedirect: string | null = null;\r\n const urlBeforeRedirect = request.nextUrl.clone();\r\n const host = getHost(request.headers);\r\n if (host) {\r\n urlBeforeRedirect.host = host;\r\n urlBeforeRedirect.port = host.split(':')[1] || '';\r\n hrefBeforeRedirect = urlBeforeRedirect.href;\r\n }\r\n return hrefBeforeRedirect;\r\n}\r\n"],"mappings":";;;;AAIA,SAAgB,WAAWA,SAAsBC,OAAe;CAC9D,MAAM,UAAU,QAAQ,QAAQ,OAAO;CACvC,MAAM,mBAAmB,aAAa,MAAM;CAE5C,QAAQ,WAAW;AACnB,QAAO;AACR;AAED,SAAgB,sBAAsBD,SAAqC;CACzE,IAAIE,qBAAoC;CACxC,MAAM,oBAAoB,QAAQ,QAAQ,OAAO;CACjD,MAAM,OAAO,QAAQ,QAAQ,QAAQ;AACrC,KAAI,MAAM;EACR,kBAAkB,OAAO;EACzB,kBAAkB,OAAO,KAAK,MAAM,IAAI,CAAC,MAAM;EAC/C,qBAAqB,kBAAkB;CACxC;AACD,QAAO;AACR"}
@@ -1 +1 @@
1
- {"version":3,"file":"utmz.d.ts","names":[],"sources":["../../src/server/utmz.ts"],"mappings":";;;iBAEgB,OAAA,UAAiB"}
1
+ {"version":3,"file":"utmz.d.ts","names":[],"sources":["../../src/server/utmz.ts"],"sourcesContent":[],"mappings":";;;iBAEgB,OAAA,UAAiB"}
@@ -8,7 +8,7 @@ function getUtmz(request) {
8
8
  }
9
9
  return utmz;
10
10
  }
11
+
11
12
  //#endregion
12
13
  export { getUtmz };
13
-
14
14
  //# sourceMappingURL=utmz.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utmz.js","names":[],"sources":["../../src/server/utmz.ts"],"sourcesContent":["import { NextApiRequest } from 'next';\r\n\r\nexport function getUtmz(request: NextApiRequest): string {\r\n let utmz = 'N/A';\r\n if (typeof request.cookies.__utmz === 'string') {\r\n utmz = request.cookies.__utmz;\r\n const i = utmz.indexOf('utmcsr');\r\n utmz = utmz.substring(i === -1 ? 0 : i);\r\n }\r\n return utmz;\r\n}\r\n"],"mappings":";AAEA,SAAgB,QAAQ,SAAiC;CACvD,IAAI,OAAO;CACX,IAAI,OAAO,QAAQ,QAAQ,WAAW,UAAU;EAC9C,OAAO,QAAQ,QAAQ;EACvB,MAAM,IAAI,KAAK,QAAQ,QAAQ;EAC/B,OAAO,KAAK,UAAU,MAAM,KAAK,IAAI,CAAC;CACxC;CACA,OAAO;AACT"}
1
+ {"version":3,"file":"utmz.js","names":["request: NextApiRequest"],"sources":["../../src/server/utmz.ts"],"sourcesContent":["import { NextApiRequest } from 'next';\r\n\r\nexport function getUtmz(request: NextApiRequest): string {\r\n let utmz = 'N/A';\r\n if (typeof request.cookies.__utmz === 'string') {\r\n utmz = request.cookies.__utmz;\r\n const i = utmz.indexOf('utmcsr');\r\n utmz = utmz.substring(i === -1 ? 0 : i);\r\n }\r\n return utmz;\r\n}\r\n"],"mappings":";AAEA,SAAgB,QAAQA,SAAiC;CACvD,IAAI,OAAO;AACX,KAAI,OAAO,QAAQ,QAAQ,WAAW,UAAU;EAC9C,OAAO,QAAQ,QAAQ;EACvB,MAAM,IAAI,KAAK,QAAQ,SAAS;EAChC,OAAO,KAAK,UAAU,MAAM,KAAK,IAAI,EAAE;CACxC;AACD,QAAO;AACR"}
package/dist/types.d.ts CHANGED
@@ -3,7 +3,7 @@ import { ErrorContext, RequestInfo } from "./instrumentation/types.js";
3
3
  import { ICategorized, IComponent, ILayout, ILocale, IMarket, IPage, IPrettify, IRoute, PageProps } from "@websolutespa/bom-core";
4
4
  import { ComponentType, ReactNode } from "react";
5
5
  import { Category, EndUser, User } from "@websolutespa/payload-plugin-bowl";
6
- import { BasePayload, CollectionSlug, DataFromCollectionSlug, SanitizedConfig, TypedFallbackLocale, TypedLocale } from "payload";
6
+ import { BasePayload, CollectionSlug, DataFromCollectionSlug, JoinQuery, PopulateType, SanitizedConfig, SelectType, TransformCollectionWithSelect, TypedCollectionSelect, TypedFallbackLocale, TypedLocale } from "payload";
7
7
  import { DynamicOptions, Loader } from "next/dynamic";
8
8
 
9
9
  //#region src/types.d.ts
@@ -89,12 +89,83 @@ type IContext = {
89
89
  payload: MixerPayload;
90
90
  context: MixerContext;
91
91
  };
92
- type PageDocument<TSlug extends CollectionSlug> = DataFromCollectionSlug<TSlug>;
93
- /** A generated page collection document enriched with Bowl's page envelope. */
94
- type TypedPage<TSlug extends CollectionSlug> = BowlDecorator<PageDocument<TSlug>> & IPage<ICategorized>;
95
- type TypedPageContext<TSlug extends CollectionSlug = CollectionSlug> = {
96
- layout: ILayout;
97
- page: TypedPage<TSlug> | undefined;
92
+ /** `true` / `false` forces draft mode, `'auto'` reads Next's `draftMode()`. */
93
+ type DraftOption = boolean | 'auto';
94
+ /** Select accepted for a page collection, or `undefined` for the full document. */
95
+ type PageSelect<TSlug extends CollectionSlug> = TypedCollectionSelect[TSlug] | undefined;
96
+ /**
97
+ * A generated page collection document, narrowed by `select` when one is given.
98
+ * Without a select the full generated document type is returned.
99
+ */
100
+ type PageDocument<TSlug extends CollectionSlug, TSelect = undefined> = TSelect extends SelectType ? TransformCollectionWithSelect<TSlug, TSelect> : DataFromCollectionSlug<TSlug>;
101
+ /** Fields always read by `createPageContext`, whatever `select` is passed (see PAGE_ENVELOPE_FIELDS). */
102
+ type PageEnvelopeField = 'id' | 'slug' | 'title' | 'category' | 'markets' | 'meta' | 'template';
103
+ type SelectInclude = {
104
+ [key: string]: SelectInclude | true;
105
+ };
106
+ /** Type counterpart of `withEnvelopeSelect`: the envelope fields are always part of the result. */
107
+ type WithEnvelopeSelect<TSelect> = TSelect extends SelectInclude ? TSelect & { [K in PageEnvelopeField]: true } : Omit<TSelect, PageEnvelopeField>;
108
+ /** Envelope added by `getPage` to every page document. */
109
+ type PageEnvelope = Pick<IPage, 'schema' | 'alternates' | 'breadcrumb' | 'href' | 'parentRoute'>;
110
+ /**
111
+ * A generated page collection document enriched with Bowl's page envelope.
112
+ * With a `select`, only the selected fields (plus the envelope fields) are typed.
113
+ */
114
+ type TypedPage<TSlug extends CollectionSlug, TSelect extends PageSelect<TSlug> = undefined> = [TSelect] extends [SelectType] ? BowlDecorator<PageDocument<TSlug, WithEnvelopeSelect<TSelect>>> & PageEnvelope : BowlDecorator<PageDocument<TSlug>> & IPage<ICategorized>;
115
+ /**
116
+ * Narrows relationship / upload fields that are known to be populated
117
+ * (depth >= 1) from `string | T` (or `number | T`) to `T`.
118
+ *
119
+ * @example
120
+ * const media = page.media as Populated<typeof page.media>;
121
+ */
122
+ type Populated<T> = T extends readonly (infer TItem)[] ? Populated<TItem>[] : Exclude<T, string | number>;
123
+ /** Options for the layout fetch (`createLayoutContext`, or `layout` in `createPageContext`). */
124
+ type LayoutOptions = {
125
+ /** Population depth for app, menus, labels, markets. Default `DEFAULT_LAYOUT_DEPTH` (1: app logo, menu media). */
126
+ depth?: number;
127
+ /** Default: the page draft option, or `'auto'` for `createLayoutContext`. */
128
+ draft?: DraftOption;
129
+ };
130
+ /** The `layout` option of `createPageContext`: layout options, or `false` to skip the layout. */
131
+ type LayoutOption = LayoutOptions | false;
132
+ /** `ILayout`, or `undefined` when the layout option is `false`. */
133
+ type LayoutFor<TLayout extends LayoutOption> = TLayout extends false ? undefined : ILayout;
134
+ type LayoutContextOptions = LayoutOptions & {
135
+ config: Promise<SanitizedConfig>;
136
+ headers?: ReadonlyHeaders;
137
+ };
138
+ type PageContextOptions<TSlug extends CollectionSlug = CollectionSlug, TSelect extends PageSelect<TSlug> = undefined, TLayout extends LayoutOption = LayoutOption> = {
139
+ config: Promise<SanitizedConfig>;
140
+ headers?: ReadonlyHeaders;
141
+ /**
142
+ * Population depth. Default `DEFAULT_PAGE_DEPTH` (2).
143
+ * 0 = ids only, 1 = direct relations/uploads (including those inside blocks),
144
+ * 2 = relations of relations (e.g. card covers).
145
+ */
146
+ depth?: number;
147
+ /** Payload select for the page document. Envelope fields are always merged in. */
148
+ select?: TSelect;
149
+ /** Per-collection select applied to populated documents, e.g. `{ media: { url: true } }`. */
150
+ populate?: PopulateType;
151
+ joins?: JoinQuery<TSlug> | false;
152
+ /** `true` / `false`, or `'auto'` to read Next `draftMode()`. Default `'auto'`. */
153
+ draft?: DraftOption;
154
+ /** Options for the layout fetch, or `false` to skip loading the layout (`layout` is then `undefined`). */
155
+ layout?: TLayout;
156
+ };
157
+ /** Read options shared by every local API call made for a page or layout. */
158
+ type ReadOptions = {
159
+ depth?: number;
160
+ draft?: boolean;
161
+ select?: SelectType;
162
+ populate?: PopulateType;
163
+ joins?: JoinQuery<any> | false;
164
+ };
165
+ type TypedPageContext<TSlug extends CollectionSlug = CollectionSlug, TSelect extends PageSelect<TSlug> = undefined, TLayout extends LayoutOption = LayoutOptions> = {
166
+ /** `undefined` when the page context was created with `layout: false`. */
167
+ layout: LayoutFor<TLayout>;
168
+ page: TypedPage<TSlug, TSelect> | undefined;
98
169
  user: IUser | IEndUser | null;
99
170
  label: (key: string, params?: Record<string, any>) => string;
100
171
  link: (category: string) => string | undefined;
@@ -132,5 +203,5 @@ type ILazyStaticProps = Record<string, ILazyStaticPropsFunc>;
132
203
  //# sourceMappingURL=types.d.ts.map
133
204
 
134
205
  //#endregion
135
- export { BaseOptions, ComponentContext, ComponentProps, ErrorContext, IContext, IEndUser, ILazyComponent, ILazyComponentFunc, ILazyComponentProps, ILazyFuncProps, ILazyModules, ILazyProps, ILazyStaticProps, ILazyStaticPropsFunc, ILazyableProps, ILazyedProps, INullableLazyableProps, IPageContext, IUser, LayoutContext, LocalProvider, MarketLocaleParams, MixerContext, NotFoundContext, NotFoundParams, PageContext, PageDocument, PageLayoutContext, PageParams, PartialPageProps, ReadonlyHeaders, RequestInfo, SearchParams, TypedPage, TypedPageContext };
206
+ export { BaseOptions, ComponentContext, ComponentProps, DraftOption, IContext, IEndUser, ILazyComponent, ILazyComponentFunc, ILazyComponentProps, ILazyFuncProps, ILazyModules, ILazyProps, ILazyStaticProps, ILazyStaticPropsFunc, ILazyableProps, ILazyedProps, INullableLazyableProps, IPageContext, IUser, LayoutContext, LayoutContextOptions, LayoutFor, LayoutOption, LayoutOptions, LocalProvider, MarketLocaleParams, MixerContext, NotFoundContext, NotFoundParams, PageContext, PageContextOptions, PageDocument, PageEnvelope, PageEnvelopeField, PageLayoutContext, PageParams, PageSelect, PartialPageProps, Populated, ReadOptions, ReadonlyHeaders, SearchParams, TypedPage, TypedPageContext, WithEnvelopeSelect };
136
207
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@websolutespa/bom-next",
3
- "version": "3.0.2",
3
+ "version": "4.0.0-next.1",
4
4
  "description": "Next module of the BOM Repository",
5
5
  "keywords": [
6
6
  "bom",
@@ -23,36 +23,37 @@
23
23
  "types": "tsc --noemit"
24
24
  },
25
25
  "dependencies": {
26
+ "server-only": "0.0.1",
26
27
  "transliteration": "latest"
27
28
  },
28
29
  "peerDependencies": {
29
30
  "@sentry/nextjs": "10.75.0",
30
- "@websolutespa/bom-core": "^3.0.1",
31
- "@websolutespa/payload-db-memory": "^3.0.2",
32
- "@websolutespa/payload-plugin-bowl": "^3.0.17",
33
- "@websolutespa/payload-utils": "^3.0.2",
31
+ "@websolutespa/bom-core": "^4.0.0-next.0",
32
+ "@websolutespa/payload-db-memory": "^3.0.3",
33
+ "@websolutespa/payload-plugin-bowl": "^4.0.0-next.0",
34
+ "@websolutespa/payload-utils": "^4.0.0-next.0",
34
35
  "next": "16.1.6",
35
36
  "payload": "3.74.0",
36
- "react-dom": "19.2.3",
37
- "react": "19.2.3"
37
+ "react": "19.2.3",
38
+ "react-dom": "19.2.3"
38
39
  },
39
40
  "devDependencies": {
40
41
  "@sentry/nextjs": "10.75.0",
41
- "@types/react-dom": "19.2.3",
42
42
  "@types/react": "19.2.10",
43
- "@websolutespa/bom-cli": "^3.0.1",
44
- "@websolutespa/bom-core": "^3.0.1",
43
+ "@types/react-dom": "19.2.3",
44
+ "@websolutespa/bom-cli": "^4.0.0-next.0",
45
+ "@websolutespa/bom-core": "^4.0.0-next.0",
45
46
  "@websolutespa/eslint-config": "^3.0.0",
46
- "@websolutespa/payload-db-memory": "^3.0.2",
47
- "@websolutespa/payload-plugin-bowl": "^3.0.17",
48
- "@websolutespa/payload-utils": "^3.0.2",
49
- "@websolutespa/test": "^3.0.2",
47
+ "@websolutespa/payload-db-memory": "^3.0.3",
48
+ "@websolutespa/payload-plugin-bowl": "^4.0.0-next.0",
49
+ "@websolutespa/payload-utils": "^4.0.0-next.0",
50
+ "@websolutespa/test": "^4.0.0-next.0",
50
51
  "@websolutespa/tsconfig": "^3.0.0",
51
52
  "eslint": "9.31.0",
52
53
  "npm-run-all": "4.1.5",
54
+ "react": "19.2.3",
53
55
  "react-dom": "19.2.3",
54
56
  "react-error-boundary": "4.1.2",
55
- "react": "19.2.3",
56
57
  "typescript": "5.8.3"
57
58
  },
58
59
  "publishConfig": {
@@ -9,6 +9,7 @@ export * from '../server/handlers/route.handler';
9
9
  export * from '../server/handlers/sitemap.handler';
10
10
  export * from '../server/handlers/static-params.handler';
11
11
  export * from '../server/handlers/vars.handler';
12
+ export * from '../server/helpers';
12
13
  export * from '../server/lazy';
13
14
  export * from '../server/local-api';
14
15
  export * from '../server/metadata';
package/src/lib/const.ts CHANGED
@@ -1,3 +1,18 @@
1
1
  import type { Config, User } from '@websolutespa/payload-plugin-bowl';
2
2
 
3
3
  export const guest = { collection: 'users', roles: ['guest'] } as (User & Config['user']);
4
+
5
+ /**
6
+ * Default population depth for page documents read by `createPageContext`.
7
+ *
8
+ * - `0`: relationships and uploads are returned as ids.
9
+ * - `1`: direct relationships and uploads are populated, including those inside blocks.
10
+ * - `2`: relationships of relationships are populated too (e.g. the cover of a related card).
11
+ */
12
+ export const DEFAULT_PAGE_DEPTH = 2;
13
+
14
+ /**
15
+ * Default population depth for the layout reads (app global, menus, labels, markets).
16
+ * `1` populates the app logo and menu media.
17
+ */
18
+ export const DEFAULT_LAYOUT_DEPTH = 1;
package/src/lib/http.ts CHANGED
@@ -5,11 +5,22 @@ const API_BASE = process.env.NEXT_PUBLIC_API || '/api';
5
5
 
6
6
  export type ApiRequestOptions = FetchRequestOptions;
7
7
 
8
+ /**
9
+ * Default options for requests to this app's own API.
10
+ *
11
+ * Server-side calls (proxy, handlers) target the request's deployment URL,
12
+ * which Vercel Deployment Protection answers with 401. When "Protection Bypass
13
+ * for Automation" is enabled, Vercel exposes VERCEL_AUTOMATION_BYPASS_SECRET;
14
+ * sending it as `x-vercel-protection-bypass` lets these calls through. The
15
+ * secret is never sent from the browser.
16
+ */
8
17
  export function getLocalApiRequestOptions(): ApiRequestOptions {
9
- return {
10
- headers: {
11
- },
12
- };
18
+ const headers: Record<string, string> = {};
19
+ const bypassSecret = !isBrowser ? process.env.VERCEL_AUTOMATION_BYPASS_SECRET : undefined;
20
+ if (bypassSecret) {
21
+ headers['x-vercel-protection-bypass'] = bypassSecret;
22
+ }
23
+ return { headers };
13
24
  }
14
25
 
15
26
  export function getRemoteApiRequestOptions(token?: string): ApiRequestOptions {
@@ -10,15 +10,22 @@ export type MiddlewareOptions = {
10
10
  };
11
11
  export type Middleware = (props: MiddlewareOptions) => NextMiddlewareResult | Promise<NextMiddlewareResult>;
12
12
 
13
+ /** Optional fixed origin for internal resolver requests, e.g. `http://127.0.0.1:3000`. */
14
+ const INTERNAL_ORIGIN = process.env.BOM_INTERNAL_ORIGIN?.replace(/\/$/, '');
15
+
13
16
  /**
14
17
  * Returns the externally visible origin for an internal middleware request.
15
18
  *
16
- * Deployments commonly terminate TLS or change ports before forwarding to
17
- * Next.js. Honoring valid forwarded headers keeps resolver requests on the
18
- * public host and prevents an avoidable proxy redirect; direct-origin fallback
19
- * keeps local development and untrusted/invalid header values deterministic.
19
+ * BOM_INTERNAL_ORIGIN wins when set, for hosts whose public or deployment URL
20
+ * is unreachable from the server (protected previews, private networks,
21
+ * containers behind a gateway). Otherwise valid forwarded headers keep resolver
22
+ * requests on the public host; direct-origin fallback keeps local development
23
+ * and untrusted/invalid header values deterministic.
20
24
  */
21
25
  export function getRequestOrigin(request: NextRequest): string {
26
+ if (INTERNAL_ORIGIN) {
27
+ return INTERNAL_ORIGIN;
28
+ }
22
29
  const forwardedHost = request.headers.get('x-forwarded-host')?.split(',')[0]?.trim();
23
30
  const forwardedProtocol = request.headers.get('x-forwarded-proto')?.split(',')[0]?.trim();
24
31
  const forwardedPort = request.headers.get('x-forwarded-port')?.split(',')[0]?.trim();