@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.
- package/CHANGELOG.md +37 -7
- package/README.md +28 -0
- package/dist/_virtual/{_rolldown/runtime.js → rolldown_runtime.js} +7 -4
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +17 -6
- package/dist/client/client.js.map +1 -1
- package/dist/client/extra.d.ts +3 -3
- package/dist/client/extra.d.ts.map +1 -1
- package/dist/client/extra.js +10 -5
- package/dist/client/extra.js.map +1 -1
- package/dist/client/label.d.ts +3 -3
- package/dist/client/label.d.ts.map +1 -1
- package/dist/client/label.js +10 -5
- package/dist/client/label.js.map +1 -1
- package/dist/client/layout.d.ts +3 -3
- package/dist/client/layout.d.ts.map +1 -1
- package/dist/client/layout.js +10 -5
- package/dist/client/layout.js.map +1 -1
- package/dist/client/local.collection.d.ts.map +1 -1
- package/dist/client/local.collection.js +4 -2
- package/dist/client/local.collection.js.map +1 -1
- package/dist/client/metadata.d.ts +3 -3
- package/dist/client/metadata.d.ts.map +1 -1
- package/dist/client/metadata.js +48 -40
- package/dist/client/metadata.js.map +1 -1
- package/dist/client/page.d.ts +3 -3
- package/dist/client/page.d.ts.map +1 -1
- package/dist/client/page.js +10 -5
- package/dist/client/page.js.map +1 -1
- package/dist/client/useApi.d.ts +7 -7
- package/dist/client/useApi.d.ts.map +1 -1
- package/dist/client/useApi.js +2 -1
- package/dist/client/useApi.js.map +1 -1
- package/dist/client/useCollectionApi.d.ts +6 -6
- package/dist/client/useCollectionApi.d.ts.map +1 -1
- package/dist/client/useCollectionApi.js +4 -2
- package/dist/client/useCollectionApi.js.map +1 -1
- package/dist/client/useExtra.d.ts.map +1 -1
- package/dist/client/useExtra.js +5 -2
- package/dist/client/useExtra.js.map +1 -1
- package/dist/client/useHttp.d.ts.map +1 -1
- package/dist/client/useHttp.js +9 -6
- package/dist/client/useHttp.js.map +1 -1
- package/dist/client/useLabel.d.ts.map +1 -1
- package/dist/client/useLabel.js +5 -2
- package/dist/client/useLabel.js.map +1 -1
- package/dist/client/useLayout.d.ts.map +1 -1
- package/dist/client/useLayout.js +5 -2
- package/dist/client/useLayout.js.map +1 -1
- package/dist/client/useLink.d.ts.map +1 -1
- package/dist/client/useLink.js +7 -3
- package/dist/client/useLink.js.map +1 -1
- package/dist/client/useMetaData.d.ts.map +1 -1
- package/dist/client/useMetaData.js +5 -2
- package/dist/client/useMetaData.js.map +1 -1
- package/dist/client/usePage.d.ts.map +1 -1
- package/dist/client/usePage.js +5 -2
- package/dist/client/usePage.js.map +1 -1
- package/dist/client/useUser.d.ts.map +1 -1
- package/dist/client/useUser.js +5 -2
- package/dist/client/useUser.js.map +1 -1
- package/dist/client/user.d.ts.map +1 -1
- package/dist/client/user.js +17 -11
- package/dist/client/user.js.map +1 -1
- package/dist/exports/client.js +2 -1
- package/dist/exports/instrumentation.js +2 -1
- package/dist/exports/proxy.js +2 -1
- package/dist/exports/server.d.ts +5 -4
- package/dist/exports/server.js +7 -5
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -2
- package/dist/instrumentation/client.d.ts.map +1 -1
- package/dist/instrumentation/client.js +2 -1
- package/dist/instrumentation/client.js.map +1 -1
- package/dist/instrumentation/sentry/capture.requestError.js +4 -1
- package/dist/instrumentation/sentry/capture.requestError.js.map +1 -1
- package/dist/instrumentation/sentry/capture.routerTransitionStart.js +2 -1
- package/dist/instrumentation/sentry/capture.routerTransitionStart.js.map +1 -1
- package/dist/instrumentation/sentry/config.client.js +10 -2
- package/dist/instrumentation/sentry/config.client.js.map +1 -0
- package/dist/instrumentation/sentry/config.edge.js +10 -2
- package/dist/instrumentation/sentry/config.edge.js.map +1 -0
- package/dist/instrumentation/sentry/config.server.js +10 -2
- package/dist/instrumentation/sentry/config.server.js.map +1 -0
- package/dist/instrumentation/server.d.ts.map +1 -1
- package/dist/instrumentation/server.js +8 -5
- package/dist/instrumentation/server.js.map +1 -1
- package/dist/instrumentation/types.d.ts.map +1 -1
- package/dist/lib/breadcrumb.d.ts.map +1 -1
- package/dist/lib/breadcrumb.js +6 -1
- package/dist/lib/breadcrumb.js.map +1 -1
- package/dist/lib/const.d.ts +14 -2
- package/dist/lib/const.d.ts.map +1 -1
- package/dist/lib/const.js +24 -2
- package/dist/lib/const.js.map +1 -1
- package/dist/lib/http.d.ts +9 -0
- package/dist/lib/http.d.ts.map +1 -1
- package/dist/lib/http.js +27 -4
- package/dist/lib/http.js.map +1 -1
- package/dist/lib/label.d.ts.map +1 -1
- package/dist/lib/label.js +4 -3
- package/dist/lib/label.js.map +1 -1
- package/dist/lib/layout.defaults.d.ts.map +1 -1
- package/dist/lib/layout.defaults.js +1 -1
- package/dist/lib/layout.defaults.js.map +1 -1
- package/dist/lib/link.d.ts.map +1 -1
- package/dist/lib/link.js +2 -1
- package/dist/lib/link.js.map +1 -1
- package/dist/lib/meta-data.d.ts.map +1 -1
- package/dist/lib/open-graph.d.ts.map +1 -1
- package/dist/lib/pagination.d.ts.map +1 -1
- package/dist/lib/pagination.js +4 -2
- package/dist/lib/pagination.js.map +1 -1
- package/dist/lib/route.d.ts.map +1 -1
- package/dist/lib/route.js +9 -3
- package/dist/lib/route.js.map +1 -1
- package/dist/lib/store.d.ts.map +1 -1
- package/dist/lib/store.js +31 -31
- package/dist/lib/store.js.map +1 -1
- package/dist/lib/structured-data.d.ts.map +1 -1
- package/dist/lib/twitter-card.d.ts.map +1 -1
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +3 -2
- package/dist/lib/utils.js.map +1 -1
- package/dist/mock.d.ts.map +1 -1
- package/dist/node_modules/@selderee/plugin-htmlparser2/lib/hp2-builder.js +3 -2
- package/dist/node_modules/@selderee/plugin-htmlparser2/lib/hp2-builder.js.map +1 -1
- package/dist/node_modules/deepmerge/dist/cjs.js +17 -9
- package/dist/node_modules/deepmerge/dist/cjs.js.map +1 -1
- package/dist/node_modules/dom-serializer/lib/esm/foreignNames.js +2 -2
- package/dist/node_modules/dom-serializer/lib/esm/foreignNames.js.map +1 -1
- package/dist/node_modules/dom-serializer/lib/esm/index.js +10 -15
- package/dist/node_modules/dom-serializer/lib/esm/index.js.map +1 -1
- package/dist/node_modules/domelementtype/lib/esm/index.js +12 -12
- package/dist/node_modules/domelementtype/lib/esm/index.js.map +1 -1
- package/dist/node_modules/domhandler/lib/esm/index.js +4 -3
- package/dist/node_modules/domhandler/lib/esm/index.js.map +1 -1
- package/dist/node_modules/domhandler/lib/esm/node.js +8 -7
- package/dist/node_modules/domhandler/lib/esm/node.js.map +1 -1
- package/dist/node_modules/entities/lib/esm/decode.js +33 -32
- package/dist/node_modules/entities/lib/esm/decode.js.map +1 -1
- package/dist/node_modules/entities/lib/esm/decode_codepoint.js +5 -5
- package/dist/node_modules/entities/lib/esm/decode_codepoint.js.map +1 -1
- package/dist/node_modules/entities/lib/esm/escape.js +14 -6
- package/dist/node_modules/entities/lib/esm/escape.js.map +1 -1
- package/dist/node_modules/entities/lib/esm/generated/decode-data-html.js +2 -2
- package/dist/node_modules/entities/lib/esm/generated/decode-data-html.js.map +1 -1
- package/dist/node_modules/entities/lib/esm/generated/decode-data-xml.js +2 -2
- package/dist/node_modules/entities/lib/esm/generated/decode-data-xml.js.map +1 -1
- package/dist/node_modules/html-to-text/lib/html-to-text.js +45 -33
- package/dist/node_modules/html-to-text/lib/html-to-text.js.map +1 -1
- package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/Parser.js +25 -25
- package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/Parser.js.map +1 -1
- package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/Tokenizer.js +76 -73
- package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/Tokenizer.js.map +1 -1
- package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/index.js +4 -3
- package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/index.js.map +1 -1
- package/dist/node_modules/leac/lib/leac.js +72 -72
- package/dist/node_modules/leac/lib/leac.js.map +1 -1
- package/dist/node_modules/parseley/lib/parseley.js +37 -33
- package/dist/node_modules/parseley/lib/parseley.js.map +1 -1
- package/dist/node_modules/peberminta/lib/core.js +4 -4
- package/dist/node_modules/peberminta/lib/core.js.map +1 -1
- package/dist/node_modules/selderee/lib/selderee.js +16 -10
- package/dist/node_modules/selderee/lib/selderee.js.map +1 -1
- package/dist/proxy/protected-route.d.ts.map +1 -1
- package/dist/proxy/protected-route.js +11 -6
- package/dist/proxy/protected-route.js.map +1 -1
- package/dist/proxy/proxy.d.ts +5 -4
- package/dist/proxy/proxy.d.ts.map +1 -1
- package/dist/proxy/proxy.js +26 -6
- package/dist/proxy/proxy.js.map +1 -1
- package/dist/proxy/route-auto-detection.d.ts.map +1 -1
- package/dist/proxy/route-auto-detection.js +26 -14
- package/dist/proxy/route-auto-detection.js.map +1 -1
- package/dist/proxy/route-proxy.d.ts.map +1 -1
- package/dist/proxy/route-proxy.js +22 -5
- package/dist/proxy/route-proxy.js.map +1 -1
- package/dist/server/context.d.ts +31 -15
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/context.js +156 -69
- package/dist/server/context.js.map +1 -1
- package/dist/server/handlers/auth.handler.d.ts.map +1 -1
- package/dist/server/handlers/auth.handler.js +4 -2
- package/dist/server/handlers/auth.handler.js.map +1 -1
- package/dist/server/handlers/captions.handler.d.ts.map +1 -1
- package/dist/server/handlers/captions.handler.js +4 -2
- package/dist/server/handlers/captions.handler.js.map +1 -1
- package/dist/server/handlers/collection.handler.d.ts.map +1 -1
- package/dist/server/handlers/collection.handler.js +2 -1
- package/dist/server/handlers/collection.handler.js.map +1 -1
- package/dist/server/handlers/error-response.js +6 -2
- package/dist/server/handlers/error-response.js.map +1 -1
- package/dist/server/handlers/index.handler.d.ts.map +1 -1
- package/dist/server/handlers/index.handler.js +2 -1
- package/dist/server/handlers/index.handler.js.map +1 -1
- package/dist/server/handlers/preview.handler.d.ts.map +1 -1
- package/dist/server/handlers/preview.handler.js +6 -3
- package/dist/server/handlers/preview.handler.js.map +1 -1
- package/dist/server/handlers/registry.handler.d.ts.map +1 -1
- package/dist/server/handlers/registry.handler.js +14 -9
- package/dist/server/handlers/registry.handler.js.map +1 -1
- package/dist/server/handlers/route.handler.d.ts.map +1 -1
- package/dist/server/handlers/route.handler.js +12 -3
- package/dist/server/handlers/route.handler.js.map +1 -1
- package/dist/server/handlers/sitemap.handler.d.ts.map +1 -1
- package/dist/server/handlers/sitemap.handler.js +12 -9
- package/dist/server/handlers/sitemap.handler.js.map +1 -1
- package/dist/server/handlers/static-params.handler.d.ts.map +1 -1
- package/dist/server/handlers/static-params.handler.js +13 -8
- package/dist/server/handlers/static-params.handler.js.map +1 -1
- package/dist/server/handlers/vars.handler.d.ts.map +1 -1
- package/dist/server/handlers/vars.handler.js +5 -4
- package/dist/server/handlers/vars.handler.js.map +1 -1
- package/dist/server/helpers.d.ts +50 -0
- package/dist/server/helpers.d.ts.map +1 -0
- package/dist/server/helpers.js +60 -0
- package/dist/server/helpers.js.map +1 -0
- package/dist/server/layout.js +69 -34
- package/dist/server/layout.js.map +1 -1
- package/dist/server/lazy.d.ts +1 -0
- package/dist/server/lazy.d.ts.map +1 -1
- package/dist/server/lazy.js +3 -2
- package/dist/server/lazy.js.map +1 -1
- package/dist/server/local-api.d.ts.map +1 -1
- package/dist/server/local-api.js +12 -6
- package/dist/server/local-api.js.map +1 -1
- package/dist/server/metadata.d.ts +8 -5
- package/dist/server/metadata.d.ts.map +1 -1
- package/dist/server/metadata.js +21 -7
- package/dist/server/metadata.js.map +1 -1
- package/dist/server/mixer-payload.d.ts +1 -1
- package/dist/server/mixer-payload.d.ts.map +1 -1
- package/dist/server/mixer.d.ts +48 -6
- package/dist/server/mixer.d.ts.map +1 -1
- package/dist/server/mixer.js +235 -68
- package/dist/server/mixer.js.map +1 -1
- package/dist/server/page.d.ts +21 -5
- package/dist/server/page.d.ts.map +1 -1
- package/dist/server/page.js +74 -15
- package/dist/server/page.js.map +1 -1
- package/dist/server/utils.d.ts.map +1 -1
- package/dist/server/utils.js +4 -2
- package/dist/server/utils.js.map +1 -1
- package/dist/server/utmz.d.ts.map +1 -1
- package/dist/server/utmz.js +1 -1
- package/dist/server/utmz.js.map +1 -1
- package/dist/types.d.ts +79 -8
- package/dist/types.d.ts.map +1 -1
- package/package.json +16 -15
- package/src/exports/server.ts +1 -0
- package/src/lib/const.ts +15 -0
- package/src/lib/http.ts +15 -4
- package/src/proxy/proxy.ts +11 -4
- package/src/server/context.test.ts +467 -0
- package/src/server/context.ts +237 -78
- package/src/server/context.type-test.ts +106 -0
- package/src/server/helpers.ts +58 -0
- package/src/server/layout.ts +45 -39
- package/src/server/lazy.ts +1 -1
- package/src/server/metadata.ts +15 -7
- package/src/server/mixer.ts +57 -9
- package/src/server/page.ts +62 -17
- package/src/types.ts +109 -7
package/dist/server/page.js
CHANGED
|
@@ -1,29 +1,87 @@
|
|
|
1
|
-
"use server";
|
|
2
1
|
import { buildBreadcrumb } from "../lib/breadcrumb.js";
|
|
3
|
-
import {
|
|
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,
|
|
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
|
-
|
|
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
|
package/dist/server/page.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.js","names":[],"sources":["../../src/server/page.ts"],"sourcesContent":["'
|
|
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"}
|
package/dist/server/utils.js
CHANGED
|
@@ -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
|
-
|
|
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
|
package/dist/server/utils.js.map
CHANGED
|
@@ -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":"
|
|
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"}
|
package/dist/server/utmz.js
CHANGED
package/dist/server/utmz.js.map
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
type
|
|
96
|
-
|
|
97
|
-
|
|
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,
|
|
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
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":";;;;;;;;;KASY,eAAA,GAAkB;;EAAlB,MAAA,CAAA,GAAA,IAAA,EAAA,GAAe,EAAA,CAAA,EAAA,IAAA;EASf;EAAW,GAAA,CAAA,GAAA,IAAA,EAAA,GAAA,EAAA,CAAA,EAAA,IAAA;
|
|
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
|
+
"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": "^
|
|
31
|
-
"@websolutespa/payload-db-memory": "^3.0.
|
|
32
|
-
"@websolutespa/payload-plugin-bowl": "^
|
|
33
|
-
"@websolutespa/payload-utils": "^
|
|
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
|
|
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
|
-
"@
|
|
44
|
-
"@websolutespa/bom-
|
|
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.
|
|
47
|
-
"@websolutespa/payload-plugin-bowl": "^
|
|
48
|
-
"@websolutespa/payload-utils": "^
|
|
49
|
-
"@websolutespa/test": "^
|
|
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": {
|
package/src/exports/server.ts
CHANGED
|
@@ -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
|
-
|
|
10
|
-
|
|
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 {
|
package/src/proxy/proxy.ts
CHANGED
|
@@ -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
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
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();
|