Raw export file content as text.
Parsing configuration.
Parsed Kenmei export data.
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;
}
});
}
Parse a Kenmei export file, optionally validating structure and normalizing entries.