@natlibfi/marc-record-validators-melinda 10.15.1 → 10.15.2-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/dist/ending-punctuation.js +0 -5
  2. package/dist/ending-punctuation.js.map +1 -1
  3. package/dist/ending-punctuation.spec.js +0 -8
  4. package/dist/ending-punctuation.spec.js.map +1 -1
  5. package/dist/field-505-separators.js +0 -2
  6. package/dist/field-505-separators.js.map +1 -1
  7. package/dist/field-521-fix.js +0 -1
  8. package/dist/field-521-fix.js.map +1 -1
  9. package/dist/field-exclusion.js +0 -3
  10. package/dist/field-exclusion.js.map +1 -1
  11. package/dist/field-exclusion.spec.js +0 -2
  12. package/dist/field-exclusion.spec.js.map +1 -1
  13. package/dist/fixRelatorTerms.js +1 -2
  14. package/dist/fixRelatorTerms.js.map +1 -1
  15. package/dist/identical-fields.js +0 -1
  16. package/dist/identical-fields.js.map +1 -1
  17. package/dist/indicator-fixes.js +0 -7
  18. package/dist/indicator-fixes.js.map +1 -1
  19. package/dist/isbn-issn.js +0 -3
  20. package/dist/isbn-issn.js.map +1 -1
  21. package/dist/item-language.js +0 -1
  22. package/dist/item-language.js.map +1 -1
  23. package/dist/mergeField500Lisapainokset.js +0 -3
  24. package/dist/mergeField500Lisapainokset.js.map +1 -1
  25. package/dist/mergeRelatorTermFields.js +1 -2
  26. package/dist/mergeRelatorTermFields.js.map +1 -1
  27. package/dist/normalize-identifiers.js +2 -0
  28. package/dist/normalize-identifiers.js.map +1 -1
  29. package/dist/normalize-qualifying-information.js +0 -1
  30. package/dist/normalize-qualifying-information.js.map +1 -1
  31. package/dist/normalize-utf8-diacritics.js +3 -0
  32. package/dist/normalize-utf8-diacritics.js.map +1 -1
  33. package/dist/normalizeFieldForComparison.js +0 -6
  34. package/dist/normalizeFieldForComparison.js.map +1 -1
  35. package/dist/prepublicationUtils.js +0 -1
  36. package/dist/prepublicationUtils.js.map +1 -1
  37. package/dist/punctuation/index.js +0 -9
  38. package/dist/punctuation/index.js.map +1 -1
  39. package/dist/punctuation2.js +7 -14
  40. package/dist/punctuation2.js.map +1 -1
  41. package/dist/reindexSubfield6OccurenceNumbers.js +0 -1
  42. package/dist/reindexSubfield6OccurenceNumbers.js.map +1 -1
  43. package/dist/removeDuplicateDataFields.js +0 -6
  44. package/dist/removeDuplicateDataFields.js.map +1 -1
  45. package/dist/removeInferiorDataFields.js +29 -14
  46. package/dist/removeInferiorDataFields.js.map +1 -1
  47. package/dist/resolvable-ext-references-melinda.js +0 -3
  48. package/dist/resolvable-ext-references-melinda.js.map +1 -1
  49. package/dist/resolveOrphanedSubfield6s.js +0 -2
  50. package/dist/resolveOrphanedSubfield6s.js.map +1 -1
  51. package/dist/sanitize-vocabulary-source-codes.js +1 -0
  52. package/dist/sanitize-vocabulary-source-codes.js.map +1 -1
  53. package/dist/sort-tags.js +0 -1
  54. package/dist/sort-tags.js.map +1 -1
  55. package/dist/sortFields.js +1 -1
  56. package/dist/sortFields.js.map +1 -1
  57. package/dist/sortRelatorTerms.js +1 -1
  58. package/dist/sortRelatorTerms.js.map +1 -1
  59. package/dist/sortSubfields.js +0 -3
  60. package/dist/sortSubfields.js.map +1 -1
  61. package/dist/subfield-exclusion.js +0 -4
  62. package/dist/subfield-exclusion.js.map +1 -1
  63. package/dist/subfield-exclusion.spec.js +1 -0
  64. package/dist/subfield-exclusion.spec.js.map +1 -1
  65. package/dist/subfield6Utils.js +0 -6
  66. package/dist/subfield6Utils.js.map +1 -1
  67. package/dist/subfield8Utils.js +0 -2
  68. package/dist/subfield8Utils.js.map +1 -1
  69. package/dist/subfieldValueNormalizations.js +0 -1
  70. package/dist/subfieldValueNormalizations.js.map +1 -1
  71. package/dist/sync-007-and-300.js +1 -2
  72. package/dist/sync-007-and-300.js.map +1 -1
  73. package/dist/unicode-decomposition.js +0 -1
  74. package/dist/unicode-decomposition.js.map +1 -1
  75. package/dist/update-field-540.js +1 -1
  76. package/dist/update-field-540.js.map +1 -1
  77. package/dist/urn.js +0 -1
  78. package/dist/urn.js.map +1 -1
  79. package/dist/utils.js +0 -1
  80. package/dist/utils.js.map +1 -1
  81. package/package.json +10 -10
  82. package/src/normalize-utf8-diacritics.js +2 -2
  83. package/src/punctuation2.js +4 -3
  84. package/src/removeInferiorDataFields.js +33 -13
  85. package/test-fixtures/punctuation2/96/expectedResult.json +26 -0
  86. package/test-fixtures/punctuation2/96/metadata.json +6 -0
  87. package/test-fixtures/punctuation2/96/record.json +25 -0
  88. package/test-fixtures/remove-inferior-datafields/f12/expectedResult.json +15 -0
  89. package/test-fixtures/remove-inferior-datafields/f12/metadata.json +6 -0
  90. package/test-fixtures/remove-inferior-datafields/f12/record.json +22 -0
  91. package/test-fixtures/remove-inferior-datafields/f13/expectedResult.json +11 -0
  92. package/test-fixtures/remove-inferior-datafields/f13/metadata.json +6 -0
  93. package/test-fixtures/remove-inferior-datafields/f13/record.json +15 -0
  94. package/test-fixtures/strip-punctuation/96/expectedResult.json +26 -0
  95. package/test-fixtures/strip-punctuation/96/metadata.json +6 -0
  96. package/test-fixtures/strip-punctuation/96/record.json +25 -0
