@trebired/frontend 6.3.0 → 6.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +1 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/server/http.d.ts +6 -0
  7. package/dist/server/http.d.ts.map +1 -1
  8. package/dist/server/http.js.map +1 -1
  9. package/dist/server/index.d.ts +5 -0
  10. package/dist/server/index.d.ts.map +1 -1
  11. package/dist/server/index.js +5 -0
  12. package/dist/server/index.js.map +1 -1
  13. package/dist/server/language.d.ts +51 -0
  14. package/dist/server/language.d.ts.map +1 -0
  15. package/dist/server/language.js +147 -0
  16. package/dist/server/language.js.map +1 -0
  17. package/dist/server/navigation.d.ts +54 -0
  18. package/dist/server/navigation.d.ts.map +1 -0
  19. package/dist/server/navigation.js +184 -0
  20. package/dist/server/navigation.js.map +1 -0
  21. package/dist/server/render-mode.d.ts +82 -0
  22. package/dist/server/render-mode.d.ts.map +1 -0
  23. package/dist/server/render-mode.js +215 -0
  24. package/dist/server/render-mode.js.map +1 -0
  25. package/dist/server/security.d.ts +17 -0
  26. package/dist/server/security.d.ts.map +1 -0
  27. package/dist/server/security.js +38 -0
  28. package/dist/server/security.js.map +1 -0
  29. package/dist/server/seo.d.ts +109 -0
  30. package/dist/server/seo.d.ts.map +1 -0
  31. package/dist/server/seo.js +146 -0
  32. package/dist/server/seo.js.map +1 -0
  33. package/dist/src/index.d.ts +1 -0
  34. package/dist/src/index.d.ts.map +1 -1
  35. package/dist/src/index.js +1 -0
  36. package/dist/src/index.js.map +1 -1
  37. package/dist/src/server/http.d.ts +6 -0
  38. package/dist/src/server/http.d.ts.map +1 -1
  39. package/dist/src/server/http.js.map +1 -1
  40. package/dist/src/server/index.d.ts +5 -0
  41. package/dist/src/server/index.d.ts.map +1 -1
  42. package/dist/src/server/index.js +5 -0
  43. package/dist/src/server/index.js.map +1 -1
  44. package/dist/src/server/language.d.ts +51 -0
  45. package/dist/src/server/language.d.ts.map +1 -0
  46. package/dist/src/server/language.js +147 -0
  47. package/dist/src/server/language.js.map +1 -0
  48. package/dist/src/server/navigation.d.ts +54 -0
  49. package/dist/src/server/navigation.d.ts.map +1 -0
  50. package/dist/src/server/navigation.js +184 -0
  51. package/dist/src/server/navigation.js.map +1 -0
  52. package/dist/src/server/render-mode.d.ts +82 -0
  53. package/dist/src/server/render-mode.d.ts.map +1 -0
  54. package/dist/src/server/render-mode.js +215 -0
  55. package/dist/src/server/render-mode.js.map +1 -0
  56. package/dist/src/server/security.d.ts +17 -0
  57. package/dist/src/server/security.d.ts.map +1 -0
  58. package/dist/src/server/security.js +38 -0
  59. package/dist/src/server/security.js.map +1 -0
  60. package/dist/src/server/seo.d.ts +109 -0
  61. package/dist/src/server/seo.d.ts.map +1 -0
  62. package/dist/src/server/seo.js +146 -0
  63. package/dist/src/server/seo.js.map +1 -0
  64. package/package.json +1 -1
