@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,38 +1,42 @@
1
1
  import { guest } from "../lib/const.js";
2
- import { collectRoutes, defaultLocale, defaultMarket, isObject } from "@websolutespa/bom-core";
2
+ import { collectRoutes, defaultLocale, defaultMarket, isDevelopment, isObject } from "@websolutespa/bom-core";
3
3
  import { cache } from "react";
4
4
  import { InMemoryCache } from "@websolutespa/payload-plugin-bowl";
5
+ import { draftMode, headers } from "next/headers";
5
6
  import { getPayload } from "payload";
7
+
6
8
  //#region src/server/mixer.ts
7
9
  const USE_CACHE = true;
8
10
  const getRouteCache = () => {
9
- let cache = globalThis._route;
10
- if (!cache) {
11
- cache = new InMemoryCache();
12
- globalThis._route = cache;
11
+ let cache$1 = globalThis._route;
12
+ if (!cache$1) {
13
+ cache$1 = new InMemoryCache();
14
+ globalThis._route = cache$1;
13
15
  }
14
- return cache;
16
+ return cache$1;
15
17
  };
16
18
  const getMixerCache = () => {
17
- let cache = globalThis._mixer;
18
- if (!cache) {
19
- cache = new InMemoryCache();
20
- globalThis._mixer = cache;
19
+ let cache$1 = globalThis._mixer;
20
+ if (!cache$1) {
21
+ cache$1 = new InMemoryCache();
22
+ globalThis._mixer = cache$1;
21
23
  }
22
- return cache;
24
+ return cache$1;
23
25
  };
24
26
  function getCacheKey({ market = "all", locale = "all", user = guest, draft = "false" }) {
25
27
  const roles = user?.roles || ["guest"];
26
28
  const tenants = "tenants" in user && Array.isArray(user.tenants) ? user.tenants.map((x) => isObject(x) ? x.id : x) : [];
27
29
  roles.sort();
28
30
  tenants.sort();
29
- return `context-${[
31
+ const keys = [
30
32
  market,
31
33
  locale,
32
34
  draft === "false" ? "published" : "draft",
33
35
  ...roles,
34
36
  ...tenants
35
- ].join("-")}`;
37
+ ];
38
+ const key = `context-${keys.join("-")}`;
39
+ return key;
36
40
  }
37
41
  async function getContext() {
38
42
  let context = globalThis._context;
@@ -64,27 +68,29 @@ function getSearchParams(request) {
64
68
  }
65
69
  const getPayloadInstance = cache(async (props) => await getPayload(props));
66
70
  function getOptions({ locale = "all", user = guest, draft = false }) {
71
+ const localized = {
72
+ locale,
73
+ fallbackLocale: defaultLocale,
74
+ draft,
75
+ depth: 0,
76
+ pagination: false,
77
+ limit: 1e4,
78
+ user,
79
+ overrideAccess: false
80
+ };
81
+ const unlocalized = {
82
+ locale: "all",
83
+ fallbackLocale: defaultLocale,
84
+ draft,
85
+ depth: 0,
86
+ pagination: false,
87
+ limit: 1e4,
88
+ user,
89
+ overrideAccess: false
90
+ };
67
91
  return {
68
- localized: {
69
- locale,
70
- fallbackLocale: defaultLocale,
71
- draft,
72
- depth: 0,
73
- pagination: false,
74
- limit: 1e4,
75
- user,
76
- overrideAccess: false
77
- },
78
- unlocalized: {
79
- locale: "all",
80
- fallbackLocale: defaultLocale,
81
- draft,
82
- depth: 0,
83
- pagination: false,
84
- limit: 1e4,
85
- user,
86
- overrideAccess: false
87
- }
92
+ localized,
93
+ unlocalized
88
94
  };
89
95
  }
90
96
  async function getRoutes$1({ payload, market = "all", locale = "all", user = guest, draft = false }) {
@@ -106,34 +112,42 @@ async function getRoutes$1({ payload, market = "all", locale = "all", user = gue
106
112
  user,
107
113
  draft
108
114
  });
109
- const markets = (await payload.find({
115
+ const marketRequest = await payload.find({
110
116
  ...localized,
111
117
  collection: "market",
112
118
  where: { isActive: { equals: true } }
113
- })).docs;
114
- const locales = (await payload.findGlobal({
119
+ });
120
+ const markets = marketRequest.docs;
121
+ const localeResult = await payload.findGlobal({
115
122
  ...localized,
116
123
  slug: "locale"
117
- })).items.filter((x) => x.isActive);
124
+ });
125
+ const locales = localeResult.items.filter((x) => x.isActive);
118
126
  if (locales.length > 0 && markets.length > 0) {
119
- const keys = payload.config.collections.filter((x) => {
120
- return x.fields.find((x) => "name" in x && x.name === "slug");
121
- }).map((x) => x.slug);
127
+ const pageCollections = payload.config.collections.filter((x) => {
128
+ return x.fields.find((x$1) => "name" in x$1 && x$1.name === "slug");
129
+ });
130
+ const keys = pageCollections.map((x) => x.slug);
122
131
  const pages = Object.fromEntries(keys.map((x) => [x, []]));
123
- for (const key of keys) pages[key] = (await payload.find({
124
- ...unlocalized,
125
- collection: key
126
- })).docs;
127
- const categories = (await payload.find({
132
+ for (const key of keys) {
133
+ const pageResult = await payload.find({
134
+ ...unlocalized,
135
+ collection: key
136
+ });
137
+ pages[key] = pageResult.docs;
138
+ }
139
+ const categoryRequest = await payload.find({
128
140
  ...unlocalized,
129
141
  collection: "category",
130
142
  depth: 1
131
- })).docs;
132
- const medias = (await payload.find({
143
+ });
144
+ const categories = categoryRequest.docs;
145
+ const mediaRequest = await payload.find({
133
146
  ...unlocalized,
134
147
  collection: "media",
135
148
  depth: 1
136
- })).docs;
149
+ });
150
+ const medias = mediaRequest.docs;
137
151
  routes = collectRoutes(pages, categories, markets, locales, medias);
138
152
  }
139
153
  routeCache.set(cacheKey, routes);
@@ -156,21 +170,25 @@ async function getMixerContext({ payload, market, locale, user = guest, draft =
156
170
  user,
157
171
  draft
158
172
  });
159
- const locales = (await payload.findGlobal({
173
+ const localeResult = await payload.findGlobal({
160
174
  ...localized,
161
175
  slug: "locale"
162
- })).items.filter((x) => x.isActive);
176
+ });
177
+ const locales = localeResult.items.filter((x) => x.isActive);
163
178
  const localeIds = locales.map((x) => x.id);
164
- const markets = (await payload.find({
179
+ const marketRequest = await payload.find({
165
180
  ...localized,
166
181
  collection: "market"
167
- })).docs.filter((x) => x.isActive);
182
+ });
183
+ const marketItems = marketRequest.docs;
184
+ const markets = marketItems.filter((x) => x.isActive);
168
185
  const marketIds = markets.map((x) => x.id);
169
- const categories = (await payload.find({
186
+ const categoryRequest = await payload.find({
170
187
  ...localized,
171
188
  collection: "category",
172
189
  depth: 2
173
- })).docs;
190
+ });
191
+ const categories = categoryRequest.docs;
174
192
  const routes = await getRoutes$1({
175
193
  payload,
176
194
  market,
@@ -178,6 +196,8 @@ async function getMixerContext({ payload, market, locale, user = guest, draft =
178
196
  user,
179
197
  draft
180
198
  });
199
+ const currentRoutes = filterRoutes(routes, market, locale);
200
+ const richText = false;
181
201
  const context = {
182
202
  locale,
183
203
  localeIds,
@@ -186,41 +206,72 @@ async function getMixerContext({ payload, market, locale, user = guest, draft =
186
206
  marketIds,
187
207
  markets,
188
208
  routes,
189
- currentRoutes: filterRoutes(routes, market, locale),
209
+ currentRoutes,
190
210
  categories,
191
- richText: false
211
+ richText
192
212
  };
193
213
  mixerCache.set(cacheKey, context);
194
214
  await setContext({ context });
195
215
  return context;
196
216
  }
197
217
  /**
218
+
219
+ * Resolves a draft option to a boolean.
220
+
221
+ * `'auto'` reads Next's `draftMode()`; outside a request scope (build, scripts) it resolves to false.
222
+
223
+ */
224
+ async function resolveDraft(draft = "auto") {
225
+ if (typeof draft === "boolean") return draft;
226
+ try {
227
+ return (await draftMode()).isEnabled;
228
+ } catch {
229
+ return false;
230
+ }
231
+ }
232
+ /**
233
+
198
234
  * Runtime (request-time) payload accessor.
235
+
199
236
  *
237
+
200
238
  * By default, operates as the guest user for static generation. For auth:
239
+
201
240
  * call getHeaders() directly in your page/route/layout, then pass it here.
241
+
242
+ * In draft mode the request headers are read automatically, so drafts are
243
+
244
+ * read as the authenticated user rather than the guest.
245
+
202
246
  *
247
+
203
248
  * Example:
249
+
204
250
  * const headers = await getHeaders();
251
+
205
252
  * const { payload, user, getContext } = await getPayload({ config, headers });
253
+
206
254
  */
207
- async function getPayload$1({ config, headers }) {
255
+ async function getPayload$1({ config, headers: headers$1, draft = false }) {
208
256
  const payload = await getPayload({ config });
209
257
  await setContext({ payload });
258
+ if (!headers$1 && draft) try {
259
+ headers$1 = await headers();
260
+ } catch {}
210
261
  let user = guest;
211
- if (headers) try {
262
+ if (headers$1) try {
212
263
  const auth = await payload.auth({
213
- headers,
264
+ headers: headers$1,
214
265
  canSetHeaders: false
215
266
  });
216
267
  if (auth.user) user = auth.user;
217
268
  } catch (error) {
218
269
  console.log("getPayload.error", error);
219
270
  }
220
- const draft = false;
221
271
  return {
222
272
  payload,
223
273
  user,
274
+ draft,
224
275
  getContext: (market, locale) => getMixerContext({
225
276
  payload,
226
277
  market,
@@ -240,116 +291,232 @@ function getAuthHeaders(token) {
240
291
  else return new Headers({ Authorization: `users API-Key ${process.env.STORE_API_KEY}` });
241
292
  }
242
293
  /**
243
- * Produces the common option block shared across all payload.find / payload.findGlobal calls.
294
+
295
+ * Produces the read options shared across payload.find / findByID / findGlobal calls.
296
+
244
297
  * For payload.find, add pagination: false and limit: 10000 at the call site.
245
- * For payload.findByID, spread directly — extra find-only fields are ignored.
298
+
299
+ * `select`, `populate` and `joins` are only included when provided.
300
+
246
301
  */
247
- function buildBaseOptions(user, locale, draft) {
302
+ function buildReadOptions({ user, locale, draft = false, depth, select, populate, joins }) {
248
303
  return {
249
304
  locale,
250
305
  fallbackLocale: defaultLocale,
251
- draft: draft ?? false,
252
- depth: 0,
306
+ draft,
307
+ depth,
253
308
  user,
254
- overrideAccess: false
309
+ overrideAccess: false,
310
+ ...select !== void 0 ? { select } : {},
311
+ ...populate !== void 0 ? { populate } : {},
312
+ ...joins !== void 0 ? { joins } : {}
255
313
  };
256
314
  }
257
315
  /**
316
+
317
+ * @deprecated Use `buildReadOptions({ user, locale, draft, depth })`.
318
+
319
+ * Kept for backward compatibility: reads at depth 0.
320
+
321
+ */
322
+ function buildBaseOptions(user, locale, draft) {
323
+ return buildReadOptions({
324
+ user,
325
+ locale,
326
+ draft,
327
+ depth: 0
328
+ });
329
+ }
330
+ /**
331
+
258
332
  * Payload proxy example
333
+
259
334
  *
335
+
260
336
  *
337
+
261
338
  * import type { Payload, PayloadRequest } from '../types/index.js'
262
339
 
340
+
341
+
263
342
  import { commitTransaction } from './commitTransaction.js'
343
+
264
344
  import { initTransaction } from './initTransaction.js'
345
+
265
346
  import { killTransaction } from './killTransaction.js'
266
347
 
348
+
349
+
267
350
  const localOperations = [
351
+
268
352
  'count',
353
+
269
354
  'countGlobalVersions',
355
+
270
356
  'countVersions',
357
+
271
358
  'create',
359
+
272
360
  'delete',
361
+
273
362
  'duplicate',
363
+
274
364
  'find',
365
+
275
366
  'findByID',
367
+
276
368
  'delete',
369
+
277
370
  'duplicate',
371
+
278
372
  'find',
373
+
279
374
  'findByID',
375
+
280
376
  'findGlobal',
377
+
281
378
  'findGlobalVersionByID',
379
+
282
380
  'findGlobalVersions',
381
+
283
382
  'findVersionByID',
383
+
284
384
  'findVersionByID',
385
+
285
386
  'login',
387
+
286
388
  'update',
389
+
287
390
  'updateGlobal',
391
+
288
392
  'restoreVersion',
393
+
289
394
  'restoreGlobalVersion',
395
+
290
396
  ] satisfies (keyof Payload)[]
291
397
 
398
+
399
+
292
400
  type LocalOperation = (typeof localOperations)[number]
293
401
 
402
+
403
+
294
404
  const isLocalOperation = (key: string): key is LocalOperation => {
405
+
295
406
  return localOperations.includes(key as LocalOperation)
407
+
296
408
  }
297
409
 
410
+
411
+
298
412
  export const withTransaction = async <T>(
413
+
299
414
  payload: Payload,
415
+
300
416
  callback: (transaction: Payload) => Promise<T>,
417
+
301
418
  ) => {
419
+
302
420
  const transactionReq = { payload } as PayloadRequest
421
+
303
422
  await initTransaction(transactionReq)
304
423
 
424
+
425
+
305
426
  const proxy = new Proxy(payload, {
427
+
306
428
  get(target, property: keyof Payload, receiver) {
429
+
307
430
  if (isLocalOperation(property)) {
431
+
308
432
  const operation = Reflect.get(target, property, receiver)
309
433
 
434
+
435
+
310
436
  return function (options) {
437
+
311
438
  let req: Partial<PayloadRequest> = options.req
312
439
 
440
+
441
+
313
442
  if (!req) {
443
+
314
444
  req = {}
445
+
315
446
  }
316
447
 
448
+
449
+
317
450
  if (!req.transactionID) {
451
+
318
452
  req = { ...req, transactionID: transactionReq.transactionID }
453
+
319
454
  }
320
455
 
456
+
457
+
321
458
  return (operation as (...args: unknown[]) => void)({
459
+
322
460
  ...options,
461
+
323
462
  req,
463
+
324
464
  })
465
+
325
466
  }
467
+
326
468
  }
327
469
 
470
+
471
+
328
472
  return Reflect.get(target, property, receiver)
473
+
329
474
  },
475
+
330
476
  })
331
477
 
478
+
479
+
332
480
  try {
481
+
333
482
  const result = await callback(proxy)
483
+
334
484
  await commitTransaction(transactionReq)
485
+
335
486
  return result
487
+
336
488
  } catch (e) {
489
+
337
490
  await killTransaction(transactionReq)
491
+
338
492
  throw e
493
+
339
494
  }
495
+
340
496
  }
341
497
 
498
+
499
+
342
500
  // -----------------
343
501
 
502
+
503
+
344
504
  const { one, two } = await withTransaction(payload, async (transaction) => {
505
+
345
506
  const one = await transaction.create({ collection: 'posts', data: { title: 'one' } })
507
+
346
508
  const two = await transaction.create({ collection: 'posts', data: { title: 'two' } })
347
509
 
510
+
511
+
348
512
  return { one, two }
513
+
349
514
  })
350
515
 
516
+
517
+
351
518
  */
352
- //#endregion
353
- export { buildBaseOptions, filterRoutes, getAuthHeaders, getCacheKey, getContext, getMixerContext, getOptions, getPayload$1 as getPayload, getPayloadInstance, getRoutes$1 as getRoutes, getSearchParams, setContext };
354
519
 
520
+ //#endregion
521
+ export { buildBaseOptions, buildReadOptions, filterRoutes, getAuthHeaders, getCacheKey, getContext, getMixerContext, getOptions, getPayload$1 as getPayload, getPayloadInstance, getRoutes$1 as getRoutes, getSearchParams, resolveDraft, setContext };
355
522
  //# sourceMappingURL=mixer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mixer.js","names":["getPayload_","getRoutes","getPayload"],"sources":["../../src/server/mixer.ts"],"sourcesContent":["import { collectRoutes, defaultLocale, defaultMarket, ICategory, ILocale, IMarket, IMedia, IRoute, isDevelopment, isObject } from '@websolutespa/bom-core';\r\nimport type { Config, User } from '@websolutespa/payload-plugin-bowl';\r\nimport { InMemoryCache } from '@websolutespa/payload-plugin-bowl';\r\nimport { NextRequest } from 'next/server';\r\nimport { BasePayload, getPayload as getPayload_, SanitizedConfig, TypedFallbackLocale, TypedLocale } from 'payload';\r\nimport { cache } from 'react';\r\nimport { guest } from '../lib/const';\r\nimport type { BaseOptions, IContext, MixerContext, ReadonlyHeaders } from '../types';\r\nimport type { MixerPayload } from './mixer-payload';\r\n\r\n// !!! todo check when to use in memory cache\r\n\r\nconst USE_CACHE = true || !(isDevelopment);\r\n\r\nconst getRouteCache = (): InMemoryCache<IRoute[]> => {\r\n let cache: InMemoryCache<IRoute[]> | undefined = (globalThis as any)._route;\r\n if (!cache) {\r\n cache = new InMemoryCache<IRoute[]>();\r\n (globalThis as any)._route = cache;\r\n }\r\n return cache;\r\n};\r\n\r\nconst getMixerCache = (): InMemoryCache<MixerContext> => {\r\n let cache: InMemoryCache<MixerContext> | undefined = (globalThis as any)._mixer;\r\n if (!cache) {\r\n cache = new InMemoryCache<MixerContext>();\r\n (globalThis as any)._mixer = cache;\r\n }\r\n return cache;\r\n};\r\n\r\nexport function getCacheKey({\r\n market = 'all',\r\n locale = 'all',\r\n user = guest,\r\n draft = 'false',\r\n}: {\r\n market?: string;\r\n locale?: string;\r\n user?: User & Config['user'];\r\n draft?: string;\r\n}) {\r\n const roles = (user?.roles || ['guest']) as string[];\r\n const tenants = ('tenants' in user && Array.isArray(user.tenants) ?\r\n user.tenants.map((x: any) => isObject(x) ? x.id : x) :\r\n []\r\n ) as string[];\r\n roles.sort();\r\n tenants.sort();\r\n const keys = [market, locale, draft === 'false' ? 'published' : 'draft', ...roles, ...tenants];\r\n const key = `context-${keys.join('-')}`;\r\n return key;\r\n}\r\n\r\nexport async function getContext() {\r\n let context: IContext | undefined = (globalThis as any)._context;\r\n if (!context) {\r\n context = {\r\n payload: undefined,\r\n context: undefined,\r\n } as unknown as IContext;\r\n (globalThis as any)._context = context;\r\n }\r\n return context;\r\n}\r\n\r\nexport async function setContext(data: Partial<IContext>) {\r\n const context = await getContext();\r\n if (data.payload) {\r\n context.payload = data.payload;\r\n }\r\n if (data.context) {\r\n context.context = data.context;\r\n }\r\n}\r\n\r\nexport function getSearchParams(request: NextRequest) {\r\n const searchParams = request.nextUrl.searchParams;\r\n const params = Object.fromEntries(searchParams.entries());\r\n return {\r\n market: params.market || defaultMarket,\r\n locale: params.locale || defaultLocale,\r\n defaultMarket,\r\n defaultLocale,\r\n params,\r\n searchParams: request.nextUrl.searchParams,\r\n };\r\n}\r\n\r\nexport const getPayloadInstance = cache(\r\n async (props: { config: SanitizedConfig | Promise<SanitizedConfig> }) => await getPayload_(props)\r\n);\r\n\r\nexport function getOptions({\r\n locale = 'all',\r\n user = guest,\r\n draft = false,\r\n}: {\r\n locale?: string;\r\n user?: User & Config['user'];\r\n draft?: boolean;\r\n}) {\r\n const localized: BaseOptions = {\r\n locale: locale as TypedLocale,\r\n fallbackLocale: defaultLocale as TypedLocale,\r\n draft,\r\n depth: 0,\r\n pagination: false,\r\n limit: 10000,\r\n user,\r\n overrideAccess: false,\r\n };\r\n const unlocalized: BaseOptions = {\r\n locale: 'all',\r\n fallbackLocale: defaultLocale as TypedLocale,\r\n draft,\r\n depth: 0,\r\n pagination: false,\r\n limit: 10000,\r\n user,\r\n overrideAccess: false,\r\n };\r\n return { localized, unlocalized };\r\n}\r\n\r\nexport async function getRoutes({\r\n payload,\r\n market = 'all',\r\n locale = 'all',\r\n user = guest,\r\n draft = false,\r\n}: {\r\n payload: BasePayload;\r\n market?: string;\r\n locale?: string;\r\n user?: User & Config['user'];\r\n draft?: boolean;\r\n}): Promise<IRoute[]> {\r\n const cacheKey = getCacheKey({ market, locale, user, draft: draft ? 'true' : 'false' });\r\n\r\n const routeCache = getRouteCache();\r\n if (USE_CACHE && routeCache.has(cacheKey)) {\r\n console.log('getRoutes from cache', cacheKey);\r\n return routeCache.get(cacheKey);\r\n }\r\n\r\n let routes: IRoute[] = [];\r\n if (!user) {\r\n return routes;\r\n }\r\n\r\n const { localized, unlocalized } = getOptions({ locale, user, draft });\r\n\r\n const marketRequest = await payload.find({\r\n ...localized,\r\n collection: 'market',\r\n where: { isActive: { equals: true } },\r\n });\r\n const markets = marketRequest.docs;\r\n\r\n const localeResult = await payload.findGlobal({\r\n ...localized,\r\n slug: 'locale',\r\n }) as { items: ILocale[] };\r\n const locales = localeResult.items.filter(x => x.isActive);\r\n\r\n if (locales.length > 0 && markets.length > 0) {\r\n const pageCollections = payload.config.collections.filter(x => {\r\n return x.fields.find(x => 'name' in x && x.name === 'slug');\r\n });\r\n const keys = pageCollections.map(x => x.slug);\r\n // console.log(payload.config.collections.find(x => x.slug === 'homepage'));\r\n // const keys = Object.keys(store.pages) as CollectionSlug[];\r\n const pages: Record<string, any[]> = Object.fromEntries(keys.map(x => [x, []]));\r\n for (const key of keys) {\r\n const pageResult = await payload.find({ ...unlocalized, collection: key });\r\n pages[key] = pageResult.docs;\r\n }\r\n const categoryRequest = await payload.find({\r\n ...unlocalized,\r\n collection: 'category',\r\n depth: 1,\r\n });\r\n const categories = categoryRequest.docs;\r\n const mediaRequest = await payload.find({\r\n ...unlocalized,\r\n collection: 'media',\r\n depth: 1,\r\n });\r\n const medias = mediaRequest.docs;\r\n routes = collectRoutes(\r\n pages,\r\n categories as unknown as ICategory[],\r\n markets as unknown as IMarket[],\r\n locales,\r\n medias as unknown as IMedia[]\r\n );\r\n }\r\n routeCache.set(cacheKey, routes);\r\n return routes;\r\n}\r\n\r\nexport async function getMixerContext({\r\n payload,\r\n market,\r\n locale,\r\n user = guest,\r\n draft = false,\r\n}: {\r\n payload: BasePayload;\r\n market: string;\r\n locale: string;\r\n user?: User & Config['user'];\r\n draft?: boolean;\r\n}): Promise<MixerContext> {\r\n const cacheKey = getCacheKey({ market, locale, user, draft: draft ? 'true' : 'false' });\r\n\r\n const mixerCache = getMixerCache();\r\n if (mixerCache.has(cacheKey) && USE_CACHE) {\r\n console.log('getContext from cache', cacheKey);\r\n return mixerCache.get(cacheKey);\r\n }\r\n\r\n const { localized } = getOptions({ locale, user, draft });\r\n const localeResult = await payload.findGlobal({\r\n ...localized,\r\n slug: 'locale',\r\n }) as { items: ILocale[] };\r\n const locales = localeResult.items.filter(x => x.isActive) as unknown as ILocale[];\r\n const localeIds = locales.map(x => x.id) as string[];\r\n\r\n const marketRequest = await payload.find({\r\n ...localized,\r\n collection: 'market',\r\n });\r\n const marketItems = marketRequest.docs;\r\n const markets = marketItems.filter(x => x.isActive) as unknown as IMarket[];\r\n const marketIds = markets.map(x => x.id);\r\n\r\n const categoryRequest = await payload.find({\r\n ...localized,\r\n collection: 'category',\r\n depth: 2,\r\n });\r\n const categories = categoryRequest.docs;\r\n\r\n const routes = await getRoutes({ payload, market, locale, user, draft });\r\n const currentRoutes = filterRoutes(routes, market, locale);\r\n\r\n const richText = false;\r\n\r\n const context: MixerContext = {\r\n locale,\r\n localeIds,\r\n locales,\r\n market,\r\n marketIds,\r\n markets,\r\n routes,\r\n currentRoutes,\r\n categories: categories as unknown as MixerContext['categories'],\r\n richText,\r\n };\r\n\r\n mixerCache.set(cacheKey, context);\r\n await setContext({ context });\r\n\r\n return context;\r\n}\r\n\r\n/**\r\n * Runtime (request-time) payload accessor.\r\n *\r\n * By default, operates as the guest user for static generation. For auth:\r\n * call getHeaders() directly in your page/route/layout, then pass it here.\r\n *\r\n * Example:\r\n * const headers = await getHeaders();\r\n * const { payload, user, getContext } = await getPayload({ config, headers });\r\n */\r\nexport async function getPayload({\r\n config,\r\n headers,\r\n}: {\r\n config: Promise<SanitizedConfig>;\r\n headers?: ReadonlyHeaders;\r\n}) {\r\n const payload = await getPayload_({ config });\r\n await setContext({ payload: payload as MixerPayload });\r\n\r\n let user: User & Config['user'] = guest;\r\n if (headers) {\r\n try {\r\n const auth = await payload.auth({ headers, canSetHeaders: false });\r\n if (auth.user) {\r\n user = auth.user as typeof user;\r\n }\r\n // console.log('getPayload', user, token);\r\n } catch (error) {\r\n console.log('getPayload.error', error);\r\n }\r\n }\r\n\r\n const draft = false;\r\n\r\n return {\r\n payload: payload as MixerPayload,\r\n user,\r\n getContext: (market: string, locale: string) => getMixerContext({ payload, market, locale, user, draft }),\r\n };\r\n}\r\n\r\nexport function filterRoutes(routes: IRoute[], market: string, locale: string): IRoute[] {\r\n market = market === 'all' ? defaultMarket : market;\r\n locale = locale === 'all' ? defaultLocale : locale;\r\n return routes.filter(x => x.market === market && x.locale === locale);\r\n}\r\n\r\nexport function getAuthHeaders(token: { value: string } | undefined): Headers {\r\n if (token) {\r\n return new Headers({ Authorization: `JWT ${token.value}` });\r\n } else {\r\n return new Headers({ Authorization: `users API-Key ${process.env.STORE_API_KEY}` });\r\n }\r\n}\r\n\r\n/**\r\n * Produces the common option block shared across all payload.find / payload.findGlobal calls.\r\n * For payload.find, add pagination: false and limit: 10000 at the call site.\r\n * For payload.findByID, spread directly — extra find-only fields are ignored.\r\n */\r\nexport function buildBaseOptions(user: any, locale: string, draft?: boolean) {\r\n return {\r\n locale: locale as TypedLocale,\r\n fallbackLocale: defaultLocale as TypedFallbackLocale,\r\n draft: draft ?? false,\r\n depth: 0,\r\n user,\r\n overrideAccess: false,\r\n };\r\n}\r\n\r\n\r\n/**\r\n * Payload proxy example\r\n *\r\n *\r\n * import type { Payload, PayloadRequest } from '../types/index.js'\r\n\r\nimport { commitTransaction } from './commitTransaction.js'\r\nimport { initTransaction } from './initTransaction.js'\r\nimport { killTransaction } from './killTransaction.js'\r\n\r\nconst localOperations = [\r\n 'count',\r\n 'countGlobalVersions',\r\n 'countVersions',\r\n 'create',\r\n 'delete',\r\n 'duplicate',\r\n 'find',\r\n 'findByID',\r\n 'delete',\r\n 'duplicate',\r\n 'find',\r\n 'findByID',\r\n 'findGlobal',\r\n 'findGlobalVersionByID',\r\n 'findGlobalVersions',\r\n 'findVersionByID',\r\n 'findVersionByID',\r\n 'login',\r\n 'update',\r\n 'updateGlobal',\r\n 'restoreVersion',\r\n 'restoreGlobalVersion',\r\n] satisfies (keyof Payload)[]\r\n\r\ntype LocalOperation = (typeof localOperations)[number]\r\n\r\nconst isLocalOperation = (key: string): key is LocalOperation => {\r\n return localOperations.includes(key as LocalOperation)\r\n}\r\n\r\nexport const withTransaction = async <T>(\r\n payload: Payload,\r\n callback: (transaction: Payload) => Promise<T>,\r\n) => {\r\n const transactionReq = { payload } as PayloadRequest\r\n await initTransaction(transactionReq)\r\n\r\n const proxy = new Proxy(payload, {\r\n get(target, property: keyof Payload, receiver) {\r\n if (isLocalOperation(property)) {\r\n const operation = Reflect.get(target, property, receiver)\r\n\r\n return function (options) {\r\n let req: Partial<PayloadRequest> = options.req\r\n\r\n if (!req) {\r\n req = {}\r\n }\r\n\r\n if (!req.transactionID) {\r\n req = { ...req, transactionID: transactionReq.transactionID }\r\n }\r\n\r\n return (operation as (...args: unknown[]) => void)({\r\n ...options,\r\n req,\r\n })\r\n }\r\n }\r\n\r\n return Reflect.get(target, property, receiver)\r\n },\r\n })\r\n\r\n try {\r\n const result = await callback(proxy)\r\n await commitTransaction(transactionReq)\r\n return result\r\n } catch (e) {\r\n await killTransaction(transactionReq)\r\n throw e\r\n }\r\n}\r\n\r\n// -----------------\r\n\r\nconst { one, two } = await withTransaction(payload, async (transaction) => {\r\n const one = await transaction.create({ collection: 'posts', data: { title: 'one' } })\r\n const two = await transaction.create({ collection: 'posts', data: { title: 'two' } })\r\n\r\n return { one, two }\r\n})\r\n\r\n */\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"mixer.js","names":["cache: InMemoryCache<IRoute[]> | undefined","cache","cache: InMemoryCache<MixerContext> | undefined","x: any","context: IContext | undefined","data: Partial<IContext>","request: NextRequest","props: { config: SanitizedConfig | Promise<SanitizedConfig> }","getPayload_","localized: BaseOptions","unlocalized: BaseOptions","getRoutes","routes: IRoute[]","x","pages: Record<string, any[]>","context: MixerContext","draft: DraftOption","getPayload","headers","getHeaders","user: User & Config['user']","market: string","locale: string","token: { value: string } | undefined","user: any","draft?: boolean"],"sources":["../../src/server/mixer.ts"],"sourcesContent":["import { collectRoutes, defaultLocale, defaultMarket, ICategory, ILocale, IMarket, IMedia, IRoute, isDevelopment, isObject } from '@websolutespa/bom-core';\r\nimport type { Config, User } from '@websolutespa/payload-plugin-bowl';\r\nimport { InMemoryCache } from '@websolutespa/payload-plugin-bowl';\r\nimport { draftMode, headers as getHeaders } from 'next/headers';\r\nimport { NextRequest } from 'next/server';\r\nimport { BasePayload, getPayload as getPayload_, SanitizedConfig, TypedFallbackLocale, TypedLocale } from 'payload';\r\nimport { cache } from 'react';\r\nimport { guest } from '../lib/const';\r\nimport type { BaseOptions, DraftOption, IContext, MixerContext, ReadOptions, ReadonlyHeaders } from '../types';\r\nimport type { MixerPayload } from './mixer-payload';\r\n\r\n// !!! todo check when to use in memory cache\r\n\r\nconst USE_CACHE = true || !(isDevelopment);\r\n\r\nconst getRouteCache = (): InMemoryCache<IRoute[]> => {\r\n let cache: InMemoryCache<IRoute[]> | undefined = (globalThis as any)._route;\r\n if (!cache) {\r\n cache = new InMemoryCache<IRoute[]>();\r\n (globalThis as any)._route = cache;\r\n }\r\n return cache;\r\n};\r\n\r\nconst getMixerCache = (): InMemoryCache<MixerContext> => {\r\n let cache: InMemoryCache<MixerContext> | undefined = (globalThis as any)._mixer;\r\n if (!cache) {\r\n cache = new InMemoryCache<MixerContext>();\r\n (globalThis as any)._mixer = cache;\r\n }\r\n return cache;\r\n};\r\n\r\nexport function getCacheKey({\r\n market = 'all',\r\n locale = 'all',\r\n user = guest,\r\n draft = 'false',\r\n}: {\r\n market?: string;\r\n locale?: string;\r\n user?: User & Config['user'];\r\n draft?: string;\r\n}) {\r\n const roles = (user?.roles || ['guest']) as string[];\r\n const tenants = ('tenants' in user && Array.isArray(user.tenants) ?\r\n user.tenants.map((x: any) => isObject(x) ? x.id : x) :\r\n []\r\n ) as string[];\r\n roles.sort();\r\n tenants.sort();\r\n const keys = [market, locale, draft === 'false' ? 'published' : 'draft', ...roles, ...tenants];\r\n const key = `context-${keys.join('-')}`;\r\n return key;\r\n}\r\n\r\nexport async function getContext() {\r\n let context: IContext | undefined = (globalThis as any)._context;\r\n if (!context) {\r\n context = {\r\n payload: undefined,\r\n context: undefined,\r\n } as unknown as IContext;\r\n (globalThis as any)._context = context;\r\n }\r\n return context;\r\n}\r\n\r\nexport async function setContext(data: Partial<IContext>) {\r\n const context = await getContext();\r\n if (data.payload) {\r\n context.payload = data.payload;\r\n }\r\n if (data.context) {\r\n context.context = data.context;\r\n }\r\n}\r\n\r\nexport function getSearchParams(request: NextRequest) {\r\n const searchParams = request.nextUrl.searchParams;\r\n const params = Object.fromEntries(searchParams.entries());\r\n return {\r\n market: params.market || defaultMarket,\r\n locale: params.locale || defaultLocale,\r\n defaultMarket,\r\n defaultLocale,\r\n params,\r\n searchParams: request.nextUrl.searchParams,\r\n };\r\n}\r\n\r\nexport const getPayloadInstance = cache(\r\n async (props: { config: SanitizedConfig | Promise<SanitizedConfig> }) => await getPayload_(props)\r\n);\r\n\r\nexport function getOptions({\r\n locale = 'all',\r\n user = guest,\r\n draft = false,\r\n}: {\r\n locale?: string;\r\n user?: User & Config['user'];\r\n draft?: boolean;\r\n}) {\r\n const localized: BaseOptions = {\r\n locale: locale as TypedLocale,\r\n fallbackLocale: defaultLocale as TypedLocale,\r\n draft,\r\n depth: 0,\r\n pagination: false,\r\n limit: 10000,\r\n user,\r\n overrideAccess: false,\r\n };\r\n const unlocalized: BaseOptions = {\r\n locale: 'all',\r\n fallbackLocale: defaultLocale as TypedLocale,\r\n draft,\r\n depth: 0,\r\n pagination: false,\r\n limit: 10000,\r\n user,\r\n overrideAccess: false,\r\n };\r\n return { localized, unlocalized };\r\n}\r\n\r\nexport async function getRoutes({\r\n payload,\r\n market = 'all',\r\n locale = 'all',\r\n user = guest,\r\n draft = false,\r\n}: {\r\n payload: BasePayload;\r\n market?: string;\r\n locale?: string;\r\n user?: User & Config['user'];\r\n draft?: boolean;\r\n}): Promise<IRoute[]> {\r\n const cacheKey = getCacheKey({ market, locale, user, draft: draft ? 'true' : 'false' });\r\n\r\n const routeCache = getRouteCache();\r\n if (USE_CACHE && routeCache.has(cacheKey)) {\r\n console.log('getRoutes from cache', cacheKey);\r\n return routeCache.get(cacheKey);\r\n }\r\n\r\n let routes: IRoute[] = [];\r\n if (!user) {\r\n return routes;\r\n }\r\n\r\n const { localized, unlocalized } = getOptions({ locale, user, draft });\r\n\r\n const marketRequest = await payload.find({\r\n ...localized,\r\n collection: 'market',\r\n where: { isActive: { equals: true } },\r\n });\r\n const markets = marketRequest.docs;\r\n\r\n const localeResult = await payload.findGlobal({\r\n ...localized,\r\n slug: 'locale',\r\n }) as { items: ILocale[] };\r\n const locales = localeResult.items.filter(x => x.isActive);\r\n\r\n if (locales.length > 0 && markets.length > 0) {\r\n const pageCollections = payload.config.collections.filter(x => {\r\n return x.fields.find(x => 'name' in x && x.name === 'slug');\r\n });\r\n const keys = pageCollections.map(x => x.slug);\r\n // console.log(payload.config.collections.find(x => x.slug === 'homepage'));\r\n // const keys = Object.keys(store.pages) as CollectionSlug[];\r\n const pages: Record<string, any[]> = Object.fromEntries(keys.map(x => [x, []]));\r\n for (const key of keys) {\r\n const pageResult = await payload.find({ ...unlocalized, collection: key });\r\n pages[key] = pageResult.docs;\r\n }\r\n const categoryRequest = await payload.find({\r\n ...unlocalized,\r\n collection: 'category',\r\n depth: 1,\r\n });\r\n const categories = categoryRequest.docs;\r\n const mediaRequest = await payload.find({\r\n ...unlocalized,\r\n collection: 'media',\r\n depth: 1,\r\n });\r\n const medias = mediaRequest.docs;\r\n routes = collectRoutes(\r\n pages,\r\n categories as unknown as ICategory[],\r\n markets as unknown as IMarket[],\r\n locales,\r\n medias as unknown as IMedia[]\r\n );\r\n }\r\n routeCache.set(cacheKey, routes);\r\n return routes;\r\n}\r\n\r\nexport async function getMixerContext({\r\n payload,\r\n market,\r\n locale,\r\n user = guest,\r\n draft = false,\r\n}: {\r\n payload: BasePayload;\r\n market: string;\r\n locale: string;\r\n user?: User & Config['user'];\r\n draft?: boolean;\r\n}): Promise<MixerContext> {\r\n const cacheKey = getCacheKey({ market, locale, user, draft: draft ? 'true' : 'false' });\r\n\r\n const mixerCache = getMixerCache();\r\n if (mixerCache.has(cacheKey) && USE_CACHE) {\r\n console.log('getContext from cache', cacheKey);\r\n return mixerCache.get(cacheKey);\r\n }\r\n\r\n const { localized } = getOptions({ locale, user, draft });\r\n const localeResult = await payload.findGlobal({\r\n ...localized,\r\n slug: 'locale',\r\n }) as { items: ILocale[] };\r\n const locales = localeResult.items.filter(x => x.isActive) as unknown as ILocale[];\r\n const localeIds = locales.map(x => x.id) as string[];\r\n\r\n const marketRequest = await payload.find({\r\n ...localized,\r\n collection: 'market',\r\n });\r\n const marketItems = marketRequest.docs;\r\n const markets = marketItems.filter(x => x.isActive) as unknown as IMarket[];\r\n const marketIds = markets.map(x => x.id);\r\n\r\n const categoryRequest = await payload.find({\r\n ...localized,\r\n collection: 'category',\r\n depth: 2,\r\n });\r\n const categories = categoryRequest.docs;\r\n\r\n const routes = await getRoutes({ payload, market, locale, user, draft });\r\n const currentRoutes = filterRoutes(routes, market, locale);\r\n\r\n const richText = false;\r\n\r\n const context: MixerContext = {\r\n locale,\r\n localeIds,\r\n locales,\r\n market,\r\n marketIds,\r\n markets,\r\n routes,\r\n currentRoutes,\r\n categories: categories as unknown as MixerContext['categories'],\r\n richText,\r\n };\r\n\r\n mixerCache.set(cacheKey, context);\r\n await setContext({ context });\r\n\r\n return context;\r\n}\r\n\r\n/**\r\n * Resolves a draft option to a boolean.\r\n * `'auto'` reads Next's `draftMode()`; outside a request scope (build, scripts) it resolves to false.\r\n */\r\nexport async function resolveDraft(draft: DraftOption = 'auto'): Promise<boolean> {\r\n if (typeof draft === 'boolean') {\r\n return draft;\r\n }\r\n try {\r\n return (await draftMode()).isEnabled;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Runtime (request-time) payload accessor.\r\n *\r\n * By default, operates as the guest user for static generation. For auth:\r\n * call getHeaders() directly in your page/route/layout, then pass it here.\r\n * In draft mode the request headers are read automatically, so drafts are\r\n * read as the authenticated user rather than the guest.\r\n *\r\n * Example:\r\n * const headers = await getHeaders();\r\n * const { payload, user, getContext } = await getPayload({ config, headers });\r\n */\r\nexport async function getPayload({\r\n config,\r\n headers,\r\n draft = false,\r\n}: {\r\n config: Promise<SanitizedConfig>;\r\n headers?: ReadonlyHeaders;\r\n draft?: boolean;\r\n}) {\r\n const payload = await getPayload_({ config });\r\n await setContext({ payload: payload as MixerPayload });\r\n\r\n if (!headers && draft) {\r\n try {\r\n headers = await getHeaders() as ReadonlyHeaders;\r\n } catch {\r\n // outside a request scope: keep the guest user\r\n }\r\n }\r\n\r\n let user: User & Config['user'] = guest;\r\n if (headers) {\r\n try {\r\n const auth = await payload.auth({ headers, canSetHeaders: false });\r\n if (auth.user) {\r\n user = auth.user as typeof user;\r\n }\r\n } catch (error) {\r\n console.log('getPayload.error', error);\r\n }\r\n }\r\n\r\n return {\r\n payload: payload as MixerPayload,\r\n user,\r\n draft,\r\n getContext: (market: string, locale: string) => getMixerContext({ payload, market, locale, user, draft }),\r\n };\r\n}\r\n\r\nexport function filterRoutes(routes: IRoute[], market: string, locale: string): IRoute[] {\r\n market = market === 'all' ? defaultMarket : market;\r\n locale = locale === 'all' ? defaultLocale : locale;\r\n return routes.filter(x => x.market === market && x.locale === locale);\r\n}\r\n\r\nexport function getAuthHeaders(token: { value: string } | undefined): Headers {\r\n if (token) {\r\n return new Headers({ Authorization: `JWT ${token.value}` });\r\n } else {\r\n return new Headers({ Authorization: `users API-Key ${process.env.STORE_API_KEY}` });\r\n }\r\n}\r\n\r\n/**\r\n * Produces the read options shared across payload.find / findByID / findGlobal calls.\r\n * For payload.find, add pagination: false and limit: 10000 at the call site.\r\n * `select`, `populate` and `joins` are only included when provided.\r\n */\r\nexport function buildReadOptions({\r\n user,\r\n locale,\r\n draft = false,\r\n depth,\r\n select,\r\n populate,\r\n joins,\r\n}: ReadOptions & {\r\n user: any;\r\n locale: string;\r\n}) {\r\n return {\r\n locale: locale as TypedLocale,\r\n fallbackLocale: defaultLocale as TypedFallbackLocale,\r\n draft,\r\n depth,\r\n user,\r\n overrideAccess: false,\r\n ...(select !== undefined ? { select } : {}),\r\n ...(populate !== undefined ? { populate } : {}),\r\n // joins are collection specific: typed by the caller's options, untyped here\r\n ...(joins !== undefined ? { joins } as {} : {}),\r\n };\r\n}\r\n\r\n/**\r\n * @deprecated Use `buildReadOptions({ user, locale, draft, depth })`.\r\n * Kept for backward compatibility: reads at depth 0.\r\n */\r\nexport function buildBaseOptions(user: any, locale: string, draft?: boolean) {\r\n return buildReadOptions({ user, locale, draft, depth: 0 });\r\n}\r\n\r\n/**\r\n * Payload proxy example\r\n *\r\n *\r\n * import type { Payload, PayloadRequest } from '../types/index.js'\r\n\r\nimport { commitTransaction } from './commitTransaction.js'\r\nimport { initTransaction } from './initTransaction.js'\r\nimport { killTransaction } from './killTransaction.js'\r\n\r\nconst localOperations = [\r\n 'count',\r\n 'countGlobalVersions',\r\n 'countVersions',\r\n 'create',\r\n 'delete',\r\n 'duplicate',\r\n 'find',\r\n 'findByID',\r\n 'delete',\r\n 'duplicate',\r\n 'find',\r\n 'findByID',\r\n 'findGlobal',\r\n 'findGlobalVersionByID',\r\n 'findGlobalVersions',\r\n 'findVersionByID',\r\n 'findVersionByID',\r\n 'login',\r\n 'update',\r\n 'updateGlobal',\r\n 'restoreVersion',\r\n 'restoreGlobalVersion',\r\n] satisfies (keyof Payload)[]\r\n\r\ntype LocalOperation = (typeof localOperations)[number]\r\n\r\nconst isLocalOperation = (key: string): key is LocalOperation => {\r\n return localOperations.includes(key as LocalOperation)\r\n}\r\n\r\nexport const withTransaction = async <T>(\r\n payload: Payload,\r\n callback: (transaction: Payload) => Promise<T>,\r\n) => {\r\n const transactionReq = { payload } as PayloadRequest\r\n await initTransaction(transactionReq)\r\n\r\n const proxy = new Proxy(payload, {\r\n get(target, property: keyof Payload, receiver) {\r\n if (isLocalOperation(property)) {\r\n const operation = Reflect.get(target, property, receiver)\r\n\r\n return function (options) {\r\n let req: Partial<PayloadRequest> = options.req\r\n\r\n if (!req) {\r\n req = {}\r\n }\r\n\r\n if (!req.transactionID) {\r\n req = { ...req, transactionID: transactionReq.transactionID }\r\n }\r\n\r\n return (operation as (...args: unknown[]) => void)({\r\n ...options,\r\n req,\r\n })\r\n }\r\n }\r\n\r\n return Reflect.get(target, property, receiver)\r\n },\r\n })\r\n\r\n try {\r\n const result = await callback(proxy)\r\n await commitTransaction(transactionReq)\r\n return result\r\n } catch (e) {\r\n await killTransaction(transactionReq)\r\n throw e\r\n }\r\n}\r\n\r\n// -----------------\r\n\r\nconst { one, two } = await withTransaction(payload, async (transaction) => {\r\n const one = await transaction.create({ collection: 'posts', data: { title: 'one' } })\r\n const two = await transaction.create({ collection: 'posts', data: { title: 'two' } })\r\n\r\n return { one, two }\r\n})\r\n\r\n */\r\n"],"mappings":"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"}
@@ -1,10 +1,23 @@
1
1
  import { MixerPayload } from "./mixer-payload.js";
2
- import { MixerContext, TypedPage } from "../types.js";
2
+ import { MixerContext, PageSelect, ReadOptions, TypedPage } from "../types.js";
3
+ import "server-only";
3
4
  import { User } from "@websolutespa/payload-plugin-bowl";
4
- import { CollectionSlug } from "payload";
5
+ import { CollectionSlug, SelectType } from "payload";
5
6
 
6
7
  //#region src/server/page.d.ts
7
8
 
9
+ /**
10
+ * Fields `getPage` needs to build the envelope (href, alternates, breadcrumb,
11
+ * segments) and that templates rely on (meta, template). They are always
12
+ * kept, whatever `select` the caller passes.
13
+ */
14
+ declare const PAGE_ENVELOPE_FIELDS: readonly ["id", "slug", "title", "category", "markets", "meta", "template"];
15
+ /**
16
+ * Merges the envelope fields into a Payload select.
17
+ * - include mode (`true` values): envelope keys are added.
18
+ * - exclude mode (`false` values): envelope keys are removed from the exclusion list.
19
+ */
20
+ declare function withEnvelopeSelect<T extends SelectType | undefined>(select: T): T;
8
21
  /**
9
22
  * Fetches a single page document by ID using Payload local API and assembles
10
23
  * the IPage envelope (routes, alternates, breadcrumb, parentRoute).
@@ -13,10 +26,13 @@ import { CollectionSlug } from "payload";
13
26
  * - routes/alternates : mixerContext.routes filtered by schema+id
14
27
  * - segments : getCategorySegments() from bom-core (pure)
15
28
  * - breadcrumb : findRouteOfCategory() from bom-core + mixerContext.currentRoutes
29
+ *
30
+ * Returns undefined when the document is not found; any other error is logged and rethrown.
31
+ * The last argument accepts read options (depth, draft, select, populate, joins);
32
+ * a boolean is still accepted as the legacy `draftMode` flag (depth 0).
16
33
  */
17
- declare function getPage<TSlug extends CollectionSlug>(slug: TSlug, id: string, market: string, locale: string, payload: MixerPayload, user: User, mixerContext: MixerContext, draftMode?: boolean): Promise<TypedPage<TSlug> | undefined>;
34
+ declare function getPage<TSlug extends CollectionSlug, TSelect extends PageSelect<TSlug> = undefined>(slug: TSlug, id: string, market: string, locale: string, payload: MixerPayload, user: User, mixerContext: MixerContext, readOptions?: ReadOptions | boolean): Promise<TypedPage<TSlug, TSelect> | undefined>;
18
35
  //# sourceMappingURL=page.d.ts.map
19
-
20
36
  //#endregion
21
- export { getPage };
37
+ export { PAGE_ENVELOPE_FIELDS, getPage, withEnvelopeSelect };
22
38
  //# sourceMappingURL=page.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"page.d.ts","names":[],"sources":["../../src/server/page.ts"],"mappings":";;;;;;;;;AAmBA;AAA6B;AAAe;AACpC;AAIG;AACH;AACQ;AAEK,iBATC,OASD,CAAA,cATuB,cASvB,CAAA,CAAA,IAAA,EARb,KAQa,EAAA,EAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAJV,YAIU,EAAA,IAAA,EAHb,IAGa,EAAA,YAAA,EAFL,YAEK,EAAA,SAAA,CAAA,EAAA,OAAA,CAAA,EAAlB,OAAkB,CAAV,SAAU,CAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AAAV"}
1
+ {"version":3,"file":"page.d.ts","names":[],"sources":["../../src/server/page.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AAeA;AAaA;;AAA6C,cAbhC,oBAagC,EAAA,SAAA,CAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,UAAA,CAAA;;;AAAqC;AAgClF;;AAA4C,iBAhC5B,kBAgC4B,CAAA,UAhCC,UAgCD,GAAA,SAAA,CAAA,CAAA,MAAA,EAhCiC,CAgCjC,CAAA,EAhCqC,CAgCrC;;;;;;;;;;;;AASlC;;iBATY,sBAAsB,gCAAgC,WAAW,0BAC/E,4DAIG,oBACH,oBACQ,4BACA,wBACb,QAAQ,UAAU,OAAO"}