@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/mixer.js
CHANGED
|
@@ -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
|
-
|
|
31
|
+
const keys = [
|
|
30
32
|
market,
|
|
31
33
|
locale,
|
|
32
34
|
draft === "false" ? "published" : "draft",
|
|
33
35
|
...roles,
|
|
34
36
|
...tenants
|
|
35
|
-
]
|
|
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
|
-
|
|
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
|
|
115
|
+
const marketRequest = await payload.find({
|
|
110
116
|
...localized,
|
|
111
117
|
collection: "market",
|
|
112
118
|
where: { isActive: { equals: true } }
|
|
113
|
-
})
|
|
114
|
-
const
|
|
119
|
+
});
|
|
120
|
+
const markets = marketRequest.docs;
|
|
121
|
+
const localeResult = await payload.findGlobal({
|
|
115
122
|
...localized,
|
|
116
123
|
slug: "locale"
|
|
117
|
-
})
|
|
124
|
+
});
|
|
125
|
+
const locales = localeResult.items.filter((x) => x.isActive);
|
|
118
126
|
if (locales.length > 0 && markets.length > 0) {
|
|
119
|
-
const
|
|
120
|
-
return x.fields.find((x) => "name" in x && x.name === "slug");
|
|
121
|
-
})
|
|
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)
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
-
})
|
|
132
|
-
const
|
|
143
|
+
});
|
|
144
|
+
const categories = categoryRequest.docs;
|
|
145
|
+
const mediaRequest = await payload.find({
|
|
133
146
|
...unlocalized,
|
|
134
147
|
collection: "media",
|
|
135
148
|
depth: 1
|
|
136
|
-
})
|
|
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
|
|
173
|
+
const localeResult = await payload.findGlobal({
|
|
160
174
|
...localized,
|
|
161
175
|
slug: "locale"
|
|
162
|
-
})
|
|
176
|
+
});
|
|
177
|
+
const locales = localeResult.items.filter((x) => x.isActive);
|
|
163
178
|
const localeIds = locales.map((x) => x.id);
|
|
164
|
-
const
|
|
179
|
+
const marketRequest = await payload.find({
|
|
165
180
|
...localized,
|
|
166
181
|
collection: "market"
|
|
167
|
-
})
|
|
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
|
|
186
|
+
const categoryRequest = await payload.find({
|
|
170
187
|
...localized,
|
|
171
188
|
collection: "category",
|
|
172
189
|
depth: 2
|
|
173
|
-
})
|
|
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
|
|
209
|
+
currentRoutes,
|
|
190
210
|
categories,
|
|
191
|
-
richText
|
|
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
|
-
|
|
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
|
-
|
|
298
|
+
|
|
299
|
+
* `select`, `populate` and `joins` are only included when provided.
|
|
300
|
+
|
|
246
301
|
*/
|
|
247
|
-
function
|
|
302
|
+
function buildReadOptions({ user, locale, draft = false, depth, select, populate, joins }) {
|
|
248
303
|
return {
|
|
249
304
|
locale,
|
|
250
305
|
fallbackLocale: defaultLocale,
|
|
251
|
-
draft
|
|
252
|
-
depth
|
|
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
|
package/dist/server/mixer.js.map
CHANGED
|
@@ -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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"}
|
package/dist/server/page.d.ts
CHANGED
|
@@ -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,
|
|
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":"
|
|
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"}
|