@natlibfi/marc-record-validators-melinda 11.6.7-alpha.1 → 12.0.0-alpha.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.
- 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/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
package/src/punctuation2.js
CHANGED
|
@@ -9,10 +9,10 @@
|
|
|
9
9
|
* NOTE #3: As of 2023-06-05 control subfields ($0...$9) are obsolete. Don't use them in rules.
|
|
10
10
|
* (They are jumped over when looking for next (non-controlfield subfield)
|
|
11
11
|
*/
|
|
12
|
-
import {validateSingleField} from './ending-punctuation';
|
|
13
|
-
import {fieldGetUnambiguousTag} from './subfield6Utils';
|
|
12
|
+
import {validateSingleField} from './ending-punctuation.js';
|
|
13
|
+
import {fieldGetUnambiguousTag} from './subfield6Utils.js';
|
|
14
14
|
//import createDebugLogger from 'debug';
|
|
15
|
-
import {fieldToString, nvdebug} from './utils';
|
|
15
|
+
import {fieldToString, nvdebug} from './utils.js';
|
|
16
16
|
import clone from 'clone';
|
|
17
17
|
|
|
18
18
|
//const debug = createDebugLogger('debug/punctuation2');
|
|
@@ -27,7 +27,7 @@ export default function () {
|
|
|
27
27
|
function fix(record) {
|
|
28
28
|
nvdebug(`${descriptionString}: fixer`);
|
|
29
29
|
const res = {message: [], fix: [], valid: true};
|
|
30
|
-
record.fields.forEach(f => fieldFixPunctuation(f));
|
|
30
|
+
record.fields.forEach(f => fieldFixPunctuation(f));
|
|
31
31
|
return res;
|
|
32
32
|
}
|
|
33
33
|
|
|
@@ -1,20 +1,22 @@
|
|
|
1
|
-
import
|
|
1
|
+
import assert from 'node:assert';
|
|
2
2
|
import {MarcRecord} from '@natlibfi/marc-record';
|
|
3
|
-
import validatorFactory from '
|
|
3
|
+
import validatorFactory from '../src/punctuation2.js';
|
|
4
4
|
import {READERS} from '@natlibfi/fixura';
|
|
5
5
|
import generateTests from '@natlibfi/fixugen';
|
|
6
6
|
import createDebugLogger from 'debug';
|
|
7
7
|
|
|
8
8
|
generateTests({
|
|
9
9
|
callback,
|
|
10
|
-
path: [
|
|
10
|
+
path: [import.meta.dirname, '..', 'test-fixtures', 'punctuation2'],
|
|
11
11
|
useMetadataFile: true,
|
|
12
12
|
recurse: false,
|
|
13
13
|
fixura: {
|
|
14
14
|
reader: READERS.JSON
|
|
15
15
|
},
|
|
16
|
-
|
|
17
|
-
before: () =>
|
|
16
|
+
hooks: {
|
|
17
|
+
before: async () => {
|
|
18
|
+
testValidatorFactory();
|
|
19
|
+
}
|
|
18
20
|
}
|
|
19
21
|
});
|
|
20
22
|
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation2:test');
|
|
@@ -22,12 +24,9 @@ const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctu
|
|
|
22
24
|
async function testValidatorFactory() {
|
|
23
25
|
const validator = await validatorFactory();
|
|
24
26
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
expect(validator.description).to.be.a('string');
|
|
30
|
-
expect(validator.validate).to.be.a('function');
|
|
27
|
+
assert.equal(typeof validator, 'object');
|
|
28
|
+
assert.equal(typeof validator.description, 'string');
|
|
29
|
+
assert.equal(typeof validator.validate, 'function');
|
|
31
30
|
}
|
|
32
31
|
|
|
33
32
|
async function callback({getFixture, enabled = true, fix = false}) {
|
|
@@ -43,10 +42,10 @@ async function callback({getFixture, enabled = true, fix = false}) {
|
|
|
43
42
|
|
|
44
43
|
if (!fix) {
|
|
45
44
|
const result = await validator.validate(record);
|
|
46
|
-
|
|
45
|
+
assert.deepEqual(result, expectedResult);
|
|
47
46
|
return;
|
|
48
47
|
}
|
|
49
48
|
|
|
50
49
|
await validator.fix(record);
|
|
51
|
-
|
|
50
|
+
assert.deepEqual(record, expectedResult);
|
|
52
51
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import createDebugLogger from 'debug';
|
|
2
|
-
import {fieldHasSubfield, fieldToString, nvdebug} from './utils';
|
|
2
|
+
import {fieldHasSubfield, fieldToString, nvdebug} from './utils.js';
|
|
3
3
|
import {fieldGetOccurrenceNumberPairs, fieldGetUnambiguousOccurrenceNumber, fieldResetOccurrenceNumber, intToOccurrenceNumberString, isValidSubfield6,
|
|
4
4
|
recordGetMaxSubfield6OccurrenceNumberAsInteger,
|
|
5
|
-
subfield6GetOccurrenceNumber, subfield6GetOccurrenceNumberAsInteger, subfield6ResetOccurrenceNumber} from './subfield6Utils';
|
|
5
|
+
subfield6GetOccurrenceNumber, subfield6GetOccurrenceNumberAsInteger, subfield6ResetOccurrenceNumber} from './subfield6Utils.js';
|
|
6
6
|
|
|
7
7
|
// Relocated from melinda-marc-record-merge-reducers (and renamed)
|
|
8
8
|
|
|
@@ -91,7 +91,7 @@ function recordDisambiguateSharedSubfield6OccurrenceNumbers(record) {
|
|
|
91
91
|
return;
|
|
92
92
|
}
|
|
93
93
|
nvdebug(`Disambiguate occurrence numbers (N=${sharedOccurrenceNumberFields.length}) in...`, debug);
|
|
94
|
-
sharedOccurrenceNumberFields.forEach(field => disambiguateOccurrenceNumber(field));
|
|
94
|
+
sharedOccurrenceNumberFields.forEach(field => disambiguateOccurrenceNumber(field));
|
|
95
95
|
|
|
96
96
|
function disambiguateable(field) {
|
|
97
97
|
if (field.tag === '880') { // Not needed, already filtered...
|
|
@@ -131,7 +131,7 @@ function recordDisambiguateSharedSubfield6OccurrenceNumbers(record) {
|
|
|
131
131
|
nvdebug(` Reindex '${fieldToString(field)}' occurrence number and it's ${pairedFields.length} pair(s) using '${newOccurrenceNumber}'`, debug);
|
|
132
132
|
|
|
133
133
|
fieldResetOccurrenceNumber(field, newOccurrenceNumber, occurrenceNumber);
|
|
134
|
-
pairedFields.forEach(pairedField => fieldResetOccurrenceNumber(pairedField, newOccurrenceNumber, occurrenceNumber));
|
|
134
|
+
pairedFields.forEach(pairedField => fieldResetOccurrenceNumber(pairedField, newOccurrenceNumber, occurrenceNumber));
|
|
135
135
|
|
|
136
136
|
}
|
|
137
137
|
|
|
@@ -139,7 +139,6 @@ function recordDisambiguateSharedSubfield6OccurrenceNumbers(record) {
|
|
|
139
139
|
}
|
|
140
140
|
function recordGetNumberOfUniqueSubfield6OccurrenceNumbers(record) {
|
|
141
141
|
// Calculates the number of used different occurrence numbers
|
|
142
|
-
/* eslint-disable */
|
|
143
142
|
let indexArray = [];
|
|
144
143
|
record.fields.forEach(field => gatherFieldData(field));
|
|
145
144
|
|
|
@@ -161,8 +160,7 @@ function recordGetNumberOfUniqueSubfield6OccurrenceNumbers(record) {
|
|
|
161
160
|
indexArray[i] = 1;
|
|
162
161
|
}
|
|
163
162
|
let n = 0;
|
|
164
|
-
indexArray.forEach(elem => n+= elem);
|
|
165
|
-
/* eslint-enable */
|
|
163
|
+
indexArray.forEach(elem => n+= elem);
|
|
166
164
|
return n;
|
|
167
165
|
}
|
|
168
166
|
|
package/src/{reindexSubfield6OccurenceNumbers.spec.js → reindexSubfield6OccurenceNumbers.test.js}
RENAMED
|
@@ -1,20 +1,22 @@
|
|
|
1
|
-
import
|
|
1
|
+
import assert from 'node:assert';
|
|
2
2
|
import {MarcRecord} from '@natlibfi/marc-record';
|
|
3
|
-
import validatorFactory from './reindexSubfield6OccurenceNumbers';
|
|
3
|
+
import validatorFactory from './reindexSubfield6OccurenceNumbers.js';
|
|
4
4
|
import {READERS} from '@natlibfi/fixura';
|
|
5
5
|
import generateTests from '@natlibfi/fixugen';
|
|
6
6
|
import createDebugLogger from 'debug';
|
|
7
7
|
|
|
8
8
|
generateTests({
|
|
9
9
|
callback,
|
|
10
|
-
path: [
|
|
10
|
+
path: [import.meta.dirname, '..', 'test-fixtures', 'reindex-sf6-occurence-numbers'],
|
|
11
11
|
useMetadataFile: true,
|
|
12
12
|
recurse: false,
|
|
13
13
|
fixura: {
|
|
14
14
|
reader: READERS.JSON
|
|
15
15
|
},
|
|
16
|
-
|
|
17
|
-
before: () =>
|
|
16
|
+
hooks: {
|
|
17
|
+
before: async () => {
|
|
18
|
+
testValidatorFactory();
|
|
19
|
+
}
|
|
18
20
|
}
|
|
19
21
|
});
|
|
20
22
|
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/reindexSubfield6OccurrenceNumbers:test');
|
|
@@ -22,12 +24,9 @@ const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/reinde
|
|
|
22
24
|
async function testValidatorFactory() {
|
|
23
25
|
const validator = await validatorFactory();
|
|
24
26
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
expect(validator.description).to.be.a('string');
|
|
30
|
-
expect(validator.validate).to.be.a('function');
|
|
27
|
+
assert.equal(typeof validator, 'object');
|
|
28
|
+
assert.equal(typeof validator.description, 'string');
|
|
29
|
+
assert.equal(typeof validator.validate, 'function');
|
|
31
30
|
}
|
|
32
31
|
|
|
33
32
|
async function callback({getFixture, enabled = true, fix = false}) {
|
|
@@ -43,10 +42,10 @@ async function callback({getFixture, enabled = true, fix = false}) {
|
|
|
43
42
|
|
|
44
43
|
if (!fix) {
|
|
45
44
|
const result = await validator.validate(record);
|
|
46
|
-
|
|
45
|
+
assert.deepEqual(result, expectedResult);
|
|
47
46
|
return;
|
|
48
47
|
}
|
|
49
48
|
|
|
50
49
|
await validator.fix(record);
|
|
51
|
-
|
|
50
|
+
assert.deepEqual(record, expectedResult);
|
|
52
51
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import createDebugLogger from 'debug';
|
|
2
|
-
import {fieldsToString, fieldToString, nvdebug} from './utils';
|
|
3
|
-
import {fieldHasValidSubfield6, fieldsGetOccurrenceNumbers, fieldsToNormalizedString, fieldToNormalizedString, get6s} from './subfield6Utils';
|
|
4
|
-
import {add8s, fieldHasLinkingNumber, fieldHasValidSubfield8, fieldsGetAllSubfield8LinkingNumbers, getSubfield8LinkingNumber, recordGetAllSubfield8LinkingNumbers, recordGetFieldsWithSubfield8LinkingNumber} from './subfield8Utils';
|
|
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';
|
|
5
5
|
|
|
6
6
|
const LINK_ROOT = 4;
|
|
7
7
|
const LINKED_AND_PROCESSED = 2;
|
|
@@ -56,14 +56,13 @@ function numberOfLinkageSubfields(field) {
|
|
|
56
56
|
*/
|
|
57
57
|
|
|
58
58
|
function removeLinkNotes(record) {
|
|
59
|
-
record.fields.forEach(f => delete f.linkNote);
|
|
59
|
+
record.fields.forEach(f => delete f.linkNote);
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
|
|
63
63
|
function newGetAllLinkedFields(field, record, useSixes = true, useEights = true) {
|
|
64
64
|
removeLinkNotes(record); // should be clear, but let's play safe
|
|
65
65
|
|
|
66
|
-
/* eslint-disable */
|
|
67
66
|
field.linkNote = LINK_ROOT;
|
|
68
67
|
|
|
69
68
|
let currField = field;
|
|
@@ -97,8 +96,6 @@ function newGetAllLinkedFields(field, record, useSixes = true, useEights = true)
|
|
|
97
96
|
}
|
|
98
97
|
}
|
|
99
98
|
|
|
100
|
-
|
|
101
|
-
/* eslint-enable */
|
|
102
99
|
}
|
|
103
100
|
|
|
104
101
|
|
|
@@ -109,7 +106,7 @@ function recordRemoveFieldOrSubfield8(record, field, currLinkingNumber) {
|
|
|
109
106
|
return;
|
|
110
107
|
}
|
|
111
108
|
const subfields = field.subfields.filter(sf => getSubfield8LinkingNumber(sf) === currLinkingNumber);
|
|
112
|
-
subfields.forEach(sf => record.removeSubfield(sf, field));
|
|
109
|
+
subfields.forEach(sf => record.removeSubfield(sf, field));
|
|
113
110
|
}
|
|
114
111
|
|
|
115
112
|
function newRecordRemoveFieldOrSubfield8(record, field, currLinkingNumber, fix) {
|
|
@@ -138,7 +135,6 @@ export function removeDuplicateSubfield8Chains(record, fix = true) {
|
|
|
138
135
|
// 1 100
|
|
139
136
|
// Given these stats, there's no need to check for 1XX-vs-7XX removals
|
|
140
137
|
|
|
141
|
-
/* eslint-disable */
|
|
142
138
|
let seen = {};
|
|
143
139
|
|
|
144
140
|
let removables = []; // for validation
|
|
@@ -178,7 +174,6 @@ export function removeDuplicateSubfield8Chains(record, fix = true) {
|
|
|
178
174
|
return;
|
|
179
175
|
});
|
|
180
176
|
|
|
181
|
-
/* eslint-enable */
|
|
182
177
|
return removables;
|
|
183
178
|
}
|
|
184
179
|
|
|
@@ -193,7 +188,6 @@ export function handleDuplicateSubfield8Chains(record, fix) {
|
|
|
193
188
|
// 1 100
|
|
194
189
|
// Given these stats, there's no need to check for 1XX-vs-7XX removals
|
|
195
190
|
|
|
196
|
-
/* eslint-disable */
|
|
197
191
|
let seen = {};
|
|
198
192
|
|
|
199
193
|
nvdebug("CHAIN-8");
|
|
@@ -222,8 +216,6 @@ export function handleDuplicateSubfield8Chains(record, fix) {
|
|
|
222
216
|
return;
|
|
223
217
|
});
|
|
224
218
|
|
|
225
|
-
/* eslint-enable */
|
|
226
|
-
|
|
227
219
|
}
|
|
228
220
|
|
|
229
221
|
function markIdenticalSubfield6Chains(chain, record) {
|
|
@@ -232,7 +224,7 @@ function markIdenticalSubfield6Chains(chain, record) {
|
|
|
232
224
|
const chainAsString = fieldsToNormalizedString(chain, 0, normalizeOccurrenceNumber, normalizeTag);
|
|
233
225
|
|
|
234
226
|
nvdebug(`markIdenticalSubfield6Chains: ${chainAsString}`);
|
|
235
|
-
record.fields.forEach(f => compareWithChain(f));
|
|
227
|
+
record.fields.forEach(f => compareWithChain(f));
|
|
236
228
|
|
|
237
229
|
|
|
238
230
|
function compareWithChain(f) {
|
|
@@ -421,24 +413,24 @@ export function removeDuplicateDatafields(record, fix = true) {
|
|
|
421
413
|
|
|
422
414
|
const dataFields = record.fields.filter(f => f.subfields !== undefined);
|
|
423
415
|
|
|
424
|
-
dataFields.forEach(f => fieldHandleDuplicateDatafields(f, record));
|
|
416
|
+
dataFields.forEach(f => fieldHandleDuplicateDatafields(f, record));
|
|
425
417
|
|
|
426
418
|
const deletableFields = dataFields.filter(f => f.deleted);
|
|
427
419
|
const modifiedFields = dataFields.filter(f => f.modified && !f.deleted);
|
|
428
420
|
|
|
429
421
|
const result = deletableFields.map(f => `DEL: ${fieldToString(f)}`);
|
|
430
422
|
if (modifiedFields.length) {
|
|
431
|
-
modifiedFields.forEach(f => delete f.modified);
|
|
423
|
+
modifiedFields.forEach(f => delete f.modified);
|
|
432
424
|
result.push(modifiedFields.map(f => `MOD: ${fieldToString(f)}`));
|
|
433
425
|
}
|
|
434
426
|
|
|
435
427
|
if (fix) {
|
|
436
|
-
deletableFields.forEach(f => record.removeField(f));
|
|
428
|
+
deletableFields.forEach(f => record.removeField(f));
|
|
437
429
|
return result;
|
|
438
430
|
}
|
|
439
431
|
|
|
440
|
-
deletableFields.forEach(f => delete f.deleted);
|
|
441
|
-
deletableFields.forEach(f => delete f.modified);
|
|
432
|
+
deletableFields.forEach(f => delete f.deleted);
|
|
433
|
+
deletableFields.forEach(f => delete f.modified);
|
|
442
434
|
|
|
443
435
|
|
|
444
436
|
return result;
|
|
@@ -1,20 +1,22 @@
|
|
|
1
|
-
import
|
|
1
|
+
import assert from 'node:assert';
|
|
2
2
|
import {MarcRecord} from '@natlibfi/marc-record';
|
|
3
|
-
import validatorFactory from '
|
|
3
|
+
import validatorFactory from '../src/removeDuplicateDataFields.js';
|
|
4
4
|
import {READERS} from '@natlibfi/fixura';
|
|
5
5
|
import generateTests from '@natlibfi/fixugen';
|
|
6
6
|
import createDebugLogger from 'debug';
|
|
7
7
|
|
|
8
8
|
generateTests({
|
|
9
9
|
callback,
|
|
10
|
-
path: [
|
|
10
|
+
path: [import.meta.dirname, '..', 'test-fixtures', 'remove-duplicate-datafields'],
|
|
11
11
|
useMetadataFile: true,
|
|
12
12
|
recurse: false,
|
|
13
13
|
fixura: {
|
|
14
14
|
reader: READERS.JSON
|
|
15
15
|
},
|
|
16
|
-
|
|
17
|
-
before: () =>
|
|
16
|
+
hooks: {
|
|
17
|
+
before: async () => {
|
|
18
|
+
testValidatorFactory();
|
|
19
|
+
}
|
|
18
20
|
}
|
|
19
21
|
});
|
|
20
22
|
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/removeDuplicateDataFields:test');
|
|
@@ -22,12 +24,9 @@ const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/remove
|
|
|
22
24
|
async function testValidatorFactory() {
|
|
23
25
|
const validator = await validatorFactory();
|
|
24
26
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
expect(validator.description).to.be.a('string');
|
|
30
|
-
expect(validator.validate).to.be.a('function');
|
|
27
|
+
assert.equal(typeof validator, 'object');
|
|
28
|
+
assert.equal(typeof validator.description, 'string');
|
|
29
|
+
assert.equal(typeof validator.validate, 'function');
|
|
31
30
|
}
|
|
32
31
|
|
|
33
32
|
async function callback({getFixture, enabled = true, fix = false}) {
|
|
@@ -43,10 +42,10 @@ async function callback({getFixture, enabled = true, fix = false}) {
|
|
|
43
42
|
|
|
44
43
|
if (!fix) {
|
|
45
44
|
const result = await validator.validate(record);
|
|
46
|
-
|
|
45
|
+
assert.deepEqual(result, expectedResult);
|
|
47
46
|
return;
|
|
48
47
|
}
|
|
49
48
|
|
|
50
49
|
await validator.fix(record);
|
|
51
|
-
|
|
50
|
+
assert.deepEqual(record, expectedResult);
|
|
52
51
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import createDebugLogger from 'debug';
|
|
2
|
-
import {fieldToChain, sameField} from './removeDuplicateDataFields';
|
|
3
|
-
import {fieldGetOccurrenceNumberPairs, fieldHasValidSubfield6, fieldSevenToOneOccurrenceNumber, fieldsToNormalizedString} from './subfield6Utils';
|
|
4
|
-
import {fieldHasSubfield, fieldsToString, fieldToString, nvdebug, uniqArray} from './utils';
|
|
5
|
-
import {fieldHasValidSubfield8} from './subfield8Utils';
|
|
6
|
-
import {encodingLevelIsBetterThanPrepublication, fieldRefersToKoneellisestiTuotettuTietue, getEncodingLevel} from './prepublicationUtils';
|
|
7
|
-
import {cloneAndNormalizeFieldForComparison} from './normalizeFieldForComparison';
|
|
8
|
-
import {fixComposition, precomposeFinnishLetters} from './normalize-utf8-diacritics';
|
|
2
|
+
import {fieldToChain, sameField} from './removeDuplicateDataFields.js';
|
|
3
|
+
import {fieldGetOccurrenceNumberPairs, fieldHasValidSubfield6, fieldSevenToOneOccurrenceNumber, fieldsToNormalizedString} from './subfield6Utils.js';
|
|
4
|
+
import {fieldHasSubfield, fieldsToString, fieldToString, nvdebug, uniqArray} from './utils.js';
|
|
5
|
+
import {fieldHasValidSubfield8} from './subfield8Utils.js';
|
|
6
|
+
import {encodingLevelIsBetterThanPrepublication, fieldRefersToKoneellisestiTuotettuTietue, getEncodingLevel} from './prepublicationUtils.js';
|
|
7
|
+
import {cloneAndNormalizeFieldForComparison} from './normalizeFieldForComparison.js';
|
|
8
|
+
import {fixComposition, precomposeFinnishLetters} from './normalize-utf8-diacritics.js';
|
|
9
9
|
|
|
10
10
|
// Relocated from melinda-marc-record-merge-reducers (and renamed)
|
|
11
11
|
|
|
@@ -46,7 +46,7 @@ function deriveInferiorChains(fields, record) {
|
|
|
46
46
|
//nvdebug(`======= GOT ${fields.length} FIELDS TO CHAINIFY`);
|
|
47
47
|
const hash = {};
|
|
48
48
|
|
|
49
|
-
fields.forEach(f => fieldToChainToDeletables(f));
|
|
49
|
+
fields.forEach(f => fieldToChainToDeletables(f));
|
|
50
50
|
|
|
51
51
|
return hash;
|
|
52
52
|
|
|
@@ -151,14 +151,14 @@ export function removeInferiorChains(record, fix = true) {
|
|
|
151
151
|
|
|
152
152
|
// If the inferior (deletable) chain is 1XX-based, convert the triggering better chain from 7XX to 1XX:
|
|
153
153
|
if (chainContains1XX(chain)) {
|
|
154
|
-
triggeringChain.forEach(f => sevenToOne(f, triggeringChain));
|
|
154
|
+
triggeringChain.forEach(f => sevenToOne(f, triggeringChain));
|
|
155
155
|
}
|
|
156
156
|
//nvdebug(`iRIS6C: ${chainAsString}`);
|
|
157
157
|
const deletedString = fieldsToString(chain);
|
|
158
158
|
const message = `DEL: '${deletedString}' REASON: '${fieldsToString(triggeringChain)}'`;
|
|
159
159
|
if (fix) {
|
|
160
160
|
//nvdebug(`INFERIOR $6 CHAIN REMOVAL: ${message}}`, debug);
|
|
161
|
-
chain.forEach(field => record.removeField(field));
|
|
161
|
+
chain.forEach(field => record.removeField(field));
|
|
162
162
|
}
|
|
163
163
|
return innerRemoveInferiorChains(remainingFields, [...deletedStringsArray, message]);
|
|
164
164
|
}
|
|
@@ -176,7 +176,7 @@ export function removeInferiorChains(record, fix = true) {
|
|
|
176
176
|
const pairs = fieldGetOccurrenceNumberPairs(field, chain);
|
|
177
177
|
field.tag = `1${field.tag.substring(1)}`;
|
|
178
178
|
// There should always be one pair, but I'm not sanity-checking this
|
|
179
|
-
pairs.forEach(pairedField => fieldSevenToOneOccurrenceNumber(pairedField));
|
|
179
|
+
pairs.forEach(pairedField => fieldSevenToOneOccurrenceNumber(pairedField));
|
|
180
180
|
}
|
|
181
181
|
|
|
182
182
|
}
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
import
|
|
1
|
+
import assert from 'node:assert';
|
|
2
2
|
import {MarcRecord} from '@natlibfi/marc-record';
|
|
3
|
-
import validatorFactory from './removeInferiorDataFields';
|
|
3
|
+
import validatorFactory from './removeInferiorDataFields.js';
|
|
4
4
|
import {READERS} from '@natlibfi/fixura';
|
|
5
5
|
import generateTests from '@natlibfi/fixugen';
|
|
6
6
|
import createDebugLogger from 'debug';
|
|
7
7
|
|
|
8
8
|
generateTests({
|
|
9
9
|
callback,
|
|
10
|
-
path: [
|
|
10
|
+
path: [import.meta.dirname, '..', 'test-fixtures', 'remove-inferior-datafields'],
|
|
11
11
|
useMetadataFile: true,
|
|
12
12
|
recurse: false,
|
|
13
13
|
fixura: {
|
|
14
14
|
reader: READERS.JSON
|
|
15
15
|
},
|
|
16
|
-
|
|
17
|
-
before: () =>
|
|
16
|
+
hooks: {
|
|
17
|
+
before: async () => {
|
|
18
|
+
testValidatorFactory();
|
|
19
|
+
}
|
|
18
20
|
}
|
|
19
21
|
});
|
|
22
|
+
|
|
20
23
|
const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/removeInferiorDataFields:test');
|
|
21
24
|
|
|
22
25
|
async function testValidatorFactory() {
|
|
23
26
|
const validator = await validatorFactory();
|
|
24
27
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
expect(validator.description).to.be.a('string');
|
|
30
|
-
expect(validator.validate).to.be.a('function');
|
|
28
|
+
assert.equal(typeof validator, 'object');
|
|
29
|
+
assert.equal(typeof validator.description, 'string');
|
|
30
|
+
assert.equal(typeof validator.validate).to.be.a('function');
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
async function callback({getFixture, enabled = true, fix = false}) {
|
|
@@ -43,10 +43,10 @@ async function callback({getFixture, enabled = true, fix = false}) {
|
|
|
43
43
|
|
|
44
44
|
if (!fix) {
|
|
45
45
|
const result = await validator.validate(record);
|
|
46
|
-
|
|
46
|
+
assert.deepEqual(result, expectedResult);
|
|
47
47
|
return;
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
await validator.fix(record);
|
|
51
|
-
|
|
51
|
+
assert.deepEqual(record, expectedResult);
|
|
52
52
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import {parseString} from 'xml2js';
|
|
2
|
-
import fetch from 'node-fetch';
|
|
2
|
+
//import fetch from 'node-fetch';
|
|
3
3
|
|
|
4
4
|
export default function ({endpoint, prefixPattern, fields}) {
|
|
5
5
|
if (typeof endpoint === 'string' && prefixPattern instanceof RegExp && typeof fields === 'object') {
|
package/src/{resolvable-ext-references-melinda.spec.js → resolvable-ext-references-melinda.test.js}
RENAMED
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
//import chai from 'chai';
|
|
3
|
+
//import chaiAsPromised from 'chai-as-promised';
|
|
3
4
|
import {MarcRecord} from '@natlibfi/marc-record';
|
|
4
5
|
import fetchMock from 'fetch-mock';
|
|
5
|
-
import * as testContext from '../src/resolvable-ext-references-melinda';
|
|
6
|
-
import {fixture5000, fixture9550, fixture1000} from '../test-fixtures/resolvable-ext-references-melinda';
|
|
6
|
+
import * as testContext from '../src/resolvable-ext-references-melinda.js';
|
|
7
|
+
import {fixture5000, fixture9550, fixture1000} from '../test-fixtures/resolvable-ext-references-melinda.js';
|
|
8
|
+
import {afterEach, beforeEach, describe, it} from 'node:test';
|
|
7
9
|
|
|
8
|
-
const {expect} = chai;
|
|
9
|
-
chai.use(chaiAsPromised);
|
|
10
|
+
//const {expect} = chai;
|
|
11
|
+
//chai.use(chaiAsPromised);
|
|
10
12
|
|
|
11
13
|
const endpoint = 'http://melinda.kansalliskirjasto.fi:210/fin01';
|
|
12
14
|
const queryParam = '?operation=searchRetrieve&maximumRecords=2&version=1&query=rec.id=';
|
|
@@ -16,35 +18,48 @@ const fields = {
|
|
|
16
18
|
833: ['w', 'p']
|
|
17
19
|
};
|
|
18
20
|
|
|
21
|
+
|
|
19
22
|
describe('resolvable-ext-references-melinda', () => {
|
|
20
23
|
afterEach(() => {
|
|
21
|
-
|
|
24
|
+
fetchMock.unmockGlobal();
|
|
25
|
+
// testContext.default.__ResetDependency__('fetch');
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
beforeEach(() => {
|
|
29
|
+
fetchMock.mockGlobal(); // replace fetch with fetch-mock's implementation
|
|
30
|
+
fetchMock.get(`${endpoint}${queryParam}5000`, { status: 200, headers: {}, body: fixture5000 })
|
|
31
|
+
.get(`${endpoint}${queryParam}9550`, { status: 200, headers: {}, body: fixture9550 })
|
|
32
|
+
.get(`${endpoint}${queryParam}1000`, { status: 200, headers: {}, body: fixture1000 });
|
|
33
|
+
|
|
22
34
|
});
|
|
23
35
|
|
|
24
36
|
it('Creates a validator', async () => {
|
|
25
37
|
const validator = await testContext.default({endpoint, prefixPattern, fields});
|
|
26
38
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
expect(validator.description).to.be.a('string');
|
|
32
|
-
expect(validator.validate).to.be.a('function');
|
|
39
|
+
assert.equal(typeof validator, 'object');
|
|
40
|
+
assert.equal(typeof validator.description, 'string');
|
|
41
|
+
assert.equal(typeof validator.validate, 'function');
|
|
33
42
|
});
|
|
34
43
|
|
|
35
44
|
it('Throws an error when prefixPattern not provided', async () => {
|
|
36
45
|
const validator = await testContext.default({endpoint, prefixPattern, fields});
|
|
37
46
|
// Cannot read property 'fields' of undefined or Cannot read properties of undefined (reading 'fields')'
|
|
38
|
-
|
|
47
|
+
try {
|
|
48
|
+
await validator.validate();
|
|
49
|
+
throw new Error("Test expected an error");
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
assert.equal(err instanceof Error, true);
|
|
53
|
+
assert.match(err.message, /^Cannot read propert/u) ;
|
|
54
|
+
}
|
|
55
|
+
//await assert(validator.validate()).to.be.rejectedWith(Error, /^Cannot read propert/u);
|
|
39
56
|
});
|
|
40
57
|
|
|
41
58
|
describe('#validate', () => {
|
|
59
|
+
|
|
60
|
+
|
|
42
61
|
it('Finds prefixPattern on record and removes it', async () => {
|
|
43
|
-
const mock = fetchMock.sandbox();
|
|
44
|
-
mock.get(`${endpoint}${queryParam}5000`, fixture5000);
|
|
45
|
-
mock.get(`${endpoint}${queryParam}9550`, fixture9550);
|
|
46
62
|
|
|
47
|
-
testContext.default.__Rewire__('fetch', mock);
|
|
48
63
|
const validator = await testContext.default({endpoint, prefixPattern, fields});
|
|
49
64
|
|
|
50
65
|
const record = new MarcRecord({
|
|
@@ -88,15 +103,15 @@ describe('resolvable-ext-references-melinda', () => {
|
|
|
88
103
|
});
|
|
89
104
|
const result = await validator.validate(record);
|
|
90
105
|
|
|
91
|
-
|
|
106
|
+
assert.deepEqual(result, {valid: true, messages: []});
|
|
92
107
|
});
|
|
93
108
|
|
|
94
109
|
it('Finds no matching prefixPattern on record', async () => {
|
|
95
|
-
const mock = fetchMock.sandbox();
|
|
110
|
+
//const mock = fetchMock.sandbox();
|
|
96
111
|
|
|
97
|
-
mock.get(`${endpoint}5000`, fixture5000);
|
|
112
|
+
//mock.get(`${endpoint}5000`, fixture5000);
|
|
98
113
|
|
|
99
|
-
testContext.default.__Rewire__('fetch', mock);
|
|
114
|
+
//testContext.default.__Rewire__('fetch', mock);
|
|
100
115
|
const validator = await testContext.default({endpoint, prefixPattern, fields});
|
|
101
116
|
|
|
102
117
|
const record = new MarcRecord({
|
|
@@ -140,14 +155,14 @@ describe('resolvable-ext-references-melinda', () => {
|
|
|
140
155
|
});
|
|
141
156
|
const result = await validator.validate(record);
|
|
142
157
|
|
|
143
|
-
|
|
158
|
+
assert.deepEqual(result, {valid: true, messages: []});
|
|
144
159
|
});
|
|
145
160
|
|
|
146
161
|
it('Finds prefixPattern on record but values not resolvable', async () => {
|
|
147
|
-
const mock = fetchMock.sandbox();
|
|
148
|
-
mock.get(`${endpoint}${queryParam}1000`, fixture1000);
|
|
162
|
+
//const mock = fetchMock.sandbox();
|
|
163
|
+
//mock.get(`${endpoint}${queryParam}1000`, fixture1000);
|
|
149
164
|
|
|
150
|
-
testContext.default.__Rewire__('fetch', mock);
|
|
165
|
+
//testContext.default.__Rewire__('fetch', mock);
|
|
151
166
|
const validator = await testContext.default({endpoint, prefixPattern, fields});
|
|
152
167
|
|
|
153
168
|
const record = new MarcRecord({
|
|
@@ -178,7 +193,7 @@ describe('resolvable-ext-references-melinda', () => {
|
|
|
178
193
|
});
|
|
179
194
|
const result = await validator.validate(record);
|
|
180
195
|
|
|
181
|
-
|
|
196
|
+
assert.deepEqual(result, {valid: false, messages: ['Field 773$w with value 1000 is not resolvable']});
|
|
182
197
|
});
|
|
183
198
|
});
|
|
184
199
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import createDebugLogger from 'debug';
|
|
2
|
-
import {fieldHasSubfield, fieldToString, nvdebug, subfieldToString} from './utils';
|
|
3
|
-
import {fieldHasWantedTagAndOccurrenceNumber, isValidSubfield6, subfield6GetOccurrenceNumber, subfield6ResetOccurrenceNumber} from './subfield6Utils';
|
|
2
|
+
import {fieldHasSubfield, fieldToString, nvdebug, subfieldToString} from './utils.js';
|
|
3
|
+
import {fieldHasWantedTagAndOccurrenceNumber, isValidSubfield6, subfield6GetOccurrenceNumber, subfield6ResetOccurrenceNumber} from './subfield6Utils.js';
|
|
4
4
|
|
|
5
5
|
// Relocated from melinda-marc-record-merge-reducers (and renamed)
|
|
6
6
|
|
|
@@ -45,12 +45,12 @@ export function recordFixSubfield6OccurrenceNumbers(record) {
|
|
|
45
45
|
const fieldsContainingSubfield6 = record.fields.filter(field => fieldHasSubfield(field, '6'));
|
|
46
46
|
const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);
|
|
47
47
|
|
|
48
|
-
orphanedFields.forEach(field => fieldFixOrphanedSubfields(field));
|
|
48
|
+
orphanedFields.forEach(field => fieldFixOrphanedSubfields(field));
|
|
49
49
|
|
|
50
50
|
function fieldFixOrphanedSubfields(field) {
|
|
51
51
|
// Field 880: orphaned $6 subfields: occurrence number is changed to '00':
|
|
52
52
|
if (field.tag === '880') {
|
|
53
|
-
field.subfields.forEach(sf => field880FixOrphanedSubfield(sf));
|
|
53
|
+
field.subfields.forEach(sf => field880FixOrphanedSubfield(sf));
|
|
54
54
|
return;
|
|
55
55
|
}
|
|
56
56
|
// Non-880 fields get their orphaned $6s removed:
|
|
@@ -78,7 +78,7 @@ function findPairForSubfield6OccurrenceNumber(subfield6, myTag, candPairFields)
|
|
|
78
78
|
return undefined;
|
|
79
79
|
}
|
|
80
80
|
nvdebug(`LOOKING FOR PAIR: ${myTag} ${subfieldToString(subfield6)}`);
|
|
81
|
-
candPairFields.forEach(field => fieldToString(field));
|
|
81
|
+
candPairFields.forEach(field => fieldToString(field));
|
|
82
82
|
|
|
83
83
|
// Only valid $6 value that fails to map to another field is iffy...
|
|
84
84
|
const referredTag = subfield6.value.substring(0, 3);
|