@natlibfi/marc-record-validators-melinda 11.6.7 → 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
|
@@ -1,46 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
exports.default = _default;
|
|
7
|
-
exports.recordFixSubfield6OccurrenceNumbers = recordFixSubfield6OccurrenceNumbers;
|
|
8
|
-
var _debug = _interopRequireDefault(require("debug"));
|
|
9
|
-
var _utils = require("./utils");
|
|
10
|
-
var _subfield6Utils = require("./subfield6Utils");
|
|
11
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
-
// Relocated from melinda-marc-record-merge-reducers (and renamed)
|
|
13
|
-
|
|
14
|
-
const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda:resolveOrphanedSubfield6s');
|
|
15
|
-
function _default() {
|
|
1
|
+
import createDebugLogger from "debug";
|
|
2
|
+
import { fieldHasSubfield, fieldToString, nvdebug, subfieldToString } from "./utils.js";
|
|
3
|
+
import { fieldHasWantedTagAndOccurrenceNumber, isValidSubfield6, subfield6GetOccurrenceNumber, subfield6ResetOccurrenceNumber } from "./subfield6Utils.js";
|
|
4
|
+
const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda:resolveOrphanedSubfield6s");
|
|
5
|
+
export default function() {
|
|
16
6
|
return {
|
|
17
|
-
description:
|
|
7
|
+
description: "Remove occurrence-number-orphaned $6 subfields. In field 880, occurrence number becomes 00",
|
|
18
8
|
validate,
|
|
19
9
|
fix
|
|
20
10
|
};
|
|
21
11
|
function fix(record) {
|
|
22
|
-
|
|
23
|
-
const res = {
|
|
24
|
-
message: [],
|
|
25
|
-
fix: [],
|
|
26
|
-
valid: true
|
|
27
|
-
};
|
|
28
|
-
//message.fix = [];
|
|
29
|
-
|
|
30
|
-
// This can not really fail...
|
|
12
|
+
nvdebug("Fix SF6 orphaned occurrence numbers");
|
|
13
|
+
const res = { message: [], fix: [], valid: true };
|
|
31
14
|
recordFixSubfield6OccurrenceNumbers(record);
|
|
32
|
-
|
|
33
|
-
//message.valid = !(message.message.length >= 1);
|
|
34
15
|
return res;
|
|
35
16
|
}
|
|
36
17
|
function validate(record) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
const fieldsContainingSubfield6 = record.fields.filter(field => (0, _utils.fieldHasSubfield)(field, '6'));
|
|
18
|
+
nvdebug("Validate SF6 orphaned occurrence numbers", debug);
|
|
19
|
+
const fieldsContainingSubfield6 = record.fields.filter((field) => fieldHasSubfield(field, "6"));
|
|
40
20
|
const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);
|
|
41
|
-
const res = {
|
|
42
|
-
message: []
|
|
43
|
-
};
|
|
21
|
+
const res = { message: [] };
|
|
44
22
|
if (orphanedFields.length > 0) {
|
|
45
23
|
res.message = [`${orphanedFields.length} orphaned occurrence number field(s) detected`];
|
|
46
24
|
}
|
|
@@ -48,19 +26,16 @@ function _default() {
|
|
|
48
26
|
return res;
|
|
49
27
|
}
|
|
50
28
|
}
|
|
51
|
-
function recordFixSubfield6OccurrenceNumbers(record) {
|
|
52
|
-
const fieldsContainingSubfield6 = record.fields.filter(field =>
|
|
29
|
+
export function recordFixSubfield6OccurrenceNumbers(record) {
|
|
30
|
+
const fieldsContainingSubfield6 = record.fields.filter((field) => fieldHasSubfield(field, "6"));
|
|
53
31
|
const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);
|
|
54
|
-
orphanedFields.forEach(field => fieldFixOrphanedSubfields(field));
|
|
55
|
-
|
|
32
|
+
orphanedFields.forEach((field) => fieldFixOrphanedSubfields(field));
|
|
56
33
|
function fieldFixOrphanedSubfields(field) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
field.subfields.forEach(sf => field880FixOrphanedSubfield(sf)); // eslint-disable-line array-callback-return
|
|
34
|
+
if (field.tag === "880") {
|
|
35
|
+
field.subfields.forEach((sf) => field880FixOrphanedSubfield(sf));
|
|
60
36
|
return;
|
|
61
37
|
}
|
|
62
|
-
|
|
63
|
-
const remainingSubfields = field.subfields.filter(sf => !isOrphanedSubfield(sf, field.tag, fieldsContainingSubfield6));
|
|
38
|
+
const remainingSubfields = field.subfields.filter((sf) => !isOrphanedSubfield(sf, field.tag, fieldsContainingSubfield6));
|
|
64
39
|
if (remainingSubfields.length === 0) {
|
|
65
40
|
record.removeField(field);
|
|
66
41
|
return;
|
|
@@ -68,47 +43,41 @@ function recordFixSubfield6OccurrenceNumbers(record) {
|
|
|
68
43
|
field.subfields = remainingSubfields;
|
|
69
44
|
}
|
|
70
45
|
function field880FixOrphanedSubfield(subfield) {
|
|
71
|
-
if (!isOrphanedSubfield(subfield,
|
|
46
|
+
if (!isOrphanedSubfield(subfield, "880", fieldsContainingSubfield6)) {
|
|
72
47
|
return;
|
|
73
48
|
}
|
|
74
|
-
|
|
75
|
-
(0, _subfield6Utils.subfield6ResetOccurrenceNumber)(subfield, '00');
|
|
49
|
+
subfield6ResetOccurrenceNumber(subfield, "00");
|
|
76
50
|
}
|
|
77
51
|
}
|
|
78
52
|
function findPairForSubfield6OccurrenceNumber(subfield6, myTag, candPairFields) {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
return undefined;
|
|
53
|
+
if (!isValidSubfield6(subfield6)) {
|
|
54
|
+
return void 0;
|
|
82
55
|
}
|
|
83
|
-
|
|
84
|
-
candPairFields.forEach(field =>
|
|
85
|
-
|
|
86
|
-
// Only valid $6 value that fails to map to another field is iffy...
|
|
56
|
+
nvdebug(`LOOKING FOR PAIR: ${myTag} ${subfieldToString(subfield6)}`);
|
|
57
|
+
candPairFields.forEach((field) => fieldToString(field));
|
|
87
58
|
const referredTag = subfield6.value.substring(0, 3);
|
|
88
|
-
const occurrenceNumber =
|
|
89
|
-
if (occurrenceNumber ===
|
|
90
|
-
return
|
|
59
|
+
const occurrenceNumber = subfield6GetOccurrenceNumber(subfield6);
|
|
60
|
+
if (occurrenceNumber === "00") {
|
|
61
|
+
return void 0;
|
|
91
62
|
}
|
|
92
63
|
const tagAndOccurrenceNumber = `${myTag}-${occurrenceNumber}`;
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const relevantFields = candPairFields.filter(field => field.tag === referredTag && (0, _subfield6Utils.fieldHasWantedTagAndOccurrenceNumber)(field, tagAndOccurrenceNumber));
|
|
64
|
+
nvdebug(`Try to find occurrence number ${tagAndOccurrenceNumber} in field ${referredTag}...`);
|
|
65
|
+
const relevantFields = candPairFields.filter((field) => field.tag === referredTag && fieldHasWantedTagAndOccurrenceNumber(field, tagAndOccurrenceNumber));
|
|
96
66
|
if (relevantFields.length === 0) {
|
|
97
|
-
return
|
|
67
|
+
return void 0;
|
|
98
68
|
}
|
|
99
|
-
// This should always return just one (not sanity checking this for now):
|
|
100
69
|
return relevantFields[0];
|
|
101
70
|
}
|
|
102
71
|
function isOrphanedSubfield(subfield, tag, pairCandidateFields) {
|
|
103
|
-
if (!
|
|
72
|
+
if (!isValidSubfield6(subfield) || subfield6GetOccurrenceNumber(subfield) === "00") {
|
|
104
73
|
return false;
|
|
105
74
|
}
|
|
106
75
|
return !findPairForSubfield6OccurrenceNumber(subfield, tag, pairCandidateFields);
|
|
107
76
|
}
|
|
108
77
|
function isOrphanedField(field, candidatePairFields) {
|
|
109
|
-
return field.subfields.some(sf => isOrphanedSubfield(sf, field.tag, candidatePairFields));
|
|
78
|
+
return field.subfields.some((sf) => isOrphanedSubfield(sf, field.tag, candidatePairFields));
|
|
110
79
|
}
|
|
111
80
|
function getOrphanedFields(relevantFields) {
|
|
112
|
-
return relevantFields.filter(field => isOrphanedField(field, relevantFields));
|
|
81
|
+
return relevantFields.filter((field) => isOrphanedField(field, relevantFields));
|
|
113
82
|
}
|
|
114
|
-
//# sourceMappingURL=resolveOrphanedSubfield6s.js.map
|
|
83
|
+
//# sourceMappingURL=resolveOrphanedSubfield6s.js.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/resolveOrphanedSubfield6s.js"],
|
|
4
|
+
"sourcesContent": ["import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString, nvdebug, subfieldToString} from './utils.js';\nimport {fieldHasWantedTagAndOccurrenceNumber, isValidSubfield6, subfield6GetOccurrenceNumber, subfield6ResetOccurrenceNumber} from './subfield6Utils.js';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:resolveOrphanedSubfield6s');\n\nexport default function () {\n return {\n description: 'Remove occurrence-number-orphaned $6 subfields. In field 880, occurrence number becomes 00',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix SF6 orphaned occurrence numbers');\n const res = {message: [], fix: [], valid: true};\n //message.fix = [];\n\n // This can not really fail...\n recordFixSubfield6OccurrenceNumbers(record);\n\n //message.valid = !(message.message.length >= 1);\n return res;\n }\n\n function validate(record) {\n // Check max, and check number of different indexes\n nvdebug('Validate SF6 orphaned occurrence numbers', debug);\n const fieldsContainingSubfield6 = record.fields.filter(field => fieldHasSubfield(field, '6'));\n\n const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);\n\n const res = {message: []};\n\n if (orphanedFields.length > 0) {\n res.message = [`${orphanedFields.length} orphaned occurrence number field(s) detected`];\n }\n res.valid = res.message.length < 1;\n return res;\n }\n}\n\nexport function recordFixSubfield6OccurrenceNumbers(record) {\n const fieldsContainingSubfield6 = record.fields.filter(field => fieldHasSubfield(field, '6'));\n const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);\n\n orphanedFields.forEach(field => fieldFixOrphanedSubfields(field));\n\n function fieldFixOrphanedSubfields(field) {\n // Field 880: orphaned $6 subfields: occurrence number is changed to '00':\n if (field.tag === '880') {\n field.subfields.forEach(sf => field880FixOrphanedSubfield(sf));\n return;\n }\n // Non-880 fields get their orphaned $6s removed:\n const remainingSubfields = field.subfields.filter(sf => !isOrphanedSubfield(sf, field.tag, fieldsContainingSubfield6));\n if (remainingSubfields.length === 0) {\n record.removeField(field);\n return;\n }\n field.subfields = remainingSubfields;\n }\n\n function field880FixOrphanedSubfield(subfield) {\n if (!isOrphanedSubfield(subfield, '880', fieldsContainingSubfield6)) {\n return;\n }\n // convert occurrence number to 00\n subfield6ResetOccurrenceNumber(subfield, '00');\n }\n}\n\n\nfunction findPairForSubfield6OccurrenceNumber(subfield6, myTag, candPairFields) {\n // We keep the crap!\n if (!isValidSubfield6(subfield6)) {\n return undefined;\n }\n nvdebug(`LOOKING FOR PAIR: ${myTag} ${subfieldToString(subfield6)}`);\n candPairFields.forEach(field => fieldToString(field));\n\n // Only valid $6 value that fails to map to another field is iffy...\n const referredTag = subfield6.value.substring(0, 3);\n\n const occurrenceNumber = subfield6GetOccurrenceNumber(subfield6);\n if (occurrenceNumber === '00') {\n return undefined;\n }\n const tagAndOccurrenceNumber = `${myTag}-${occurrenceNumber}`;\n nvdebug(`Try to find occurrence number ${tagAndOccurrenceNumber} in field ${referredTag}...`);\n //const relevantFields = fields.filter(field => field.tag === referredTag && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber));\n const relevantFields = candPairFields.filter(field => field.tag === referredTag && fieldHasWantedTagAndOccurrenceNumber(field, tagAndOccurrenceNumber));\n if (relevantFields.length === 0) {\n return undefined;\n }\n // This should always return just one (not sanity checking this for now):\n return relevantFields[0];\n}\n\nfunction isOrphanedSubfield(subfield, tag, pairCandidateFields) {\n if (!isValidSubfield6(subfield) || subfield6GetOccurrenceNumber(subfield) === '00') {\n return false;\n }\n return !findPairForSubfield6OccurrenceNumber(subfield, tag, pairCandidateFields);\n}\n\n\nfunction isOrphanedField(field, candidatePairFields) {\n return field.subfields.some(sf => isOrphanedSubfield(sf, field.tag, candidatePairFields));\n}\n\nfunction getOrphanedFields(relevantFields) {\n return relevantFields.filter(field => isOrphanedField(field, relevantFields));\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO,uBAAuB;AAC9B,SAAQ,kBAAkB,eAAe,SAAS,wBAAuB;AACzE,SAAQ,sCAAsC,kBAAkB,8BAA8B,sCAAqC;AAInI,MAAM,QAAQ,kBAAkB,oEAAoE;AAEpG,0BAA2B;AACzB,SAAO;AAAA,IACL,aAAa;AAAA,IACb;AAAA,IAAU;AAAA,EACZ;AAEA,WAAS,IAAI,QAAQ;AACnB,YAAQ,qCAAqC;AAC7C,UAAM,MAAM,EAAC,SAAS,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,KAAI;AAI9C,wCAAoC,MAAM;AAG1C,WAAO;AAAA,EACT;AAEA,WAAS,SAAS,QAAQ;AAExB,YAAQ,4CAA4C,KAAK;AACzD,UAAM,4BAA4B,OAAO,OAAO,OAAO,WAAS,iBAAiB,OAAO,GAAG,CAAC;AAE5F,UAAM,iBAAiB,kBAAkB,yBAAyB;AAElE,UAAM,MAAM,EAAC,SAAS,CAAC,EAAC;AAExB,QAAI,eAAe,SAAS,GAAG;AAC7B,UAAI,UAAU,CAAC,GAAG,eAAe,MAAM,+CAA+C;AAAA,IACxF;AACA,QAAI,QAAQ,IAAI,QAAQ,SAAS;AACjC,WAAO;AAAA,EACT;AACF;AAEO,gBAAS,oCAAoC,QAAQ;AAC1D,QAAM,4BAA4B,OAAO,OAAO,OAAO,WAAS,iBAAiB,OAAO,GAAG,CAAC;AAC5F,QAAM,iBAAiB,kBAAkB,yBAAyB;AAElE,iBAAe,QAAQ,WAAS,0BAA0B,KAAK,CAAC;AAEhE,WAAS,0BAA0B,OAAO;AAExC,QAAI,MAAM,QAAQ,OAAO;AACvB,YAAM,UAAU,QAAQ,QAAM,4BAA4B,EAAE,CAAC;AAC7D;AAAA,IACF;AAEA,UAAM,qBAAqB,MAAM,UAAU,OAAO,QAAM,CAAC,mBAAmB,IAAI,MAAM,KAAK,yBAAyB,CAAC;AACrH,QAAI,mBAAmB,WAAW,GAAG;AACnC,aAAO,YAAY,KAAK;AACxB;AAAA,IACF;AACA,UAAM,YAAY;AAAA,EACpB;AAEA,WAAS,4BAA4B,UAAU;AAC7C,QAAI,CAAC,mBAAmB,UAAU,OAAO,yBAAyB,GAAG;AACnE;AAAA,IACF;AAEA,mCAA+B,UAAU,IAAI;AAAA,EAC/C;AACF;AAGA,SAAS,qCAAqC,WAAW,OAAO,gBAAgB;AAE9E,MAAI,CAAC,iBAAiB,SAAS,GAAG;AAChC,WAAO;AAAA,EACT;AACA,UAAQ,qBAAqB,KAAK,IAAI,iBAAiB,SAAS,CAAC,EAAE;AACnE,iBAAe,QAAQ,WAAS,cAAc,KAAK,CAAC;AAGpD,QAAM,cAAc,UAAU,MAAM,UAAU,GAAG,CAAC;AAElD,QAAM,mBAAmB,6BAA6B,SAAS;AAC/D,MAAI,qBAAqB,MAAM;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,yBAAyB,GAAG,KAAK,IAAI,gBAAgB;AAC3D,UAAQ,iCAAiC,sBAAsB,aAAa,WAAW,KAAK;AAE5F,QAAM,iBAAiB,eAAe,OAAO,WAAS,MAAM,QAAQ,eAAe,qCAAqC,OAAO,sBAAsB,CAAC;AACtJ,MAAI,eAAe,WAAW,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,SAAO,eAAe,CAAC;AACzB;AAEA,SAAS,mBAAmB,UAAU,KAAK,qBAAqB;AAC9D,MAAI,CAAC,iBAAiB,QAAQ,KAAK,6BAA6B,QAAQ,MAAM,MAAM;AAClF,WAAO;AAAA,EACT;AACA,SAAO,CAAC,qCAAqC,UAAU,KAAK,mBAAmB;AACjF;AAGA,SAAS,gBAAgB,OAAO,qBAAqB;AACnD,SAAO,MAAM,UAAU,KAAK,QAAM,mBAAmB,IAAI,MAAM,KAAK,mBAAmB,CAAC;AAC1F;AAEA,SAAS,kBAAkB,gBAAgB;AACzC,SAAO,eAAe,OAAO,WAAS,gBAAgB,OAAO,cAAc,CAAC;AAC9E;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import { MarcRecord } from "@natlibfi/marc-record";
|
|
3
|
+
import validatorFactory from "./resolveOrphanedSubfield6s.js";
|
|
4
|
+
import { READERS } from "@natlibfi/fixura";
|
|
5
|
+
import generateTests from "@natlibfi/fixugen";
|
|
6
|
+
import createDebugLogger from "debug";
|
|
7
|
+
generateTests({
|
|
8
|
+
callback,
|
|
9
|
+
path: [import.meta.dirname, "..", "test-fixtures", "remove-orphanded-sf6s"],
|
|
10
|
+
useMetadataFile: true,
|
|
11
|
+
recurse: false,
|
|
12
|
+
fixura: {
|
|
13
|
+
reader: READERS.JSON
|
|
14
|
+
},
|
|
15
|
+
hooks: {
|
|
16
|
+
before: async () => {
|
|
17
|
+
testValidatorFactory();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda/resolveOrphanedSubfield6s:test");
|
|
22
|
+
async function testValidatorFactory() {
|
|
23
|
+
const validator = await validatorFactory();
|
|
24
|
+
assert.equal(typeof validator, "object");
|
|
25
|
+
assert.equal(typeof validator.description, "string");
|
|
26
|
+
assert.equal(typeof validator.validate, "function");
|
|
27
|
+
}
|
|
28
|
+
async function callback({ getFixture, enabled = true, fix = false }) {
|
|
29
|
+
if (enabled === false) {
|
|
30
|
+
debug("TEST SKIPPED!");
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const validator = await validatorFactory();
|
|
34
|
+
const record = new MarcRecord(getFixture("record.json"));
|
|
35
|
+
const expectedResult = getFixture("expectedResult.json");
|
|
36
|
+
if (!fix) {
|
|
37
|
+
const result = await validator.validate(record);
|
|
38
|
+
assert.deepEqual(result, expectedResult);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
await validator.fix(record);
|
|
42
|
+
assert.deepEqual(record, expectedResult);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=resolveOrphanedSubfield6s.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/resolveOrphanedSubfield6s.test.js"],
|
|
4
|
+
"sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './resolveOrphanedSubfield6s.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'remove-orphanded-sf6s'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/resolveOrphanedSubfield6s:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n}\n\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAC1B,OAAO,uBAAuB;AAE9B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,uBAAuB;AAAA,EAC1E,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,YAAY;AAClB,2BAAqB;AAAA,IACvB;AAAA,EACF;AACF,CAAC;AAED,MAAM,QAAQ,kBAAkB,yEAAyE;AAEzG,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,SAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AACpD;AAEA,eAAe,SAAS,EAAC,YAAY,UAAU,MAAM,MAAM,MAAK,GAAG;AACjE,MAAI,YAAY,OAAO;AACrB,UAAM,eAAe;AACrB;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,iBAAiB;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,QAAM,iBAAiB,WAAW,qBAAqB;AAGvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,cAAc;AACzC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,56 +1,35 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = _default;
|
|
7
|
-
var _utils = require("./utils");
|
|
8
|
-
var _clone = _interopRequireDefault(require("clone"));
|
|
9
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
-
//import createDebugLogger from 'debug';
|
|
11
|
-
|
|
12
|
-
//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes);
|
|
13
|
-
|
|
14
|
-
// Author(s): Nicholas Volk, Joni Ollila
|
|
15
|
-
function _default() {
|
|
1
|
+
import { fieldToString } from "./utils.js";
|
|
2
|
+
import clone from "clone";
|
|
3
|
+
export default function() {
|
|
16
4
|
return {
|
|
17
|
-
description:
|
|
5
|
+
description: "Validator for sanitizing vocabulary source codes in subfield $2 (MRA-532)",
|
|
18
6
|
validate,
|
|
19
7
|
fix
|
|
20
8
|
};
|
|
21
9
|
function fix(record) {
|
|
22
|
-
const res = {
|
|
23
|
-
message: [],
|
|
24
|
-
fix: [],
|
|
25
|
-
valid: true
|
|
26
|
-
};
|
|
10
|
+
const res = { message: [], fix: [], valid: true };
|
|
27
11
|
const relevantFields = getRelevantFields(record);
|
|
28
|
-
relevantFields.forEach(f => fieldSanitizeVocabularySourceCode(f));
|
|
12
|
+
relevantFields.forEach((f) => fieldSanitizeVocabularySourceCode(f));
|
|
29
13
|
return res;
|
|
30
14
|
}
|
|
31
15
|
function validate(record) {
|
|
32
|
-
const res = {
|
|
33
|
-
message: []
|
|
34
|
-
};
|
|
16
|
+
const res = { message: [] };
|
|
35
17
|
const relevantFields = getRelevantFields(record);
|
|
36
|
-
relevantFields.forEach(field => validateField(field, res));
|
|
37
|
-
|
|
18
|
+
relevantFields.forEach((field) => validateField(field, res));
|
|
38
19
|
res.valid = !(res.message.length >= 1);
|
|
39
20
|
return res;
|
|
40
21
|
}
|
|
41
22
|
function getRelevantFields(record) {
|
|
42
|
-
return record.fields.filter(f => f.subfields && f.tag.match(/^(?:6..|257|370|38.)$/u));
|
|
23
|
+
return record.fields.filter((f) => f.subfields && f.tag.match(/^(?:6..|257|370|38.)$/u));
|
|
43
24
|
}
|
|
44
25
|
function validateField(field, res) {
|
|
45
|
-
const orig =
|
|
46
|
-
const normalizedField = fieldSanitizeVocabularySourceCode((
|
|
47
|
-
const mod =
|
|
26
|
+
const orig = fieldToString(field);
|
|
27
|
+
const normalizedField = fieldSanitizeVocabularySourceCode(clone(field));
|
|
28
|
+
const mod = fieldToString(normalizedField);
|
|
48
29
|
if (orig !== mod) {
|
|
49
|
-
// Fail as the input is "broken"/"crap"/sumthing
|
|
50
30
|
res.message.push(`FIXABLE: '${orig}' => '${mod}'`);
|
|
51
31
|
return;
|
|
52
32
|
}
|
|
53
|
-
// Handle illegal values here
|
|
54
33
|
if (fieldHasUnfixableVocabularySourceCode(field)) {
|
|
55
34
|
res.message.push(`CAN'T BE FIXED AUTOMATICALLY: '${orig}'`);
|
|
56
35
|
return;
|
|
@@ -58,50 +37,43 @@ function _default() {
|
|
|
58
37
|
return;
|
|
59
38
|
}
|
|
60
39
|
function fieldSanitizeVocabularySourceCode(field) {
|
|
61
|
-
field.subfields.forEach(sf => subfieldSanitizeVocabularySourceCode(sf));
|
|
40
|
+
field.subfields.forEach((sf) => subfieldSanitizeVocabularySourceCode(sf));
|
|
62
41
|
return field;
|
|
63
42
|
}
|
|
64
43
|
function subfieldSanitizeVocabularySourceCode(subfield) {
|
|
65
|
-
if (subfield.code !==
|
|
44
|
+
if (subfield.code !== "2") {
|
|
66
45
|
return;
|
|
67
46
|
}
|
|
68
47
|
subfield.value = stringFixVocabularySourceCode(subfield.value);
|
|
69
48
|
}
|
|
70
49
|
}
|
|
71
|
-
|
|
72
|
-
// Note that language suffix is optional
|
|
73
|
-
const legalSubfieldCode = ['allars', 'kauno', 'kauno/fin', 'kauno/swe', 'mts', 'mts/fin', 'mts/swe', 'slm', 'slm/fin', 'slm/swe', 'ysa', 'yso', 'yso/eng', 'yso/fin', 'yso/sme', 'yso/swe'];
|
|
50
|
+
const legalSubfieldCode = ["allars", "kauno", "kauno/fin", "kauno/swe", "mts", "mts/fin", "mts/swe", "slm", "slm/fin", "slm/swe", "ysa", "yso", "yso/eng", "yso/fin", "yso/sme", "yso/swe"];
|
|
74
51
|
function stringFixVocabularySourceCode(value) {
|
|
75
|
-
|
|
76
|
-
const tmp = value.replace(/ /ug, '').replace(/\/+/ug, '/').replace(/(.)[./]$/gu, '$1').replace(/^yso-(?:aika|paikat)\//u, 'yso/'); // IMP-HELMET crap. Also, they still have a '.' at the end of $a...
|
|
77
|
-
|
|
78
|
-
// NB! Use the modified value ONLY if the result (tmp variable) is a legal subfield code...
|
|
52
|
+
const tmp = value.replace(/ /ug, "").replace(/\/+/ug, "/").replace(/(.)[./]$/gu, "$1").replace(/^yso-(?:aika|paikat)\//u, "yso/");
|
|
79
53
|
if (legalSubfieldCode.includes(tmp)) {
|
|
80
54
|
return tmp;
|
|
81
55
|
}
|
|
82
56
|
return value;
|
|
83
57
|
}
|
|
84
58
|
function fieldHasUnfixableVocabularySourceCode(field) {
|
|
85
|
-
return field.subfields.some(sf => subfieldHasUnfixableVocabularySourceCode(sf));
|
|
59
|
+
return field.subfields.some((sf) => subfieldHasUnfixableVocabularySourceCode(sf));
|
|
86
60
|
}
|
|
87
61
|
function subfieldHasUnfixableVocabularySourceCode(subfield) {
|
|
88
|
-
if (subfield.code !==
|
|
62
|
+
if (subfield.code !== "2") {
|
|
89
63
|
return false;
|
|
90
64
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
if (subfield.value.indexOf('yso/') === 0) {
|
|
94
|
-
return !['yso/eng', 'yso/fin', 'yso/sme', 'yso/swe'].includes(subfield.value);
|
|
65
|
+
if (subfield.value.indexOf("yso/") === 0) {
|
|
66
|
+
return !["yso/eng", "yso/fin", "yso/sme", "yso/swe"].includes(subfield.value);
|
|
95
67
|
}
|
|
96
|
-
if (subfield.value.indexOf(
|
|
97
|
-
return ![
|
|
68
|
+
if (subfield.value.indexOf("slm/") === 0) {
|
|
69
|
+
return !["slm/fin", "slm/swe"].includes(subfield.value);
|
|
98
70
|
}
|
|
99
|
-
if (subfield.value.indexOf(
|
|
100
|
-
return ![
|
|
71
|
+
if (subfield.value.indexOf("mts/") === 0) {
|
|
72
|
+
return !["mts/fin", "mts/swe"].includes(subfield.value);
|
|
101
73
|
}
|
|
102
|
-
if (subfield.value.indexOf(
|
|
103
|
-
return ![
|
|
74
|
+
if (subfield.value.indexOf("kauno/") === 0) {
|
|
75
|
+
return !["kauno/fin", "kauno/swe"].includes(subfield.value);
|
|
104
76
|
}
|
|
105
77
|
return false;
|
|
106
78
|
}
|
|
107
|
-
//# sourceMappingURL=sanitize-vocabulary-source-codes.js.map
|
|
79
|
+
//# sourceMappingURL=sanitize-vocabulary-source-codes.js.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/sanitize-vocabulary-source-codes.js"],
|
|
4
|
+
"sourcesContent": ["//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils.js';\nimport clone from 'clone';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes);\n\n// Author(s): Nicholas Volk, Joni Ollila\nexport default function () {\n\n return {\n description: 'Validator for sanitizing vocabulary source codes in subfield $2 (MRA-532)',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n const relevantFields = getRelevantFields(record);\n relevantFields.forEach(f => fieldSanitizeVocabularySourceCode(f));\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n const relevantFields = getRelevantFields(record);\n\n relevantFields.forEach(field => validateField(field, res));\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function getRelevantFields(record) {\n return record.fields.filter(f => f.subfields && f.tag.match(/^(?:6..|257|370|38.)$/u));\n }\n\n function validateField(field, res) {\n const orig = fieldToString(field);\n\n const normalizedField = fieldSanitizeVocabularySourceCode(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`FIXABLE: '${orig}' => '${mod}'`);\n return;\n }\n // Handle illegal values here\n if (fieldHasUnfixableVocabularySourceCode(field)) {\n res.message.push(`CAN'T BE FIXED AUTOMATICALLY: '${orig}'`);\n return;\n }\n return;\n }\n\n\n function fieldSanitizeVocabularySourceCode(field) {\n field.subfields.forEach(sf => subfieldSanitizeVocabularySourceCode(sf));\n return field;\n }\n\n function subfieldSanitizeVocabularySourceCode(subfield) {\n if (subfield.code !== '2') {\n return;\n }\n subfield.value = stringFixVocabularySourceCode(subfield.value);\n }\n\n}\n\n// Note that language suffix is optional\nconst legalSubfieldCode = ['allars', 'kauno', 'kauno/fin', 'kauno/swe', 'mts', 'mts/fin', 'mts/swe', 'slm', 'slm/fin', 'slm/swe', 'ysa', 'yso', 'yso/eng', 'yso/fin', 'yso/sme', 'yso/swe'];\n\nfunction stringFixVocabularySourceCode(value) {\n // Try to remove spaces, change '//' to '/' and remove final '.' and '/':\n const tmp = value.replace(/ /ug, '')\n .replace(/\\/+/ug, '/')\n .replace(/(.)[./]$/gu, '$1')\n .replace(/^yso-(?:aika|paikat)\\//u, 'yso/'); // IMP-HELMET crap. Also, they still have a '.' at the end of $a...\n\n // NB! Use the modified value ONLY if the result (tmp variable) is a legal subfield code...\n if (legalSubfieldCode.includes(tmp)) {\n return tmp;\n }\n\n return value;\n}\n\nfunction fieldHasUnfixableVocabularySourceCode(field) {\n return field.subfields.some(sf => subfieldHasUnfixableVocabularySourceCode(sf));\n}\n\nfunction subfieldHasUnfixableVocabularySourceCode(subfield) {\n if (subfield.code !== '2') {\n return false;\n }\n\n // As we can't fix this here, apply this yso-rule only when validating!\n if (subfield.value.indexOf('yso/') === 0) {\n return !['yso/eng', 'yso/fin', 'yso/sme', 'yso/swe'].includes(subfield.value);\n }\n\n if (subfield.value.indexOf('slm/') === 0) {\n return !['slm/fin', 'slm/swe'].includes(subfield.value);\n }\n\n if (subfield.value.indexOf('mts/') === 0) {\n return !['mts/fin', 'mts/swe'].includes(subfield.value);\n }\n\n if (subfield.value.indexOf('kauno/') === 0) {\n return !['kauno/fin', 'kauno/swe'].includes(subfield.value);\n }\n\n return false;\n}\n"],
|
|
5
|
+
"mappings": "AACA,SAAQ,qBAAoB;AAC5B,OAAO,WAAW;AAKlB,0BAA2B;AAEzB,SAAO;AAAA,IACL,aAAa;AAAA,IACb;AAAA,IAAU;AAAA,EACZ;AAEA,WAAS,IAAI,QAAQ;AACnB,UAAM,MAAM,EAAC,SAAS,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,KAAI;AAC9C,UAAM,iBAAiB,kBAAkB,MAAM;AAC/C,mBAAe,QAAQ,OAAK,kCAAkC,CAAC,CAAC;AAChE,WAAO;AAAA,EACT;AAEA,WAAS,SAAS,QAAQ;AACxB,UAAM,MAAM,EAAC,SAAS,CAAC,EAAC;AACxB,UAAM,iBAAiB,kBAAkB,MAAM;AAE/C,mBAAe,QAAQ,WAAS,cAAc,OAAO,GAAG,CAAC;AAEzD,QAAI,QAAQ,EAAE,IAAI,QAAQ,UAAU;AACpC,WAAO;AAAA,EACT;AAEA,WAAS,kBAAkB,QAAQ;AACjC,WAAO,OAAO,OAAO,OAAO,OAAK,EAAE,aAAa,EAAE,IAAI,MAAM,wBAAwB,CAAC;AAAA,EACvF;AAEA,WAAS,cAAc,OAAO,KAAK;AACjC,UAAM,OAAO,cAAc,KAAK;AAEhC,UAAM,kBAAkB,kCAAkC,MAAM,KAAK,CAAC;AACtE,UAAM,MAAM,cAAc,eAAe;AACzC,QAAI,SAAS,KAAK;AAChB,UAAI,QAAQ,KAAK,aAAa,IAAI,SAAS,GAAG,GAAG;AACjD;AAAA,IACF;AAEA,QAAI,sCAAsC,KAAK,GAAG;AAChD,UAAI,QAAQ,KAAK,kCAAkC,IAAI,GAAG;AAC1D;AAAA,IACF;AACA;AAAA,EACF;AAGA,WAAS,kCAAkC,OAAO;AAChD,UAAM,UAAU,QAAQ,QAAM,qCAAqC,EAAE,CAAC;AACtE,WAAO;AAAA,EACT;AAEA,WAAS,qCAAqC,UAAU;AACtD,QAAI,SAAS,SAAS,KAAK;AACzB;AAAA,IACF;AACA,aAAS,QAAQ,8BAA8B,SAAS,KAAK;AAAA,EAC/D;AAEF;AAGA,MAAM,oBAAoB,CAAC,UAAU,SAAS,aAAa,aAAa,OAAO,WAAW,WAAW,OAAO,WAAW,WAAW,OAAO,OAAO,WAAW,WAAW,WAAW,SAAS;AAE1L,SAAS,8BAA8B,OAAO;AAE5C,QAAM,MAAM,MAAM,QAAQ,OAAO,EAAE,EAChC,QAAQ,SAAS,GAAG,EACpB,QAAQ,cAAc,IAAI,EAC1B,QAAQ,2BAA2B,MAAM;AAG5C,MAAI,kBAAkB,SAAS,GAAG,GAAG;AACnC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,sCAAsC,OAAO;AACpD,SAAO,MAAM,UAAU,KAAK,QAAM,yCAAyC,EAAE,CAAC;AAChF;AAEA,SAAS,yCAAyC,UAAU;AAC1D,MAAI,SAAS,SAAS,KAAK;AACzB,WAAO;AAAA,EACT;AAGA,MAAI,SAAS,MAAM,QAAQ,MAAM,MAAM,GAAG;AACxC,WAAO,CAAC,CAAC,WAAW,WAAW,WAAW,SAAS,EAAE,SAAS,SAAS,KAAK;AAAA,EAC9E;AAEA,MAAI,SAAS,MAAM,QAAQ,MAAM,MAAM,GAAG;AACxC,WAAO,CAAC,CAAC,WAAW,SAAS,EAAE,SAAS,SAAS,KAAK;AAAA,EACxD;AAEA,MAAI,SAAS,MAAM,QAAQ,MAAM,MAAM,GAAG;AACxC,WAAO,CAAC,CAAC,WAAW,SAAS,EAAE,SAAS,SAAS,KAAK;AAAA,EACxD;AAEA,MAAI,SAAS,MAAM,QAAQ,QAAQ,MAAM,GAAG;AAC1C,WAAO,CAAC,CAAC,aAAa,WAAW,EAAE,SAAS,SAAS,KAAK;AAAA,EAC5D;AAEA,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import { MarcRecord } from "@natlibfi/marc-record";
|
|
3
|
+
import validatorFactory from "./sanitize-vocabulary-source-codes.js";
|
|
4
|
+
import { READERS } from "@natlibfi/fixura";
|
|
5
|
+
import generateTests from "@natlibfi/fixugen";
|
|
6
|
+
import createDebugLogger from "debug";
|
|
7
|
+
generateTests({
|
|
8
|
+
callback,
|
|
9
|
+
path: [import.meta.dirname, "..", "test-fixtures", "sanitize-vocabulary-source-codes"],
|
|
10
|
+
useMetadataFile: true,
|
|
11
|
+
recurse: false,
|
|
12
|
+
fixura: {
|
|
13
|
+
reader: READERS.JSON
|
|
14
|
+
},
|
|
15
|
+
hooks: {
|
|
16
|
+
before: async () => {
|
|
17
|
+
testValidatorFactory();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes:test");
|
|
22
|
+
async function testValidatorFactory() {
|
|
23
|
+
const validator = await validatorFactory();
|
|
24
|
+
assert.equal(typeof validator, "object");
|
|
25
|
+
assert.equal(typeof validator.description, "string");
|
|
26
|
+
assert.equal(typeof validator.validate, "function");
|
|
27
|
+
}
|
|
28
|
+
async function callback({ getFixture, enabled = true, fix = false }) {
|
|
29
|
+
if (enabled === false) {
|
|
30
|
+
debug("TEST SKIPPED!");
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const validator = await validatorFactory();
|
|
34
|
+
const recordFixture = getFixture("record.json");
|
|
35
|
+
const record = recordFixture._validationOptions ? new MarcRecord(recordFixture, recordFixture._validationOptions) : new MarcRecord(recordFixture);
|
|
36
|
+
const expectedResult = getFixture("expectedResult.json");
|
|
37
|
+
if (!fix) {
|
|
38
|
+
const result = await validator.validate(record);
|
|
39
|
+
assert.deepEqual(result, expectedResult);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
await validator.fix(record);
|
|
43
|
+
assert.deepEqual(record, expectedResult);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=sanitize-vocabulary-source-codes.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/sanitize-vocabulary-source-codes.test.js"],
|
|
4
|
+
"sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './sanitize-vocabulary-source-codes.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'sanitize-vocabulary-source-codes'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n}\n\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n\n const recordFixture = getFixture('record.json');\n const record = recordFixture._validationOptions ? new MarcRecord(recordFixture, recordFixture._validationOptions) : new MarcRecord(recordFixture);\n\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAC1B,OAAO,uBAAuB;AAE9B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,kCAAkC;AAAA,EACrF,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,YAAY;AAClB,2BAAqB;AAAA,IACvB;AAAA,EACF;AACF,CAAC;AACD,MAAM,QAAQ,kBAAkB,gFAAgF;AAEhH,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,SAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AACpD;AAEA,eAAe,SAAS,EAAC,YAAY,UAAU,MAAM,MAAM,MAAK,GAAG;AACjE,MAAI,YAAY,OAAO;AACrB,UAAM,eAAe;AACrB;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,iBAAiB;AAEzC,QAAM,gBAAgB,WAAW,aAAa;AAC9C,QAAM,SAAS,cAAc,qBAAqB,IAAI,WAAW,eAAe,cAAc,kBAAkB,IAAI,IAAI,WAAW,aAAa;AAEhJ,QAAM,iBAAiB,WAAW,qBAAqB;AAGvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,cAAc;AACzC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/sort-tags.js
CHANGED
|
@@ -1,38 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = _default;
|
|
7
|
-
var _marcRecord = require("@natlibfi/marc-record");
|
|
8
|
-
function _default(tagPattern) {
|
|
1
|
+
import { MarcRecord } from "@natlibfi/marc-record";
|
|
2
|
+
export default function(tagPattern) {
|
|
9
3
|
return {
|
|
10
|
-
description:
|
|
4
|
+
description: "Handles field ordering",
|
|
11
5
|
validate,
|
|
12
|
-
fix: async record => ({
|
|
6
|
+
fix: async (record) => ({
|
|
13
7
|
fix: await sort(record, tagPattern)
|
|
14
8
|
})
|
|
15
9
|
};
|
|
16
|
-
function validate(record,
|
|
17
|
-
return
|
|
18
|
-
valid: true,
|
|
19
|
-
messages: []
|
|
20
|
-
} : {
|
|
21
|
-
valid: false,
|
|
22
|
-
messages: ['Fields are in incorrect order']
|
|
23
|
-
};
|
|
10
|
+
function validate(record, tagPattern2) {
|
|
11
|
+
return MarcRecord.isEqual(record.fields, sort(record.fields, tagPattern2)) ? { valid: true, messages: [] } : { valid: false, messages: ["Fields are in incorrect order"] };
|
|
24
12
|
}
|
|
25
|
-
function sort(record,
|
|
26
|
-
if (
|
|
27
|
-
return sortPatternFields(record,
|
|
13
|
+
function sort(record, tagPattern2) {
|
|
14
|
+
if (tagPattern2) {
|
|
15
|
+
return sortPatternFields(record, tagPattern2);
|
|
28
16
|
}
|
|
29
17
|
return sortFields(record);
|
|
30
18
|
}
|
|
31
19
|
}
|
|
32
20
|
function sortPatternFields(record, tagPattern) {
|
|
33
|
-
const matchingTags = record.fields.map(field => tagPattern.some(pattern => pattern.test(field.tag)) ? field : null).filter(tag => tag);
|
|
21
|
+
const matchingTags = record.fields.map((field) => tagPattern.some((pattern) => pattern.test(field.tag)) ? field : null).filter((tag) => tag);
|
|
34
22
|
const sortedArray = sortFields(record.fields);
|
|
35
|
-
const fixedArray = sortedArray.filter(field => !tagPattern.some(pattern => pattern.test(field.tag)));
|
|
23
|
+
const fixedArray = sortedArray.filter((field) => !tagPattern.some((pattern) => pattern.test(field.tag)));
|
|
36
24
|
fixedArray.splice(index(sortedArray, tagPattern), 0, ...matchingTags);
|
|
37
25
|
record.fields = fixedArray;
|
|
38
26
|
}
|
|
@@ -48,6 +36,6 @@ function sortFields(fields) {
|
|
|
48
36
|
});
|
|
49
37
|
}
|
|
50
38
|
function index(fields, tagPattern) {
|
|
51
|
-
return fields.findIndex(field => tagPattern.some(pattern => pattern.test(field.tag)));
|
|
39
|
+
return fields.findIndex((field) => tagPattern.some((pattern) => pattern.test(field.tag)));
|
|
52
40
|
}
|
|
53
|
-
//# sourceMappingURL=sort-tags.js.map
|
|
41
|
+
//# sourceMappingURL=sort-tags.js.map
|
package/dist/sort-tags.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/sort-tags.js"],
|
|
4
|
+
"sourcesContent": ["import {MarcRecord} from '@natlibfi/marc-record';\n\nexport default function (tagPattern) {\n return {\n description:\n 'Handles field ordering',\n validate,\n fix: async record => ({\n fix: await sort(record, tagPattern)\n })\n };\n\n function validate(record, tagPattern) {\n return MarcRecord.isEqual(record.fields, sort(record.fields, tagPattern)) ? {valid: true, messages: []} : {valid: false, messages: ['Fields are in incorrect order']};\n }\n\n function sort(record, tagPattern) {\n if (tagPattern) {\n return sortPatternFields(record, tagPattern);\n }\n\n return sortFields(record);\n }\n}\n\nfunction sortPatternFields(record, tagPattern) {\n const matchingTags = record.fields.map(field => tagPattern.some(pattern => pattern.test(field.tag)) ? field : null).filter(tag => tag);\n const sortedArray = sortFields(record.fields);\n const fixedArray = sortedArray.filter(field => !tagPattern.some(pattern => pattern.test(field.tag)));\n fixedArray.splice(index(sortedArray, tagPattern), 0, ...matchingTags);\n record.fields = fixedArray;\n}\n\nfunction sortFields(fields) {\n return [...fields].sort((a, b) => {\n if (a.tag > b.tag) {\n return 1;\n }\n if (b.tag > a.tag) {\n return -1;\n }\n return 0;\n });\n}\n\nfunction index(fields, tagPattern) {\n return fields.findIndex(field => tagPattern.some(pattern => pattern.test(field.tag)));\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAQ,kBAAiB;AAEzB,wBAAyB,YAAY;AACnC,SAAO;AAAA,IACL,aACE;AAAA,IACF;AAAA,IACA,KAAK,OAAM,YAAW;AAAA,MACpB,KAAK,MAAM,KAAK,QAAQ,UAAU;AAAA,IACpC;AAAA,EACF;AAEA,WAAS,SAAS,QAAQA,aAAY;AACpC,WAAO,WAAW,QAAQ,OAAO,QAAQ,KAAK,OAAO,QAAQA,WAAU,CAAC,IAAI,EAAC,OAAO,MAAM,UAAU,CAAC,EAAC,IAAI,EAAC,OAAO,OAAO,UAAU,CAAC,+BAA+B,EAAC;AAAA,EACtK;AAEA,WAAS,KAAK,QAAQA,aAAY;AAChC,QAAIA,aAAY;AACd,aAAO,kBAAkB,QAAQA,WAAU;AAAA,IAC7C;AAEA,WAAO,WAAW,MAAM;AAAA,EAC1B;AACF;AAEA,SAAS,kBAAkB,QAAQ,YAAY;AAC7C,QAAM,eAAe,OAAO,OAAO,IAAI,WAAS,WAAW,KAAK,aAAW,QAAQ,KAAK,MAAM,GAAG,CAAC,IAAI,QAAQ,IAAI,EAAE,OAAO,SAAO,GAAG;AACrI,QAAM,cAAc,WAAW,OAAO,MAAM;AAC5C,QAAM,aAAa,YAAY,OAAO,WAAS,CAAC,WAAW,KAAK,aAAW,QAAQ,KAAK,MAAM,GAAG,CAAC,CAAC;AACnG,aAAW,OAAO,MAAM,aAAa,UAAU,GAAG,GAAG,GAAG,YAAY;AACpE,SAAO,SAAS;AAClB;AAEA,SAAS,WAAW,QAAQ;AAC1B,SAAO,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM;AAChC,QAAI,EAAE,MAAM,EAAE,KAAK;AACjB,aAAO;AAAA,IACT;AACA,QAAI,EAAE,MAAM,EAAE,KAAK;AACjB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,MAAM,QAAQ,YAAY;AACjC,SAAO,OAAO,UAAU,WAAS,WAAW,KAAK,aAAW,QAAQ,KAAK,MAAM,GAAG,CAAC,CAAC;AACtF;",
|
|
6
|
+
"names": ["tagPattern"]
|
|
7
|
+
}
|