core/coordinators/chapter.coordinator.ts

core/coordinators/chapter.coordinator.ts is a file in Bane's Lab Content. 29 lines of code and 9 definitions.

import type { ChapterShape, SurfaceResult } from "#types/chapter.types";
import { NO_README_INPUTS, NO_TWINS, RENDER_UNSTABLE } from "#configuration/strings/derivation.strings";
import { attributionOf, pagesFor, rendererFor, shapeInputOf, surfaceFolder } from "#core/loaders/chapter.loader";
import { REPOSITORY_SHAPE } from "#configuration/constants/chapter.constants";
import { persistChapters } from "#core/persistence/chapter.persistence";
import { unstableChapters } from "#core/validators/chapter.validator";

const LIST_JOIN = ", ";

export const renderSurface = async function renderSurface(
    shape: ChapterShape,
    out: string | null = null,
): Promise<SurfaceResult> {
    const input = shapeInputOf(shape);
    if (input === null) {
        return { ok: false, reason: NO_TWINS + pagesFor(shape).join(LIST_JOIN) };
    }
    if (shape === REPOSITORY_SHAPE && input.readme === null) {
        return { ok: false, reason: NO_README_INPUTS };
    }
    const render = rendererFor(shape);
    const attribution = attributionOf();
    const unstable = unstableChapters(render, input, attribution);
    if (unstable.length > 0) {
        return { ok: false, reason: RENDER_UNSTABLE + unstable.join(LIST_JOIN) };
    }
    const target = out ?? surfaceFolder(shape);
    const chapters = render(input, attribution);
    const removed = await persistChapters(target, chapters);
    return { chapters, ok: true, out: target, removed };
};