core/converters/location.converter.ts
core/converters/location.converter.ts is a file in GovLab Paths. 30 lines of code and 7 definitions.
import { SEGMENT_SEPARATOR, SELF_KEY } from "#configuration/constants/location.constants";
import { isPathTree, isRecord } from "#core/predicates/location.predicate";
import { INVALID_ABSOLUTE_TREE } from "#configuration/strings/location.strings";
import { LOCATION_TREE } from "#core/loaders/location.loader";
import type { PathTree } from "#types/location.types";
import { ROOT } from "#core/resolvers/location.root.resolver";
import { join } from "node:path";
const absolutize = function absolutize(node: unknown, prefix: readonly string[]): unknown {
if (typeof node === "string") {
return join(ROOT, ...prefix, ...node.split(SEGMENT_SEPARATOR));
}
if (!isRecord(node)) {
return node;
}
const own = typeof node[SELF_KEY] === "string" ? node[SELF_KEY] : "";
const childPrefix = own.length > 0 ? [...prefix, ...own.split(SEGMENT_SEPARATOR)] : [...prefix];
const out: Record<string, unknown> = {};
for (const [key, value] of Object.entries(node)) {
out[key] = key === SELF_KEY ? join(ROOT, ...childPrefix) : absolutize(value, childPrefix);
}
return Object.freeze(out);
};
const buildPaths = function buildPaths(): Readonly<PathTree> {
const built = absolutize(LOCATION_TREE, []);
if (!isPathTree(built)) {
throw new Error(INVALID_ABSOLUTE_TREE);
}
return built;
};
export const paths: Readonly<PathTree> = buildPaths();