UNPKG

@natlibfi/melinda-record-match-validator

Version:

Validates if two records matched by melinda-record-matching can be merged and sets merge priority

72 lines (71 loc) 2.71 kB
import ISBN from "isbn3"; function mapQualifier(value) { if (value.match(/epub/iu)) { return "EPUB"; } if (value.match(/pdf/iu)) { return "PDF"; } if (value.match(/^(?:hft|häftad|mjuka pärmar|nid|paperback|pehmeäkantinen)/ui)) { return "PEHME\xC4KANTINEN"; } if (value.match(/^(?:hard.?cover|hårda pärmar|kovakantinen|sid)/ui)) { return "KOVAKANTINEN"; } return void 0; } function normalizeIsbn(value) { const normalizedValue = value.replace(/x/u, "X").replace(/-/ug, ""); if (normalizedValue.length !== 10 && normalizedValue.length !== 13) { return value; } if (invalidISBN(normalizedValue)) { return value; } const parsedIsbn = ISBN.parse(normalizedValue); const result = parsedIsbn.isbn13; return result; } function invalidISBN(isbn) { try { const auditedIsbn = ISBN.audit(isbn); return !auditedIsbn.validIsbn; } catch { return true; } } function fieldsShareIsbn(field1, field2) { const isbns1 = field1.subfields.filter((sf) => sf.code === "a" && sf.value !== void 0).map((sf) => normalizeIsbn(sf.value)); const isbns2 = field2.subfields.filter((sf) => sf.code === "a" && sf.value !== void 0).map((sf) => normalizeIsbn(sf.value)); return isbns1.some((v1) => isbns2.some((v2) => v1 === v2)); } function hasConflictingQualifierTypes(type1, type2) { return type1 !== void 0 && type2 !== void 0 && type1 !== type2; } function fieldHaveConflictingQualifiers(field1, field2) { const qualifierTypes1 = field1.subfields.filter((sf) => sf.code === "q").map((sf) => mapQualifier(sf.value)); const qualifierTypes2 = field2.subfields.filter((sf) => sf.code === "q").map((sf) => mapQualifier(sf.value)); return qualifierTypes1.some((type1) => qualifierTypes2.some((type2) => hasConflictingQualifierTypes(type1, type2))); } function hasConflinctingQualifier(field, otherFields) { const relevantOtherFields = otherFields.filter((field2) => fieldsShareIsbn(field, field2)); if (relevantOtherFields.length === 0) { return false; } return relevantOtherFields.some((field2) => fieldHaveConflictingQualifiers(field, field2)); } function isRelevantField(field) { if (field.tag !== "020") { return false; } return field.subfields.some((sf) => sf.code === "a") && field.subfields.some((sf) => sf.code === "q"); } export function performIsbnQualifierCheck({ record1, record2 }) { const fields1 = record1.fields.filter((f) => isRelevantField(f)); const fields2 = record2.fields.filter((f) => isRelevantField(f)); if (fields1.length === 0 || fields2.length === 0) { return true; } return fields1.some((f) => !hasConflinctingQualifier(f, fields2)); } //# sourceMappingURL=sanityCheckIsbnQualifer.js.map