core/selectors/metadata.selector.ts

core/selectors/metadata.selector.ts is a file in GovLab Docs. 29 lines of code and 13 definitions.

import type { SpineContext, SpineProfile, StemParts } from "#types/document.types";
import { SPINE_KEYS } from "#configuration/constants/document.constants";

const POSIX_SEPARATOR = "/";
const EXTENSION_DOT = ".";

const DEFAULT_PROFILE: SpineProfile = { keys: [...SPINE_KEYS], requireFrontmatter: true, requireTitle: true };

export const spineProfileFor = function spineProfileFor(relDoc: string, context: SpineContext): SpineProfile {
    const { harnessRoot } = context;
    if (harnessRoot === null || !relDoc.startsWith(harnessRoot)) {
        return DEFAULT_PROFILE;
    }
    const profile = context.harnessProfiles.find((candidate) => relDoc.startsWith(harnessRoot + candidate.prefix));
    return profile === undefined
        ? DEFAULT_PROFILE
        : { keys: profile.keys, requireFrontmatter: profile.requireFrontmatter, requireTitle: profile.requireTitle };
};

export const docBasename = function docBasename(relDoc: string): string {
    return relDoc.slice(relDoc.lastIndexOf(POSIX_SEPARATOR) + 1);
};

export const docStem = function docStem(relDoc: string): string {
    const filename = docBasename(relDoc);
    const dot = filename.lastIndexOf(EXTENSION_DOT);
    return dot === -1 ? filename : filename.slice(0, dot);
};

export const stemParts = function stemParts(stem: string, tag?: string): StemParts {
    const suffix = `${EXTENSION_DOT}${tag ?? ""}`;
    const bare = tag !== undefined && tag.length > 0 && stem.endsWith(suffix) ? stem.slice(0, -suffix.length) : stem;
    const dot = bare.lastIndexOf(EXTENSION_DOT);
    return dot === -1 ? { name: bare } : { member: bare.slice(dot + 1), name: bare.slice(0, dot) };
};