@trebired/frontend 6.2.1 → 6.4.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.
- package/CHANGELOG.md +10 -0
- package/dist/server/favicon.d.ts +25 -0
- package/dist/server/favicon.d.ts.map +1 -0
- package/dist/server/favicon.js +76 -0
- package/dist/server/favicon.js.map +1 -0
- package/dist/server/http.d.ts +45 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +69 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/index.d.ts +8 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +8 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/language.d.ts +51 -0
- package/dist/server/language.d.ts.map +1 -0
- package/dist/server/language.js +147 -0
- package/dist/server/language.js.map +1 -0
- package/dist/server/live.d.ts +10 -0
- package/dist/server/live.d.ts.map +1 -0
- package/dist/server/live.js +22 -0
- package/dist/server/live.js.map +1 -0
- package/dist/server/navigation.d.ts +54 -0
- package/dist/server/navigation.d.ts.map +1 -0
- package/dist/server/navigation.js +184 -0
- package/dist/server/navigation.js.map +1 -0
- package/dist/server/seo.d.ts +109 -0
- package/dist/server/seo.d.ts.map +1 -0
- package/dist/server/seo.js +146 -0
- package/dist/server/seo.js.map +1 -0
- package/dist/server/sidebar.d.ts +55 -0
- package/dist/server/sidebar.d.ts.map +1 -0
- package/dist/server/sidebar.js +108 -0
- package/dist/server/sidebar.js.map +1 -0
- package/dist/server/theme.d.ts +59 -0
- package/dist/server/theme.d.ts.map +1 -0
- package/dist/server/theme.js +146 -0
- package/dist/server/theme.js.map +1 -0
- package/dist/src/server/favicon.d.ts +25 -0
- package/dist/src/server/favicon.d.ts.map +1 -0
- package/dist/src/server/favicon.js +76 -0
- package/dist/src/server/favicon.js.map +1 -0
- package/dist/src/server/http.d.ts +45 -0
- package/dist/src/server/http.d.ts.map +1 -0
- package/dist/src/server/http.js +69 -0
- package/dist/src/server/http.js.map +1 -0
- package/dist/src/server/index.d.ts +8 -0
- package/dist/src/server/index.d.ts.map +1 -1
- package/dist/src/server/index.js +8 -0
- package/dist/src/server/index.js.map +1 -1
- package/dist/src/server/language.d.ts +51 -0
- package/dist/src/server/language.d.ts.map +1 -0
- package/dist/src/server/language.js +147 -0
- package/dist/src/server/language.js.map +1 -0
- package/dist/src/server/live.d.ts +10 -0
- package/dist/src/server/live.d.ts.map +1 -0
- package/dist/src/server/live.js +22 -0
- package/dist/src/server/live.js.map +1 -0
- package/dist/src/server/navigation.d.ts +54 -0
- package/dist/src/server/navigation.d.ts.map +1 -0
- package/dist/src/server/navigation.js +184 -0
- package/dist/src/server/navigation.js.map +1 -0
- package/dist/src/server/seo.d.ts +109 -0
- package/dist/src/server/seo.d.ts.map +1 -0
- package/dist/src/server/seo.js +146 -0
- package/dist/src/server/seo.js.map +1 -0
- package/dist/src/server/sidebar.d.ts +55 -0
- package/dist/src/server/sidebar.d.ts.map +1 -0
- package/dist/src/server/sidebar.js +108 -0
- package/dist/src/server/sidebar.js.map +1 -0
- package/dist/src/server/theme.d.ts +59 -0
- package/dist/src/server/theme.d.ts.map +1 -0
- package/dist/src/server/theme.js +146 -0
- package/dist/src/server/theme.js.map +1 -0
- package/dist/src/theme/apply.d.ts +2 -0
- package/dist/src/theme/apply.d.ts.map +1 -1
- package/dist/src/theme/apply.js.map +1 -1
- package/dist/src/theme/browser-sync.d.ts +19 -0
- package/dist/src/theme/browser-sync.d.ts.map +1 -0
- package/dist/src/theme/browser-sync.js +69 -0
- package/dist/src/theme/browser-sync.js.map +1 -0
- package/dist/src/theme/index.d.ts +2 -0
- package/dist/src/theme/index.d.ts.map +1 -1
- package/dist/src/theme/index.js +4 -0
- package/dist/src/theme/index.js.map +1 -1
- package/dist/theme/apply.d.ts +2 -0
- package/dist/theme/apply.d.ts.map +1 -1
- package/dist/theme/apply.js.map +1 -1
- package/dist/theme/browser-sync.d.ts +19 -0
- package/dist/theme/browser-sync.d.ts.map +1 -0
- package/dist/theme/browser-sync.js +69 -0
- package/dist/theme/browser-sync.js.map +1 -0
- package/dist/theme/index.d.ts +2 -0
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +4 -0
- package/dist/theme/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
All notable package changes are documented here.
|
|
4
4
|
|
|
5
|
+
## 6.4.0
|
|
6
|
+
|
|
7
|
+
- Added public server helpers for UI language cookies, language routes, SSR current-navigation state, and SEO/head middleware.
|
|
8
|
+
- Added verification coverage for language selection, active navigation, and SEO response headers.
|
|
9
|
+
|
|
10
|
+
## 6.3.0
|
|
11
|
+
|
|
12
|
+
- Added public server helpers for theme cookies, theme toggle handlers, sidebar preference handlers, themed favicon routes, and live-request detection.
|
|
13
|
+
- Added theme runtime browser sync options for effective-theme cookies and themed favicon href updates.
|
|
14
|
+
|
|
5
15
|
## 6.2.1
|
|
6
16
|
|
|
7
17
|
- Added a generic React fallback title boot script helper for apps using live navigation without owning local document-title boot code.
|
|
@@ -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,45 @@
|
|
|
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
|
+
get?: (name: string) => unknown;
|
|
13
|
+
headers?: HeaderMap;
|
|
14
|
+
originalUrl?: unknown;
|
|
15
|
+
path?: unknown;
|
|
16
|
+
protocol?: unknown;
|
|
17
|
+
query?: Record<string, unknown>;
|
|
18
|
+
secure?: boolean;
|
|
19
|
+
url?: unknown;
|
|
20
|
+
};
|
|
21
|
+
type ServerResponseLike = {
|
|
22
|
+
cookie?: (name: string, value: string, options?: CookieOptions) => unknown;
|
|
23
|
+
end?: (body?: unknown) => unknown;
|
|
24
|
+
json?: (body: unknown) => unknown;
|
|
25
|
+
locals?: Record<string, unknown>;
|
|
26
|
+
redirect?: (status: number, url: string) => unknown;
|
|
27
|
+
send?: (body: unknown) => unknown;
|
|
28
|
+
set?: (name: string, value: string) => unknown;
|
|
29
|
+
setHeader?: (name: string, value: string) => unknown;
|
|
30
|
+
status?: (status: number) => ServerResponseLike;
|
|
31
|
+
};
|
|
32
|
+
declare function serverString(value: unknown): string;
|
|
33
|
+
declare function serverObject(value: unknown): Record<string, unknown>;
|
|
34
|
+
declare function requestBody(req: ServerRequestLike | null | undefined): Record<string, unknown>;
|
|
35
|
+
declare function requestCookies(req: ServerRequestLike | null | undefined): Record<string, unknown>;
|
|
36
|
+
declare function requestQuery(req: ServerRequestLike | null | undefined): Record<string, unknown>;
|
|
37
|
+
declare function requestHeader(req: ServerRequestLike | null | undefined, name: string): string;
|
|
38
|
+
declare function responseSecure(req: ServerRequestLike | null | undefined, forced?: boolean): boolean;
|
|
39
|
+
declare function setResponseHeader(res: ServerResponseLike | null | undefined, name: string, value: string): unknown;
|
|
40
|
+
declare function sendJson(res: ServerResponseLike | null | undefined, body: unknown, status?: number): unknown;
|
|
41
|
+
declare function sendText(res: ServerResponseLike | null | undefined, body: string, contentType: string, status?: number): unknown;
|
|
42
|
+
declare function redirectResponse(res: ServerResponseLike | null | undefined, status: number, url: string): unknown;
|
|
43
|
+
export { redirectResponse, requestBody, requestCookies, requestHeader, requestQuery, responseSecure, sendJson, sendText, serverObject, serverString, setResponseHeader, };
|
|
44
|
+
export type { CookieOptions, HeaderMap, ServerRequestLike, ServerResponseLike };
|
|
45
|
+
//# 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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"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -2,4 +2,12 @@ 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 "./language.js";
|
|
8
|
+
export * from "./live.js";
|
|
9
|
+
export * from "./navigation.js";
|
|
10
|
+
export * from "./seo.js";
|
|
11
|
+
export * from "./sidebar.js";
|
|
12
|
+
export * from "./theme.js";
|
|
5
13
|
//# 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,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
|
package/dist/server/index.js
CHANGED
|
@@ -2,4 +2,12 @@ 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 "./language.js";
|
|
8
|
+
export * from "./live.js";
|
|
9
|
+
export * from "./navigation.js";
|
|
10
|
+
export * from "./seo.js";
|
|
11
|
+
export * from "./sidebar.js";
|
|
12
|
+
export * from "./theme.js";
|
|
5
13
|
//# sourceMappingURL=index.js.map
|
package/dist/server/index.js.map
CHANGED
|
@@ -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,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type CookieOptions, type ServerRequestLike, type ServerResponseLike } from "./http.js";
|
|
2
|
+
declare const DEFAULT_LANGUAGE_COOKIE_NAME = "ui_lang";
|
|
3
|
+
declare const DEFAULT_LANGUAGE_KEYS: readonly string[];
|
|
4
|
+
type LanguageServerOptions = {
|
|
5
|
+
allowedLanguages?: readonly string[] | Record<string, unknown>;
|
|
6
|
+
cookieName?: string;
|
|
7
|
+
cookieOptions?: CookieOptions;
|
|
8
|
+
defaultLanguage?: string;
|
|
9
|
+
headerName?: string;
|
|
10
|
+
localsKey?: string;
|
|
11
|
+
secure?: boolean;
|
|
12
|
+
};
|
|
13
|
+
type LanguageSetContext = {
|
|
14
|
+
lang: string;
|
|
15
|
+
payload: Record<string, unknown>;
|
|
16
|
+
req: ServerRequestLike;
|
|
17
|
+
res: ServerResponseLike;
|
|
18
|
+
};
|
|
19
|
+
type LanguageSetHandlerOptions = {
|
|
20
|
+
options?: LanguageServerOptions;
|
|
21
|
+
path?: string;
|
|
22
|
+
respond?: (context: LanguageSetContext) => unknown;
|
|
23
|
+
};
|
|
24
|
+
declare function normalizeLanguageToken(value: unknown): string;
|
|
25
|
+
declare function allowedLanguageKeys(options?: LanguageServerOptions): string[];
|
|
26
|
+
declare function matchAllowedLanguage(value: unknown, options?: LanguageServerOptions): string;
|
|
27
|
+
declare function languageIsAllowed(value: unknown, options?: LanguageServerOptions): boolean;
|
|
28
|
+
declare function languageCookieName(options?: LanguageServerOptions): string;
|
|
29
|
+
declare function currentLanguage(req: ServerRequestLike | null | undefined, options?: LanguageServerOptions): string;
|
|
30
|
+
declare function browserPreferredLanguage(req: ServerRequestLike | null | undefined, options?: LanguageServerOptions): string;
|
|
31
|
+
declare function defaultLanguage(options?: LanguageServerOptions): string;
|
|
32
|
+
declare function effectiveLanguage(req: ServerRequestLike | null | undefined, options?: LanguageServerOptions): string;
|
|
33
|
+
declare function applyLanguageToLocals(req: ServerRequestLike | null | undefined, res: ServerResponseLike | null | undefined, options?: LanguageServerOptions): void;
|
|
34
|
+
declare function setLanguageCookie(req: ServerRequestLike | null | undefined, res: ServerResponseLike | null | undefined, lang: unknown, options?: LanguageServerOptions): boolean;
|
|
35
|
+
declare function setServerLanguage(req: ServerRequestLike | null | undefined, res: ServerResponseLike | null | undefined, lang: unknown, options?: LanguageServerOptions): string;
|
|
36
|
+
declare function languageSetPayload(lang: string): {
|
|
37
|
+
ok: boolean;
|
|
38
|
+
status_code: string;
|
|
39
|
+
message: string;
|
|
40
|
+
data: {
|
|
41
|
+
lang: string;
|
|
42
|
+
};
|
|
43
|
+
lang: string;
|
|
44
|
+
};
|
|
45
|
+
declare function createLanguageSetHandler(config?: LanguageSetHandlerOptions): (req: ServerRequestLike, res: ServerResponseLike, next?: (error: unknown) => unknown) => Promise<unknown>;
|
|
46
|
+
declare function createLanguageMiddleware(options?: LanguageServerOptions): (req: ServerRequestLike, res: ServerResponseLike, next: () => unknown) => unknown;
|
|
47
|
+
declare function attachLanguageMiddleware(app: unknown, options?: LanguageServerOptions): void;
|
|
48
|
+
declare function attachLanguageRoutes(app: unknown, config?: LanguageSetHandlerOptions): void;
|
|
49
|
+
export { DEFAULT_LANGUAGE_COOKIE_NAME, DEFAULT_LANGUAGE_KEYS, allowedLanguageKeys, applyLanguageToLocals, attachLanguageMiddleware, attachLanguageRoutes, browserPreferredLanguage, createLanguageMiddleware, createLanguageSetHandler, currentLanguage, defaultLanguage, effectiveLanguage, languageCookieName, languageIsAllowed, languageSetPayload, matchAllowedLanguage, normalizeLanguageToken, setLanguageCookie, setServerLanguage, setServerLanguage as setLanguage, };
|
|
50
|
+
export type { LanguageServerOptions, LanguageSetContext, LanguageSetHandlerOptions };
|
|
51
|
+
//# sourceMappingURL=language.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language.d.ts","sourceRoot":"","sources":["../../../src/server/language.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { requestBody, requestCookies, requestHeader, requestQuery, responseSecure, sendJson, } from "./http.js";
|
|
2
|
+
const DEFAULT_LANGUAGE_COOKIE_NAME = "ui_lang";
|
|
3
|
+
const DEFAULT_LANGUAGE_KEYS = Object.freeze(["en"]);
|
|
4
|
+
function normalizeLanguageToken(value) {
|
|
5
|
+
const token = String(value == null ? "" : value)
|
|
6
|
+
.trim()
|
|
7
|
+
.replace(/_/g, "-")
|
|
8
|
+
.toLowerCase();
|
|
9
|
+
return /^[a-z]{2,3}(?:-[a-z0-9]{2,8})*$/u.test(token) ? token : "";
|
|
10
|
+
}
|
|
11
|
+
function allowedLanguageKeys(options = {}) {
|
|
12
|
+
const source = options.allowedLanguages || DEFAULT_LANGUAGE_KEYS;
|
|
13
|
+
const keys = Array.isArray(source) ? source : Object.keys(source);
|
|
14
|
+
return keys.map(normalizeLanguageToken).filter(Boolean);
|
|
15
|
+
}
|
|
16
|
+
function matchAllowedLanguage(value, options = {}) {
|
|
17
|
+
const token = normalizeLanguageToken(value);
|
|
18
|
+
if (!token)
|
|
19
|
+
return "";
|
|
20
|
+
const allowed = allowedLanguageKeys(options);
|
|
21
|
+
if (allowed.includes(token))
|
|
22
|
+
return token;
|
|
23
|
+
const base = token.split("-")[0];
|
|
24
|
+
return allowed.includes(base) ? base : "";
|
|
25
|
+
}
|
|
26
|
+
function languageIsAllowed(value, options = {}) {
|
|
27
|
+
return Boolean(matchAllowedLanguage(value, options));
|
|
28
|
+
}
|
|
29
|
+
function languageCookieName(options = {}) {
|
|
30
|
+
return String(options.cookieName || DEFAULT_LANGUAGE_COOKIE_NAME).trim();
|
|
31
|
+
}
|
|
32
|
+
function currentLanguage(req, options = {}) {
|
|
33
|
+
return matchAllowedLanguage(requestCookies(req)[languageCookieName(options)], options);
|
|
34
|
+
}
|
|
35
|
+
function acceptLanguageWeight(entry) {
|
|
36
|
+
const qualityMatch = /(?:^|;)\s*q=([0-9.]+)/i.exec(entry);
|
|
37
|
+
const weight = qualityMatch ? Number(qualityMatch[1]) : 1;
|
|
38
|
+
return Number.isFinite(weight) ? weight : 0;
|
|
39
|
+
}
|
|
40
|
+
function browserPreferredLanguage(req, options = {}) {
|
|
41
|
+
const header = requestHeader(req, options.headerName || "accept-language");
|
|
42
|
+
const entries = header
|
|
43
|
+
.split(",")
|
|
44
|
+
.map((entry) => entry.trim())
|
|
45
|
+
.filter(Boolean)
|
|
46
|
+
.sort((left, right) => acceptLanguageWeight(right) - acceptLanguageWeight(left));
|
|
47
|
+
for (const entry of entries) {
|
|
48
|
+
const lang = matchAllowedLanguage(entry.split(";")[0], options);
|
|
49
|
+
if (lang)
|
|
50
|
+
return lang;
|
|
51
|
+
}
|
|
52
|
+
return "";
|
|
53
|
+
}
|
|
54
|
+
function defaultLanguage(options = {}) {
|
|
55
|
+
return (matchAllowedLanguage(options.defaultLanguage, options) ||
|
|
56
|
+
allowedLanguageKeys(options)[0] ||
|
|
57
|
+
"");
|
|
58
|
+
}
|
|
59
|
+
function effectiveLanguage(req, options = {}) {
|
|
60
|
+
return (currentLanguage(req, options) ||
|
|
61
|
+
browserPreferredLanguage(req, options) ||
|
|
62
|
+
defaultLanguage(options));
|
|
63
|
+
}
|
|
64
|
+
function applyLanguageToLocals(req, res, options = {}) {
|
|
65
|
+
const locals = res?.locals;
|
|
66
|
+
if (locals)
|
|
67
|
+
locals[options.localsKey || "lang"] = effectiveLanguage(req, options);
|
|
68
|
+
}
|
|
69
|
+
function setLanguageCookie(req, res, lang, options = {}) {
|
|
70
|
+
if (!res || typeof res.cookie !== "function")
|
|
71
|
+
return false;
|
|
72
|
+
const cookieName = languageCookieName(options);
|
|
73
|
+
const next = matchAllowedLanguage(lang, options);
|
|
74
|
+
const base = {
|
|
75
|
+
httpOnly: false,
|
|
76
|
+
sameSite: "lax",
|
|
77
|
+
secure: responseSecure(req, options.secure),
|
|
78
|
+
path: "/",
|
|
79
|
+
...(options.cookieOptions || {}),
|
|
80
|
+
};
|
|
81
|
+
if (!cookieName || !next) {
|
|
82
|
+
res.cookie(cookieName, "", { ...base, maxAge: 0 });
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
res.cookie(cookieName, next, base);
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
function setServerLanguage(req, res, lang, options = {}) {
|
|
89
|
+
const next = matchAllowedLanguage(lang, options);
|
|
90
|
+
setLanguageCookie(req, res, next, options);
|
|
91
|
+
const cookieName = languageCookieName(options);
|
|
92
|
+
const cookies = requestCookies(req);
|
|
93
|
+
if (cookieName) {
|
|
94
|
+
if (next)
|
|
95
|
+
cookies[cookieName] = next;
|
|
96
|
+
else
|
|
97
|
+
delete cookies[cookieName];
|
|
98
|
+
}
|
|
99
|
+
applyLanguageToLocals(req, res, options);
|
|
100
|
+
return effectiveLanguage(req, options);
|
|
101
|
+
}
|
|
102
|
+
function languageSetPayload(lang) {
|
|
103
|
+
return {
|
|
104
|
+
ok: true,
|
|
105
|
+
status_code: "language-set",
|
|
106
|
+
message: "language-set",
|
|
107
|
+
data: { lang },
|
|
108
|
+
lang,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function createLanguageSetHandler(config = {}) {
|
|
112
|
+
return async function languageSetHandler(req, res, next) {
|
|
113
|
+
try {
|
|
114
|
+
const body = requestBody(req);
|
|
115
|
+
const query = requestQuery(req);
|
|
116
|
+
const value = query.lang != null ? query.lang : body.lang;
|
|
117
|
+
const lang = setServerLanguage(req, res, value, config.options || {});
|
|
118
|
+
const payload = languageSetPayload(lang);
|
|
119
|
+
if (config.respond)
|
|
120
|
+
return config.respond({ lang, payload, req, res });
|
|
121
|
+
return sendJson(res, payload);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
if (typeof next === "function")
|
|
125
|
+
return next(error);
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function createLanguageMiddleware(options = {}) {
|
|
131
|
+
return function languageMiddleware(req, res, next) {
|
|
132
|
+
applyLanguageToLocals(req, res, options);
|
|
133
|
+
return next();
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function attachLanguageMiddleware(app, options = {}) {
|
|
137
|
+
if (app && typeof app.use === "function") {
|
|
138
|
+
app.use(createLanguageMiddleware(options));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function attachLanguageRoutes(app, config = {}) {
|
|
142
|
+
if (app && typeof app.post === "function") {
|
|
143
|
+
app.post(config.path || "/ui/lang/set", createLanguageSetHandler(config));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
export { DEFAULT_LANGUAGE_COOKIE_NAME, DEFAULT_LANGUAGE_KEYS, allowedLanguageKeys, applyLanguageToLocals, attachLanguageMiddleware, attachLanguageRoutes, browserPreferredLanguage, createLanguageMiddleware, createLanguageSetHandler, currentLanguage, defaultLanguage, effectiveLanguage, languageCookieName, languageIsAllowed, languageSetPayload, matchAllowedLanguage, normalizeLanguageToken, setLanguageCookie, setServerLanguage, setServerLanguage as setLanguage, };
|
|
147
|
+
//# sourceMappingURL=language.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language.js","sourceRoot":"","sources":["../../../src/server/language.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,54 @@
|
|
|
1
|
+
import { type ServerRequestLike } from "./http.js";
|
|
2
|
+
type CurrentNavigation = {
|
|
3
|
+
path: string;
|
|
4
|
+
url: string;
|
|
5
|
+
};
|
|
6
|
+
type CurrentMatchOptions = {
|
|
7
|
+
exact?: boolean;
|
|
8
|
+
};
|
|
9
|
+
type DecorateOptions = CurrentMatchOptions & {
|
|
10
|
+
linkClass?: string;
|
|
11
|
+
liClass?: string;
|
|
12
|
+
};
|
|
13
|
+
declare function normalizeNavigationPath(input: unknown): string;
|
|
14
|
+
declare function normalizeRequestPath(req: ServerRequestLike | null | undefined): string;
|
|
15
|
+
declare function normalizeNavigationHref(input: unknown): string;
|
|
16
|
+
declare function matchesCurrentPath(currentPath: string, input: unknown, opts?: CurrentMatchOptions): boolean;
|
|
17
|
+
declare function decorateActiveLink(html: unknown, currentPath: string, opts?: DecorateOptions): string;
|
|
18
|
+
declare function createNavigationState(currentInput?: Partial<CurrentNavigation>): {
|
|
19
|
+
current: {
|
|
20
|
+
path: string;
|
|
21
|
+
url: string;
|
|
22
|
+
};
|
|
23
|
+
isCurrent: (input: unknown, opts?: CurrentMatchOptions) => boolean;
|
|
24
|
+
attrs: (input: unknown, opts?: CurrentMatchOptions) => "" | " aria-current=\"page\"";
|
|
25
|
+
linkAttrs: (input: unknown, opts?: CurrentMatchOptions) => "" | " class=\"is-active\" aria-current=\"page\"";
|
|
26
|
+
liAttrs: (input: unknown, opts?: CurrentMatchOptions) => "" | " class=\"active\"";
|
|
27
|
+
className: (base: unknown, input: unknown, opts?: CurrentMatchOptions) => string;
|
|
28
|
+
menuClass: (base: unknown, opts?: {
|
|
29
|
+
exclude?: unknown[];
|
|
30
|
+
}) => string;
|
|
31
|
+
decorate: (html: unknown, opts?: DecorateOptions) => string;
|
|
32
|
+
decorateSidebar: (html: unknown, opts?: DecorateOptions) => string;
|
|
33
|
+
decorateBottomBar: (html: unknown) => string;
|
|
34
|
+
};
|
|
35
|
+
declare const defaultNavigationState: {
|
|
36
|
+
current: {
|
|
37
|
+
path: string;
|
|
38
|
+
url: string;
|
|
39
|
+
};
|
|
40
|
+
isCurrent: (input: unknown, opts?: CurrentMatchOptions) => boolean;
|
|
41
|
+
attrs: (input: unknown, opts?: CurrentMatchOptions) => "" | " aria-current=\"page\"";
|
|
42
|
+
linkAttrs: (input: unknown, opts?: CurrentMatchOptions) => "" | " class=\"is-active\" aria-current=\"page\"";
|
|
43
|
+
liAttrs: (input: unknown, opts?: CurrentMatchOptions) => "" | " class=\"active\"";
|
|
44
|
+
className: (base: unknown, input: unknown, opts?: CurrentMatchOptions) => string;
|
|
45
|
+
menuClass: (base: unknown, opts?: {
|
|
46
|
+
exclude?: unknown[];
|
|
47
|
+
}) => string;
|
|
48
|
+
decorate: (html: unknown, opts?: DecorateOptions) => string;
|
|
49
|
+
decorateSidebar: (html: unknown, opts?: DecorateOptions) => string;
|
|
50
|
+
decorateBottomBar: (html: unknown) => string;
|
|
51
|
+
};
|
|
52
|
+
export { createNavigationState, decorateActiveLink, defaultNavigationState, matchesCurrentPath, normalizeNavigationHref, normalizeNavigationHref as normalizeHref, normalizeNavigationPath, normalizeRequestPath, };
|
|
53
|
+
export type { CurrentMatchOptions, CurrentNavigation, DecorateOptions };
|
|
54
|
+
//# sourceMappingURL=navigation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../../src/server/navigation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAEnD,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,KAAK,mBAAmB,GAAG;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,KAAK,eAAe,GAAG,mBAAmB,GAAE;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAOF,iBAAS,uBAAuB,CAAC,KAAK,EAAE,OAAO,UAiB9C;AAED,iBAAS,oBAAoB,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,UAStE;AAED,iBAAS,uBAAuB,CAAC,KAAK,EAAE,OAAO,UAI9C;AAED,iBAAS,kBAAkB,CACzB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,EACd,IAAI,GAAE,mBAAwB,WAO/B;AAgEO,iBAAS,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE,eAAoB,UAoBzF;AA8DD,iBAAS,qBAAqB,CAAC,YAAY,GAAE,OAAO,CAAC,iBAAiB,CAAiB;;;;;uBAQpE,OAAO,SAAQ,mBAAmB;mBACtC,OAAO,SAAQ,mBAAmB;uBAC9B,OAAO,SAAQ,mBAAmB;qBACpC,OAAO,SAAQ,mBAAmB;sBACjC,OAAO,SAAS,OAAO,SAAQ,mBAAmB;sBAElD,OAAO,SAAQ;QAAE,OAAO,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE;qBACvC,OAAO,SAAQ,eAAe;4BACvB,OAAO,SAAQ,eAAe;8BAC5B,OAAO;EAEhC;AAED,QAAA,MAAM,sBAAsB;;;;;uBAbT,OAAO,SAAQ,mBAAmB;mBACtC,OAAO,SAAQ,mBAAmB;uBAC9B,OAAO,SAAQ,mBAAmB;qBACpC,OAAO,SAAQ,mBAAmB;sBACjC,OAAO,SAAS,OAAO,SAAQ,mBAAmB;sBAElD,OAAO,SAAQ;QAAE,OAAO,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE;qBACvC,OAAO,SAAQ,eAAe;4BACvB,OAAO,SAAQ,eAAe;8BAC5B,OAAO;CAIkC,CAAC;AAEpE,OAAO,EACP,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,IAAI,aAAa,EACxC,uBAAuB,EACvB,oBAAoB,GACnB,CAAC;AACF,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,eAAe,EAAE,CAAC"}
|