@natlibfi/marc-record-validators-melinda 10.16.0 → 10.16.1

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 (131) hide show
  1. package/dist/access-rights.js.map +1 -1
  2. package/dist/access-rights.spec.js.map +1 -1
  3. package/dist/double-commas.js.map +1 -1
  4. package/dist/double-commas.spec.js.map +1 -1
  5. package/dist/duplicates-ind1.js.map +1 -1
  6. package/dist/duplicates-ind1.spec.js.map +1 -1
  7. package/dist/empty-fields.js.map +1 -1
  8. package/dist/empty-fields.spec.js.map +1 -1
  9. package/dist/ending-punctuation-conf.js.map +1 -1
  10. package/dist/ending-punctuation.js.map +1 -1
  11. package/dist/ending-punctuation.spec.js.map +1 -1
  12. package/dist/ending-whitespace.js.map +1 -1
  13. package/dist/ending-whitespace.spec.js.map +1 -1
  14. package/dist/field-008-18-34-character-groups.js.map +1 -1
  15. package/dist/field-008-18-34-character-groups.spec.js.map +1 -1
  16. package/dist/field-505-separators.js.map +1 -1
  17. package/dist/field-505-separators.spec.js.map +1 -1
  18. package/dist/field-521-fix.js.map +1 -1
  19. package/dist/field-521-fix.spec.js.map +1 -1
  20. package/dist/field-exclusion.js.map +1 -1
  21. package/dist/field-exclusion.spec.js.map +1 -1
  22. package/dist/field-structure.js.map +1 -1
  23. package/dist/field-structure.spec.js.map +1 -1
  24. package/dist/fields-present.js.map +1 -1
  25. package/dist/fields-present.spec.js.map +1 -1
  26. package/dist/fix-country-codes.js.map +1 -1
  27. package/dist/fix-country-codes.spec.js.map +1 -1
  28. package/dist/fixRelatorTerms.js.map +1 -1
  29. package/dist/fixRelatorTerms.spec.js.map +1 -1
  30. package/dist/fixed-fields.js.map +1 -1
  31. package/dist/fixed-fields.spec.js.map +1 -1
  32. package/dist/identical-fields.js.map +1 -1
  33. package/dist/identical-fields.spec.js.map +1 -1
  34. package/dist/index.js.map +1 -1
  35. package/dist/indicator-fixes.js.map +1 -1
  36. package/dist/indicator-fixes.spec.js.map +1 -1
  37. package/dist/isbn-issn.js.map +1 -1
  38. package/dist/isbn-issn.spec.js.map +1 -1
  39. package/dist/item-language.js.map +1 -1
  40. package/dist/item-language.spec.js.map +1 -1
  41. package/dist/mergeField500Lisapainokset.js.map +1 -1
  42. package/dist/mergeField500Lisapainokset.spec.js.map +1 -1
  43. package/dist/mergeRelatorTermFields.js.map +1 -1
  44. package/dist/mergeRelatorTermFields.spec.js.map +1 -1
  45. package/dist/multiple-subfield-0.js.map +1 -1
  46. package/dist/multiple-subfield-0.spec.js.map +1 -1
  47. package/dist/non-breaking-space.js.map +1 -1
  48. package/dist/non-breaking-space.spec.js.map +1 -1
  49. package/dist/normalize-dashes.js.map +1 -1
  50. package/dist/normalize-dashes.spec.js.map +1 -1
  51. package/dist/normalize-identifiers.js.map +1 -1
  52. package/dist/normalize-identifiers.spec.js.map +1 -1
  53. package/dist/normalize-qualifying-information.js.map +1 -1
  54. package/dist/normalize-qualifying-information.spec.js.map +1 -1
  55. package/dist/normalize-utf8-diacritics.js.map +1 -1
  56. package/dist/normalize-utf8-diacritics.spec.js.map +1 -1
  57. package/dist/normalizeFieldForComparison.js.map +1 -1
  58. package/dist/normalizeSubfieldValueForComparison.js.map +1 -1
  59. package/dist/prepublicationUtils.js.map +1 -1
  60. package/dist/punctuation/index.js.map +1 -1
  61. package/dist/punctuation/rules/aut.js.map +1 -1
  62. package/dist/punctuation/rules/bib.js.map +1 -1
  63. package/dist/punctuation/rules/index.js.map +1 -1
  64. package/dist/punctuation.spec.js.map +1 -1
  65. package/dist/punctuation2.js +131 -89
  66. package/dist/punctuation2.js.map +1 -1
  67. package/dist/punctuation2.spec.js.map +1 -1
  68. package/dist/reindexSubfield6OccurenceNumbers.js.map +1 -1
  69. package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +1 -1
  70. package/dist/removeDuplicateDataFields.js.map +1 -1
  71. package/dist/removeDuplicateDataFields.spec.js.map +1 -1
  72. package/dist/removeInferiorDataFields.js.map +1 -1
  73. package/dist/removeInferiorDataFields.spec.js.map +1 -1
  74. package/dist/resolvable-ext-references-melinda.js.map +1 -1
  75. package/dist/resolvable-ext-references-melinda.spec.js.map +1 -1
  76. package/dist/resolveOrphanedSubfield6s.js.map +1 -1
  77. package/dist/resolveOrphanedSubfield6s.spec.js.map +1 -1
  78. package/dist/sanitize-vocabulary-source-codes.js.map +1 -1
  79. package/dist/sanitize-vocabulary-source-codes.spec.js.map +1 -1
  80. package/dist/sort-tags.js.map +1 -1
  81. package/dist/sort-tags.spec.js.map +1 -1
  82. package/dist/sortFields.js.map +1 -1
  83. package/dist/sortFields.spec.js.map +1 -1
  84. package/dist/sortRelatorTerms.js.map +1 -1
  85. package/dist/sortRelatorTerms.spec.js.map +1 -1
  86. package/dist/sortSubfields.js.map +1 -1
  87. package/dist/sortSubfields.spec.js.map +1 -1
  88. package/dist/stripPunctuation.js.map +1 -1
  89. package/dist/stripPunctuation.spec.js.map +1 -1
  90. package/dist/subfield-exclusion.js.map +1 -1
  91. package/dist/subfield-exclusion.spec.js.map +1 -1
  92. package/dist/subfield6Utils.js.map +1 -1
  93. package/dist/subfield8Utils.js.map +1 -1
  94. package/dist/subfieldValueNormalizations.js +28 -8
  95. package/dist/subfieldValueNormalizations.js.map +1 -1
  96. package/dist/subfieldValueNormalizations.spec.js.map +1 -1
  97. package/dist/sync-007-and-300.js.map +1 -1
  98. package/dist/sync-007-and-300.spec.js.map +1 -1
  99. package/dist/typeOfDate-008.js.map +1 -1
  100. package/dist/typeOfDate-008.spec.js.map +1 -1
  101. package/dist/unicode-decomposition.js.map +1 -1
  102. package/dist/unicode-decomposition.spec.js.map +1 -1
  103. package/dist/update-field-540.js.map +1 -1
  104. package/dist/update-field-540.spec.js.map +1 -1
  105. package/dist/urn.js.map +1 -1
  106. package/dist/urn.spec.js.map +1 -1
  107. package/dist/utils.js.map +1 -1
  108. package/package.json +6 -6
  109. package/src/punctuation2.js +103 -56
  110. package/src/subfieldValueNormalizations.js +32 -9
  111. package/test-fixtures/normalize-subfield-value/03/expectedResult.json +26 -0
  112. package/test-fixtures/normalize-subfield-value/03/metadata.json +6 -0
  113. package/test-fixtures/normalize-subfield-value/03/record.json +25 -0
  114. package/test-fixtures/normalize-subfield-value/100_and_880/expectedResult.json +22 -0
  115. package/test-fixtures/normalize-subfield-value/100_and_880/metadata.json +5 -0
  116. package/test-fixtures/normalize-subfield-value/100_and_880/record.json +20 -0
  117. package/test-fixtures/punctuation2/100_and_880/expectedResult.json +22 -0
  118. package/test-fixtures/punctuation2/100_and_880/metadata.json +6 -0
  119. package/test-fixtures/punctuation2/100_and_880/record.json +20 -0
  120. package/test-fixtures/punctuation2/240/expectedResult.json +12 -0
  121. package/test-fixtures/punctuation2/240/metadata.json +6 -0
  122. package/test-fixtures/punctuation2/240/record.json +10 -0
  123. package/test-fixtures/punctuation2/800/expectedResult.json +15 -0
  124. package/test-fixtures/punctuation2/800/metadata.json +6 -0
  125. package/test-fixtures/punctuation2/800/record.json +14 -0
  126. package/test-fixtures/strip-punctuation/100_and_880/expectedResult.json +37 -0
  127. package/test-fixtures/strip-punctuation/100_and_880/metadata.json +5 -0
  128. package/test-fixtures/strip-punctuation/100_and_880/record.json +35 -0
  129. package/test-fixtures/strip-punctuation/240/expectedResult.json +16 -0
  130. package/test-fixtures/strip-punctuation/240/metadata.json +6 -0
  131. package/test-fixtures/strip-punctuation/240/record.json +14 -0
