@trebired/frontend 6.2.1 → 6.3.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 (72) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/server/favicon.d.ts +25 -0
  3. package/dist/server/favicon.d.ts.map +1 -0
  4. package/dist/server/favicon.js +76 -0
  5. package/dist/server/favicon.js.map +1 -0
  6. package/dist/server/http.d.ts +39 -0
  7. package/dist/server/http.d.ts.map +1 -0
  8. package/dist/server/http.js +69 -0
  9. package/dist/server/http.js.map +1 -0
  10. package/dist/server/index.d.ts +5 -0
  11. package/dist/server/index.d.ts.map +1 -1
  12. package/dist/server/index.js +5 -0
  13. package/dist/server/index.js.map +1 -1
  14. package/dist/server/live.d.ts +10 -0
  15. package/dist/server/live.d.ts.map +1 -0
  16. package/dist/server/live.js +22 -0
  17. package/dist/server/live.js.map +1 -0
  18. package/dist/server/sidebar.d.ts +55 -0
  19. package/dist/server/sidebar.d.ts.map +1 -0
  20. package/dist/server/sidebar.js +108 -0
  21. package/dist/server/sidebar.js.map +1 -0
  22. package/dist/server/theme.d.ts +59 -0
  23. package/dist/server/theme.d.ts.map +1 -0
  24. package/dist/server/theme.js +146 -0
  25. package/dist/server/theme.js.map +1 -0
  26. package/dist/src/server/favicon.d.ts +25 -0
  27. package/dist/src/server/favicon.d.ts.map +1 -0
  28. package/dist/src/server/favicon.js +76 -0
  29. package/dist/src/server/favicon.js.map +1 -0
  30. package/dist/src/server/http.d.ts +39 -0
  31. package/dist/src/server/http.d.ts.map +1 -0
  32. package/dist/src/server/http.js +69 -0
  33. package/dist/src/server/http.js.map +1 -0
  34. package/dist/src/server/index.d.ts +5 -0
  35. package/dist/src/server/index.d.ts.map +1 -1
  36. package/dist/src/server/index.js +5 -0
  37. package/dist/src/server/index.js.map +1 -1
  38. package/dist/src/server/live.d.ts +10 -0
  39. package/dist/src/server/live.d.ts.map +1 -0
  40. package/dist/src/server/live.js +22 -0
  41. package/dist/src/server/live.js.map +1 -0
  42. package/dist/src/server/sidebar.d.ts +55 -0
  43. package/dist/src/server/sidebar.d.ts.map +1 -0
  44. package/dist/src/server/sidebar.js +108 -0
  45. package/dist/src/server/sidebar.js.map +1 -0
  46. package/dist/src/server/theme.d.ts +59 -0
  47. package/dist/src/server/theme.d.ts.map +1 -0
  48. package/dist/src/server/theme.js +146 -0
  49. package/dist/src/server/theme.js.map +1 -0
  50. package/dist/src/theme/apply.d.ts +2 -0
  51. package/dist/src/theme/apply.d.ts.map +1 -1
  52. package/dist/src/theme/apply.js.map +1 -1
  53. package/dist/src/theme/browser-sync.d.ts +19 -0
  54. package/dist/src/theme/browser-sync.d.ts.map +1 -0
  55. package/dist/src/theme/browser-sync.js +69 -0
  56. package/dist/src/theme/browser-sync.js.map +1 -0
  57. package/dist/src/theme/index.d.ts +2 -0
  58. package/dist/src/theme/index.d.ts.map +1 -1
  59. package/dist/src/theme/index.js +4 -0
  60. package/dist/src/theme/index.js.map +1 -1
  61. package/dist/theme/apply.d.ts +2 -0
  62. package/dist/theme/apply.d.ts.map +1 -1
  63. package/dist/theme/apply.js.map +1 -1
  64. package/dist/theme/browser-sync.d.ts +19 -0
  65. package/dist/theme/browser-sync.d.ts.map +1 -0
  66. package/dist/theme/browser-sync.js +69 -0
  67. package/dist/theme/browser-sync.js.map +1 -0
  68. package/dist/theme/index.d.ts +2 -0
  69. package/dist/theme/index.d.ts.map +1 -1
  70. package/dist/theme/index.js +4 -0
  71. package/dist/theme/index.js.map +1 -1
  72. package/package.json +1 -1
