core/selectors/site.selector.ts
core/selectors/site.selector.ts is a file in Bane's Lab Build Scripts. 41 lines of code and 10 definitions.
import type { DiscoveredRoute, Discovery, FullTextPart } from "#types/site.types";
import { FULL_TEXT_EXTENSION, FULL_TEXT_FOLDER, REFERENCE_PAGES } from "#configuration/constants/site.constants";
const SLASH = "/";
export const isFullTextRoute = function isFullTextRoute(route: { readonly page: string }): boolean {
return !REFERENCE_PAGES.has(route.page);
};
export const fullTextFileOf = function fullTextFileOf(page: string): string {
return FULL_TEXT_FOLDER + SLASH + page + FULL_TEXT_EXTENSION;
};
export const fullTextRoutes = function fullTextRoutes(discovery: Discovery): readonly DiscoveredRoute[] {
return discovery.routes.filter(isFullTextRoute);
};
export const fullTextParts = function fullTextParts(discovery: Discovery): readonly FullTextPart[] {
return discovery.pages
.filter((page) => isFullTextRoute({ page: page.id }))
.map((page) => ({
file: fullTextFileOf(page.id),
label: page.label,
routes: discovery.routes.filter((route) => route.page === page.id),
}));
};
const isTab = function isTab(value: unknown): value is { readonly id: string } {
return typeof value === "object" && value !== null && "id" in value && typeof value.id === "string";
};
export const tabContentOf = function tabContentOf(content: unknown, tab: string): unknown {
if (typeof content !== "object" || content === null || !("tabs" in content) || !Array.isArray(content.tabs)) {
return undefined;
}
return content.tabs.find((entry: unknown) => isTab(entry) && entry.id === tab);
};
export const routeOf = function routeOf(
discovery: Discovery,
page: string,
tab: string | null,
): DiscoveredRoute | undefined {
return discovery.routes.find((route) => route.page === page && route.tab === tab);
};
export const routeContentOf = function routeContentOf(discovery: Discovery, route: DiscoveredRoute): unknown {
const page = discovery.pages.find((candidate) => candidate.id === route.page);
return route.tab === null ? page?.content : tabContentOf(page?.content, route.tab);
};