@@ -1 +1 @@
1
- {"version":3,"file":"removeInferiorDataFields.js","names":["_debug","_interopRequireDefault","require","_removeDuplicateDataFields","_subfield6Utils","_utils","_subfield8Utils","_prepublicationUtils","_normalizeFieldForComparison","_normalizeUtf8Diacritics","obj","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","removeInferiorDatafields","duplicates","length","deriveInferiorChains","fields","hash","forEach","f","fieldToChainToDeletables","field","chain","fieldToChain","chainAsString","fieldsToNormalizedString","arr","deriveChainDeletables","val","todoList","deletables","stillToDo","undefined","withoutScriptIdentificationCode","replace","keepless","linked490Ind1","filter","isRelevantChain6","fieldHasValidSubfield6","fieldHasValidSubfield8","some","subfields","sf","code","sameField","removeInferiorChains","deletableChainsAsKeys","nChains","Object","keys","innerRemoveInferiorChains","deletedStringsArray","currField","remainingFields","triggeringField","triggeringChain","chainContains1XX","sevenToOne","deletedString","fieldsToString","removeField","tag","substring","includes","pairs","fieldGetOccurrenceNumberPairs","pairedField","fieldSevenToOneOccurrenceNumber","getIdentifierlessAndKeeplessSubsets","fieldAsString","identifierlessString","keeplessString","deriveIndividualDeletables490","match","sixless","withoutFinalVOrX","xless","xvless","modifiedInd2","deriveIndividualDeletables","map","fieldToString","deletableStringsArray","processTodoList","uniqArray","thingsToDo","currString","accentless","getAccentlessVersion","d490","subsets","moreToDo","tmp","tmp2","ennakkotieto653","newDeletables","string","precomposeFinnishLetters","String","fixComposition","fieldToNormalizedString","normalizedField","cloneAndNormalizeFieldForComparison","deriveIndividualNormalizedDeletables","encodingLevel","getEncodingLevel","recordIsFinished","encodingLevelIsBetterThanPrepublication","met495","fieldRefersToKoneellisestiTuotettuTietue","relevantFields","fieldHasSubfield","deriveDeletable946s","results","fieldAsNormalizedString","candArray","removeIndividualInferiorDatafields","deletableFieldsAsStrings","deletableFieldsAsNormalizedStrings","hits","isDeletableField","deletedFieldsAsStrings","removables","removables6","join","removablesAll","concat"],"sources":["../src/removeInferiorDataFields.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldToChain, sameField} from './removeDuplicateDataFields';\nimport {fieldGetOccurrenceNumberPairs, fieldHasValidSubfield6, fieldSevenToOneOccurrenceNumber, fieldsToNormalizedString} from './subfield6Utils';\nimport {fieldHasSubfield, fieldsToString, fieldToString, nvdebug, uniqArray} from './utils';\nimport {fieldHasValidSubfield8} from './subfield8Utils';\nimport {encodingLevelIsBetterThanPrepublication, fieldRefersToKoneellisestiTuotettuTietue, getEncodingLevel} from './prepublicationUtils';\nimport {cloneAndNormalizeFieldForComparison} from './normalizeFieldForComparison';\nimport {fixComposition, precomposeFinnishLetters} from './normalize-utf8-diacritics';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\n// NB! This validator handles only full fields, and does not support subfield $8 removal.\n// Also, having multiple $8 subfields in same fields is not supported.\n// If this functionality is needed, see removeDuplicateDatafields.js for examples of subfield-only stuff.\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:removeSubsetDataFields');\n\nexport default function () {\n return {\n description: 'Remove subset data fields. Certain exceptions apply, mainly too complicated for chained fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix record: remove inferior (eg. subset) data fields', debug);\n const res = {message: [], fix: [], valid: true};\n removeInferiorDatafields(record, true);\n // This can not really fail...\n return res;\n }\n\n function validate(record) {\n // Check max, and check number of different indexes\n nvdebug('Validate record: remove inferior (eg. subset) data fields', debug);\n\n const duplicates = removeInferiorDatafields(record, false);\n\n const res = {message: duplicates};\n\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\nfunction deriveInferiorChains(fields, record) {\n //nvdebug(`======= GOT ${fields.length} FIELDS TO CHAINIFY`);\n const hash = {};\n\n fields.forEach(f => fieldToChainToDeletables(f));\n\n return hash;\n\n //nvdebug(`WP1: GOT ${todoList.length} CHAINS`);\n\n\n // here we map deletableStringObject[str] => field. The idea is to help debugging. We don't actually need the field object...\n //return deriveChainDeletables(todoList);\n\n function fieldToChainToDeletables(field) {\n const chain = fieldToChain(field, record);\n if (chain.length < 2) {\n return;\n }\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n const arr = deriveChainDeletables([chainAsString]);\n //nvdebug(`GOT ${arr.length} DELETABLES FOR ${chainAsString}`);\n arr.forEach(val => {\n if (!(val in hash)) { // eslint-disable-line functional/no-conditional-statements\n hash[val] = field; // eslint-disable-line functional/immutable-data\n }\n });\n }\n\n function deriveChainDeletables(todoList, deletables = []) {\n const [chainAsString, ...stillToDo] = todoList;\n if (chainAsString === undefined) {\n return deletables;\n }\n\n // Fix MRA-476 (part 1): one $6 value can be worse than the other\n const withoutScriptIdentificationCode = chainAsString.replace(/( ‡6 [0-9X][0-9][0-9]-(?:XX|[0-9]+))\\/[^ ]+/u, '$1'); // eslint-disable-line prefer-named-capture-group\n\n // Remove keepless versions:\n const keepless = chainAsString.replace(/ ‡9 [A-Z]+<KEEP>/u, '');\n\n // MRA-433: 490 ind1=1 vs ind1=0: remove latter (luckily no 2nd indicator etc)\n const linked490Ind1 = chainAsString.replace(/^490 1/u, '490 0').replace(/\\t880 1/ug, '\\t880 0');\n const arr = [withoutScriptIdentificationCode, keepless, linked490Ind1].filter(val => val !== chainAsString);\n if (arr.length > 0) {\n return deriveChainDeletables([...stillToDo, ...arr], [...deletables, ...arr]);\n }\n\n return deriveChainDeletables(stillToDo, deletables);\n }\n\n}\n\nfunction isRelevantChain6(field, record) {\n //Can't be a chain:\n if (!fieldHasValidSubfield6(field) && !fieldHasValidSubfield8(field)) {\n return false;\n }\n // Too short to be a chain:\n const chain = fieldToChain(field, record);\n if (chain.length < 2) {\n return false;\n }\n // No field can contains no more than one subfield $6\n if (chain.some(f => f.subfields.filter(sf => sf.code === '6').length > 1)) {\n return false;\n }\n\n // Check whether our field is the head of a chain:\n return sameField(field, chain[0]);\n}\n\nexport function removeInferiorChains(record, fix = true) {\n const fields = record.fields.filter(f => isRelevantChain6(f, record));\n //nvdebug(`WP2.0: GOT ${fields.length} chain(s)`);\n\n const deletableChainsAsKeys = deriveInferiorChains(fields, record);\n const nChains = Object.keys(deletableChainsAsKeys).length;\n //nvdebug(`WP2: GOT ${nChains} chain(s)`);\n if (nChains === 0) {\n return [];\n }\n\n //nvdebug(`removeInferiorChains() has ${fields.length} fields-in-chain(s), and a list of ${nChains} deletable(s)`);\n\n return innerRemoveInferiorChains(fields);\n\n function innerRemoveInferiorChains(fields, deletedStringsArray = []) {\n const [currField, ...remainingFields] = fields;\n\n if (currField === undefined) {\n return deletedStringsArray;\n }\n\n const chain = fieldToChain(currField, record);\n if (chain.length === 0 || !sameField(currField, chain[0])) {\n return innerRemoveInferiorChains(remainingFields, deletedStringsArray);\n }\n\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n if (!(chainAsString in deletableChainsAsKeys)) {\n return innerRemoveInferiorChains(remainingFields, deletedStringsArray);\n }\n\n const triggeringField = deletableChainsAsKeys[chainAsString];\n const triggeringChain = fieldToChain(triggeringField, record);\n\n // If the inferior (deletable) chain is 1XX-based, convert the triggering better chain from 7XX to 1XX:\n if (chainContains1XX(chain)) { // eslint-disable-line functional/no-conditional-statements\n triggeringChain.forEach(f => sevenToOne(f, triggeringChain));\n }\n //nvdebug(`iRIS6C: ${chainAsString}`);\n const deletedString = fieldsToString(chain);\n const message = `DEL: '${deletedString}' REASON: '${fieldsToString(triggeringChain)}'`;\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n //nvdebug(`INFERIOR $6 CHAIN REMOVAL: ${message}}`, debug);\n chain.forEach(field => record.removeField(field));\n }\n return innerRemoveInferiorChains(remainingFields, [...deletedStringsArray, message]);\n }\n\n function chainContains1XX(chain) {\n return chain.some(f => f.tag.substring(0, 1) === '1');\n }\n\n function sevenToOne(field, chain) { // Change 7XX field to 1XX field. Also handle the corresponding 880$6 7XX-NN subfields\n // NB! This function should be called only if the original 1XX gets deleted!\n if (!['700', '710', '711', '730'].includes(field.tag)) {\n return;\n }\n // Retag field 7XX as 1XX and fix corresponding occurrence numbers as well:\n const pairs = fieldGetOccurrenceNumberPairs(field, chain);\n field.tag = `1${field.tag.substring(1)}`; // eslint-disable-line functional/immutable-data\n // There should always be one pair, but I'm not sanity-checking this\n pairs.forEach(pairedField => fieldSevenToOneOccurrenceNumber(pairedField));\n }\n\n}\n\n\nfunction getIdentifierlessAndKeeplessSubsets(fieldAsString) {\n // The rules below are not perfect (in complex cases they don't catch all permutations), but good enough:\n // Remove identifier(s) (MELKEHITYS-2383-ish):\n\n const identifierlessString = fieldAsString.replace(/ ‡[01] [^‡]+($| ‡)/u, '$1'); // eslint-disable-line prefer-named-capture-group\n const keeplessString = fieldAsString.replace(/ ‡9 [A-Z]+<KEEP>/u, '');\n\n return [identifierlessString, keeplessString].filter(val => val !== fieldAsString);\n}\n\nfunction deriveIndividualDeletables490(todoList, deletables = []) {\n const [fieldAsString, ...stillToDo] = todoList;\n if (fieldAsString === undefined) {\n return deletables;\n }\n //nvdebug(`PROCESS ${fieldAsString}`);\n if (!fieldAsString.match(/^490/u)) {\n return deriveIndividualDeletables490(stillToDo, deletables);\n }\n\n // $6-less version (keep this first)\n const sixless = fieldAsString.replace(/ ‡6 [^‡]+ ‡/u, ' ‡');\n\n // Without final $v or $x:\n const withoutFinalVOrX = fieldAsString.replace(/ *[;,] ‡[vx] [^‡]+$/u, '');\n // Add intermediate $x-less version\n const xless = fieldAsString.replace(/, ‡x [^‡]+(, ‡x| ; ‡v)/u, '$1'); // eslint-disable-line prefer-named-capture-group\n\n // Add $xv-less version (handled by recursion?)\n const xvless = fieldAsString.replace(/, ‡x [^‡]+ ‡v [^‡]+$/u, '');\n\n // MRA-433-ish (non-chain): 490 ind1=1 vs ind1=0: remove latter\n const modifiedInd2 = fieldAsString.match(/^490 1/u) ? `490 0${fieldAsString.substring(5)}` : fieldAsString;\n\n const arr = [sixless, withoutFinalVOrX, xless, xvless, modifiedInd2].filter(val => val !== fieldAsString);\n\n /*\n if (arr.length) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`${arr.length} derivation(s) for ${fieldAsString}`);\n nvdebug(arr.join('\\n'));\n }\n */\n return arr;\n}\n\nfunction deriveIndividualDeletables(record) {\n const todoList = record.fields.map(f => fieldToString(f));\n //const finishedRecord = encodingLevelIsBetterThanPrepublication(getEncodingLevel(record));\n\n const deletableStringsArray = processTodoList(todoList);\n\n return uniqArray(deletableStringsArray);\n\n function processTodoList(thingsToDo, deletables = []) {\n const [currString, ...stillToDo] = thingsToDo;\n\n if (currString === undefined) {\n return deletables;\n }\n\n const accentless = getAccentlessVersion(currString);\n const d490 = deriveIndividualDeletables490([currString]);\n const subsets = getIdentifierlessAndKeeplessSubsets(currString); // eslint-disable-line no-param-reassign\n const moreToDo = [...accentless, ...d490, ...subsets];\n\n\n if (currString.match(/^[1678]00/u)) {\n // Proof-of-concept rule. Should be improved eventually...\n if (currString.match(/, ‡e [^‡]+\\.$/u)) {\n const tmp = currString.replace(/, ‡e [^‡]+\\.$/u, '.');\n return processTodoList([tmp, ...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n }\n\n\n if (currString.match(/^505 .0.*-- ‡t/u)) { // MRA-413-ish\n const tmp = currString.replace(/ -- ‡t /gu, ' -- '). // remove non-initial $t subfields\n replace(/ ‡[rg] /gu, ' '). // remove $r and $g subfields\n replace(/ ‡t /u, ' ‡a '). // change first $t to $a\n // ind2: '1' => '#':\n replace(/^505 (.)0/u, '505 $1#'); // eslint-disable-line prefer-named-capture-group\n if (tmp !== currString) {\n return processTodoList([tmp, ...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n //nvdebug(`505 ORIGINAL: '${fieldAsString}'`)\n //nvdebug(`505 DERIVATE: '${tmp}'`)\n }\n\n // MET-381: remove occurence number TAG-00, if TAG-NN existists\n if (currString.match(/^880.* ‡6 [0-9][0-9][0-9]-(?:[1-9][0-9]|0[1-9])/u)) {\n const tmp = currString.replace(/( ‡6 [0-9][0-9][0-9])-[0-9]+/u, '$1-00'); // eslint-disable-line prefer-named-capture-group\n //nvdebug(`MET-381: ADD TO DELETABLES: '${tmp}'`);\n //deletableStringsArray.push(tmp);\n if (tmp.match(/ ‡6 [0-9][0-9][0-9]-00\\/[^ ]+ /u)) {\n const tmp2 = tmp.replace(/( ‡6 [0-9][0-9][0-9]-00)[^ ]+/u, '$1'); // eslint-disable-line prefer-named-capture-group\n //nvdebug(`MET-381: ADD TO DELETABLES: '${tmp2}'`);\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp, tmp2]);\n }\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n\n\n const ennakkotieto653 = currString.match(/^653./u) ? [`${currString} ‡g ENNAKKOTIETO`] : []; // MET-528\n\n const newDeletables = [...deletables, ...subsets, ...accentless, ...d490, ...ennakkotieto653];\n\n if (subsets.length) {\n return processTodoList([...stillToDo, ...moreToDo], newDeletables);\n }\n\n return processTodoList([...stillToDo, ...moreToDo], newDeletables);\n }\n\n function getAccentlessVersion(string) { // MET-527\n //nvdebug(`START: '${string}`);\n // This is a sanity check: if precomposition does something, there's something wrong, and we don't want to proceed..\n if (string !== precomposeFinnishLetters(string)) {\n return [];\n }\n const accentless = String(fixComposition(string)).replace(/\\p{Diacritic}/gu, '');\n //nvdebug(`FROM '${string}'\\n TO '${accentless}'`);\n if (accentless === string) { // Don't self-destruct\n return [];\n }\n return [accentless];\n }\n\n}\n\nfunction fieldToNormalizedString(field) {\n const normalizedField = cloneAndNormalizeFieldForComparison(field);\n return fieldToString(normalizedField);\n}\n\nfunction deriveIndividualNormalizedDeletables(record) { // MET-461:\n const encodingLevel = getEncodingLevel(record);\n const recordIsFinished = encodingLevelIsBetterThanPrepublication(encodingLevel);\n const met495 = encodingLevel === '2' && record.fields.some(f => f.tag === '500' && fieldRefersToKoneellisestiTuotettuTietue(f));\n if (!recordIsFinished || met495) {\n return [];\n }\n const relevantFields = record.fields.filter(f => ['245', '246'].includes(f.tag) && fieldHasSubfield(f, 'a'));\n\n return deriveDeletable946s(relevantFields);\n\n function deriveDeletable946s(fields, results = []) {\n const [currField, ...remainingFields] = fields;\n if (currField === undefined) {\n return results;\n }\n\n const fieldAsNormalizedString = fieldToNormalizedString(currField);\n const tmp = fieldAsNormalizedString.replace(/^(?:...) ../u, '946 ##'). // <= Change tag to 946 and indicators to '##'\n replace(' ‡a ', ' ‡i nimeke onixissa ‡a '). // Add $i before $a. NB! This is added in the normalized lower-cased form!\n replace(/(?: \\/)? ‡c[^‡]+$/u, ''); // Remove $c. (Can $c be non-last?)\n const candArray = [tmp, `${tmp} ‡5 MELINDA`].filter(val => val !== fieldAsNormalizedString);\n if (candArray.length) {\n return deriveDeletable946s(remainingFields, [...results, ...candArray]);\n }\n return deriveDeletable946s(remainingFields, results);\n }\n}\n\nexport function removeIndividualInferiorDatafields(record, fix = true) { // No $6 nor $8 in field\n const deletableFieldsAsStrings = deriveIndividualDeletables(record);\n const deletableFieldsAsNormalizedStrings = deriveIndividualNormalizedDeletables(record);\n\n // nvdebug(`Deletables:\\n ${deletableFieldsAsStrings.join('\\n ')}`);\n // nvdebug(`Normalized deletables:\\n ${deletableFieldsAsNormalizedStrings.join('\\n ')}`);\n\n const hits = record.fields.filter(field => isDeletableField(field));\n\n const deletedFieldsAsStrings = hits.map(f => fieldToString(f));\n\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n hits.forEach(field => {\n //nvdebug(`Remove inferior field: ${fieldToString(field)}`, debug);\n record.removeField(field);\n });\n }\n\n return deletedFieldsAsStrings;\n\n function isDeletableField(field) {\n const fieldAsString = fieldToString(field);\n if (deletableFieldsAsStrings.includes(fieldAsString)) {\n return true;\n }\n const fieldAsNormalizedString = fieldToNormalizedString(field);\n if (deletableFieldsAsNormalizedStrings.includes(fieldAsNormalizedString)) {\n return true;\n }\n\n return false;\n }\n}\n\n\nexport function removeInferiorDatafields(record, fix = true) {\n const removables = removeIndividualInferiorDatafields(record, fix); // Lone fields\n //const removables8 = removeDuplicateSubfield8Chains(record, fix); // Lone subfield $8 chains\n const removables6 = removeInferiorChains(record, fix); // Lone subfield $6 chains\n // HOW TO HANDLE $6+$8 combos? Skipping is relatively OK.\n\n nvdebug(`REMOVABLES:\\n ${removables.join('\\n ')}`, debug);\n nvdebug(`REMOVABLES 6:\\n ${removables6.join('\\n ')}`, debug);\n\n const removablesAll = removables.concat(removables6); //.concat(removables8);\n\n return removablesAll;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"removeInferiorDataFields.js","names":["_debug","_interopRequireDefault","require","_removeDuplicateDataFields","_subfield6Utils","_utils","_subfield8Utils","_prepublicationUtils","_normalizeFieldForComparison","_normalizeUtf8Diacritics","obj","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","removeInferiorDatafields","duplicates","length","deriveInferiorChains","fields","hash","forEach","f","fieldToChainToDeletables","field","chain","fieldToChain","chainAsString","fieldsToNormalizedString","arr","deriveChainDeletables","val","todoList","deletables","stillToDo","undefined","withoutScriptIdentificationCode","replace","keepless","linked490Ind1","filter","isRelevantChain6","fieldHasValidSubfield6","fieldHasValidSubfield8","some","subfields","sf","code","sameField","removeInferiorChains","deletableChainsAsKeys","nChains","Object","keys","innerRemoveInferiorChains","deletedStringsArray","currField","remainingFields","triggeringField","triggeringChain","chainContains1XX","sevenToOne","deletedString","fieldsToString","removeField","tag","substring","includes","pairs","fieldGetOccurrenceNumberPairs","pairedField","fieldSevenToOneOccurrenceNumber","getIdentifierlessAndKeeplessSubsets","fieldAsString","identifierlessString","keeplessString","deriveIndividualDeletables490","match","sixless","withoutFinalVOrX","xless","xvless","modifiedInd2","deriveIndividualDeletables","map","fieldToString","deletableStringsArray","processTodoList","uniqArray","thingsToDo","currString","accentless","getAccentlessVersion","d490","subsets","moreToDo","tmp","tmp2","ennakkotieto653","newDeletables","string","precomposeFinnishLetters","String","fixComposition","fieldToNormalizedString","normalizedField","cloneAndNormalizeFieldForComparison","deriveIndividualNormalizedDeletables","encodingLevel","getEncodingLevel","recordIsFinished","encodingLevelIsBetterThanPrepublication","met495","fieldRefersToKoneellisestiTuotettuTietue","relevantFields","fieldHasSubfield","deriveDeletable946s","results","fieldAsNormalizedString","candArray","removeIndividualInferiorDatafields","deletableFieldsAsStrings","deletableFieldsAsNormalizedStrings","hits","isDeletableField","deletedFieldsAsStrings","removables","removables6","join","removablesAll","concat"],"sources":["../src/removeInferiorDataFields.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldToChain, sameField} from './removeDuplicateDataFields';\nimport {fieldGetOccurrenceNumberPairs, fieldHasValidSubfield6, fieldSevenToOneOccurrenceNumber, fieldsToNormalizedString} from './subfield6Utils';\nimport {fieldHasSubfield, fieldsToString, fieldToString, nvdebug, uniqArray} from './utils';\nimport {fieldHasValidSubfield8} from './subfield8Utils';\nimport {encodingLevelIsBetterThanPrepublication, fieldRefersToKoneellisestiTuotettuTietue, getEncodingLevel} from './prepublicationUtils';\nimport {cloneAndNormalizeFieldForComparison} from './normalizeFieldForComparison';\nimport {fixComposition, precomposeFinnishLetters} from './normalize-utf8-diacritics';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\n// NB! This validator handles only full fields, and does not support subfield $8 removal.\n// Also, having multiple $8 subfields in same fields is not supported.\n// If this functionality is needed, see removeDuplicateDatafields.js for examples of subfield-only stuff.\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:removeSubsetDataFields');\n\nexport default function () {\n return {\n description: 'Remove subset data fields. Certain exceptions apply, mainly too complicated for chained fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix record: remove inferior (eg. subset) data fields', debug);\n const res = {message: [], fix: [], valid: true};\n removeInferiorDatafields(record, true);\n // This can not really fail...\n return res;\n }\n\n function validate(record) {\n // Check max, and check number of different indexes\n nvdebug('Validate record: remove inferior (eg. subset) data fields', debug);\n\n const duplicates = removeInferiorDatafields(record, false);\n\n const res = {message: duplicates};\n\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\nfunction deriveInferiorChains(fields, record) {\n //nvdebug(`======= GOT ${fields.length} FIELDS TO CHAINIFY`);\n const hash = {};\n\n fields.forEach(f => fieldToChainToDeletables(f));\n\n return hash;\n\n //nvdebug(`WP1: GOT ${todoList.length} CHAINS`);\n\n\n // here we map deletableStringObject[str] => field. The idea is to help debugging. We don't actually need the field object...\n //return deriveChainDeletables(todoList);\n\n function fieldToChainToDeletables(field) {\n const chain = fieldToChain(field, record);\n if (chain.length < 2) {\n return;\n }\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n const arr = deriveChainDeletables([chainAsString]);\n //nvdebug(`GOT ${arr.length} DELETABLES FOR ${chainAsString}`);\n arr.forEach(val => {\n if (!(val in hash)) { // eslint-disable-line functional/no-conditional-statements\n hash[val] = field; // eslint-disable-line functional/immutable-data\n }\n });\n }\n\n function deriveChainDeletables(todoList, deletables = []) {\n const [chainAsString, ...stillToDo] = todoList;\n if (chainAsString === undefined) {\n return deletables;\n }\n\n // Fix MRA-476 (part 1): one $6 value can be worse than the other\n const withoutScriptIdentificationCode = chainAsString.replace(/( ‡6 [0-9X][0-9][0-9]-(?:XX|[0-9]+))\\/[^ ]+/u, '$1'); // eslint-disable-line prefer-named-capture-group\n\n // Remove keepless versions:\n const keepless = chainAsString.replace(/ ‡9 [A-Z]+<KEEP>/u, '');\n\n // MRA-433: 490 ind1=1 vs ind1=0: remove latter (luckily no 2nd indicator etc)\n const linked490Ind1 = chainAsString.replace(/^490 1/u, '490 0').replace(/\\t880 1/ug, '\\t880 0');\n const arr = [withoutScriptIdentificationCode, keepless, linked490Ind1].filter(val => val !== chainAsString);\n if (arr.length > 0) {\n return deriveChainDeletables([...stillToDo, ...arr], [...deletables, ...arr]);\n }\n\n return deriveChainDeletables(stillToDo, deletables);\n }\n\n}\n\nfunction isRelevantChain6(field, record) {\n //Can't be a chain:\n if (!fieldHasValidSubfield6(field) && !fieldHasValidSubfield8(field)) {\n return false;\n }\n // Too short to be a chain:\n const chain = fieldToChain(field, record);\n if (chain.length < 2) {\n return false;\n }\n // No field can contains no more than one subfield $6\n if (chain.some(f => f.subfields.filter(sf => sf.code === '6').length > 1)) {\n return false;\n }\n\n // Check whether our field is the head of a chain:\n return sameField(field, chain[0]);\n}\n\nexport function removeInferiorChains(record, fix = true) {\n const fields = record.fields.filter(f => isRelevantChain6(f, record));\n //nvdebug(`WP2.0: GOT ${fields.length} chain(s)`);\n\n const deletableChainsAsKeys = deriveInferiorChains(fields, record);\n const nChains = Object.keys(deletableChainsAsKeys).length;\n //nvdebug(`WP2: GOT ${nChains} chain(s)`);\n if (nChains === 0) {\n return [];\n }\n\n //nvdebug(`removeInferiorChains() has ${fields.length} fields-in-chain(s), and a list of ${nChains} deletable(s)`);\n\n return innerRemoveInferiorChains(fields);\n\n function innerRemoveInferiorChains(fields, deletedStringsArray = []) {\n const [currField, ...remainingFields] = fields;\n\n if (currField === undefined) {\n return deletedStringsArray;\n }\n\n const chain = fieldToChain(currField, record);\n if (chain.length === 0 || !sameField(currField, chain[0])) {\n return innerRemoveInferiorChains(remainingFields, deletedStringsArray);\n }\n\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n if (!(chainAsString in deletableChainsAsKeys)) {\n return innerRemoveInferiorChains(remainingFields, deletedStringsArray);\n }\n\n const triggeringField = deletableChainsAsKeys[chainAsString];\n const triggeringChain = fieldToChain(triggeringField, record);\n\n // If the inferior (deletable) chain is 1XX-based, convert the triggering better chain from 7XX to 1XX:\n if (chainContains1XX(chain)) { // eslint-disable-line functional/no-conditional-statements\n triggeringChain.forEach(f => sevenToOne(f, triggeringChain));\n }\n //nvdebug(`iRIS6C: ${chainAsString}`);\n const deletedString = fieldsToString(chain);\n const message = `DEL: '${deletedString}' REASON: '${fieldsToString(triggeringChain)}'`;\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n //nvdebug(`INFERIOR $6 CHAIN REMOVAL: ${message}}`, debug);\n chain.forEach(field => record.removeField(field));\n }\n return innerRemoveInferiorChains(remainingFields, [...deletedStringsArray, message]);\n }\n\n function chainContains1XX(chain) {\n return chain.some(f => f.tag.substring(0, 1) === '1');\n }\n\n function sevenToOne(field, chain) { // Change 7XX field to 1XX field. Also handle the corresponding 880$6 7XX-NN subfields\n // NB! This function should be called only if the original 1XX gets deleted!\n if (!['700', '710', '711', '730'].includes(field.tag)) {\n return;\n }\n // Retag field 7XX as 1XX and fix corresponding occurrence numbers as well:\n const pairs = fieldGetOccurrenceNumberPairs(field, chain);\n field.tag = `1${field.tag.substring(1)}`; // eslint-disable-line functional/immutable-data\n // There should always be one pair, but I'm not sanity-checking this\n pairs.forEach(pairedField => fieldSevenToOneOccurrenceNumber(pairedField));\n }\n\n}\n\n\nfunction getIdentifierlessAndKeeplessSubsets(fieldAsString) {\n // The rules below are not perfect (in complex cases they don't catch all permutations), but good enough:\n // Remove identifier(s) (MELKEHITYS-2383-ish):\n\n const identifierlessString = fieldAsString.replace(/ ‡[01] [^‡]+($| ‡)/u, '$1'); // eslint-disable-line prefer-named-capture-group\n const keeplessString = fieldAsString.replace(/ ‡9 [A-Z]+<KEEP>/u, '');\n\n return [identifierlessString, keeplessString].filter(val => val !== fieldAsString);\n}\n\nfunction deriveIndividualDeletables490(todoList, deletables = []) {\n const [fieldAsString, ...stillToDo] = todoList;\n if (fieldAsString === undefined) {\n return deletables;\n }\n //nvdebug(`PROCESS ${fieldAsString}`);\n if (!fieldAsString.match(/^490/u)) {\n return deriveIndividualDeletables490(stillToDo, deletables);\n }\n\n // $6-less version (keep this first)\n const sixless = fieldAsString.replace(/ ‡6 [^‡]+ ‡/u, ' ‡');\n\n // Without final $v or $x:\n const withoutFinalVOrX = fieldAsString.replace(/ *[;,] ‡[vx] [^‡]+$/u, '');\n // Add intermediate $x-less version\n const xless = fieldAsString.replace(/, ‡x [^‡]+(, ‡x| ; ‡v)/u, '$1'); // eslint-disable-line prefer-named-capture-group\n\n // Add $xv-less version (handled by recursion?)\n const xvless = fieldAsString.replace(/, ‡x [^‡]+ ‡v [^‡]+$/u, '');\n\n // MRA-433-ish (non-chain): 490 ind1=1 vs ind1=0: remove latter\n const modifiedInd2 = fieldAsString.match(/^490 1/u) ? `490 0${fieldAsString.substring(5)}` : fieldAsString;\n\n const arr = [sixless, withoutFinalVOrX, xless, xvless, modifiedInd2].filter(val => val !== fieldAsString);\n\n /*\n if (arr.length) { // eslint-disable-line functional/no-conditional-statements\n nvdebug(`${arr.length} derivation(s) for ${fieldAsString}`);\n nvdebug(arr.join('\\n'));\n }\n */\n return arr;\n}\n\nfunction deriveIndividualDeletables(record) {\n const todoList = record.fields.map(f => fieldToString(f));\n //const finishedRecord = encodingLevelIsBetterThanPrepublication(getEncodingLevel(record));\n\n const deletableStringsArray = processTodoList(todoList);\n\n return uniqArray(deletableStringsArray);\n\n function processTodoList(thingsToDo, deletables = []) {\n const [currString, ...stillToDo] = thingsToDo;\n\n if (currString === undefined) {\n return deletables;\n }\n\n const accentless = getAccentlessVersion(currString);\n const d490 = deriveIndividualDeletables490([currString]);\n const subsets = getIdentifierlessAndKeeplessSubsets(currString); // eslint-disable-line no-param-reassign\n const moreToDo = [...accentless, ...d490, ...subsets];\n\n\n if (currString.match(/^[1678]00/u)) {\n // Proof-of-concept rule. Should be improved eventually...\n if (currString.match(/, ‡e [^‡]+\\.$/u)) {\n const tmp = currString.replace(/, ‡e [^‡]+\\.$/u, '.');\n return processTodoList([tmp, ...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n }\n\n\n if (currString.match(/^505 .0.*-- ‡t/u)) { // MRA-413-ish\n const tmp = currString.replace(/ -- ‡t /gu, ' -- '). // remove non-initial $t subfields\n replace(/ ‡[rg] /gu, ' '). // remove $r and $g subfields\n replace(/ ‡t /u, ' ‡a '). // change first $t to $a\n // ind2: '1' => '#':\n replace(/^505 (.)0/u, '505 $1#'); // eslint-disable-line prefer-named-capture-group\n if (tmp !== currString) {\n return processTodoList([tmp, ...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n //nvdebug(`505 ORIGINAL: '${fieldAsString}'`)\n //nvdebug(`505 DERIVATE: '${tmp}'`)\n }\n\n // MET-381: remove occurence number TAG-00, if TAG-NN existists\n if (currString.match(/^880.* ‡6 [0-9][0-9][0-9]-(?:[1-9][0-9]|0[1-9])/u)) {\n const tmp = currString.replace(/( ‡6 [0-9][0-9][0-9])-[0-9]+/u, '$1-00'); // eslint-disable-line prefer-named-capture-group\n //nvdebug(`MET-381: ADD TO DELETABLES: '${tmp}'`);\n //deletableStringsArray.push(tmp);\n if (tmp.match(/ ‡6 [0-9][0-9][0-9]-00\\/[^ ]+ /u)) {\n const tmp2 = tmp.replace(/( ‡6 [0-9][0-9][0-9]-00)[^ ]+/u, '$1'); // eslint-disable-line prefer-named-capture-group\n //nvdebug(`MET-381: ADD TO DELETABLES: '${tmp2}'`);\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp, tmp2]);\n }\n return processTodoList([...stillToDo, ...moreToDo], [...deletables, tmp]);\n }\n\n\n const ennakkotieto653 = currString.match(/^653./u) ? [`${currString} ‡g ENNAKKOTIETO`] : []; // MET-528\n\n const newDeletables = [...deletables, ...subsets, ...accentless, ...d490, ...ennakkotieto653];\n\n if (subsets.length) {\n return processTodoList([...stillToDo, ...moreToDo], newDeletables);\n }\n\n return processTodoList([...stillToDo, ...moreToDo], newDeletables);\n }\n\n function getAccentlessVersion(string) { // MET-527\n //nvdebug(`START: '${string}`);\n // This is a sanity check: if precomposition does something, there's something wrong, and we don't want to proceed..\n if (string !== precomposeFinnishLetters(string)) {\n return [];\n }\n const accentless = String(fixComposition(string)).replace(/\\p{Diacritic}/gu, '');\n //nvdebug(`FROM '${string}'\\n TO '${accentless}'`);\n if (accentless === string) { // Don't self-destruct\n return [];\n }\n return [accentless];\n }\n\n}\n\nfunction fieldToNormalizedString(field) {\n const normalizedField = cloneAndNormalizeFieldForComparison(field);\n return fieldToString(normalizedField);\n}\n\nfunction deriveIndividualNormalizedDeletables(record) { // MET-461:\n const encodingLevel = getEncodingLevel(record);\n const recordIsFinished = encodingLevelIsBetterThanPrepublication(encodingLevel);\n const met495 = encodingLevel === '2' && record.fields.some(f => f.tag === '500' && fieldRefersToKoneellisestiTuotettuTietue(f));\n if (!recordIsFinished || met495) {\n return [];\n }\n const relevantFields = record.fields.filter(f => ['245', '246'].includes(f.tag) && fieldHasSubfield(f, 'a'));\n\n return deriveDeletable946s(relevantFields);\n\n function deriveDeletable946s(fields, results = []) {\n const [currField, ...remainingFields] = fields;\n if (currField === undefined) {\n return results;\n }\n\n const fieldAsNormalizedString = fieldToNormalizedString(currField);\n const tmp = fieldAsNormalizedString.replace(/^(?:...) ../u, '946 ##'). // <= Change tag to 946 and indicators to '##'\n replace(' ‡a ', ' ‡i nimeke onixissa ‡a '). // Add $i before $a. NB! This is added in the normalized lower-cased form!\n replace(/(?: \\/)? ‡c[^‡]+$/u, ''); // Remove $c. (Can $c be non-last?)\n const candArray = [tmp, `${tmp} ‡5 MELINDA`].filter(val => val !== fieldAsNormalizedString);\n if (candArray.length) {\n return deriveDeletable946s(remainingFields, [...results, ...candArray]);\n }\n return deriveDeletable946s(remainingFields, results);\n }\n}\n\nexport function removeIndividualInferiorDatafields(record, fix = true) { // No $6 nor $8 in field\n const deletableFieldsAsStrings = deriveIndividualDeletables(record);\n const deletableFieldsAsNormalizedStrings = deriveIndividualNormalizedDeletables(record);\n\n // nvdebug(`Deletables:\\n ${deletableFieldsAsStrings.join('\\n ')}`);\n // nvdebug(`Normalized deletables:\\n ${deletableFieldsAsNormalizedStrings.join('\\n ')}`);\n\n const hits = record.fields.filter(field => isDeletableField(field));\n\n const deletedFieldsAsStrings = hits.map(f => fieldToString(f));\n\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n hits.forEach(field => {\n //nvdebug(`Remove inferior field: ${fieldToString(field)}`, debug);\n record.removeField(field);\n });\n }\n\n return deletedFieldsAsStrings;\n\n function isDeletableField(field) {\n const fieldAsString = fieldToString(field);\n if (deletableFieldsAsStrings.includes(fieldAsString)) {\n return true;\n }\n const fieldAsNormalizedString = fieldToNormalizedString(field);\n if (deletableFieldsAsNormalizedStrings.includes(fieldAsNormalizedString)) {\n return true;\n }\n\n return false;\n }\n}\n\n\nexport function removeInferiorDatafields(record, fix = true) {\n const removables = removeIndividualInferiorDatafields(record, fix); // Lone fields\n //const removables8 = removeDuplicateSubfield8Chains(record, fix); // Lone subfield $8 chains\n const removables6 = removeInferiorChains(record, fix); // Lone subfield $6 chains\n // HOW TO HANDLE $6+$8 combos? Skipping is relatively OK.\n\n nvdebug(`REMOVABLES:\\n ${removables.join('\\n ')}`, debug);\n nvdebug(`REMOVABLES 6:\\n ${removables6.join('\\n ')}`, debug);\n\n const removablesAll = removables.concat(removables6); //.concat(removables8);\n\n return removablesAll;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"removeInferiorDataFields.spec.js","names":["_chai","require","_marcRecord","_removeInferiorDataFields","_interopRequireDefault","_fixura","_fixugen","_debug","obj","__esModule","default","generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","debug","createDebugLogger","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","getFixture","enabled","fix","record","MarcRecord","expectedResult","result","eql"],"sources":["../src/removeInferiorDataFields.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './removeInferiorDataFields';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'remove-inferior-datafields'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/removeInferiorDataFields:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n}\n\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n expect(result).to.eql(expectedResult);\n return;\n }\n\n await validator.fix(record);\n expect(record).to.eql(expectedResult);\n}\n"],"mappings":";;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,yBAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAF,sBAAA,CAAAH,OAAA;AACA,IAAAM,MAAA,GAAAH,sBAAA,CAAAH,OAAA;AAAsC,SAAAG,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEtC,IAAAG,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,4BAA4B,CAAC;EACtEC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAEA,CAAA,KAAMC,oBAAoB,CAAC;EACrC;AACF,CAAC,CAAC;AACF,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,wEAAwE,CAAC;AAEzG,eAAeF,oBAAoBA,CAAA,EAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,iCAAgB,EAAC,CAAC;EAE1C,IAAAC,YAAM,EAACF,SAAS,CAAC,CACdG,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,QAAQ,CAAC,CAClBC,IAAI,CAACC,GAAG,CAACC,GAAG,CAACC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;EAE/C,IAAAP,YAAM,EAACF,SAAS,CAACU,WAAW,CAAC,CAACP,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,QAAQ,CAAC;EAC/C,IAAAT,YAAM,EAACF,SAAS,CAACY,QAAQ,CAAC,CAACT,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,UAAU,CAAC;AAChD;AAEA,eAAezB,QAAQA,CAAC;EAAC2B,UAAU;EAAEC,OAAO,GAAG,IAAI;EAAEC,GAAG,GAAG;AAAK,CAAC,EAAE;EACjE,IAAID,OAAO,KAAK,KAAK,EAAE;IACrBhB,KAAK,CAAC,eAAe,CAAC;IACtB;EACF;EAEA,MAAME,SAAS,GAAG,MAAM,IAAAC,iCAAgB,EAAC,CAAC;EAC1C,MAAMe,MAAM,GAAG,IAAIC,sBAAU,CAACJ,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMK,cAAc,GAAGL,UAAU,CAAC,qBAAqB,CAAC;EACxD;;EAEA,IAAI,CAACE,GAAG,EAAE;IACR,MAAMI,MAAM,GAAG,MAAMnB,SAAS,CAACY,QAAQ,CAACI,MAAM,CAAC;IAC/C,IAAAd,YAAM,EAACiB,MAAM,CAAC,CAAChB,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;IACrC;EACF;EAEA,MAAMlB,SAAS,CAACe,GAAG,CAACC,MAAM,CAAC;EAC3B,IAAAd,YAAM,EAACc,MAAM,CAAC,CAACb,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;AACvC"}
1
+ {"version":3,"file":"removeInferiorDataFields.spec.js","names":["_chai","require","_marcRecord","_removeInferiorDataFields","_interopRequireDefault","_fixura","_fixugen","_debug","obj","__esModule","default","generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","debug","createDebugLogger","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","getFixture","enabled","fix","record","MarcRecord","expectedResult","result","eql"],"sources":["../src/removeInferiorDataFields.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './removeInferiorDataFields';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'remove-inferior-datafields'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/removeInferiorDataFields:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n}\n\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n expect(result).to.eql(expectedResult);\n return;\n }\n\n await validator.fix(record);\n expect(record).to.eql(expectedResult);\n}\n"],"mappings":";;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,yBAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAF,sBAAA,CAAAH,OAAA;AACA,IAAAM,MAAA,GAAAH,sBAAA,CAAAH,OAAA;AAAsC,SAAAG,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEtC,IAAAG,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,4BAA4B,CAAC;EACtEC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAEA,CAAA,KAAMC,oBAAoB,CAAC;EACrC;AACF,CAAC,CAAC;AACF,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,wEAAwE,CAAC;AAEzG,eAAeF,oBAAoBA,CAAA,EAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,iCAAgB,EAAC,CAAC;EAE1C,IAAAC,YAAM,EAACF,SAAS,CAAC,CACdG,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,QAAQ,CAAC,CAClBC,IAAI,CAACC,GAAG,CAACC,GAAG,CAACC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;EAE/C,IAAAP,YAAM,EAACF,SAAS,CAACU,WAAW,CAAC,CAACP,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,QAAQ,CAAC;EAC/C,IAAAT,YAAM,EAACF,SAAS,CAACY,QAAQ,CAAC,CAACT,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,UAAU,CAAC;AAChD;AAEA,eAAezB,QAAQA,CAAC;EAAC2B,UAAU;EAAEC,OAAO,GAAG,IAAI;EAAEC,GAAG,GAAG;AAAK,CAAC,EAAE;EACjE,IAAID,OAAO,KAAK,KAAK,EAAE;IACrBhB,KAAK,CAAC,eAAe,CAAC;IACtB;EACF;EAEA,MAAME,SAAS,GAAG,MAAM,IAAAC,iCAAgB,EAAC,CAAC;EAC1C,MAAMe,MAAM,GAAG,IAAIC,sBAAU,CAACJ,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMK,cAAc,GAAGL,UAAU,CAAC,qBAAqB,CAAC;EACxD;;EAEA,IAAI,CAACE,GAAG,EAAE;IACR,MAAMI,MAAM,GAAG,MAAMnB,SAAS,CAACY,QAAQ,CAACI,MAAM,CAAC;IAC/C,IAAAd,YAAM,EAACiB,MAAM,CAAC,CAAChB,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;IACrC;EACF;EAEA,MAAMlB,SAAS,CAACe,GAAG,CAACC,MAAM,CAAC;EAC3B,IAAAd,YAAM,EAACc,MAAM,CAAC,CAACb,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;AACvC","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"resolvable-ext-references-melinda.js","names":["_xml2js","require","_nodeFetch","_interopRequireDefault","obj","__esModule","default","_default","endpoint","prefixPattern","fields","RegExp","description","validate","Error","record","validateResult","validateRecord","removedPrefixes","subfields","reduce","prev","current","Object","keys","forEach","key","tag","push","matchingTags","filter","item","values","value","code","test","replace","resolveValidation","length","validateMatchingTags","then","result","valid","messages","tags","resolved","Promise","all","map","getData","every","recID","queryParam","response","fetch","xml","text","resolve","parseString","err","slice","position","parseInt"],"sources":["../src/resolvable-ext-references-melinda.js"],"sourcesContent":["import {parseString} from 'xml2js';\nimport fetch from 'node-fetch';\n\nexport default function ({endpoint, prefixPattern, fields}) {\n if (typeof endpoint === 'string' && prefixPattern instanceof RegExp && typeof fields === 'object') {\n return {\n description: 'Checks if Melinda entity references are resolvable',\n validate\n };\n }\n\n throw new Error('Error in validation parameters');\n\n async function validate(record) {\n const validateResult = await validateRecord(record);\n return validateResult;\n }\n\n function validateRecord(record) {\n const removedPrefixes = [];\n\n // Filter matching field keys from record.fields\n const subfields = record.fields.reduce((prev, current) => {\n Object.keys(fields).forEach(key => {\n if (key === current.tag) { // eslint-disable-line functional/no-conditional-statements\n prev.push(current); // eslint-disable-line functional/immutable-data\n }\n });\n return prev;\n }, []);\n\n // Filter matching objects from subfields\n const matchingTags = [...subfields].reduce((prev, current) => {\n Object.keys(fields).forEach(key => {\n if (key === current.tag) { // eslint-disable-line functional/no-conditional-statements\n current.subfields.filter(item => {\n if (Object.values(fields[key]).filter(value => value === item.code)[0]) { // eslint-disable-line functional/no-conditional-statements\n prev.push({tag: current.tag, code: item.code, value: item.value}); // eslint-disable-line functional/immutable-data\n }\n\n return prev;\n });\n }\n });\n return prev;\n }, []);\n\n // Matching prefixPattern is removed from object value field.\n matchingTags.forEach(obj => {\n if (prefixPattern.test(obj.value)) { // eslint-disable-line functional/no-conditional-statements\n obj.value = obj.value.replace(prefixPattern, ''); // eslint-disable-line functional/immutable-data\n removedPrefixes.push(obj); // eslint-disable-line functional/immutable-data\n }\n });\n return resolveValidation(removedPrefixes);\n }\n\n function resolveValidation(removedPrefixes) {\n // If matching prefixPatterns found make an API call\n if (removedPrefixes.length > 0) {\n return validateMatchingTags(removedPrefixes).then(result => result);\n }\n\n return {valid: true, messages: []};\n }\n\n async function validateMatchingTags(tags) {\n const resolved = await Promise.all(tags.map(obj => getData(obj.value).then(valid => ({valid, ...obj}))));\n\n if (resolved.every(value => value.valid === true)) {\n return {valid: true, messages: []};\n }\n\n return {valid: false, messages: resolved.map(obj => `Field ${obj.tag}$${obj.code} with value ${obj.value} is not resolvable`)};\n }\n\n async function getData(recID) {\n const queryParam = '?operation=searchRetrieve&maximumRecords=2&version=1&query=rec.id=';\n\n const response = await fetch(`${endpoint}${queryParam}${recID}`);\n\n const xml = await response.text();\n\n return new Promise(resolve => {\n parseString(xml, (err, result) => {\n const record = result['zs:searchRetrieveResponse']['zs:records'].slice(-1)?.[0];\n const position = parseInt(record?.['zs:record'].slice(-1)?.[0]['zs:recordPosition'][0], 10);\n resolve(position === 1 && !err);\n });\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"resolvable-ext-references-melinda.js","names":["_xml2js","require","_nodeFetch","_interopRequireDefault","obj","__esModule","default","_default","endpoint","prefixPattern","fields","RegExp","description","validate","Error","record","validateResult","validateRecord","removedPrefixes","subfields","reduce","prev","current","Object","keys","forEach","key","tag","push","matchingTags","filter","item","values","value","code","test","replace","resolveValidation","length","validateMatchingTags","then","result","valid","messages","tags","resolved","Promise","all","map","getData","every","recID","queryParam","response","fetch","xml","text","resolve","parseString","err","slice","position","parseInt"],"sources":["../src/resolvable-ext-references-melinda.js"],"sourcesContent":["import {parseString} from 'xml2js';\nimport fetch from 'node-fetch';\n\nexport default function ({endpoint, prefixPattern, fields}) {\n if (typeof endpoint === 'string' && prefixPattern instanceof RegExp && typeof fields === 'object') {\n return {\n description: 'Checks if Melinda entity references are resolvable',\n validate\n };\n }\n\n throw new Error('Error in validation parameters');\n\n async function validate(record) {\n const validateResult = await validateRecord(record);\n return validateResult;\n }\n\n function validateRecord(record) {\n const removedPrefixes = [];\n\n // Filter matching field keys from record.fields\n const subfields = record.fields.reduce((prev, current) => {\n Object.keys(fields).forEach(key => {\n if (key === current.tag) { // eslint-disable-line functional/no-conditional-statements\n prev.push(current); // eslint-disable-line functional/immutable-data\n }\n });\n return prev;\n }, []);\n\n // Filter matching objects from subfields\n const matchingTags = [...subfields].reduce((prev, current) => {\n Object.keys(fields).forEach(key => {\n if (key === current.tag) { // eslint-disable-line functional/no-conditional-statements\n current.subfields.filter(item => {\n if (Object.values(fields[key]).filter(value => value === item.code)[0]) { // eslint-disable-line functional/no-conditional-statements\n prev.push({tag: current.tag, code: item.code, value: item.value}); // eslint-disable-line functional/immutable-data\n }\n\n return prev;\n });\n }\n });\n return prev;\n }, []);\n\n // Matching prefixPattern is removed from object value field.\n matchingTags.forEach(obj => {\n if (prefixPattern.test(obj.value)) { // eslint-disable-line functional/no-conditional-statements\n obj.value = obj.value.replace(prefixPattern, ''); // eslint-disable-line functional/immutable-data\n removedPrefixes.push(obj); // eslint-disable-line functional/immutable-data\n }\n });\n return resolveValidation(removedPrefixes);\n }\n\n function resolveValidation(removedPrefixes) {\n // If matching prefixPatterns found make an API call\n if (removedPrefixes.length > 0) {\n return validateMatchingTags(removedPrefixes).then(result => result);\n }\n\n return {valid: true, messages: []};\n }\n\n async function validateMatchingTags(tags) {\n const resolved = await Promise.all(tags.map(obj => getData(obj.value).then(valid => ({valid, ...obj}))));\n\n if (resolved.every(value => value.valid === true)) {\n return {valid: true, messages: []};\n }\n\n return {valid: false, messages: resolved.map(obj => `Field ${obj.tag}$${obj.code} with value ${obj.value} is not resolvable`)};\n }\n\n async function getData(recID) {\n const queryParam = '?operation=searchRetrieve&maximumRecords=2&version=1&query=rec.id=';\n\n const response = await fetch(`${endpoint}${queryParam}${recID}`);\n\n const xml = await response.text();\n\n return new Promise(resolve => {\n parseString(xml, (err, result) => {\n const record = result['zs:searchRetrieveResponse']['zs:records'].slice(-1)?.[0];\n const position = parseInt(record?.['zs:record'].slice(-1)?.[0]['zs:recordPosition'][0], 10);\n resolve(position === 1 && !err);\n });\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"resolvable-ext-references-melinda.spec.js","names":["_chai","_interopRequireDefault","require","_chaiAsPromised","_marcRecord","_fetchMock","testContext","_interopRequireWildcard","_resolvableExtReferencesMelinda2","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","obj","expect","chai","use","chaiAsPromised","endpoint","queryParam","prefixPattern","fields","describe","afterEach","__ResetDependency__","it","validator","to","be","an","that","any","keys","description","validate","rejectedWith","Error","mock","fetchMock","sandbox","fixture5000","fixture9550","__Rewire__","record","MarcRecord","tag","value","subfields","code","result","eql","valid","messages","fixture1000"],"sources":["../src/resolvable-ext-references-melinda.spec.js"],"sourcesContent":["import chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport fetchMock from 'fetch-mock';\nimport * as testContext from '../src/resolvable-ext-references-melinda';\nimport {fixture5000, fixture9550, fixture1000} from '../test-fixtures/resolvable-ext-references-melinda';\n\nconst {expect} = chai;\nchai.use(chaiAsPromised);\n\nconst endpoint = 'http://melinda.kansalliskirjasto.fi:210/fin01';\nconst queryParam = '?operation=searchRetrieve&maximumRecords=2&version=1&query=rec.id=';\nconst prefixPattern = /^\\(FOOBAR\\)/u;\nconst fields = {\n 773: ['w'],\n 833: ['w', 'p']\n};\n\ndescribe('resolvable-ext-references-melinda', () => {\n afterEach(() => {\n testContext.default.__ResetDependency__('fetch');\n });\n\n it('Creates a validator', async () => {\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n it('Throws an error when prefixPattern not provided', async () => {\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n // Cannot read property 'fields' of undefined or Cannot read properties of undefined (reading 'fields')'\n await expect(validator.validate()).to.be.rejectedWith(Error, /^Cannot read propert/u);\n });\n\n describe('#validate', () => {\n it('Finds prefixPattern on record and removes it', async () => {\n const mock = fetchMock.sandbox();\n mock.get(`${endpoint}${queryParam}5000`, fixture5000);\n mock.get(`${endpoint}${queryParam}9550`, fixture9550);\n\n testContext.default.__Rewire__('fetch', mock);\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '123456'\n },\n {\n tag: '035',\n subfields: [\n {\n code: 'a',\n value: '(FI-MELINDA)123456'\n }\n ]\n },\n {\n tag: '773',\n subfields: [\n {\n code: 'w',\n value: '(FOOBAR)5000'\n }\n ]\n },\n {\n tag: '833',\n subfields: [\n {\n code: 'p',\n value: '(FOOBAR)9550'\n },\n {\n code: 'c',\n value: '(FI-MELINDA)8850'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: true, messages: []});\n });\n\n it('Finds no matching prefixPattern on record', async () => {\n const mock = fetchMock.sandbox();\n\n mock.get(`${endpoint}5000`, fixture5000);\n\n testContext.default.__Rewire__('fetch', mock);\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '123456'\n },\n {\n tag: '035',\n subfields: [\n {\n code: 'a',\n value: '(FI-MELINDA)123456'\n }\n ]\n },\n {\n tag: '773',\n subfields: [\n {\n code: 'w',\n value: '(FI-MELINDA)123456'\n }\n ]\n },\n {\n tag: '833',\n subfields: [\n {\n code: 'p',\n value: '(FI-MELINDA)2620'\n },\n {\n code: 'w',\n value: '(FI-MELINDA)8850'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: true, messages: []});\n });\n\n it('Finds prefixPattern on record but values not resolvable', async () => {\n const mock = fetchMock.sandbox();\n mock.get(`${endpoint}${queryParam}1000`, fixture1000);\n\n testContext.default.__Rewire__('fetch', mock);\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '123456'\n },\n {\n tag: '035',\n subfields: [\n {\n code: 'a',\n value: '(FI-MELINDA)123456'\n }\n ]\n },\n {\n tag: '773',\n subfields: [\n {\n code: 'w',\n value: '(FOOBAR)1000'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: false, messages: ['Field 773$w with value 1000 is not resolvable']});\n });\n });\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"resolvable-ext-references-melinda.spec.js","names":["_chai","_interopRequireDefault","require","_chaiAsPromised","_marcRecord","_fetchMock","testContext","_interopRequireWildcard","_resolvableExtReferencesMelinda2","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","obj","expect","chai","use","chaiAsPromised","endpoint","queryParam","prefixPattern","fields","describe","afterEach","__ResetDependency__","it","validator","to","be","an","that","any","keys","description","validate","rejectedWith","Error","mock","fetchMock","sandbox","fixture5000","fixture9550","__Rewire__","record","MarcRecord","tag","value","subfields","code","result","eql","valid","messages","fixture1000"],"sources":["../src/resolvable-ext-references-melinda.spec.js"],"sourcesContent":["import chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport fetchMock from 'fetch-mock';\nimport * as testContext from '../src/resolvable-ext-references-melinda';\nimport {fixture5000, fixture9550, fixture1000} from '../test-fixtures/resolvable-ext-references-melinda';\n\nconst {expect} = chai;\nchai.use(chaiAsPromised);\n\nconst endpoint = 'http://melinda.kansalliskirjasto.fi:210/fin01';\nconst queryParam = '?operation=searchRetrieve&maximumRecords=2&version=1&query=rec.id=';\nconst prefixPattern = /^\\(FOOBAR\\)/u;\nconst fields = {\n 773: ['w'],\n 833: ['w', 'p']\n};\n\ndescribe('resolvable-ext-references-melinda', () => {\n afterEach(() => {\n testContext.default.__ResetDependency__('fetch');\n });\n\n it('Creates a validator', async () => {\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n it('Throws an error when prefixPattern not provided', async () => {\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n // Cannot read property 'fields' of undefined or Cannot read properties of undefined (reading 'fields')'\n await expect(validator.validate()).to.be.rejectedWith(Error, /^Cannot read propert/u);\n });\n\n describe('#validate', () => {\n it('Finds prefixPattern on record and removes it', async () => {\n const mock = fetchMock.sandbox();\n mock.get(`${endpoint}${queryParam}5000`, fixture5000);\n mock.get(`${endpoint}${queryParam}9550`, fixture9550);\n\n testContext.default.__Rewire__('fetch', mock);\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '123456'\n },\n {\n tag: '035',\n subfields: [\n {\n code: 'a',\n value: '(FI-MELINDA)123456'\n }\n ]\n },\n {\n tag: '773',\n subfields: [\n {\n code: 'w',\n value: '(FOOBAR)5000'\n }\n ]\n },\n {\n tag: '833',\n subfields: [\n {\n code: 'p',\n value: '(FOOBAR)9550'\n },\n {\n code: 'c',\n value: '(FI-MELINDA)8850'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: true, messages: []});\n });\n\n it('Finds no matching prefixPattern on record', async () => {\n const mock = fetchMock.sandbox();\n\n mock.get(`${endpoint}5000`, fixture5000);\n\n testContext.default.__Rewire__('fetch', mock);\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '123456'\n },\n {\n tag: '035',\n subfields: [\n {\n code: 'a',\n value: '(FI-MELINDA)123456'\n }\n ]\n },\n {\n tag: '773',\n subfields: [\n {\n code: 'w',\n value: '(FI-MELINDA)123456'\n }\n ]\n },\n {\n tag: '833',\n subfields: [\n {\n code: 'p',\n value: '(FI-MELINDA)2620'\n },\n {\n code: 'w',\n value: '(FI-MELINDA)8850'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: true, messages: []});\n });\n\n it('Finds prefixPattern on record but values not resolvable', async () => {\n const mock = fetchMock.sandbox();\n mock.get(`${endpoint}${queryParam}1000`, fixture1000);\n\n testContext.default.__Rewire__('fetch', mock);\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '123456'\n },\n {\n tag: '035',\n subfields: [\n {\n code: 'a',\n value: '(FI-MELINDA)123456'\n }\n ]\n },\n {\n tag: '773',\n subfields: [\n {\n code: 'w',\n value: '(FOOBAR)1000'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: false, messages: ['Field 773$w with value 1000 is not resolvable']});\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"resolveOrphanedSubfield6s.js","names":["_debug","_interopRequireDefault","require","_utils","_subfield6Utils","obj","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","recordFixSubfield6OccurrenceNumbers","fieldsContainingSubfield6","fields","filter","field","fieldHasSubfield","orphanedFields","getOrphanedFields","length","forEach","fieldFixOrphanedSubfields","tag","subfields","sf","field880FixOrphanedSubfield","remainingSubfields","isOrphanedSubfield","removeField","subfield","subfield6ResetOccurrenceNumber","findPairForSubfield6OccurrenceNumber","subfield6","myTag","candPairFields","isValidSubfield6","undefined","subfieldToString","fieldToString","referredTag","value","substring","occurrenceNumber","subfield6GetOccurrenceNumber","tagAndOccurrenceNumber","relevantFields","fieldHasWantedTagAndOccurrenceNumber","pairCandidateFields","isOrphanedField","candidatePairFields","some"],"sources":["../src/resolveOrphanedSubfield6s.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString, nvdebug, subfieldToString} from './utils';\nimport {fieldHasWantedTagAndOccurrenceNumber, isValidSubfield6, subfield6GetOccurrenceNumber, subfield6ResetOccurrenceNumber} from './subfield6Utils';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:resolveOrphanedSubfield6s');\n\nexport default function () {\n return {\n description: 'Remove occurrence-number-orphaned $6 subfields. In field 880, occurrence number becomes 00',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix SF6 orphaned occurrence numbers');\n const res = {message: [], fix: [], valid: true};\n //message.fix = []; // eslint-disable-line functional/immutable-data\n\n // This can not really fail...\n recordFixSubfield6OccurrenceNumbers(record);\n\n //message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validate(record) {\n // Check max, and check number of different indexes\n nvdebug('Validate SF6 orphaned occurrence numbers', debug);\n const fieldsContainingSubfield6 = record.fields.filter(field => fieldHasSubfield(field, '6'));\n\n const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);\n\n const res = {message: []};\n\n if (orphanedFields.length > 0) { // eslint-disable-line functional/no-conditional-statements\n res.message = [`${orphanedFields.length} orphaned occurrence number field(s) detected`]; // eslint-disable-line functional/immutable-data\n }\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\nexport function recordFixSubfield6OccurrenceNumbers(record) {\n const fieldsContainingSubfield6 = record.fields.filter(field => fieldHasSubfield(field, '6'));\n const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);\n\n orphanedFields.forEach(field => fieldFixOrphanedSubfields(field));\n\n function fieldFixOrphanedSubfields(field) {\n // Field 880: orphaned $6 subfields: occurrence number is changed to '00':\n if (field.tag === '880') {\n field.subfields.forEach(sf => field880FixOrphanedSubfield(sf));\n return;\n }\n // Non-880 fields get their orphaned $6s removed:\n const remainingSubfields = field.subfields.filter(sf => !isOrphanedSubfield(sf, field.tag, fieldsContainingSubfield6));\n if (remainingSubfields.length === 0) {\n record.removeField(field);\n return;\n }\n field.subfields = remainingSubfields; // eslint-disable-line functional/immutable-data\n }\n\n function field880FixOrphanedSubfield(subfield) {\n if (!isOrphanedSubfield(subfield, '880', fieldsContainingSubfield6)) {\n return;\n }\n // convert occurrence number to 00\n subfield6ResetOccurrenceNumber(subfield, '00');\n }\n}\n\n\nfunction findPairForSubfield6OccurrenceNumber(subfield6, myTag, candPairFields) {\n // We keep the crap!\n if (!isValidSubfield6(subfield6)) {\n return undefined;\n }\n nvdebug(`LOOKING FOR PAIR: ${myTag} ${subfieldToString(subfield6)}`);\n candPairFields.forEach(field => fieldToString(field));\n\n // Only valid $6 value that fails to map to another field is iffy...\n const referredTag = subfield6.value.substring(0, 3);\n\n const occurrenceNumber = subfield6GetOccurrenceNumber(subfield6);\n if (occurrenceNumber === '00') {\n return undefined;\n }\n const tagAndOccurrenceNumber = `${myTag}-${occurrenceNumber}`;\n nvdebug(`Try to find occurrence number ${tagAndOccurrenceNumber} in field ${referredTag}...`);\n //const relevantFields = fields.filter(field => field.tag === referredTag && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber));\n const relevantFields = candPairFields.filter(field => field.tag === referredTag && fieldHasWantedTagAndOccurrenceNumber(field, tagAndOccurrenceNumber));\n if (relevantFields.length === 0) {\n return undefined;\n }\n // This should always return just one (not sanity checking this for now):\n return relevantFields[0];\n}\n\nfunction isOrphanedSubfield(subfield, tag, pairCandidateFields) {\n if (!isValidSubfield6(subfield) || subfield6GetOccurrenceNumber(subfield) === '00') {\n return false;\n }\n return !findPairForSubfield6OccurrenceNumber(subfield, tag, pairCandidateFields);\n}\n\n\nfunction isOrphanedField(field, candidatePairFields) {\n return field.subfields.some(sf => isOrphanedSubfield(sf, field.tag, candidatePairFields));\n}\n\nfunction getOrphanedFields(relevantFields) {\n return relevantFields.filter(field => isOrphanedField(field, relevantFields));\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"resolveOrphanedSubfield6s.js","names":["_debug","_interopRequireDefault","require","_utils","_subfield6Utils","obj","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","recordFixSubfield6OccurrenceNumbers","fieldsContainingSubfield6","fields","filter","field","fieldHasSubfield","orphanedFields","getOrphanedFields","length","forEach","fieldFixOrphanedSubfields","tag","subfields","sf","field880FixOrphanedSubfield","remainingSubfields","isOrphanedSubfield","removeField","subfield","subfield6ResetOccurrenceNumber","findPairForSubfield6OccurrenceNumber","subfield6","myTag","candPairFields","isValidSubfield6","undefined","subfieldToString","fieldToString","referredTag","value","substring","occurrenceNumber","subfield6GetOccurrenceNumber","tagAndOccurrenceNumber","relevantFields","fieldHasWantedTagAndOccurrenceNumber","pairCandidateFields","isOrphanedField","candidatePairFields","some"],"sources":["../src/resolveOrphanedSubfield6s.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString, nvdebug, subfieldToString} from './utils';\nimport {fieldHasWantedTagAndOccurrenceNumber, isValidSubfield6, subfield6GetOccurrenceNumber, subfield6ResetOccurrenceNumber} from './subfield6Utils';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:resolveOrphanedSubfield6s');\n\nexport default function () {\n return {\n description: 'Remove occurrence-number-orphaned $6 subfields. In field 880, occurrence number becomes 00',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix SF6 orphaned occurrence numbers');\n const res = {message: [], fix: [], valid: true};\n //message.fix = []; // eslint-disable-line functional/immutable-data\n\n // This can not really fail...\n recordFixSubfield6OccurrenceNumbers(record);\n\n //message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validate(record) {\n // Check max, and check number of different indexes\n nvdebug('Validate SF6 orphaned occurrence numbers', debug);\n const fieldsContainingSubfield6 = record.fields.filter(field => fieldHasSubfield(field, '6'));\n\n const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);\n\n const res = {message: []};\n\n if (orphanedFields.length > 0) { // eslint-disable-line functional/no-conditional-statements\n res.message = [`${orphanedFields.length} orphaned occurrence number field(s) detected`]; // eslint-disable-line functional/immutable-data\n }\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\nexport function recordFixSubfield6OccurrenceNumbers(record) {\n const fieldsContainingSubfield6 = record.fields.filter(field => fieldHasSubfield(field, '6'));\n const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);\n\n orphanedFields.forEach(field => fieldFixOrphanedSubfields(field));\n\n function fieldFixOrphanedSubfields(field) {\n // Field 880: orphaned $6 subfields: occurrence number is changed to '00':\n if (field.tag === '880') {\n field.subfields.forEach(sf => field880FixOrphanedSubfield(sf));\n return;\n }\n // Non-880 fields get their orphaned $6s removed:\n const remainingSubfields = field.subfields.filter(sf => !isOrphanedSubfield(sf, field.tag, fieldsContainingSubfield6));\n if (remainingSubfields.length === 0) {\n record.removeField(field);\n return;\n }\n field.subfields = remainingSubfields; // eslint-disable-line functional/immutable-data\n }\n\n function field880FixOrphanedSubfield(subfield) {\n if (!isOrphanedSubfield(subfield, '880', fieldsContainingSubfield6)) {\n return;\n }\n // convert occurrence number to 00\n subfield6ResetOccurrenceNumber(subfield, '00');\n }\n}\n\n\nfunction findPairForSubfield6OccurrenceNumber(subfield6, myTag, candPairFields) {\n // We keep the crap!\n if (!isValidSubfield6(subfield6)) {\n return undefined;\n }\n nvdebug(`LOOKING FOR PAIR: ${myTag} ${subfieldToString(subfield6)}`);\n candPairFields.forEach(field => fieldToString(field));\n\n // Only valid $6 value that fails to map to another field is iffy...\n const referredTag = subfield6.value.substring(0, 3);\n\n const occurrenceNumber = subfield6GetOccurrenceNumber(subfield6);\n if (occurrenceNumber === '00') {\n return undefined;\n }\n const tagAndOccurrenceNumber = `${myTag}-${occurrenceNumber}`;\n nvdebug(`Try to find occurrence number ${tagAndOccurrenceNumber} in field ${referredTag}...`);\n //const relevantFields = fields.filter(field => field.tag === referredTag && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber));\n const relevantFields = candPairFields.filter(field => field.tag === referredTag && fieldHasWantedTagAndOccurrenceNumber(field, tagAndOccurrenceNumber));\n if (relevantFields.length === 0) {\n return undefined;\n }\n // This should always return just one (not sanity checking this for now):\n return relevantFields[0];\n}\n\nfunction isOrphanedSubfield(subfield, tag, pairCandidateFields) {\n if (!isValidSubfield6(subfield) || subfield6GetOccurrenceNumber(subfield) === '00') {\n return false;\n }\n return !findPairForSubfield6OccurrenceNumber(subfield, tag, pairCandidateFields);\n}\n\n\nfunction isOrphanedField(field, candidatePairFields) {\n return field.subfields.some(sf => isOrphanedSubfield(sf, field.tag, candidatePairFields));\n}\n\nfunction getOrphanedFields(relevantFields) {\n return relevantFields.filter(field => isOrphanedField(field, relevantFields));\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"resolveOrphanedSubfield6s.spec.js","names":["_chai","require","_marcRecord","_resolveOrphanedSubfield6s","_interopRequireDefault","_fixura","_fixugen","_debug","obj","__esModule","default","generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","debug","createDebugLogger","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","getFixture","enabled","fix","record","MarcRecord","expectedResult","result","eql"],"sources":["../src/resolveOrphanedSubfield6s.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './resolveOrphanedSubfield6s';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'remove-orphanded-sf6s'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/resolveOrphanedSubfield6s:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n}\n\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n expect(result).to.eql(expectedResult);\n return;\n }\n\n await validator.fix(record);\n expect(record).to.eql(expectedResult);\n}\n"],"mappings":";;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,0BAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAF,sBAAA,CAAAH,OAAA;AACA,IAAAM,MAAA,GAAAH,sBAAA,CAAAH,OAAA;AAAsC,SAAAG,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEtC,IAAAG,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,uBAAuB,CAAC;EACjEC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAEA,CAAA,KAAMC,oBAAoB,CAAC;EACrC;AACF,CAAC,CAAC;AACF,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,yEAAyE,CAAC;AAE1G,eAAeF,oBAAoBA,CAAA,EAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,kCAAgB,EAAC,CAAC;EAE1C,IAAAC,YAAM,EAACF,SAAS,CAAC,CACdG,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,QAAQ,CAAC,CAClBC,IAAI,CAACC,GAAG,CAACC,GAAG,CAACC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;EAE/C,IAAAP,YAAM,EAACF,SAAS,CAACU,WAAW,CAAC,CAACP,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,QAAQ,CAAC;EAC/C,IAAAT,YAAM,EAACF,SAAS,CAACY,QAAQ,CAAC,CAACT,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,UAAU,CAAC;AAChD;AAEA,eAAezB,QAAQA,CAAC;EAAC2B,UAAU;EAAEC,OAAO,GAAG,IAAI;EAAEC,GAAG,GAAG;AAAK,CAAC,EAAE;EACjE,IAAID,OAAO,KAAK,KAAK,EAAE;IACrBhB,KAAK,CAAC,eAAe,CAAC;IACtB;EACF;EAEA,MAAME,SAAS,GAAG,MAAM,IAAAC,kCAAgB,EAAC,CAAC;EAC1C,MAAMe,MAAM,GAAG,IAAIC,sBAAU,CAACJ,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMK,cAAc,GAAGL,UAAU,CAAC,qBAAqB,CAAC;EACxD;;EAEA,IAAI,CAACE,GAAG,EAAE;IACR,MAAMI,MAAM,GAAG,MAAMnB,SAAS,CAACY,QAAQ,CAACI,MAAM,CAAC;IAC/C,IAAAd,YAAM,EAACiB,MAAM,CAAC,CAAChB,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;IACrC;EACF;EAEA,MAAMlB,SAAS,CAACe,GAAG,CAACC,MAAM,CAAC;EAC3B,IAAAd,YAAM,EAACc,MAAM,CAAC,CAACb,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;AACvC"}
1
+ {"version":3,"file":"resolveOrphanedSubfield6s.spec.js","names":["_chai","require","_marcRecord","_resolveOrphanedSubfield6s","_interopRequireDefault","_fixura","_fixugen","_debug","obj","__esModule","default","generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","debug","createDebugLogger","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","getFixture","enabled","fix","record","MarcRecord","expectedResult","result","eql"],"sources":["../src/resolveOrphanedSubfield6s.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './resolveOrphanedSubfield6s';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'remove-orphanded-sf6s'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/resolveOrphanedSubfield6s:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n}\n\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n expect(result).to.eql(expectedResult);\n return;\n }\n\n await validator.fix(record);\n expect(record).to.eql(expectedResult);\n}\n"],"mappings":";;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,0BAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAF,sBAAA,CAAAH,OAAA;AACA,IAAAM,MAAA,GAAAH,sBAAA,CAAAH,OAAA;AAAsC,SAAAG,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEtC,IAAAG,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,uBAAuB,CAAC;EACjEC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAEA,CAAA,KAAMC,oBAAoB,CAAC;EACrC;AACF,CAAC,CAAC;AACF,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,yEAAyE,CAAC;AAE1G,eAAeF,oBAAoBA,CAAA,EAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,kCAAgB,EAAC,CAAC;EAE1C,IAAAC,YAAM,EAACF,SAAS,CAAC,CACdG,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,QAAQ,CAAC,CAClBC,IAAI,CAACC,GAAG,CAACC,GAAG,CAACC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;EAE/C,IAAAP,YAAM,EAACF,SAAS,CAACU,WAAW,CAAC,CAACP,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,QAAQ,CAAC;EAC/C,IAAAT,YAAM,EAACF,SAAS,CAACY,QAAQ,CAAC,CAACT,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,UAAU,CAAC;AAChD;AAEA,eAAezB,QAAQA,CAAC;EAAC2B,UAAU;EAAEC,OAAO,GAAG,IAAI;EAAEC,GAAG,GAAG;AAAK,CAAC,EAAE;EACjE,IAAID,OAAO,KAAK,KAAK,EAAE;IACrBhB,KAAK,CAAC,eAAe,CAAC;IACtB;EACF;EAEA,MAAME,SAAS,GAAG,MAAM,IAAAC,kCAAgB,EAAC,CAAC;EAC1C,MAAMe,MAAM,GAAG,IAAIC,sBAAU,CAACJ,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMK,cAAc,GAAGL,UAAU,CAAC,qBAAqB,CAAC;EACxD;;EAEA,IAAI,CAACE,GAAG,EAAE;IACR,MAAMI,MAAM,GAAG,MAAMnB,SAAS,CAACY,QAAQ,CAACI,MAAM,CAAC;IAC/C,IAAAd,YAAM,EAACiB,MAAM,CAAC,CAAChB,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;IACrC;EACF;EAEA,MAAMlB,SAAS,CAACe,GAAG,CAACC,MAAM,CAAC;EAC3B,IAAAd,YAAM,EAACc,MAAM,CAAC,CAACb,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;AACvC","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize-vocabulary-source-codes.js","names":["_utils","require","_clone","_interopRequireDefault","obj","__esModule","default","_default","description","validate","fix","record","res","message","valid","fields","forEach","f","fieldSanitizeVocabularySourceCode","field","validateField","length","subfields","orig","fieldToString","normalizedField","clone","mod","push","fieldHasUnfixableVocabularySourceCode","tag","match","sf","subfieldSanitizeVocabularySourceCode","subfield","code","value","stringFixVocabularySourceCode","legalSubfieldCode","tmp","replace","includes","some","subfieldHasUnfixableVocabularySourceCode","indexOf"],"sources":["../src/sanitize-vocabulary-source-codes.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 sanitizing vocabulary source codes in subfield $2 (MRA-532)',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n record.fields.forEach(f => fieldSanitizeVocabularySourceCode(f));\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 = fieldSanitizeVocabularySourceCode(clone(field));\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 // Handle illegal values here\n if (fieldHasUnfixableVocabularySourceCode(field)) {\n res.message.push(`CAN'T BE FIXED AUTOMATICALLY: '${orig}'`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n\n function fieldSanitizeVocabularySourceCode(field) {\n if (!field.tag.match(/^(?:6..|257|370|38.)$/u)) {\n return field;\n }\n\n field.subfields.forEach(sf => subfieldSanitizeVocabularySourceCode(sf));\n return field;\n }\n\n function subfieldSanitizeVocabularySourceCode(subfield) {\n if (subfield.code !== '2') {\n return;\n }\n subfield.value = stringFixVocabularySourceCode(subfield.value); // eslint-disable-line functional/immutable-data\n }\n\n}\n\n// Note that language suffix is optional\nconst legalSubfieldCode = ['allars', 'kauno', 'kauno/fin', 'kauno/swe', 'mts', 'mts/fin', 'mts/swe', 'slm', 'slm/fin', 'slm/swe', 'ysa', 'yso', 'yso/eng', 'yso/fin', 'yso/sme', 'yso/swe'];\n\nfunction stringFixVocabularySourceCode(value) {\n // Try to remove spaces, change '//' to '/' and remove final '.' and '/':\n const tmp = value.replace(/ /ug, '')\n .replace(/\\/+/ug, '/')\n .replace(/(.)[./]$/gu, '$1') // eslint-disable-line prefer-named-capture-group\n .replace(/^yso-(?:aika|paikat)\\//u, 'yso/'); // IMP-HELMET crap. Also, they still have a '.' at the end of $a...\n\n // NB! Use the modified value ONLY if the result (tmp variable) is a legal subfield code...\n if (legalSubfieldCode.includes(tmp)) {\n return tmp;\n }\n\n return value;\n}\n\nfunction fieldHasUnfixableVocabularySourceCode(field) {\n return field.subfields.some(sf => subfieldHasUnfixableVocabularySourceCode(sf));\n}\n\nfunction subfieldHasUnfixableVocabularySourceCode(subfield) {\n // As we can't fix this here, apply this yso-rule only when validating!\n if (subfield.value.indexOf('yso/') === 0) {\n return !['yso/eng', 'yso/fin', 'yso/sme', 'yso/swe'].includes(subfield.value);\n }\n\n if (subfield.value.indexOf('slm/') === 0) {\n return !['slm/fin', 'slm/swe'].includes(subfield.value);\n }\n\n if (subfield.value.indexOf('mts/') === 0) {\n return !['mts/fin', 'mts/swe'].includes(subfield.value);\n }\n\n if (subfield.value.indexOf('kauno/') === 0) {\n return !['kauno/fin', 'kauno/swe'].includes(subfield.value);\n }\n\n return false;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"sanitize-vocabulary-source-codes.js","names":["_utils","require","_clone","_interopRequireDefault","obj","__esModule","default","_default","description","validate","fix","record","res","message","valid","fields","forEach","f","fieldSanitizeVocabularySourceCode","field","validateField","length","subfields","orig","fieldToString","normalizedField","clone","mod","push","fieldHasUnfixableVocabularySourceCode","tag","match","sf","subfieldSanitizeVocabularySourceCode","subfield","code","value","stringFixVocabularySourceCode","legalSubfieldCode","tmp","replace","includes","some","subfieldHasUnfixableVocabularySourceCode","indexOf"],"sources":["../src/sanitize-vocabulary-source-codes.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 sanitizing vocabulary source codes in subfield $2 (MRA-532)',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n record.fields.forEach(f => fieldSanitizeVocabularySourceCode(f));\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 = fieldSanitizeVocabularySourceCode(clone(field));\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 // Handle illegal values here\n if (fieldHasUnfixableVocabularySourceCode(field)) {\n res.message.push(`CAN'T BE FIXED AUTOMATICALLY: '${orig}'`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n\n function fieldSanitizeVocabularySourceCode(field) {\n if (!field.tag.match(/^(?:6..|257|370|38.)$/u)) {\n return field;\n }\n\n field.subfields.forEach(sf => subfieldSanitizeVocabularySourceCode(sf));\n return field;\n }\n\n function subfieldSanitizeVocabularySourceCode(subfield) {\n if (subfield.code !== '2') {\n return;\n }\n subfield.value = stringFixVocabularySourceCode(subfield.value); // eslint-disable-line functional/immutable-data\n }\n\n}\n\n// Note that language suffix is optional\nconst legalSubfieldCode = ['allars', 'kauno', 'kauno/fin', 'kauno/swe', 'mts', 'mts/fin', 'mts/swe', 'slm', 'slm/fin', 'slm/swe', 'ysa', 'yso', 'yso/eng', 'yso/fin', 'yso/sme', 'yso/swe'];\n\nfunction stringFixVocabularySourceCode(value) {\n // Try to remove spaces, change '//' to '/' and remove final '.' and '/':\n const tmp = value.replace(/ /ug, '')\n .replace(/\\/+/ug, '/')\n .replace(/(.)[./]$/gu, '$1') // eslint-disable-line prefer-named-capture-group\n .replace(/^yso-(?:aika|paikat)\\//u, 'yso/'); // IMP-HELMET crap. Also, they still have a '.' at the end of $a...\n\n // NB! Use the modified value ONLY if the result (tmp variable) is a legal subfield code...\n if (legalSubfieldCode.includes(tmp)) {\n return tmp;\n }\n\n return value;\n}\n\nfunction fieldHasUnfixableVocabularySourceCode(field) {\n return field.subfields.some(sf => subfieldHasUnfixableVocabularySourceCode(sf));\n}\n\nfunction subfieldHasUnfixableVocabularySourceCode(subfield) {\n // As we can't fix this here, apply this yso-rule only when validating!\n if (subfield.value.indexOf('yso/') === 0) {\n return !['yso/eng', 'yso/fin', 'yso/sme', 'yso/swe'].includes(subfield.value);\n }\n\n if (subfield.value.indexOf('slm/') === 0) {\n return !['slm/fin', 'slm/swe'].includes(subfield.value);\n }\n\n if (subfield.value.indexOf('mts/') === 0) {\n return !['mts/fin', 'mts/swe'].includes(subfield.value);\n }\n\n if (subfield.value.indexOf('kauno/') === 0) {\n return !['kauno/fin', 'kauno/swe'].includes(subfield.value);\n }\n\n return false;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize-vocabulary-source-codes.spec.js","names":["_chai","require","_marcRecord","_sanitizeVocabularySourceCodes","_interopRequireDefault","_fixura","_fixugen","_debug","obj","__esModule","default","generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","debug","createDebugLogger","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","getFixture","enabled","fix","record","MarcRecord","expectedResult","result","eql"],"sources":["../src/sanitize-vocabulary-source-codes.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './sanitize-vocabulary-source-codes';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'sanitize-vocabulary-source-codes'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n}\n\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n expect(result).to.eql(expectedResult);\n return;\n }\n\n await validator.fix(record);\n expect(record).to.eql(expectedResult);\n}\n"],"mappings":";;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,8BAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAF,sBAAA,CAAAH,OAAA;AACA,IAAAM,MAAA,GAAAH,sBAAA,CAAAH,OAAA;AAAsC,SAAAG,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEtC,IAAAG,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,kCAAkC,CAAC;EAC5EC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAEA,CAAA,KAAMC,oBAAoB,CAAC;EACrC;AACF,CAAC,CAAC;AACF,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,gFAAgF,CAAC;AAEjH,eAAeF,oBAAoBA,CAAA,EAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,sCAAgB,EAAC,CAAC;EAE1C,IAAAC,YAAM,EAACF,SAAS,CAAC,CACdG,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,QAAQ,CAAC,CAClBC,IAAI,CAACC,GAAG,CAACC,GAAG,CAACC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;EAE/C,IAAAP,YAAM,EAACF,SAAS,CAACU,WAAW,CAAC,CAACP,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,QAAQ,CAAC;EAC/C,IAAAT,YAAM,EAACF,SAAS,CAACY,QAAQ,CAAC,CAACT,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,UAAU,CAAC;AAChD;AAEA,eAAezB,QAAQA,CAAC;EAAC2B,UAAU;EAAEC,OAAO,GAAG,IAAI;EAAEC,GAAG,GAAG;AAAK,CAAC,EAAE;EACjE,IAAID,OAAO,KAAK,KAAK,EAAE;IACrBhB,KAAK,CAAC,eAAe,CAAC;IACtB;EACF;EAEA,MAAME,SAAS,GAAG,MAAM,IAAAC,sCAAgB,EAAC,CAAC;EAC1C,MAAMe,MAAM,GAAG,IAAIC,sBAAU,CAACJ,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMK,cAAc,GAAGL,UAAU,CAAC,qBAAqB,CAAC;EACxD;;EAEA,IAAI,CAACE,GAAG,EAAE;IACR,MAAMI,MAAM,GAAG,MAAMnB,SAAS,CAACY,QAAQ,CAACI,MAAM,CAAC;IAC/C,IAAAd,YAAM,EAACiB,MAAM,CAAC,CAAChB,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;IACrC;EACF;EAEA,MAAMlB,SAAS,CAACe,GAAG,CAACC,MAAM,CAAC;EAC3B,IAAAd,YAAM,EAACc,MAAM,CAAC,CAACb,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;AACvC"}
1
+ {"version":3,"file":"sanitize-vocabulary-source-codes.spec.js","names":["_chai","require","_marcRecord","_sanitizeVocabularySourceCodes","_interopRequireDefault","_fixura","_fixugen","_debug","obj","__esModule","default","generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","debug","createDebugLogger","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","getFixture","enabled","fix","record","MarcRecord","expectedResult","result","eql"],"sources":["../src/sanitize-vocabulary-source-codes.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './sanitize-vocabulary-source-codes';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'sanitize-vocabulary-source-codes'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n}\n\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n expect(result).to.eql(expectedResult);\n return;\n }\n\n await validator.fix(record);\n expect(record).to.eql(expectedResult);\n}\n"],"mappings":";;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,8BAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAF,sBAAA,CAAAH,OAAA;AACA,IAAAM,MAAA,GAAAH,sBAAA,CAAAH,OAAA;AAAsC,SAAAG,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEtC,IAAAG,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,kCAAkC,CAAC;EAC5EC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAEA,CAAA,KAAMC,oBAAoB,CAAC;EACrC;AACF,CAAC,CAAC;AACF,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,gFAAgF,CAAC;AAEjH,eAAeF,oBAAoBA,CAAA,EAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,sCAAgB,EAAC,CAAC;EAE1C,IAAAC,YAAM,EAACF,SAAS,CAAC,CACdG,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,QAAQ,CAAC,CAClBC,IAAI,CAACC,GAAG,CAACC,GAAG,CAACC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;EAE/C,IAAAP,YAAM,EAACF,SAAS,CAACU,WAAW,CAAC,CAACP,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,QAAQ,CAAC;EAC/C,IAAAT,YAAM,EAACF,SAAS,CAACY,QAAQ,CAAC,CAACT,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,UAAU,CAAC;AAChD;AAEA,eAAezB,QAAQA,CAAC;EAAC2B,UAAU;EAAEC,OAAO,GAAG,IAAI;EAAEC,GAAG,GAAG;AAAK,CAAC,EAAE;EACjE,IAAID,OAAO,KAAK,KAAK,EAAE;IACrBhB,KAAK,CAAC,eAAe,CAAC;IACtB;EACF;EAEA,MAAME,SAAS,GAAG,MAAM,IAAAC,sCAAgB,EAAC,CAAC;EAC1C,MAAMe,MAAM,GAAG,IAAIC,sBAAU,CAACJ,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMK,cAAc,GAAGL,UAAU,CAAC,qBAAqB,CAAC;EACxD;;EAEA,IAAI,CAACE,GAAG,EAAE;IACR,MAAMI,MAAM,GAAG,MAAMnB,SAAS,CAACY,QAAQ,CAACI,MAAM,CAAC;IAC/C,IAAAd,YAAM,EAACiB,MAAM,CAAC,CAAChB,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;IACrC;EACF;EAEA,MAAMlB,SAAS,CAACe,GAAG,CAACC,MAAM,CAAC;EAC3B,IAAAd,YAAM,EAACc,MAAM,CAAC,CAACb,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;AACvC","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"sort-tags.js","names":["_marcRecord","require","_default","tagPattern","description","validate","fix","record","sort","MarcRecord","isEqual","fields","valid","messages","sortPatternFields","sortFields","matchingTags","map","field","some","pattern","test","tag","filter","sortedArray","fixedArray","splice","index","a","b","findIndex"],"sources":["../src/sort-tags.js"],"sourcesContent":["import {MarcRecord} from '@natlibfi/marc-record';\n\nexport default function (tagPattern) {\n return {\n description:\n 'Handles field ordering',\n validate,\n fix: async record => ({\n fix: await sort(record, tagPattern)\n })\n };\n\n function validate(record, tagPattern) {\n return MarcRecord.isEqual(record.fields, sort(record.fields, tagPattern)) ? {valid: true, messages: []} : {valid: false, messages: ['Fields are in incorrect order']};\n }\n\n function sort(record, tagPattern) {\n if (tagPattern) {\n return sortPatternFields(record, tagPattern);\n }\n\n return sortFields(record);\n }\n}\n\nfunction sortPatternFields(record, tagPattern) {\n const matchingTags = record.fields.map(field => tagPattern.some(pattern => pattern.test(field.tag)) ? field : null).filter(tag => tag);\n const sortedArray = sortFields(record.fields);\n const fixedArray = sortedArray.filter(field => !tagPattern.some(pattern => pattern.test(field.tag)));\n fixedArray.splice(index(sortedArray, tagPattern), 0, ...matchingTags); // eslint-disable-line functional/immutable-data\n record.fields = fixedArray; // eslint-disable-line functional/immutable-data\n}\n\nfunction sortFields(fields) {\n return [...fields].sort((a, b) => {\n if (a.tag > b.tag) {\n return 1;\n }\n if (b.tag > a.tag) {\n return -1;\n }\n return 0;\n });\n}\n\nfunction index(fields, tagPattern) {\n return fields.findIndex(field => tagPattern.some(pattern => pattern.test(field.tag)));\n}\n"],"mappings":";;;;;;AAAA,IAAAA,WAAA,GAAAC,OAAA;AAEe,SAAAC,SAAUC,UAAU,EAAE;EACnC,OAAO;IACLC,WAAW,EACT,wBAAwB;IAC1BC,QAAQ;IACRC,GAAG,EAAE,MAAMC,MAAM,KAAK;MACpBD,GAAG,EAAE,MAAME,IAAI,CAACD,MAAM,EAAEJ,UAAU;IACpC,CAAC;EACH,CAAC;EAED,SAASE,QAAQA,CAACE,MAAM,EAAEJ,UAAU,EAAE;IACpC,OAAOM,sBAAU,CAACC,OAAO,CAACH,MAAM,CAACI,MAAM,EAAEH,IAAI,CAACD,MAAM,CAACI,MAAM,EAAER,UAAU,CAAC,CAAC,GAAG;MAACS,KAAK,EAAE,IAAI;MAAEC,QAAQ,EAAE;IAAE,CAAC,GAAG;MAACD,KAAK,EAAE,KAAK;MAAEC,QAAQ,EAAE,CAAC,+BAA+B;IAAC,CAAC;EACvK;EAEA,SAASL,IAAIA,CAACD,MAAM,EAAEJ,UAAU,EAAE;IAChC,IAAIA,UAAU,EAAE;MACd,OAAOW,iBAAiB,CAACP,MAAM,EAAEJ,UAAU,CAAC;IAC9C;IAEA,OAAOY,UAAU,CAACR,MAAM,CAAC;EAC3B;AACF;AAEA,SAASO,iBAAiBA,CAACP,MAAM,EAAEJ,UAAU,EAAE;EAC7C,MAAMa,YAAY,GAAGT,MAAM,CAACI,MAAM,CAACM,GAAG,CAACC,KAAK,IAAIf,UAAU,CAACgB,IAAI,CAACC,OAAO,IAAIA,OAAO,CAACC,IAAI,CAACH,KAAK,CAACI,GAAG,CAAC,CAAC,GAAGJ,KAAK,GAAG,IAAI,CAAC,CAACK,MAAM,CAACD,GAAG,IAAIA,GAAG,CAAC;EACtI,MAAME,WAAW,GAAGT,UAAU,CAACR,MAAM,CAACI,MAAM,CAAC;EAC7C,MAAMc,UAAU,GAAGD,WAAW,CAACD,MAAM,CAACL,KAAK,IAAI,CAACf,UAAU,CAACgB,IAAI,CAACC,OAAO,IAAIA,OAAO,CAACC,IAAI,CAACH,KAAK,CAACI,GAAG,CAAC,CAAC,CAAC;EACpGG,UAAU,CAACC,MAAM,CAACC,KAAK,CAACH,WAAW,EAAErB,UAAU,CAAC,EAAE,CAAC,EAAE,GAAGa,YAAY,CAAC,CAAC,CAAC;EACvET,MAAM,CAACI,MAAM,GAAGc,UAAU,CAAC,CAAC;AAC9B;AAEA,SAASV,UAAUA,CAACJ,MAAM,EAAE;EAC1B,OAAO,CAAC,GAAGA,MAAM,CAAC,CAACH,IAAI,CAAC,CAACoB,CAAC,EAAEC,CAAC,KAAK;IAChC,IAAID,CAAC,CAACN,GAAG,GAAGO,CAAC,CAACP,GAAG,EAAE;MACjB,OAAO,CAAC;IACV;IACA,IAAIO,CAAC,CAACP,GAAG,GAAGM,CAAC,CAACN,GAAG,EAAE;MACjB,OAAO,CAAC,CAAC;IACX;IACA,OAAO,CAAC;EACV,CAAC,CAAC;AACJ;AAEA,SAASK,KAAKA,CAAChB,MAAM,EAAER,UAAU,EAAE;EACjC,OAAOQ,MAAM,CAACmB,SAAS,CAACZ,KAAK,IAAIf,UAAU,CAACgB,IAAI,CAACC,OAAO,IAAIA,OAAO,CAACC,IAAI,CAACH,KAAK,CAACI,GAAG,CAAC,CAAC,CAAC;AACvF"}
1
+ {"version":3,"file":"sort-tags.js","names":["_marcRecord","require","_default","tagPattern","description","validate","fix","record","sort","MarcRecord","isEqual","fields","valid","messages","sortPatternFields","sortFields","matchingTags","map","field","some","pattern","test","tag","filter","sortedArray","fixedArray","splice","index","a","b","findIndex"],"sources":["../src/sort-tags.js"],"sourcesContent":["import {MarcRecord} from '@natlibfi/marc-record';\n\nexport default function (tagPattern) {\n return {\n description:\n 'Handles field ordering',\n validate,\n fix: async record => ({\n fix: await sort(record, tagPattern)\n })\n };\n\n function validate(record, tagPattern) {\n return MarcRecord.isEqual(record.fields, sort(record.fields, tagPattern)) ? {valid: true, messages: []} : {valid: false, messages: ['Fields are in incorrect order']};\n }\n\n function sort(record, tagPattern) {\n if (tagPattern) {\n return sortPatternFields(record, tagPattern);\n }\n\n return sortFields(record);\n }\n}\n\nfunction sortPatternFields(record, tagPattern) {\n const matchingTags = record.fields.map(field => tagPattern.some(pattern => pattern.test(field.tag)) ? field : null).filter(tag => tag);\n const sortedArray = sortFields(record.fields);\n const fixedArray = sortedArray.filter(field => !tagPattern.some(pattern => pattern.test(field.tag)));\n fixedArray.splice(index(sortedArray, tagPattern), 0, ...matchingTags); // eslint-disable-line functional/immutable-data\n record.fields = fixedArray; // eslint-disable-line functional/immutable-data\n}\n\nfunction sortFields(fields) {\n return [...fields].sort((a, b) => {\n if (a.tag > b.tag) {\n return 1;\n }\n if (b.tag > a.tag) {\n return -1;\n }\n return 0;\n });\n}\n\nfunction index(fields, tagPattern) {\n return fields.findIndex(field => tagPattern.some(pattern => pattern.test(field.tag)));\n}\n"],"mappings":";;;;;;AAAA,IAAAA,WAAA,GAAAC,OAAA;AAEe,SAAAC,SAAUC,UAAU,EAAE;EACnC,OAAO;IACLC,WAAW,EACT,wBAAwB;IAC1BC,QAAQ;IACRC,GAAG,EAAE,MAAMC,MAAM,KAAK;MACpBD,GAAG,EAAE,MAAME,IAAI,CAACD,MAAM,EAAEJ,UAAU;IACpC,CAAC;EACH,CAAC;EAED,SAASE,QAAQA,CAACE,MAAM,EAAEJ,UAAU,EAAE;IACpC,OAAOM,sBAAU,CAACC,OAAO,CAACH,MAAM,CAACI,MAAM,EAAEH,IAAI,CAACD,MAAM,CAACI,MAAM,EAAER,UAAU,CAAC,CAAC,GAAG;MAACS,KAAK,EAAE,IAAI;MAAEC,QAAQ,EAAE;IAAE,CAAC,GAAG;MAACD,KAAK,EAAE,KAAK;MAAEC,QAAQ,EAAE,CAAC,+BAA+B;IAAC,CAAC;EACvK;EAEA,SAASL,IAAIA,CAACD,MAAM,EAAEJ,UAAU,EAAE;IAChC,IAAIA,UAAU,EAAE;MACd,OAAOW,iBAAiB,CAACP,MAAM,EAAEJ,UAAU,CAAC;IAC9C;IAEA,OAAOY,UAAU,CAACR,MAAM,CAAC;EAC3B;AACF;AAEA,SAASO,iBAAiBA,CAACP,MAAM,EAAEJ,UAAU,EAAE;EAC7C,MAAMa,YAAY,GAAGT,MAAM,CAACI,MAAM,CAACM,GAAG,CAACC,KAAK,IAAIf,UAAU,CAACgB,IAAI,CAACC,OAAO,IAAIA,OAAO,CAACC,IAAI,CAACH,KAAK,CAACI,GAAG,CAAC,CAAC,GAAGJ,KAAK,GAAG,IAAI,CAAC,CAACK,MAAM,CAACD,GAAG,IAAIA,GAAG,CAAC;EACtI,MAAME,WAAW,GAAGT,UAAU,CAACR,MAAM,CAACI,MAAM,CAAC;EAC7C,MAAMc,UAAU,GAAGD,WAAW,CAACD,MAAM,CAACL,KAAK,IAAI,CAACf,UAAU,CAACgB,IAAI,CAACC,OAAO,IAAIA,OAAO,CAACC,IAAI,CAACH,KAAK,CAACI,GAAG,CAAC,CAAC,CAAC;EACpGG,UAAU,CAACC,MAAM,CAACC,KAAK,CAACH,WAAW,EAAErB,UAAU,CAAC,EAAE,CAAC,EAAE,GAAGa,YAAY,CAAC,CAAC,CAAC;EACvET,MAAM,CAACI,MAAM,GAAGc,UAAU,CAAC,CAAC;AAC9B;AAEA,SAASV,UAAUA,CAACJ,MAAM,EAAE;EAC1B,OAAO,CAAC,GAAGA,MAAM,CAAC,CAACH,IAAI,CAAC,CAACoB,CAAC,EAAEC,CAAC,KAAK;IAChC,IAAID,CAAC,CAACN,GAAG,GAAGO,CAAC,CAACP,GAAG,EAAE;MACjB,OAAO,CAAC;IACV;IACA,IAAIO,CAAC,CAACP,GAAG,GAAGM,CAAC,CAACN,GAAG,EAAE;MACjB,OAAO,CAAC,CAAC;IACX;IACA,OAAO,CAAC;EACV,CAAC,CAAC;AACJ;AAEA,SAASK,KAAKA,CAAChB,MAAM,EAAER,UAAU,EAAE;EACjC,OAAOQ,MAAM,CAACmB,SAAS,CAACZ,KAAK,IAAIf,UAAU,CAACgB,IAAI,CAACC,OAAO,IAAIA,OAAO,CAACC,IAAI,CAACH,KAAK,CAACI,GAAG,CAAC,CAAC,CAAC;AACvF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"sort-tags.spec.js","names":["_chai","require","_marcRecord","_sortTags","_interopRequireDefault","obj","__esModule","default","describe","it","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","record","MarcRecord","fields","tag","value","ind1","ind2","subfields","code","result","eql","valid","messages","fix"],"sources":["../src/sort-tags.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/sort-tags';\n\ndescribe('sort-tags', () => {\n it('Creates a validator', async () => {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n describe('#validate', () => {\n it('Finds the record valid', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '100'\n },\n {\n tag: '008',\n value: 'bar'\n },\n {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'Foo Bar'\n }\n ]\n },\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'Fubar'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: true, messages: []});\n });\n it('Finds the record invalid', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: 'bar'\n },\n {\n tag: '001',\n value: '100'\n },\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'Fubar'\n }\n ]\n },\n {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'Foo Bar'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n expect(result).to.eql({valid: false, messages: ['Fields are in incorrect order']});\n });\n });\n\n describe('#fix', () => {\n it('Sorts with exclusion', async () => {\n const validator = await validatorFactory([/^5..$/u, /^7..$/u]);\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '100'\n },\n {\n tag: '530',\n value: 'bar'\n },\n {\n tag: '300',\n value: 'bar'\n },\n {\n tag: 'CCC',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'Fubar'\n }\n ]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'asdassdaasdsadsasad'\n }\n ]\n },\n {\n tag: 'AAA',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'qweweqewqqweweqwq'\n }\n ]\n },\n {\n tag: '700',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'Bar Foo'\n }\n ]\n },\n {\n tag: '711',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'Foo'\n }\n ]\n },\n {\n tag: '710',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'w',\n value: 'Bar'\n }\n ]\n }\n ]\n });\n await validator.fix(record);\n expect(record.fields).to.eql([\n {\n tag: '001',\n value: '100'\n },\n {\n tag: '300',\n value: 'bar'\n },\n {\n tag: '530',\n value: 'bar'\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'asdassdaasdsadsasad'\n }\n ]\n },\n {\n tag: '700',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'Bar Foo'\n }\n ]\n },\n {\n tag: '711',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'Foo'\n }\n ]\n },\n {\n tag: '710',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'w',\n value: 'Bar'\n }\n ]\n },\n {\n tag: 'AAA',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'qweweqewqqweweqwq'\n }\n ]\n },\n {\n tag: 'CCC',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'Fubar'\n }\n ]\n }\n ]);\n });\n });\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"sort-tags.spec.js","names":["_chai","require","_marcRecord","_sortTags","_interopRequireDefault","obj","__esModule","default","describe","it","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","record","MarcRecord","fields","tag","value","ind1","ind2","subfields","code","result","eql","valid","messages","fix"],"sources":["../src/sort-tags.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/sort-tags';\n\ndescribe('sort-tags', () => {\n it('Creates a validator', async () => {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n describe('#validate', () => {\n it('Finds the record valid', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '100'\n },\n {\n tag: '008',\n value: 'bar'\n },\n {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'Foo Bar'\n }\n ]\n },\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'Fubar'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: true, messages: []});\n });\n it('Finds the record invalid', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: 'bar'\n },\n {\n tag: '001',\n value: '100'\n },\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'Fubar'\n }\n ]\n },\n {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'Foo Bar'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n expect(result).to.eql({valid: false, messages: ['Fields are in incorrect order']});\n });\n });\n\n describe('#fix', () => {\n it('Sorts with exclusion', async () => {\n const validator = await validatorFactory([/^5..$/u, /^7..$/u]);\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '100'\n },\n {\n tag: '530',\n value: 'bar'\n },\n {\n tag: '300',\n value: 'bar'\n },\n {\n tag: 'CCC',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'Fubar'\n }\n ]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'asdassdaasdsadsasad'\n }\n ]\n },\n {\n tag: 'AAA',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'qweweqewqqweweqwq'\n }\n ]\n },\n {\n tag: '700',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'Bar Foo'\n }\n ]\n },\n {\n tag: '711',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'Foo'\n }\n ]\n },\n {\n tag: '710',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'w',\n value: 'Bar'\n }\n ]\n }\n ]\n });\n await validator.fix(record);\n expect(record.fields).to.eql([\n {\n tag: '001',\n value: '100'\n },\n {\n tag: '300',\n value: 'bar'\n },\n {\n tag: '530',\n value: 'bar'\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'asdassdaasdsadsasad'\n }\n ]\n },\n {\n tag: '700',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'Bar Foo'\n }\n ]\n },\n {\n tag: '711',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'Foo'\n }\n ]\n },\n {\n tag: '710',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'w',\n value: 'Bar'\n }\n ]\n },\n {\n tag: 'AAA',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'qweweqewqqweweqwq'\n }\n ]\n },\n {\n tag: 'CCC',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'Fubar'\n }\n ]\n }\n ]);\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}