@@ -0,0 +1,146 @@
1
+ import { requestBody, requestCookies, requestHeader, requestQuery, responseSecure, sendJson, } from "./http.js";
2
+ const DEFAULT_THEME_COOKIE_NAME = "theme";
3
+ const DEFAULT_EFFECTIVE_THEME_COOKIE_NAME = "theme_effective";
4
+ const DEFAULT_THEME_KEYS = Object.freeze(["dark", "light"]);
5
+ const DEFAULT_THEME_CLASSES = Object.freeze({ dark: "", light: "light" });
6
+ function normalizeThemeToken(value) {
7
+ const token = String(value == null ? "" : value)
8
+ .trim()
9
+ .toLowerCase();
10
+ return /^[a-z0-9_-]{1,32}$/u.test(token) ? token : "";
11
+ }
12
+ function allowedThemeKeys(options = {}) {
13
+ const source = options.allowedThemes || DEFAULT_THEME_KEYS;
14
+ const keys = Array.isArray(source) ? source : Object.keys(source);
15
+ return keys.map(normalizeThemeToken).filter(Boolean);
16
+ }
17
+ function themeIsAllowed(value, options = {}) {
18
+ const token = normalizeThemeToken(value);
19
+ return Boolean(token && allowedThemeKeys(options).includes(token));
20
+ }
21
+ function themeCookieName(options = {}) {
22
+ return String(options.cookieName || DEFAULT_THEME_COOKIE_NAME).trim();
23
+ }
24
+ function themeEffectiveCookieName(options = {}) {
25
+ return String(options.effectiveCookieName || DEFAULT_EFFECTIVE_THEME_COOKIE_NAME).trim();
26
+ }
27
+ function currentTheme(req, options = {}) {
28
+ const token = normalizeThemeToken(requestCookies(req)[themeCookieName(options)]);
29
+ return themeIsAllowed(token, options) ? token : "";
30
+ }
31
+ function browserPreferredTheme(req, options = {}) {
32
+ const token = normalizeThemeToken(requestHeader(req, "sec-ch-prefers-color-scheme"));
33
+ return themeIsAllowed(token, options) ? token : "";
34
+ }
35
+ function effectiveThemeCookie(req, options = {}) {
36
+ const token = normalizeThemeToken(requestCookies(req)[themeEffectiveCookieName(options)]);
37
+ return themeIsAllowed(token, options) ? token : "";
38
+ }
39
+ function defaultThemeKey(options = {}) {
40
+ return themeIsAllowed(options.defaultTheme, options)
41
+ ? normalizeThemeToken(options.defaultTheme)
42
+ : allowedThemeKeys(options)[0] || "";
43
+ }
44
+ function effectiveThemeKey(req, options = {}) {
45
+ const headerTheme = options.headerName
46
+ ? normalizeThemeToken(requestHeader(req, options.headerName))
47
+ : "";
48
+ if (themeIsAllowed(headerTheme, options))
49
+ return headerTheme;
50
+ return (currentTheme(req, options) ||
51
+ effectiveThemeCookie(req, options) ||
52
+ browserPreferredTheme(req, options) ||
53
+ defaultThemeKey(options));
54
+ }
55
+ function themeClass(theme, options = {}) {
56
+ const token = normalizeThemeToken(theme);
57
+ if (!themeIsAllowed(token, options))
58
+ return "";
59
+ return String((options.classNames || DEFAULT_THEME_CLASSES)[token] || "");
60
+ }
61
+ function applyThemeToLocals(req, res, options = {}) {
62
+ const locals = res?.locals;
63
+ if (locals)
64
+ locals.theme = currentTheme(req, options);
65
+ }
66
+ function setThemeCookie(req, res, theme, options = {}) {
67
+ if (!res || typeof res.cookie !== "function")
68
+ return false;
69
+ const token = normalizeThemeToken(theme);
70
+ const cookieName = themeCookieName(options);
71
+ const secure = responseSecure(req, options.secure);
72
+ const base = {
73
+ httpOnly: false,
74
+ sameSite: "lax",
75
+ secure,
76
+ path: "/",
77
+ ...(options.cookieOptions || {}),
78
+ };
79
+ if (!cookieName || !themeIsAllowed(token, options)) {
80
+ res.cookie(cookieName, "", { ...base, maxAge: 0 });
81
+ return false;
82
+ }
83
+ res.cookie(cookieName, token, base);
84
+ return true;
85
+ }
86
+ function setServerTheme(req, res, theme, options = {}) {
87
+ const token = normalizeThemeToken(theme);
88
+ const next = themeIsAllowed(token, options) ? token : "";
89
+ setThemeCookie(req, res, next, options);
90
+ const cookies = requestCookies(req);
91
+ const cookieName = themeCookieName(options);
92
+ if (cookieName) {
93
+ if (next)
94
+ cookies[cookieName] = next;
95
+ else
96
+ delete cookies[cookieName];
97
+ }
98
+ applyThemeToLocals(req, res, options);
99
+ return next;
100
+ }
101
+ function themeTogglePayload(theme) {
102
+ return {
103
+ ok: true,
104
+ status_code: "theme-set",
105
+ message: "theme-set",
106
+ data: { theme },
107
+ theme,
108
+ };
109
+ }
110
+ function createThemeToggleHandler(config = {}) {
111
+ return async function themeToggleHandler(req, res, next) {
112
+ try {
113
+ const body = requestBody(req);
114
+ const query = requestQuery(req);
115
+ const value = query.theme != null ? query.theme : body.theme;
116
+ const theme = setServerTheme(req, res, value, config.options || {});
117
+ const payload = themeTogglePayload(theme);
118
+ if (config.respond)
119
+ return config.respond({ payload, req, res, theme });
120
+ return sendJson(res, payload);
121
+ }
122
+ catch (error) {
123
+ if (typeof next === "function")
124
+ return next(error);
125
+ throw error;
126
+ }
127
+ };
128
+ }
129
+ function createThemeMiddleware(options = {}) {
130
+ return function themeMiddleware(req, res, next) {
131
+ applyThemeToLocals(req, res, options);
132
+ return next();
133
+ };
134
+ }
135
+ function attachThemeMiddleware(app, options = {}) {
136
+ if (app && typeof app.use === "function") {
137
+ app.use(createThemeMiddleware(options));
138
+ }
139
+ }
140
+ function attachThemeRoutes(app, config = {}) {
141
+ if (app && typeof app.post === "function") {
142
+ app.post(config.path || "/ui/theme/toggle", createThemeToggleHandler(config));
143
+ }
144
+ }
145
+ export { DEFAULT_EFFECTIVE_THEME_COOKIE_NAME, DEFAULT_THEME_CLASSES, DEFAULT_THEME_COOKIE_NAME, DEFAULT_THEME_KEYS, allowedThemeKeys, applyThemeToLocals, attachThemeMiddleware, attachThemeRoutes, browserPreferredTheme, createThemeMiddleware, createThemeToggleHandler, currentTheme, defaultThemeKey, effectiveThemeCookie, effectiveThemeKey, normalizeThemeToken, setServerTheme, setServerTheme as setTheme, setThemeCookie, themeClass, themeCookieName, themeEffectiveCookieName, themeIsAllowed, themeTogglePayload, };
146
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../../src/server/theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { type ServerRequestLike, type ServerResponseLike } from "./http.js";
2
+ import { type ThemeServerOptions } from "./theme.js";
3
+ type ThemedFaviconOptions = {
4
+ contentType?: string;
5
+ legacyRoutes?: readonly string[];
6
+ logger?: {
7
+ error?: (scope: string, message: string, metadata?: Record<string, unknown>) => unknown;
8
+ };
9
+ noCache?: boolean;
10
+ redirectStatus?: number;
11
+ render: (themeKey: string, req: ServerRequestLike) => string;
12
+ route?: string;
13
+ theme?: ThemeServerOptions;
14
+ themeQueryName?: string;
15
+ };
16
+ declare function themedFaviconHref(themeKey: unknown, options?: Pick<ThemedFaviconOptions, "route" | "themeQueryName">): string;
17
+ declare function applyFaviconNoCacheHeaders(res: ServerResponseLike | null | undefined): void;
18
+ declare function themedFaviconTheme(req: ServerRequestLike | null | undefined, options: ThemedFaviconOptions): string;
19
+ declare function sendThemedFavicon(req: ServerRequestLike, res: ServerResponseLike, options: ThemedFaviconOptions): unknown;
20
+ declare function createThemedFaviconHandler(options: ThemedFaviconOptions): (req: ServerRequestLike, res: ServerResponseLike) => Promise<unknown>;
21
+ declare function createFaviconRedirectHandler(options: ThemedFaviconOptions): (_req: ServerRequestLike, res: ServerResponseLike) => Promise<unknown>;
22
+ declare function attachThemedFaviconRoutes(app: unknown, options: ThemedFaviconOptions): void;
23
+ export { applyFaviconNoCacheHeaders, attachThemedFaviconRoutes, createFaviconRedirectHandler, createThemedFaviconHandler, sendThemedFavicon, themedFaviconHref, themedFaviconTheme, };
24
+ export type { ThemedFaviconOptions };
25
+ //# sourceMappingURL=favicon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"favicon.d.ts","sourceRoot":"","sources":["../../../src/server/favicon.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACxB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAqC,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAExF,KAAK,oBAAoB,GAAG;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAA;KAAE,CAAC;IACrG,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,KAAK,MAAM,CAAC;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,iBAAS,iBAAiB,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAE,IAAI,CAAC,oBAAoB,EAAE,OAAO,GAAG,gBAAgB,CAAM,UAKjH;AAED,iBAAS,0BAA0B,CAAC,GAAG,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,QAK7E;AAED,iBAAS,kBAAkB,CACzB,GAAG,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,EACzC,OAAO,EAAE,oBAAoB,UAQ9B;AAED,iBAAS,iBAAiB,CACxB,GAAG,EAAE,iBAAiB,EACtB,GAAG,EAAE,kBAAkB,EACvB,OAAO,EAAE,oBAAoB,WAS9B;AAmBD,iBAAS,0BAA0B,CAAC,OAAO,EAAE,oBAAoB,IACpB,KAAK,iBAAiB,EAAE,KAAK,kBAAkB,sBAO3F;AAED,iBAAS,4BAA4B,CAAC,OAAO,EAAE,oBAAoB,IACpB,MAAM,iBAAiB,EAAE,KAAK,kBAAkB,sBAQ9F;AAED,iBAAS,yBAAyB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,oBAAoB,QAQ7E;AAED,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,4BAA4B,EAC5B,0BAA0B,EAC1B,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,GACnB,CAAC;AACF,YAAY,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,76 @@
1
+ import { redirectResponse, requestQuery, sendText, setResponseHeader, } from "./http.js";
2
+ import { effectiveThemeKey, themeIsAllowed } from "./theme.js";
3
+ function themedFaviconHref(themeKey, options = {}) {
4
+ const route = String(options.route || "/favicon.svg").trim() || "/favicon.svg";
5
+ const queryName = String(options.themeQueryName || "theme").trim() || "theme";
6
+ const theme = encodeURIComponent(String(themeKey == null ? "" : themeKey).trim());
7
+ return theme ? `${route}?${encodeURIComponent(queryName)}=${theme}` : route;
8
+ }
9
+ function applyFaviconNoCacheHeaders(res) {
10
+ setResponseHeader(res, "Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0");
11
+ setResponseHeader(res, "Pragma", "no-cache");
12
+ setResponseHeader(res, "Expires", "0");
13
+ setResponseHeader(res, "Surrogate-Control", "no-store");
14
+ }
15
+ function themedFaviconTheme(req, options) {
16
+ const themeOptions = options.theme || {};
17
+ const queryName = String(options.themeQueryName || "theme").trim() || "theme";
18
+ const queryTheme = requestQuery(req)[queryName];
19
+ return themeIsAllowed(queryTheme, themeOptions)
20
+ ? String(queryTheme).trim().toLowerCase()
21
+ : effectiveThemeKey(req, themeOptions);
22
+ }
23
+ function sendThemedFavicon(req, res, options) {
24
+ if (options.noCache !== false)
25
+ applyFaviconNoCacheHeaders(res);
26
+ const theme = themedFaviconTheme(req, options);
27
+ return sendText(res, options.render(theme, req), options.contentType || "image/svg+xml; charset=utf-8");
28
+ }
29
+ function handleFaviconError(error, res, options) {
30
+ if (options.logger && typeof options.logger.error === "function") {
31
+ options.logger.error("frontend.favicon", "favicon request failed", {
32
+ error: error && error.message
33
+ ? String(error.message)
34
+ : String(error),
35
+ });
36
+ }
37
+ if (res && typeof res.status === "function")
38
+ res.status(500);
39
+ if (res && typeof res.end === "function")
40
+ return res.end();
41
+ return undefined;
42
+ }
43
+ function createThemedFaviconHandler(options) {
44
+ return async function themedFaviconHandler(req, res) {
45
+ try {
46
+ return sendThemedFavicon(req, res, options);
47
+ }
48
+ catch (error) {
49
+ return handleFaviconError(error, res, options);
50
+ }
51
+ };
52
+ }
53
+ function createFaviconRedirectHandler(options) {
54
+ return async function faviconRedirectHandler(_req, res) {
55
+ try {
56
+ if (options.noCache !== false)
57
+ applyFaviconNoCacheHeaders(res);
58
+ return redirectResponse(res, options.redirectStatus || 302, options.route || "/favicon.svg");
59
+ }
60
+ catch (error) {
61
+ return handleFaviconError(error, res, options);
62
+ }
63
+ };
64
+ }
65
+ function attachThemedFaviconRoutes(app, options) {
66
+ if (!(app && typeof app.get === "function"))
67
+ return;
68
+ const route = options.route || "/favicon.svg";
69
+ const get = app.get.bind(app);
70
+ get(route, createThemedFaviconHandler({ ...options, route }));
71
+ for (const legacy of options.legacyRoutes || []) {
72
+ get(String(legacy), createFaviconRedirectHandler({ ...options, route }));
73
+ }
74
+ }
75
+ export { applyFaviconNoCacheHeaders, attachThemedFaviconRoutes, createFaviconRedirectHandler, createThemedFaviconHandler, sendThemedFavicon, themedFaviconHref, themedFaviconTheme, };
76
+ //# sourceMappingURL=favicon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"favicon.js","sourceRoot":"","sources":["../../../src/server/favicon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ type HeaderMap = Record<string, unknown>;
2
+ type CookieOptions = {
3
+ httpOnly?: boolean;
4
+ maxAge?: number;
5
+ path?: string;
6
+ sameSite?: string;
7
+ secure?: boolean;
8
+ };
9
+ type ServerRequestLike = {
10
+ body?: unknown;
11
+ cookies?: Record<string, unknown>;
12
+ headers?: HeaderMap;
13
+ query?: Record<string, unknown>;
14
+ secure?: boolean;
15
+ };
16
+ type ServerResponseLike = {
17
+ cookie?: (name: string, value: string, options?: CookieOptions) => unknown;
18
+ end?: (body?: unknown) => unknown;
19
+ json?: (body: unknown) => unknown;
20
+ redirect?: (status: number, url: string) => unknown;
21
+ send?: (body: unknown) => unknown;
22
+ set?: (name: string, value: string) => unknown;
23
+ setHeader?: (name: string, value: string) => unknown;
24
+ status?: (status: number) => ServerResponseLike;
25
+ };
26
+ declare function serverString(value: unknown): string;
27
+ declare function serverObject(value: unknown): Record<string, unknown>;
28
+ declare function requestBody(req: ServerRequestLike | null | undefined): Record<string, unknown>;
29
+ declare function requestCookies(req: ServerRequestLike | null | undefined): Record<string, unknown>;
30
+ declare function requestQuery(req: ServerRequestLike | null | undefined): Record<string, unknown>;
31
+ declare function requestHeader(req: ServerRequestLike | null | undefined, name: string): string;
32
+ declare function responseSecure(req: ServerRequestLike | null | undefined, forced?: boolean): boolean;
33
+ declare function setResponseHeader(res: ServerResponseLike | null | undefined, name: string, value: string): unknown;
34
+ declare function sendJson(res: ServerResponseLike | null | undefined, body: unknown, status?: number): unknown;
35
+ declare function sendText(res: ServerResponseLike | null | undefined, body: string, contentType: string, status?: number): unknown;
36
+ declare function redirectResponse(res: ServerResponseLike | null | undefined, status: number, url: string): unknown;
37
+ export { redirectResponse, requestBody, requestCookies, requestHeader, requestQuery, responseSecure, sendJson, sendText, serverObject, serverString, setResponseHeader, };
38
+ export type { CookieOptions, HeaderMap, ServerRequestLike, ServerResponseLike };
39
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/server/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ function serverString(value) {
2
+ return String(value == null ? "" : value);
3
+ }
4
+ function serverObject(value) {
5
+ return value && typeof value === "object" ? value : {};
6
+ }
7
+ function requestBody(req) {
8
+ return serverObject(req && req.body);
9
+ }
10
+ function requestCookies(req) {
11
+ return serverObject(req && req.cookies);
12
+ }
13
+ function requestQuery(req) {
14
+ return serverObject(req && req.query);
15
+ }
16
+ function requestHeader(req, name) {
17
+ const headers = serverObject(req && req.headers);
18
+ const target = name.trim().toLowerCase();
19
+ for (const [key, value] of Object.entries(headers)) {
20
+ if (key.trim().toLowerCase() === target)
21
+ return serverString(value);
22
+ }
23
+ return "";
24
+ }
25
+ function responseSecure(req, forced) {
26
+ return typeof forced === "boolean" ? forced : Boolean(req && req.secure);
27
+ }
28
+ function setResponseHeader(res, name, value) {
29
+ if (res && typeof res.setHeader === "function")
30
+ return res.setHeader(name, value);
31
+ if (res && typeof res.set === "function")
32
+ return res.set(name, value);
33
+ return undefined;
34
+ }
35
+ function sendJson(res, body, status = 200) {
36
+ if (res && typeof res.status === "function")
37
+ res.status(status);
38
+ if (res && typeof res.json === "function")
39
+ return res.json(body);
40
+ setResponseHeader(res, "Content-Type", "application/json; charset=utf-8");
41
+ const payload = JSON.stringify(body == null ? {} : body);
42
+ if (res && typeof res.send === "function")
43
+ return res.send(payload);
44
+ if (res && typeof res.end === "function")
45
+ return res.end(payload);
46
+ return payload;
47
+ }
48
+ function sendText(res, body, contentType, status = 200) {
49
+ if (res && typeof res.status === "function")
50
+ res.status(status);
51
+ setResponseHeader(res, "Content-Type", contentType);
52
+ if (res && typeof res.send === "function")
53
+ return res.send(body);
54
+ if (res && typeof res.end === "function")
55
+ return res.end(body);
56
+ return body;
57
+ }
58
+ function redirectResponse(res, status, url) {
59
+ if (res && typeof res.redirect === "function")
60
+ return res.redirect(status, url);
61
+ if (res && typeof res.status === "function")
62
+ res.status(status);
63
+ setResponseHeader(res, "Location", url);
64
+ if (res && typeof res.end === "function")
65
+ return res.end();
66
+ return undefined;
67
+ }
68
+ export { redirectResponse, requestBody, requestCookies, requestHeader, requestQuery, responseSecure, sendJson, sendText, serverObject, serverString, setResponseHeader, };
69
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/server/http.ts"],"names":[],"mappings":"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"}
@@ -2,4 +2,9 @@ export * from "../../icons/middleware/index.d.ts";
2
2
  export * from "../../icons/server/index.d.ts";
