@natlibfi/marc-record-validators-melinda 11.6.7 → 12.0.0-alpha.2
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.
- package/.github/workflows/melinda-node-tests.yml +1 -1
- package/dist/access-rights.js +63 -91
- package/dist/access-rights.js.map +7 -1
- package/dist/access-rights.test.js +137 -0
- package/dist/access-rights.test.js.map +7 -0
- package/dist/addMissingField041.js +21 -53
- package/dist/addMissingField041.js.map +7 -1
- package/dist/addMissingField041.test.js +39 -0
- package/dist/addMissingField041.test.js.map +7 -0
- package/dist/addMissingField336.js +99 -191
- package/dist/addMissingField336.js.map +7 -1
- package/dist/addMissingField336.test.js +39 -0
- package/dist/addMissingField336.test.js.map +7 -0
- package/dist/addMissingField337.js +63 -132
- package/dist/addMissingField337.js.map +7 -1
- package/dist/addMissingField337.test.js +39 -0
- package/dist/addMissingField337.test.js.map +7 -0
- package/dist/addMissingField338.js +147 -253
- package/dist/addMissingField338.js.map +7 -1
- package/dist/addMissingField338.test.js +39 -0
- package/dist/addMissingField338.test.js.map +7 -0
- package/dist/cyrillux-usemarcon-replacement.js +119 -272
- package/dist/cyrillux-usemarcon-replacement.js.map +7 -1
- package/dist/cyrillux-usemarcon-replacement.test.js +46 -0
- package/dist/cyrillux-usemarcon-replacement.test.js.map +7 -0
- package/dist/cyrillux.js +119 -223
- package/dist/cyrillux.js.map +7 -1
- package/dist/cyrillux.test.js +39 -0
- package/dist/cyrillux.test.js.map +7 -0
- package/dist/disambiguateSeriesStatements.js +40 -81
- package/dist/disambiguateSeriesStatements.js.map +7 -1
- package/dist/disambiguateSeriesStatements.test.js +44 -0
- package/dist/disambiguateSeriesStatements.test.js.map +7 -0
- package/dist/double-commas.js +7 -14
- package/dist/double-commas.js.map +7 -1
- package/dist/double-commas.test.js +48 -0
- package/dist/double-commas.test.js.map +7 -0
- package/dist/duplicates-ind1.js +10 -31
- package/dist/duplicates-ind1.js.map +7 -1
- package/dist/duplicates-ind1.test.js +40 -0
- package/dist/duplicates-ind1.test.js.map +7 -0
- package/dist/empty-fields.js +10 -22
- package/dist/empty-fields.js.map +7 -1
- package/dist/empty-fields.test.js +129 -0
- package/dist/empty-fields.test.js.map +7 -0
- package/dist/ending-punctuation-conf.js +871 -769
- package/dist/ending-punctuation-conf.js.map +7 -1
- package/dist/ending-punctuation.js +84 -167
- package/dist/ending-punctuation.js.map +7 -1
- package/dist/ending-punctuation.test.js +2290 -0
- package/dist/ending-punctuation.test.js.map +7 -0
- package/dist/ending-whitespace.js +10 -35
- package/dist/ending-whitespace.js.map +7 -1
- package/dist/ending-whitespace.test.js +38 -0
- package/dist/ending-whitespace.test.js.map +7 -0
- package/dist/field-008-18-34-character-groups.js +40 -125
- package/dist/field-008-18-34-character-groups.js.map +7 -1
- package/dist/field-008-18-34-character-groups.test.js +45 -0
- package/dist/field-008-18-34-character-groups.test.js.map +7 -0
- package/dist/field-505-separators.js +19 -39
- package/dist/field-505-separators.js.map +7 -1
- package/dist/field-505-separators.test.js +45 -0
- package/dist/field-505-separators.test.js.map +7 -0
- package/dist/field-521-fix.js +19 -47
- package/dist/field-521-fix.js.map +7 -1
- package/dist/field-521-fix.test.js +44 -0
- package/dist/field-521-fix.test.js.map +7 -0
- package/dist/field-exclusion.js +37 -91
- package/dist/field-exclusion.js.map +7 -1
- package/dist/field-exclusion.test.js +821 -0
- package/dist/field-exclusion.test.js.map +7 -0
- package/dist/field-structure.js +52 -104
- package/dist/field-structure.js.map +7 -1
- package/dist/field-structure.test.js +587 -0
- package/dist/field-structure.test.js.map +7 -0
- package/dist/field33XUtils.js +119 -503
- package/dist/field33XUtils.js.map +7 -1
- package/dist/fields-present.js +11 -23
- package/dist/fields-present.js.map +7 -1
- package/dist/fields-present.test.js +95 -0
- package/dist/fields-present.test.js.map +7 -0
- package/dist/fix-33X.js +393 -431
- package/dist/fix-33X.js.map +7 -1
- package/dist/fix-33X.test.js +39 -0
- package/dist/fix-33X.test.js.map +7 -0
- package/dist/fix-country-codes.js +20 -50
- package/dist/fix-country-codes.js.map +7 -1
- package/dist/fix-country-codes.test.js +44 -0
- package/dist/fix-country-codes.test.js.map +7 -0
- package/dist/fix-language-codes.js +23 -53
- package/dist/fix-language-codes.js.map +7 -1
- package/dist/fix-language-codes.test.js +38 -0
- package/dist/fix-language-codes.test.js.map +7 -0
- package/dist/fixRelatorTerms.js +82 -209
- package/dist/fixRelatorTerms.js.map +7 -1
- package/dist/fixRelatorTerms.test.js +44 -0
- package/dist/fixRelatorTerms.test.js.map +7 -0
- package/dist/fixed-fields.js +21 -30
- package/dist/fixed-fields.js.map +7 -1
- package/dist/fixed-fields.test.js +87 -0
- package/dist/fixed-fields.test.js.map +7 -0
- package/dist/identical-fields.js +8 -24
- package/dist/identical-fields.js.map +7 -1
- package/dist/identical-fields.test.js +119 -0
- package/dist/identical-fields.test.js.map +7 -0
- package/dist/index.js +119 -413
- package/dist/index.js.map +7 -1
- package/dist/indicator-fixes.js +57 -95
- package/dist/indicator-fixes.js.map +7 -1
- package/dist/indicator-fixes.test.js +42 -0
- package/dist/indicator-fixes.test.js.map +7 -0
- package/dist/isbn-issn.js +66 -126
- package/dist/isbn-issn.js.map +7 -1
- package/dist/isbn-issn.test.js +398 -0
- package/dist/isbn-issn.test.js.map +7 -0
- package/dist/item-language.js +32 -65
- package/dist/item-language.js.map +7 -1
- package/dist/item-language.test.js +322 -0
- package/dist/item-language.test.js.map +7 -0
- package/dist/melindaCustomMergeFields.js +5182 -11233
- package/dist/melindaCustomMergeFields.js.map +7 -1
- package/dist/merge-fields/controlSubfields.js +75 -142
- package/dist/merge-fields/controlSubfields.js.map +7 -1
- package/dist/merge-fields/counterpartField.js +182 -379
- package/dist/merge-fields/counterpartField.js.map +7 -1
- package/dist/merge-fields/index.js +15 -49
- package/dist/merge-fields/index.js.map +7 -1
- package/dist/merge-fields/mergableIndicator.js +18 -51
- package/dist/merge-fields/mergableIndicator.js.map +7 -1
- package/dist/merge-fields/mergableTag.js +78 -30
- package/dist/merge-fields/mergableTag.js.map +7 -1
- package/dist/merge-fields/mergeConfig.js +66 -171
- package/dist/merge-fields/mergeConfig.js.map +7 -1
- package/dist/merge-fields/mergeConstraints.js +323 -1214
- package/dist/merge-fields/mergeConstraints.js.map +7 -1
- package/dist/merge-fields/mergeField.js +47 -111
- package/dist/merge-fields/mergeField.js.map +7 -1
- package/dist/merge-fields/mergeIndicator.js +64 -118
- package/dist/merge-fields/mergeIndicator.js.map +7 -1
- package/dist/merge-fields/mergeOrAddPostprocess.js +14 -38
- package/dist/merge-fields/mergeOrAddPostprocess.js.map +7 -1
- package/dist/merge-fields/mergeOrAddSubfield.js +62 -104
- package/dist/merge-fields/mergeOrAddSubfield.js.map +7 -1
- package/dist/merge-fields/mergeSubfield.js +47 -95
- package/dist/merge-fields/mergeSubfield.js.map +7 -1
- package/dist/merge-fields/removeDuplicateSubfields.js +18 -31
- package/dist/merge-fields/removeDuplicateSubfields.js.map +7 -1
- package/dist/merge-fields/worldKnowledge.js +15 -40
- package/dist/merge-fields/worldKnowledge.js.map +7 -1
- package/dist/merge-fields.test.js +44 -0
- package/dist/merge-fields.test.js.map +7 -0
- package/dist/mergeField500Lisapainokset.js +28 -57
- package/dist/mergeField500Lisapainokset.js.map +7 -1
- package/dist/mergeField500Lisapainokset.test.js +44 -0
- package/dist/mergeField500Lisapainokset.test.js.map +7 -0
- package/dist/mergeRelatorTermFields.js +33 -69
- package/dist/mergeRelatorTermFields.js.map +7 -1
- package/dist/mergeRelatorTermFields.test.js +44 -0
- package/dist/mergeRelatorTermFields.test.js.map +7 -0
- package/dist/modernize-502.js +23 -55
- package/dist/modernize-502.js.map +7 -1
- package/dist/modernize-502.test.js +38 -0
- package/dist/modernize-502.test.js.map +7 -0
- package/dist/multiple-subfield-0.js +23 -48
- package/dist/multiple-subfield-0.js.map +7 -1
- package/dist/multiple-subfield-0.test.js +44 -0
- package/dist/multiple-subfield-0.test.js.map +7 -0
- package/dist/non-breaking-space.js +11 -32
- package/dist/non-breaking-space.js.map +7 -1
- package/dist/non-breaking-space.test.js +38 -0
- package/dist/non-breaking-space.test.js.map +7 -0
- package/dist/normalize-dashes.js +18 -37
- package/dist/normalize-dashes.js.map +7 -1
- package/dist/normalize-dashes.test.js +44 -0
- package/dist/normalize-dashes.test.js.map +7 -0
- package/dist/normalize-identifiers.js +54 -140
- package/dist/normalize-identifiers.js.map +7 -1
- package/dist/normalize-identifiers.test.js +44 -0
- package/dist/normalize-identifiers.test.js.map +7 -0
- package/dist/normalize-qualifying-information.js +23 -48
- package/dist/normalize-qualifying-information.js.map +7 -1
- package/dist/normalize-qualifying-information.test.js +44 -0
- package/dist/normalize-qualifying-information.test.js.map +7 -0
- package/dist/normalize-utf8-diacritics.js +19 -105
- package/dist/normalize-utf8-diacritics.js.map +7 -1
- package/dist/normalize-utf8-diacritics.test.js +44 -0
- package/dist/normalize-utf8-diacritics.test.js.map +7 -0
- package/dist/normalizeFieldForComparison.js +67 -158
- package/dist/normalizeFieldForComparison.js.map +7 -1
- package/dist/normalizeSubfieldValueForComparison.js +37 -77
- package/dist/normalizeSubfieldValueForComparison.js.map +7 -1
- package/dist/prepublicationUtils.js +58 -111
- package/dist/prepublicationUtils.js.map +7 -1
- package/dist/punctuation/index.js +56 -72
- package/dist/punctuation/index.js.map +7 -1
- package/dist/punctuation/rules/aut.js +372 -331
- package/dist/punctuation/rules/aut.js.map +7 -1
- package/dist/punctuation/rules/bib.js +420 -373
- package/dist/punctuation/rules/bib.js.map +7 -1
- package/dist/punctuation/rules/index.js +7 -21
- package/dist/punctuation/rules/index.js.map +7 -1
- package/dist/punctuation.test.js +44 -0
- package/dist/punctuation.test.js.map +7 -0
- package/dist/punctuation2.js +251 -800
- package/dist/punctuation2.js.map +7 -1
- package/dist/punctuation2.test.js +44 -0
- package/dist/punctuation2.test.js.map +7 -0
- package/dist/reindexSubfield6OccurenceNumbers.js +61 -96
- package/dist/reindexSubfield6OccurenceNumbers.js.map +7 -1
- package/dist/reindexSubfield6OccurenceNumbers.test.js +44 -0
- package/dist/reindexSubfield6OccurenceNumbers.test.js.map +7 -0
- package/dist/removeDuplicateDataFields.js +102 -202
- package/dist/removeDuplicateDataFields.js.map +7 -1
- package/dist/removeDuplicateDataFields.test.js +44 -0
- package/dist/removeDuplicateDataFields.test.js.map +7 -0
- package/dist/removeInferiorDataFields.js +103 -227
- package/dist/removeInferiorDataFields.js.map +7 -1
- package/dist/removeInferiorDataFields.test.js +44 -0
- package/dist/removeInferiorDataFields.test.js.map +7 -0
- package/dist/resolvable-ext-references-melinda.js +25 -60
- package/dist/resolvable-ext-references-melinda.js.map +7 -1
- package/dist/resolvable-ext-references-melinda.test.js +160 -0
- package/dist/resolvable-ext-references-melinda.test.js.map +7 -0
- package/dist/resolveOrphanedSubfield6s.js +33 -64
- package/dist/resolveOrphanedSubfield6s.js.map +7 -1
- package/dist/resolveOrphanedSubfield6s.test.js +44 -0
- package/dist/resolveOrphanedSubfield6s.test.js.map +7 -0
- package/dist/sanitize-vocabulary-source-codes.js +27 -55
- package/dist/sanitize-vocabulary-source-codes.js.map +7 -1
- package/dist/sanitize-vocabulary-source-codes.test.js +45 -0
- package/dist/sanitize-vocabulary-source-codes.test.js.map +7 -0
- package/dist/sort-tags.js +13 -25
- package/dist/sort-tags.js.map +7 -1
- package/dist/sort-tags.test.js +261 -0
- package/dist/sort-tags.test.js.map +7 -0
- package/dist/sortFields.js +152 -222
- package/dist/sortFields.js.map +7 -1
- package/dist/sortFields.test.js +44 -0
- package/dist/sortFields.test.js.map +7 -0
- package/dist/sortRelatorTerms.js +30 -68
- package/dist/sortRelatorTerms.js.map +7 -1
- package/dist/sortRelatorTerms.test.js +44 -0
- package/dist/sortRelatorTerms.test.js.map +7 -0
- package/dist/sortSubfields.js +102 -255
- package/dist/sortSubfields.js.map +7 -1
- package/dist/sortSubfields.test.js +44 -0
- package/dist/sortSubfields.test.js.map +7 -0
- package/dist/stripPunctuation.js +13 -36
- package/dist/stripPunctuation.js.map +7 -1
- package/dist/stripPunctuation.test.js +44 -0
- package/dist/stripPunctuation.test.js.map +7 -0
- package/dist/subfield-exclusion.js +28 -75
- package/dist/subfield-exclusion.js.map +7 -1
- package/dist/subfield-exclusion.test.js +471 -0
- package/dist/subfield-exclusion.test.js.map +7 -0
- package/dist/subfield6Utils.js +107 -269
- package/dist/subfield6Utils.js.map +7 -1
- package/dist/subfield8Utils.js +26 -50
- package/dist/subfield8Utils.js.map +7 -1
- package/dist/subfieldValueNormalizations.js +40 -74
- package/dist/subfieldValueNormalizations.js.map +7 -1
- package/dist/subfieldValueNormalizations.test.js +45 -0
- package/dist/subfieldValueNormalizations.test.js.map +7 -0
- package/dist/sync-007-and-300.js +22 -53
- package/dist/sync-007-and-300.js.map +7 -1
- package/dist/sync-007-and-300.test.js +44 -0
- package/dist/sync-007-and-300.test.js.map +7 -0
- package/dist/translate-terms.js +67 -155
- package/dist/translate-terms.js.map +7 -1
- package/dist/translate-terms.test.js +44 -0
- package/dist/translate-terms.test.js.map +7 -0
- package/dist/typeOfDate-008.js +10 -25
- package/dist/typeOfDate-008.js.map +7 -1
- package/dist/typeOfDate-008.test.js +40 -0
- package/dist/typeOfDate-008.test.js.map +7 -0
- package/dist/unicode-decomposition.js +94 -107
- package/dist/unicode-decomposition.js.map +7 -1
- package/dist/unicode-decomposition.test.js +94 -0
- package/dist/unicode-decomposition.test.js.map +7 -0
- package/dist/update-field-540.js +30 -75
- package/dist/update-field-540.js.map +7 -1
- package/dist/update-field-540.test.js +44 -0
- package/dist/update-field-540.test.js.map +7 -0
- package/dist/urn.js +55 -128
- package/dist/urn.js.map +7 -1
- package/dist/urn.test.js +44 -0
- package/dist/urn.test.js.map +7 -0
- package/dist/utils.js +72 -126
- package/dist/utils.js.map +7 -1
- package/eslint.config.mjs +1 -2
- package/package.json +21 -93
- package/src/access-rights.js +1 -1
- package/src/{access-rights.spec.js → access-rights.test.js} +9 -10
- package/src/addMissingField041.js +1 -1
- package/src/{addMissingField336.spec.js → addMissingField041.test.js} +13 -14
- package/src/addMissingField336.js +3 -3
- package/src/{addMissingField041.spec.js → addMissingField336.test.js} +13 -14
- package/src/addMissingField337.js +2 -2
- package/src/{addMissingField337.spec.js → addMissingField337.test.js} +13 -14
- package/src/addMissingField338.js +2 -2
- package/src/{addMissingField338.spec.js → addMissingField338.test.js} +13 -14
- package/src/cyrillux-usemarcon-replacement.js +18 -18
- package/src/cyrillux-usemarcon-replacement.test.js +55 -0
- package/src/cyrillux.js +19 -12
- package/src/{cyrillux.spec.js → cyrillux.test.js} +13 -14
- package/src/disambiguateSeriesStatements.js +2 -2
- package/src/{disambiguateSeriesStatements.spec.js → disambiguateSeriesStatements.test.js} +12 -13
- package/src/double-commas.js +1 -1
- package/src/{double-commas.spec.js → double-commas.test.js} +9 -11
- package/src/duplicates-ind1.js +1 -1
- package/src/{duplicates-ind1.spec.js → duplicates-ind1.test.js} +12 -13
- package/src/{empty-fields.spec.js → empty-fields.test.js} +11 -13
- package/src/ending-punctuation.js +1 -1
- package/src/{ending-punctuation.spec.js → ending-punctuation.test.js} +172 -173
- package/src/{ending-whitespace.spec.js → ending-whitespace.test.js} +12 -13
- package/src/field-008-18-34-character-groups.js +2 -2
- package/src/{field-008-18-34-character-groups.spec.js → field-008-18-34-character-groups.test.js} +13 -13
- package/src/field-505-separators.js +3 -3
- package/src/{field-505-separators.spec.js → field-505-separators.test.js} +16 -14
- package/src/field-521-fix.js +2 -2
- package/src/{field-521-fix.spec.js → field-521-fix.test.js} +12 -13
- package/src/field-exclusion.js +1 -1
- package/src/{field-exclusion.spec.js → field-exclusion.test.js} +60 -57
- package/src/{field-structure.spec.js → field-structure.test.js} +29 -29
- package/src/{fields-present.spec.js → fields-present.test.js} +12 -15
- package/src/fix-33X.js +4 -4
- package/src/{fix-33X.spec.js → fix-33X.test.js} +13 -14
- package/src/fix-country-codes.js +1 -1
- package/src/{fix-country-codes.spec.js → fix-country-codes.test.js} +12 -13
- package/src/fix-language-codes.js +5 -5
- package/src/{fix-language-codes.spec.js → fix-language-codes.test.js} +12 -13
- package/src/fixRelatorTerms.js +5 -5
- package/src/{fixRelatorTerms.spec.js → fixRelatorTerms.test.js} +13 -13
- package/src/{fixed-fields.spec.js → fixed-fields.test.js} +11 -14
- package/src/identical-fields.js +1 -1
- package/src/{identical-fields.spec.js → identical-fields.test.js} +9 -11
- package/src/index.js +58 -58
- package/src/indicator-fixes.js +3 -3
- package/src/{indicator-fixes.spec.js → indicator-fixes.test.js} +9 -12
- package/src/isbn-issn.js +1 -1
- package/src/{isbn-issn.spec.js → isbn-issn.test.js} +20 -22
- package/src/{item-language.spec.js → item-language.test.js} +21 -22
- package/src/merge-fields/controlSubfields.js +1 -1
- package/src/merge-fields/counterpartField.js +8 -9
- package/src/merge-fields/index.js +1 -1
- package/src/merge-fields/mergableIndicator.js +1 -1
- package/src/merge-fields/mergeField.js +6 -6
- package/src/merge-fields/mergeIndicator.js +1 -1
- package/src/merge-fields/mergeOrAddPostprocess.js +4 -4
- package/src/merge-fields/mergeOrAddSubfield.js +2 -2
- package/src/merge-fields/mergeSubfield.js +4 -4
- package/src/merge-fields/removeDuplicateSubfields.js +2 -2
- package/src/{merge-fields.spec.js → merge-fields.test.js} +12 -13
- package/src/{mergeField500Lisapainokset.spec.js → mergeField500Lisapainokset.test.js} +12 -13
- package/src/mergeRelatorTermFields.js +5 -7
- package/src/{mergeRelatorTermFields.spec.js → mergeRelatorTermFields.test.js} +12 -13
- package/src/modernize-502.js +1 -1
- package/src/{modernize-502.spec.js → modernize-502.test.js} +12 -13
- package/src/multiple-subfield-0.js +3 -3
- package/src/{multiple-subfield-0.spec.js → multiple-subfield-0.test.js} +13 -13
- package/src/{non-breaking-space.spec.js → non-breaking-space.test.js} +12 -13
- package/src/normalize-dashes.js +2 -2
- package/src/{normalize-dashes.spec.js → normalize-dashes.test.js} +12 -13
- package/src/normalize-identifiers.js +1 -1
- package/src/{normalize-identifiers.spec.js → normalize-identifiers.test.js} +12 -13
- package/src/normalize-qualifying-information.js +2 -2
- package/src/{normalize-qualifying-information.spec.js → normalize-qualifying-information.test.js} +12 -13
- package/src/normalize-utf8-diacritics.js +2 -2
- package/src/{normalize-utf8-diacritics.spec.js → normalize-utf8-diacritics.test.js} +13 -13
- package/src/normalizeFieldForComparison.js +6 -6
- package/src/normalizeSubfieldValueForComparison.js +1 -1
- package/src/prepublicationUtils.js +4 -4
- package/src/punctuation/index.js +1 -1
- package/src/punctuation/rules/index.js +2 -2
- package/src/{punctuation.spec.js → punctuation.test.js} +12 -13
- package/src/punctuation2.js +4 -4
- package/src/{punctuation2.spec.js → punctuation2.test.js} +12 -13
- package/src/reindexSubfield6OccurenceNumbers.js +5 -7
- package/src/{reindexSubfield6OccurenceNumbers.spec.js → reindexSubfield6OccurenceNumbers.test.js} +12 -13
- package/src/removeDuplicateDataFields.js +11 -19
- package/src/{removeDuplicateDataFields.spec.js → removeDuplicateDataFields.test.js} +12 -13
- package/src/removeInferiorDataFields.js +11 -11
- package/src/{removeInferiorDataFields.spec.js → removeInferiorDataFields.test.js} +13 -13
- package/src/resolvable-ext-references-melinda.js +1 -1
- package/src/{resolvable-ext-references-melinda.spec.js → resolvable-ext-references-melinda.test.js} +42 -27
- package/src/resolveOrphanedSubfield6s.js +5 -5
- package/src/{resolveOrphanedSubfield6s.spec.js → resolveOrphanedSubfield6s.test.js} +13 -13
- package/src/sanitize-vocabulary-source-codes.js +4 -4
- package/src/{sanitize-vocabulary-source-codes.spec.js → sanitize-vocabulary-source-codes.test.js} +16 -14
- package/src/{sort-tags.spec.js → sort-tags.test.js} +9 -11
- package/src/sortFields.js +4 -4
- package/src/{sortFields.spec.js → sortFields.test.js} +12 -13
- package/src/sortRelatorTerms.js +3 -3
- package/src/{sortRelatorTerms.spec.js → sortRelatorTerms.test.js} +13 -13
- package/src/sortSubfields.js +1 -1
- package/src/{sortSubfields.spec.js → sortSubfields.test.js} +13 -13
- package/src/stripPunctuation.js +3 -3
- package/src/{stripPunctuation.spec.js → stripPunctuation.test.js} +13 -13
- package/src/subfield-exclusion.js +1 -1
- package/src/{subfield-exclusion.spec.js → subfield-exclusion.test.js} +45 -36
- package/src/subfield6Utils.js +6 -10
- package/src/subfield8Utils.js +4 -4
- package/src/subfieldValueNormalizations.js +3 -3
- package/src/{subfieldValueNormalizations.spec.js → subfieldValueNormalizations.test.js} +18 -14
- package/src/sync-007-and-300.js +2 -2
- package/src/{sync-007-and-300.spec.js → sync-007-and-300.test.js} +13 -13
- package/src/translate-terms.js +3 -3
- package/src/{translate-terms.spec.js → translate-terms.test.js} +13 -13
- package/src/{typeOfDate-008.spec.js → typeOfDate-008.test.js} +12 -13
- package/src/{unicode-decomposition.spec.js → unicode-decomposition.test.js} +10 -16
- package/src/update-field-540.js +2 -2
- package/src/{update-field-540.spec.js → update-field-540.test.js} +13 -10
- package/src/urn.js +2 -2
- package/src/{urn.spec.js → urn.test.js} +12 -13
- package/src/utils.js +3 -3
- package/test-fixtures/field-505-separators/03/expectedResult.json +3 -1
- package/test-fixtures/field-505-separators/03/record.json +3 -0
- package/test-fixtures/normalize-subfield-value/01/metadata.json +4 -1
- package/test-fixtures/normalize-subfield-value/01/record.json +3 -0
- package/test-fixtures/normalize-subfield-value/02/expectedResult.json +3 -1
- package/test-fixtures/normalize-subfield-value/02/metadata.json +2 -1
- package/test-fixtures/normalize-subfield-value/02/record.json +3 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/f03/expectedResult.json +3 -1
- package/test-fixtures/sanitize-vocabulary-source-codes/f04/expectedResult.json +3 -1
- package/test-fixtures/sanitize-vocabulary-source-codes/v04/metadata.json +1 -4
- package/test-fixtures/sanitize-vocabulary-source-codes/v04/record.json +1 -1
- package/dist/access-rights.spec.js +0 -195
- package/dist/access-rights.spec.js.map +0 -1
- package/dist/addMissingField041.spec.js +0 -45
- package/dist/addMissingField041.spec.js.map +0 -1
- package/dist/addMissingField336.spec.js +0 -45
- package/dist/addMissingField336.spec.js.map +0 -1
- package/dist/addMissingField337.spec.js +0 -43
- package/dist/addMissingField337.spec.js.map +0 -1
- package/dist/addMissingField338.spec.js +0 -45
- package/dist/addMissingField338.spec.js.map +0 -1
- package/dist/cyrillux-usemarcon-replacement.spec.js +0 -45
- package/dist/cyrillux-usemarcon-replacement.spec.js.map +0 -1
- package/dist/cyrillux.spec.js +0 -46
- package/dist/cyrillux.spec.js.map +0 -1
- package/dist/disambiguateSeriesStatements.spec.js +0 -51
- package/dist/disambiguateSeriesStatements.spec.js.map +0 -1
- package/dist/double-commas.spec.js +0 -73
- package/dist/double-commas.spec.js.map +0 -1
- package/dist/duplicates-ind1.spec.js +0 -45
- package/dist/duplicates-ind1.spec.js.map +0 -1
- package/dist/empty-fields.spec.js +0 -118
- package/dist/empty-fields.spec.js.map +0 -1
- package/dist/ending-punctuation.spec.js +0 -2654
- package/dist/ending-punctuation.spec.js.map +0 -1
- package/dist/ending-whitespace.spec.js +0 -42
- package/dist/ending-whitespace.spec.js.map +0 -1
- package/dist/field-008-18-34-character-groups.spec.js +0 -51
- package/dist/field-008-18-34-character-groups.spec.js.map +0 -1
- package/dist/field-505-separators.spec.js +0 -51
- package/dist/field-505-separators.spec.js.map +0 -1
- package/dist/field-521-fix.spec.js +0 -51
- package/dist/field-521-fix.spec.js.map +0 -1
- package/dist/field-exclusion.spec.js +0 -1054
- package/dist/field-exclusion.spec.js.map +0 -1
- package/dist/field-structure.spec.js +0 -535
- package/dist/field-structure.spec.js.map +0 -1
- package/dist/fields-present.spec.js +0 -121
- package/dist/fields-present.spec.js.map +0 -1
- package/dist/fix-33X.spec.js +0 -45
- package/dist/fix-33X.spec.js.map +0 -1
- package/dist/fix-country-codes.spec.js +0 -51
- package/dist/fix-country-codes.spec.js.map +0 -1
- package/dist/fix-language-codes.spec.js +0 -44
- package/dist/fix-language-codes.spec.js.map +0 -1
- package/dist/fixRelatorTerms.spec.js +0 -51
- package/dist/fixRelatorTerms.spec.js.map +0 -1
- package/dist/fixed-fields.spec.js +0 -140
- package/dist/fixed-fields.spec.js.map +0 -1
- package/dist/identical-fields.spec.js +0 -99
- package/dist/identical-fields.spec.js.map +0 -1
- package/dist/indicator-fixes.spec.js +0 -51
- package/dist/indicator-fixes.spec.js.map +0 -1
- package/dist/isbn-issn.spec.js +0 -595
- package/dist/isbn-issn.spec.js.map +0 -1
- package/dist/item-language.spec.js +0 -306
- package/dist/item-language.spec.js.map +0 -1
- package/dist/melindaCustomMergeFields.json +0 -5120
- package/dist/merge-fields.spec.js +0 -51
- package/dist/merge-fields.spec.js.map +0 -1
- package/dist/mergeField500Lisapainokset.spec.js +0 -51
- package/dist/mergeField500Lisapainokset.spec.js.map +0 -1
- package/dist/mergeRelatorTermFields.spec.js +0 -51
- package/dist/mergeRelatorTermFields.spec.js.map +0 -1
- package/dist/modernize-502.spec.js +0 -49
- package/dist/modernize-502.spec.js.map +0 -1
- package/dist/multiple-subfield-0.spec.js +0 -51
- package/dist/multiple-subfield-0.spec.js.map +0 -1
- package/dist/non-breaking-space.spec.js +0 -42
- package/dist/non-breaking-space.spec.js.map +0 -1
- package/dist/normalize-dashes.spec.js +0 -51
- package/dist/normalize-dashes.spec.js.map +0 -1
- package/dist/normalize-identifiers.spec.js +0 -51
- package/dist/normalize-identifiers.spec.js.map +0 -1
- package/dist/normalize-qualifying-information.spec.js +0 -51
- package/dist/normalize-qualifying-information.spec.js.map +0 -1
- package/dist/normalize-utf8-diacritics.spec.js +0 -51
- package/dist/normalize-utf8-diacritics.spec.js.map +0 -1
- package/dist/punctuation.spec.js +0 -51
- package/dist/punctuation.spec.js.map +0 -1
- package/dist/punctuation2.spec.js +0 -51
- package/dist/punctuation2.spec.js.map +0 -1
- package/dist/reindexSubfield6OccurenceNumbers.spec.js +0 -51
- package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +0 -1
- package/dist/removeDuplicateDataFields.spec.js +0 -51
- package/dist/removeDuplicateDataFields.spec.js.map +0 -1
- package/dist/removeInferiorDataFields.spec.js +0 -51
- package/dist/removeInferiorDataFields.spec.js.map +0 -1
- package/dist/resolvable-ext-references-melinda.spec.js +0 -166
- package/dist/resolvable-ext-references-melinda.spec.js.map +0 -1
- package/dist/resolveOrphanedSubfield6s.spec.js +0 -51
- package/dist/resolveOrphanedSubfield6s.spec.js.map +0 -1
- package/dist/sanitize-vocabulary-source-codes.spec.js +0 -51
- package/dist/sanitize-vocabulary-source-codes.spec.js.map +0 -1
- package/dist/sort-tags.spec.js +0 -207
- package/dist/sort-tags.spec.js.map +0 -1
- package/dist/sortFields.spec.js +0 -51
- package/dist/sortFields.spec.js.map +0 -1
- package/dist/sortRelatorTerms.spec.js +0 -51
- package/dist/sortRelatorTerms.spec.js.map +0 -1
- package/dist/sortSubfields.spec.js +0 -52
- package/dist/sortSubfields.spec.js.map +0 -1
- package/dist/stripPunctuation.spec.js +0 -51
- package/dist/stripPunctuation.spec.js.map +0 -1
- package/dist/subfield-exclusion.spec.js +0 -523
- package/dist/subfield-exclusion.spec.js.map +0 -1
- package/dist/subfieldValueNormalizations.spec.js +0 -51
- package/dist/subfieldValueNormalizations.spec.js.map +0 -1
- package/dist/sync-007-and-300.spec.js +0 -51
- package/dist/sync-007-and-300.spec.js.map +0 -1
- package/dist/translate-terms.spec.js +0 -51
- package/dist/translate-terms.spec.js.map +0 -1
- package/dist/typeOfDate-008.spec.js +0 -47
- package/dist/typeOfDate-008.spec.js.map +0 -1
- package/dist/unicode-decomposition.spec.js +0 -91
- package/dist/unicode-decomposition.spec.js.map +0 -1
- package/dist/update-field-540.spec.js +0 -51
- package/dist/update-field-540.spec.js.map +0 -1
- package/dist/urn.spec.js +0 -52
- package/dist/urn.spec.js.map +0 -1
- package/src/cyrillux-usemarcon-replacement.spec.js +0 -47
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{"version":3,"file":"reindexSubfield6OccurenceNumbers.js","names":["_debug","_interopRequireDefault","require","_utils","_subfield6Utils","e","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","recordDisambiguateSharedSubfield6OccurrenceNumbers","recordResetSubfield6OccurrenceNumbers","recordGetSharedOccurrenceNumbers","length","push","max","recordGetMaxSubfield6OccurrenceNumberAsInteger","size","recordGetNumberOfUniqueSubfield6OccurrenceNumbers","getPotentialSharedOccurrenceNumberFields","occurrenceNumber","fields","filter","f","tag","subfields","some","sf","subfield6GetOccurrenceNumber","subfieldHasSharedOccurrenceNumber","subfield","candFields","relevantFields","fieldHasSharedOccurrenceNumber","field","fieldsContainingSubfield6","fieldHasSubfield","sharedOccurrenceNumberFields","forEach","disambiguateOccurrenceNumber","disambiguateable","fieldGetUnambiguousOccurrenceNumber","fieldToString","undefined","allRelevantFields","relevantFieldsWithCurrFieldTag","candField","newOccurrenceNumberAsInt","newOccurrenceNumber","intToOccurrenceNumberString","pairedFields","fieldGetOccurrenceNumberPairs","fieldResetOccurrenceNumber","pairedField","indexArray","gatherFieldData","gatherSubfieldData","isValidSubfield6","i","subfield6GetOccurrenceNumberAsInteger","n","elem","currentInt","oldtoNewCache","fieldResetSubfield6","subfieldReset6","currIndex","newIndex","mapCurrIndexToNewIndex","subfield6ResetOccurrenceNumber"],"sources":["../src/reindexSubfield6OccurenceNumbers.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString, nvdebug} from './utils';\nimport {fieldGetOccurrenceNumberPairs, fieldGetUnambiguousOccurrenceNumber, fieldResetOccurrenceNumber, intToOccurrenceNumberString, isValidSubfield6,\n recordGetMaxSubfield6OccurrenceNumberAsInteger,\n subfield6GetOccurrenceNumber, subfield6GetOccurrenceNumberAsInteger, subfield6ResetOccurrenceNumber} from './subfield6Utils';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:reindexSubfield6OccurrenceNumbers');\n\n\n// NB! This validator/fixer has two functionalities:\n// 1) normal reindexing of occurrence numbers\n// 2) disambiguation (when possible) of unambiguous occurrence numbers\n\nexport default function () {\n return {\n description: 'Reindex occurrence numbers in $6 subfield so that they start from 01 and end in NN',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix SF6 occurrence numbers', debug);\n const res = {message: [], fix: [], valid: true};\n //message.fix = [];\n\n // This can not really fail...\n\n recordDisambiguateSharedSubfield6OccurrenceNumbers(record);\n recordResetSubfield6OccurrenceNumbers(record);\n\n // message.valid = !(message.message.length >= 1);\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n nvdebug('Validate SF6 occurrence number multiuses', debug);\n if (recordGetSharedOccurrenceNumbers(record).length) {\n res.message.push(`Multi-use of occurrence number(s) detected`);\n }\n\n // Check max, and check number of different indexes\n nvdebug('Validate SF6 occurrence number (max vs n instances)', debug);\n const max = recordGetMaxSubfield6OccurrenceNumberAsInteger(record);\n const size = recordGetNumberOfUniqueSubfield6OccurrenceNumbers(record);\n\n\n if (max !== size) {\n res.message.push(`Gaps detected in occurrence numbers: found ${size}, seen max ${max}`);\n }\n res.valid = res.message.length < 1;\n return res;\n }\n}\n\nfunction getPotentialSharedOccurrenceNumberFields(occurrenceNumber, fields) {\n return fields.filter(f => f.tag !== '880' && f.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber));\n}\n\nfunction subfieldHasSharedOccurrenceNumber(subfield, candFields) {\n const occurrenceNumber = subfield6GetOccurrenceNumber(subfield);\n if (!occurrenceNumber || occurrenceNumber === '00') {\n return false;\n }\n const relevantFields = getPotentialSharedOccurrenceNumberFields(occurrenceNumber, candFields);\n // record.fields.filter(f => f.tag !== '880' && fieldHasOccurrenceNumber(f, occurrenceNumber));\n return relevantFields.length > 1;\n}\n\nfunction fieldHasSharedOccurrenceNumber(field, candFields) {\n if (!field.subfields || field.tag === '880') { // Should not happen\n return false;\n }\n\n // What if there are multiple $6s in a given field? Should not be, but...\n return field.subfields.some(subfield => subfieldHasSharedOccurrenceNumber(subfield, candFields));\n\n}\n\nfunction recordGetSharedOccurrenceNumbers(record) {\n const fieldsContainingSubfield6 = record.fields.filter(field => field.tag !== '880' && fieldHasSubfield(field, '6'));\n // fieldsContainingSubfield6.some(field => fieldHasSharedOccurrenceNumber(field, fieldsContainingSubfield6)))\n return fieldsContainingSubfield6.filter(field => fieldHasSharedOccurrenceNumber(field, fieldsContainingSubfield6));\n}\n\nfunction recordDisambiguateSharedSubfield6OccurrenceNumbers(record) {\n const sharedOccurrenceNumberFields = recordGetSharedOccurrenceNumbers(record);\n if (sharedOccurrenceNumberFields.length < 2) {\n return;\n }\n nvdebug(`Disambiguate occurrence numbers (N=${sharedOccurrenceNumberFields.length}) in...`, debug);\n sharedOccurrenceNumberFields.forEach(field => disambiguateOccurrenceNumber(field)); // eslint-disable-line array-callback-return\n\n function disambiguateable(field) {\n if (field.tag === '880') { // Not needed, already filtered...\n return false;\n }\n const occurrenceNumber = fieldGetUnambiguousOccurrenceNumber(field);\n nvdebug(` Trying to disambiguate ${occurrenceNumber} in '${fieldToString(field)}`);\n if (occurrenceNumber === undefined) {\n return false;\n }\n const allRelevantFields = getPotentialSharedOccurrenceNumberFields(occurrenceNumber, sharedOccurrenceNumberFields);\n if (allRelevantFields.length < 2) {\n nvdebug(` Currently only ${allRelevantFields.length} field(s) use occurrence number ${occurrenceNumber}. No action required.`);\n return false;\n }\n nvdebug(` Currently ${allRelevantFields.length} field(s) use occurrence number ${occurrenceNumber}. ACTION REQUIRED!`);\n const relevantFieldsWithCurrFieldTag = allRelevantFields.filter(candField => field.tag === candField.tag);\n\n if (relevantFieldsWithCurrFieldTag.length !== 1) {\n nvdebug(` Number of them using tag ${field.tag} is ${relevantFieldsWithCurrFieldTag.length}. Can not disambiguate!`);\n return false;\n }\n\n return true;\n }\n\n function disambiguateOccurrenceNumber(field) {\n if (!disambiguateable(field)) {\n return;\n }\n // Reset field:\n const occurrenceNumber = fieldGetUnambiguousOccurrenceNumber(field);\n const newOccurrenceNumberAsInt = recordGetMaxSubfield6OccurrenceNumberAsInteger(record) + 1;\n const newOccurrenceNumber = intToOccurrenceNumberString(newOccurrenceNumberAsInt);\n const pairedFields = fieldGetOccurrenceNumberPairs(field, record.fields);\n\n nvdebug(` Reindex '${fieldToString(field)}' occurrence number and it's ${pairedFields.length} pair(s) using '${newOccurrenceNumber}'`, debug);\n\n fieldResetOccurrenceNumber(field, newOccurrenceNumber, occurrenceNumber);\n pairedFields.forEach(pairedField => fieldResetOccurrenceNumber(pairedField, newOccurrenceNumber, occurrenceNumber)); // eslint-disable-line array-callback-return\n\n }\n\n\n}\nfunction recordGetNumberOfUniqueSubfield6OccurrenceNumbers(record) {\n // Calculates the number of used different occurrence numbers\n /* eslint-disable */\n let indexArray = [];\n record.fields.forEach(field => gatherFieldData(field));\n\n function gatherFieldData(field) {\n if (!field.subfields) {\n return;\n }\n field.subfields.forEach(subfield => gatherSubfieldData(subfield));\n }\n\n function gatherSubfieldData(subfield) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n const i = subfield6GetOccurrenceNumberAsInteger(subfield);\n if (i === 0) {\n return\n }\n indexArray[i] = 1;\n }\n let n = 0;\n indexArray.forEach(elem => n+= elem); \n /* eslint-enable */\n return n;\n}\n\nexport function recordResetSubfield6OccurrenceNumbers(record) { // Remove gaps\n /* eslint-disable */\n let currentInt = 1;\n let oldtoNewCache = {};\n\n record.fields.forEach(field => fieldResetSubfield6(field));\n\n function fieldResetSubfield6(field) {\n nvdebug(`fieldResetSubfield6(${fieldToString(field)}), CURR:${currentInt}`, debug);\n if (!field.subfields) {\n return;\n }\n field.subfields.forEach(subfield => subfieldReset6(subfield));\n }\n\n function subfieldReset6(subfield) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n const currIndex = subfield6GetOccurrenceNumber(subfield);\n if (currIndex === undefined || currIndex === '00') {\n return;\n }\n\n const newIndex = mapCurrIndexToNewIndex(currIndex);\n //nvdebug(`subfieldReset6(${subfieldToString(subfield)}): ${newIndex}`, debug);\n subfield6ResetOccurrenceNumber(subfield, newIndex);\n }\n\n function mapCurrIndexToNewIndex(currIndex) {\n if(currIndex in oldtoNewCache) {\n return oldtoNewCache[currIndex];\n }\n const newIndex = intToOccurrenceNumberString(currentInt);\n oldtoNewCache[currIndex] = newIndex;\n currentInt++;\n return newIndex;\n }\n\n /* eslint-enable */\n\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,eAAA,GAAAF,OAAA;AAE+H,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE/H;;AAEA,MAAMG,KAAK,GAAG,IAAAC,cAAiB,EAAC,4EAA4E,CAAC;;AAG7G;AACA;AACA;;AAEe,SAAAC,SAAA,EAAY;EACzB,OAAO;IACLC,WAAW,EAAE,oFAAoF;IACjGC,QAAQ;IAAEC;EACZ,CAAC;EAED,SAASA,GAAGA,CAACC,MAAM,EAAE;IACnB,IAAAC,cAAO,EAAC,4BAA4B,EAAEP,KAAK,CAAC;IAC5C,MAAMQ,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEJ,GAAG,EAAE,EAAE;MAAEK,KAAK,EAAE;IAAI,CAAC;IAC/C;;IAEA;;IAEAC,kDAAkD,CAACL,MAAM,CAAC;IAC1DM,qCAAqC,CAACN,MAAM,CAAC;;IAE7C;IACA,OAAOE,GAAG;EACZ;EAEA,SAASJ,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAME,GAAG,GAAG;MAACC,OAAO,EAAE;IAAE,CAAC;IAEzB,IAAAF,cAAO,EAAC,0CAA0C,EAAEP,KAAK,CAAC;IAC1D,IAAIa,gCAAgC,CAACP,MAAM,CAAC,CAACQ,MAAM,EAAE;MACnDN,GAAG,CAACC,OAAO,CAACM,IAAI,CAAC,4CAA4C,CAAC;IAChE;;IAEA;IACA,IAAAR,cAAO,EAAC,qDAAqD,EAAEP,KAAK,CAAC;IACrE,MAAMgB,GAAG,GAAG,IAAAC,8DAA8C,EAACX,MAAM,CAAC;IAClE,MAAMY,IAAI,GAAGC,iDAAiD,CAACb,MAAM,CAAC;IAGtE,IAAIU,GAAG,KAAKE,IAAI,EAAE;MAChBV,GAAG,CAACC,OAAO,CAACM,IAAI,CAAC,8CAA8CG,IAAI,cAAcF,GAAG,EAAE,CAAC;IACzF;IACAR,GAAG,CAACE,KAAK,GAAGF,GAAG,CAACC,OAAO,CAACK,MAAM,GAAG,CAAC;IAClC,OAAON,GAAG;EACZ;AACF;AAEA,SAASY,wCAAwCA,CAACC,gBAAgB,EAAEC,MAAM,EAAE;EAC1E,OAAOA,MAAM,CAACC,MAAM,CAACC,CAAC,IAAIA,CAAC,CAACC,GAAG,KAAK,KAAK,IAAID,CAAC,CAACE,SAAS,CAACC,IAAI,CAACC,EAAE,IAAI,IAAAC,4CAA4B,EAACD,EAAE,CAAC,KAAKP,gBAAgB,CAAC,CAAC;AAC7H;AAEA,SAASS,iCAAiCA,CAACC,QAAQ,EAAEC,UAAU,EAAE;EAC/D,MAAMX,gBAAgB,GAAG,IAAAQ,4CAA4B,EAACE,QAAQ,CAAC;EAC/D,IAAI,CAACV,gBAAgB,IAAIA,gBAAgB,KAAK,IAAI,EAAE;IAClD,OAAO,KAAK;EACd;EACA,MAAMY,cAAc,GAAGb,wCAAwC,CAACC,gBAAgB,EAAEW,UAAU,CAAC;EAC7F;EACA,OAAOC,cAAc,CAACnB,MAAM,GAAG,CAAC;AAClC;AAEA,SAASoB,8BAA8BA,CAACC,KAAK,EAAEH,UAAU,EAAE;EACzD,IAAI,CAACG,KAAK,CAACT,SAAS,IAAIS,KAAK,CAACV,GAAG,KAAK,KAAK,EAAE;IAAE;IAC7C,OAAO,KAAK;EACd;;EAEA;EACA,OAAOU,KAAK,CAACT,SAAS,CAACC,IAAI,CAACI,QAAQ,IAAID,iCAAiC,CAACC,QAAQ,EAAEC,UAAU,CAAC,CAAC;AAElG;AAEA,SAASnB,gCAAgCA,CAACP,MAAM,EAAE;EAChD,MAAM8B,yBAAyB,GAAG9B,MAAM,CAACgB,MAAM,CAACC,MAAM,CAACY,KAAK,IAAIA,KAAK,CAACV,GAAG,KAAK,KAAK,IAAI,IAAAY,uBAAgB,EAACF,KAAK,EAAE,GAAG,CAAC,CAAC;EACpH;EACA,OAAOC,yBAAyB,CAACb,MAAM,CAACY,KAAK,IAAID,8BAA8B,CAACC,KAAK,EAAEC,yBAAyB,CAAC,CAAC;AACpH;AAEA,SAASzB,kDAAkDA,CAACL,MAAM,EAAE;EAClE,MAAMgC,4BAA4B,GAAGzB,gCAAgC,CAACP,MAAM,CAAC;EAC7E,IAAIgC,4BAA4B,CAACxB,MAAM,GAAG,CAAC,EAAE;IAC3C;EACF;EACA,IAAAP,cAAO,EAAC,sCAAsC+B,4BAA4B,CAACxB,MAAM,SAAS,EAAEd,KAAK,CAAC;EAClGsC,4BAA4B,CAACC,OAAO,CAACJ,KAAK,IAAIK,4BAA4B,CAACL,KAAK,CAAC,CAAC,CAAC,CAAC;;EAEpF,SAASM,gBAAgBA,CAACN,KAAK,EAAE;IAC/B,IAAIA,KAAK,CAACV,GAAG,KAAK,KAAK,EAAE;MAAE;MACzB,OAAO,KAAK;IACd;IACA,MAAMJ,gBAAgB,GAAG,IAAAqB,mDAAmC,EAACP,KAAK,CAAC;IACnE,IAAA5B,cAAO,EAAC,2BAA2Bc,gBAAgB,QAAQ,IAAAsB,oBAAa,EAACR,KAAK,CAAC,EAAE,CAAC;IAClF,IAAId,gBAAgB,KAAKuB,SAAS,EAAE;MAClC,OAAO,KAAK;IACd;IACA,MAAMC,iBAAiB,GAAGzB,wCAAwC,CAACC,gBAAgB,EAAEiB,4BAA4B,CAAC;IAClH,IAAIO,iBAAiB,CAAC/B,MAAM,GAAG,CAAC,EAAE;MAChC,IAAAP,cAAO,EAAC,mBAAmBsC,iBAAiB,CAAC/B,MAAM,mCAAmCO,gBAAgB,uBAAuB,CAAC;MAC9H,OAAO,KAAK;IACd;IACA,IAAAd,cAAO,EAAC,cAAcsC,iBAAiB,CAAC/B,MAAM,mCAAmCO,gBAAgB,oBAAoB,CAAC;IACtH,MAAMyB,8BAA8B,GAAGD,iBAAiB,CAACtB,MAAM,CAACwB,SAAS,IAAIZ,KAAK,CAACV,GAAG,KAAKsB,SAAS,CAACtB,GAAG,CAAC;IAEzG,IAAIqB,8BAA8B,CAAChC,MAAM,KAAK,CAAC,EAAE;MAC/C,IAAAP,cAAO,EAAC,6BAA6B4B,KAAK,CAACV,GAAG,OAAOqB,8BAA8B,CAAChC,MAAM,yBAAyB,CAAC;MACpH,OAAO,KAAK;IACd;IAEA,OAAO,IAAI;EACb;EAEA,SAAS0B,4BAA4BA,CAACL,KAAK,EAAE;IAC3C,IAAI,CAACM,gBAAgB,CAACN,KAAK,CAAC,EAAE;MAC5B;IACF;IACA;IACA,MAAMd,gBAAgB,GAAG,IAAAqB,mDAAmC,EAACP,KAAK,CAAC;IACnE,MAAMa,wBAAwB,GAAG,IAAA/B,8DAA8C,EAACX,MAAM,CAAC,GAAG,CAAC;IAC3F,MAAM2C,mBAAmB,GAAG,IAAAC,2CAA2B,EAACF,wBAAwB,CAAC;IACjF,MAAMG,YAAY,GAAG,IAAAC,6CAA6B,EAACjB,KAAK,EAAE7B,MAAM,CAACgB,MAAM,CAAC;IAExE,IAAAf,cAAO,EAAC,aAAa,IAAAoC,oBAAa,EAACR,KAAK,CAAC,gCAAgCgB,YAAY,CAACrC,MAAM,mBAAmBmC,mBAAmB,GAAG,EAAEjD,KAAK,CAAC;IAE7I,IAAAqD,0CAA0B,EAAClB,KAAK,EAAEc,mBAAmB,EAAE5B,gBAAgB,CAAC;IACxE8B,YAAY,CAACZ,OAAO,CAACe,WAAW,IAAI,IAAAD,0CAA0B,EAACC,WAAW,EAAEL,mBAAmB,EAAE5B,gBAAgB,CAAC,CAAC,CAAC,CAAC;EAEvH;AAGF;AACA,SAASF,iDAAiDA,CAACb,MAAM,EAAE;EACjE;EACA;EACA,IAAIiD,UAAU,GAAG,EAAE;EACnBjD,MAAM,CAACgB,MAAM,CAACiB,OAAO,CAACJ,KAAK,IAAIqB,eAAe,CAACrB,KAAK,CAAC,CAAC;EAEtD,SAASqB,eAAeA,CAACrB,KAAK,EAAE;IAC9B,IAAI,CAACA,KAAK,CAACT,SAAS,EAAE;MACpB;IACF;IACAS,KAAK,CAACT,SAAS,CAACa,OAAO,CAACR,QAAQ,IAAI0B,kBAAkB,CAAC1B,QAAQ,CAAC,CAAC;EACnE;EAEA,SAAS0B,kBAAkBA,CAAC1B,QAAQ,EAAE;IACpC,IAAI,CAAC,IAAA2B,gCAAgB,EAAC3B,QAAQ,CAAC,EAAE;MAC/B;IACF;IACA,MAAM4B,CAAC,GAAG,IAAAC,qDAAqC,EAAC7B,QAAQ,CAAC;IACzD,IAAI4B,CAAC,KAAK,CAAC,EAAE;MACX;IACF;IACAJ,UAAU,CAACI,CAAC,CAAC,GAAG,CAAC;EACnB;EACA,IAAIE,CAAC,GAAG,CAAC;EACTN,UAAU,CAAChB,OAAO,CAACuB,IAAI,IAAID,CAAC,IAAGC,IAAI,CAAC;EACpC;EACA,OAAOD,CAAC;AACV;AAEO,SAASjD,qCAAqCA,CAACN,MAAM,EAAE;EAAE;EAC9D;EACA,IAAIyD,UAAU,GAAG,CAAC;EAClB,IAAIC,aAAa,GAAG,CAAC,CAAC;EAEtB1D,MAAM,CAACgB,MAAM,CAACiB,OAAO,CAACJ,KAAK,IAAI8B,mBAAmB,CAAC9B,KAAK,CAAC,CAAC;EAE1D,SAAS8B,mBAAmBA,CAAC9B,KAAK,EAAE;IAClC,IAAA5B,cAAO,EAAC,uBAAuB,IAAAoC,oBAAa,EAACR,KAAK,CAAC,WAAW4B,UAAU,EAAE,EAAE/D,KAAK,CAAC;IAClF,IAAI,CAACmC,KAAK,CAACT,SAAS,EAAE;MACpB;IACF;IACAS,KAAK,CAACT,SAAS,CAACa,OAAO,CAACR,QAAQ,IAAImC,cAAc,CAACnC,QAAQ,CAAC,CAAC;EAC/D;EAEA,SAASmC,cAAcA,CAACnC,QAAQ,EAAE;IAChC,IAAI,CAAC,IAAA2B,gCAAgB,EAAC3B,QAAQ,CAAC,EAAE;MAC/B;IACF;IACA,MAAMoC,SAAS,GAAG,IAAAtC,4CAA4B,EAACE,QAAQ,CAAC;IACxD,IAAIoC,SAAS,KAAKvB,SAAS,IAAIuB,SAAS,KAAK,IAAI,EAAE;MACjD;IACF;IAEA,MAAMC,QAAQ,GAAGC,sBAAsB,CAACF,SAAS,CAAC;IAClD;IACA,IAAAG,8CAA8B,EAACvC,QAAQ,EAAEqC,QAAQ,CAAC;EACpD;EAEA,SAASC,sBAAsBA,CAACF,SAAS,EAAE;IACzC,IAAGA,SAAS,IAAIH,aAAa,EAAE;MAC7B,OAAOA,aAAa,CAACG,SAAS,CAAC;IACjC;IACA,MAAMC,QAAQ,GAAG,IAAAlB,2CAA2B,EAACa,UAAU,CAAC;IACxDC,aAAa,CAACG,SAAS,CAAC,GAAGC,QAAQ;IACnCL,UAAU,EAAE;IACZ,OAAOK,QAAQ;EACjB;;EAEA;AAEF","ignoreList":[]}
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/reindexSubfield6OccurenceNumbers.js"],
|
|
4
|
+
"sourcesContent": ["import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString, nvdebug} from './utils.js';\nimport {fieldGetOccurrenceNumberPairs, fieldGetUnambiguousOccurrenceNumber, fieldResetOccurrenceNumber, intToOccurrenceNumberString, isValidSubfield6,\n recordGetMaxSubfield6OccurrenceNumberAsInteger,\n subfield6GetOccurrenceNumber, subfield6GetOccurrenceNumberAsInteger, subfield6ResetOccurrenceNumber} from './subfield6Utils.js';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:reindexSubfield6OccurrenceNumbers');\n\n\n// NB! This validator/fixer has two functionalities:\n// 1) normal reindexing of occurrence numbers\n// 2) disambiguation (when possible) of unambiguous occurrence numbers\n\nexport default function () {\n return {\n description: 'Reindex occurrence numbers in $6 subfield so that they start from 01 and end in NN',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix SF6 occurrence numbers', debug);\n const res = {message: [], fix: [], valid: true};\n //message.fix = [];\n\n // This can not really fail...\n\n recordDisambiguateSharedSubfield6OccurrenceNumbers(record);\n recordResetSubfield6OccurrenceNumbers(record);\n\n // message.valid = !(message.message.length >= 1);\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n nvdebug('Validate SF6 occurrence number multiuses', debug);\n if (recordGetSharedOccurrenceNumbers(record).length) {\n res.message.push(`Multi-use of occurrence number(s) detected`);\n }\n\n // Check max, and check number of different indexes\n nvdebug('Validate SF6 occurrence number (max vs n instances)', debug);\n const max = recordGetMaxSubfield6OccurrenceNumberAsInteger(record);\n const size = recordGetNumberOfUniqueSubfield6OccurrenceNumbers(record);\n\n\n if (max !== size) {\n res.message.push(`Gaps detected in occurrence numbers: found ${size}, seen max ${max}`);\n }\n res.valid = res.message.length < 1;\n return res;\n }\n}\n\nfunction getPotentialSharedOccurrenceNumberFields(occurrenceNumber, fields) {\n return fields.filter(f => f.tag !== '880' && f.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber));\n}\n\nfunction subfieldHasSharedOccurrenceNumber(subfield, candFields) {\n const occurrenceNumber = subfield6GetOccurrenceNumber(subfield);\n if (!occurrenceNumber || occurrenceNumber === '00') {\n return false;\n }\n const relevantFields = getPotentialSharedOccurrenceNumberFields(occurrenceNumber, candFields);\n // record.fields.filter(f => f.tag !== '880' && fieldHasOccurrenceNumber(f, occurrenceNumber));\n return relevantFields.length > 1;\n}\n\nfunction fieldHasSharedOccurrenceNumber(field, candFields) {\n if (!field.subfields || field.tag === '880') { // Should not happen\n return false;\n }\n\n // What if there are multiple $6s in a given field? Should not be, but...\n return field.subfields.some(subfield => subfieldHasSharedOccurrenceNumber(subfield, candFields));\n\n}\n\nfunction recordGetSharedOccurrenceNumbers(record) {\n const fieldsContainingSubfield6 = record.fields.filter(field => field.tag !== '880' && fieldHasSubfield(field, '6'));\n // fieldsContainingSubfield6.some(field => fieldHasSharedOccurrenceNumber(field, fieldsContainingSubfield6)))\n return fieldsContainingSubfield6.filter(field => fieldHasSharedOccurrenceNumber(field, fieldsContainingSubfield6));\n}\n\nfunction recordDisambiguateSharedSubfield6OccurrenceNumbers(record) {\n const sharedOccurrenceNumberFields = recordGetSharedOccurrenceNumbers(record);\n if (sharedOccurrenceNumberFields.length < 2) {\n return;\n }\n nvdebug(`Disambiguate occurrence numbers (N=${sharedOccurrenceNumberFields.length}) in...`, debug);\n sharedOccurrenceNumberFields.forEach(field => disambiguateOccurrenceNumber(field));\n\n function disambiguateable(field) {\n if (field.tag === '880') { // Not needed, already filtered...\n return false;\n }\n const occurrenceNumber = fieldGetUnambiguousOccurrenceNumber(field);\n nvdebug(` Trying to disambiguate ${occurrenceNumber} in '${fieldToString(field)}`);\n if (occurrenceNumber === undefined) {\n return false;\n }\n const allRelevantFields = getPotentialSharedOccurrenceNumberFields(occurrenceNumber, sharedOccurrenceNumberFields);\n if (allRelevantFields.length < 2) {\n nvdebug(` Currently only ${allRelevantFields.length} field(s) use occurrence number ${occurrenceNumber}. No action required.`);\n return false;\n }\n nvdebug(` Currently ${allRelevantFields.length} field(s) use occurrence number ${occurrenceNumber}. ACTION REQUIRED!`);\n const relevantFieldsWithCurrFieldTag = allRelevantFields.filter(candField => field.tag === candField.tag);\n\n if (relevantFieldsWithCurrFieldTag.length !== 1) {\n nvdebug(` Number of them using tag ${field.tag} is ${relevantFieldsWithCurrFieldTag.length}. Can not disambiguate!`);\n return false;\n }\n\n return true;\n }\n\n function disambiguateOccurrenceNumber(field) {\n if (!disambiguateable(field)) {\n return;\n }\n // Reset field:\n const occurrenceNumber = fieldGetUnambiguousOccurrenceNumber(field);\n const newOccurrenceNumberAsInt = recordGetMaxSubfield6OccurrenceNumberAsInteger(record) + 1;\n const newOccurrenceNumber = intToOccurrenceNumberString(newOccurrenceNumberAsInt);\n const pairedFields = fieldGetOccurrenceNumberPairs(field, record.fields);\n\n nvdebug(` Reindex '${fieldToString(field)}' occurrence number and it's ${pairedFields.length} pair(s) using '${newOccurrenceNumber}'`, debug);\n\n fieldResetOccurrenceNumber(field, newOccurrenceNumber, occurrenceNumber);\n pairedFields.forEach(pairedField => fieldResetOccurrenceNumber(pairedField, newOccurrenceNumber, occurrenceNumber));\n\n }\n\n\n}\nfunction recordGetNumberOfUniqueSubfield6OccurrenceNumbers(record) {\n // Calculates the number of used different occurrence numbers\n let indexArray = [];\n record.fields.forEach(field => gatherFieldData(field));\n\n function gatherFieldData(field) {\n if (!field.subfields) {\n return;\n }\n field.subfields.forEach(subfield => gatherSubfieldData(subfield));\n }\n\n function gatherSubfieldData(subfield) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n const i = subfield6GetOccurrenceNumberAsInteger(subfield);\n if (i === 0) {\n return\n }\n indexArray[i] = 1;\n }\n let n = 0;\n indexArray.forEach(elem => n+= elem);\n return n;\n}\n\nexport function recordResetSubfield6OccurrenceNumbers(record) { // Remove gaps\n /* eslint-disable */\n let currentInt = 1;\n let oldtoNewCache = {};\n\n record.fields.forEach(field => fieldResetSubfield6(field));\n\n function fieldResetSubfield6(field) {\n nvdebug(`fieldResetSubfield6(${fieldToString(field)}), CURR:${currentInt}`, debug);\n if (!field.subfields) {\n return;\n }\n field.subfields.forEach(subfield => subfieldReset6(subfield));\n }\n\n function subfieldReset6(subfield) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n const currIndex = subfield6GetOccurrenceNumber(subfield);\n if (currIndex === undefined || currIndex === '00') {\n return;\n }\n\n const newIndex = mapCurrIndexToNewIndex(currIndex);\n //nvdebug(`subfieldReset6(${subfieldToString(subfield)}): ${newIndex}`, debug);\n subfield6ResetOccurrenceNumber(subfield, newIndex);\n }\n\n function mapCurrIndexToNewIndex(currIndex) {\n if(currIndex in oldtoNewCache) {\n return oldtoNewCache[currIndex];\n }\n const newIndex = intToOccurrenceNumberString(currentInt);\n oldtoNewCache[currIndex] = newIndex;\n currentInt++;\n return newIndex;\n }\n\n /* eslint-enable */\n\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import { MarcRecord } from "@natlibfi/marc-record";
|
|
3
|
+
import validatorFactory from "./reindexSubfield6OccurenceNumbers.js";
|
|
4
|
+
import { READERS } from "@natlibfi/fixura";
|
|
5
|
+
import generateTests from "@natlibfi/fixugen";
|
|
6
|
+
import createDebugLogger from "debug";
|
|
7
|
+
generateTests({
|
|
8
|
+
callback,
|
|
9
|
+
path: [import.meta.dirname, "..", "test-fixtures", "reindex-sf6-occurence-numbers"],
|
|
10
|
+
useMetadataFile: true,
|
|
11
|
+
recurse: false,
|
|
12
|
+
fixura: {
|
|
13
|
+
reader: READERS.JSON
|
|
14
|
+
},
|
|
15
|
+
hooks: {
|
|
16
|
+
before: async () => {
|
|
17
|
+
testValidatorFactory();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda/reindexSubfield6OccurrenceNumbers:test");
|
|
22
|
+
async function testValidatorFactory() {
|
|
23
|
+
const validator = await validatorFactory();
|
|
24
|
+
assert.equal(typeof validator, "object");
|
|
25
|
+
assert.equal(typeof validator.description, "string");
|
|
26
|
+
assert.equal(typeof validator.validate, "function");
|
|
27
|
+
}
|
|
28
|
+
async function callback({ getFixture, enabled = true, fix = false }) {
|
|
29
|
+
if (enabled === false) {
|
|
30
|
+
debug("TEST SKIPPED!");
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const validator = await validatorFactory();
|
|
34
|
+
const record = new MarcRecord(getFixture("record.json"));
|
|
35
|
+
const expectedResult = getFixture("expectedResult.json");
|
|
36
|
+
if (!fix) {
|
|
37
|
+
const result = await validator.validate(record);
|
|
38
|
+
assert.deepEqual(result, expectedResult);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
await validator.fix(record);
|
|
42
|
+
assert.deepEqual(record, expectedResult);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=reindexSubfield6OccurenceNumbers.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/reindexSubfield6OccurenceNumbers.test.js"],
|
|
4
|
+
"sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './reindexSubfield6OccurenceNumbers.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'reindex-sf6-occurence-numbers'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/reindexSubfield6OccurrenceNumbers:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, '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 assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAC1B,OAAO,uBAAuB;AAE9B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,+BAA+B;AAAA,EAClF,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,YAAY;AAClB,2BAAqB;AAAA,IACvB;AAAA,EACF;AACF,CAAC;AACD,MAAM,QAAQ,kBAAkB,iFAAiF;AAEjH,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,SAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AACpD;AAEA,eAAe,SAAS,EAAC,YAAY,UAAU,MAAM,MAAM,MAAK,GAAG;AACjE,MAAI,YAAY,OAAO;AACrB,UAAM,eAAe;AACrB;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,iBAAiB;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,QAAM,iBAAiB,WAAW,qBAAqB;AAGvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,cAAc;AACzC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,101 +1,53 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
});
|
|
6
|
-
exports.default = _default;
|
|
7
|
-
exports.fieldToChain = fieldToChain;
|
|
8
|
-
exports.handleDuplicateSubfield8Chains = handleDuplicateSubfield8Chains;
|
|
9
|
-
exports.isChainHead = isChainHead;
|
|
10
|
-
exports.removeDuplicateDatafields = removeDuplicateDatafields;
|
|
11
|
-
exports.removeDuplicateSubfield8Chains = removeDuplicateSubfield8Chains;
|
|
12
|
-
exports.sameField = sameField;
|
|
13
|
-
var _debug = _interopRequireDefault(require("debug"));
|
|
14
|
-
var _utils = require("./utils");
|
|
15
|
-
var _subfield6Utils = require("./subfield6Utils");
|
|
16
|
-
var _subfield8Utils = require("./subfield8Utils");
|
|
17
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
1
|
+
import createDebugLogger from "debug";
|
|
2
|
+
import { fieldsToString, fieldToString, nvdebug } from "./utils.js";
|
|
3
|
+
import { fieldHasValidSubfield6, fieldsGetOccurrenceNumbers, fieldsToNormalizedString, fieldToNormalizedString, get6s } from "./subfield6Utils.js";
|
|
4
|
+
import { add8s, fieldHasLinkingNumber, fieldHasValidSubfield8, fieldsGetAllSubfield8LinkingNumbers, getSubfield8LinkingNumber, recordGetAllSubfield8LinkingNumbers, recordGetFieldsWithSubfield8LinkingNumber } from "./subfield8Utils.js";
|
|
18
5
|
const LINK_ROOT = 4;
|
|
19
6
|
const LINKED_AND_PROCESSED = 2;
|
|
20
7
|
const LINKED_NOT_PROCESSED = 1;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda:removeDuplicateDataFields');
|
|
25
|
-
function _default() {
|
|
8
|
+
const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda:removeDuplicateDataFields");
|
|
9
|
+
export default function() {
|
|
26
10
|
return {
|
|
27
|
-
description:
|
|
11
|
+
description: "Remove duplicate data fields. Certain exceptions apply, mainly too complited chained fields",
|
|
28
12
|
validate,
|
|
29
13
|
fix
|
|
30
14
|
};
|
|
31
15
|
function fix(record) {
|
|
32
|
-
|
|
33
|
-
const res = {
|
|
34
|
-
message: [],
|
|
35
|
-
fix: [],
|
|
36
|
-
valid: true
|
|
37
|
-
};
|
|
16
|
+
nvdebug("Remove duplicate data fields");
|
|
17
|
+
const res = { message: [], fix: [], valid: true };
|
|
38
18
|
removeDuplicateDatafields(record, true);
|
|
39
|
-
// This can not really fail...
|
|
40
19
|
return res;
|
|
41
20
|
}
|
|
42
21
|
function validate(record) {
|
|
43
|
-
|
|
44
|
-
(0, _utils.nvdebug)('Validate record: duplicate data fields cause (t)error', debug);
|
|
22
|
+
nvdebug("Validate record: duplicate data fields cause (t)error", debug);
|
|
45
23
|
const duplicates = removeDuplicateDatafields(record, false);
|
|
46
|
-
|
|
47
|
-
//const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);
|
|
48
|
-
|
|
49
|
-
const res = {
|
|
50
|
-
message: duplicates
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
/*
|
|
54
|
-
if (orphanedFields.length > 0) {
|
|
55
|
-
res.message = [`${orphanedFields.length} orphaned occurrence number field(s) detected`];
|
|
56
|
-
}
|
|
57
|
-
*/
|
|
24
|
+
const res = { message: duplicates };
|
|
58
25
|
res.valid = res.message.length < 1;
|
|
59
26
|
return res;
|
|
60
27
|
}
|
|
61
28
|
}
|
|
62
|
-
|
|
63
|
-
/*
|
|
64
|
-
function numberOfLinkageSubfields(field) {
|
|
65
|
-
nvdebug(`N of Linkage Subs(${fieldToString(field)})`);
|
|
66
|
-
const subfields = field.subfields.filter(sf => sf.code === '6' || sf.code === '8');
|
|
67
|
-
return subfields.length;
|
|
68
|
-
}
|
|
69
|
-
*/
|
|
70
|
-
|
|
71
29
|
function removeLinkNotes(record) {
|
|
72
|
-
record.fields.forEach(f => delete f.linkNote);
|
|
30
|
+
record.fields.forEach((f) => delete f.linkNote);
|
|
73
31
|
}
|
|
74
32
|
function newGetAllLinkedFields(field, record, useSixes = true, useEights = true) {
|
|
75
|
-
removeLinkNotes(record);
|
|
76
|
-
|
|
77
|
-
/* eslint-disable */
|
|
33
|
+
removeLinkNotes(record);
|
|
78
34
|
field.linkNote = LINK_ROOT;
|
|
79
35
|
let currField = field;
|
|
80
|
-
|
|
81
|
-
// Loop until all linked fields have been processed:
|
|
82
|
-
while (currField !== undefined) {
|
|
36
|
+
while (currField !== void 0) {
|
|
83
37
|
if (useSixes) {
|
|
84
|
-
const related6s =
|
|
85
|
-
related6s.forEach(f => linkField(f));
|
|
38
|
+
const related6s = get6s(currField, record.fields);
|
|
39
|
+
related6s.forEach((f) => linkField(f));
|
|
86
40
|
}
|
|
87
41
|
if (useEights) {
|
|
88
|
-
const related8s =
|
|
89
|
-
related8s.forEach(f => linkField(f));
|
|
42
|
+
const related8s = add8s([currField], record);
|
|
43
|
+
related8s.forEach((f) => linkField(f));
|
|
90
44
|
}
|
|
91
45
|
if (currField.linkNote !== LINK_ROOT) {
|
|
92
46
|
currField.linkNote = LINKED_AND_PROCESSED;
|
|
93
47
|
}
|
|
94
|
-
currField = record.fields.find(f => f.linkNote === LINKED_NOT_PROCESSED);
|
|
48
|
+
currField = record.fields.find((f) => f.linkNote === LINKED_NOT_PROCESSED);
|
|
95
49
|
}
|
|
96
|
-
|
|
97
|
-
// Collect relevant fields:
|
|
98
|
-
const linkedFields = record.fields.filter(f => f.linkNote);
|
|
50
|
+
const linkedFields = record.fields.filter((f) => f.linkNote);
|
|
99
51
|
removeLinkNotes(record);
|
|
100
52
|
return linkedFields;
|
|
101
53
|
function linkField(f) {
|
|
@@ -103,135 +55,104 @@ function newGetAllLinkedFields(field, record, useSixes = true, useEights = true)
|
|
|
103
55
|
f.linkNote = LINKED_NOT_PROCESSED;
|
|
104
56
|
}
|
|
105
57
|
}
|
|
106
|
-
|
|
107
|
-
/* eslint-enable */
|
|
108
58
|
}
|
|
109
59
|
function recordRemoveFieldOrSubfield8(record, field, currLinkingNumber) {
|
|
110
|
-
const eights = field.subfields.filter(sf => sf.code ===
|
|
60
|
+
const eights = field.subfields.filter((sf) => sf.code === "8");
|
|
111
61
|
if (eights.length < 2) {
|
|
112
62
|
record.removeField(field);
|
|
113
63
|
return;
|
|
114
64
|
}
|
|
115
|
-
const subfields = field.subfields.filter(sf =>
|
|
116
|
-
subfields.forEach(sf => record.removeSubfield(sf, field));
|
|
65
|
+
const subfields = field.subfields.filter((sf) => getSubfield8LinkingNumber(sf) === currLinkingNumber);
|
|
66
|
+
subfields.forEach((sf) => record.removeSubfield(sf, field));
|
|
117
67
|
}
|
|
118
68
|
function newRecordRemoveFieldOrSubfield8(record, field, currLinkingNumber, fix) {
|
|
119
|
-
const eights = field.subfields.filter(sf => sf.code ===
|
|
69
|
+
const eights = field.subfields.filter((sf) => sf.code === "8");
|
|
120
70
|
if (eights.length < 2) {
|
|
121
71
|
field.deleted = 1;
|
|
122
72
|
return;
|
|
123
73
|
}
|
|
124
|
-
const subfields = field.subfields.filter(sf =>
|
|
125
|
-
subfields.forEach(sf => {
|
|
74
|
+
const subfields = field.subfields.filter((sf) => getSubfield8LinkingNumber(sf) === currLinkingNumber);
|
|
75
|
+
subfields.forEach((sf) => {
|
|
126
76
|
field.modified = 1;
|
|
127
77
|
if (fix) {
|
|
128
78
|
record.removeSubfield(sf, field);
|
|
129
79
|
}
|
|
130
80
|
});
|
|
131
81
|
}
|
|
132
|
-
function removeDuplicateSubfield8Chains(record, fix = true) {
|
|
133
|
-
// Seen $8 subsfields in various fields:
|
|
134
|
-
// 161 700
|
|
135
|
-
// 17 710
|
|
136
|
-
// 11 110
|
|
137
|
-
// 8 730
|
|
138
|
-
// 1 100
|
|
139
|
-
// Given these stats, there's no need to check for 1XX-vs-7XX removals
|
|
140
|
-
|
|
141
|
-
/* eslint-disable */
|
|
82
|
+
export function removeDuplicateSubfield8Chains(record, fix = true) {
|
|
142
83
|
let seen = {};
|
|
143
|
-
let removables = [];
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
const seenLinkingNumbers = (0, _subfield8Utils.recordGetAllSubfield8LinkingNumbers)(record);
|
|
84
|
+
let removables = [];
|
|
85
|
+
nvdebug("CHAIN-8");
|
|
86
|
+
const seenLinkingNumbers = recordGetAllSubfield8LinkingNumbers(record);
|
|
147
87
|
if (seenLinkingNumbers.length === 0) {
|
|
148
88
|
return removables;
|
|
149
89
|
}
|
|
150
|
-
|
|
151
|
-
seenLinkingNumbers.forEach(currLinkingNumber => {
|
|
152
|
-
const linkedFields =
|
|
153
|
-
// As/If there's just one occurrence number it should be fine to use normalizeOccurrenceNumber = true
|
|
90
|
+
nvdebug(`seen linking numbers ($8): ${seenLinkingNumbers.join(", ")}`, debug);
|
|
91
|
+
seenLinkingNumbers.forEach((currLinkingNumber) => {
|
|
92
|
+
const linkedFields = recordGetFieldsWithSubfield8LinkingNumber(record, currLinkingNumber);
|
|
154
93
|
const normalizeOccurrenceNumber = true;
|
|
155
|
-
const linkedFieldsAsString =
|
|
156
|
-
|
|
157
|
-
|
|
94
|
+
const linkedFieldsAsString = fieldsToNormalizedString(linkedFields, currLinkingNumber, normalizeOccurrenceNumber, true);
|
|
95
|
+
nvdebug(`Results for LINKING NUMBER ${currLinkingNumber}:`, debug);
|
|
96
|
+
nvdebug(`${linkedFieldsAsString}`, debug);
|
|
158
97
|
if (linkedFieldsAsString in seen) {
|
|
159
98
|
if (!removables.includes(linkedFieldsAsString)) {
|
|
160
99
|
removables.push(linkedFieldsAsString);
|
|
161
100
|
}
|
|
162
101
|
if (fix) {
|
|
163
|
-
|
|
164
|
-
linkedFields.forEach(field => recordRemoveFieldOrSubfield8(record, field, currLinkingNumber));
|
|
102
|
+
nvdebug(`$8 CHAIN FIX: REMOVE $8 GROUP: ${fieldsToString(linkedFields)}`, debug);
|
|
103
|
+
linkedFields.forEach((field) => recordRemoveFieldOrSubfield8(record, field, currLinkingNumber));
|
|
165
104
|
return;
|
|
166
105
|
}
|
|
167
|
-
|
|
106
|
+
nvdebug(`$8 VALIDATION: DUPLICATE DETECTED ${linkedFieldsAsString}`, debug);
|
|
168
107
|
return;
|
|
169
108
|
}
|
|
170
|
-
|
|
109
|
+
nvdebug(`$8 DOUBLE REMOVAL OR VALIDATION: ADD2SEEN ${linkedFieldsAsString}`, debug);
|
|
171
110
|
seen[linkedFieldsAsString] = 1;
|
|
172
111
|
return;
|
|
173
112
|
});
|
|
174
|
-
|
|
175
|
-
/* eslint-enable */
|
|
176
113
|
return removables;
|
|
177
114
|
}
|
|
178
|
-
function handleDuplicateSubfield8Chains(record, fix) {
|
|
179
|
-
// Seen $8 subsfields in various fields:
|
|
180
|
-
// 161 700
|
|
181
|
-
// 17 710
|
|
182
|
-
// 11 110
|
|
183
|
-
// 8 730
|
|
184
|
-
// 1 100
|
|
185
|
-
// Given these stats, there's no need to check for 1XX-vs-7XX removals
|
|
186
|
-
|
|
187
|
-
/* eslint-disable */
|
|
115
|
+
export function handleDuplicateSubfield8Chains(record, fix) {
|
|
188
116
|
let seen = {};
|
|
189
|
-
|
|
190
|
-
const seenLinkingNumbers =
|
|
117
|
+
nvdebug("CHAIN-8");
|
|
118
|
+
const seenLinkingNumbers = recordGetAllSubfield8LinkingNumbers(record);
|
|
191
119
|
if (seenLinkingNumbers.length === 0) {
|
|
192
120
|
return;
|
|
193
121
|
}
|
|
194
|
-
|
|
195
|
-
seenLinkingNumbers.forEach(currLinkingNumber => {
|
|
196
|
-
const linkedFields =
|
|
197
|
-
|
|
198
|
-
const
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
(0, _utils.nvdebug)(`${linkedFieldsAsString}`, debug);
|
|
122
|
+
nvdebug(`seen linking numbers ($8): ${seenLinkingNumbers.join(", ")}`, debug);
|
|
123
|
+
seenLinkingNumbers.forEach((currLinkingNumber) => {
|
|
124
|
+
const linkedFields = recordGetFieldsWithSubfield8LinkingNumber(record, currLinkingNumber);
|
|
125
|
+
const normalizeOccurrenceNumber = false;
|
|
126
|
+
const linkedFieldsAsString = fieldsToNormalizedString(linkedFields, currLinkingNumber, normalizeOccurrenceNumber, true);
|
|
127
|
+
nvdebug(`Results for LINKING NUMBER ${currLinkingNumber}:`, debug);
|
|
128
|
+
nvdebug(`${linkedFieldsAsString}`, debug);
|
|
202
129
|
if (linkedFieldsAsString in seen) {
|
|
203
|
-
|
|
204
|
-
linkedFields.forEach(field => newRecordRemoveFieldOrSubfield8(record, field, currLinkingNumber, fix));
|
|
130
|
+
nvdebug(`$8 CHAIN FIX: REMOVE $8 GROUP: ${fieldsToString(linkedFields)}`, debug);
|
|
131
|
+
linkedFields.forEach((field) => newRecordRemoveFieldOrSubfield8(record, field, currLinkingNumber, fix));
|
|
205
132
|
return;
|
|
206
133
|
}
|
|
207
|
-
|
|
134
|
+
nvdebug(`$8 DOUBLE REMOVAL OR VALIDATION: ADD2SEEN ${linkedFieldsAsString}`, debug);
|
|
208
135
|
seen[linkedFieldsAsString] = 1;
|
|
209
136
|
return;
|
|
210
137
|
});
|
|
211
|
-
|
|
212
|
-
/* eslint-enable */
|
|
213
138
|
}
|
|
214
139
|
function markIdenticalSubfield6Chains(chain, record) {
|
|
215
140
|
const normalizeOccurrenceNumber = true;
|
|
216
|
-
const normalizeTag = chain.some(field => field.tag.substring(0, 1) ===
|
|
217
|
-
const chainAsString =
|
|
218
|
-
|
|
219
|
-
record.fields.forEach(f => compareWithChain(f));
|
|
220
|
-
|
|
141
|
+
const normalizeTag = chain.some((field) => field.tag.substring(0, 1) === "1");
|
|
142
|
+
const chainAsString = fieldsToNormalizedString(chain, 0, normalizeOccurrenceNumber, normalizeTag);
|
|
143
|
+
nvdebug(`markIdenticalSubfield6Chains: ${chainAsString}`);
|
|
144
|
+
record.fields.forEach((f) => compareWithChain(f));
|
|
221
145
|
function compareWithChain(f) {
|
|
222
|
-
|
|
146
|
+
nvdebug(`FIELD2CHAIN ${fieldToString(f)}`);
|
|
223
147
|
const otherChain = fieldToChain(f, record);
|
|
224
|
-
// Not a lone field or chain (head) or ... or is-same-chain
|
|
225
148
|
if (otherChain.length === 0 || sameField(chain[0], otherChain[0])) {
|
|
226
149
|
return;
|
|
227
150
|
}
|
|
228
|
-
const otherChainAsString =
|
|
229
|
-
|
|
230
|
-
// Mark other chain as deleted:
|
|
151
|
+
const otherChainAsString = fieldsToNormalizedString(otherChain, 0, normalizeOccurrenceNumber, normalizeTag);
|
|
231
152
|
if (chainAsString === otherChainAsString) {
|
|
232
|
-
otherChain.forEach(
|
|
233
|
-
|
|
234
|
-
|
|
153
|
+
otherChain.forEach((f2) => {
|
|
154
|
+
nvdebug(` mark ${fieldToString(f2)} as deleted ($6-chain)...`);
|
|
155
|
+
f2.deleted = 1;
|
|
235
156
|
});
|
|
236
157
|
return;
|
|
237
158
|
}
|
|
@@ -241,81 +162,72 @@ function markIdenticalLoneFieldsAsDeletable(field, record) {
|
|
|
241
162
|
if (field.deleted) {
|
|
242
163
|
return;
|
|
243
164
|
}
|
|
244
|
-
|
|
245
|
-
const
|
|
246
|
-
const
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
// Mark fields as deleted:
|
|
250
|
-
identicalLoneFields.forEach(f => {
|
|
251
|
-
(0, _utils.nvdebug)(` mark ${(0, _utils.fieldToString)(f)} as deleted (lone field)...`);
|
|
165
|
+
const normalizeTag = field.tag.substring(0, 1) === "1";
|
|
166
|
+
const fieldAsString = fieldToNormalizedString(field, 0, false, normalizeTag);
|
|
167
|
+
const identicalLoneFields = record.fields.filter((f) => !sameField(f, field) && fieldToNormalizedString(f, 0, false, normalizeTag) === fieldAsString);
|
|
168
|
+
identicalLoneFields.forEach((f) => {
|
|
169
|
+
nvdebug(` mark ${fieldToString(f)} as deleted (lone field)...`);
|
|
252
170
|
f.deleted = 1;
|
|
253
171
|
});
|
|
254
172
|
}
|
|
255
173
|
function acceptFieldsWithSubfield6(fieldsWithSubfield6) {
|
|
256
|
-
|
|
257
|
-
const non880 = fieldsWithSubfield6.filter(f => f.tag !== '880');
|
|
174
|
+
const non880 = fieldsWithSubfield6.filter((f) => f.tag !== "880");
|
|
258
175
|
if (non880.length > 1) {
|
|
259
176
|
return false;
|
|
260
177
|
}
|
|
261
|
-
const occurrenceNumbers =
|
|
262
|
-
// Chain can contain only single occurrence number:
|
|
178
|
+
const occurrenceNumbers = fieldsGetOccurrenceNumbers(fieldsWithSubfield6);
|
|
263
179
|
if (occurrenceNumbers.length > 1) {
|
|
264
180
|
return false;
|
|
265
181
|
}
|
|
266
182
|
return true;
|
|
267
183
|
}
|
|
268
184
|
function isSingleTagLinkingNumber(linkingNumber, fields, tag) {
|
|
269
|
-
const relevantFields = fields.filter(f =>
|
|
270
|
-
if (relevantFields.some(f => f.tag !== tag)) {
|
|
185
|
+
const relevantFields = fields.filter((f) => fieldHasLinkingNumber(f, linkingNumber));
|
|
186
|
+
if (relevantFields.some((f) => f.tag !== tag)) {
|
|
271
187
|
return false;
|
|
272
188
|
}
|
|
273
189
|
return true;
|
|
274
190
|
}
|
|
275
191
|
function acceptFieldsWithSubfield8(fieldsWithSubfield8, requireSingleTag = false) {
|
|
276
|
-
const linkingNumbers =
|
|
277
|
-
if (linkingNumbers.some(linkingNumber => anomaly8(linkingNumber))) {
|
|
192
|
+
const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fieldsWithSubfield8);
|
|
193
|
+
if (linkingNumbers.some((linkingNumber) => anomaly8(linkingNumber))) {
|
|
278
194
|
return false;
|
|
279
195
|
}
|
|
280
196
|
return true;
|
|
281
|
-
|
|
282
|
-
// If linking number
|
|
283
197
|
function anomaly8(linkingNumber) {
|
|
284
|
-
|
|
285
|
-
const relevantFields = fieldsWithSubfield8.filter(f =>
|
|
198
|
+
nvdebug(` Looking for anomalies in linkin number ${linkingNumber}`);
|
|
199
|
+
const relevantFields = fieldsWithSubfield8.filter((f) => fieldHasLinkingNumber(f, linkingNumber));
|
|
286
200
|
if (requireSingleTag) {
|
|
287
201
|
return !isSingleTagLinkingNumber(linkingNumber, relevantFields, relevantFields[0].tag);
|
|
288
202
|
}
|
|
289
|
-
const f880 = relevantFields.filter(f => f.tag ===
|
|
203
|
+
const f880 = relevantFields.filter((f) => f.tag === "880");
|
|
290
204
|
if (f880.length === 0 || f880.length === relevantFields.length) {
|
|
291
205
|
return false;
|
|
292
206
|
}
|
|
293
207
|
return true;
|
|
294
208
|
}
|
|
295
209
|
}
|
|
296
|
-
function sameField(field1, field2) {
|
|
210
|
+
export function sameField(field1, field2) {
|
|
297
211
|
field1.tmpMyId = 666;
|
|
298
212
|
const result = field2.tmpMyId === 666 ? true : false;
|
|
299
213
|
delete field1.tmpMyId;
|
|
300
214
|
return result;
|
|
301
215
|
}
|
|
302
|
-
function isChainHead(field, chain) {
|
|
216
|
+
export function isChainHead(field, chain) {
|
|
303
217
|
return sameField(field, chain[0]);
|
|
304
218
|
}
|
|
305
|
-
function fieldToChain(field, record) {
|
|
219
|
+
export function fieldToChain(field, record) {
|
|
306
220
|
if (field.deleted || !field.subfields) {
|
|
307
221
|
return [];
|
|
308
222
|
}
|
|
309
223
|
const chain = newGetAllLinkedFields(field, record, true, true);
|
|
310
|
-
|
|
224
|
+
nvdebug(` Chain contains ${chain.length} field(s)`);
|
|
311
225
|
if (!isChainHead(field, chain)) {
|
|
312
|
-
// newGetAllLinkedFields() marks relevant record.fields!
|
|
313
226
|
return [];
|
|
314
227
|
}
|
|
315
|
-
const fieldsWithSubfield6 = chain.filter(f =>
|
|
316
|
-
// Hack: multiple $6 fields, but either all are non-880 or all are 880: treat field as a single entry
|
|
228
|
+
const fieldsWithSubfield6 = chain.filter((f) => fieldHasValidSubfield6(f));
|
|
317
229
|
if (fieldsWithSubfield6.length > 0) {
|
|
318
|
-
const non880 = fieldsWithSubfield6.filter(f => f.tag !==
|
|
230
|
+
const non880 = fieldsWithSubfield6.filter((f) => f.tag !== "880");
|
|
319
231
|
if (non880.length === 0 || non880.length === fieldsWithSubfield6.length) {
|
|
320
232
|
return [field];
|
|
321
233
|
}
|
|
@@ -324,74 +236,62 @@ function fieldToChain(field, record) {
|
|
|
324
236
|
}
|
|
325
237
|
}
|
|
326
238
|
if (!acceptFieldsWithSubfield6(fieldsWithSubfield6)) {
|
|
327
|
-
// Check tag subfield $6s are legal(ish)
|
|
328
239
|
return [];
|
|
329
240
|
}
|
|
330
|
-
const fieldsWithSubfield8 = chain.filter(f =>
|
|
241
|
+
const fieldsWithSubfield8 = chain.filter((f) => fieldHasValidSubfield8(f));
|
|
331
242
|
if (!acceptFieldsWithSubfield8(fieldsWithSubfield8, false)) {
|
|
332
243
|
return [];
|
|
333
244
|
}
|
|
334
|
-
|
|
335
|
-
//nvdebug(`Proceed with ${fieldsToString(chain)}`);
|
|
336
|
-
|
|
337
245
|
return chain;
|
|
338
246
|
}
|
|
339
247
|
function fieldHandleDuplicateDatafields(field, record) {
|
|
340
248
|
const chain = fieldToChain(field, record);
|
|
341
|
-
|
|
249
|
+
nvdebug(` TRY TO HANDLE DUPLICATES OF '${fieldsToString(chain)}'`);
|
|
342
250
|
if (chain.length === 0) {
|
|
343
251
|
return;
|
|
344
252
|
}
|
|
345
|
-
const fieldsWithSubfield6 = chain.filter(f =>
|
|
346
|
-
const fieldsWithSubfield8 = chain.filter(f =>
|
|
347
|
-
|
|
348
|
-
// Lone fields:
|
|
253
|
+
const fieldsWithSubfield6 = chain.filter((f) => fieldHasValidSubfield6(f));
|
|
254
|
+
const fieldsWithSubfield8 = chain.filter((f) => fieldHasValidSubfield8(f));
|
|
349
255
|
if (chain.length === 1) {
|
|
350
256
|
markIdenticalLoneFieldsAsDeletable(chain[0], record);
|
|
351
257
|
return;
|
|
352
258
|
}
|
|
353
259
|
if (fieldsWithSubfield6.length === 0) {
|
|
354
260
|
if (fieldsWithSubfield8.length === 0) {
|
|
355
|
-
|
|
356
|
-
(0, _utils.nvdebug)(` Trying to find duplicates of single field '${(0, _utils.fieldToString)(chain[0])}'`);
|
|
261
|
+
nvdebug(` Trying to find duplicates of single field '${fieldToString(chain[0])}'`);
|
|
357
262
|
markIdenticalLoneFieldsAsDeletable(chain[0], record);
|
|
358
263
|
return;
|
|
359
264
|
}
|
|
360
|
-
const linkingNumbers =
|
|
265
|
+
const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fieldsWithSubfield8);
|
|
361
266
|
if (linkingNumbers.length < 2) {
|
|
362
267
|
markIdenticalSubfield6Chains(chain, record);
|
|
363
268
|
return;
|
|
364
269
|
}
|
|
365
270
|
}
|
|
366
271
|
if (fieldsWithSubfield6.length > 0 && acceptFieldsWithSubfield8(fieldsWithSubfield8, true)) {
|
|
367
|
-
// Checks that non-880 tags are all same
|
|
368
|
-
// Chain is removable
|
|
369
272
|
markIdenticalSubfield6Chains(chain, record);
|
|
370
273
|
return;
|
|
371
274
|
}
|
|
372
|
-
|
|
373
|
-
|
|
275
|
+
nvdebug(` NO HANDLER FOUND FOR '${fieldsToString(chain)}'`);
|
|
276
|
+
nvdebug(` N8s: ${fieldsWithSubfield6.length}`);
|
|
374
277
|
}
|
|
375
|
-
function removeDuplicateDatafields(record, fix = true) {
|
|
376
|
-
// Sometimes only $8 subfield (vs the whole field) is removed. Thus they are handled separately:
|
|
278
|
+
export function removeDuplicateDatafields(record, fix = true) {
|
|
377
279
|
handleDuplicateSubfield8Chains(record, fix);
|
|
378
|
-
const dataFields = record.fields.filter(f => f.subfields !==
|
|
379
|
-
dataFields.forEach(f => fieldHandleDuplicateDatafields(f, record));
|
|
380
|
-
|
|
381
|
-
const
|
|
382
|
-
const
|
|
383
|
-
const result = deletableFields.map(f => `DEL: ${(0, _utils.fieldToString)(f)}`);
|
|
280
|
+
const dataFields = record.fields.filter((f) => f.subfields !== void 0);
|
|
281
|
+
dataFields.forEach((f) => fieldHandleDuplicateDatafields(f, record));
|
|
282
|
+
const deletableFields = dataFields.filter((f) => f.deleted);
|
|
283
|
+
const modifiedFields = dataFields.filter((f) => f.modified && !f.deleted);
|
|
284
|
+
const result = deletableFields.map((f) => `DEL: ${fieldToString(f)}`);
|
|
384
285
|
if (modifiedFields.length) {
|
|
385
|
-
modifiedFields.forEach(f => delete f.modified);
|
|
386
|
-
result.push(modifiedFields.map(f => `MOD: ${
|
|
286
|
+
modifiedFields.forEach((f) => delete f.modified);
|
|
287
|
+
result.push(modifiedFields.map((f) => `MOD: ${fieldToString(f)}`));
|
|
387
288
|
}
|
|
388
289
|
if (fix) {
|
|
389
|
-
deletableFields.forEach(f => record.removeField(f));
|
|
290
|
+
deletableFields.forEach((f) => record.removeField(f));
|
|
390
291
|
return result;
|
|
391
292
|
}
|
|
392
|
-
deletableFields.forEach(f => delete f.deleted);
|
|
393
|
-
deletableFields.forEach(f => delete f.modified);
|
|
394
|
-
|
|
293
|
+
deletableFields.forEach((f) => delete f.deleted);
|
|
294
|
+
deletableFields.forEach((f) => delete f.modified);
|
|
395
295
|
return result;
|
|
396
296
|
}
|
|
397
|
-
//# sourceMappingURL=removeDuplicateDataFields.js.map
|
|
297
|
+
//# sourceMappingURL=removeDuplicateDataFields.js.map
|