@natlibfi/marc-record-validators-melinda 12.1.0-alpha.1 → 13.0.0
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-and-publish.yml +17 -17
- package/README.md +1 -1
- package/dist/addMissingField041.js +6 -3
- package/dist/addMissingField041.js.map +2 -2
- package/dist/addMissingField336.js +7 -4
- package/dist/addMissingField336.js.map +2 -2
- package/dist/addMissingField337.js +6 -3
- package/dist/addMissingField337.js.map +2 -2
- package/dist/addMissingField338.js +8 -5
- package/dist/addMissingField338.js.map +2 -2
- package/dist/cyrillux-usemarcon-replacement.js +5 -2
- package/dist/cyrillux-usemarcon-replacement.js.map +2 -2
- package/dist/cyrillux.js +24 -18
- package/dist/cyrillux.js.map +2 -2
- package/dist/dataProvenanceUtils.js +19 -0
- package/dist/dataProvenanceUtils.js.map +7 -0
- package/dist/disambiguateSeriesStatements.js +2 -1
- package/dist/disambiguateSeriesStatements.js.map +2 -2
- package/dist/disambiguateSeriesStatements.test.js +1 -7
- package/dist/disambiguateSeriesStatements.test.js.map +2 -2
- package/dist/drop-terms.js +123 -0
- package/dist/drop-terms.js.map +7 -0
- package/dist/drop-terms.test.js +56 -0
- package/dist/drop-terms.test.js.map +7 -0
- package/dist/field-008-18-34-character-groups.test.js +1 -7
- package/dist/field-008-18-34-character-groups.test.js.map +2 -2
- package/dist/field-505-separators.test.js +1 -7
- package/dist/field-505-separators.test.js.map +2 -2
- package/dist/field-521-fix.test.js +1 -7
- package/dist/field-521-fix.test.js.map +2 -2
- package/dist/fix-33X.js +7 -4
- package/dist/fix-33X.js.map +2 -2
- package/dist/fix-33X.test.js +1 -1
- package/dist/fix-33X.test.js.map +1 -1
- package/dist/fix-country-codes.js +5 -0
- package/dist/fix-country-codes.js.map +2 -2
- package/dist/fix-country-codes.test.js +1 -7
- package/dist/fix-country-codes.test.js.map +2 -2
- package/dist/fix-language-codes.js +5 -1
- package/dist/fix-language-codes.js.map +2 -2
- package/dist/fix-sami-041.js +109 -0
- package/dist/fix-sami-041.js.map +7 -0
- package/dist/fix-sami-041.test.js +40 -0
- package/dist/fix-sami-041.test.js.map +7 -0
- package/dist/fixRelatorTerms.js +2 -0
- package/dist/fixRelatorTerms.js.map +2 -2
- package/dist/fixRelatorTerms.test.js +1 -7
- package/dist/fixRelatorTerms.test.js.map +2 -2
- package/dist/index.js +18 -4
- package/dist/index.js.map +2 -2
- package/dist/indicator-fixes.js +15 -1
- package/dist/indicator-fixes.js.map +2 -2
- package/dist/indicator-fixes.test.js +1 -7
- package/dist/indicator-fixes.test.js.map +2 -2
- package/dist/item-language.js +41 -39
- package/dist/item-language.js.map +2 -2
- package/dist/item-language.test.js +3 -3
- package/dist/item-language.test.js.map +2 -2
- package/dist/melindaCustomMergeFields.js +31 -0
- package/dist/melindaCustomMergeFields.js.map +2 -2
- package/dist/merge-fields/controlSubfields.js.map +2 -2
- package/dist/merge-fields/counterpartField.js +149 -152
- package/dist/merge-fields/counterpartField.js.map +3 -3
- package/dist/merge-fields/dataProvenance.js +6 -20
- package/dist/merge-fields/dataProvenance.js.map +2 -2
- package/dist/merge-fields/index.js +1 -1
- package/dist/merge-fields/index.js.map +2 -2
- package/dist/merge-fields/mergableIndicator.js +1 -5
- package/dist/merge-fields/mergableIndicator.js.map +2 -2
- package/dist/merge-fields/mergableTag.js +2 -0
- package/dist/merge-fields/mergableTag.js.map +2 -2
- package/dist/merge-fields/mergeConfig.js +2 -0
- package/dist/merge-fields/mergeConfig.js.map +2 -2
- package/dist/merge-fields/mergeConstraints.js +38 -35
- package/dist/merge-fields/mergeConstraints.js.map +3 -3
- package/dist/merge-fields/mergeField.js +4 -3
- package/dist/merge-fields/mergeField.js.map +2 -2
- package/dist/merge-fields/mergeOrAddSubfield.js +8 -7
- package/dist/merge-fields/mergeOrAddSubfield.js.map +2 -2
- package/dist/merge-fields/mergeSubfield.js +5 -1
- package/dist/merge-fields/mergeSubfield.js.map +2 -2
- package/dist/merge-fields/worldKnowledge.js +52 -0
- package/dist/merge-fields/worldKnowledge.js.map +2 -2
- package/dist/merge-fields.test.js +4 -9
- package/dist/merge-fields.test.js.map +2 -2
- package/dist/mergeField500Lisapainokset.test.js +1 -7
- package/dist/mergeField500Lisapainokset.test.js.map +2 -2
- package/dist/mergeRelatorTermFields.js +9 -6
- package/dist/mergeRelatorTermFields.js.map +2 -2
- package/dist/mergeRelatorTermFields.test.js +1 -7
- package/dist/mergeRelatorTermFields.test.js.map +2 -2
- package/dist/multiple-subfield-0.test.js +1 -7
- package/dist/multiple-subfield-0.test.js.map +2 -2
- package/dist/normalize-dashes.js +9 -6
- package/dist/normalize-dashes.js.map +2 -2
- package/dist/normalize-dashes.test.js +1 -7
- package/dist/normalize-dashes.test.js.map +2 -2
- package/dist/normalize-identifiers.js.map +2 -2
- package/dist/normalize-identifiers.test.js +1 -7
- package/dist/normalize-identifiers.test.js.map +2 -2
- package/dist/normalize-qualifying-information.test.js +1 -7
- package/dist/normalize-qualifying-information.test.js.map +2 -2
- package/dist/normalize-utf8-diacritics.js.map +2 -2
- package/dist/normalize-utf8-diacritics.test.js +1 -7
- package/dist/normalize-utf8-diacritics.test.js.map +2 -2
- package/dist/normalizeFieldForComparison.js +24 -14
- package/dist/normalizeFieldForComparison.js.map +2 -2
- package/dist/normalizeSubfieldValueForComparison.js.map +1 -1
- package/dist/prepublicationUtils.js +1 -1
- package/dist/prepublicationUtils.js.map +2 -2
- package/dist/punctuation.test.js +1 -7
- package/dist/punctuation.test.js.map +2 -2
- package/dist/punctuation2.js +15 -12
- package/dist/punctuation2.js.map +2 -2
- package/dist/punctuation2.test.js +1 -7
- package/dist/punctuation2.test.js.map +2 -2
- package/dist/reindexSubfield6OccurenceNumbers.js +11 -10
- package/dist/reindexSubfield6OccurenceNumbers.js.map +2 -2
- package/dist/reindexSubfield6OccurenceNumbers.test.js +1 -7
- package/dist/reindexSubfield6OccurenceNumbers.test.js.map +2 -2
- package/dist/remove-041-zxx.js +56 -0
- package/dist/remove-041-zxx.js.map +7 -0
- package/dist/remove-041-zxx.test.js +40 -0
- package/dist/remove-041-zxx.test.js.map +7 -0
- package/dist/removeDuplicateDataFields.js +4 -26
- package/dist/removeDuplicateDataFields.js.map +2 -2
- package/dist/removeDuplicateDataFields.test.js +1 -7
- package/dist/removeDuplicateDataFields.test.js.map +2 -2
- package/dist/removeInferiorDataFields.js +82 -45
- package/dist/removeInferiorDataFields.js.map +3 -3
- package/dist/removeInferiorDataFields.test.js +5 -9
- package/dist/removeInferiorDataFields.test.js.map +2 -2
- package/dist/resolveOrphanedSubfield6s.js +4 -5
- package/dist/resolveOrphanedSubfield6s.js.map +2 -2
- package/dist/resolveOrphanedSubfield6s.test.js +1 -7
- package/dist/resolveOrphanedSubfield6s.test.js.map +2 -2
- package/dist/sanitize-vocabulary-source-codes.test.js +1 -7
- package/dist/sanitize-vocabulary-source-codes.test.js.map +2 -2
- package/dist/sortFields.js +16 -1
- package/dist/sortFields.js.map +2 -2
- package/dist/sortFields.test.js +1 -7
- package/dist/sortFields.test.js.map +2 -2
- package/dist/sortRelatorTerms.test.js +1 -7
- package/dist/sortRelatorTerms.test.js.map +2 -2
- package/dist/sortSubfields.js +27 -21
- package/dist/sortSubfields.js.map +2 -2
- package/dist/sortSubfields.test.js +1 -7
- package/dist/sortSubfields.test.js.map +2 -2
- package/dist/stripPunctuation.js +7 -3
- package/dist/stripPunctuation.js.map +2 -2
- package/dist/stripPunctuation.test.js +1 -7
- package/dist/stripPunctuation.test.js.map +2 -2
- package/dist/subfield6Utils.js +2 -12
- package/dist/subfield6Utils.js.map +2 -2
- package/dist/subfield8Utils.js +0 -5
- package/dist/subfield8Utils.js.map +2 -2
- package/dist/subfieldValueNormalizations.test.js +1 -7
- package/dist/subfieldValueNormalizations.test.js.map +2 -2
- package/dist/sync-007-and-300.test.js +1 -7
- package/dist/sync-007-and-300.test.js.map +2 -2
- package/dist/sync-language.js +103 -0
- package/dist/sync-language.js.map +7 -0
- package/dist/sync-language.test.js +40 -0
- package/dist/sync-language.test.js.map +7 -0
- package/dist/translate-terms.js +124 -87
- package/dist/translate-terms.js.map +3 -3
- package/dist/translate-terms.test.js +5 -8
- package/dist/translate-terms.test.js.map +2 -2
- package/dist/typeOfDate-008.js +3 -1
- package/dist/typeOfDate-008.js.map +2 -2
- package/dist/update-field-540.js.map +2 -2
- package/dist/update-field-540.test.js +1 -7
- package/dist/update-field-540.test.js.map +2 -2
- package/dist/urn.js +13 -12
- package/dist/urn.js.map +2 -2
- package/dist/urn.test.js +1 -7
- package/dist/urn.test.js.map +2 -2
- package/dist/utils.js +29 -3
- package/dist/utils.js.map +2 -2
- package/package.json +20 -27
- package/src/addMissingField041.js +8 -4
- package/src/addMissingField336.js +10 -5
- package/src/addMissingField337.js +9 -5
- package/src/addMissingField338.js +11 -6
- package/src/cyrillux-usemarcon-replacement.js +9 -5
- package/src/cyrillux.js +34 -23
- package/src/dataProvenanceUtils.js +21 -0
- package/src/disambiguateSeriesStatements.js +4 -1
- package/src/disambiguateSeriesStatements.test.js +3 -8
- package/src/drop-terms.js +164 -0
- package/src/drop-terms.test.js +81 -0
- package/src/field-008-18-34-character-groups.test.js +3 -8
- package/src/field-505-separators.test.js +3 -8
- package/src/field-521-fix.test.js +3 -8
- package/src/fix-33X.js +10 -6
- package/src/fix-33X.test.js +1 -1
- package/src/fix-country-codes.js +7 -3
- package/src/fix-country-codes.test.js +3 -8
- package/src/fix-language-codes.js +8 -4
- package/src/fix-sami-041.js +147 -0
- package/src/fix-sami-041.test.js +52 -0
- package/src/fixRelatorTerms.js +5 -0
- package/src/fixRelatorTerms.test.js +3 -8
- package/src/index.js +20 -7
- package/src/indicator-fixes.js +22 -7
- package/src/indicator-fixes.test.js +3 -8
- package/src/item-language.js +49 -42
- package/src/item-language.test.js +3 -3
- package/src/melindaCustomMergeFields.js +31 -0
- package/src/merge-fields/controlSubfields.js +0 -1
- package/src/merge-fields/counterpartField.js +191 -290
- package/src/merge-fields/dataProvenance.js +8 -25
- package/src/merge-fields/index.js +1 -1
- package/src/merge-fields/mergableIndicator.js +4 -5
- package/src/merge-fields/mergableTag.js +2 -0
- package/src/merge-fields/mergeConfig.js +2 -1
- package/src/merge-fields/mergeConstraints.js +41 -36
- package/src/merge-fields/mergeField.js +4 -7
- package/src/merge-fields/mergeOrAddSubfield.js +8 -7
- package/src/merge-fields/mergeSubfield.js +11 -2
- package/src/merge-fields/worldKnowledge.js +77 -3
- package/src/merge-fields.test.js +5 -10
- package/src/mergeField500Lisapainokset.test.js +3 -8
- package/src/mergeRelatorTermFields.js +12 -11
- package/src/mergeRelatorTermFields.test.js +3 -8
- package/src/multiple-subfield-0.test.js +3 -8
- package/src/normalize-dashes.js +13 -7
- package/src/normalize-dashes.test.js +3 -8
- package/src/normalize-identifiers.js +12 -19
- package/src/normalize-identifiers.test.js +3 -8
- package/src/normalize-qualifying-information.test.js +3 -8
- package/src/normalize-utf8-diacritics.js +6 -3
- package/src/normalize-utf8-diacritics.test.js +3 -8
- package/src/normalizeFieldForComparison.js +39 -22
- package/src/normalizeSubfieldValueForComparison.js +2 -2
- package/src/prepublicationUtils.js +1 -1
- package/src/punctuation.test.js +3 -8
- package/src/punctuation2.js +44 -40
- package/src/punctuation2.test.js +3 -8
- package/src/reindexSubfield6OccurenceNumbers.js +13 -11
- package/src/reindexSubfield6OccurenceNumbers.test.js +3 -8
- package/src/remove-041-zxx.js +85 -0
- package/src/remove-041-zxx.test.js +52 -0
- package/src/removeDuplicateDataFields.js +30 -28
- package/src/removeDuplicateDataFields.test.js +3 -8
- package/src/removeInferiorDataFields.js +126 -71
- package/src/removeInferiorDataFields.test.js +7 -10
- package/src/resolveOrphanedSubfield6s.js +7 -5
- package/src/resolveOrphanedSubfield6s.test.js +3 -8
- package/src/sanitize-vocabulary-source-codes.test.js +3 -8
- package/src/sortFields.js +20 -1
- package/src/sortFields.test.js +3 -8
- package/src/sortRelatorTerms.test.js +3 -8
- package/src/sortSubfields.js +31 -25
- package/src/sortSubfields.test.js +3 -8
- package/src/stripPunctuation.js +10 -5
- package/src/stripPunctuation.test.js +3 -8
- package/src/subfield6Utils.js +31 -33
- package/src/subfield8Utils.js +10 -7
- package/src/subfieldValueNormalizations.test.js +3 -8
- package/src/sync-007-and-300.test.js +3 -8
- package/src/sync-language.js +148 -0
- package/src/sync-language.test.js +52 -0
- package/src/translate-terms.js +168 -109
- package/src/translate-terms.test.js +12 -16
- package/src/typeOfDate-008.js +4 -1
- package/src/update-field-540.js +7 -5
- package/src/update-field-540.test.js +3 -8
- package/src/urn.js +17 -13
- package/src/urn.test.js +3 -8
- package/src/utils.js +39 -12
- package/test-fixtures/cyrillux/f02b/expectedResult.json +23 -0
- package/test-fixtures/cyrillux/f02b/metadata.json +11 -0
- package/test-fixtures/cyrillux/f02b/record.json +14 -0
- package/test-fixtures/cyrillux/f14/expectedResult.json +32 -0
- package/test-fixtures/cyrillux/f14/metadata.json +10 -0
- package/test-fixtures/cyrillux/f14/record.json +14 -0
- package/test-fixtures/drop-terms/01/expectedResult.json +31 -0
- package/test-fixtures/drop-terms/01/metadata.json +6 -0
- package/test-fixtures/drop-terms/01/record.json +35 -0
- package/test-fixtures/drop-terms/02/expectedResult.json +7 -0
- package/test-fixtures/drop-terms/02/metadata.json +6 -0
- package/test-fixtures/drop-terms/02/record.json +40 -0
- package/test-fixtures/drop-terms/03/expectedResult.json +6 -0
- package/test-fixtures/drop-terms/03/metadata.json +18 -0
- package/test-fixtures/drop-terms/03/record.json +39 -0
- package/test-fixtures/drop-terms/04/expectedResult.json +6 -0
- package/test-fixtures/drop-terms/04/metadata.json +19 -0
- package/test-fixtures/drop-terms/04/record.json +24 -0
- package/test-fixtures/fix-language-codes/02/metadata.json +1 -1
- package/test-fixtures/fix-relator-terms/f02/metadata.json +1 -1
- package/test-fixtures/fix-relator-terms/f04/expectedResult.json +18 -0
- package/test-fixtures/fix-relator-terms/f04/metadata.json +5 -0
- package/test-fixtures/fix-relator-terms/f04/record.json +20 -0
- package/test-fixtures/fix-sami-041/01/expectedResult.json +6 -0
- package/test-fixtures/fix-sami-041/01/metadata.json +4 -0
- package/test-fixtures/fix-sami-041/01/record.json +14 -0
- package/test-fixtures/fix-sami-041/02/expectedResult.json +10 -0
- package/test-fixtures/fix-sami-041/02/metadata.json +4 -0
- package/test-fixtures/fix-sami-041/02/record.json +8 -0
- package/test-fixtures/fix-sami-041/03/expectedResult.json +5 -0
- package/test-fixtures/fix-sami-041/03/metadata.json +5 -0
- package/test-fixtures/fix-sami-041/03/record.json +8 -0
- package/test-fixtures/fix-sami-041/04/expectedResult.json +7 -0
- package/test-fixtures/fix-sami-041/04/metadata.json +4 -0
- package/test-fixtures/fix-sami-041/04/record.json +10 -0
- package/test-fixtures/fix-sami-041/05/expectedResult.json +10 -0
- package/test-fixtures/fix-sami-041/05/metadata.json +6 -0
- package/test-fixtures/fix-sami-041/05/record.json +8 -0
- package/test-fixtures/fix-sami-041/06/expectedResult.json +10 -0
- package/test-fixtures/fix-sami-041/06/metadata.json +4 -0
- package/test-fixtures/fix-sami-041/06/record.json +9 -0
- package/test-fixtures/indicator-fixes/11/expectedResult.json +10 -0
- package/test-fixtures/indicator-fixes/11/metadata.json +4 -0
- package/test-fixtures/indicator-fixes/11/record.json +10 -0
- package/test-fixtures/merge-fields/f042_01/expectedResult.json +12 -0
- package/test-fixtures/merge-fields/f042_01/metadata.json +6 -0
- package/test-fixtures/merge-fields/f042_01/record.json +13 -0
- package/test-fixtures/merge-fields/f05/metadata.json +1 -1
- package/test-fixtures/merge-fields/f06/expectedResult.json +42 -0
- package/test-fixtures/merge-fields/f06/metadata.json +6 -0
- package/test-fixtures/merge-fields/f06/record.json +41 -0
- package/test-fixtures/merge-fields/f07/expectedResult.json +18 -0
- package/test-fixtures/merge-fields/f07/metadata.json +6 -0
- package/test-fixtures/merge-fields/f07/record.json +18 -0
- package/test-fixtures/merge-fields/f08/expectedResult.json +12 -0
- package/test-fixtures/merge-fields/f08/metadata.json +7 -0
- package/test-fixtures/merge-fields/f08/record.json +10 -0
- package/test-fixtures/merge-fields/f09/expectedResult.json +14 -0
- package/test-fixtures/merge-fields/f09/metadata.json +6 -0
- package/test-fixtures/merge-fields/f09/record.json +14 -0
- package/test-fixtures/merge-fields/f10/expectedResult.json +25 -0
- package/test-fixtures/merge-fields/f10/metadata.json +6 -0
- package/test-fixtures/merge-fields/f10/record.json +25 -0
- package/test-fixtures/merge-fields/f11/expectedResult.json +40 -0
- package/test-fixtures/merge-fields/f11/metadata.json +7 -0
- package/test-fixtures/merge-fields/f11/record.json +50 -0
- package/test-fixtures/merge-fields/f12/expectedResult.json +17 -0
- package/test-fixtures/merge-fields/f12/metadata.json +6 -0
- package/test-fixtures/merge-fields/f12/record.json +25 -0
- package/test-fixtures/merge-fields/f13/expectedResult.json +18 -0
- package/test-fixtures/merge-fields/f13/metadata.json +6 -0
- package/test-fixtures/merge-fields/f13/record.json +28 -0
- package/test-fixtures/merge-fields/f14/expectedResult.json +25 -0
- package/test-fixtures/merge-fields/f14/metadata.json +6 -0
- package/test-fixtures/merge-fields/f14/record.json +25 -0
- package/test-fixtures/merge-fields/f15/expectedResult.json +8 -0
- package/test-fixtures/merge-fields/f15/metadata.json +6 -0
- package/test-fixtures/merge-fields/f15/record.json +9 -0
- package/test-fixtures/merge-fields/f16/expectedResult.json +12 -0
- package/test-fixtures/merge-fields/f16/metadata.json +7 -0
- package/test-fixtures/merge-fields/f16/record.json +13 -0
- package/test-fixtures/merge-fields/f300_01/expectedResult.json +9 -0
- package/test-fixtures/merge-fields/f300_01/metadata.json +6 -0
- package/test-fixtures/merge-fields/f300_01/record.json +8 -0
- package/test-fixtures/merge-fields/f300_02/expectedResult.json +13 -0
- package/test-fixtures/merge-fields/f300_02/metadata.json +6 -0
- package/test-fixtures/merge-fields/f300_02/record.json +16 -0
- package/test-fixtures/merge-fields/f300_03/expectedResult.json +13 -0
- package/test-fixtures/merge-fields/f300_03/metadata.json +6 -0
- package/test-fixtures/merge-fields/f300_03/record.json +16 -0
- package/test-fixtures/merge-fields/f490_01/expectedResult.json +13 -0
- package/test-fixtures/merge-fields/f490_01/metadata.json +6 -0
- package/test-fixtures/merge-fields/f490_01/record.json +16 -0
- package/test-fixtures/remove-041-zxx/01/expectedResult.json +5 -0
- package/test-fixtures/remove-041-zxx/01/metadata.json +5 -0
- package/test-fixtures/remove-041-zxx/01/record.json +10 -0
- package/test-fixtures/remove-041-zxx/02/expectedResult.json +7 -0
- package/test-fixtures/remove-041-zxx/02/metadata.json +5 -0
- package/test-fixtures/remove-041-zxx/02/record.json +9 -0
- package/test-fixtures/remove-041-zxx/11/expectedResult.json +10 -0
- package/test-fixtures/remove-041-zxx/11/metadata.json +5 -0
- package/test-fixtures/remove-041-zxx/11/record.json +9 -0
- package/test-fixtures/remove-041-zxx/12/expectedResult.json +10 -0
- package/test-fixtures/remove-041-zxx/12/metadata.json +5 -0
- package/test-fixtures/remove-041-zxx/12/record.json +9 -0
- package/test-fixtures/remove-inferior-datafields/f17/expectedResult.json +11 -0
- package/test-fixtures/remove-inferior-datafields/f17/metadata.json +5 -0
- package/test-fixtures/remove-inferior-datafields/f17/record.json +15 -0
- package/test-fixtures/remove-inferior-datafields/f18/expectedResult.json +13 -0
- package/test-fixtures/remove-inferior-datafields/f18/metadata.json +5 -0
- package/test-fixtures/remove-inferior-datafields/f18/record.json +18 -0
- package/test-fixtures/remove-inferior-datafields/f19/expectedResult.json +17 -0
- package/test-fixtures/remove-inferior-datafields/f19/metadata.json +5 -0
- package/test-fixtures/remove-inferior-datafields/f19/record.json +18 -0
- package/test-fixtures/remove-inferior-datafields/f20/expectedResult.json +15 -0
- package/test-fixtures/remove-inferior-datafields/f20/metadata.json +5 -0
- package/test-fixtures/remove-inferior-datafields/f20/record.json +29 -0
- package/test-fixtures/sort-fields/15/input.json +9 -0
- package/test-fixtures/sort-fields/15/metadata.json +5 -0
- package/test-fixtures/sort-fields/15/result.json +10 -0
- package/test-fixtures/sync-language/01/expectedResult.json +5 -0
- package/test-fixtures/sync-language/01/metadata.json +5 -0
- package/test-fixtures/sync-language/01/record.json +7 -0
- package/test-fixtures/sync-language/02/expectedResult.json +6 -0
- package/test-fixtures/sync-language/02/metadata.json +5 -0
- package/test-fixtures/sync-language/02/record.json +10 -0
- package/test-fixtures/sync-language/03/expectedResult.json +6 -0
- package/test-fixtures/sync-language/03/metadata.json +5 -0
- package/test-fixtures/sync-language/03/record.json +6 -0
- package/test-fixtures/sync-language/10/expectedResult.json +10 -0
- package/test-fixtures/sync-language/10/metadata.json +5 -0
- package/test-fixtures/sync-language/10/record.json +8 -0
- package/test-fixtures/sync-language/11/expectedResult.json +10 -0
- package/test-fixtures/sync-language/11/metadata.json +5 -0
- package/test-fixtures/sync-language/11/record.json +7 -0
- package/test-fixtures/sync-language/12/expectedResult.json +9 -0
- package/test-fixtures/sync-language/12/metadata.json +6 -0
- package/test-fixtures/sync-language/12/record.json +6 -0
- package/test-fixtures/sync-language/13/expectedResult.json +10 -0
- package/test-fixtures/sync-language/13/metadata.json +5 -0
- package/test-fixtures/sync-language/13/record.json +8 -0
- package/test-fixtures/sync-language/14/expectedResult.json +9 -0
- package/test-fixtures/sync-language/14/metadata.json +5 -0
- package/test-fixtures/sync-language/14/record.json +7 -0
- package/test-fixtures/sync-language/15/expectedResult.json +9 -0
- package/test-fixtures/sync-language/15/metadata.json +5 -0
- package/test-fixtures/sync-language/15/record.json +7 -0
- package/test-fixtures/translate-terms/05/expectedResult.json +12 -0
- package/test-fixtures/translate-terms/05/metadata.json +7 -0
- package/test-fixtures/translate-terms/05/record.json +11 -0
- package/test-fixtures/translate-terms/06/expectedResult.json +12 -0
- package/test-fixtures/translate-terms/06/metadata.json +7 -0
- package/test-fixtures/translate-terms/06/record.json +11 -0
- package/test-fixtures/translate-terms-data.js +23 -0
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.js"],
|
|
4
|
-
"sourcesContent": ["import AccessRights from './access-rights.js';\nimport AddMissingField041 from './addMissingField041.js';\nimport AddMissingField336 from './addMissingField336.js';\nimport AddMissingField337 from './addMissingField337.js';\nimport AddMissingField338 from './addMissingField338.js';\nimport Cyrillux from './cyrillux.js';\nimport CyrilluxUsemarconReplacement from './cyrillux-usemarcon-replacement.js';\nimport DisambiguateSeriesStatements from './disambiguateSeriesStatements.js';\nimport DoubleCommas from './double-commas.js';\nimport DuplicatesInd1 from './duplicates-ind1.js';\nimport EmptyFields from './empty-fields.js';\nimport EndingPunctuation from './ending-punctuation.js';\nimport EndingWhitespace from './ending-whitespace.js';\nimport Field008CharacterGroups from './field-008-18-34-character-groups.js';\nimport Field505Separators from './field-505-separators.js';\nimport Field521Fix from './field-521-fix.js';\nimport FieldExclusion from './field-exclusion.js';\nimport FieldStructure from './field-structure.js';\nimport FieldsPresent from './fields-present.js';\nimport Fix33X from './fix-33X.js';\nimport FixCountryCodes from './fix-country-codes.js';\nimport FixLanguageCodes from './fix-language-codes.js';\nimport FixRelatorTerms from './fixRelatorTerms.js';\nimport FixedFields from './fixed-fields.js';\nimport IdenticalFields from './identical-fields.js';\nimport IndicatorFixes from './indicator-fixes.js';\nimport IsbnIssn from './isbn-issn.js';\nimport ItemLanguage from './item-language.js';\nimport MergeField500Lisapainokset from './mergeField500Lisapainokset.js';\nimport MergeFields from './merge-fields/index.js';\nimport MergeRelatorTermFields from './mergeRelatorTermFields.js';\nimport Modernize502 from './modernize-502.js';\nimport MultipleSubfield0s from './multiple-subfield-0.js';\nimport NonBreakingSpace from './non-breaking-space.js';\nimport NormalizeDashes from './normalize-dashes.js';\nimport NormalizeIdentifiers from './normalize-identifiers.js';\nimport NormalizeQualifyingInformation from './normalize-qualifying-information.js';\nimport NormalizeUTF8Diacritics from './normalize-utf8-diacritics.js';\nimport Punctuation from './punctuation/index.js';\nimport Punctuation2 from './punctuation2.js';\nimport ReindexSubfield6OccurenceNumbers from './reindexSubfield6OccurenceNumbers.js';\nimport RemoveDuplicateDataFields from './removeDuplicateDataFields.js';\nimport RemoveInferiorDataFields from './removeInferiorDataFields.js';\nimport ResolvableExtReferences from './resolvable-ext-references-melinda.js';\nimport ResolveOrphanedSubfield6s from './resolveOrphanedSubfield6s.js';\nimport SanitizeVocabularySourceCodes from './sanitize-vocabulary-source-codes.js';\nimport SortFields from './sortFields.js';\nimport SortRelatorTerms from './sortRelatorTerms.js';\nimport SortSubfields from './sortSubfields.js';\nimport SortTags from './sort-tags.js';\n// import StripPunctuation from './stripPunctuation'; // Can we add this here? Should be used very cautiosly!\nimport SubfieldValueNormalizations from './subfieldValueNormalizations.js';\nimport SubfieldExclusion from './subfield-exclusion.js';\nimport Sync007And300 from './sync-007-and-300.js';\nimport TranslateTerms from './translate-terms.js';\nimport TypeOfDateF008 from './typeOfDate-008.js';\nimport UnicodeDecomposition from './unicode-decomposition.js';\nimport UpdateField540 from './update-field-540.js';\nimport Urn from './urn.js';\n\nimport {getCounterpart} from './merge-fields/counterpartField.js';\n\nimport {postprocessRecords} from './merge-fields/mergeOrAddPostprocess.js';\nimport {mergeField} from './merge-fields/mergeField.js';\nimport {fieldGetOccurrenceNumberPairs, fieldGetUnambiguousOccurrenceNumber, fieldToNormalizedString, fieldsToNormalizedString, get6s,\n isValidSubfield6,
|
|
5
|
-
"mappings": "AAAA,OAAO,kBAAkB;AACzB,OAAO,wBAAwB;AAC/B,OAAO,wBAAwB;AAC/B,OAAO,wBAAwB;AAC/B,OAAO,wBAAwB;AAC/B,OAAO,cAAc;AACrB,OAAO,kCAAkC;AACzC,OAAO,kCAAkC;AACzC,OAAO,kBAAkB;AACzB,OAAO,oBAAoB;AAC3B,OAAO,iBAAiB;AACxB,OAAO,uBAAuB;AAC9B,OAAO,sBAAsB;AAC7B,OAAO,6BAA6B;AACpC,OAAO,wBAAwB;AAC/B,OAAO,iBAAiB;AACxB,OAAO,oBAAoB;AAC3B,OAAO,oBAAoB;AAC3B,OAAO,mBAAmB;AAC1B,OAAO,YAAY;AACnB,OAAO,qBAAqB;AAC5B,OAAO,sBAAsB;AAC7B,OAAO,qBAAqB;AAC5B,OAAO,iBAAiB;AACxB,OAAO,qBAAqB;AAC5B,OAAO,oBAAoB;AAC3B,OAAO,cAAc;AACrB,OAAO,kBAAkB;AACzB,OAAO,gCAAgC;AACvC,OAAO,iBAAiB;AACxB,OAAO,4BAA4B;AACnC,OAAO,kBAAkB;AACzB,OAAO,wBAAwB;AAC/B,OAAO,sBAAsB;AAC7B,OAAO,qBAAqB;AAC5B,OAAO,0BAA0B;AACjC,OAAO,oCAAoC;AAC3C,OAAO,6BAA6B;AACpC,OAAO,iBAAiB;AACxB,OAAO,kBAAkB;AACzB,OAAO,sCAAsC;AAC7C,OAAO,+BAA+B;AACtC,OAAO,8BAA8B;AACrC,OAAO,6BAA6B;AACpC,OAAO,+BAA+B;AACtC,OAAO,mCAAmC;AAC1C,OAAO,gBAAgB;AACvB,OAAO,sBAAsB;AAC7B,OAAO,mBAAmB;AAC1B,OAAO,cAAc;AAErB,OAAO,iCAAiC;AACxC,OAAO,uBAAuB;AAC9B,OAAO,mBAAmB;AAC1B,OAAO,oBAAoB;AAC3B,OAAO,oBAAoB;AAC3B,OAAO,0BAA0B;AACjC,OAAO,oBAAoB;AAC3B,OAAO,SAAS;AAEhB,SAAQ,sBAAqB;AAE7B,SAAQ,0BAAyB;AACjC,SAAQ,kBAAiB;AACzB;AAAA,EAAQ;AAAA,EAA+B;AAAA,EAAqC;AAAA,EAAyB;AAAA,EAA0B;AAAA,
|
|
4
|
+
"sourcesContent": ["import AccessRights from './access-rights.js';\nimport AddMissingField041 from './addMissingField041.js';\nimport AddMissingField336 from './addMissingField336.js';\nimport AddMissingField337 from './addMissingField337.js';\nimport AddMissingField338 from './addMissingField338.js';\nimport Cyrillux from './cyrillux.js';\nimport CyrilluxUsemarconReplacement from './cyrillux-usemarcon-replacement.js';\nimport DisambiguateSeriesStatements from './disambiguateSeriesStatements.js';\nimport DoubleCommas from './double-commas.js';\nimport DuplicatesInd1 from './duplicates-ind1.js';\nimport EmptyFields from './empty-fields.js';\nimport EndingPunctuation from './ending-punctuation.js';\nimport EndingWhitespace from './ending-whitespace.js';\nimport Field008CharacterGroups from './field-008-18-34-character-groups.js';\nimport Field505Separators from './field-505-separators.js';\nimport Field521Fix from './field-521-fix.js';\nimport FieldExclusion from './field-exclusion.js';\nimport FieldStructure from './field-structure.js';\nimport FieldsPresent from './fields-present.js';\nimport Fix33X from './fix-33X.js';\nimport FixCountryCodes from './fix-country-codes.js';\nimport FixLanguageCodes from './fix-language-codes.js';\nimport FixRelatorTerms from './fixRelatorTerms.js';\nimport FixSami041 from './fix-sami-041.js';\nimport FixedFields from './fixed-fields.js';\nimport IdenticalFields from './identical-fields.js';\nimport IndicatorFixes from './indicator-fixes.js';\nimport IsbnIssn from './isbn-issn.js';\nimport ItemLanguage from './item-language.js';\nimport MergeField500Lisapainokset from './mergeField500Lisapainokset.js';\nimport MergeFields from './merge-fields/index.js';\nimport MergeRelatorTermFields from './mergeRelatorTermFields.js';\nimport Modernize502 from './modernize-502.js';\nimport MultipleSubfield0s from './multiple-subfield-0.js';\nimport NonBreakingSpace from './non-breaking-space.js';\nimport NormalizeDashes from './normalize-dashes.js';\nimport NormalizeIdentifiers from './normalize-identifiers.js';\nimport NormalizeQualifyingInformation from './normalize-qualifying-information.js';\nimport NormalizeUTF8Diacritics from './normalize-utf8-diacritics.js';\nimport Punctuation from './punctuation/index.js';\nimport Punctuation2 from './punctuation2.js';\nimport ReindexSubfield6OccurenceNumbers from './reindexSubfield6OccurenceNumbers.js';\nimport Remove041zxx from './remove-041-zxx.js';\nimport RemoveDuplicateDataFields from './removeDuplicateDataFields.js';\nimport RemoveInferiorDataFields from './removeInferiorDataFields.js';\nimport ResolvableExtReferences from './resolvable-ext-references-melinda.js';\nimport ResolveOrphanedSubfield6s from './resolveOrphanedSubfield6s.js';\nimport SanitizeVocabularySourceCodes from './sanitize-vocabulary-source-codes.js';\nimport SortFields from './sortFields.js';\nimport SortRelatorTerms from './sortRelatorTerms.js';\nimport SortSubfields from './sortSubfields.js';\nimport SortTags from './sort-tags.js';\n// import StripPunctuation from './stripPunctuation'; // Can we add this here? Should be used very cautiosly!\nimport SubfieldValueNormalizations from './subfieldValueNormalizations.js';\nimport SubfieldExclusion from './subfield-exclusion.js';\nimport Sync007And300 from './sync-007-and-300.js';\nimport SyncLanguage from './sync-language.js';\nimport TranslateTerms from './translate-terms.js';\nimport TypeOfDateF008 from './typeOfDate-008.js';\nimport UnicodeDecomposition from './unicode-decomposition.js';\nimport UpdateField540 from './update-field-540.js';\nimport Urn from './urn.js';\n\nimport {getCounterpart} from './merge-fields/counterpartField.js';\n\nimport {postprocessRecords} from './merge-fields/mergeOrAddPostprocess.js';\nimport {mergeField} from './merge-fields/mergeField.js';\nimport {fieldGetOccurrenceNumberPairs, fieldGetUnambiguousOccurrenceNumber, fieldHasValidSubfield6, fieldToNormalizedString, fieldsToNormalizedString, get6s,\n isSubfield6Pair, isValidSubfield6, intToOccurrenceNumberString,\n recordGetMaxSubfield6OccurrenceNumberAsInteger, resetSubfield6Tag, subfield6ResetOccurrenceNumber, subfield6GetOccurrenceNumber,\n subfield6GetOccurrenceNumberAsInteger} from './subfield6Utils.js';\n\nimport {getSubfield8LinkingNumber, isValidSubfield8, recordGetAllSubfield8LinkingNumbers, recordGetFieldsWithSubfield8LinkingNumber} from './subfield8Utils.js';\n\nimport {recordFixRelatorTerms} from './fixRelatorTerms.js';\nimport {fieldTrimSubfieldValues} from './normalizeFieldForComparison.js';\nimport {baseHasEqualOrHigherEncodingLevel, deleteAllPrepublicationNotesFromField500InNonPubRecord, encodingLevelIsBetterThanPrepublication, getEncodingLevel, isEnnakkotietoField, isEnnakkotietoSubfield} from './prepublicationUtils.js';\nimport {melindaFieldSpecs} from './melindaCustomMergeFields.js';\n\nimport {cloneAndRemovePunctuation} from './normalizeFieldForComparison.js';\nimport {removeWorsePrepubField500s, removeWorsePrepubField594s} from './prepublicationUtils.js';\nimport {fieldFixPunctuation} from './punctuation2.js';\nimport {recordResetSubfield6OccurrenceNumbers} from './reindexSubfield6OccurenceNumbers.js';\nimport {sortAdjacentSubfields} from './sortSubfields.js';\nimport {fieldHasSubfield, fieldToString, fieldsToString, isContentSubfieldCode, tagIsRepeatable} from './utils.js';\n\nexport {\n AccessRights,\n AddMissingField041,\n AddMissingField336,\n AddMissingField337,\n AddMissingField338,\n Cyrillux,\n CyrilluxUsemarconReplacement,\n DisambiguateSeriesStatements,\n DoubleCommas,\n DuplicatesInd1,\n EmptyFields,\n EndingPunctuation,\n EndingWhitespace,\n Field008CharacterGroups,\n Field505Separators,\n Field521Fix,\n FieldExclusion,\n FieldsPresent,\n FieldStructure,\n Fix33X,\n FixCountryCodes,\n FixLanguageCodes,\n FixRelatorTerms,\n FixSami041,\n FixedFields,\n IdenticalFields,\n IndicatorFixes,\n IsbnIssn,\n ItemLanguage,\n\n MergeField500Lisapainokset,\n MergeRelatorTermFields,\n Modernize502, //\n MultipleSubfield0s,\n NonBreakingSpace,\n NormalizeDashes,\n NormalizeIdentifiers,\n NormalizeQualifyingInformation,\n NormalizeUTF8Diacritics,\n Punctuation,\n Punctuation2,\n ResolveOrphanedSubfield6s, // Do this before reindexing! (thus I'm not sticking with alphabetical order here)\n ReindexSubfield6OccurenceNumbers,\n Remove041zxx,\n RemoveDuplicateDataFields,\n RemoveInferiorDataFields,\n ResolvableExtReferences,\n SanitizeVocabularySourceCodes,\n SortRelatorTerms,\n SortSubfields,\n SortTags,\n SubfieldExclusion,\n SubfieldValueNormalizations,\n Sync007And300,\n SyncLanguage,\n TranslateTerms,\n TypeOfDateF008,\n UnicodeDecomposition,\n UpdateField540,\n Urn,\n SortFields, // Keep this penultimate\n MergeFields, // Run this last *iff* you want to use this at all\n\n // Functions for processing record... These should probably go to some other project.\n // Too specific for marc-record-js though...\n // 1. generic low level stuff\n getEncodingLevel,\n\n // 2. text normalizations + other generic utils (eg. for similarity comparisons, field merge)\n cloneAndRemovePunctuation,\n fieldFixPunctuation,\n fieldHasSubfield,\n fieldToNormalizedString,\n fieldToString,\n fieldTrimSubfieldValues,\n fieldsToNormalizedString,\n fieldsToString,\n isContentSubfieldCode,\n recordFixRelatorTerms,\n sortAdjacentSubfields,\n tagIsRepeatable,\n\n // 3. prepublication stuff\n baseHasEqualOrHigherEncodingLevel,\n deleteAllPrepublicationNotesFromField500InNonPubRecord,\n encodingLevelIsBetterThanPrepublication,\n isEnnakkotietoField,\n isEnnakkotietoSubfield,\n removeWorsePrepubField500s,\n removeWorsePrepubField594s,\n\n // 4. subfield $6 related functions\n fieldGetOccurrenceNumberPairs,\n get6s,\n fieldGetUnambiguousOccurrenceNumber,\n fieldHasValidSubfield6,\n intToOccurrenceNumberString,\n isSubfield6Pair,\n isValidSubfield6,\n recordGetMaxSubfield6OccurrenceNumberAsInteger,\n recordResetSubfield6OccurrenceNumbers,\n resetSubfield6Tag,\n subfield6ResetOccurrenceNumber,\n subfield6GetOccurrenceNumber,\n subfield6GetOccurrenceNumberAsInteger,\n\n // 5. subfield $8 related functions\n getSubfield8LinkingNumber,\n isValidSubfield8,\n recordGetAllSubfield8LinkingNumbers,\n recordGetFieldsWithSubfield8LinkingNumber,\n\n // 6. merge, other\n getCounterpart, // field merge: finds a similar field with which a field can merge\n melindaFieldSpecs, // contains information about the legal fields and subfields, and their repeatability\n mergeField,\n postprocessRecords // clean-up function that cleans up both base and source record (which may be the same)\n\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/indicator-fixes.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
import createDebugLogger from "debug";
|
|
2
|
+
import { fieldToString, nvdebug } from "./utils.js";
|
|
3
|
+
const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda:indicator-fixes");
|
|
4
|
+
const debugData = debug.extend("data");
|
|
2
5
|
export default function() {
|
|
3
6
|
return {
|
|
4
7
|
description: "Normalizes indicator values",
|
|
@@ -17,6 +20,7 @@ export default function() {
|
|
|
17
20
|
return res;
|
|
18
21
|
}
|
|
19
22
|
function validateRecord(record, res) {
|
|
23
|
+
nvdebug(record, debugData);
|
|
20
24
|
const clonedFields = JSON.parse(JSON.stringify(record.fields));
|
|
21
25
|
recordNormalizeIndicators(record);
|
|
22
26
|
record.fields.forEach((field, index) => compareFields(field, index));
|
|
@@ -174,12 +178,22 @@ function getLanguages(record) {
|
|
|
174
178
|
return true;
|
|
175
179
|
}
|
|
176
180
|
}
|
|
181
|
+
function translated041Indicator1(field) {
|
|
182
|
+
if (field.tag !== "041" || !field.subfields) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
if (field.ind1 !== "1" && field.subfields.some((sf) => ["h", "k", "m", "n"].includes(sf.code))) {
|
|
186
|
+
field.ind1 = "1";
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
177
190
|
function recordNormalizeIndicators(record) {
|
|
178
191
|
recordNormalize490(record);
|
|
179
192
|
const languages = getLanguages(record);
|
|
180
193
|
record.fields.forEach((field) => fieldNormalizeIndicators(field, record, languages));
|
|
181
194
|
}
|
|
182
195
|
function fieldNormalizeIndicators(field, record, languages) {
|
|
196
|
+
translated041Indicator1(field);
|
|
183
197
|
normalize084Indicator1(field);
|
|
184
198
|
normalize245Indicator1(field, record);
|
|
185
199
|
noDisplayConstantGenerated520Indicator1(field);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/indicator-fixes.js"],
|
|
4
|
-
"sourcesContent": ["// Relocated from melinda-marc-record-merge-reducers (and renamed)\n
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\nimport createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils.js';\n\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:indicator-fixes');\nconst debugData = debug.extend('data');\n//const debugDev = debug.extend('dev');\n\nexport default function () {\n\n return {\n description: 'Normalizes indicator values',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n recordNormalizeIndicators(record);\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n validateRecord(record, res);\n\n res.valid = res.message.length < 1;\n return res;\n }\n\n\n function validateRecord(record, res) {\n nvdebug(record, debugData);\n const clonedFields = JSON.parse(JSON.stringify(record.fields));\n recordNormalizeIndicators(record);\n\n record.fields.forEach((field, index) => compareFields(field, index));\n\n function compareFields(field, index) {\n const origFieldAsString = fieldToString(clonedFields[index]);\n //const clonedFieldAsString = fieldToString(field);\n if (clonedFields[index].ind1 !== field.ind1) {\n //nvdebug(`FIX IND1: '${clonedFields[index].ind1}' => '${field.ind1}': ${clonedFieldAsString}`, debugDev);\n res.message.push(`Expected IND1 for '${origFieldAsString}' is '${field.ind1}'`);\n }\n if (clonedFields[index].ind2 !== field.ind2) {\n //nvdebug(`FIX IND2: '${clonedFields[index].ind2}' => '${field.ind2}': ${clonedFieldAsString}`, debugDev);\n res.message.push(`Expected IND2 for '${origFieldAsString}' is '${field.ind2}'`);\n }\n }\n // Validator should not change the original record:\n record.fields = clonedFields;\n return;\n }\n}\n\n\nconst ind1NonFilingChars = ['130', '630', '730', '740'];\nconst ind2NonFilingChars = ['222', '240', '242', '243', '245', '830'];\n\nfunction hasNonFilingIndicator1(field) {\n return ind1NonFilingChars.includes(field.tag);\n}\n\nfunction modifiableIndicatorValue(value) {\n // If field contains a legit-looking value, don't try to modify it here...\n return !['9', '8', '7', '6', '5', '4', '3', '2', '1'].includes(value);\n}\n\nfunction hasNonFilingIndicator2(field) {\n return ind2NonFilingChars.includes(field.tag);\n}\n\nfunction valueBeginsWithDeterminer(value, cands) {\n return cands.find(cand => value.substring(0, cand.length) === cand);\n}\n\nfunction determineNonFilingIndicatorValue(field, languages = undefined) {\n const subfieldA = field.subfields.find(sf => sf.code === 'a');\n if (!subfieldA) {\n // nvdebug(' Subfield $a miss!', debugDev);\n return;\n }\n\n const name = subfieldA.value.toLowerCase();\n\n if (languages.includes('eng')) {\n const match = valueBeginsWithDeterminer(name, ['a ', 'an ', 'the ']);\n if (match) {\n return `${match.length}`;\n }\n }\n\n if (languages.includes('fre')) {\n const match = valueBeginsWithDeterminer(name, ['l\\'', 'le ']);\n if (match) {\n return `${match.length}`;\n }\n }\n\n if (languages.includes('ger')) {\n const match = valueBeginsWithDeterminer(name, ['das ', 'der ', 'die ']);\n if (match) {\n return `${match.length}`;\n }\n }\n\n if (languages.includes('swe')) {\n const match = valueBeginsWithDeterminer(name, ['en ', 'ett ']);\n if (match) {\n return `${match.length}`;\n }\n if (name.match(/^de[nt] /u) && !name.match(/^de[nt] som /u)) {\n return '4';\n }\n }\n\n // Fallback-ish: try to guess even without languages:\n const match = valueBeginsWithDeterminer(name, ['the ']);\n if (match) {\n return `${match.length}`;\n }\n if (name.match(/^a /u) && !languages.includes('hun') && !name.match(/^a (?:b |la )/u)) { // Skip \"a b c\", \"a la carte\"...\n return '2';\n }\n\n return '0';\n}\n\nfunction normalizeNonFilingIndicator1(field, languages = []) {\n if (!hasNonFilingIndicator1(field) || !modifiableIndicatorValue(field.ind1)) {\n return;\n }\n\n field.ind1 = determineNonFilingIndicatorValue(field, languages);\n}\n\nfunction normalizeNonFilingIndicator2(field, languages = []) {\n if (!hasNonFilingIndicator2(field) || !modifiableIndicatorValue(field.ind2)) {\n return;\n }\n\n field.ind2 = determineNonFilingIndicatorValue(field, languages);\n}\n\nconst fiktiivisenAineistonLisaluokatFI = ['El\u00E4imet', 'Erotiikka', 'Er\u00E4', 'Fantasia', 'Historia', 'Huumori', 'J\u00E4nnitys', 'Kauhu', 'Novellit', 'Romantiikka', 'Scifi', 'Sota', 'Urheilu', 'Uskonto'];\n\nfunction containsFiktiivisenAineistonLisaluokka(field) {\n // Should we check Swedish versions as well?\n return field.subfields.some(sf => sf.code === 'a' && fiktiivisenAineistonLisaluokatFI.includes(sf.value));\n}\n\nfunction normalize084Indicator1(field) {\n if (field.tag !== '084') {\n return;\n }\n\n // https://marc21.kansalliskirjasto.fi/bib/05X-08X.htm#084 and https://finto.fi/ykl/fi/page/fiktioluokka\n if (field.ind1 !== '9' && containsFiktiivisenAineistonLisaluokka(field) && field.subfields.some(sf => sf.code === '2' && sf.value === 'ykl')) {\n field.ind1 = '9';\n return;\n }\n}\n\nfunction normalize245Indicator1(field, record) {\n if (field.tag !== '245') {\n return;\n }\n const field1XX = record.get('^1..$');\n field.ind1 = field1XX.length === 0 ? '0' : '1';\n}\n\nfunction noDisplayConstantGenerated520Indicator1(field) {\n if (field.tag !== '520') {\n return;\n }\n const as = field.subfields.filter(sf => sf.code === 'a');\n // Set ind1=8 \"no display constant generated\" fro certain values (part of MELKEHITYS-2579):\n if (as.length === 1 && ['Abstract.', 'Abstrakt.', 'Abstrakti.', 'Abstract.', 'English Summary.', 'Sammandrag.', 'Tiivistelm\u00E4.'].includes(field.subfields[0].value)) {\n field.ind1 = '8';\n }\n\n}\n\nfunction normalize776Indicator2(field) {\n if (field.tag !== '776') {\n return;\n }\n // If subfield $i exists, ind2 must me '8'\n if (field.subfields.some(sf => sf.code === 'i')) {\n field.ind2 = '8';\n return;\n }\n}\n\n\nfunction recordNormalize490(record) {\n const fields490 = record.get('^490$');\n const fields8XX = record.get('^(?:800|810|811|830)$');\n\n if (fields490.length === 0) {\n return;\n }\n if (fields490.length <= fields8XX.length) {\n // Trace found for each field 490:\n fields490.forEach(f => {\n f.ind1 = '1';\n });\n return;\n }\n if (fields8XX.length === 0) { // Fields 490 are always untraced (no traces found)\n fields490.forEach(f => {\n f.ind1 = '0';\n });\n return;\n }\n // For other combinations we just can't be sure, so leave them as they are.\n}\n\n\nfunction getLanguages(record) {\n const langFields = record.get('^041$');\n\n if (langFields.length === 0) {\n return [];\n }\n\n return langFields[0].subfields.filter(sf => isRelevantSubfield(sf)).map(subfield => subfield.value);\n\n function isRelevantSubfield(subfield) {\n if (!['a', 'd', 'h'].includes(subfield.code)) {\n return false;\n }\n if (subfield.value.length !== 3) {\n return false;\n }\n // We could require /^[a-z][a-z][a-z]$/ etc as well, but it's not really that relevant.\n return true;\n }\n\n}\n\nfunction translated041Indicator1(field){\n if (field.tag !== '041' || !field.subfields) {\n return;\n }\n if (field.ind1 !== '1' && field.subfields.some(sf => ['h', 'k', 'm', 'n'].includes(sf.code))) {\n field.ind1 = '1';\n return;\n }\n\n}\n\nfunction recordNormalizeIndicators(record) {\n recordNormalize490(record);\n\n // Language is used to handle non-filing indicators\n const languages = getLanguages(record);\n\n record.fields.forEach(field => fieldNormalizeIndicators(field, record, languages));\n\n}\n\nfunction fieldNormalizeIndicators(field, record, languages) {\n translated041Indicator1(field);\n normalize084Indicator1(field);\n normalize245Indicator1(field, record);\n noDisplayConstantGenerated520Indicator1(field);\n normalizeNonFilingIndicator1(field, languages);\n normalizeNonFilingIndicator2(field, languages);\n normalize776Indicator2(field);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["match"]
|
|
7
7
|
}
|
|
@@ -3,7 +3,6 @@ import { MarcRecord } from "@natlibfi/marc-record";
|
|
|
3
3
|
import validatorFactory from "./indicator-fixes.js";
|
|
4
4
|
import { READERS } from "@natlibfi/fixura";
|
|
5
5
|
import generateTests from "@natlibfi/fixugen";
|
|
6
|
-
import createDebugLogger from "debug";
|
|
7
6
|
generateTests({
|
|
8
7
|
callback,
|
|
9
8
|
path: [import.meta.dirname, "..", "test-fixtures", "indicator-fixes"],
|
|
@@ -16,18 +15,13 @@ generateTests({
|
|
|
16
15
|
before: () => testValidatorFactory()
|
|
17
16
|
}
|
|
18
17
|
});
|
|
19
|
-
const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda/indicator-fixes:test");
|
|
20
18
|
async function testValidatorFactory() {
|
|
21
19
|
const validator = await validatorFactory();
|
|
22
20
|
assert.equal(typeof validator, "object");
|
|
23
21
|
assert.equal(typeof validator.description, "string");
|
|
24
22
|
assert.equal(typeof validator.validate, "function");
|
|
25
23
|
}
|
|
26
|
-
async function callback({ getFixture,
|
|
27
|
-
if (enabled === false) {
|
|
28
|
-
debug("TEST SKIPPED!");
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
24
|
+
async function callback({ getFixture, fix = false }) {
|
|
31
25
|
const validator = await validatorFactory();
|
|
32
26
|
const record = new MarcRecord(getFixture("record.json"));
|
|
33
27
|
const expectedResult = getFixture("expectedResult.json");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/indicator-fixes.test.js"],
|
|
4
|
-
"sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './indicator-fixes.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\
|
|
5
|
-
"mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;
|
|
4
|
+
"sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './indicator-fixes.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n//import createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'indicator-fixes'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: () => testValidatorFactory()\n }\n});\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/indicator-fixes: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, fix = false}) {\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;AAG1B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,iBAAiB;AAAA,EACpE,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,MAAM,qBAAqB;AAAA,EACrC;AACF,CAAC;AAGD,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,MAAM,MAAK,GAAG;AACjD,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
6
|
"names": []
|
|
7
7
|
}
|
package/dist/item-language.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import LanguageCodes from "langs";
|
|
1
|
+
import { francAll } from "franc";
|
|
3
2
|
import createDebugLogger from "debug";
|
|
4
|
-
|
|
3
|
+
import { nvdebug } from "./utils.js";
|
|
4
|
+
export default async function(tagPattern, threshold = 0.9) {
|
|
5
5
|
const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda/item-language");
|
|
6
|
-
const cldFactory = await loadCLD();
|
|
7
6
|
if (tagPattern instanceof RegExp) {
|
|
8
7
|
return {
|
|
9
8
|
description: "Handles invalid/missing item language code",
|
|
@@ -12,8 +11,8 @@ export default async function(tagPattern, treshold = 0.9) {
|
|
|
12
11
|
};
|
|
13
12
|
}
|
|
14
13
|
throw new Error("No tagPattern provided");
|
|
15
|
-
|
|
16
|
-
const results =
|
|
14
|
+
function validate(record) {
|
|
15
|
+
const results = checkLanguage(record);
|
|
17
16
|
if (results.failed) {
|
|
18
17
|
return { valid: Boolean(results.currentCode), messages: ["Language detection failed"] };
|
|
19
18
|
}
|
|
@@ -27,8 +26,8 @@ export default async function(tagPattern, treshold = 0.9) {
|
|
|
27
26
|
return { valid: Boolean(results.currentCode), messages: [`Item language code is invalid. Current code: ${results.currentCode}, suggestions: ${results.suggested.join()}`] };
|
|
28
27
|
}
|
|
29
28
|
}
|
|
30
|
-
|
|
31
|
-
const results =
|
|
29
|
+
function fix(record) {
|
|
30
|
+
const results = checkLanguage(record);
|
|
32
31
|
if (results.suggested && results.currentCode) {
|
|
33
32
|
return;
|
|
34
33
|
}
|
|
@@ -69,60 +68,63 @@ export default async function(tagPattern, treshold = 0.9) {
|
|
|
69
68
|
}
|
|
70
69
|
}
|
|
71
70
|
}
|
|
72
|
-
|
|
71
|
+
function checkLanguage(record) {
|
|
73
72
|
const text = getText(record);
|
|
74
73
|
const langCode = getLanguageCode(record);
|
|
75
|
-
|
|
74
|
+
if (["mul", "sgn", "und", "zxx"].includes(langCode)) {
|
|
75
|
+
return { failed: true, currentCode: langCode };
|
|
76
|
+
}
|
|
76
77
|
if (text.length === 0) {
|
|
77
|
-
Identifier.dispose();
|
|
78
78
|
return { failed: true, currentCode: langCode };
|
|
79
79
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
if (results.probability >= treshold) {
|
|
85
|
-
return {
|
|
86
|
-
detected: get2TLangCode(results.language),
|
|
87
|
-
currentCode: langCode
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
return {
|
|
91
|
-
currentCode: langCode,
|
|
92
|
-
suggested: [get2TLangCode(results.language)]
|
|
93
|
-
};
|
|
94
|
-
}
|
|
80
|
+
const results = francAll(text);
|
|
81
|
+
const [francLang, probability] = results[0];
|
|
82
|
+
nvdebug(`FRANC ${langCode}/${threshold} vs ${francLang}/${probability}`, debug);
|
|
83
|
+
if (francLang === "und") {
|
|
95
84
|
return { failed: true, currentCode: langCode };
|
|
96
|
-
} catch (err) {
|
|
97
|
-
try {
|
|
98
|
-
Identifier.dispose();
|
|
99
|
-
} catch (err2) {
|
|
100
|
-
debug(`Got error disposing identifier: ${err2 instanceof Error ? err2.stack : err2}`);
|
|
101
|
-
}
|
|
102
|
-
throw err instanceof Error ? err : new Error(err.message);
|
|
103
85
|
}
|
|
86
|
+
if (probability >= threshold) {
|
|
87
|
+
return {
|
|
88
|
+
detected: francLang,
|
|
89
|
+
currentCode: langCode
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
if (probability > 0) {
|
|
93
|
+
return {
|
|
94
|
+
currentCode: langCode,
|
|
95
|
+
suggested: [francLang]
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
return { failed: true, currentCode: langCode };
|
|
104
99
|
function getText(record2) {
|
|
105
100
|
return record2.get(tagPattern).reduce((acc, field) => {
|
|
106
101
|
const fieldText = field.subfields.find((sf) => sf.code === "a").value;
|
|
107
102
|
return `${acc}${fieldText}`;
|
|
108
103
|
}, "");
|
|
109
104
|
}
|
|
105
|
+
function isValidLanguageCode(code) {
|
|
106
|
+
if (!/^[a-z][a-z][a-z]$/u.test(code)) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
110
111
|
function getLanguageCode(record2) {
|
|
111
112
|
const [f008] = record2.get(/^008$/u);
|
|
112
113
|
if (f008) {
|
|
113
114
|
const code = f008.value.slice(35, 38);
|
|
114
|
-
if (
|
|
115
|
+
if (isValidLanguageCode(code)) {
|
|
115
116
|
return code;
|
|
116
117
|
}
|
|
117
118
|
}
|
|
118
119
|
const [f041] = record2.get(/^041$/u);
|
|
119
120
|
if (f041) {
|
|
120
|
-
const
|
|
121
|
-
|
|
121
|
+
const subfield = f041.subfields.find((sf) => ["a"].includes(sf.code) && isValidLanguageCode(sf.value));
|
|
122
|
+
if (!subfield) {
|
|
123
|
+
return void 0;
|
|
124
|
+
}
|
|
125
|
+
return subfield.value;
|
|
122
126
|
}
|
|
123
|
-
|
|
124
|
-
function get2TLangCode(code) {
|
|
125
|
-
return LanguageCodes.where("1", code)["2T"];
|
|
127
|
+
return void 0;
|
|
126
128
|
}
|
|
127
129
|
}
|
|
128
130
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/item-language.js"],
|
|
4
|
-
"sourcesContent": ["import {
|
|
5
|
-
"mappings": "AAAA,SAAQ,
|
|
4
|
+
"sourcesContent": ["import {francAll} from 'franc';\n\nimport createDebugLogger from 'debug';\nimport {nvdebug} from './utils.js';\n\n// NB! Should we support 041$d? (Audio books use it, don't they?)\n\nexport default async function (tagPattern, threshold = 0.9) {\n const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/item-language');\n\n if (tagPattern instanceof RegExp) {\n return {\n description:\n 'Handles invalid/missing item language code',\n validate,\n fix\n };\n }\n\n throw new Error('No tagPattern provided');\n\n function validate(record) {\n const results = checkLanguage(record);\n\n if (results.failed) {\n return {valid: Boolean(results.currentCode), messages: ['Language detection failed']};\n }\n\n if (results.detected) {\n if (results.detected !== results.currentCode) {\n return {valid: false, messages: [`Item language code is invalid. Correct language code: ${results.detected}`]};\n }\n\n return {valid: true};\n }\n\n if (results.suggested) {\n return {valid: Boolean(results.currentCode), messages: [`Item language code is invalid. Current code: ${results.currentCode}, suggestions: ${results.suggested.join()}`]};\n }\n }\n\n function fix(record) {\n const results = checkLanguage(record);\n\n if (results.suggested && results.currentCode) {\n return;\n }\n\n if (results.failed && !results.currentCode) {\n return;\n }\n\n if (results.detected && results.detected !== results.currentCode) {\n const f008 = record.get(/^008$/u).shift();\n\n if (f008) {\n const start = f008.value.slice(0, 35);\n const end = f008.value.slice(38);\n f008.value = `${start}${results.detected}${end}`;\n }\n\n const f041 = record.get(/^041$/u).shift();\n\n if (f041) {\n const subfield = f041.subfields.find(sf => sf.code === 'a');\n\n if (subfield) {\n subfield.value = results.detected;\n } else {\n f041.subfields.push({code: 'a', value: results.detected});\n f041.subfields.sort((a, b) => {\n if (a.code < b.code) {\n return -1;\n }\n\n if (a.code > b.code) {\n return 1;\n }\n\n return 0;\n });\n }\n } else {\n record.insertField({tag: '041', ind1: ' ', ind2: ' ', subfields: [\n {\n code: 'a',\n value: results.detected\n }\n ]});\n }\n }\n }\n\n function checkLanguage(record) {\n const text = getText(record);\n const langCode = getLanguageCode(record);\n\n // We don't want to change these no matter what the abstract says.\n if (['mul', 'sgn', 'und', 'zxx'].includes(langCode)) {\n return {failed: true, currentCode: langCode};\n }\n\n if (text.length === 0) {\n return {failed: true, currentCode: langCode};\n }\n\n const results = francAll(text);\n\n const [francLang, probability] = results[0];\n\n nvdebug(`FRANC ${langCode}/${threshold} vs ${francLang}/${probability}`, debug);\n\n if (francLang === 'und') { // franc returns ['und', 1.0] for failure!\n return {failed: true, currentCode: langCode};\n }\n\n if (probability >= threshold) {\n return {\n detected: francLang,\n currentCode: langCode\n };\n }\n\n if (probability > 0.0) {\n return {\n currentCode: langCode,\n suggested: [francLang]\n };\n }\n\n return {failed: true, currentCode: langCode};\n\n function getText(record) {\n return record.get(tagPattern).reduce((acc, field) => {\n const fieldText = field.subfields.find(sf => sf.code === 'a').value;\n return `${acc}${fieldText}`;\n }, '');\n }\n\n\n function isValidLanguageCode(code) {\n if (!(/^[a-z][a-z][a-z]$/u).test(code)) {\n return false;\n }\n return true;\n }\n\n function getLanguageCode(record) {\n const [f008] = record.get(/^008$/u);\n\n if (f008) {\n const code = f008.value.slice(35, 38);\n if(isValidLanguageCode(code)) {\n return code;\n }\n }\n\n const [f041] = record.get(/^041$/u);\n\n if (f041) {\n const subfield = f041.subfields.find(sf => ['a'].includes(sf.code) && isValidLanguageCode(sf.value)); // sami languages are not supported by franc, so don't worry about smi/sme logic.\n if (!subfield) {\n return undefined;\n }\n return subfield.value;\n }\n return undefined;\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["record"]
|
|
7
7
|
}
|
|
@@ -93,8 +93,8 @@ describe("item-language", () => {
|
|
|
93
93
|
const result = await validator.validate(record);
|
|
94
94
|
assert.deepEqual(result, { valid: false, messages: ["Item language code is invalid. Correct language code: eng"] });
|
|
95
95
|
});
|
|
96
|
-
it("Finds the record invalid (Probability doesn't meet
|
|
97
|
-
const validator = await validatorFactory(/^520$/u, 1);
|
|
96
|
+
it("Finds the record invalid (Probability doesn't meet threshold)", async () => {
|
|
97
|
+
const validator = await validatorFactory(/^520$/u, 1.1);
|
|
98
98
|
const record = new MarcRecord({
|
|
99
99
|
fields: [
|
|
100
100
|
{
|
|
@@ -139,7 +139,7 @@ describe("item-language", () => {
|
|
|
139
139
|
}
|
|
140
140
|
]
|
|
141
141
|
});
|
|
142
|
-
const result =
|
|
142
|
+
const result = validator.validate(record);
|
|
143
143
|
assert.deepEqual(result, { valid: true, messages: ["Language detection failed"] });
|
|
144
144
|
});
|
|
145
145
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/item-language.test.js"],
|
|
4
|
-
"sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './item-language.js';\nimport {describe, it} from 'node:test';\n\ndescribe('item-language', () => {\n it('Creates a validator', async () => {\n const validator = await validatorFactory(/^520$/u);\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n });\n\n it('Throws an error when tagPattern is not provided', async () => {\n await assert.rejects(validatorFactory(), (err) => {\n assert.equal(err instanceof Error, true);\n assert.equal(err.message, 'No tagPattern provided');\n return true;\n });\n //await assert(validatorFactory()).to.be.rejectedWith(Error, 'No tagPattern provided');\n });\n\n describe('#validate', () => {\n it('Finds the record valid', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'fin'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: '',\n subfields: [\n {\n code: 'a',\n value: 'Matti Yl\u00F6sen Veroparatiisit on kirja siit\u00E4, kuinka miljon\u00E4\u00E4rit ja monikansalliset yritykset ovat 20 vuoden aikana siirt\u00E4neet kiihtyv\u00E4ll\u00E4 tahdilla tulojaan s\u00E4\u00E4telyn ja verottajan ulottumattomiin korkeiden pankkisalaisuuslakien suojiin. Samoihin keitaisiin, joita my\u00F6s kansainv\u00E4linen rikollisuus k\u00E4ytt\u00E4\u00E4 rahanpesuun. Suomi on toistaiseksi ollut osa ongelmaa, ei sen ratkaisua.\\nKirja sis\u00E4lt\u00E4\u00E4 n\u00E4k\u00F6kulmia ja kiinnekohtia demokratian, hyvinvointivaltion ja kilpailullisen markkinatalouden kriiseihin. Mukana my\u00F6s toimintaehdotuksia, joita Suomen tulee ajaa veroparatiisiongelman ratkaisemiseksi. Veroparatiisit on ajankohtainen tietopaketti veronkierron mekanismeista ja vaikutuksista.'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: true});\n });\n\n it('Finds the record invalid (Language code is missing and detection failed', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '520',\n ind1: ' ',\n ind2: '',\n subfields: [\n {\n code: 'a',\n value: '.'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: false, messages: ['Language detection failed']});\n });\n\n it('Finds the record invalid (Detected language differs)', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'fin'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: '',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: false, messages: ['Item language code is invalid. Correct language code: eng']});\n });\n\n it('Finds the record invalid (Probability doesn\\'t meet treshold)', async () => {\n const validator = await validatorFactory(/^520$/u, 1);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'fin'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: '',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: true, messages: ['Item language code is invalid. Current code: fin, suggestions: eng']});\n });\n\n it('Finds the record invalid (No detectable text)', async () => {\n const validator = await validatorFactory(/^520$/u, 1);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'fin'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: true, messages: ['Language detection failed']});\n });\n });\n\n describe('#fix', () => {\n it('Fixes the record', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'eng'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]\n });\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|eng|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'eng'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]);\n });\n\n it('Fixes the record (Insert missing fields)', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]\n });\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|eng|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'eng'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]);\n });\n\n it('Fixes the record (Insert missing subfields)', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'b', value: 'foo'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]\n });\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|eng|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'eng'}, {code: 'b', value: 'foo'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]);\n });\n\n it('Fails to fix the record', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '520',\n ind1: ' ',\n ind2: '',\n subfields: [\n {\n code: 'a',\n value: '.'\n }\n ]\n }\n ]\n });\n\n try {\n await validator.fix(record);\n } catch (err) {\n assert.equal(err.message, 'Language code is missing and detection failed');\n }\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,UAAU,UAAS;AAE3B,SAAS,iBAAiB,MAAM;AAC9B,KAAG,uBAAuB,YAAY;AACpC,UAAM,YAAY,MAAM,iBAAiB,QAAQ;AAEjD,WAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,WAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,WAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AAAA,EACpD,CAAC;AAED,KAAG,mDAAmD,YAAY;AAChE,UAAM,OAAO,QAAQ,iBAAiB,GAAG,CAAC,QAAQ;AAChD,aAAO,MAAM,eAAe,OAAO,IAAI;AACvC,aAAO,MAAM,IAAI,SAAS,wBAAwB;AAClD,aAAO;AAAA,IACT,CAAC;AAAA,EAEH,CAAC;AAED,WAAS,aAAa,MAAM;AAC1B,OAAG,0BAA0B,YAAY;AACvC,YAAM,YAAY,MAAM,iBAAiB,QAAQ;AACjD,YAAM,SAAS,IAAI,WAAW;AAAA,QAC5B,QAAQ;AAAA,UACN;AAAA,YACE,KAAK;AAAA,YACL,MAAM;AAAA,YACN,MAAM;AAAA,YACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,MAAK,CAAC;AAAA,UACvC;AAAA,UACA;AAAA,YACE,KAAK;AAAA,YACL,MAAM;AAAA,YACN,MAAM;AAAA,YACN,WAAW;AAAA,cACT;AAAA,gBACE,MAAM;AAAA,gBACN,OAAO;AAAA,cACT;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AACD,YAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAE9C,aAAO,UAAU,QAAQ,EAAC,OAAO,KAAI,CAAC;AAAA,IACxC,CAAC;AAED,OAAG,2EAA2E,YAAY;AACxF,YAAM,YAAY,MAAM,iBAAiB,QAAQ;AACjD,YAAM,SAAS,IAAI,WAAW;AAAA,QAC5B,QAAQ;AAAA,UACN;AAAA,YACE,KAAK;AAAA,YACL,MAAM;AAAA,YACN,MAAM;AAAA,YACN,WAAW;AAAA,cACT;AAAA,gBACE,MAAM;AAAA,gBACN,OAAO;AAAA,cACT;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AACD,YAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAE9C,aAAO,UAAU,QAAQ,EAAC,OAAO,OAAO,UAAU,CAAC,2BAA2B,EAAC,CAAC;AAAA,IAClF,CAAC;AAED,OAAG,wDAAwD,YAAY;AACrE,YAAM,YAAY,MAAM,iBAAiB,QAAQ;AACjD,YAAM,SAAS,IAAI,WAAW;AAAA,QAC5B,QAAQ;AAAA,UACN;AAAA,YACE,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,KAAK;AAAA,YACL,MAAM;AAAA,YACN,MAAM;AAAA,YACN,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,MAAK,CAAC;AAAA,UACvC;AAAA,UACA;AAAA,YACE,KAAK;AAAA,YACL,MAAM;AAAA,YACN,MAAM;AAAA,YACN,WAAW;AAAA,cACT;AAAA,gBACE,MAAM;AAAA,gBACN,OAAO;AAAA,cACT;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AACD,YAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAE9C,aAAO,UAAU,QAAQ,EAAC,OAAO,OAAO,UAAU,CAAC,2DAA2D,EAAC,CAAC;AAAA,IAClH,CAAC;AAED,OAAG,
|
|
4
|
+
"sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './item-language.js';\nimport {describe, it} from 'node:test';\n\ndescribe('item-language', () => {\n it('Creates a validator', async () => {\n const validator = await validatorFactory(/^520$/u);\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n });\n\n it('Throws an error when tagPattern is not provided', async () => {\n await assert.rejects(validatorFactory(), (err) => {\n assert.equal(err instanceof Error, true);\n assert.equal(err.message, 'No tagPattern provided');\n return true;\n });\n //await assert(validatorFactory()).to.be.rejectedWith(Error, 'No tagPattern provided');\n });\n\n describe('#validate', () => {\n it('Finds the record valid', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'fin'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: '',\n subfields: [\n {\n code: 'a',\n value: 'Matti Yl\u00F6sen Veroparatiisit on kirja siit\u00E4, kuinka miljon\u00E4\u00E4rit ja monikansalliset yritykset ovat 20 vuoden aikana siirt\u00E4neet kiihtyv\u00E4ll\u00E4 tahdilla tulojaan s\u00E4\u00E4telyn ja verottajan ulottumattomiin korkeiden pankkisalaisuuslakien suojiin. Samoihin keitaisiin, joita my\u00F6s kansainv\u00E4linen rikollisuus k\u00E4ytt\u00E4\u00E4 rahanpesuun. Suomi on toistaiseksi ollut osa ongelmaa, ei sen ratkaisua.\\nKirja sis\u00E4lt\u00E4\u00E4 n\u00E4k\u00F6kulmia ja kiinnekohtia demokratian, hyvinvointivaltion ja kilpailullisen markkinatalouden kriiseihin. Mukana my\u00F6s toimintaehdotuksia, joita Suomen tulee ajaa veroparatiisiongelman ratkaisemiseksi. Veroparatiisit on ajankohtainen tietopaketti veronkierron mekanismeista ja vaikutuksista.'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: true});\n });\n\n it('Finds the record invalid (Language code is missing and detection failed', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '520',\n ind1: ' ',\n ind2: '',\n subfields: [\n {\n code: 'a',\n value: '.'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: false, messages: ['Language detection failed']});\n });\n\n it('Finds the record invalid (Detected language differs)', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'fin'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: '',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: false, messages: ['Item language code is invalid. Correct language code: eng']});\n });\n\n it('Finds the record invalid (Probability doesn\\'t meet threshold)', async () => {\n const validator = await validatorFactory(/^520$/u, 1.1); // franc (unlike cld3) returns 1.0 for this, so I use threshold 1.1 to make test fail...\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'fin'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: '',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n assert.deepEqual(result, {valid: true, messages: ['Item language code is invalid. Current code: fin, suggestions: eng']});\n });\n\n it('Finds the record invalid (No detectable text)', async () => {\n const validator = await validatorFactory(/^520$/u, 1);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'fin'}]\n }\n ]\n });\n const result = validator.validate(record);\n\n assert.deepEqual(result, {valid: true, messages: ['Language detection failed']});\n });\n });\n\n describe('#fix', () => {\n it('Fixes the record', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'eng'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]\n });\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|eng|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'eng'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]);\n });\n\n it('Fixes the record (Insert missing fields)', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]\n });\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|eng|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'eng'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]);\n });\n\n it('Fixes the record (Insert missing subfields)', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|fin|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'b', value: 'foo'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]\n });\n await validator.fix(record);\n\n assert.deepEqual(record.fields, [\n {\n tag: '008',\n value: '151118t20162016fi^a|||^^^^^^^|0|^0|eng|^'\n },\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'eng'}, {code: 'b', value: 'foo'}]\n },\n {\n tag: '520',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.'\n }\n ]\n }\n ]);\n });\n\n it('Fails to fix the record', async () => {\n const validator = await validatorFactory(/^520$/u);\n const record = new MarcRecord({\n fields: [\n {\n tag: '520',\n ind1: ' ',\n ind2: '',\n subfields: [\n {\n code: 'a',\n value: '.'\n }\n ]\n }\n ]\n });\n\n try {\n await validator.fix(record);\n } catch (err) {\n assert.equal(err.message, 'Language code is missing and detection failed');\n }\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -4360,6 +4360,37 @@ export const melindaFieldSpecs = { "fields": [
|
|
|
4360
4360
|
{ "code": "8", "repeatable": true }
|
|
4361
4361
|
]
|
|
4362
4362
|
},
|
|
4363
|
+
{
|
|
4364
|
+
"tag": "857",
|
|
4365
|
+
"repeatable": true,
|
|
4366
|
+
"fieldType": "dataField",
|
|
4367
|
+
"indicators": { "ind1": [" ", "1", "4", "7"], "ind2": [" ", "0", "1", "2", "3", "4", "8"] },
|
|
4368
|
+
"subfields": [
|
|
4369
|
+
{ "code": "b", "repeatable": false },
|
|
4370
|
+
{ "code": "c", "repeatable": false },
|
|
4371
|
+
{ "code": "d", "repeatable": false },
|
|
4372
|
+
{ "code": "e", "repeatable": true },
|
|
4373
|
+
{ "code": "f", "repeatable": false },
|
|
4374
|
+
{ "code": "g", "repeatable": true },
|
|
4375
|
+
{ "code": "h", "repeatable": true },
|
|
4376
|
+
{ "code": "l", "repeatable": true },
|
|
4377
|
+
{ "code": "m", "repeatable": true },
|
|
4378
|
+
{ "code": "n", "repeatable": true },
|
|
4379
|
+
{ "code": "q", "repeatable": true },
|
|
4380
|
+
{ "code": "r", "repeatable": true },
|
|
4381
|
+
{ "code": "s", "repeatable": true },
|
|
4382
|
+
{ "code": "t", "repeatable": true },
|
|
4383
|
+
{ "code": "u", "repeatable": true },
|
|
4384
|
+
{ "code": "x", "repeatable": true },
|
|
4385
|
+
{ "code": "y", "repeatable": true },
|
|
4386
|
+
{ "code": "z", "repeatable": true },
|
|
4387
|
+
{ "code": "2", "repeatable": false },
|
|
4388
|
+
{ "code": "3", "repeatable": false },
|
|
4389
|
+
{ "code": "6", "repeatable": false },
|
|
4390
|
+
{ "code": "7", "repeatable": false },
|
|
4391
|
+
{ "code": "8", "repeatable": true }
|
|
4392
|
+
]
|
|
4393
|
+
},
|
|
4363
4394
|
{
|
|
4364
4395
|
"tag": "863",
|
|
4365
4396
|
"repeatable": true,
|