• Parse a Kenmei export file, optionally validating structure and normalizing entries.

    Parameters

    • fileContent: string

      Raw export file content as text.

    • options: Partial<KenmeiParseOptions> = {}

      Parsing configuration.

    Returns KenmeiExport

    Parsed Kenmei export data.

    If JSON is invalid or structure validation fails.

    export function parseKenmeiExport(
    fileContent: string,
    options: Partial<KenmeiParseOptions> = {},
    ): KenmeiExport {
    return withGroup(`[KenmeiParser] Parse JSON Export`, () => {
    const parseOptions = { ...DEFAULT_PARSE_OPTIONS, ...options };
    try {
    const rawData = JSON.parse(fileContent);

    const rawDataObj = rawData as Record<string, unknown>;
    const data = {
    exportDate: pickString(rawDataObj, "export_date", "exportDate") ?? "",
    user:
    typeof rawDataObj.user === "object" && rawDataObj.user !== null
    ? (rawDataObj.user as Record<string, unknown>)
    : undefined,
    manga: Array.isArray(rawDataObj.manga)
    ? (rawDataObj.manga as unknown[]).map((m: unknown) =>
    mapJsonToKenmeiManga(m),
    )
    : [],
    };

    if (!parseOptions.validateStructure) return data as KenmeiExport;

    // Quick shape check
    if (!data?.manga || !Array.isArray(data.manga)) {
    throw new Error(
    "Invalid Kenmei export: missing or invalid manga array",
    );
    }

    // Validate and normalize each manga entry (basic shape checks)
    validateAndNormalizePartialMangaArray(data.manga, parseOptions);

    return data as KenmeiExport;
    } catch (error) {
    if (error instanceof SyntaxError)
    throw new Error("Invalid JSON format in export file");
    throw error;
    }
    });
    }