@@ -0,0 +1,184 @@
1
+ const EMPTY_CURRENT = {
2
+ path: "/",
3
+ url: "/",
4
+ };
5
+ function normalizeNavigationPath(input) {
6
+ const raw = String(input == null ? "" : input).trim() || "/";
7
+ let path = raw;
8
+ const fragmentMarker = String.fromCharCode(35);
9
+ try {
10
+ path =
11
+ raw.startsWith("http://") || raw.startsWith("https://")
12
+ ? new URL(raw).pathname
13
+ : raw;
14
+ }
15
+ catch {
16
+ path = raw;
17
+ }
18
+ path = path.split(fragmentMarker)[0].split("?")[0].trim() || "/";
19
+ if (!path.startsWith("/"))
20
+ path = `/${path}`;
21
+ return path.replace(/\/{2,}/g, "/").replace(/\/+$/g, "") || "/";
22
+ }
23
+ function normalizeRequestPath(req) {
24
+ const request = req;
25
+ return normalizeNavigationPath(request && (request.originalUrl || request.url || request.path));
26
+ }
27
+ function normalizeNavigationHref(input) {
28
+ const raw = String(input || "").trim();
29
+ if (!raw || raw.startsWith(String.fromCharCode(35)))
30
+ return "";
31
+ return normalizeNavigationPath(raw);
32
+ }
33
+ function matchesCurrentPath(currentPath, input, opts = {}) {
34
+ const href = normalizeNavigationHref(input);
35
+ if (!href)
36
+ return false;
37
+ if (href === currentPath)
38
+ return true;
39
+ if (opts.exact === true || href === "/")
40
+ return false;
41
+ return currentPath.startsWith(href + "/");
42
+ }
43
+ function addClassAttr(tag, className) {
44
+ const cls = String(className || "").trim();
45
+ if (!cls)
46
+ return tag;
47
+ if (!/\bclass\s*=/i.test(tag))
48
+ return tag.replace(/>$/, ` class="${cls}">`);
49
+ return tag.replace(/\bclass=(["'])(.*?)\1/i, (_match, quote, value) => {
50
+ const classes = String(value || "")
51
+ .split(/\s+/)
52
+ .filter(Boolean);
53
+ if (!classes.includes(cls))
54
+ classes.push(cls);
55
+ return `class=${quote}${classes.join(" ")}${quote}`;
56
+ });
57
+ }
58
+ function addAttr(tag, name, value) {
59
+ const attr = String(name || "").trim();
60
+ if (!attr || new RegExp(`\\b${attr}\\s*=`, "i").test(tag))
61
+ return tag;
62
+ return tag.replace(/>$/, ` ${attr}="${String(value || "")}">`);
63
+ }
64
+ function hasAttr(tag, name) {
65
+ const attr = String(name || "").trim();
66
+ return Boolean(attr && new RegExp(`\\b${attr}(?:\\s*=|\\s|>|$)`, "i").test(tag));
67
+ }
68
+ function openParentLiStart(html, childStart) {
69
+ const beforeChild = html.slice(0, childStart).toLowerCase();
70
+ const liOpen = beforeChild.lastIndexOf("<li");
71
+ if (liOpen < 0)
72
+ return -1;
73
+ const liClose = beforeChild.lastIndexOf("</li>");
74
+ return liOpen > liClose ? liOpen : -1;
75
+ }
76
+ function activeLinkMatches(src, currentPath, exact) {
77
+ const linkRe = /<a\b([^>]*?)\bhref=(["'])(.*?)\2([^>]*)>([\s\S]*?)<\/a>/gi;
78
+ const matches = [];
79
+ let match;
80
+ while ((match = linkRe.exec(src))) {
81
+ const tag = match[0].slice(0, match[0].indexOf(">") + 1);
82
+ const href = normalizeNavigationHref(match[3]);
83
+ if (!href || hasAttr(tag, "data-nav-ignore"))
84
+ continue;
85
+ if (!matchesCurrentPath(currentPath, href, { exact }))
86
+ continue;
87
+ matches.push({
88
+ end: match.index + match[0].length,
89
+ href,
90
+ html: match[0],
91
+ start: match.index,
92
+ tagEnd: match[0].indexOf(">"),
93
+ });
94
+ }
95
+ return matches.sort((left, right) => right.href.length - left.href.length);
96
+ }
97
+ function decorateActiveLink(html, currentPath, opts = {}) {
98
+ const src = String(html || "");
99
+ if (!src)
100
+ return "";
101
+ const matches = activeLinkMatches(src, currentPath, opts.exact === true);
102
+ const best = matches[0];
103
+ if (!best)
104
+ return src;
105
+ const linkClass = String(opts.linkClass || "is-active").trim();
106
+ const liClass = String(opts.liClass || "active").trim();
107
+ const openTag = best.html.slice(0, best.tagEnd + 1);
108
+ const restLink = best.html.slice(best.tagEnd + 1);
109
+ const activeLink = addAttr(addClassAttr(openTag, linkClass), "aria-current", "page") + restLink;
110
+ const withLink = src.slice(0, best.start) + activeLink + src.slice(best.end);
111
+ const liStart = openParentLiStart(src, best.start);
112
+ if (liStart < 0 || !liClass)
113
+ return withLink;
114
+ const liOpenEnd = withLink.indexOf(">", liStart);
115
+ if (liOpenEnd < 0 || liOpenEnd > best.start)
116
+ return withLink;
117
+ const liOpen = withLink.slice(liStart, liOpenEnd + 1);
118
+ return withLink.slice(0, liStart) + addClassAttr(liOpen, liClass) + withLink.slice(liOpenEnd + 1);
119
+ }
120
+ function decorateDataNode(html, dataAttr, active, className = "is-active", aria = false) {
121
+ if (!active)
122
+ return html;
123
+ const attr = String(dataAttr || "").trim();
124
+ if (!attr)
125
+ return html;
126
+ const re = new RegExp(`<(?:a|button)\\b(?=[^>]*\\b${attr}\\b)[^>]*>`, "i");
127
+ return html.replace(re, (tag) => {
128
+ const withClass = addClassAttr(tag, className);
129
+ return aria ? addAttr(withClass, "aria-current", "page") : withClass;
130
+ });
131
+ }
132
+ function currentIsCurrent(current, input, opts = {}) {
133
+ if (Array.isArray(input))
134
+ return input.some((item) => matchesCurrentPath(current.path, item, opts));
135
+ return matchesCurrentPath(current.path, input, opts);
136
+ }
137
+ function currentAttrs(current, input, opts = {}) {
138
+ return currentIsCurrent(current, input, opts) ? ' aria-current="page"' : "";
139
+ }
140
+ function currentLinkAttrs(current, input, opts = {}) {
141
+ return currentIsCurrent(current, input, opts) ? ' class="is-active" aria-current="page"' : "";
142
+ }
143
+ function currentLiAttrs(current, input, opts = {}) {
144
+ return currentIsCurrent(current, input, opts) ? ' class="active"' : "";
145
+ }
146
+ function currentClassName(current, base, input, opts = {}) {
147
+ return [String(base || "").trim(), currentIsCurrent(current, input, opts) ? "is-active" : ""]
148
+ .filter(Boolean)
149
+ .join(" ");
150
+ }
151
+ function currentMenuClass(current, base, opts = {}) {
152
+ const exclude = Array.isArray(opts.exclude) ? opts.exclude : [];
153
+ const active = current.path !== "/" && !currentIsCurrent(current, exclude);
154
+ return [String(base || "").trim(), active ? "has-current-page is-active" : ""]
155
+ .filter(Boolean)
156
+ .join(" ");
157
+ }
158
+ function decorateBottomBarHtml(current, html) {
159
+ let out = String(html || "");
160
+ out = decorateDataNode(out, "data-bottom-bar-apps", currentIsCurrent(current, "/apps"), "is-active", true);
161
+ out = decorateDataNode(out, "data-bottom-bar-profile", currentIsCurrent(current, "/me"), "is-active", true);
162
+ return out;
163
+ }
164
+ function createNavigationState(currentInput = EMPTY_CURRENT) {
165
+ const current = {
166
+ path: normalizeNavigationPath(currentInput.path),
167
+ url: String(currentInput.url || currentInput.path || "/"),
168
+ };
169
+ return {
170
+ current,
171
+ isCurrent: (input, opts = {}) => currentIsCurrent(current, input, opts),
172
+ attrs: (input, opts = {}) => currentAttrs(current, input, opts),
173
+ linkAttrs: (input, opts = {}) => currentLinkAttrs(current, input, opts),
174
+ liAttrs: (input, opts = {}) => currentLiAttrs(current, input, opts),
175
+ className: (base, input, opts = {}) => currentClassName(current, base, input, opts),
176
+ menuClass: (base, opts = {}) => currentMenuClass(current, base, opts),
177
+ decorate: (html, opts = {}) => decorateActiveLink(html, current.path, opts),
178
+ decorateSidebar: (html, opts = {}) => decorateActiveLink(html, current.path, opts),
179
+ decorateBottomBar: (html) => decorateBottomBarHtml(current, html),
180
+ };
181
+ }
182
+ const defaultNavigationState = createNavigationState(EMPTY_CURRENT);
183
+ export { createNavigationState, decorateActiveLink, defaultNavigationState, matchesCurrentPath, normalizeNavigationHref, normalizeNavigationHref as normalizeHref, normalizeNavigationPath, normalizeRequestPath, };
184
+ //# sourceMappingURL=navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../../src/server/navigation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import { type ServerRequestLike, type ServerResponseLike } from "./http.js";
2
+ type RenderModeRecord = Record<string, any>;
3
+ type RenderModeApi = ((name: string) => any) & {
4
+ config: RenderModeRecord;
5
+ use: (name: string) => any;
6
+ [key: string]: any;
7
+ };
8
+ type RenderModeSidebarContext = {
9
+ req: ServerRequestLike;
10
+ res: ServerResponseLike;
11
+ side: string;
12
+ sidebar: RenderModeRecord;
13
+ };
14
+ type RenderModeAppliedContext = {
15
+ cfg: RenderModeRecord;
16
+ modeNames: string[];
17
+ req: ServerRequestLike;
18
+ res: ServerResponseLike;
19
+ ui: RenderModeRecord;
20
+ };
21
+ type RenderModeOptions = {
22
+ afterApply?: (context: RenderModeAppliedContext) => unknown | Promise<unknown>;
23
+ baseUi: RenderModeRecord | (() => RenderModeRecord);
24
+ clone?: <T>(value: T) => T;
25
+ hydrateSidebar?: (context: RenderModeSidebarContext) => RenderModeRecord | Promise<RenderModeRecord>;
26
+ modes: RenderModeRecord;
27
+ };
28
+ declare function cloneRenderModeValue<T>(value: T): T;
29
+ declare function mergeFrontendUi(baseInput: unknown, overInput: unknown): {
30
+ theme: any;
31
+ resources: any;
32
+ PWA: any;
33
+ subdomain: any;
34
+ logo: {
35
+ [x: string]: unknown;
36
+ };
37
+ page: {
38
+ [x: string]: unknown;
39
+ };
40
+ header: {
41
+ [x: string]: unknown;
42
+ };
43
+ header_secondary: {
44
+ [x: string]: unknown;
45
+ };
46
+ footer: {
47
+ [x: string]: unknown;
48
+ };
49
+ sidebar: {
50
+ [x: string]: unknown;
51
+ };
52
+ sidebars: {
53
+ left: {
54
+ [x: string]: unknown;
55
+ };
56
+ right: {
57
+ [x: string]: unknown;
58
+ };
59
+ };
60
+ universal: {
61
+ [x: string]: unknown;
62
+ };
63
+ searchBar: {
64
+ [x: string]: unknown;
65
+ };
66
+ };
67
+ declare function applyRenderModeConditionalFields(mergedBlock: unknown, modeBlock: unknown, res: ServerResponseLike): {
68
+ [x: string]: unknown;
69
+ };
70
+ declare function normalizeRenderModePath(modeName: unknown): string;
71
+ declare function resolveRenderModeStack(modeName: unknown, modes: RenderModeRecord): string[];
72
+ declare function mergeRenderModeStack(modeNames: string[], modes: RenderModeRecord): RenderModeRecord;
73
+ declare function setRenderModeFlags(target: RenderModeRecord, modeNames: string[], modes: RenderModeRecord): void;
74
+ declare function ensureRenderModeLocals(res: ServerResponseLike, options: RenderModeOptions): Record<string, unknown>;
75
+ declare function normalizeRenderModeSidebar(sidebarInput: unknown): RenderModeRecord;
76
+ declare function applyRenderModeConditionalBlocks(merged: RenderModeRecord, cfg: RenderModeRecord, res: ServerResponseLike): RenderModeRecord;
77
+ declare function applyRenderModeUi(req: ServerRequestLike, res: ServerResponseLike, cfg: RenderModeRecord, modeNames: string[], options: RenderModeOptions): Promise<Record<string, unknown>>;
78
+ declare function createRenderModeMiddleware(modeName: string, options: RenderModeOptions): (req: ServerRequestLike, res: ServerResponseLike, next: (error?: unknown) => unknown) => Promise<unknown>;
79
+ declare function createRenderModeApi(options: RenderModeOptions): RenderModeApi;
80
+ export { applyRenderModeConditionalBlocks, applyRenderModeConditionalFields, applyRenderModeUi, cloneRenderModeValue, createRenderModeApi, createRenderModeMiddleware, ensureRenderModeLocals, mergeFrontendUi, mergeFrontendUi as mergeRenderModeUi, mergeRenderModeStack, normalizeRenderModePath, normalizeRenderModeSidebar, resolveRenderModeStack, setRenderModeFlags, };
81
+ export type { RenderModeApi, RenderModeAppliedContext, RenderModeOptions, RenderModeRecord, RenderModeSidebarContext, };
82
+ //# sourceMappingURL=render-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-mode.d.ts","sourceRoot":"","sources":["../../../src/server/render-mode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,215 @@
1
+ import { serverObject, } from "./http.js";
2
+ function cloneRenderModeValue(value) {
3
+ if (value == null)
4
+ return value;
5
+ if (typeof structuredClone === "function") {
6
+ try {
7
+ return structuredClone(value);
8
+ }
9
+ catch { }
10
+ }
11
+ return JSON.parse(JSON.stringify(value));
12
+ }
13
+ function renderModeBaseUi(options) {
14
+ const source = typeof options.baseUi === "function" ? options.baseUi() : options.baseUi;
15
+ return (options.clone || cloneRenderModeValue)(source || {});
16
+ }
17
+ function mergeFrontendUi(baseInput, overInput) {
18
+ const base = serverObject(baseInput);
19
+ const over = serverObject(overInput);
20
+ const baseSidebars = serverObject(base.sidebars);
21
+ const overSidebars = serverObject(over.sidebars);
22
+ return {
23
+ ...base,
24
+ theme: base.theme,
25
+ resources: base.resources,
26
+ PWA: base.PWA,
27
+ subdomain: base.subdomain,
28
+ logo: { ...serverObject(base.logo), ...serverObject(over.logo) },
29
+ page: { ...serverObject(base.page), ...serverObject(over.page) },
30
+ header: { ...serverObject(base.header), ...serverObject(over.header) },
31
+ header_secondary: {
32
+ ...serverObject(base.header_secondary),
33
+ ...serverObject(over.header_secondary),
34
+ },
35
+ footer: { ...serverObject(base.footer), ...serverObject(over.footer) },
36
+ sidebar: { ...serverObject(base.sidebar), ...serverObject(over.sidebar) },
37
+ sidebars: {
38
+ left: {
39
+ ...serverObject(baseSidebars.left || base.sidebar),
40
+ ...serverObject(overSidebars.left),
41
+ },
42
+ right: {
43
+ ...serverObject(baseSidebars.right),
44
+ ...serverObject(overSidebars.right),
45
+ },
46
+ },
47
+ universal: { ...serverObject(base.universal), ...serverObject(over.universal) },
48
+ searchBar: { ...serverObject(base.searchBar), ...serverObject(over.searchBar) },
49
+ };
50
+ }
51
+ function requirementPasses(spec, res) {
52
+ const locals = serverObject(res && res.locals);
53
+ if (!spec)
54
+ return true;
55
+ const single = spec.requireLocal ? [spec.requireLocal] : [];
56
+ const any = Array.isArray(spec.requireAnyLocal) ? spec.requireAnyLocal : [];
57
+ const requiredKeys = Array.from(new Set([...single, ...any]));
58
+ if (!requiredKeys.length)
59
+ return true;
60
+ return requiredKeys.some((key) => locals[String(key)] === true);
61
+ }
62
+ function applyRenderModeConditionalFields(mergedBlock = {}, modeBlock = {}, res) {
63
+ const out = { ...serverObject(mergedBlock) };
64
+ const mode = serverObject(modeBlock);
65
+ for (const fieldName of Object.keys(mode)) {
66
+ const fieldSpec = mode[fieldName];
67
+ if (fieldSpec === null ||
68
+ typeof fieldSpec === "string" ||
69
+ typeof fieldSpec === "number" ||
70
+ typeof fieldSpec === "boolean") {
71
+ out[fieldName] = fieldSpec;
72
+ }
73
+ else if (fieldSpec && typeof fieldSpec === "object" && "value" in fieldSpec) {
74
+ out[fieldName] = requirementPasses(fieldSpec, res) ? fieldSpec.value : false;
75
+ }
76
+ }
77
+ return out;
78
+ }
79
+ function applyRenderModeSidebars(mergedSidebars, modeSidebars, res) {
80
+ const merged = serverObject(mergedSidebars);
81
+ const mode = serverObject(modeSidebars);
82
+ return {
83
+ left: applyRenderModeConditionalFields(merged.left, mode.left, res),
84
+ right: applyRenderModeConditionalFields(merged.right, mode.right, res),
85
+ };
86
+ }
87
+ function normalizeRenderModePath(modeName) {
88
+ return String(modeName || "")
89
+ .trim()
90
+ .replace(/^\.|\.$/g, "");
91
+ }
92
+ function resolveRenderModeStack(modeName, modes) {
93
+ const path = normalizeRenderModePath(modeName);
94
+ if (!path)
95
+ throw new Error("Unknown render mode: ");
96
+ const parts = path.split(".").map((part) => part.trim()).filter(Boolean);
97
+ const stack = [];
98
+ for (let index = 0; index < parts.length; index += 1) {
99
+ const key = parts.slice(0, index + 1).join(".");
100
+ const part = parts[index];
101
+ if (modes[key])
102
+ stack.push(key);
103
+ else if (index === parts.length - 1 && modes[part])
104
+ stack.push(part);
105
+ else if (index === 0)
106
+ throw new Error(`Unknown render mode: ${path}`);
107
+ }
108
+ if (!stack.length)
109
+ throw new Error(`Unknown render mode: ${path}`);
110
+ return stack;
111
+ }
112
+ function mergeRenderModeStack(modeNames, modes) {
113
+ let out = {};
114
+ for (const name of modeNames)
115
+ out = mergeFrontendUi(out, modes[name]);
116
+ return out;
117
+ }
118
+ function setRenderModeFlags(target, modeNames, modes) {
119
+ const flags = {};
120
+ for (const key of Object.keys(modes))
121
+ flags[key] = false;
122
+ for (const modeName of modeNames)
123
+ flags[modeName] = true;
124
+ target.renderMode = flags;
125
+ }
126
+ function ensureRenderModeLocals(res, options) {
127
+ if (!res.locals || typeof res.locals !== "object")
128
+ res.locals = {};
129
+ if (!res.locals.ui || typeof res.locals.ui !== "object") {
130
+ res.locals.ui = renderModeBaseUi(options);
131
+ }
132
+ if (!res.locals.renderMode || typeof res.locals.renderMode !== "object") {
133
+ res.locals.renderMode = {};
134
+ }
135
+ return res.locals;
136
+ }
137
+ function normalizeRenderModeSidebar(sidebarInput) {
138
+ const sidebar = serverObject(sidebarInput);
139
+ const countDisplay = serverObject(sidebar.count_display);
140
+ return {
141
+ ...sidebar,
142
+ count_display: {
143
+ open: String(countDisplay.open || "("),
144
+ close: String(countDisplay.close || ")"),
145
+ },
146
+ entity_counts: serverObject(sidebar.entity_counts),
147
+ data: serverObject(sidebar.data),
148
+ };
149
+ }
150
+ function applyRenderModeConditionalBlocks(merged, cfg, res) {
151
+ for (const key of [
152
+ "header",
153
+ "header_secondary",
154
+ "footer",
155
+ "sidebar",
156
+ "page",
157
+ "universal",
158
+ "searchBar",
159
+ ]) {
160
+ merged[key] = applyRenderModeConditionalFields(merged[key], cfg[key], res);
161
+ }
162
+ merged.sidebars = applyRenderModeSidebars(merged.sidebars, cfg.sidebars, res);
163
+ return merged;
164
+ }
165
+ async function hydrateRenderModeSidebars(req, res, ui, options) {
166
+ for (const side of ["left", "right"]) {
167
+ const normalized = normalizeRenderModeSidebar(serverObject(ui.sidebars)[side]);
168
+ ui.sidebars[side] =
169
+ normalized.show === true && options.hydrateSidebar
170
+ ? await options.hydrateSidebar({ req, res, side, sidebar: normalized })
171
+ : normalized;
172
+ }
173
+ ui.sidebar = ui.sidebars.left;
174
+ }
175
+ async function applyRenderModeUi(req, res, cfg, modeNames, options) {
176
+ const locals = ensureRenderModeLocals(res, options);
177
+ const freshUi = (options.clone || cloneRenderModeValue)(locals.ui);
178
+ const merged = applyRenderModeConditionalBlocks(mergeFrontendUi(freshUi, cfg), cfg, res);
179
+ await hydrateRenderModeSidebars(req, res, merged, options);
180
+ locals.ui = merged;
181
+ await options.afterApply?.({ cfg, modeNames, req, res, ui: merged });
182
+ return locals;
183
+ }
184
+ function createRenderModeMiddleware(modeName, options) {
185
+ const stack = resolveRenderModeStack(modeName, options.modes);
186
+ const cfg = mergeRenderModeStack(stack, options.modes);
187
+ return async function renderModeMiddleware(req, res, next) {
188
+ try {
189
+ const state = await applyRenderModeUi(req, res, cfg, stack, options);
190
+ setRenderModeFlags(state, stack, options.modes);
191
+ return next();
192
+ }
193
+ catch (error) {
194
+ return next(error);
195
+ }
196
+ };
197
+ }
198
+ function createRenderModeApi(options) {
199
+ const api = function renderModeFor(name) {
200
+ return createRenderModeMiddleware(name, options);
201
+ };
202
+ api.use = api;
203
+ api.config = options.modes;
204
+ for (const key of Object.keys(options.modes)) {
205
+ Object.defineProperty(api, key, {
206
+ enumerable: true,
207
+ get() {
208
+ return createRenderModeMiddleware(key, options);
209
+ },
210
+ });
211
+ }
212
+ return api;
213
+ }
214
+ export { applyRenderModeConditionalBlocks, applyRenderModeConditionalFields, applyRenderModeUi, cloneRenderModeValue, createRenderModeApi, createRenderModeMiddleware, ensureRenderModeLocals, mergeFrontendUi, mergeFrontendUi as mergeRenderModeUi, mergeRenderModeStack, normalizeRenderModePath, normalizeRenderModeSidebar, resolveRenderModeStack, setRenderModeFlags, };
215
+ //# sourceMappingURL=render-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-mode.js","sourceRoot":"","sources":["../../../src/server/render-mode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ServerResponseLike } from "./http.js";
2
+ type SecurityState = {
3
+ csrfToken: string | null;
4
+ nonce: string;
5
+ };
6
+ type SecurityMiddlewareOptions = {
7
+ csrfLocalKey?: string;
8
+ localsKey?: string;
9
+ nonceLocalKey?: string;
10
+ };
11
+ declare function createSecurityState(res: ServerResponseLike | null | undefined, options?: SecurityMiddlewareOptions): SecurityState;
12
+ declare function applySecurityToLocals(res: ServerResponseLike | null | undefined, options?: SecurityMiddlewareOptions): SecurityState;
13
+ declare function createSecurityMiddleware(options?: SecurityMiddlewareOptions): (_req: unknown, res: ServerResponseLike, next: () => unknown) => unknown;
14
+ declare function attachSecurityMiddleware(app: unknown, options?: SecurityMiddlewareOptions): void;
15
+ export { applySecurityToLocals, attachSecurityMiddleware, createSecurityMiddleware, createSecurityState, };
16
+ export type { SecurityMiddlewareOptions, SecurityState };
17
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../../src/server/security.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAEpD,KAAK,aAAa,GAAG;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,yBAAyB,GAAG;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAYF,iBAAS,mBAAmB,CAC1B,GAAG,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,EAC1C,OAAO,GAAE,yBAA8B,GACtC,aAAa,CAMf;AAED,iBAAS,qBAAqB,CAC5B,GAAG,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,EAC1C,OAAO,GAAE,yBAA8B,iBAOxC;AAED,iBAAS,wBAAwB,CAAC,OAAO,GAAE,yBAA8B,IAErE,MAAM,OAAO,EACb,KAAK,kBAAkB,EACvB,MAAM,MAAM,OAAO,aAKtB;AAED,iBAAS,wBAAwB,CAC/B,GAAG,EAAE,OAAO,EACZ,OAAO,GAAE,yBAA8B,QAOxC;AAED,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,mBAAmB,GACpB,CAAC;AACF,YAAY,EAAE,yBAAyB,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,38 @@
1
+ function securityText(value) {
2
+ return value == null ? null : String(value);
3
+ }
4
+ function responseLocals(res) {
5
+ if (!res)
6
+ return null;
7
+ if (!res.locals || typeof res.locals !== "object")
8
+ res.locals = {};
9
+ return res.locals;
10
+ }
11
+ function createSecurityState(res, options = {}) {
12
+ const locals = responseLocals(res) || {};
13
+ return {
14
+ csrfToken: securityText(locals[options.csrfLocalKey || "csrfToken"]),
15
+ nonce: securityText(locals[options.nonceLocalKey || "nonce"]) || "",
16
+ };
17
+ }
18
+ function applySecurityToLocals(res, options = {}) {
19
+ const locals = responseLocals(res);
20
+ if (!locals)
21
+ return null;
22
+ const state = createSecurityState(res, options);
23
+ locals[options.localsKey || "security"] = state;
24
+ return state;
25
+ }
26
+ function createSecurityMiddleware(options = {}) {
27
+ return function securityMiddleware(_req, res, next) {
28
+ applySecurityToLocals(res, options);
29
+ return next();
30
+ };
31
+ }
32
+ function attachSecurityMiddleware(app, options = {}) {
33
+ if (app && typeof app.use === "function") {
34
+ app.use(createSecurityMiddleware(options));
35
+ }
36
+ }
37
+ export { applySecurityToLocals, attachSecurityMiddleware, createSecurityMiddleware, createSecurityState, };
38
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../../src/server/security.ts"],"names":[],"mappings":"AAaA,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,cAAc,CAAC,GAA0C;IAChE,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;QAAE,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;IACnE,OAAO,GAAG,CAAC,MAAM,CAAC;AACpB,CAAC;AAED,SAAS,mBAAmB,CAC1B,GAA0C,EAC1C,UAAqC,EAAE;IAEvC,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IACzC,OAAO;QACL,SAAS,EAAE,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,IAAI,WAAW,CAAC,CAAC;QACpE,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,CAAC,IAAI,EAAE;KACpE,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAC5B,GAA0C,EAC1C,UAAqC,EAAE;IAEvC,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,KAAK,GAAG,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,UAAU,CAAC,GAAG,KAAK,CAAC;IAChD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,wBAAwB,CAAC,UAAqC,EAAE;IACvE,OAAO,SAAS,kBAAkB,CAChC,IAAa,EACb,GAAuB,EACvB,IAAmB;QAEnB,qBAAqB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACpC,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAC/B,GAAY,EACZ,UAAqC,EAAE;IAEvC,IAAI,GAAG,IAAI,OAAQ,GAAyB,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;QAC/D,GAA8C,CAAC,GAAG,CACjD,wBAAwB,CAAC,OAAO,CAAC,CAClC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,mBAAmB,GACpB,CAAC"}