core/converters/principle.converter.ts

core/converters/principle.converter.ts is a file in Bane's Lab Content. 54 lines of code and 11 definitions.

import { HEADING_MARK, LINE_END } from "#configuration/constants/inventory.constants";
import type { LessonSeed, ProfilePrinciple } from "#types/lesson.types";
import {
    PROFILE_PRINCIPLE_MARK,
    PROFILE_SECTION_HEADING,
    SEED_ID_SEPARATOR,
    SEED_LEVELS,
} from "#configuration/constants/seed.constants";
import { slugify } from "@govlab/context";

const SOURCE = "profile";
const SECTION_MARK = `${HEADING_MARK} `;

const sectionBody = function sectionBody(text: string): string | null {
    const start = text.indexOf(PROFILE_SECTION_HEADING);
    if (start === -1) {
        return null;
    }
    const afterHeading = start + PROFILE_SECTION_HEADING.length;
    const next = text.indexOf(LINE_END + SECTION_MARK, afterHeading);
    return text.slice(afterHeading, next === -1 ? text.length : next);
};

export const profilePrinciples = function profilePrinciples(text: string): ProfilePrinciple[] {
    const body = sectionBody(text);
    if (body === null) {
        return [];
    }
    const collected: { heading: string; lines: string[] }[] = [];
    for (const line of body.split(LINE_END)) {
        if (line.startsWith(PROFILE_PRINCIPLE_MARK)) {
            collected.push({ heading: line.slice(PROFILE_PRINCIPLE_MARK.length).trim(), lines: [] });
            continue;
        }
        const last = collected.at(-1);
        if (last !== undefined && line.trim().length > 0) {
            last.lines.push(line.trim());
        }
    }
    return collected.map((entry) => ({ body: entry.lines.join(" "), heading: entry.heading }));
};

export const profileSeeds = function profileSeeds(text: string): LessonSeed[] {
    return profilePrinciples(text).map((principle) => ({
        application: [],
        boundary: null,
        cause: [],
        decision: principle.heading,
        domain: SOURCE,
        failureMode: null,
        id: SOURCE + SEED_ID_SEPARATOR + slugify(principle.heading),
        level: SEED_LEVELS[SOURCE],
        principle: principle.body,
        problem: null,
        source: SOURCE,
        validation: null,
    }));
};