@@ -1 +1 @@
1
- {"version":3,"file":"subfield6Utils.js","names":["_subfield8Utils","require","_utils","sf6Regexp","isValidSubfield6","subfield","code","value","match","subfield6GetTag","substring","undefined","subfield6GetOccurrenceNumber","replace","subfield6GetOccurrenceNumberAsInteger","index","result","parseInt","subfield6ResetOccurrenceNumber","occurrenceNumber","occurrenceNumberAsString","intToOccurrenceNumberString","newValue","subfield6GetTail","subfield6HasWantedTagAndOccurrenceNumber","tagAndOccurrenceNumber","key","nvdebug","fieldGetUnambiguousTag","field","tags","subfields","filter","sf","length","subfieldToString","fieldGetUnambiguousOccurrenceNumber","occurrenceNumbers","fieldHasOccurrenceNumber","some","fieldResetOccurrenceNumber","newOccurrenceNumber","oldOccurrenceNumber","forEach","innerReset","currOccurrenceNumber","i","fieldGetMaxSubfield6OccurrenceNumberAsInteger","sf6s","vals","map","Math","max","fieldHasWantedTagAndOccurrenceNumber","fieldHasValidSubfield6","isSubfield6Pair","otherField","tagsArePairable6","tag","fieldIndex","otherFieldIndex","tag1","tag2","subfieldSevenToOneOccurrenceNumber","fieldSevenToOneOccurrenceNumber","fieldGetOccurrenceNumberPairs","candFields","pairs","fieldToString","pairedField","fieldGetOccurrenceNumbers","subfieldExtractOccurrenceNumber","includes","push","fieldsGetOccurrenceNumbers","fields","f","fieldProcessOccurrenceNumbers","newOccurrenceNumbers","is7XX","normalizeEntryTag","subfieldToNormalizedString","targetLinkingNumber","normalizeOccurrenceNumber","normalizeEntryTagBoolean","isValidSubfield8","currLinkingNumber","getSubfield8LinkingNumber","normVal","fieldToNormalizedString","ind1","ind2","formatAndNormalizeSubfields","join","guessTargetLinkingNumber","defaultTargetLinkingNumber","linkingNumbers","fieldsGetAllSubfield8LinkingNumbers","fieldsToNormalizedString","strings","sort","getFirstField","record","fieldsAsStrings","findIndex","isRelevantSubfield6Chain","non880","every","fieldHasSubfield","fieldIsFirstFieldInChain","chain","firstField","getAllLinkedSubfield6Fields","get6s","moreFields","add8s","isFirstLinkedSubfield6Field","fieldsToString","recordGetSubfield6ChainHeads","recordGetMaxSubfield6OccurrenceNumberAsInteger","candidateFields","sixes","relevantFields","o"],"sources":["../src/subfield6Utils.js"],"sourcesContent":["// import createDebugLogger from 'debug';\n// const debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/subfield6Utils');\n\nimport {add8s, fieldsGetAllSubfield8LinkingNumbers, getSubfield8LinkingNumber, isValidSubfield8} from './subfield8Utils';\nimport {fieldHasSubfield, fieldToString, fieldsToString, nvdebug, subfieldToString} from './utils';\n\n// NB! Subfield 6 is non-repeatable and it should always comes first!\n// NB! Index size should always be 2 (preceding 0 required for 01..09) However, support for 100+ was added on 2023-02-27.\n// NB! Index value '00' are left as they are (is not paired/indexed/whatever.\nconst sf6Regexp = /^[0-9][0-9][0-9]-(?:[0-9][0-9]|[1-9][0-9]+)(?:[^0-9].*)?$/u;\n\nexport function isValidSubfield6(subfield) {\n if (subfield.code !== '6') {\n return false;\n }\n return subfield.value.match(sf6Regexp);\n}\n\nfunction subfield6GetTag(subfield) {\n if (isValidSubfield6(subfield)) {\n return subfield.value.substring(0, 3);\n }\n return undefined;\n}\n\nexport function subfield6GetOccurrenceNumber(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.substring(4).replace(/\\D.*$/u, '');\n }\n return undefined;\n}\n\nexport function subfield6GetOccurrenceNumberAsInteger(subfield) {\n const index = subfield6GetOccurrenceNumber(subfield);\n if (index === undefined || index === '00') {\n return 0;\n }\n const result = parseInt(index, 10);\n //nvdebug(`SF6: ${subfield.value} => ${index} => ${result}`, debug);\n return result;\n}\n\nexport function subfield6ResetOccurrenceNumber(subfield, occurrenceNumber) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n const occurrenceNumberAsString = typeof occurrenceNumber === 'number' ? intToOccurrenceNumberString(occurrenceNumber) : occurrenceNumber;\n\n const newValue = subfield.value.substring(0, 4) + occurrenceNumberAsString + subfield6GetTail(subfield); // eslint-disable-line functional/immutable-data\n //nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`);\n subfield.value = newValue; // eslint-disable-line functional/immutable-data\n}\n\n\nfunction subfield6GetTail(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.replace(/^\\d+-\\d+/u, '');\n }\n return '';\n}\n\nexport function subfield6HasWantedTagAndOccurrenceNumber(subfield, tagAndOccurrenceNumber) {\n if (subfield.code !== '6') {\n return false;\n }\n // We could also use generic code and go getTag()+'-'+getIndex() instead of regexp...\n const key = subfield.value.replace(/^([0-9][0-9][0-9]-[0-9][0-9]+).*$/u, '$1'); // eslint-disable-line prefer-named-capture-group\n nvdebug(` Compare '${key}' vs '${tagAndOccurrenceNumber}'`);\n return key === tagAndOccurrenceNumber;\n}\n\n// <= SUBFIELD, FIELD =>\n\nexport function fieldGetUnambiguousTag(field) {\n const tags = field.subfields.filter(sf => subfield6GetTag(sf));\n if (tags.length === 1) {\n nvdebug(` GOT ${tags.length} tag(s): ${subfieldToString(tags[0])}`);\n return subfield6GetTag(tags[0]);\n }\n return undefined;\n}\n\nexport function fieldGetUnambiguousOccurrenceNumber(field) {\n const occurrenceNumbers = field.subfields.filter(sf => subfield6GetOccurrenceNumber(sf));\n if (occurrenceNumbers.length === 1) {\n return subfield6GetOccurrenceNumber(occurrenceNumbers[0]);\n }\n return undefined;\n}\n\nexport function fieldHasOccurrenceNumber(field, occurrenceNumber) {\n //nvdebug(`${occurrenceNumber} vs ${fieldToString(field)}`);\n return field.subfields && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber);\n}\n\nexport function fieldResetOccurrenceNumber(field, newOccurrenceNumber, oldOccurrenceNumber = undefined) {\n field.subfields.forEach(subfield => innerReset(subfield));\n\n function innerReset(subfield) {\n // (Optional) Check that this is really the occurrence number we wan't to reseot\n if (oldOccurrenceNumber !== undefined) {\n const currOccurrenceNumber = subfield6GetOccurrenceNumber(subfield);\n if (currOccurrenceNumber !== oldOccurrenceNumber) {\n return;\n }\n }\n subfield6ResetOccurrenceNumber(subfield, newOccurrenceNumber);\n }\n}\n\nexport function intToOccurrenceNumberString(i) {\n return i < 10 ? `0${i}` : `${i}`;\n}\n\nexport function fieldGetMaxSubfield6OccurrenceNumberAsInteger(field) {\n // used by reducer!\n //nvdebug(`Checking subfields $6 from ${JSON.stringify(field)}`);\n const sf6s = field.subfields ? field.subfields.filter(subfield => isValidSubfield6(subfield)) : [];\n if (sf6s.length === 0) {\n return 0;\n }\n // There should always be one, but here we check every subfield.\n //nvdebug(`Got ${field.subfields} $6-subfield(s) from ${JSON.stringify(field)}`, debug);\n const vals = sf6s.map(sf => subfield6GetOccurrenceNumberAsInteger(sf));\n return Math.max(...vals);\n}\n\n\nexport function fieldHasWantedTagAndOccurrenceNumber(field, tagAndOccurrenceNumber) {\n return field.subfields && field.subfields.some(sf => subfield6HasWantedTagAndOccurrenceNumber(sf, tagAndOccurrenceNumber));\n}\n\n\n/*\nexport function getFieldsWithGivenOccurrenceNumberSubfield6(record, occurrenceNumberAsString) {\n const record.fields.filter(field => field\n\n function fieldHasIndex(field, index) {\n if (!field.subfields) {\n return false;\n }\n return field.subfields.find(sf => isValidSubfield6(sf) && subfieldGetOccurrenceNumber6(sf) === index);\n }\n}\n*/\n\n\nexport function fieldHasValidSubfield6(field) {\n return field.subfields && field.subfields.some(sf => isValidSubfield6(sf));\n}\n\n\nfunction isSubfield6Pair(field, otherField) {\n // No need to log this:\n //nvdebug(`LOOK for $6-pair:\\n ${fieldToString(field)}\\n ${fieldToString(otherField)}`);\n if (!fieldHasValidSubfield6(field) || !fieldHasValidSubfield6(otherField)) {\n return false;\n }\n\n if (!tagsArePairable6(field.tag, otherField.tag)) {\n //nvdebug(` FAILED. REASON: TAGS NOT PAIRABLE!`);\n return false;\n }\n\n\n const fieldIndex = fieldGetUnambiguousOccurrenceNumber(field);\n if (fieldIndex === undefined || fieldIndex === '00') {\n //nvdebug(` FAILED. REASON: NO INDEX FOUND`);\n return false;\n }\n\n const otherFieldIndex = fieldGetUnambiguousOccurrenceNumber(otherField);\n\n\n if (fieldIndex !== otherFieldIndex) {\n //nvdebug(` FAILURE: INDEXES: ${fieldIndex} vs ${otherFieldIndex}`);\n return false;\n }\n\n if (fieldGetUnambiguousTag(field) !== otherField.tag || field.tag !== fieldGetUnambiguousTag(otherField)) {\n //nvdebug(` FAILURE: TAG vs $6 TAG`);\n return false;\n }\n return true;\n\n function tagsArePairable6(tag1, tag2) {\n // How to do XOR operation in one line? Well, this is probably more readable...\n if (tag1 === '880' && tag2 === '880') {\n return false;\n }\n if (tag1 !== '880' && tag2 !== '880') {\n return false;\n }\n return true;\n }\n}\n\n\nfunction subfieldSevenToOneOccurrenceNumber(subfield) {\n if (subfield.code !== '6' || subfield.value.substring(0, 1) !== '7') {\n return;\n }\n subfield.value = `1${subfield.value.substring(1)}`; // eslint-disable-line functional/immutable-data\n}\n\nexport function fieldSevenToOneOccurrenceNumber(field) {\n if (field.tag !== '880') {\n return;\n }\n field.subfields.forEach(sf => subfieldSevenToOneOccurrenceNumber(sf));\n}\n\n\nexport function fieldGetOccurrenceNumberPairs(field, candFields) {\n // NB! TAG!=880 returns 880 fields, TAG==880 returns non-880 field\n //nvdebug(` Trying to finds pair for ${fieldToString(field)} in ${candFields.length} fields`);\n const pairs = candFields.filter(otherField => isSubfield6Pair(field, otherField));\n if (pairs.length === 0) {\n nvdebug(`NO PAIRS FOUND FOR '${fieldToString(field)}'`);\n return pairs;\n }\n nvdebug(`${pairs.length} PAIR(S) FOUND FOR '${fieldToString(field)}'`);\n pairs.forEach(pairedField => nvdebug(` '${fieldToString(pairedField)}'`));\n return pairs;\n}\n\nexport function fieldGetOccurrenceNumbers(field) {\n /* eslint-disable */\n let occurrenceNumbers = [];\n field.subfields?.forEach(sf => subfieldExtractOccurrenceNumber(sf));\n\n function subfieldExtractOccurrenceNumber(sf) {\n if (!isValidSubfield6(sf)) {\n return;\n }\n const occurrenceNumber = subfield6GetOccurrenceNumber(sf);\n if (occurrenceNumber === '00' || occurrenceNumbers.includes(occurrenceNumber)) {\n return;\n }\n occurrenceNumbers.push(occurrenceNumber);\n }\n /* eslint-enable */\n return occurrenceNumbers;\n}\n\nexport function fieldsGetOccurrenceNumbers(fields) {\n /* eslint-disable */\n let occurrenceNumbers = [];\n\n fields.forEach(f => fieldProcessOccurrenceNumbers(f));\n\n function fieldProcessOccurrenceNumbers(f) {\n const newOccurrenceNumbers = fieldGetOccurrenceNumbers(f);\n newOccurrenceNumbers.forEach(occurrenceNumber => {\n if (!occurrenceNumbers.includes(occurrenceNumber)) {\n occurrenceNumbers.push(occurrenceNumber);\n }\n\n });\n }\n /* eslint-enable */\n return occurrenceNumbers;\n}\n\n/*\nexport function fieldGetSubfield6Pair(field, record) {\n const pairedFields = record.fields.filter(otherField => isSubfield6Pair(field, otherField));\n if (pairedFields.length !== 1) {\n return undefined;\n }\n // NB! It is theoretically possible to have multiple pairable 880 fields (one for each encoding)\n nvdebug(`fieldGetSubfield6Pair(): ${fieldToString(field)} => ${fieldToString(pairedFields[0])}`);\n return pairedFields[0];\n}\n*/\n\n/*\nexport function pairAndStringify6(field, record) {\n const pair6 = fieldGetSubfield6Pair(field, record);\n if (!pair6) {\n return fieldToNormalizedString(field);\n }\n return fieldsToNormalizedString([field, pair6]);\n}\n*/\n\n// Frequencly list for $6 subfields in 1XX/7XX fields:\n// 231115 100\n// 183832 700\n// 28773 710\n// 2047 711\n// 661 110\n// 341 111\n// 284 130\n// 63 730\n// Thus there's a real risk of ending up with, say, identical 100 vs 700 chains.\n// Semi-hackily support 1XX/7XX-version: 7XX can be deleted if corresponding 1XX exists:\n\nexport function is7XX(tag) {\n return ['700', '710', '711', '730'].includes(tag);\n}\n\n\nfunction normalizeEntryTag(tag) {\n if (tag.match(/^[17](?:00|10|11|30)$/u)) {\n return `X${tag.substring(1)}`;\n }\n return tag;\n}\n\nfunction subfieldToNormalizedString(sf, tag, targetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTagBoolean = false) {\n // targetLinkingNumber refers to $8.\n // normalizeEntryTagBoolean refers to 1XX/7XX tag values in subfield $6 value.\n if (isValidSubfield6(sf)) { // && targetLinkingNumber === 0) {\n // 1XX/7XX (entry tag) normalization:\n const tag2 = normalizeEntryTagBoolean ? normalizeEntryTag(tag) : tag;\n\n const occurrenceNumber = normalizeOccurrenceNumber ? 'XX' : subfield6GetOccurrenceNumber(sf);\n // If we are normalizing a $8 chain, don't normalize $6 occurrence number!\n // Replace $6 occurrence number with XX:\n return ` ‡${sf.code} ${tag2}-${occurrenceNumber}${subfield6GetTail(sf)}`;\n }\n\n if (isValidSubfield8(sf)) {\n const currLinkingNumber = getSubfield8LinkingNumber(sf); //getSubfield8Index(sf);\n if (targetLinkingNumber > 0 && currLinkingNumber === targetLinkingNumber) {\n // For $8 we should only XX the index we are looking at...\n const normVal = sf.value.replace(/^[0-9]+/u, 'XX');\n return ` ‡${sf.code} ${normVal}`;\n }\n return ''; // Other $8 subfields are meaningless in this context\n }\n return ` ${subfieldToString(sf)}`; // `‡${sf.code} ${sf.value}`;\n}\n\nexport function fieldToNormalizedString(field, targetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTagBoolean = false) {\n if ('subfields' in field) {\n const tag2 = normalizeEntryTagBoolean ? normalizeEntryTag(field.tag) : field.tag;\n return `${tag2} ${field.ind1}${field.ind2}${formatAndNormalizeSubfields(field)}`;\n }\n return `${field.tag} ${field.value}`;\n\n function formatAndNormalizeSubfields(field) {\n return field.subfields.map(sf => subfieldToNormalizedString(sf, field.tag, targetLinkingNumber, normalizeOccurrenceNumber, normalizeEntryTagBoolean)).join('');\n }\n\n}\n\n\nfunction guessTargetLinkingNumber(fields, defaultTargetLinkingNumber) {\n if (defaultTargetLinkingNumber !== 0) {\n return defaultTargetLinkingNumber;\n }\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fields);\n return linkingNumbers.length === 1 ? linkingNumbers[0] : 0; // eslint-disable-line no-param-reassign\n}\n\nexport function fieldsToNormalizedString(fields, defaultTargetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTag = false) {\n const targetLinkingNumber = guessTargetLinkingNumber(fields, defaultTargetLinkingNumber);\n\n nvdebug(`fieldsToNormalizedString: OCC: ${normalizeOccurrenceNumber}`);\n const strings = fields.map(field => fieldToNormalizedString(field, targetLinkingNumber, normalizeOccurrenceNumber, normalizeEntryTag));\n strings.sort(); // eslint-disable-line functional/immutable-data\n return strings.join('\\t__SEPARATOR__\\t');\n}\n\n\n/*\n\nexport function removeField6IfNeeded(field, record, fieldsAsString) {\n const pairField = fieldGetSubfield6Pair(field, record);\n const asString = pairField ? fieldsToNormalizedString([field, pairField]) : fieldToNormalizedString(field);\n nvdebug(`SOURCE: ${asString} -- REALITY: ${fieldToString(field)}`);\n const tmp = pairField ? fieldToString(pairField) : 'HUTI';\n nvdebug(`PAIR: ${tmp}`);\n nvdebug(`BASE:\\n ${fieldsAsString.join('\\n ')}`);\n if (!fieldsAsString.includes(asString)) {\n return;\n }\n nvdebug(`Duplicate $6 removal: ${fieldToString(field)}`);\n record.removeField(field);\n\n if (pairField === undefined) {\n return;\n }\n nvdebug(`Duplicate $6 removal (pair): ${fieldToString(pairField)}`);\n record.removeField(pairField);\n}\n*/\n\nfunction getFirstField(record, fields) {\n const fieldsAsStrings = fields.map(field => fieldToString(field));\n //record.fields.forEach((field, i) => nvdebug(`${i}:\\t${fieldToString(field)}`));\n //nvdebug(`getFirstField: ${fieldsAsStrings.join('\\t')}`);\n const i = record.fields.findIndex(field => fieldsAsStrings.includes(fieldToString(field)));\n if (i > -1) {\n const field = record.fields[i];\n //nvdebug(`1st F: ${i + 1}/${record.fields.length} ${fieldToString(field)}`);\n return field;\n }\n return undefined;\n}\n\nfunction isRelevantSubfield6Chain(fields) {\n if (fields.length < 2) { // 1 non-880-field and 1+ 880 fields\n return false;\n }\n const non880 = fields.filter(f => f.tag !== '880');\n if (non880.length !== 1) {\n return false;\n }\n\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fields);\n if (linkingNumbers.length !== 0) {\n return false;\n }\n\n return fields.every(f => fieldHasSubfield(f, '6'));\n}\n\nexport function fieldIsFirstFieldInChain(field, chain, record) {\n // Interpretation of first: position of field in record (however, we might have a duplicate field. See tests...)\n const firstField = getFirstField(record, chain);\n if (firstField) {\n return fieldToString(field) === fieldToString(firstField);\n }\n return false;\n\n}\n\n\nexport function getAllLinkedSubfield6Fields(field, record) {\n const fields = get6s(field, record);\n const moreFields = add8s(fields, record);\n\n // Currently we don't handle fields with more than one $6 and/or $8 subfield.\n if (moreFields.length > fields.length) {\n return []; // Don't fix!\n }\n return moreFields;\n}\n\nexport function isFirstLinkedSubfield6Field(field, record) {\n if (!field.subfields) { // Is not a datafield\n return false;\n }\n const chain = getAllLinkedSubfield6Fields(field, record);\n if (!isRelevantSubfield6Chain(chain)) {\n nvdebug(`Rejected 6: ${fieldsToString(chain)}`);\n return false;\n }\n\n return fieldIsFirstFieldInChain(field, chain, record);\n}\n\nexport function recordGetSubfield6ChainHeads(record) {\n return record.fields.filter(field => isFirstLinkedSubfield6Field(field, record));\n}\n\nexport function recordGetMaxSubfield6OccurrenceNumberAsInteger(record) {\n // Should we cache the value here?\n const vals = record.fields.map((field) => fieldGetMaxSubfield6OccurrenceNumberAsInteger(field));\n return Math.max(...vals);\n}\n\n\nexport function get6s(field, candidateFields) { // NB! Convert field to fields!!!\n // Get all fields with given occurence number\n const sixes = field.subfields.filter(sf => isValidSubfield6(sf));\n\n if (sixes.length === 0) {\n return [field];\n }\n nvdebug(`SIXES: ${sixes.length}`);\n const occurrenceNumbers = sixes.map(sf => subfield6GetOccurrenceNumber(sf)).filter(value => value !== undefined && value !== '00');\n nvdebug(occurrenceNumbers.join(' -- '));\n\n const relevantFields = candidateFields.filter(f => occurrenceNumbers.some(o => fieldHasOccurrenceNumber(f, o)));\n nvdebug(`${fieldToString(field)}: $6-RELFIELDS FOUND: ${relevantFields.length}...`);\n relevantFields.forEach(f => nvdebug(fieldToString(f)));\n return relevantFields;\n}\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,IAAAA,eAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAJA;AACA;;AAKA;AACA;AACA;AACA,MAAME,SAAS,GAAG,4DAA4D;AAEvE,SAASC,gBAAgBA,CAACC,QAAQ,EAAE;EACzC,IAAIA,QAAQ,CAACC,IAAI,KAAK,GAAG,EAAE;IACzB,OAAO,KAAK;EACd;EACA,OAAOD,QAAQ,CAACE,KAAK,CAACC,KAAK,CAACL,SAAS,CAAC;AACxC;AAEA,SAASM,eAAeA,CAACJ,QAAQ,EAAE;EACjC,IAAID,gBAAgB,CAACC,QAAQ,CAAC,EAAE;IAC9B,OAAOA,QAAQ,CAACE,KAAK,CAACG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;EACvC;EACA,OAAOC,SAAS;AAClB;AAEO,SAASC,4BAA4BA,CAACP,QAAQ,EAAE;EACrD,IAAID,gBAAgB,CAACC,QAAQ,CAAC,EAAE;IAC9B;IACA,OAAOA,QAAQ,CAACE,KAAK,CAACG,SAAS,CAAC,CAAC,CAAC,CAACG,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;EAC1D;EACA,OAAOF,SAAS;AAClB;AAEO,SAASG,qCAAqCA,CAACT,QAAQ,EAAE;EAC9D,MAAMU,KAAK,GAAGH,4BAA4B,CAACP,QAAQ,CAAC;EACpD,IAAIU,KAAK,KAAKJ,SAAS,IAAII,KAAK,KAAK,IAAI,EAAE;IACzC,OAAO,CAAC;EACV;EACA,MAAMC,MAAM,GAAGC,QAAQ,CAACF,KAAK,EAAE,EAAE,CAAC;EAClC;EACA,OAAOC,MAAM;AACf;AAEO,SAASE,8BAA8BA,CAACb,QAAQ,EAAEc,gBAAgB,EAAE;EACzE,IAAI,CAACf,gBAAgB,CAACC,QAAQ,CAAC,EAAE;IAC/B;EACF;EACA,MAAMe,wBAAwB,GAAG,OAAOD,gBAAgB,KAAK,QAAQ,GAAGE,2BAA2B,CAACF,gBAAgB,CAAC,GAAGA,gBAAgB;EAExI,MAAMG,QAAQ,GAAGjB,QAAQ,CAACE,KAAK,CAACG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAGU,wBAAwB,GAAGG,gBAAgB,CAAClB,QAAQ,CAAC,CAAC,CAAC;EACzG;EACAA,QAAQ,CAACE,KAAK,GAAGe,QAAQ,CAAC,CAAC;AAC7B;;AAGA,SAASC,gBAAgBA,CAAClB,QAAQ,EAAE;EAClC,IAAID,gBAAgB,CAACC,QAAQ,CAAC,EAAE;IAC9B;IACA,OAAOA,QAAQ,CAACE,KAAK,CAACM,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;EAChD;EACA,OAAO,EAAE;AACX;AAEO,SAASW,wCAAwCA,CAACnB,QAAQ,EAAEoB,sBAAsB,EAAE;EACzF,IAAIpB,QAAQ,CAACC,IAAI,KAAK,GAAG,EAAE;IACzB,OAAO,KAAK;EACd;EACA;EACA,MAAMoB,GAAG,GAAGrB,QAAQ,CAACE,KAAK,CAACM,OAAO,CAAC,oCAAoC,EAAE,IAAI,CAAC,CAAC,CAAC;EAChF,IAAAc,cAAO,EAAE,aAAYD,GAAI,SAAQD,sBAAuB,GAAE,CAAC;EAC3D,OAAOC,GAAG,KAAKD,sBAAsB;AACvC;;AAEA;;AAEO,SAASG,sBAAsBA,CAACC,KAAK,EAAE;EAC5C,MAAMC,IAAI,GAAGD,KAAK,CAACE,SAAS,CAACC,MAAM,CAACC,EAAE,IAAIxB,eAAe,CAACwB,EAAE,CAAC,CAAC;EAC9D,IAAIH,IAAI,CAACI,MAAM,KAAK,CAAC,EAAE;IACrB,IAAAP,cAAO,EAAE,UAASG,IAAI,CAACI,MAAO,YAAW,IAAAC,uBAAgB,EAACL,IAAI,CAAC,CAAC,CAAC,CAAE,EAAC,CAAC;IACrE,OAAOrB,eAAe,CAACqB,IAAI,CAAC,CAAC,CAAC,CAAC;EACjC;EACA,OAAOnB,SAAS;AAClB;AAEO,SAASyB,mCAAmCA,CAACP,KAAK,EAAE;EACzD,MAAMQ,iBAAiB,GAAGR,KAAK,CAACE,SAAS,CAACC,MAAM,CAACC,EAAE,IAAIrB,4BAA4B,CAACqB,EAAE,CAAC,CAAC;EACxF,IAAII,iBAAiB,CAACH,MAAM,KAAK,CAAC,EAAE;IAClC,OAAOtB,4BAA4B,CAACyB,iBAAiB,CAAC,CAAC,CAAC,CAAC;EAC3D;EACA,OAAO1B,SAAS;AAClB;AAEO,SAAS2B,wBAAwBA,CAACT,KAAK,EAAEV,gBAAgB,EAAE;EAChE;EACA,OAAOU,KAAK,CAACE,SAAS,IAAIF,KAAK,CAACE,SAAS,CAACQ,IAAI,CAACN,EAAE,IAAIrB,4BAA4B,CAACqB,EAAE,CAAC,KAAKd,gBAAgB,CAAC;AAC7G;AAEO,SAASqB,0BAA0BA,CAACX,KAAK,EAAEY,mBAAmB,EAAEC,mBAAmB,GAAG/B,SAAS,EAAE;EACtGkB,KAAK,CAACE,SAAS,CAACY,OAAO,CAACtC,QAAQ,IAAIuC,UAAU,CAACvC,QAAQ,CAAC,CAAC;EAEzD,SAASuC,UAAUA,CAACvC,QAAQ,EAAE;IAC5B;IACA,IAAIqC,mBAAmB,KAAK/B,SAAS,EAAE;MACrC,MAAMkC,oBAAoB,GAAGjC,4BAA4B,CAACP,QAAQ,CAAC;MACnE,IAAIwC,oBAAoB,KAAKH,mBAAmB,EAAE;QAChD;MACF;IACF;IACAxB,8BAA8B,CAACb,QAAQ,EAAEoC,mBAAmB,CAAC;EAC/D;AACF;AAEO,SAASpB,2BAA2BA,CAACyB,CAAC,EAAE;EAC7C,OAAOA,CAAC,GAAG,EAAE,GAAI,IAAGA,CAAE,EAAC,GAAI,GAAEA,CAAE,EAAC;AAClC;AAEO,SAASC,6CAA6CA,CAAClB,KAAK,EAAE;EACnE;EACA;EACA,MAAMmB,IAAI,GAAGnB,KAAK,CAACE,SAAS,GAAGF,KAAK,CAACE,SAAS,CAACC,MAAM,CAAC3B,QAAQ,IAAID,gBAAgB,CAACC,QAAQ,CAAC,CAAC,GAAG,EAAE;EAClG,IAAI2C,IAAI,CAACd,MAAM,KAAK,CAAC,EAAE;IACrB,OAAO,CAAC;EACV;EACA;EACA;EACA,MAAMe,IAAI,GAAGD,IAAI,CAACE,GAAG,CAACjB,EAAE,IAAInB,qCAAqC,CAACmB,EAAE,CAAC,CAAC;EACtE,OAAOkB,IAAI,CAACC,GAAG,CAAC,GAAGH,IAAI,CAAC;AAC1B;AAGO,SAASI,oCAAoCA,CAACxB,KAAK,EAAEJ,sBAAsB,EAAE;EAClF,OAAOI,KAAK,CAACE,SAAS,IAAIF,KAAK,CAACE,SAAS,CAACQ,IAAI,CAACN,EAAE,IAAIT,wCAAwC,CAACS,EAAE,EAAER,sBAAsB,CAAC,CAAC;AAC5H;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGO,SAAS6B,sBAAsBA,CAACzB,KAAK,EAAE;EAC5C,OAAOA,KAAK,CAACE,SAAS,IAAIF,KAAK,CAACE,SAAS,CAACQ,IAAI,CAACN,EAAE,IAAI7B,gBAAgB,CAAC6B,EAAE,CAAC,CAAC;AAC5E;AAGA,SAASsB,eAAeA,CAAC1B,KAAK,EAAE2B,UAAU,EAAE;EAC1C;EACA;EACA,IAAI,CAACF,sBAAsB,CAACzB,KAAK,CAAC,IAAI,CAACyB,sBAAsB,CAACE,UAAU,CAAC,EAAE;IACzE,OAAO,KAAK;EACd;EAEA,IAAI,CAACC,gBAAgB,CAAC5B,KAAK,CAAC6B,GAAG,EAAEF,UAAU,CAACE,GAAG,CAAC,EAAE;IAChD;IACA,OAAO,KAAK;EACd;EAGA,MAAMC,UAAU,GAAGvB,mCAAmC,CAACP,KAAK,CAAC;EAC7D,IAAI8B,UAAU,KAAKhD,SAAS,IAAIgD,UAAU,KAAK,IAAI,EAAE;IACnD;IACA,OAAO,KAAK;EACd;EAEA,MAAMC,eAAe,GAAGxB,mCAAmC,CAACoB,UAAU,CAAC;EAGvE,IAAIG,UAAU,KAAKC,eAAe,EAAE;IAClC;IACA,OAAO,KAAK;EACd;EAEA,IAAIhC,sBAAsB,CAACC,KAAK,CAAC,KAAK2B,UAAU,CAACE,GAAG,IAAI7B,KAAK,CAAC6B,GAAG,KAAK9B,sBAAsB,CAAC4B,UAAU,CAAC,EAAE;IACxG;IACA,OAAO,KAAK;EACd;EACA,OAAO,IAAI;EAEX,SAASC,gBAAgBA,CAACI,IAAI,EAAEC,IAAI,EAAE;IACpC;IACA,IAAID,IAAI,KAAK,KAAK,IAAIC,IAAI,KAAK,KAAK,EAAE;MACpC,OAAO,KAAK;IACd;IACA,IAAID,IAAI,KAAK,KAAK,IAAIC,IAAI,KAAK,KAAK,EAAE;MACpC,OAAO,KAAK;IACd;IACA,OAAO,IAAI;EACb;AACF;AAGA,SAASC,kCAAkCA,CAAC1D,QAAQ,EAAE;EACpD,IAAIA,QAAQ,CAACC,IAAI,KAAK,GAAG,IAAID,QAAQ,CAACE,KAAK,CAACG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,EAAE;IACnE;EACF;EACAL,QAAQ,CAACE,KAAK,GAAI,IAAGF,QAAQ,CAACE,KAAK,CAACG,SAAS,CAAC,CAAC,CAAE,EAAC,CAAC,CAAC;AACtD;;AAEO,SAASsD,+BAA+BA,CAACnC,KAAK,EAAE;EACrD,IAAIA,KAAK,CAAC6B,GAAG,KAAK,KAAK,EAAE;IACvB;EACF;EACA7B,KAAK,CAACE,SAAS,CAACY,OAAO,CAACV,EAAE,IAAI8B,kCAAkC,CAAC9B,EAAE,CAAC,CAAC;AACvE;AAGO,SAASgC,6BAA6BA,CAACpC,KAAK,EAAEqC,UAAU,EAAE;EAC/D;EACA;EACA,MAAMC,KAAK,GAAGD,UAAU,CAAClC,MAAM,CAACwB,UAAU,IAAID,eAAe,CAAC1B,KAAK,EAAE2B,UAAU,CAAC,CAAC;EACjF,IAAIW,KAAK,CAACjC,MAAM,KAAK,CAAC,EAAE;IACtB,IAAAP,cAAO,EAAE,uBAAsB,IAAAyC,oBAAa,EAACvC,KAAK,CAAE,GAAE,CAAC;IACvD,OAAOsC,KAAK;EACd;EACA,IAAAxC,cAAO,EAAE,GAAEwC,KAAK,CAACjC,MAAO,uBAAsB,IAAAkC,oBAAa,EAACvC,KAAK,CAAE,GAAE,CAAC;EACtEsC,KAAK,CAACxB,OAAO,CAAC0B,WAAW,IAAI,IAAA1C,cAAO,EAAE,MAAK,IAAAyC,oBAAa,EAACC,WAAW,CAAE,GAAE,CAAC,CAAC;EAC1E,OAAOF,KAAK;AACd;AAEO,SAASG,yBAAyBA,CAACzC,KAAK,EAAE;EAC/C;EACA,IAAIQ,iBAAiB,GAAG,EAAE;EAC1BR,KAAK,CAACE,SAAS,EAAEY,OAAO,CAACV,EAAE,IAAIsC,+BAA+B,CAACtC,EAAE,CAAC,CAAC;EAEnE,SAASsC,+BAA+BA,CAACtC,EAAE,EAAE;IAC3C,IAAI,CAAC7B,gBAAgB,CAAC6B,EAAE,CAAC,EAAE;MACzB;IACF;IACA,MAAMd,gBAAgB,GAAGP,4BAA4B,CAACqB,EAAE,CAAC;IACzD,IAAId,gBAAgB,KAAK,IAAI,IAAIkB,iBAAiB,CAACmC,QAAQ,CAACrD,gBAAgB,CAAC,EAAE;MAC7E;IACF;IACAkB,iBAAiB,CAACoC,IAAI,CAACtD,gBAAgB,CAAC;EAC1C;EACA;EACA,OAAOkB,iBAAiB;AAC1B;AAEO,SAASqC,0BAA0BA,CAACC,MAAM,EAAE;EACjD;EACA,IAAItC,iBAAiB,GAAG,EAAE;EAE1BsC,MAAM,CAAChC,OAAO,CAACiC,CAAC,IAAIC,6BAA6B,CAACD,CAAC,CAAC,CAAC;EAErD,SAASC,6BAA6BA,CAACD,CAAC,EAAE;IACxC,MAAME,oBAAoB,GAAGR,yBAAyB,CAACM,CAAC,CAAC;IACzDE,oBAAoB,CAACnC,OAAO,CAACxB,gBAAgB,IAAI;MAC/C,IAAI,CAACkB,iBAAiB,CAACmC,QAAQ,CAACrD,gBAAgB,CAAC,EAAE;QACjDkB,iBAAiB,CAACoC,IAAI,CAACtD,gBAAgB,CAAC;MAC1C;IAEF,CAAC,CAAC;EACJ;EACA;EACA,OAAOkB,iBAAiB;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO,SAAS0C,KAAKA,CAACrB,GAAG,EAAE;EACzB,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAACc,QAAQ,CAACd,GAAG,CAAC;AACnD;AAGA,SAASsB,iBAAiBA,CAACtB,GAAG,EAAE;EAC9B,IAAIA,GAAG,CAAClD,KAAK,CAAC,wBAAwB,CAAC,EAAE;IACvC,OAAQ,IAAGkD,GAAG,CAAChD,SAAS,CAAC,CAAC,CAAE,EAAC;EAC/B;EACA,OAAOgD,GAAG;AACZ;AAEA,SAASuB,0BAA0BA,CAAChD,EAAE,EAAEyB,GAAG,EAAEwB,mBAAmB,GAAG,CAAC,EAAEC,yBAAyB,GAAG,KAAK,EAAEC,wBAAwB,GAAG,KAAK,EAAE;EACzI;EACA;EACA,IAAIhF,gBAAgB,CAAC6B,EAAE,CAAC,EAAE;IAAE;IAC1B;IACA,MAAM6B,IAAI,GAAGsB,wBAAwB,GAAGJ,iBAAiB,CAACtB,GAAG,CAAC,GAAGA,GAAG;IAEpE,MAAMvC,gBAAgB,GAAGgE,yBAAyB,GAAG,IAAI,GAAGvE,4BAA4B,CAACqB,EAAE,CAAC;IAC5F;IACA;IACA,OAAQ,KAAIA,EAAE,CAAC3B,IAAK,IAAGwD,IAAK,IAAG3C,gBAAiB,GAAEI,gBAAgB,CAACU,EAAE,CAAE,EAAC;EAC1E;EAEA,IAAI,IAAAoD,gCAAgB,EAACpD,EAAE,CAAC,EAAE;IACxB,MAAMqD,iBAAiB,GAAG,IAAAC,yCAAyB,EAACtD,EAAE,CAAC,CAAC,CAAC;IACzD,IAAIiD,mBAAmB,GAAG,CAAC,IAAII,iBAAiB,KAAKJ,mBAAmB,EAAE;MACxE;MACA,MAAMM,OAAO,GAAGvD,EAAE,CAAC1B,KAAK,CAACM,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC;MAClD,OAAQ,KAAIoB,EAAE,CAAC3B,IAAK,IAAGkF,OAAQ,EAAC;IAClC;IACA,OAAO,EAAE,CAAC,CAAC;EACb;;EACA,OAAQ,IAAG,IAAArD,uBAAgB,EAACF,EAAE,CAAE,EAAC,CAAC,CAAC;AACrC;;AAEO,SAASwD,uBAAuBA,CAAC5D,KAAK,EAAEqD,mBAAmB,GAAG,CAAC,EAAEC,yBAAyB,GAAG,KAAK,EAAEC,wBAAwB,GAAG,KAAK,EAAE;EAC3I,IAAI,WAAW,IAAIvD,KAAK,EAAE;IACxB,MAAMiC,IAAI,GAAGsB,wBAAwB,GAAGJ,iBAAiB,CAACnD,KAAK,CAAC6B,GAAG,CAAC,GAAG7B,KAAK,CAAC6B,GAAG;IAChF,OAAQ,GAAEI,IAAK,IAAGjC,KAAK,CAAC6D,IAAK,GAAE7D,KAAK,CAAC8D,IAAK,GAAEC,2BAA2B,CAAC/D,KAAK,CAAE,EAAC;EAClF;EACA,OAAQ,GAAEA,KAAK,CAAC6B,GAAI,OAAM7B,KAAK,CAACtB,KAAM,EAAC;EAEvC,SAASqF,2BAA2BA,CAAC/D,KAAK,EAAE;IAC1C,OAAOA,KAAK,CAACE,SAAS,CAACmB,GAAG,CAACjB,EAAE,IAAIgD,0BAA0B,CAAChD,EAAE,EAAEJ,KAAK,CAAC6B,GAAG,EAAEwB,mBAAmB,EAAEC,yBAAyB,EAAEC,wBAAwB,CAAC,CAAC,CAACS,IAAI,CAAC,EAAE,CAAC;EAChK;AAEF;AAGA,SAASC,wBAAwBA,CAACnB,MAAM,EAAEoB,0BAA0B,EAAE;EACpE,IAAIA,0BAA0B,KAAK,CAAC,EAAE;IACpC,OAAOA,0BAA0B;EACnC;EACA,MAAMC,cAAc,GAAG,IAAAC,mDAAmC,EAACtB,MAAM,CAAC;EAClE,OAAOqB,cAAc,CAAC9D,MAAM,KAAK,CAAC,GAAG8D,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9D;;AAEO,SAASE,wBAAwBA,CAACvB,MAAM,EAAEoB,0BAA0B,GAAG,CAAC,EAAEZ,yBAAyB,GAAG,KAAK,EAAEH,iBAAiB,GAAG,KAAK,EAAE;EAC7I,MAAME,mBAAmB,GAAGY,wBAAwB,CAACnB,MAAM,EAAEoB,0BAA0B,CAAC;EAExF,IAAApE,cAAO,EAAE,kCAAiCwD,yBAA0B,EAAC,CAAC;EACtE,MAAMgB,OAAO,GAAGxB,MAAM,CAACzB,GAAG,CAACrB,KAAK,IAAI4D,uBAAuB,CAAC5D,KAAK,EAAEqD,mBAAmB,EAAEC,yBAAyB,EAAEH,iBAAiB,CAAC,CAAC;EACtImB,OAAO,CAACC,IAAI,CAAC,CAAC,CAAC,CAAC;EAChB,OAAOD,OAAO,CAACN,IAAI,CAAC,mBAAmB,CAAC;AAC1C;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASQ,aAAaA,CAACC,MAAM,EAAE3B,MAAM,EAAE;EACrC,MAAM4B,eAAe,GAAG5B,MAAM,CAACzB,GAAG,CAACrB,KAAK,IAAI,IAAAuC,oBAAa,EAACvC,KAAK,CAAC,CAAC;EACjE;EACA;EACA,MAAMiB,CAAC,GAAGwD,MAAM,CAAC3B,MAAM,CAAC6B,SAAS,CAAC3E,KAAK,IAAI0E,eAAe,CAAC/B,QAAQ,CAAC,IAAAJ,oBAAa,EAACvC,KAAK,CAAC,CAAC,CAAC;EAC1F,IAAIiB,CAAC,GAAG,CAAC,CAAC,EAAE;IACV,MAAMjB,KAAK,GAAGyE,MAAM,CAAC3B,MAAM,CAAC7B,CAAC,CAAC;IAC9B;IACA,OAAOjB,KAAK;EACd;EACA,OAAOlB,SAAS;AAClB;AAEA,SAAS8F,wBAAwBA,CAAC9B,MAAM,EAAE;EACxC,IAAIA,MAAM,CAACzC,MAAM,GAAG,CAAC,EAAE;IAAE;IACvB,OAAO,KAAK;EACd;EACA,MAAMwE,MAAM,GAAG/B,MAAM,CAAC3C,MAAM,CAAC4C,CAAC,IAAIA,CAAC,CAAClB,GAAG,KAAK,KAAK,CAAC;EAClD,IAAIgD,MAAM,CAACxE,MAAM,KAAK,CAAC,EAAE;IACvB,OAAO,KAAK;EACd;EAEA,MAAM8D,cAAc,GAAG,IAAAC,mDAAmC,EAACtB,MAAM,CAAC;EAClE,IAAIqB,cAAc,CAAC9D,MAAM,KAAK,CAAC,EAAE;IAC/B,OAAO,KAAK;EACd;EAEA,OAAOyC,MAAM,CAACgC,KAAK,CAAC/B,CAAC,IAAI,IAAAgC,uBAAgB,EAAChC,CAAC,EAAE,GAAG,CAAC,CAAC;AACpD;AAEO,SAASiC,wBAAwBA,CAAChF,KAAK,EAAEiF,KAAK,EAAER,MAAM,EAAE;EAC7D;EACA,MAAMS,UAAU,GAAGV,aAAa,CAACC,MAAM,EAAEQ,KAAK,CAAC;EAC/C,IAAIC,UAAU,EAAE;IACd,OAAO,IAAA3C,oBAAa,EAACvC,KAAK,CAAC,KAAK,IAAAuC,oBAAa,EAAC2C,UAAU,CAAC;EAC3D;EACA,OAAO,KAAK;AAEd;AAGO,SAASC,2BAA2BA,CAACnF,KAAK,EAAEyE,MAAM,EAAE;EACzD,MAAM3B,MAAM,GAAGsC,KAAK,CAACpF,KAAK,EAAEyE,MAAM,CAAC;EACnC,MAAMY,UAAU,GAAG,IAAAC,qBAAK,EAACxC,MAAM,EAAE2B,MAAM,CAAC;;EAExC;EACA,IAAIY,UAAU,CAAChF,MAAM,GAAGyC,MAAM,CAACzC,MAAM,EAAE;IACrC,OAAO,EAAE,CAAC,CAAC;EACb;;EACA,OAAOgF,UAAU;AACnB;AAEO,SAASE,2BAA2BA,CAACvF,KAAK,EAAEyE,MAAM,EAAE;EACzD,IAAI,CAACzE,KAAK,CAACE,SAAS,EAAE;IAAE;IACtB,OAAO,KAAK;EACd;EACA,MAAM+E,KAAK,GAAGE,2BAA2B,CAACnF,KAAK,EAAEyE,MAAM,CAAC;EACxD,IAAI,CAACG,wBAAwB,CAACK,KAAK,CAAC,EAAE;IACpC,IAAAnF,cAAO,EAAE,eAAc,IAAA0F,qBAAc,EAACP,KAAK,CAAE,EAAC,CAAC;IAC/C,OAAO,KAAK;EACd;EAEA,OAAOD,wBAAwB,CAAChF,KAAK,EAAEiF,KAAK,EAAER,MAAM,CAAC;AACvD;AAEO,SAASgB,4BAA4BA,CAAChB,MAAM,EAAE;EACnD,OAAOA,MAAM,CAAC3B,MAAM,CAAC3C,MAAM,CAACH,KAAK,IAAIuF,2BAA2B,CAACvF,KAAK,EAAEyE,MAAM,CAAC,CAAC;AAClF;AAEO,SAASiB,8CAA8CA,CAACjB,MAAM,EAAE;EACrE;EACA,MAAMrD,IAAI,GAAGqD,MAAM,CAAC3B,MAAM,CAACzB,GAAG,CAAErB,KAAK,IAAKkB,6CAA6C,CAAClB,KAAK,CAAC,CAAC;EAC/F,OAAOsB,IAAI,CAACC,GAAG,CAAC,GAAGH,IAAI,CAAC;AAC1B;AAGO,SAASgE,KAAKA,CAACpF,KAAK,EAAE2F,eAAe,EAAE;EAAE;EAC9C;EACA,MAAMC,KAAK,GAAG5F,KAAK,CAACE,SAAS,CAACC,MAAM,CAACC,EAAE,IAAI7B,gBAAgB,CAAC6B,EAAE,CAAC,CAAC;EAEhE,IAAIwF,KAAK,CAACvF,MAAM,KAAK,CAAC,EAAE;IACtB,OAAO,CAACL,KAAK,CAAC;EAChB;EACA,IAAAF,cAAO,EAAE,UAAS8F,KAAK,CAACvF,MAAO,EAAC,CAAC;EACjC,MAAMG,iBAAiB,GAAGoF,KAAK,CAACvE,GAAG,CAACjB,EAAE,IAAIrB,4BAA4B,CAACqB,EAAE,CAAC,CAAC,CAACD,MAAM,CAACzB,KAAK,IAAIA,KAAK,KAAKI,SAAS,IAAIJ,KAAK,KAAK,IAAI,CAAC;EAClI,IAAAoB,cAAO,EAACU,iBAAiB,CAACwD,IAAI,CAAC,MAAM,CAAC,CAAC;EAEvC,MAAM6B,cAAc,GAAGF,eAAe,CAACxF,MAAM,CAAC4C,CAAC,IAAIvC,iBAAiB,CAACE,IAAI,CAACoF,CAAC,IAAIrF,wBAAwB,CAACsC,CAAC,EAAE+C,CAAC,CAAC,CAAC,CAAC;EAC/G,IAAAhG,cAAO,EAAE,GAAE,IAAAyC,oBAAa,EAACvC,KAAK,CAAE,yBAAwB6F,cAAc,CAACxF,MAAO,KAAI,CAAC;EACnFwF,cAAc,CAAC/E,OAAO,CAACiC,CAAC,IAAI,IAAAjD,cAAO,EAAC,IAAAyC,oBAAa,EAACQ,CAAC,CAAC,CAAC,CAAC;EACtD,OAAO8C,cAAc;AACvB"}
1
+ {"version":3,"file":"subfield6Utils.js","names":["_subfield8Utils","require","_utils","sf6Regexp","isValidSubfield6","subfield","code","value","match","subfield6GetTag","substring","undefined","subfield6GetOccurrenceNumber","replace","subfield6GetOccurrenceNumberAsInteger","index","result","parseInt","subfield6ResetOccurrenceNumber","occurrenceNumber","occurrenceNumberAsString","intToOccurrenceNumberString","newValue","subfield6GetTail","subfield6HasWantedTagAndOccurrenceNumber","tagAndOccurrenceNumber","key","nvdebug","fieldGetUnambiguousTag","field","tags","subfields","filter","sf","length","subfieldToString","fieldGetUnambiguousOccurrenceNumber","occurrenceNumbers","fieldHasOccurrenceNumber","some","fieldResetOccurrenceNumber","newOccurrenceNumber","oldOccurrenceNumber","forEach","innerReset","currOccurrenceNumber","i","fieldGetMaxSubfield6OccurrenceNumberAsInteger","sf6s","vals","map","Math","max","fieldHasWantedTagAndOccurrenceNumber","fieldHasValidSubfield6","isSubfield6Pair","otherField","tagsArePairable6","tag","fieldIndex","otherFieldIndex","tag1","tag2","subfieldSevenToOneOccurrenceNumber","fieldSevenToOneOccurrenceNumber","fieldGetOccurrenceNumberPairs","candFields","pairs","fieldToString","pairedField","fieldGetOccurrenceNumbers","subfieldExtractOccurrenceNumber","includes","push","fieldsGetOccurrenceNumbers","fields","f","fieldProcessOccurrenceNumbers","newOccurrenceNumbers","is7XX","normalizeEntryTag","subfieldToNormalizedString","targetLinkingNumber","normalizeOccurrenceNumber","normalizeEntryTagBoolean","isValidSubfield8","currLinkingNumber","getSubfield8LinkingNumber","normVal","fieldToNormalizedString","ind1","ind2","formatAndNormalizeSubfields","join","guessTargetLinkingNumber","defaultTargetLinkingNumber","linkingNumbers","fieldsGetAllSubfield8LinkingNumbers","fieldsToNormalizedString","strings","sort","getFirstField","record","fieldsAsStrings","findIndex","isRelevantSubfield6Chain","non880","every","fieldHasSubfield","fieldIsFirstFieldInChain","chain","firstField","getAllLinkedSubfield6Fields","get6s","moreFields","add8s","isFirstLinkedSubfield6Field","fieldsToString","recordGetSubfield6ChainHeads","recordGetMaxSubfield6OccurrenceNumberAsInteger","candidateFields","sixes","relevantFields","o"],"sources":["../src/subfield6Utils.js"],"sourcesContent":["// import createDebugLogger from 'debug';\n// const debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/subfield6Utils');\n\nimport {add8s, fieldsGetAllSubfield8LinkingNumbers, getSubfield8LinkingNumber, isValidSubfield8} from './subfield8Utils';\nimport {fieldHasSubfield, fieldToString, fieldsToString, nvdebug, subfieldToString} from './utils';\n\n// NB! Subfield 6 is non-repeatable and it should always comes first!\n// NB! Index size should always be 2 (preceding 0 required for 01..09) However, support for 100+ was added on 2023-02-27.\n// NB! Index value '00' are left as they are (is not paired/indexed/whatever.\nconst sf6Regexp = /^[0-9][0-9][0-9]-(?:[0-9][0-9]|[1-9][0-9]+)(?:[^0-9].*)?$/u;\n\nexport function isValidSubfield6(subfield) {\n if (subfield.code !== '6') {\n return false;\n }\n return subfield.value.match(sf6Regexp);\n}\n\nfunction subfield6GetTag(subfield) {\n if (isValidSubfield6(subfield)) {\n return subfield.value.substring(0, 3);\n }\n return undefined;\n}\n\nexport function subfield6GetOccurrenceNumber(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.substring(4).replace(/\\D.*$/u, '');\n }\n return undefined;\n}\n\nexport function subfield6GetOccurrenceNumberAsInteger(subfield) {\n const index = subfield6GetOccurrenceNumber(subfield);\n if (index === undefined || index === '00') {\n return 0;\n }\n const result = parseInt(index, 10);\n //nvdebug(`SF6: ${subfield.value} => ${index} => ${result}`, debug);\n return result;\n}\n\nexport function subfield6ResetOccurrenceNumber(subfield, occurrenceNumber) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n const occurrenceNumberAsString = typeof occurrenceNumber === 'number' ? intToOccurrenceNumberString(occurrenceNumber) : occurrenceNumber;\n\n const newValue = subfield.value.substring(0, 4) + occurrenceNumberAsString + subfield6GetTail(subfield); // eslint-disable-line functional/immutable-data\n //nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`);\n subfield.value = newValue; // eslint-disable-line functional/immutable-data\n}\n\n\nfunction subfield6GetTail(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.replace(/^\\d+-\\d+/u, '');\n }\n return '';\n}\n\nexport function subfield6HasWantedTagAndOccurrenceNumber(subfield, tagAndOccurrenceNumber) {\n if (subfield.code !== '6') {\n return false;\n }\n // We could also use generic code and go getTag()+'-'+getIndex() instead of regexp...\n const key = subfield.value.replace(/^([0-9][0-9][0-9]-[0-9][0-9]+).*$/u, '$1'); // eslint-disable-line prefer-named-capture-group\n nvdebug(` Compare '${key}' vs '${tagAndOccurrenceNumber}'`);\n return key === tagAndOccurrenceNumber;\n}\n\n// <= SUBFIELD, FIELD =>\n\nexport function fieldGetUnambiguousTag(field) {\n const tags = field.subfields.filter(sf => subfield6GetTag(sf));\n if (tags.length === 1) {\n nvdebug(` GOT ${tags.length} tag(s): ${subfieldToString(tags[0])}`);\n return subfield6GetTag(tags[0]);\n }\n return undefined;\n}\n\nexport function fieldGetUnambiguousOccurrenceNumber(field) {\n const occurrenceNumbers = field.subfields.filter(sf => subfield6GetOccurrenceNumber(sf));\n if (occurrenceNumbers.length === 1) {\n return subfield6GetOccurrenceNumber(occurrenceNumbers[0]);\n }\n return undefined;\n}\n\nexport function fieldHasOccurrenceNumber(field, occurrenceNumber) {\n //nvdebug(`${occurrenceNumber} vs ${fieldToString(field)}`);\n return field.subfields && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber);\n}\n\nexport function fieldResetOccurrenceNumber(field, newOccurrenceNumber, oldOccurrenceNumber = undefined) {\n field.subfields.forEach(subfield => innerReset(subfield));\n\n function innerReset(subfield) {\n // (Optional) Check that this is really the occurrence number we wan't to reseot\n if (oldOccurrenceNumber !== undefined) {\n const currOccurrenceNumber = subfield6GetOccurrenceNumber(subfield);\n if (currOccurrenceNumber !== oldOccurrenceNumber) {\n return;\n }\n }\n subfield6ResetOccurrenceNumber(subfield, newOccurrenceNumber);\n }\n}\n\nexport function intToOccurrenceNumberString(i) {\n return i < 10 ? `0${i}` : `${i}`;\n}\n\nexport function fieldGetMaxSubfield6OccurrenceNumberAsInteger(field) {\n // used by reducer!\n //nvdebug(`Checking subfields $6 from ${JSON.stringify(field)}`);\n const sf6s = field.subfields ? field.subfields.filter(subfield => isValidSubfield6(subfield)) : [];\n if (sf6s.length === 0) {\n return 0;\n }\n // There should always be one, but here we check every subfield.\n //nvdebug(`Got ${field.subfields} $6-subfield(s) from ${JSON.stringify(field)}`, debug);\n const vals = sf6s.map(sf => subfield6GetOccurrenceNumberAsInteger(sf));\n return Math.max(...vals);\n}\n\n\nexport function fieldHasWantedTagAndOccurrenceNumber(field, tagAndOccurrenceNumber) {\n return field.subfields && field.subfields.some(sf => subfield6HasWantedTagAndOccurrenceNumber(sf, tagAndOccurrenceNumber));\n}\n\n\n/*\nexport function getFieldsWithGivenOccurrenceNumberSubfield6(record, occurrenceNumberAsString) {\n const record.fields.filter(field => field\n\n function fieldHasIndex(field, index) {\n if (!field.subfields) {\n return false;\n }\n return field.subfields.find(sf => isValidSubfield6(sf) && subfieldGetOccurrenceNumber6(sf) === index);\n }\n}\n*/\n\n\nexport function fieldHasValidSubfield6(field) {\n return field.subfields && field.subfields.some(sf => isValidSubfield6(sf));\n}\n\n\nfunction isSubfield6Pair(field, otherField) {\n // No need to log this:\n //nvdebug(`LOOK for $6-pair:\\n ${fieldToString(field)}\\n ${fieldToString(otherField)}`);\n if (!fieldHasValidSubfield6(field) || !fieldHasValidSubfield6(otherField)) {\n return false;\n }\n\n if (!tagsArePairable6(field.tag, otherField.tag)) {\n //nvdebug(` FAILED. REASON: TAGS NOT PAIRABLE!`);\n return false;\n }\n\n\n const fieldIndex = fieldGetUnambiguousOccurrenceNumber(field);\n if (fieldIndex === undefined || fieldIndex === '00') {\n //nvdebug(` FAILED. REASON: NO INDEX FOUND`);\n return false;\n }\n\n const otherFieldIndex = fieldGetUnambiguousOccurrenceNumber(otherField);\n\n\n if (fieldIndex !== otherFieldIndex) {\n //nvdebug(` FAILURE: INDEXES: ${fieldIndex} vs ${otherFieldIndex}`);\n return false;\n }\n\n if (fieldGetUnambiguousTag(field) !== otherField.tag || field.tag !== fieldGetUnambiguousTag(otherField)) {\n //nvdebug(` FAILURE: TAG vs $6 TAG`);\n return false;\n }\n return true;\n\n function tagsArePairable6(tag1, tag2) {\n // How to do XOR operation in one line? Well, this is probably more readable...\n if (tag1 === '880' && tag2 === '880') {\n return false;\n }\n if (tag1 !== '880' && tag2 !== '880') {\n return false;\n }\n return true;\n }\n}\n\n\nfunction subfieldSevenToOneOccurrenceNumber(subfield) {\n if (subfield.code !== '6' || subfield.value.substring(0, 1) !== '7') {\n return;\n }\n subfield.value = `1${subfield.value.substring(1)}`; // eslint-disable-line functional/immutable-data\n}\n\nexport function fieldSevenToOneOccurrenceNumber(field) {\n if (field.tag !== '880') {\n return;\n }\n field.subfields.forEach(sf => subfieldSevenToOneOccurrenceNumber(sf));\n}\n\n\nexport function fieldGetOccurrenceNumberPairs(field, candFields) {\n // NB! TAG!=880 returns 880 fields, TAG==880 returns non-880 field\n //nvdebug(` Trying to finds pair for ${fieldToString(field)} in ${candFields.length} fields`);\n const pairs = candFields.filter(otherField => isSubfield6Pair(field, otherField));\n if (pairs.length === 0) {\n nvdebug(`NO PAIRS FOUND FOR '${fieldToString(field)}'`);\n return pairs;\n }\n nvdebug(`${pairs.length} PAIR(S) FOUND FOR '${fieldToString(field)}'`);\n pairs.forEach(pairedField => nvdebug(` '${fieldToString(pairedField)}'`));\n return pairs;\n}\n\nexport function fieldGetOccurrenceNumbers(field) {\n /* eslint-disable */\n let occurrenceNumbers = [];\n field.subfields?.forEach(sf => subfieldExtractOccurrenceNumber(sf));\n\n function subfieldExtractOccurrenceNumber(sf) {\n if (!isValidSubfield6(sf)) {\n return;\n }\n const occurrenceNumber = subfield6GetOccurrenceNumber(sf);\n if (occurrenceNumber === '00' || occurrenceNumbers.includes(occurrenceNumber)) {\n return;\n }\n occurrenceNumbers.push(occurrenceNumber);\n }\n /* eslint-enable */\n return occurrenceNumbers;\n}\n\nexport function fieldsGetOccurrenceNumbers(fields) {\n /* eslint-disable */\n let occurrenceNumbers = [];\n\n fields.forEach(f => fieldProcessOccurrenceNumbers(f));\n\n function fieldProcessOccurrenceNumbers(f) {\n const newOccurrenceNumbers = fieldGetOccurrenceNumbers(f);\n newOccurrenceNumbers.forEach(occurrenceNumber => {\n if (!occurrenceNumbers.includes(occurrenceNumber)) {\n occurrenceNumbers.push(occurrenceNumber);\n }\n\n });\n }\n /* eslint-enable */\n return occurrenceNumbers;\n}\n\n/*\nexport function fieldGetSubfield6Pair(field, record) {\n const pairedFields = record.fields.filter(otherField => isSubfield6Pair(field, otherField));\n if (pairedFields.length !== 1) {\n return undefined;\n }\n // NB! It is theoretically possible to have multiple pairable 880 fields (one for each encoding)\n nvdebug(`fieldGetSubfield6Pair(): ${fieldToString(field)} => ${fieldToString(pairedFields[0])}`);\n return pairedFields[0];\n}\n*/\n\n/*\nexport function pairAndStringify6(field, record) {\n const pair6 = fieldGetSubfield6Pair(field, record);\n if (!pair6) {\n return fieldToNormalizedString(field);\n }\n return fieldsToNormalizedString([field, pair6]);\n}\n*/\n\n// Frequencly list for $6 subfields in 1XX/7XX fields:\n// 231115 100\n// 183832 700\n// 28773 710\n// 2047 711\n// 661 110\n// 341 111\n// 284 130\n// 63 730\n// Thus there's a real risk of ending up with, say, identical 100 vs 700 chains.\n// Semi-hackily support 1XX/7XX-version: 7XX can be deleted if corresponding 1XX exists:\n\nexport function is7XX(tag) {\n return ['700', '710', '711', '730'].includes(tag);\n}\n\n\nfunction normalizeEntryTag(tag) {\n if (tag.match(/^[17](?:00|10|11|30)$/u)) {\n return `X${tag.substring(1)}`;\n }\n return tag;\n}\n\nfunction subfieldToNormalizedString(sf, tag, targetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTagBoolean = false) {\n // targetLinkingNumber refers to $8.\n // normalizeEntryTagBoolean refers to 1XX/7XX tag values in subfield $6 value.\n if (isValidSubfield6(sf)) { // && targetLinkingNumber === 0) {\n // 1XX/7XX (entry tag) normalization:\n const tag2 = normalizeEntryTagBoolean ? normalizeEntryTag(tag) : tag;\n\n const occurrenceNumber = normalizeOccurrenceNumber ? 'XX' : subfield6GetOccurrenceNumber(sf);\n // If we are normalizing a $8 chain, don't normalize $6 occurrence number!\n // Replace $6 occurrence number with XX:\n return ` ‡${sf.code} ${tag2}-${occurrenceNumber}${subfield6GetTail(sf)}`;\n }\n\n if (isValidSubfield8(sf)) {\n const currLinkingNumber = getSubfield8LinkingNumber(sf); //getSubfield8Index(sf);\n if (targetLinkingNumber > 0 && currLinkingNumber === targetLinkingNumber) {\n // For $8 we should only XX the index we are looking at...\n const normVal = sf.value.replace(/^[0-9]+/u, 'XX');\n return ` ‡${sf.code} ${normVal}`;\n }\n return ''; // Other $8 subfields are meaningless in this context\n }\n return ` ${subfieldToString(sf)}`; // `‡${sf.code} ${sf.value}`;\n}\n\nexport function fieldToNormalizedString(field, targetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTagBoolean = false) {\n if ('subfields' in field) {\n const tag2 = normalizeEntryTagBoolean ? normalizeEntryTag(field.tag) : field.tag;\n return `${tag2} ${field.ind1}${field.ind2}${formatAndNormalizeSubfields(field)}`;\n }\n return `${field.tag} ${field.value}`;\n\n function formatAndNormalizeSubfields(field) {\n return field.subfields.map(sf => subfieldToNormalizedString(sf, field.tag, targetLinkingNumber, normalizeOccurrenceNumber, normalizeEntryTagBoolean)).join('');\n }\n\n}\n\n\nfunction guessTargetLinkingNumber(fields, defaultTargetLinkingNumber) {\n if (defaultTargetLinkingNumber !== 0) {\n return defaultTargetLinkingNumber;\n }\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fields);\n return linkingNumbers.length === 1 ? linkingNumbers[0] : 0; // eslint-disable-line no-param-reassign\n}\n\nexport function fieldsToNormalizedString(fields, defaultTargetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTag = false) {\n const targetLinkingNumber = guessTargetLinkingNumber(fields, defaultTargetLinkingNumber);\n\n nvdebug(`fieldsToNormalizedString: OCC: ${normalizeOccurrenceNumber}`);\n const strings = fields.map(field => fieldToNormalizedString(field, targetLinkingNumber, normalizeOccurrenceNumber, normalizeEntryTag));\n strings.sort(); // eslint-disable-line functional/immutable-data\n return strings.join('\\t__SEPARATOR__\\t');\n}\n\n\n/*\n\nexport function removeField6IfNeeded(field, record, fieldsAsString) {\n const pairField = fieldGetSubfield6Pair(field, record);\n const asString = pairField ? fieldsToNormalizedString([field, pairField]) : fieldToNormalizedString(field);\n nvdebug(`SOURCE: ${asString} -- REALITY: ${fieldToString(field)}`);\n const tmp = pairField ? fieldToString(pairField) : 'HUTI';\n nvdebug(`PAIR: ${tmp}`);\n nvdebug(`BASE:\\n ${fieldsAsString.join('\\n ')}`);\n if (!fieldsAsString.includes(asString)) {\n return;\n }\n nvdebug(`Duplicate $6 removal: ${fieldToString(field)}`);\n record.removeField(field);\n\n if (pairField === undefined) {\n return;\n }\n nvdebug(`Duplicate $6 removal (pair): ${fieldToString(pairField)}`);\n record.removeField(pairField);\n}\n*/\n\nfunction getFirstField(record, fields) {\n const fieldsAsStrings = fields.map(field => fieldToString(field));\n //record.fields.forEach((field, i) => nvdebug(`${i}:\\t${fieldToString(field)}`));\n //nvdebug(`getFirstField: ${fieldsAsStrings.join('\\t')}`);\n const i = record.fields.findIndex(field => fieldsAsStrings.includes(fieldToString(field)));\n if (i > -1) {\n const field = record.fields[i];\n //nvdebug(`1st F: ${i + 1}/${record.fields.length} ${fieldToString(field)}`);\n return field;\n }\n return undefined;\n}\n\nfunction isRelevantSubfield6Chain(fields) {\n if (fields.length < 2) { // 1 non-880-field and 1+ 880 fields\n return false;\n }\n const non880 = fields.filter(f => f.tag !== '880');\n if (non880.length !== 1) {\n return false;\n }\n\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fields);\n if (linkingNumbers.length !== 0) {\n return false;\n }\n\n return fields.every(f => fieldHasSubfield(f, '6'));\n}\n\nexport function fieldIsFirstFieldInChain(field, chain, record) {\n // Interpretation of first: position of field in record (however, we might have a duplicate field. See tests...)\n const firstField = getFirstField(record, chain);\n if (firstField) {\n return fieldToString(field) === fieldToString(firstField);\n }\n return false;\n\n}\n\n\nexport function getAllLinkedSubfield6Fields(field, record) {\n const fields = get6s(field, record);\n const moreFields = add8s(fields, record);\n\n // Currently we don't handle fields with more than one $6 and/or $8 subfield.\n if (moreFields.length > fields.length) {\n return []; // Don't fix!\n }\n return moreFields;\n}\n\nexport function isFirstLinkedSubfield6Field(field, record) {\n if (!field.subfields) { // Is not a datafield\n return false;\n }\n const chain = getAllLinkedSubfield6Fields(field, record);\n if (!isRelevantSubfield6Chain(chain)) {\n nvdebug(`Rejected 6: ${fieldsToString(chain)}`);\n return false;\n }\n\n return fieldIsFirstFieldInChain(field, chain, record);\n}\n\nexport function recordGetSubfield6ChainHeads(record) {\n return record.fields.filter(field => isFirstLinkedSubfield6Field(field, record));\n}\n\nexport function recordGetMaxSubfield6OccurrenceNumberAsInteger(record) {\n // Should we cache the value here?\n const vals = record.fields.map((field) => fieldGetMaxSubfield6OccurrenceNumberAsInteger(field));\n return Math.max(...vals);\n}\n\n\nexport function get6s(field, candidateFields) { // NB! Convert field to fields!!!\n // Get all fields with given occurence number\n const sixes = field.subfields.filter(sf => isValidSubfield6(sf));\n\n if (sixes.length === 0) {\n return [field];\n }\n nvdebug(`SIXES: ${sixes.length}`);\n const occurrenceNumbers = sixes.map(sf => subfield6GetOccurrenceNumber(sf)).filter(value => value !== undefined && value !== '00');\n nvdebug(occurrenceNumbers.join(' -- '));\n\n const relevantFields = candidateFields.filter(f => occurrenceNumbers.some(o => fieldHasOccurrenceNumber(f, o)));\n nvdebug(`${fieldToString(field)}: $6-RELFIELDS FOUND: ${relevantFields.length}...`);\n relevantFields.forEach(f => nvdebug(fieldToString(f)));\n return relevantFields;\n}\n\n"],"mappings":"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"}
@@ -70,7 +70,6 @@ function fieldsGetAllSubfield8LinkingNumbers(fields) {
70
70
  return subfield8LinkingNumbers;
71
71
  /* eslint-enable */
72
72
  }
73
-
74
73
  function recordGetAllSubfield8LinkingNumbers(record) {
75
74
  return fieldsGetAllSubfield8LinkingNumbers(record.fields);
76
75
  }
@@ -92,7 +91,6 @@ function add8s(fields, record) {
92
91
  fields = fields.concat(addableFields); // eslint-disable-line functional/immutable-data, no-param-reassign
93
92
  }
94
93
  }