3
3
  export * from "../../icons/server-context.d.ts";
4
4
  export * from "../../icons/shared.d.ts";
5
+ export * from "./favicon.js";
6
+ export * from "./http.js";
7
+ export * from "./live.js";
8
+ export * from "./sidebar.js";
9
+ export * from "./theme.js";
5
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
@@ -2,4 +2,9 @@ export * from "../../icons/middleware/index.js";
2
2
  export * from "../../icons/server/index.js";
3
3
  export * from "../../icons/server-context.js";
4
4
  export * from "../../icons/shared.js";
5
+ export * from "./favicon.js";
6
+ export * from "./http.js";
7
+ export * from "./live.js";
8
+ export * from "./sidebar.js";
9
+ export * from "./theme.js";
5
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type ServerRequestLike } from "./http.js";
2
+ declare const LIVE_NAVIGATION_REQUEST = "tbf-router";
3
+ declare const LIVE_REGION_REQUEST = "tbf-live";
4
+ declare const REQUESTED_WITH_HEADER = "x-requested-with";
5
+ declare function requestedWith(req: ServerRequestLike | null | undefined): string;
6
+ declare function isLiveNavigationRequest(req: ServerRequestLike | null | undefined): boolean;
7
+ declare function isLiveRegionRequest(req: ServerRequestLike | null | undefined): boolean;
8
+ declare function frontendRequestMode(req: ServerRequestLike | null | undefined): "region" | "document" | "navigation";
9
+ export { LIVE_NAVIGATION_REQUEST, LIVE_REGION_REQUEST, REQUESTED_WITH_HEADER, frontendRequestMode, isLiveNavigationRequest, isLiveRegionRequest, requestedWith, };
10
+ //# sourceMappingURL=live.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../../../src/server/live.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAElE,QAAA,MAAM,uBAAuB,eAAe,CAAC;AAC7C,QAAA,MAAM,mBAAmB,aAAa,CAAC;AACvC,QAAA,MAAM,qBAAqB,qBAAqB,CAAC;AAEjD,iBAAS,aAAa,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,UAE/D;AAED,iBAAS,uBAAuB,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,WAEzE;AAED,iBAAS,mBAAmB,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,WAErE;AAED,iBAAS,mBAAmB,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,wCAIrE;AAED,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,aAAa,GACd,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { requestHeader } from "./http.js";
2
+ const LIVE_NAVIGATION_REQUEST = "tbf-router";
3
+ const LIVE_REGION_REQUEST = "tbf-live";
4
+ const REQUESTED_WITH_HEADER = "x-requested-with";
5
+ function requestedWith(req) {
6
+ return requestHeader(req, REQUESTED_WITH_HEADER).trim().toLowerCase();
7
+ }
8
+ function isLiveNavigationRequest(req) {
9
+ return requestedWith(req) === LIVE_NAVIGATION_REQUEST;
10
+ }
11
+ function isLiveRegionRequest(req) {
12
+ return requestedWith(req) === LIVE_REGION_REQUEST;
13
+ }
14
+ function frontendRequestMode(req) {
15
+ if (isLiveNavigationRequest(req))
16
+ return "navigation";
17
+ if (isLiveRegionRequest(req))
18
+ return "region";
19
+ return "document";
20
+ }
21
+ export { LIVE_NAVIGATION_REQUEST, LIVE_REGION_REQUEST, REQUESTED_WITH_HEADER, frontendRequestMode, isLiveNavigationRequest, isLiveRegionRequest, requestedWith, };
22
+ //# sourceMappingURL=live.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live.js","sourceRoot":"","sources":["../../../src/server/live.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA0B,MAAM,WAAW,CAAC;AAElE,MAAM,uBAAuB,GAAG,YAAY,CAAC;AAC7C,MAAM,mBAAmB,GAAG,UAAU,CAAC;AACvC,MAAM,qBAAqB,GAAG,kBAAkB,CAAC;AAEjD,SAAS,aAAa,CAAC,GAAyC;IAC9D,OAAO,aAAa,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACxE,CAAC;AAED,SAAS,uBAAuB,CAAC,GAAyC;IACxE,OAAO,aAAa,CAAC,GAAG,CAAC,KAAK,uBAAuB,CAAC;AACxD,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAyC;IACpE,OAAO,aAAa,CAAC,GAAG,CAAC,KAAK,mBAAmB,CAAC;AACpD,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAyC;IACpE,IAAI,uBAAuB,CAAC,GAAG,CAAC;QAAE,OAAO,YAAY,CAAC;IACtD,IAAI,mBAAmB,CAAC,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC9C,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,aAAa,GACd,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { type CookieOptions, type ServerRequestLike, type ServerResponseLike } from "./http.js";
2
+ declare const DEFAULT_SIDEBAR_COOKIE_PREFIX = "sidebar_";
3
+ declare const DEFAULT_SIDEBAR_COOKIE_SUFFIX = "_minimized";
4
+ declare const DEFAULT_SIDEBAR_SIDES: readonly string[];
5
+ type SidebarServerOptions = {
6
+ allowedSides?: readonly string[];
7
+ cookieOptions?: CookieOptions;
8
+ cookiePrefix?: string;
9
+ cookieSuffix?: string;
10
+ secure?: boolean;
11
+ };
12
+ type SidebarToggleContext = {
13
+ messageKey: string;
14
+ payload: Record<string, unknown>;
15
+ req: ServerRequestLike;
16
+ res: ServerResponseLike;
17
+ state: {
18
+ minimized: boolean;
19
+ side: string;
20
+ };
21
+ };
22
+ type SidebarToggleHandlerOptions = {
23
+ options?: SidebarServerOptions;
24
+ path?: string;
25
+ respond?: (context: SidebarToggleContext) => unknown;
26
+ };
27
+ declare function normalizeSidebarSide(value: unknown, options?: SidebarServerOptions): string;
28
+ declare function sidebarCookieName(side: unknown, options?: SidebarServerOptions): string;
29
+ declare function normalizeMinimized(value: unknown): boolean;
30
+ declare function currentSidebarMinimized(req: ServerRequestLike | null | undefined, side: unknown, options?: SidebarServerOptions): boolean;
31
+ declare function setSidebarMinimizedCookie(req: ServerRequestLike | null | undefined, res: ServerResponseLike | null | undefined, side: unknown, minimized: unknown, options?: SidebarServerOptions): boolean;
32
+ declare function setServerSidebarMinimized(req: ServerRequestLike | null | undefined, res: ServerResponseLike | null | undefined, side: unknown, minimized: unknown, options?: SidebarServerOptions): {
33
+ side: string;
34
+ minimized: boolean;
35
+ };
36
+ declare function sidebarTogglePayload(state: {
37
+ minimized: boolean;
38
+ side: string;
39
+ }): {
40
+ messageKey: string;
41
+ payload: {
42
+ ok: boolean;
43
+ status_code: string;
44
+ message: string;
45
+ data: {
46
+ minimized: boolean;
47
+ side: string;
48
+ };
49
+ };
50
+ };
51
+ declare function createSidebarToggleHandler(config?: SidebarToggleHandlerOptions): (req: ServerRequestLike, res: ServerResponseLike, next?: (error: unknown) => unknown) => Promise<unknown>;
52
+ declare function attachSidebarRoutes(app: unknown, config?: SidebarToggleHandlerOptions): void;
53
+ export { DEFAULT_SIDEBAR_COOKIE_PREFIX, DEFAULT_SIDEBAR_COOKIE_SUFFIX, DEFAULT_SIDEBAR_SIDES, attachSidebarRoutes, createSidebarToggleHandler, currentSidebarMinimized, normalizeMinimized, normalizeSidebarSide, setServerSidebarMinimized, setServerSidebarMinimized as setSidebarMinimized, setSidebarMinimizedCookie, sidebarCookieName, sidebarTogglePayload, };
54
+ export type { SidebarServerOptions, SidebarToggleContext, SidebarToggleHandlerOptions };
55
+ //# sourceMappingURL=sidebar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../../../src/server/sidebar.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACxB,MAAM,WAAW,CAAC;AAEnB,QAAA,MAAM,6BAA6B,aAAa,CAAC;AACjD,QAAA,MAAM,6BAA6B,eAAe,CAAC;AACnD,QAAA,MAAM,qBAAqB,mBAAmC,CAAC;AAE/D,KAAK,oBAAoB,GAAG;IAC1B,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,KAAK,oBAAoB,GAAG;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,GAAG,EAAE,iBAAiB,CAAC;IACvB,GAAG,EAAE,kBAAkB,CAAC;IACxB,KAAK,EAAE;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C,CAAC;AAEF,KAAK,2BAA2B,GAAG;IACjC,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC;CACtD,CAAC;AAEF,iBAAS,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,oBAAyB,UAM/E;AAED,iBAAS,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,GAAE,oBAAyB,UAI3E;AAED,iBAAS,kBAAkB,CAAC,KAAK,EAAE,OAAO,WAQzC;AAED,iBAAS,uBAAuB,CAC9B,GAAG,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,EACzC,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,oBAAyB,WAKnC;AAED,iBAAS,yBAAyB,CAChC,GAAG,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,EACzC,GAAG,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,EAC1C,IAAI,EAAE,OAAO,EACb,SAAS,EAAE,OAAO,EAClB,OAAO,GAAE,oBAAyB,WAoBnC;AAED,iBAAS,yBAAyB,CAChC,GAAG,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,EACzC,GAAG,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,EAC1C,IAAI,EAAE,OAAO,EACb,SAAS,EAAE,OAAO,EAClB,OAAO,GAAE,oBAAyB;;;EAYnC;AAED,iBAAS,oBAAoB,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;;;;;;;uBAAvB,OAAO;kBAAQ,MAAM;;;EAWtE;AAED,iBAAS,0BAA0B,CAAC,MAAM,GAAE,2BAAgC,IAExE,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,OAAO,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,sBAmBrC;AAED,iBAAS,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,2BAAgC,QAOlF;AAED,OAAO,EACL,6BAA6B,EAC7B,6BAA6B,EAC7B,qBAAqB,EACrB,mBAAmB,EACnB,0BAA0B,EAC1B,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,EACpB,yBAAyB,EACzB,yBAAyB,IAAI,mBAAmB,EAChD,yBAAyB,EACzB,iBAAiB,EACjB,oBAAoB,GACrB,CAAC;AACF,YAAY,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,CAAC"}