domain/loaders/search.loader.ts
domain/loaders/search.loader.ts is a file in Bane's Lab Site. 21 lines of code and 8 definitions.
import type { SearchCorpus, SearchPage } from "#types/search.types";
import { loadPage, registeredPages } from "#domain/registries/page.registry";
import type { PageEntry } from "#types/page.types";
import { SEARCH_PAGE } from "#core/ids/page.ids";
let held: Promise<SearchCorpus> | null = null;
const searchPageOf = async function searchPageOf(entry: PageEntry): Promise<readonly SearchPage[]> {
const definition = await loadPage(entry.id);
return definition === undefined ? [] : [{ definition, icon: entry.icon }];
};
export const searchPages = async function searchPages(): Promise<readonly SearchPage[]> {
const entries = registeredPages().filter((entry) => entry.id !== SEARCH_PAGE);
return (await Promise.all(entries.map(searchPageOf))).flat();
};
const gather = async function gather(): Promise<SearchCorpus> {
const [pages, { SEARCH }] = await Promise.all([searchPages(), import("#core/generated/search.generated")]);
return { definitions: SEARCH.definitions, pages, positions: SEARCH.positions };
};
export const loadCorpus = async function loadCorpus(): Promise<SearchCorpus> {
held ??= gather();
return held;
};