95
-
96
94
  function fieldHasValidSubfield8(field) {
97
95
  return field.subfields && field.subfields.some(sf => isValidSubfield8(sf));
98
96
  }
@@ -1 +1 @@
1
- {"version":3,"file":"subfield8Utils.js","names":["_utils","require","sf8Regexp","isValidSubfield8","subfield","code","match","value","length","getSubfield8Value","undefined","getSubfield8LinkingNumber","parseInt","fieldHasLinkingNumber","field","linkingNumber","subfields","some","sf","recordGetFieldsWithSubfield8LinkingNumber","record","fields","filter","fieldsGetAllSubfield8LinkingNumbers","subfield8LinkingNumbers","forEach","includes","nvdebug","push","recordGetAllSubfield8LinkingNumbers","add8s","linkingNumbers","join","number","collectLinkingNumberFields","f","fieldToString","addableFields","concat","fieldHasValidSubfield8"],"sources":["../src/subfield8Utils.js"],"sourcesContent":["// import createDebugLogger from 'debug';\n// const debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/subfield8Utils');\n\nimport {fieldToString, nvdebug} from './utils';\n\nconst sf8Regexp = /^([1-9][0-9]*)(?:\\.[0-9]+)?(?:\\\\[acprux])?$/u; // eslint-disable-line prefer-named-capture-group\n\nexport function isValidSubfield8(subfield) {\n if (subfield.code !== '8') {\n return false;\n }\n\n //nvdebug(` IS VALID $8? '${subfieldToString(subfield)}'`);\n const match = subfield.value.match(sf8Regexp);\n //nvdebug(` IS VALID $8? '${subfieldToString(subfield)}' vs ${match.length}}`);\n return match && match.length > 0;\n}\n\nfunction getSubfield8Value(subfield) {\n if (!isValidSubfield8(subfield)) {\n return undefined;\n }\n return subfield.value;\n}\n\nexport function getSubfield8LinkingNumber(subfield) {\n const value = getSubfield8Value(subfield);\n if (value === undefined) {\n return 0;\n }\n return parseInt(value, 10);\n}\n\n\nexport function fieldHasLinkingNumber(field, linkingNumber) {\n if (!field.subfields) {\n return false;\n }\n return field.subfields.some(sf => getSubfield8LinkingNumber(sf) === linkingNumber);\n}\n\nexport function recordGetFieldsWithSubfield8LinkingNumber(record, linkingNumber) {\n if (linkingNumber < 1) {\n return;\n }\n return record.fields.filter(field => fieldHasLinkingNumber(field, linkingNumber));\n}\n\n\nexport function fieldsGetAllSubfield8LinkingNumbers(fields) {\n /* eslint-disable */\n let subfield8LinkingNumbers = [];\n fields.forEach(field => {\n if (!field.subfields) {\n return;\n }\n field.subfields.forEach(sf => {\n const linkingNumber = getSubfield8LinkingNumber(sf);\n if (linkingNumber > 0 && !subfield8LinkingNumbers.includes(linkingNumber)) {\n nvdebug(` LINK8: Add subfield \\$8 ${linkingNumber} to seen values list`);\n subfield8LinkingNumbers.push(linkingNumber);\n }\n });\n });\n\n return subfield8LinkingNumbers;\n /* eslint-enable */\n\n}\n\nexport function recordGetAllSubfield8LinkingNumbers(record) {\n return fieldsGetAllSubfield8LinkingNumbers(record.fields);\n}\n\n\nexport function add8s(fields, record) {\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fields);\n if (linkingNumbers.length === 0) {\n return fields;\n }\n\n nvdebug(`Linking number(s): ${linkingNumbers.join(', ')}`);\n linkingNumbers.forEach(number => collectLinkingNumberFields(number));\n\n fields.forEach(f => nvdebug(`AFTER ADDING 8s: '${fieldToString(f)}'`));\n\n return fields;\n\n function collectLinkingNumberFields(linkingNumber) {\n // Remove existing hits (to avoid field repetition):\n fields = fields.filter(f => !fieldHasLinkingNumber(f, linkingNumber)); // eslint-disable-line functional/immutable-data, no-param-reassign\n // Add them and their \"sisters\" back:\n const addableFields = record.fields.filter(f => fieldHasLinkingNumber(f, linkingNumber));\n addableFields.forEach(f => nvdebug(`(RE-?)ADD ${fieldToString(f)}`));\n fields = fields.concat(addableFields); // eslint-disable-line functional/immutable-data, no-param-reassign\n\n }\n}\n\nexport function fieldHasValidSubfield8(field) {\n return field.subfields && field.subfields.some(sf => isValidSubfield8(sf));\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"subfield8Utils.js","names":["_utils","require","sf8Regexp","isValidSubfield8","subfield","code","match","value","length","getSubfield8Value","undefined","getSubfield8LinkingNumber","parseInt","fieldHasLinkingNumber","field","linkingNumber","subfields","some","sf","recordGetFieldsWithSubfield8LinkingNumber","record","fields","filter","fieldsGetAllSubfield8LinkingNumbers","subfield8LinkingNumbers","forEach","includes","nvdebug","push","recordGetAllSubfield8LinkingNumbers","add8s","linkingNumbers","join","number","collectLinkingNumberFields","f","fieldToString","addableFields","concat","fieldHasValidSubfield8"],"sources":["../src/subfield8Utils.js"],"sourcesContent":["// import createDebugLogger from 'debug';\n// const debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/subfield8Utils');\n\nimport {fieldToString, nvdebug} from './utils';\n\nconst sf8Regexp = /^([1-9][0-9]*)(?:\\.[0-9]+)?(?:\\\\[acprux])?$/u; // eslint-disable-line prefer-named-capture-group\n\nexport function isValidSubfield8(subfield) {\n if (subfield.code !== '8') {\n return false;\n }\n\n //nvdebug(` IS VALID $8? '${subfieldToString(subfield)}'`);\n const match = subfield.value.match(sf8Regexp);\n //nvdebug(` IS VALID $8? '${subfieldToString(subfield)}' vs ${match.length}}`);\n return match && match.length > 0;\n}\n\nfunction getSubfield8Value(subfield) {\n if (!isValidSubfield8(subfield)) {\n return undefined;\n }\n return subfield.value;\n}\n\nexport function getSubfield8LinkingNumber(subfield) {\n const value = getSubfield8Value(subfield);\n if (value === undefined) {\n return 0;\n }\n return parseInt(value, 10);\n}\n\n\nexport function fieldHasLinkingNumber(field, linkingNumber) {\n if (!field.subfields) {\n return false;\n }\n return field.subfields.some(sf => getSubfield8LinkingNumber(sf) === linkingNumber);\n}\n\nexport function recordGetFieldsWithSubfield8LinkingNumber(record, linkingNumber) {\n if (linkingNumber < 1) {\n return;\n }\n return record.fields.filter(field => fieldHasLinkingNumber(field, linkingNumber));\n}\n\n\nexport function fieldsGetAllSubfield8LinkingNumbers(fields) {\n /* eslint-disable */\n let subfield8LinkingNumbers = [];\n fields.forEach(field => {\n if (!field.subfields) {\n return;\n }\n field.subfields.forEach(sf => {\n const linkingNumber = getSubfield8LinkingNumber(sf);\n if (linkingNumber > 0 && !subfield8LinkingNumbers.includes(linkingNumber)) {\n nvdebug(` LINK8: Add subfield \\$8 ${linkingNumber} to seen values list`);\n subfield8LinkingNumbers.push(linkingNumber);\n }\n });\n });\n\n return subfield8LinkingNumbers;\n /* eslint-enable */\n\n}\n\nexport function recordGetAllSubfield8LinkingNumbers(record) {\n return fieldsGetAllSubfield8LinkingNumbers(record.fields);\n}\n\n\nexport function add8s(fields, record) {\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fields);\n if (linkingNumbers.length === 0) {\n return fields;\n }\n\n nvdebug(`Linking number(s): ${linkingNumbers.join(', ')}`);\n linkingNumbers.forEach(number => collectLinkingNumberFields(number));\n\n fields.forEach(f => nvdebug(`AFTER ADDING 8s: '${fieldToString(f)}'`));\n\n return fields;\n\n function collectLinkingNumberFields(linkingNumber) {\n // Remove existing hits (to avoid field repetition):\n fields = fields.filter(f => !fieldHasLinkingNumber(f, linkingNumber)); // eslint-disable-line functional/immutable-data, no-param-reassign\n // Add them and their \"sisters\" back:\n const addableFields = record.fields.filter(f => fieldHasLinkingNumber(f, linkingNumber));\n addableFields.forEach(f => nvdebug(`(RE-?)ADD ${fieldToString(f)}`));\n fields = fields.concat(addableFields); // eslint-disable-line functional/immutable-data, no-param-reassign\n\n }\n}\n\nexport function fieldHasValidSubfield8(field) {\n return field.subfields && field.subfields.some(sf => isValidSubfield8(sf));\n}\n"],"mappings":"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"}
@@ -91,7 +91,6 @@ function normalizeSubfieldValues(field) {
91
91
  field.subfields.forEach((subfield, index) => {
92
92
  field.subfields[index].value = getNormalizedValue(subfield, field); // eslint-disable-line functional/immutable-data
93
93
  });
94
-
95
94
  return field;
96
95
  }
97
96
  //# sourceMappingURL=subfieldValueNormalizations.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"subfieldValueNormalizations.js","names":["_clone","_interopRequireDefault","require","_utils","obj","__esModule","default","_default","description","validate","fix","record","res","message","valid","fields","forEach","field","normalizeSubfieldValues","validateField","length","subfields","orig","fieldToString","normalizedField","clone","mod","push","handleInitials","value","subfieldCode","ind1","includes","tag","fieldHasSubfield","i","initialsInRow","replace","str","match","getNormalizedValue","subfield","code","index"],"sources":["../src/subfieldValueNormalizations.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldHasSubfield, fieldToString} from './utils';\n\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Fix various subfield internal values',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n record.fields.forEach(field => {\n normalizeSubfieldValues(field);\n });\n\n // message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n record.fields.forEach(field => {\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validateField(field, res) {\n if (!field.subfields) {\n return;\n }\n const orig = fieldToString(field);\n\n const normalizedField = normalizeSubfieldValues(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`'${orig}' requires subfield internal mods/normalization`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n}\n\n\nfunction handleInitials(value, subfieldCode, field) {\n // MRA-267/273\n /* eslint-disable */\n if (field.ind1 === '1' && subfieldCode === 'a' && ['100', '600', '700', '800'].includes(field.tag) && !fieldHasSubfield(field, '0')) {\n // Fix MRA-267/273 (partial): Handle the most common case(s). (And extend them rules later on if the need arises):\n // No longest initial sequence I've seen is six (in a Sri Lankan name).\n for (var i=0; i < 6 && initialsInRow(value); i++) {\n // NB: Regexp has ','. Everything before it belongs to the surname. Everything after it is free game.\n value = value.replace(/(,.*) ([A-Z]|Å|Ö|Ö)\\.([A-Z]|Å|Ö|Ö)/u, '$1 $2. $3');\n }\n }\n\n return value;\n\n /* eslint-enable */\n function initialsInRow(str) {\n // initial space confirms us that it's an initial\n return str.match(/ (?:[A-Z]|Å|Ä|Ö)\\.(?:[A-Z]|Å|Ä|Ö)/u);\n }\n\n}\nfunction getNormalizedValue(subfield, field) {\n /* eslint-disable */\n let value = subfield.value;\n value = handleInitials(value, subfield.code, field);\n\n\n if (subfield.code === 'a' && ['130', '630', '730'].includes(field.tag)) {\n // MRA-614: \"(elokuva, 2000)\" => \"(elokuva : 2000)\"\"\n return value.replace(/\\((elokuva), (19[0-9][0-9]|20[0-2][0-9])\\)/u, '($1 : $2)'); // eslint-disable-line prefer-named-capture-group\n }\n /* eslint-enable */\n return value;\n}\n\nfunction normalizeSubfieldValues(field) {\n if (!field.subfields) {\n return field;\n }\n field.subfields.forEach((subfield, index) => {\n field.subfields[index].value = getNormalizedValue(subfield, field); // eslint-disable-line functional/immutable-data\n });\n return field;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"subfieldValueNormalizations.js","names":["_clone","_interopRequireDefault","require","_utils","obj","__esModule","default","_default","description","validate","fix","record","res","message","valid","fields","forEach","field","normalizeSubfieldValues","validateField","length","subfields","orig","fieldToString","normalizedField","clone","mod","push","handleInitials","value","subfieldCode","ind1","includes","tag","fieldHasSubfield","i","initialsInRow","replace","str","match","getNormalizedValue","subfield","code","index"],"sources":["../src/subfieldValueNormalizations.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldHasSubfield, fieldToString} from './utils';\n\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Fix various subfield internal values',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n record.fields.forEach(field => {\n normalizeSubfieldValues(field);\n });\n\n // message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n record.fields.forEach(field => {\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validateField(field, res) {\n if (!field.subfields) {\n return;\n }\n const orig = fieldToString(field);\n\n const normalizedField = normalizeSubfieldValues(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`'${orig}' requires subfield internal mods/normalization`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n}\n\n\nfunction handleInitials(value, subfieldCode, field) {\n // MRA-267/273\n /* eslint-disable */\n if (field.ind1 === '1' && subfieldCode === 'a' && ['100', '600', '700', '800'].includes(field.tag) && !fieldHasSubfield(field, '0')) {\n // Fix MRA-267/273 (partial): Handle the most common case(s). (And extend them rules later on if the need arises):\n // No longest initial sequence I've seen is six (in a Sri Lankan name).\n for (var i=0; i < 6 && initialsInRow(value); i++) {\n // NB: Regexp has ','. Everything before it belongs to the surname. Everything after it is free game.\n value = value.replace(/(,.*) ([A-Z]|Å|Ö|Ö)\\.([A-Z]|Å|Ö|Ö)/u, '$1 $2. $3');\n }\n }\n\n return value;\n\n /* eslint-enable */\n function initialsInRow(str) {\n // initial space confirms us that it's an initial\n return str.match(/ (?:[A-Z]|Å|Ä|Ö)\\.(?:[A-Z]|Å|Ä|Ö)/u);\n }\n\n}\nfunction getNormalizedValue(subfield, field) {\n /* eslint-disable */\n let value = subfield.value;\n value = handleInitials(value, subfield.code, field);\n\n\n if (subfield.code === 'a' && ['130', '630', '730'].includes(field.tag)) {\n // MRA-614: \"(elokuva, 2000)\" => \"(elokuva : 2000)\"\"\n return value.replace(/\\((elokuva), (19[0-9][0-9]|20[0-2][0-9])\\)/u, '($1 : $2)'); // eslint-disable-line prefer-named-capture-group\n }\n /* eslint-enable */\n return value;\n}\n\nfunction normalizeSubfieldValues(field) {\n if (!field.subfields) {\n return field;\n }\n field.subfields.forEach((subfield, index) => {\n field.subfields[index].value = getNormalizedValue(subfield, field); // eslint-disable-line functional/immutable-data\n });\n return field;\n}\n"],"mappings":"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"}
@@ -10,6 +10,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
10
10
  //import createDebugLogger from 'debug';
11
11
 
12
12
  //const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes);
13
+
13
14
  // Author(s): Nicholas Volk, Joni Ollila
14
15
  function _default() {
15
16
  return {
@@ -95,7 +96,6 @@ function _default() {
95
96
  //field.value = field.value.replace(/^(?:v...)s/u, `${1}v`); // eslint-disable-line functional/immutable-data, no-template-curly-in-string
96
97
  field.value = `${field.value.substring(0, 4)}v${field.value.substring(5)}`; // eslint-disable-line functional/immutable-data
97
98
  }
98
-
99
99
  function convert007DvdToBluray(field) {
100
100
  if (!fieldIsDvd007(field)) {
101
101
  return;
@@ -103,7 +103,6 @@ function _default() {
103
103
  //field.value = field.value.replace(/^(?:v...)v/u, `${1}s`); // eslint-disable-line functional/immutable-data
104
104
  field.value = `${field.value.substring(0, 4)}s${field.value.substring(5)}`; // eslint-disable-line functional/immutable-data
105
105
  }
106
-
107
106
  function fixField(field, record) {
108
107
  if (field.tag !== '007') {
109
108
  return field;
@@ -1 +1 @@
1
- {"version":3,"file":"sync-007-and-300.js","names":["_utils","require","_clone","_interopRequireDefault","obj","__esModule","default","_default","description","validate","fix","record","res","message","valid","fields","forEach","f","fixField","field","validateField","length","tag","orig","fieldToString","normalizedField","clone","mod","push","fieldIsBluray007","value","match","fieldIsDvd007","fieldIsBluray300","subfields","some","subfield","fieldIsDvd300","recordHasBluray300","recordHasDvd300","convert007BlurayToDvd","substring","convert007DvdToBluray"],"sources":["../src/sync-007-and-300.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils';\nimport clone from 'clone';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes);\n\n// Author(s): Nicholas Volk, Joni Ollila\nexport default function () {\n\n return {\n description: 'Validator for updating mismatching f007 based on f300 (DVD/Bluray) (MRA-613)',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n record.fields.forEach(f => fixField(f, record));\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n record.fields.forEach(field => {\n validateField(field, res, record);\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validateField(field, res, record) {\n if (field.tag !== '007') {\n return;\n }\n const orig = fieldToString(field);\n\n const normalizedField = fixField(clone(field), record);\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`FIXABLE: '${orig}' => '${mod}'`); // eslint-disable-line functional/immutable-data\n return;\n }\n\n /*\n if (fieldHasUnfixableStuff(field)) {\n res.message.push(`CAN'T BE FIXED AUTOMATICALLY: '${orig}'`); // eslint-disable-line functional/immutable-data\n return;\n }\n */\n return;\n }\n\n function fieldIsBluray007(field) {\n if (field.tag !== '007') {\n return false;\n }\n return field.value.match(/^v...s/u);\n }\n\n function fieldIsDvd007(field) {\n if (field.tag !== '007') {\n return false;\n }\n return field.value.match(/^v...v/u);\n }\n\n function fieldIsBluray300(field) {\n if (field.tag !== '300') {\n return false;\n }\n return field.subfields.some(subfield => subfield.value.match(/(?:Blu.?ray|BD)/ui));\n }\n\n function fieldIsDvd300(field) {\n if (field.tag !== '300') {\n return false;\n }\n return field.subfields.some(subfield => subfield.value.match(/DVD/ui));\n }\n\n function recordHasBluray300(record) {\n return record.fields.some(f => fieldIsBluray300(f));\n }\n\n function recordHasDvd300(record) {\n return record.fields.some(f => fieldIsDvd300(f));\n }\n\n function convert007BlurayToDvd(field) {\n if (!fieldIsBluray007(field)) {\n return;\n }\n //field.value = field.value.substring(0, 4) + 's' + field.value.substring(5); // eslint-disable-line functional/immutable-data\n //field.value = field.value.replace(/^(?:v...)s/u, `${1}v`); // eslint-disable-line functional/immutable-data, no-template-curly-in-string\n field.value = `${field.value.substring(0, 4)}v${field.value.substring(5)}`; // eslint-disable-line functional/immutable-data\n }\n\n function convert007DvdToBluray(field) {\n if (!fieldIsDvd007(field)) {\n return;\n }\n //field.value = field.value.replace(/^(?:v...)v/u, `${1}s`); // eslint-disable-line functional/immutable-data\n field.value = `${field.value.substring(0, 4)}s${field.value.substring(5)}`; // eslint-disable-line functional/immutable-data\n }\n\n function fixField(field, record) {\n if (field.tag !== '007') {\n return field;\n }\n\n if (fieldIsDvd007(field) && recordHasBluray300(record) && !recordHasDvd300(record)) {\n // FIX 007: DVD -> Blu-ray\n convert007DvdToBluray(field);\n return field;\n }\n\n if (fieldIsBluray007(field) && recordHasDvd300(record) && !recordHasBluray300(record)) {\n // FIX 007: Blu-Ray -> DVD\n convert007BlurayToDvd(field);\n return field;\n }\n\n return field;\n }\n\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"sync-007-and-300.js","names":["_utils","require","_clone","_interopRequireDefault","obj","__esModule","default","_default","description","validate","fix","record","res","message","valid","fields","forEach","f","fixField","field","validateField","length","tag","orig","fieldToString","normalizedField","clone","mod","push","fieldIsBluray007","value","match","fieldIsDvd007","fieldIsBluray300","subfields","some","subfield","fieldIsDvd300","recordHasBluray300","recordHasDvd300","convert007BlurayToDvd","substring","convert007DvdToBluray"],"sources":["../src/sync-007-and-300.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils';\nimport clone from 'clone';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes);\n\n// Author(s): Nicholas Volk, Joni Ollila\nexport default function () {\n\n return {\n description: 'Validator for updating mismatching f007 based on f300 (DVD/Bluray) (MRA-613)',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n record.fields.forEach(f => fixField(f, record));\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n record.fields.forEach(field => {\n validateField(field, res, record);\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validateField(field, res, record) {\n if (field.tag !== '007') {\n return;\n }\n const orig = fieldToString(field);\n\n const normalizedField = fixField(clone(field), record);\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`FIXABLE: '${orig}' => '${mod}'`); // eslint-disable-line functional/immutable-data\n return;\n }\n\n /*\n if (fieldHasUnfixableStuff(field)) {\n res.message.push(`CAN'T BE FIXED AUTOMATICALLY: '${orig}'`); // eslint-disable-line functional/immutable-data\n return;\n }\n */\n return;\n }\n\n function fieldIsBluray007(field) {\n if (field.tag !== '007') {\n return false;\n }\n return field.value.match(/^v...s/u);\n }\n\n function fieldIsDvd007(field) {\n if (field.tag !== '007') {\n return false;\n }\n return field.value.match(/^v...v/u);\n }\n\n function fieldIsBluray300(field) {\n if (field.tag !== '300') {\n return false;\n }\n return field.subfields.some(subfield => subfield.value.match(/(?:Blu.?ray|BD)/ui));\n }\n\n function fieldIsDvd300(field) {\n if (field.tag !== '300') {\n return false;\n }\n return field.subfields.some(subfield => subfield.value.match(/DVD/ui));\n }\n\n function recordHasBluray300(record) {\n return record.fields.some(f => fieldIsBluray300(f));\n }\n\n function recordHasDvd300(record) {\n return record.fields.some(f => fieldIsDvd300(f));\n }\n\n function convert007BlurayToDvd(field) {\n if (!fieldIsBluray007(field)) {\n return;\n }\n //field.value = field.value.substring(0, 4) + 's' + field.value.substring(5); // eslint-disable-line functional/immutable-data\n //field.value = field.value.replace(/^(?:v...)s/u, `${1}v`); // eslint-disable-line functional/immutable-data, no-template-curly-in-string\n field.value = `${field.value.substring(0, 4)}v${field.value.substring(5)}`; // eslint-disable-line functional/immutable-data\n }\n\n function convert007DvdToBluray(field) {\n if (!fieldIsDvd007(field)) {\n return;\n }\n //field.value = field.value.replace(/^(?:v...)v/u, `${1}s`); // eslint-disable-line functional/immutable-data\n field.value = `${field.value.substring(0, 4)}s${field.value.substring(5)}`; // eslint-disable-line functional/immutable-data\n }\n\n function fixField(field, record) {\n if (field.tag !== '007') {\n return field;\n }\n\n if (fieldIsDvd007(field) && recordHasBluray300(record) && !recordHasDvd300(record)) {\n // FIX 007: DVD -> Blu-ray\n convert007DvdToBluray(field);\n return field;\n }\n\n if (fieldIsBluray007(field) && recordHasDvd300(record) && !recordHasBluray300(record)) {\n // FIX 007: Blu-Ray -> DVD\n convert007BlurayToDvd(field);\n return field;\n }\n\n return field;\n }\n\n}\n"],"mappings":"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"}
@@ -127,7 +127,6 @@ function _default() {
127
127
  });
128
128
  });
129
129
  }
130
-
131
130
  function getFields(fields) {
132
131
  return fields.filter(field => {
133
132
  if ('subfields' in field) {
@@ -1 +1 @@
1
- {"version":3,"file":"unicode-decomposition.js","names":["MAP_CONVERSION","å","ä","ö","Å","Ä","Ö","á","à","â","ã","ć","č","ç","é","è","ê","ẽ","ë","í","ì","î","ĩ","ï","ñ","ó","ò","ô","õ","ś","š","ú","ù","û","ü","ũ","ý","ỳ","ŷ","ỹ","ÿ","ž","Á","À","Â","Ã","É","È","Ê","Ẽ","Ë","Í","Ì","Î","Ĩ","Ï","Ñ","Ó","Ò","Ô","Õ","Ś","Ú","Ù","Û","Ũ","Ü","Ý","Ỳ","Ŷ","Ỹ","Ÿ","_default","PATTERN","Object","keys","reduce","result","key","index","list","length","RegExp","description","validate","fix","record","codes","getFields","fields","map","field","subfields","filter","subfield","test","value","code","valid","messages","join","forEach","convert","some","includes","replace"],"sources":["../src/unicode-decomposition.js"],"sourcesContent":["const MAP_CONVERSION = {\n\n /**\n * @internal Normalizations\n **/\n '‐': '-',\n '‑': '-',\n '‒': '-',\n '–': '-',\n '—': '-',\n '―': '-',\n\n /**\n * @internal Normalizations (MELINDA-4172, MELINDA-4175)\n **/\n 'Ⓒ': '©',\n 'Ⓟ': '℗',\n\n /**\n * @internal Precompose å, ä, ö, Å, Ä and Ö\n **/\n å: 'å',\n ä: 'ä',\n ö: 'ö',\n Å: 'Å',\n Ä: 'Ä',\n Ö: 'Ö',\n\n /**\n * @internal Decompose everything else (list incomplete)\n **/\n á: 'á',\n à: 'à',\n â: 'â',\n ã: 'ã',\n ć: 'ć',\n č: 'č',\n ç: 'ç',\n é: 'é',\n è: 'è',\n ê: 'ê',\n ẽ: 'ẽ',\n ë: 'ë',\n í: 'í',\n ì: 'ì',\n î: 'î',\n ĩ: 'ĩ',\n ï: 'ï',\n ñ: 'ñ',\n ó: 'ó',\n ò: 'ò',\n ô: 'ô',\n õ: 'õ',\n ś: 'ś',\n š: 'š',\n ú: 'ú',\n ù: 'ù',\n û: 'û',\n ü: 'ü',\n ũ: 'ũ',\n ý: 'ý',\n ỳ: 'ỳ',\n ŷ: 'ŷ',\n ỹ: 'ỹ',\n ÿ: 'ÿ',\n ž: 'ž',\n Á: 'Á',\n À: 'À',\n Â: 'Â',\n Ã: 'Ã',\n É: 'É',\n È: 'È',\n Ê: 'Ê',\n Ẽ: 'Ẽ',\n Ë: 'Ë',\n Í: 'Í',\n Ì: 'Ì',\n Î: 'Î',\n Ĩ: 'Ĩ',\n Ï: 'Ï',\n Ñ: 'Ñ',\n Ó: 'Ó',\n Ò: 'Ò',\n Ô: 'Ô',\n Õ: 'Õ',\n Ś: 'Ś',\n Ú: 'Ú',\n Ù: 'Ù',\n Û: 'Û',\n Ũ: 'Ũ',\n Ü: 'Ü',\n Ý: 'Ý',\n Ỳ: 'Ỳ',\n Ŷ: 'Ŷ',\n Ỹ: 'Ỹ',\n Ÿ: 'Ÿ'\n};\n\nexport default function () {\n const PATTERN = Object.keys(MAP_CONVERSION).reduce((result, key, index, list) => index === list.length - 1 ? new RegExp(`${result}${key})`, 'u') : `${result}${key}|`, '(');\n\n return {\n description: 'Unicode decomposer',\n validate,\n fix\n };\n\n function validate(record) {\n const codes = getFields(record.fields).map(field => {\n if ('subfields' in field) {\n return field.subfields.filter(subfield => PATTERN.test(subfield.value))\n .map(subfield => subfield.code);\n }\n\n return null;\n });\n return codes.length < 1 ? {valid: true, messages: []} : {valid: false, messages: [`The following subfields are not properly decomposed: ${codes.join(', ')}`]};\n }\n\n function fix(record) {\n getFields(record.fields).forEach(field => {\n field.subfields\n .filter(subfield => PATTERN.test(subfield.value))\n .forEach(subfield => {\n subfield.value = convert(subfield.value); // eslint-disable-line functional/immutable-data\n });\n });\n }\n\n function getFields(fields) {\n return fields.filter(field => {\n if ('subfields' in field) {\n return field.subfields.some(subfield => PATTERN.test(subfield.value));\n }\n\n return null;\n });\n }\n}\n\nexport function convert(value) {\n return Object.keys(MAP_CONVERSION).reduce((result, key) => result.includes(key) ? result.replace(new RegExp(key, 'ug'), MAP_CONVERSION[key]) : result, value);\n}\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"unicode-decomposition.js","names":["MAP_CONVERSION","å","ä","ö","Å","Ä","Ö","á","à","â","ã","ć","č","ç","é","è","ê","ẽ","ë","í","ì","î","ĩ","ï","ñ","ó","ò","ô","õ","ś","š","ú","ù","û","ü","ũ","ý","ỳ","ŷ","ỹ","ÿ","ž","Á","À","Â","Ã","É","È","Ê","Ẽ","Ë","Í","Ì","Î","Ĩ","Ï","Ñ","Ó","Ò","Ô","Õ","Ś","Ú","Ù","Û","Ũ","Ü","Ý","Ỳ","Ŷ","Ỹ","Ÿ","_default","PATTERN","Object","keys","reduce","result","key","index","list","length","RegExp","description","validate","fix","record","codes","getFields","fields","map","field","subfields","filter","subfield","test","value","code","valid","messages","join","forEach","convert","some","includes","replace"],"sources":["../src/unicode-decomposition.js"],"sourcesContent":["const MAP_CONVERSION = {\n\n /**\n * @internal Normalizations\n **/\n '‐': '-',\n '‑': '-',\n '‒': '-',\n '–': '-',\n '—': '-',\n '―': '-',\n\n /**\n * @internal Normalizations (MELINDA-4172, MELINDA-4175)\n **/\n 'Ⓒ': '©',\n 'Ⓟ': '℗',\n\n /**\n * @internal Precompose å, ä, ö, Å, Ä and Ö\n **/\n å: 'å',\n ä: 'ä',\n ö: 'ö',\n Å: 'Å',\n Ä: 'Ä',\n Ö: 'Ö',\n\n /**\n * @internal Decompose everything else (list incomplete)\n **/\n á: 'á',\n à: 'à',\n â: 'â',\n ã: 'ã',\n ć: 'ć',\n č: 'č',\n ç: 'ç',\n é: 'é',\n è: 'è',\n ê: 'ê',\n ẽ: 'ẽ',\n ë: 'ë',\n í: 'í',\n ì: 'ì',\n î: 'î',\n ĩ: 'ĩ',\n ï: 'ï',\n ñ: 'ñ',\n ó: 'ó',\n ò: 'ò',\n ô: 'ô',\n õ: 'õ',\n ś: 'ś',\n š: 'š',\n ú: 'ú',\n ù: 'ù',\n û: 'û',\n ü: 'ü',\n ũ: 'ũ',\n ý: 'ý',\n ỳ: 'ỳ',\n ŷ: 'ŷ',\n ỹ: 'ỹ',\n ÿ: 'ÿ',\n ž: 'ž',\n Á: 'Á',\n À: 'À',\n Â: 'Â',\n Ã: 'Ã',\n É: 'É',\n È: 'È',\n Ê: 'Ê',\n Ẽ: 'Ẽ',\n Ë: 'Ë',\n Í: 'Í',\n Ì: 'Ì',\n Î: 'Î',\n Ĩ: 'Ĩ',\n Ï: 'Ï',\n Ñ: 'Ñ',\n Ó: 'Ó',\n Ò: 'Ò',\n Ô: 'Ô',\n Õ: 'Õ',\n Ś: 'Ś',\n Ú: 'Ú',\n Ù: 'Ù',\n Û: 'Û',\n Ũ: 'Ũ',\n Ü: 'Ü',\n Ý: 'Ý',\n Ỳ: 'Ỳ',\n Ŷ: 'Ŷ',\n Ỹ: 'Ỹ',\n Ÿ: 'Ÿ'\n};\n\nexport default function () {\n const PATTERN = Object.keys(MAP_CONVERSION).reduce((result, key, index, list) => index === list.length - 1 ? new RegExp(`${result}${key})`, 'u') : `${result}${key}|`, '(');\n\n return {\n description: 'Unicode decomposer',\n validate,\n fix\n };\n\n function validate(record) {\n const codes = getFields(record.fields).map(field => {\n if ('subfields' in field) {\n return field.subfields.filter(subfield => PATTERN.test(subfield.value))\n .map(subfield => subfield.code);\n }\n\n return null;\n });\n return codes.length < 1 ? {valid: true, messages: []} : {valid: false, messages: [`The following subfields are not properly decomposed: ${codes.join(', ')}`]};\n }\n\n function fix(record) {\n getFields(record.fields).forEach(field => {\n field.subfields\n .filter(subfield => PATTERN.test(subfield.value))\n .forEach(subfield => {\n subfield.value = convert(subfield.value); // eslint-disable-line functional/immutable-data\n });\n });\n }\n\n function getFields(fields) {\n return fields.filter(field => {\n if ('subfields' in field) {\n return field.subfields.some(subfield => PATTERN.test(subfield.value));\n }\n\n return null;\n });\n }\n}\n\nexport function convert(value) {\n return Object.keys(MAP_CONVERSION).reduce((result, key) => result.includes(key) ? result.replace(new RegExp(key, 'ug'), MAP_CONVERSION[key]) : result, value);\n}\n\n"],"mappings":"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"}
@@ -8,6 +8,7 @@ var _utils = require("./utils");
8
8
  //import createDebugLogger from 'debug';
9
9
 
10
10
  //const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/update-field-540');
11
+
11
12
  // Author(s): Nicholas Volk
12
13
  function _default() {
13
14
  return {
@@ -95,7 +96,6 @@ function fixC(field, subfieldC) {
95
96
  'value': 'cc'
96
97
  }); // eslint-disable-line functional/immutable-data
97
98
  }
98
-
99
99
  function fieldHasOldCcLicense(field, fix) {
100
100
  if (field.tag !== '540') {
101
101
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"update-field-540.js","names":["_utils","require","_default","description","validate","fix","record","fixedFields","getFieldsThatUseOldFormat","fixedFieldsAsStrings","map","f","fieldToString","message","valid","yeOldeFields","length","messages","licences","findSubfieldIndex","field","subfield","nvtmp","index","subfields","findIndex","sf","validLicenseInSubfieldC","subfieldC","license","code","value","validUrlInSubfieldU","subfieldU","url","fixC","splice","fieldHasOldCcLicense","tag","validLicense","find","some","subfieldsC","filter","forEach","c","fields"],"sources":["../src/update-field-540.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/update-field-540');\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Validator for field 540 (modernization as per MELKEHITYS-2431)',\n validate, fix\n };\n\n function fix(record) {\n const fixedFields = getFieldsThatUseOldFormat(record, true);\n\n const fixedFieldsAsStrings = fixedFields.map(f => fieldToString(f));\n\n return {message: [], fix: fixedFieldsAsStrings, valid: true};\n }\n\n function validate(record) {\n const yeOldeFields = getFieldsThatUseOldFormat(record, false);\n if (yeOldeFields.length === 0) {\n return {'message': [], 'valid': true};\n }\n const messages = yeOldeFields.map(f => fieldToString(f));\n\n return {'message': messages, 'valid': false};\n }\n\n}\n\n\nconst licences = [\n {'license': 'CC BY 4.0', 'url': 'https://creativecommons.org/licenses/by/4.0/deed.fi'},\n {'license': 'CC BY-NC 4.0', 'url': 'https://creativecommons.org/licenses/by-nc/4.0/deed.fi'},\n {'license': 'CC BY-NC-ND 4.0', 'url': 'https://creativecommons.org/licenses/by-nc-nd/4.0/deed.fi'},\n {'license': 'CC BY-NC-SA 4.0', 'url': 'https://creativecommons.org/licenses/by-nc-sa/4.0/deed.fi'},\n {'license': 'CC BY-ND 4.0', 'url': 'https://creativecommons.org/licenses/by-nd/4.0/deed.fi'},\n {'license': 'CC BY-SA 4.0', 'url': 'https://creativecommons.org/licenses/by-sa/4.0/deed.fi'},\n {'license': 'CC0 1.0', 'url': 'https://creativecommons.org/publicdomain/zero/1.0/deed.fi'}, // not seen/unused\n {'license': 'Public domain', 'url': 'https://creativecommons.org/publicdomain/mark/1.0/deed.fi'}\n];\n\nfunction findSubfieldIndex(field, subfield) {\n subfield.nvtmp = 1; // eslint-disable-line functional/immutable-data\n const index = field.subfields.findIndex(sf => sf.nvtmp === 1);\n delete subfield.nvtmp; // eslint-disable-line functional/immutable-data\n return index;\n}\n\nfunction validLicenseInSubfieldC(subfieldC, license) {\n if (subfieldC.code !== 'c') {\n return false;\n }\n //nvdebug(`Compare ${subfieldC.value} vs ${license.license}`);\n return license.license === subfieldC.value;\n}\n\nfunction validUrlInSubfieldU(subfieldU, license) {\n if (subfieldU.code !== 'u') {\n return false;\n }\n //nvdebug(`Compare ${subfieldU.value} vs ${license.url}`);\n return license.url === subfieldU.value;\n}\n\n\nfunction fixC(field, subfieldC) {\n // MELINDA-2431_\n subfieldC.code = 'f'; // eslint-disable-line functional/immutable-data\n const index = findSubfieldIndex(field, subfieldC);\n field.subfields.splice(index + 1, 0, {'code': '2', 'value': 'cc'}); // eslint-disable-line functional/immutable-data\n}\n\nfunction fieldHasOldCcLicense(field, fix) {\n if (field.tag !== '540') {\n return false;\n }\n //nvdebug(`NORM 540: ${fieldToString(field)}`);\n const validLicense = licences.find(license => field.subfields.some(sf => validLicenseInSubfieldC(sf, license)) && field.subfields.some(sf => validUrlInSubfieldU(sf, license)));\n if (!validLicense) {\n return false;\n }\n //nvdebug(` Found valid license`);\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n const subfieldsC = field.subfields.filter(sf => validLicenseInSubfieldC(sf, validLicense));\n subfieldsC.forEach(c => fixC(field, c));\n }\n\n return true;\n}\n\n\nfunction getFieldsThatUseOldFormat(record, fix) {\n return record.fields.filter(f => fieldHasOldCcLicense(f, fix));\n}\n\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AADA;;AAGA;AAEA;AACe,SAAAC,SAAA,EAAY;EAEzB,OAAO;IACLC,WAAW,EAAE,gEAAgE;IAC7EC,QAAQ;IAAEC;EACZ,CAAC;EAED,SAASA,GAAGA,CAACC,MAAM,EAAE;IACnB,MAAMC,WAAW,GAAGC,yBAAyB,CAACF,MAAM,EAAE,IAAI,CAAC;IAE3D,MAAMG,oBAAoB,GAAGF,WAAW,CAACG,GAAG,CAACC,CAAC,IAAI,IAAAC,oBAAa,EAACD,CAAC,CAAC,CAAC;IAEnE,OAAO;MAACE,OAAO,EAAE,EAAE;MAAER,GAAG,EAAEI,oBAAoB;MAAEK,KAAK,EAAE;IAAI,CAAC;EAC9D;EAEA,SAASV,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAMS,YAAY,GAAGP,yBAAyB,CAACF,MAAM,EAAE,KAAK,CAAC;IAC7D,IAAIS,YAAY,CAACC,MAAM,KAAK,CAAC,EAAE;MAC7B,OAAO;QAAC,SAAS,EAAE,EAAE;QAAE,OAAO,EAAE;MAAI,CAAC;IACvC;IACA,MAAMC,QAAQ,GAAGF,YAAY,CAACL,GAAG,CAACC,CAAC,IAAI,IAAAC,oBAAa,EAACD,CAAC,CAAC,CAAC;IAExD,OAAO;MAAC,SAAS,EAAEM,QAAQ;MAAE,OAAO,EAAE;IAAK,CAAC;EAC9C;AAEF;AAGA,MAAMC,QAAQ,GAAG,CACf;EAAC,SAAS,EAAE,WAAW;EAAE,KAAK,EAAE;AAAqD,CAAC,EACtF;EAAC,SAAS,EAAE,cAAc;EAAE,KAAK,EAAE;AAAwD,CAAC,EAC5F;EAAC,SAAS,EAAE,iBAAiB;EAAE,KAAK,EAAE;AAA2D,CAAC,EAClG;EAAC,SAAS,EAAE,iBAAiB;EAAE,KAAK,EAAE;AAA2D,CAAC,EAClG;EAAC,SAAS,EAAE,cAAc;EAAE,KAAK,EAAE;AAAwD,CAAC,EAC5F;EAAC,SAAS,EAAE,cAAc;EAAE,KAAK,EAAE;AAAwD,CAAC,EAC5F;EAAC,SAAS,EAAE,SAAS;EAAE,KAAK,EAAE;AAA2D,CAAC;AAAE;AAC5F;EAAC,SAAS,EAAE,eAAe;EAAE,KAAK,EAAE;AAA2D,CAAC,CACjG;AAED,SAASC,iBAAiBA,CAACC,KAAK,EAAEC,QAAQ,EAAE;EAC1CA,QAAQ,CAACC,KAAK,GAAG,CAAC,CAAC,CAAC;EACpB,MAAMC,KAAK,GAAGH,KAAK,CAACI,SAAS,CAACC,SAAS,CAACC,EAAE,IAAIA,EAAE,CAACJ,KAAK,KAAK,CAAC,CAAC;EAC7D,OAAOD,QAAQ,CAACC,KAAK,CAAC,CAAC;EACvB,OAAOC,KAAK;AACd;AAEA,SAASI,uBAAuBA,CAACC,SAAS,EAAEC,OAAO,EAAE;EACnD,IAAID,SAAS,CAACE,IAAI,KAAK,GAAG,EAAE;IAC1B,OAAO,KAAK;EACd;EACA;EACA,OAAOD,OAAO,CAACA,OAAO,KAAKD,SAAS,CAACG,KAAK;AAC5C;AAEA,SAASC,mBAAmBA,CAACC,SAAS,EAAEJ,OAAO,EAAE;EAC/C,IAAII,SAAS,CAACH,IAAI,KAAK,GAAG,EAAE;IAC1B,OAAO,KAAK;EACd;EACA;EACA,OAAOD,OAAO,CAACK,GAAG,KAAKD,SAAS,CAACF,KAAK;AACxC;AAGA,SAASI,IAAIA,CAACf,KAAK,EAAEQ,SAAS,EAAE;EAC9B;EACAA,SAAS,CAACE,IAAI,GAAG,GAAG,CAAC,CAAC;EACtB,MAAMP,KAAK,GAAGJ,iBAAiB,CAACC,KAAK,EAAEQ,SAAS,CAAC;EACjDR,KAAK,CAACI,SAAS,CAACY,MAAM,CAACb,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE;IAAC,MAAM,EAAE,GAAG;IAAE,OAAO,EAAE;EAAI,CAAC,CAAC,CAAC,CAAC;AACtE;;AAEA,SAASc,oBAAoBA,CAACjB,KAAK,EAAEf,GAAG,EAAE;EACxC,IAAIe,KAAK,CAACkB,GAAG,KAAK,KAAK,EAAE;IACvB,OAAO,KAAK;EACd;EACA;EACA,MAAMC,YAAY,GAAGrB,QAAQ,CAACsB,IAAI,CAACX,OAAO,IAAIT,KAAK,CAACI,SAAS,CAACiB,IAAI,CAACf,EAAE,IAAIC,uBAAuB,CAACD,EAAE,EAAEG,OAAO,CAAC,CAAC,IAAIT,KAAK,CAACI,SAAS,CAACiB,IAAI,CAACf,EAAE,IAAIM,mBAAmB,CAACN,EAAE,EAAEG,OAAO,CAAC,CAAC,CAAC;EAC/K,IAAI,CAACU,YAAY,EAAE;IACjB,OAAO,KAAK;EACd;EACA;EACA,IAAIlC,GAAG,EAAE;IAAE;IACT,MAAMqC,UAAU,GAAGtB,KAAK,CAACI,SAAS,CAACmB,MAAM,CAACjB,EAAE,IAAIC,uBAAuB,CAACD,EAAE,EAAEa,YAAY,CAAC,CAAC;IAC1FG,UAAU,CAACE,OAAO,CAACC,CAAC,IAAIV,IAAI,CAACf,KAAK,EAAEyB,CAAC,CAAC,CAAC;EACzC;EAEA,OAAO,IAAI;AACb;AAGA,SAASrC,yBAAyBA,CAACF,MAAM,EAAED,GAAG,EAAE;EAC9C,OAAOC,MAAM,CAACwC,MAAM,CAACH,MAAM,CAAChC,CAAC,IAAI0B,oBAAoB,CAAC1B,CAAC,EAAEN,GAAG,CAAC,CAAC;AAChE"}
1
+ {"version":3,"file":"update-field-540.js","names":["_utils","require","_default","description","validate","fix","record","fixedFields","getFieldsThatUseOldFormat","fixedFieldsAsStrings","map","f","fieldToString","message","valid","yeOldeFields","length","messages","licences","findSubfieldIndex","field","subfield","nvtmp","index","subfields","findIndex","sf","validLicenseInSubfieldC","subfieldC","license","code","value","validUrlInSubfieldU","subfieldU","url","fixC","splice","fieldHasOldCcLicense","tag","validLicense","find","some","subfieldsC","filter","forEach","c","fields"],"sources":["../src/update-field-540.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/update-field-540');\n\n// Author(s): Nicholas Volk\nexport default function () {\n\n return {\n description: 'Validator for field 540 (modernization as per MELKEHITYS-2431)',\n validate, fix\n };\n\n function fix(record) {\n const fixedFields = getFieldsThatUseOldFormat(record, true);\n\n const fixedFieldsAsStrings = fixedFields.map(f => fieldToString(f));\n\n return {message: [], fix: fixedFieldsAsStrings, valid: true};\n }\n\n function validate(record) {\n const yeOldeFields = getFieldsThatUseOldFormat(record, false);\n if (yeOldeFields.length === 0) {\n return {'message': [], 'valid': true};\n }\n const messages = yeOldeFields.map(f => fieldToString(f));\n\n return {'message': messages, 'valid': false};\n }\n\n}\n\n\nconst licences = [\n {'license': 'CC BY 4.0', 'url': 'https://creativecommons.org/licenses/by/4.0/deed.fi'},\n {'license': 'CC BY-NC 4.0', 'url': 'https://creativecommons.org/licenses/by-nc/4.0/deed.fi'},\n {'license': 'CC BY-NC-ND 4.0', 'url': 'https://creativecommons.org/licenses/by-nc-nd/4.0/deed.fi'},\n {'license': 'CC BY-NC-SA 4.0', 'url': 'https://creativecommons.org/licenses/by-nc-sa/4.0/deed.fi'},\n {'license': 'CC BY-ND 4.0', 'url': 'https://creativecommons.org/licenses/by-nd/4.0/deed.fi'},\n {'license': 'CC BY-SA 4.0', 'url': 'https://creativecommons.org/licenses/by-sa/4.0/deed.fi'},\n {'license': 'CC0 1.0', 'url': 'https://creativecommons.org/publicdomain/zero/1.0/deed.fi'}, // not seen/unused\n {'license': 'Public domain', 'url': 'https://creativecommons.org/publicdomain/mark/1.0/deed.fi'}\n];\n\nfunction findSubfieldIndex(field, subfield) {\n subfield.nvtmp = 1; // eslint-disable-line functional/immutable-data\n const index = field.subfields.findIndex(sf => sf.nvtmp === 1);\n delete subfield.nvtmp; // eslint-disable-line functional/immutable-data\n return index;\n}\n\nfunction validLicenseInSubfieldC(subfieldC, license) {\n if (subfieldC.code !== 'c') {\n return false;\n }\n //nvdebug(`Compare ${subfieldC.value} vs ${license.license}`);\n return license.license === subfieldC.value;\n}\n\nfunction validUrlInSubfieldU(subfieldU, license) {\n if (subfieldU.code !== 'u') {\n return false;\n }\n //nvdebug(`Compare ${subfieldU.value} vs ${license.url}`);\n return license.url === subfieldU.value;\n}\n\n\nfunction fixC(field, subfieldC) {\n // MELINDA-2431_\n subfieldC.code = 'f'; // eslint-disable-line functional/immutable-data\n const index = findSubfieldIndex(field, subfieldC);\n field.subfields.splice(index + 1, 0, {'code': '2', 'value': 'cc'}); // eslint-disable-line functional/immutable-data\n}\n\nfunction fieldHasOldCcLicense(field, fix) {\n if (field.tag !== '540') {\n return false;\n }\n //nvdebug(`NORM 540: ${fieldToString(field)}`);\n const validLicense = licences.find(license => field.subfields.some(sf => validLicenseInSubfieldC(sf, license)) && field.subfields.some(sf => validUrlInSubfieldU(sf, license)));\n if (!validLicense) {\n return false;\n }\n //nvdebug(` Found valid license`);\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n const subfieldsC = field.subfields.filter(sf => validLicenseInSubfieldC(sf, validLicense));\n subfieldsC.forEach(c => fixC(field, c));\n }\n\n return true;\n}\n\n\nfunction getFieldsThatUseOldFormat(record, fix) {\n return record.fields.filter(f => fieldHasOldCcLicense(f, fix));\n}\n\n"],"mappings":"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"}
package/dist/urn.js CHANGED
@@ -86,7 +86,6 @@ function _default(isLegalDeposit = false, useMelindaTemp = true) {
86
86
  });
87
87
  });
88
88
  }
89
-
90
89
  return true;
91
90
 
92
91
  // We should check existence of URN in f024 i1: '7' $2 urn/URN for this too
package/dist/urn.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"urn.js","names":["_nodeFetch","_interopRequireDefault","require","_utils","_debug","obj","__esModule","default","URN_GENERATOR_URL","_default","isLegalDeposit","useMelindaTemp","debug","createDebugLogger","debugData","extend","hasURN","f","tag","subfields","some","code","value","test","description","validate","fix","record","f856sUrn","fields","filter","JSON","stringify","ldSubfields","createLDSubfields","length","generated","createURNSubfield","tempSubField","insertField","ind1","ind2","forEach","ldsf","sf","push","rec","isbn","reduce","acc","a","find","undefined","createURN","response","fetch","body","text","fieldHasLDSubfields","field","every","validateLD","f856sUrnWithLdSubfields","isElectronicMaterial","valid"],"sources":["../src/urn.js"],"sourcesContent":["import fetch from 'node-fetch';\nimport {isElectronicMaterial} from './utils';\nimport createDebugLogger from 'debug';\n\nconst URN_GENERATOR_URL = 'http://generator.urn.fi/cgi-bin/urn_generator.cgi?type=nbn';\n\nexport default function (isLegalDeposit = false, useMelindaTemp = true) {\n const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:urn');\n const debugData = debug.extend('data');\n\n // We should check that the f856 with URN has second indicator '0' (Resource), ' ' (No information provided) or '8' (No display constant generated)\n // - if second indicator is '1' (Version of resource) or '2' (Related resource) the URN in f856 is not correct for the resource described in the record\n\n // This checks only the existence of URNs from the Finnish urn.fi -resolver\n\n const hasURN = f => f.tag === '856' && f.subfields.some(({code, value}) => code === 'u' && (/urn.fi/u).test(value));\n\n return {\n description: 'Adds URN for record, to 856-field (if not existing). If isLegalDeposit is active, adds legal deposit subfields to the f856s with URN.',\n validate,\n fix\n };\n\n async function fix(record) {\n const f856sUrn = record.fields.filter(hasURN);\n debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);\n\n const ldSubfields = isLegalDeposit ? createLDSubfields() : [];\n debugData(`IsLegalDeposit: ${isLegalDeposit}, LegalDepositSubfields: ${JSON.stringify(ldSubfields)}`);\n\n // We add the URN even if we're not getting the legalDeposit - where does this URN resolve?\n // We probably should not do these additions\n\n if (f856sUrn.length === 0) { // eslint-disable-line functional/no-conditional-statements\n const {code, value, generated} = await createURNSubfield(record);\n\n if (generated && useMelindaTemp) {\n const tempSubField = {code: '9', value: 'MELINDA<TEMP>'};\n\n record.insertField({\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code, value}, ...ldSubfields, tempSubField]\n });\n\n return true;\n }\n\n record.insertField({\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code, value}, ...ldSubfields]\n });\n\n return true;\n } else if (isLegalDeposit) { // eslint-disable-line functional/no-conditional-statements\n\n // We add here legal deposit information to all URN-f856s - we probably should not do this\n // We should add extra f856 URN / URNs for legal deposits that already have a open (non-legal-deposit) URN\n // How do we decide which URN to use as a template if there are several URNs\n // We should check for existence of a legal deposit URN anyways\n\n f856sUrn.forEach(f => {\n ldSubfields.forEach(ldsf => {\n if (!f.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value)) { // eslint-disable-line functional/no-conditional-statements\n f.subfields.push(ldsf); // eslint-disable-line functional/immutable-data\n }\n });\n });\n }\n\n return true;\n\n // We should check existence of URN in f024 i1: '7' $2 urn/URN for this too\n\n async function createURNSubfield(rec) {\n // isbn is picked from the last 020 $a in the record\n // what should we do in case of several 020 $a:s\n const isbn = rec.fields.reduce((acc, f) => {\n if (f.tag === '020') {\n const a = f.subfields.find(sf => sf.code === 'a');\n return a ? a.value : undefined;\n }\n\n return acc;\n }, undefined);\n\n debugData(`isbns: ${isbn}`);\n\n const {generated, value} = await createURN(isbn);\n return {code: 'u', value, generated};\n\n async function createURN(isbn = false) {\n if (isbn) {\n return {generated: false, value: `http://urn.fi/URN:ISBN:${isbn}`};\n }\n\n const response = await fetch(URN_GENERATOR_URL);\n const body = await response.text();\n\n // If we generated URN we could also add it to the 024\n // generated 024 should also have $9 MELINDA<TEMP>\n return {generated: true, value: `http://urn.fi/${body}`};\n }\n }\n\n }\n\n // Later when the new subfields that have f506/f540 -type contents, we should add also them here\n function createLDSubfields() {\n return [\n {\n code: 'z',\n value: 'Käytettävissä vapaakappalekirjastoissa'\n },\n {\n code: '5',\n value: 'FI-Vapaa'\n }\n ];\n }\n\n function fieldHasLDSubfields(field, ldSubfields) {\n if (ldSubfields.every(ldsf => field.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value))) {\n return true;\n }\n }\n\n function validateLD(f856sUrn) {\n debug(`Validating the existence of legal deposit subfields`);\n const ldSubfields = createLDSubfields();\n const f856sUrnWithLdSubfields = f856sUrn.filter(field => fieldHasLDSubfields(field, ldSubfields));\n if (f856sUrnWithLdSubfields.length > 0) {\n debug(`Record has ${f856sUrnWithLdSubfields.length} URN fields with all necessary legal deposit subfields`);\n debugData(`f856sUrnWithLdSubfields: ${JSON.stringify(f856sUrnWithLdSubfields)}`);\n return true;\n }\n return false;\n }\n\n function validate(record) {\n // if not electronic skip this validator\n if (!isElectronicMaterial(record)) {\n debug(`Record is not electronic - no need to validate legal deposit URNs`);\n return {valid: true};\n }\n\n const f856sUrn = record.fields.filter(hasURN);\n\n if (f856sUrn.length > 0) {\n debug(`Record has ${f856sUrn.length} URN fields`);\n debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);\n\n if (!isLegalDeposit || validateLD(f856sUrn)) {\n debug(`Record is valid`);\n return {valid: true};\n }\n }\n debug(`No (valid) URN fields - Record is not valid`);\n return {valid: false};\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"urn.js","names":["_nodeFetch","_interopRequireDefault","require","_utils","_debug","obj","__esModule","default","URN_GENERATOR_URL","_default","isLegalDeposit","useMelindaTemp","debug","createDebugLogger","debugData","extend","hasURN","f","tag","subfields","some","code","value","test","description","validate","fix","record","f856sUrn","fields","filter","JSON","stringify","ldSubfields","createLDSubfields","length","generated","createURNSubfield","tempSubField","insertField","ind1","ind2","forEach","ldsf","sf","push","rec","isbn","reduce","acc","a","find","undefined","createURN","response","fetch","body","text","fieldHasLDSubfields","field","every","validateLD","f856sUrnWithLdSubfields","isElectronicMaterial","valid"],"sources":["../src/urn.js"],"sourcesContent":["import fetch from 'node-fetch';\nimport {isElectronicMaterial} from './utils';\nimport createDebugLogger from 'debug';\n\nconst URN_GENERATOR_URL = 'http://generator.urn.fi/cgi-bin/urn_generator.cgi?type=nbn';\n\nexport default function (isLegalDeposit = false, useMelindaTemp = true) {\n const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:urn');\n const debugData = debug.extend('data');\n\n // We should check that the f856 with URN has second indicator '0' (Resource), ' ' (No information provided) or '8' (No display constant generated)\n // - if second indicator is '1' (Version of resource) or '2' (Related resource) the URN in f856 is not correct for the resource described in the record\n\n // This checks only the existence of URNs from the Finnish urn.fi -resolver\n\n const hasURN = f => f.tag === '856' && f.subfields.some(({code, value}) => code === 'u' && (/urn.fi/u).test(value));\n\n return {\n description: 'Adds URN for record, to 856-field (if not existing). If isLegalDeposit is active, adds legal deposit subfields to the f856s with URN.',\n validate,\n fix\n };\n\n async function fix(record) {\n const f856sUrn = record.fields.filter(hasURN);\n debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);\n\n const ldSubfields = isLegalDeposit ? createLDSubfields() : [];\n debugData(`IsLegalDeposit: ${isLegalDeposit}, LegalDepositSubfields: ${JSON.stringify(ldSubfields)}`);\n\n // We add the URN even if we're not getting the legalDeposit - where does this URN resolve?\n // We probably should not do these additions\n\n if (f856sUrn.length === 0) { // eslint-disable-line functional/no-conditional-statements\n const {code, value, generated} = await createURNSubfield(record);\n\n if (generated && useMelindaTemp) {\n const tempSubField = {code: '9', value: 'MELINDA<TEMP>'};\n\n record.insertField({\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code, value}, ...ldSubfields, tempSubField]\n });\n\n return true;\n }\n\n record.insertField({\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code, value}, ...ldSubfields]\n });\n\n return true;\n } else if (isLegalDeposit) { // eslint-disable-line functional/no-conditional-statements\n\n // We add here legal deposit information to all URN-f856s - we probably should not do this\n // We should add extra f856 URN / URNs for legal deposits that already have a open (non-legal-deposit) URN\n // How do we decide which URN to use as a template if there are several URNs\n // We should check for existence of a legal deposit URN anyways\n\n f856sUrn.forEach(f => {\n ldSubfields.forEach(ldsf => {\n if (!f.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value)) { // eslint-disable-line functional/no-conditional-statements\n f.subfields.push(ldsf); // eslint-disable-line functional/immutable-data\n }\n });\n });\n }\n\n return true;\n\n // We should check existence of URN in f024 i1: '7' $2 urn/URN for this too\n\n async function createURNSubfield(rec) {\n // isbn is picked from the last 020 $a in the record\n // what should we do in case of several 020 $a:s\n const isbn = rec.fields.reduce((acc, f) => {\n if (f.tag === '020') {\n const a = f.subfields.find(sf => sf.code === 'a');\n return a ? a.value : undefined;\n }\n\n return acc;\n }, undefined);\n\n debugData(`isbns: ${isbn}`);\n\n const {generated, value} = await createURN(isbn);\n return {code: 'u', value, generated};\n\n async function createURN(isbn = false) {\n if (isbn) {\n return {generated: false, value: `http://urn.fi/URN:ISBN:${isbn}`};\n }\n\n const response = await fetch(URN_GENERATOR_URL);\n const body = await response.text();\n\n // If we generated URN we could also add it to the 024\n // generated 024 should also have $9 MELINDA<TEMP>\n return {generated: true, value: `http://urn.fi/${body}`};\n }\n }\n\n }\n\n // Later when the new subfields that have f506/f540 -type contents, we should add also them here\n function createLDSubfields() {\n return [\n {\n code: 'z',\n value: 'Käytettävissä vapaakappalekirjastoissa'\n },\n {\n code: '5',\n value: 'FI-Vapaa'\n }\n ];\n }\n\n function fieldHasLDSubfields(field, ldSubfields) {\n if (ldSubfields.every(ldsf => field.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value))) {\n return true;\n }\n }\n\n function validateLD(f856sUrn) {\n debug(`Validating the existence of legal deposit subfields`);\n const ldSubfields = createLDSubfields();\n const f856sUrnWithLdSubfields = f856sUrn.filter(field => fieldHasLDSubfields(field, ldSubfields));\n if (f856sUrnWithLdSubfields.length > 0) {\n debug(`Record has ${f856sUrnWithLdSubfields.length} URN fields with all necessary legal deposit subfields`);\n debugData(`f856sUrnWithLdSubfields: ${JSON.stringify(f856sUrnWithLdSubfields)}`);\n return true;\n }\n return false;\n }\n\n function validate(record) {\n // if not electronic skip this validator\n if (!isElectronicMaterial(record)) {\n debug(`Record is not electronic - no need to validate legal deposit URNs`);\n return {valid: true};\n }\n\n const f856sUrn = record.fields.filter(hasURN);\n\n if (f856sUrn.length > 0) {\n debug(`Record has ${f856sUrn.length} URN fields`);\n debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);\n\n if (!isLegalDeposit || validateLD(f856sUrn)) {\n debug(`Record is valid`);\n return {valid: true};\n }\n }\n debug(`No (valid) URN fields - Record is not valid`);\n return {valid: false};\n }\n}\n"],"mappings":"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"}
package/dist/utils.js CHANGED
@@ -28,7 +28,6 @@ function nvdebug(message, func = undefined) {
28
28
  }
29
29
  //console.info(message); // eslint-disable-line no-console
30
30
  }
31
-
32
31
  function fieldHasSubfield(field, subfieldCode, subfieldValue = null) {
33
32
  if (!field.subfields) {
34
33
  return false;
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["isElectronicMaterial","record","f337s","get","some","field","mediaTypeIsC","subfields","sub","code","value","sourceIsRdamedia","nvdebug","message","func","undefined","fieldHasSubfield","subfieldCode","subfieldValue","sf","subfieldToString","normalizeIndicatorValue","val","fieldToString","f","tag","ind1","ind2","formatSubfields","map","join","fieldsToString","fields","nvdebugFieldArray","prefix","forEach","isControlSubfieldCode","includes","getCatalogingLanguage","field040","b","filter","uniqArray","arr","i","indexOf"],"sources":["../src/utils.js"],"sourcesContent":["export function isElectronicMaterial(record) {\n const f337s = record.get('337');\n\n return f337s.some(field => {\n const mediaTypeIsC = field.subfields.some(sub => sub.code === 'b' && sub.value === 'c');\n const sourceIsRdamedia = field.subfields.some(sub => sub.code === '2' && sub.value === 'rdamedia');\n return mediaTypeIsC && sourceIsRdamedia;\n });\n}\n\nexport function nvdebug(message, func = undefined) {\n if (func) { // eslint-disable-line functional/no-conditional-statements\n func(message);\n }\n //console.info(message); // eslint-disable-line no-console\n}\n\nexport function fieldHasSubfield(field, subfieldCode, subfieldValue = null) {\n if (!field.subfields) {\n return false;\n }\n if (subfieldValue === null) {\n return field.subfields.some(sf => sf.code === subfieldCode);\n }\n return field.subfields.some(sf => sf.code === subfieldCode && subfieldValue === sf.value);\n}\n\nexport function subfieldToString(sf) {\n return `‡${sf.code} ${sf.value}`;\n}\n\nfunction normalizeIndicatorValue(val) {\n if (val === ' ') {\n return '#';\n }\n return val;\n}\n\nexport function fieldToString(f) {\n if ('subfields' in f) {\n return `${f.tag} ${normalizeIndicatorValue(f.ind1)}${normalizeIndicatorValue(f.ind2)}${formatSubfields(f)}`;\n }\n return `${f.tag} ${f.value}`;\n\n function formatSubfields(field) {\n return field.subfields.map(sf => ` ${subfieldToString(sf)}`).join('');\n }\n}\n\nexport function fieldsToString(fields) {\n return fields.map(f => fieldToString(f)).join('\\t__SEPARATOR__\\t');\n}\n\nexport function nvdebugFieldArray(fields, prefix = ' ', func = undefined) {\n fields.forEach(field => nvdebug(`${prefix}${fieldToString(field)}`, func));\n}\n\nexport function isControlSubfieldCode(subfieldCode) {\n if (['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'w'].includes(subfieldCode)) {\n return true;\n }\n return false;\n}\n\nexport function getCatalogingLanguage(record) {\n const [field040] = record.get(/^040$/u);\n if (!field040) {\n return null;\n }\n const [b] = field040.subfields.filter(sf => sf.code === 'b');\n if (!b) {\n return null;\n }\n return b.value;\n}\n\n\nexport function uniqArray(arr) {\n return arr.filter((val, i) => arr.indexOf(val) === i);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","names":["isElectronicMaterial","record","f337s","get","some","field","mediaTypeIsC","subfields","sub","code","value","sourceIsRdamedia","nvdebug","message","func","undefined","fieldHasSubfield","subfieldCode","subfieldValue","sf","subfieldToString","normalizeIndicatorValue","val","fieldToString","f","tag","ind1","ind2","formatSubfields","map","join","fieldsToString","fields","nvdebugFieldArray","prefix","forEach","isControlSubfieldCode","includes","getCatalogingLanguage","field040","b","filter","uniqArray","arr","i","indexOf"],"sources":["../src/utils.js"],"sourcesContent":["export function isElectronicMaterial(record) {\n const f337s = record.get('337');\n\n return f337s.some(field => {\n const mediaTypeIsC = field.subfields.some(sub => sub.code === 'b' && sub.value === 'c');\n const sourceIsRdamedia = field.subfields.some(sub => sub.code === '2' && sub.value === 'rdamedia');\n return mediaTypeIsC && sourceIsRdamedia;\n });\n}\n\nexport function nvdebug(message, func = undefined) {\n if (func) { // eslint-disable-line functional/no-conditional-statements\n func(message);\n }\n //console.info(message); // eslint-disable-line no-console\n}\n\nexport function fieldHasSubfield(field, subfieldCode, subfieldValue = null) {\n if (!field.subfields) {\n return false;\n }\n if (subfieldValue === null) {\n return field.subfields.some(sf => sf.code === subfieldCode);\n }\n return field.subfields.some(sf => sf.code === subfieldCode && subfieldValue === sf.value);\n}\n\nexport function subfieldToString(sf) {\n return `‡${sf.code} ${sf.value}`;\n}\n\nfunction normalizeIndicatorValue(val) {\n if (val === ' ') {\n return '#';\n }\n return val;\n}\n\nexport function fieldToString(f) {\n if ('subfields' in f) {\n return `${f.tag} ${normalizeIndicatorValue(f.ind1)}${normalizeIndicatorValue(f.ind2)}${formatSubfields(f)}`;\n }\n return `${f.tag} ${f.value}`;\n\n function formatSubfields(field) {\n return field.subfields.map(sf => ` ${subfieldToString(sf)}`).join('');\n }\n}\n\nexport function fieldsToString(fields) {\n return fields.map(f => fieldToString(f)).join('\\t__SEPARATOR__\\t');\n}\n\nexport function nvdebugFieldArray(fields, prefix = ' ', func = undefined) {\n fields.forEach(field => nvdebug(`${prefix}${fieldToString(field)}`, func));\n}\n\nexport function isControlSubfieldCode(subfieldCode) {\n if (['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'w'].includes(subfieldCode)) {\n return true;\n }\n return false;\n}\n\nexport function getCatalogingLanguage(record) {\n const [field040] = record.get(/^040$/u);\n if (!field040) {\n return null;\n }\n const [b] = field040.subfields.filter(sf => sf.code === 'b');\n if (!b) {\n return null;\n }\n return b.value;\n}\n\n\nexport function uniqArray(arr) {\n return arr.filter((val, i) => arr.indexOf(val) === i);\n}\n"],"mappings":"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"}