NatLibFi/marc-record-validators-melinda

View on GitHub
src/non-breaking-space.js

Summary

Maintainability
A
2 hrs
Test Coverage
/**
 * Provides interface to validate and fix record fields, which include subfields that contain no-breaking space character
 * @returns {Object} Object containing interfaces required by marc-record-validators-melinda package
 */
export default function () {
  return {
    description: 'Handles subfields that contains non-breaking space character',
    validate,
    fix
  };

  function validate(record) {
    const nonValidFields = record.fields.filter((field) => collectNonValidFields(field));

    const valid = nonValidFields.length === 0;
    const messages = nonValidFields.flatMap(({tag, subfields}) => subfields.map(sf => `Field ${tag} subfield $${sf.code} contains non-breaking space character(s)`));

    return valid ? {valid, messages: []} : {valid, messages};

    function collectNonValidFields(field) {
      if (field.value) {
        return (/\u00A0/u).test(field.value);
      }

      return field.subfields.filter(valueContainsNonBreakingSpace).length > 0;
    }
  }

  /* eslint-disable functional/immutable-data,functional/no-conditional-statements */
  function fix(record) {
    record.fields.forEach((field) => {
      if (field.value) {
        field.value = field.value.replaceAll(/\u00A0/gu, ' ');
        return;
      }

      field.subfields.forEach(subfield => {
        if (valueContainsNonBreakingSpace(subfield)) {
          subfield.value = subfield.value.replaceAll(/\u00A0/gu, ' ');
        }
      });
    });
  }
  /* eslint-enable functional/immutable-data,functional/no-conditional-statements */

  function valueContainsNonBreakingSpace({value}) {
    return (/\u00A0/u).test(value);
  }
}