@natlibfi/marc-record-validators-melinda 11.6.7 → 12.0.0-alpha.12
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 → melinda-node-tests-and-publish.yml} +37 -12
- 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 +43 -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 +873 -769
- package/dist/ending-punctuation-conf.js.map +7 -1
- package/dist/ending-punctuation.js +156 -169
- package/dist/ending-punctuation.js.map +7 -1
- package/dist/ending-punctuation.test.js +2385 -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 +182 -413
- package/dist/index.js.map +7 -1
- package/dist/indicator-fixes.js +66 -94
- 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 +71 -128
- 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 +187 -379
- package/dist/merge-fields/counterpartField.js.map +7 -1
- package/dist/merge-fields/dataProvenance.js +29 -0
- package/dist/merge-fields/dataProvenance.js.map +7 -0
- package/dist/merge-fields/index.js +25 -50
- 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 +46 -0
- package/dist/merge-fields.test.js.map +7 -0
- package/dist/mergeField500Lisapainokset.js +27 -56
- 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 +91 -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 +259 -802
- 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 +104 -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 +32 -63
- 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 +54 -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 +78 -126
- package/dist/utils.js.map +7 -1
- package/eslint.config.mjs +1 -2
- package/package.json +28 -101
- 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.spec.js → cyrillux-usemarcon-replacement.test.js} +17 -14
- 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-conf.js +6 -5
- package/src/ending-punctuation.js +115 -24
- package/src/{ending-punctuation.spec.js → ending-punctuation.test.js} +357 -275
- package/src/{ending-whitespace.spec.js → ending-whitespace.test.js} +12 -13
- package/src/field-008-18-34-character-groups.js +2 -2
- package/src/{field-008-18-34-character-groups.spec.js → field-008-18-34-character-groups.test.js} +13 -13
- package/src/field-505-separators.js +3 -3
- package/src/{field-505-separators.spec.js → field-505-separators.test.js} +16 -14
- package/src/field-521-fix.js +2 -2
- package/src/{field-521-fix.spec.js → field-521-fix.test.js} +12 -13
- package/src/field-exclusion.js +1 -1
- package/src/{field-exclusion.spec.js → field-exclusion.test.js} +60 -57
- package/src/{field-structure.spec.js → field-structure.test.js} +29 -29
- package/src/{fields-present.spec.js → fields-present.test.js} +12 -15
- package/src/fix-33X.js +4 -4
- package/src/{fix-33X.spec.js → fix-33X.test.js} +13 -14
- package/src/fix-country-codes.js +1 -1
- package/src/{fix-country-codes.spec.js → fix-country-codes.test.js} +12 -13
- package/src/fix-language-codes.js +5 -5
- package/src/{fix-language-codes.spec.js → fix-language-codes.test.js} +12 -13
- package/src/fixRelatorTerms.js +5 -5
- package/src/{fixRelatorTerms.spec.js → fixRelatorTerms.test.js} +13 -13
- package/src/{fixed-fields.spec.js → fixed-fields.test.js} +11 -14
- package/src/identical-fields.js +1 -1
- package/src/{identical-fields.spec.js → identical-fields.test.js} +9 -11
- package/src/index.js +132 -59
- package/src/indicator-fixes.js +17 -4
- package/src/{indicator-fixes.spec.js → indicator-fixes.test.js} +9 -12
- package/src/isbn-issn.js +12 -7
- 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/melindaCustomMergeFields.js +1 -1
- package/src/merge-fields/controlSubfields.js +1 -1
- package/src/merge-fields/counterpartField.js +14 -9
- package/src/merge-fields/dataProvenance.js +41 -0
- package/src/merge-fields/index.js +12 -3
- package/src/merge-fields/mergableIndicator.js +1 -1
- package/src/merge-fields/mergeField.js +8 -8
- 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} +18 -15
- package/src/mergeField500Lisapainokset.js +1 -1
- 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 +32 -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 +17 -8
- 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 +15 -12
- 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 +6 -6
- 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 +8 -6
- 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.test.js +75 -0
- 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 +21 -5
- 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/indicator-fixes/10/expectedResult.json +11 -0
- package/test-fixtures/indicator-fixes/10/metadata.json +4 -0
- package/test-fixtures/indicator-fixes/10/record.json +11 -0
- package/test-fixtures/merge-fields/f05/expectedResult.json +24 -0
- package/test-fixtures/merge-fields/f05/metadata.json +6 -0
- package/test-fixtures/merge-fields/f05/record.json +30 -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/remove-inferior-datafields/f16/expectedResult.json +12 -0
- package/test-fixtures/remove-inferior-datafields/f16/metadata.json +5 -0
- package/test-fixtures/remove-inferior-datafields/f16/record.json +14 -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/test-fixtures/translate-terms-data.js +42 -0
- 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/melindaCustomMergeFields.json +0 -5120
- package/src/translate-terms.spec.js +0 -52
|
@@ -4,6 +4,10 @@ name: Melinda-node-tests
|
|
|
4
4
|
|
|
5
5
|
on: push
|
|
6
6
|
|
|
7
|
+
permissions:
|
|
8
|
+
id-token: write # Required for OIDC
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
7
11
|
jobs:
|
|
8
12
|
build-node-versions:
|
|
9
13
|
name: Node version matrix
|
|
@@ -11,14 +15,14 @@ jobs:
|
|
|
11
15
|
|
|
12
16
|
strategy:
|
|
13
17
|
matrix:
|
|
14
|
-
node-version: [
|
|
18
|
+
node-version: [22.x, 24.x]
|
|
15
19
|
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
|
16
20
|
|
|
17
21
|
steps:
|
|
18
22
|
- name: Checkout the code
|
|
19
|
-
uses: actions/checkout@
|
|
23
|
+
uses: actions/checkout@v5
|
|
20
24
|
- name: Use Node.js ${{ matrix.node-version }}
|
|
21
|
-
uses: actions/setup-node@
|
|
25
|
+
uses: actions/setup-node@v6
|
|
22
26
|
with:
|
|
23
27
|
node-version: ${{ matrix.node-version }}
|
|
24
28
|
cache: 'npm'
|
|
@@ -32,30 +36,51 @@ jobs:
|
|
|
32
36
|
njsscan:
|
|
33
37
|
name: Njsscan-check
|
|
34
38
|
runs-on: ubuntu-latest
|
|
35
|
-
container:
|
|
39
|
+
container: node:22
|
|
36
40
|
|
|
37
41
|
steps:
|
|
38
42
|
- name: Checkout the code
|
|
39
|
-
uses: actions/checkout@
|
|
43
|
+
uses: actions/checkout@v5
|
|
40
44
|
- name: nodejsscan scan
|
|
41
45
|
id: njsscan
|
|
42
46
|
uses: ajinabraham/njsscan-action@master
|
|
43
47
|
with:
|
|
44
48
|
args: '.'
|
|
45
49
|
|
|
50
|
+
license-scan:
|
|
51
|
+
name: License compliance check
|
|
52
|
+
runs-on: ubuntu-latest
|
|
53
|
+
container: node:22
|
|
54
|
+
|
|
55
|
+
steps:
|
|
56
|
+
- uses: actions/checkout@v5
|
|
57
|
+
- uses: mikaelvesavuori/license-compliance-action@v1
|
|
58
|
+
with:
|
|
59
|
+
exclude_pattern: /^@natlibfi/
|
|
60
|
+
|
|
46
61
|
publish-to-npm:
|
|
47
62
|
runs-on: ubuntu-latest
|
|
63
|
+
container: node:22
|
|
48
64
|
needs: [build-node-versions, njsscan]
|
|
49
65
|
if: contains(github.ref, 'refs/tags/')
|
|
50
66
|
|
|
51
67
|
steps:
|
|
52
|
-
- uses: actions/checkout@
|
|
68
|
+
- uses: actions/checkout@v5
|
|
53
69
|
# Setup .npmrc file to publish to npm
|
|
54
|
-
-
|
|
70
|
+
- name: Prepare node for publish
|
|
71
|
+
uses: actions/setup-node@v6
|
|
55
72
|
with:
|
|
56
|
-
node-version: '
|
|
73
|
+
node-version: '22.x'
|
|
57
74
|
registry-url: 'https://registry.npmjs.org'
|
|
58
|
-
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
75
|
+
- name: Update npm
|
|
76
|
+
run: npm install -g npm@latest
|
|
77
|
+
- name: Clean install
|
|
78
|
+
run: npm ci
|
|
79
|
+
# Publish stable release with --tag latest
|
|
80
|
+
- name: Publish stable release
|
|
81
|
+
if: ${{!contains(github.ref, '-alpha')}}
|
|
82
|
+
run: npm publish --tag=latest
|
|
83
|
+
# Publish pre-release without --tag latest
|
|
84
|
+
- name: Publish pre-release
|
|
85
|
+
if: contains(github.ref, '-alpha')
|
|
86
|
+
run: npm publish --tag=next
|
package/dist/access-rights.js
CHANGED
|
@@ -1,112 +1,84 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
value:
|
|
5
|
-
}
|
|
6
|
-
exports.default = _default;
|
|
7
|
-
var _utils = require("./utils");
|
|
8
|
-
function _default(isViolaRecord = false) {
|
|
9
|
-
const sf506 = [{
|
|
10
|
-
code: 'a',
|
|
11
|
-
value: /aineisto on käytettävissä vapaakappaletyöasemilla/ui
|
|
12
|
-
}];
|
|
13
|
-
const sf506old = [{
|
|
14
|
-
code: 'a',
|
|
15
|
-
value: /aineisto on käytettävissä vapaakappalekirjastoissa/ui
|
|
16
|
-
}];
|
|
17
|
-
const sf540 = [{
|
|
18
|
-
code: 'c',
|
|
19
|
-
value: /laki kulttuuriaineistojen tallettamisesta ja säilyttämisestä/ui
|
|
20
|
-
}];
|
|
1
|
+
import { isElectronicMaterial } from "./utils.js";
|
|
2
|
+
export default function(isViolaRecord = false) {
|
|
3
|
+
const sf506 = [{ code: "a", value: /aineisto on käytettävissä vapaakappaletyöasemilla/ui }];
|
|
4
|
+
const sf506old = [{ code: "a", value: /aineisto on käytettävissä vapaakappalekirjastoissa/ui }];
|
|
5
|
+
const sf540 = [{ code: "c", value: /laki kulttuuriaineistojen tallettamisesta ja säilyttämisestä/ui }];
|
|
21
6
|
function fix(record) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}, {
|
|
43
|
-
code: '5',
|
|
44
|
-
value: 'FI-Vapaa'
|
|
45
|
-
}];
|
|
7
|
+
if (!hasTag(record, "506", sf506) && !hasTag(record, "506", sf506old)) {
|
|
8
|
+
const subfield9 = isViolaRecord ? [{ code: "9", value: "VIOLA<KEEP>" }] : [{ code: "9", value: "FENNI<KEEP>" }];
|
|
9
|
+
const staticSubfields = [
|
|
10
|
+
{
|
|
11
|
+
code: "a",
|
|
12
|
+
value: "Aineisto on k\xE4ytett\xE4viss\xE4 vapaakappalety\xF6asemilla."
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
code: "f",
|
|
16
|
+
value: "Online access with authorization"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
code: "2",
|
|
20
|
+
value: "star"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
code: "5",
|
|
24
|
+
value: "FI-Vapaa"
|
|
25
|
+
}
|
|
26
|
+
];
|
|
46
27
|
record.insertField({
|
|
47
|
-
tag:
|
|
48
|
-
ind1:
|
|
28
|
+
tag: "506",
|
|
29
|
+
ind1: "1",
|
|
49
30
|
subfields: staticSubfields.concat(subfield9)
|
|
50
31
|
});
|
|
51
32
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
if (!hasTag(record, '506', sf506) && hasTag(record, '506', sf506old)) {
|
|
55
|
-
record.fields.find(f => f.tag === '506' && sf506old.every(({
|
|
56
|
-
code,
|
|
57
|
-
value
|
|
58
|
-
}) => f.subfields.some(sf => sf.code === code && value.test(sf.value)))).subfields.find(sf => sf506old.every(({
|
|
59
|
-
code,
|
|
60
|
-
value
|
|
61
|
-
}) => sf.code === code && value.test(sf.value))).value = 'Aineisto on käytettävissä vapaakappaletyöasemilla.';
|
|
33
|
+
if (!hasTag(record, "506", sf506) && hasTag(record, "506", sf506old)) {
|
|
34
|
+
record.fields.find((f) => f.tag === "506" && sf506old.every(({ code, value }) => f.subfields.some((sf) => sf.code === code && value.test(sf.value)))).subfields.find((sf) => sf506old.every(({ code, value }) => sf.code === code && value.test(sf.value))).value = "Aineisto on k\xE4ytett\xE4viss\xE4 vapaakappalety\xF6asemilla.";
|
|
62
35
|
}
|
|
63
|
-
if (!hasTag(record,
|
|
36
|
+
if (!hasTag(record, "540", sf540) && !isViolaRecord) {
|
|
64
37
|
record.insertField({
|
|
65
|
-
tag:
|
|
66
|
-
subfields: [
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
38
|
+
tag: "540",
|
|
39
|
+
subfields: [
|
|
40
|
+
{
|
|
41
|
+
code: "a",
|
|
42
|
+
value: "Aineisto on k\xE4ytett\xE4viss\xE4 tutkimus- ja muihin tarkoituksiin;"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
code: "b",
|
|
46
|
+
value: "Kansalliskirjasto;"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
code: "c",
|
|
50
|
+
value: "Laki kulttuuriaineistojen tallettamisesta ja s\xE4ilytt\xE4misest\xE4"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
code: "u",
|
|
54
|
+
value: "http://www.finlex.fi/fi/laki/ajantasa/2007/20071433"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
code: "5",
|
|
58
|
+
value: "FI-Vapaa"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
code: "9",
|
|
62
|
+
value: "FENNI<KEEP>"
|
|
63
|
+
}
|
|
64
|
+
]
|
|
85
65
|
});
|
|
86
66
|
}
|
|
87
67
|
return true;
|
|
88
68
|
}
|
|
89
69
|
function validate(record) {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
return {
|
|
93
|
-
valid: true
|
|
94
|
-
};
|
|
70
|
+
if (!isElectronicMaterial(record)) {
|
|
71
|
+
return { valid: true };
|
|
95
72
|
}
|
|
96
|
-
return {
|
|
97
|
-
valid: hasTag(record, '506', sf506) && (hasTag(record, '540', sf540) || isViolaRecord)
|
|
98
|
-
};
|
|
73
|
+
return { valid: hasTag(record, "506", sf506) && (hasTag(record, "540", sf540) || isViolaRecord) };
|
|
99
74
|
}
|
|
100
75
|
return {
|
|
101
|
-
description:
|
|
76
|
+
description: "Adds access rights fields for a record (if not existing)",
|
|
102
77
|
validate,
|
|
103
78
|
fix
|
|
104
79
|
};
|
|
105
80
|
function hasTag(rec, tag, sfcv) {
|
|
106
|
-
return rec.fields.some(f => f.tag === tag && sfcv.every(({
|
|
107
|
-
code,
|
|
108
|
-
value
|
|
109
|
-
}) => f.subfields.some(sf => sf.code === code && value.test(sf.value))));
|
|
81
|
+
return rec.fields.some((f) => f.tag === tag && sfcv.every(({ code, value }) => f.subfields.some((sf) => sf.code === code && value.test(sf.value))));
|
|
110
82
|
}
|
|
111
83
|
}
|
|
112
|
-
//# sourceMappingURL=access-rights.js.map
|
|
84
|
+
//# sourceMappingURL=access-rights.js.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/access-rights.js"],
|
|
4
|
+
"sourcesContent": ["import {isElectronicMaterial} from './utils.js';\n\nexport default function (isViolaRecord = false) {\n const sf506 = [{code: 'a', value: /aineisto on k\u00E4ytett\u00E4viss\u00E4 vapaakappalety\u00F6asemilla/ui}];\n const sf506old = [{code: 'a', value: /aineisto on k\u00E4ytett\u00E4viss\u00E4 vapaakappalekirjastoissa/ui}];\n const sf540 = [{code: 'c', value: /laki kulttuuriaineistojen tallettamisesta ja s\u00E4ilytt\u00E4misest\u00E4/ui}];\n\n function fix(record) {\n // If printed do nothing\n\n // If material is electronic add theis if missing\n if (!hasTag(record, '506', sf506) && !hasTag(record, '506', sf506old)) {\n const subfield9 = isViolaRecord ? [{code: '9', value: 'VIOLA<KEEP>'}] : [{code: '9', value: 'FENNI<KEEP>'}];\n const staticSubfields = [\n {\n code: 'a',\n value: 'Aineisto on k\u00E4ytett\u00E4viss\u00E4 vapaakappalety\u00F6asemilla.'\n }, {\n code: 'f',\n value: 'Online access with authorization'\n }, {\n code: '2',\n value: 'star'\n }, {\n code: '5',\n value: 'FI-Vapaa'\n }\n ];\n\n record.insertField({\n tag: '506',\n ind1: '1',\n subfields: staticSubfields.concat(subfield9)\n });\n }\n\n // Change phrase from old to new if field with old phrase is found\n if (!hasTag(record, '506', sf506) && hasTag(record, '506', sf506old)) {\n record.fields\n .find(f => f.tag === '506' && sf506old.every(({code, value}) => f.subfields.some(sf => sf.code === code && value.test(sf.value))))\n .subfields.find(sf => sf506old.every(({code, value}) => sf.code === code && value.test(sf.value)))\n .value = 'Aineisto on k\u00E4ytett\u00E4viss\u00E4 vapaakappalety\u00F6asemilla.';\n }\n\n if (!hasTag(record, '540', sf540) && !isViolaRecord) {\n record.insertField({\n tag: '540',\n subfields: [\n {\n code: 'a',\n value: 'Aineisto on k\u00E4ytett\u00E4viss\u00E4 tutkimus- ja muihin tarkoituksiin;'\n }, {\n code: 'b',\n value: 'Kansalliskirjasto;'\n }, {\n code: 'c',\n value: 'Laki kulttuuriaineistojen tallettamisesta ja s\u00E4ilytt\u00E4misest\u00E4'\n }, {\n code: 'u',\n value: 'http://www.finlex.fi/fi/laki/ajantasa/2007/20071433'\n }, {\n code: '5',\n value: 'FI-Vapaa'\n }, {\n code: '9',\n value: 'FENNI<KEEP>'\n }\n ]\n });\n }\n\n return true;\n }\n\n function validate(record) {\n // if not electronic skip this validator\n if (!isElectronicMaterial(record)) {\n return {valid: true};\n }\n\n return {valid: hasTag(record, '506', sf506) && (hasTag(record, '540', sf540) || isViolaRecord)};\n }\n\n return {\n description: 'Adds access rights fields for a record (if not existing)',\n validate,\n fix\n };\n\n function hasTag(rec, tag, sfcv) {\n return rec.fields.some(f => f.tag === tag && sfcv.every(({code, value}) => f.subfields.some(sf => sf.code === code && value.test(sf.value))));\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAQ,4BAA2B;AAEnC,wBAAyB,gBAAgB,OAAO;AAC9C,QAAM,QAAQ,CAAC,EAAC,MAAM,KAAK,OAAO,sDAAqD,CAAC;AACxF,QAAM,WAAW,CAAC,EAAC,MAAM,KAAK,OAAO,uDAAsD,CAAC;AAC5F,QAAM,QAAQ,CAAC,EAAC,MAAM,KAAK,OAAO,iEAAgE,CAAC;AAEnG,WAAS,IAAI,QAAQ;AAInB,QAAI,CAAC,OAAO,QAAQ,OAAO,KAAK,KAAK,CAAC,OAAO,QAAQ,OAAO,QAAQ,GAAG;AACrE,YAAM,YAAY,gBAAgB,CAAC,EAAC,MAAM,KAAK,OAAO,cAAa,CAAC,IAAI,CAAC,EAAC,MAAM,KAAK,OAAO,cAAa,CAAC;AAC1G,YAAM,kBAAkB;AAAA,QACtB;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,QAAG;AAAA,UACD,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,QAAG;AAAA,UACD,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,QAAG;AAAA,UACD,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,MACF;AAEA,aAAO,YAAY;AAAA,QACjB,KAAK;AAAA,QACL,MAAM;AAAA,QACN,WAAW,gBAAgB,OAAO,SAAS;AAAA,MAC7C,CAAC;AAAA,IACH;AAGA,QAAI,CAAC,OAAO,QAAQ,OAAO,KAAK,KAAK,OAAO,QAAQ,OAAO,QAAQ,GAAG;AACpE,aAAO,OACJ,KAAK,OAAK,EAAE,QAAQ,SAAS,SAAS,MAAM,CAAC,EAAC,MAAM,MAAK,MAAM,EAAE,UAAU,KAAK,QAAM,GAAG,SAAS,QAAQ,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,EAChI,UAAU,KAAK,QAAM,SAAS,MAAM,CAAC,EAAC,MAAM,MAAK,MAAM,GAAG,SAAS,QAAQ,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,EAChG,QAAQ;AAAA,IACb;AAEA,QAAI,CAAC,OAAO,QAAQ,OAAO,KAAK,KAAK,CAAC,eAAe;AACnD,aAAO,YAAY;AAAA,QACjB,KAAK;AAAA,QACL,WAAW;AAAA,UACT;AAAA,YACE,MAAM;AAAA,YACN,OAAO;AAAA,UACT;AAAA,UAAG;AAAA,YACD,MAAM;AAAA,YACN,OAAO;AAAA,UACT;AAAA,UAAG;AAAA,YACD,MAAM;AAAA,YACN,OAAO;AAAA,UACT;AAAA,UAAG;AAAA,YACD,MAAM;AAAA,YACN,OAAO;AAAA,UACT;AAAA,UAAG;AAAA,YACD,MAAM;AAAA,YACN,OAAO;AAAA,UACT;AAAA,UAAG;AAAA,YACD,MAAM;AAAA,YACN,OAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,SAAS,QAAQ;AAExB,QAAI,CAAC,qBAAqB,MAAM,GAAG;AACjC,aAAO,EAAC,OAAO,KAAI;AAAA,IACrB;AAEA,WAAO,EAAC,OAAO,OAAO,QAAQ,OAAO,KAAK,MAAM,OAAO,QAAQ,OAAO,KAAK,KAAK,eAAc;AAAA,EAChG;AAEA,SAAO;AAAA,IACL,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EACF;AAEA,WAAS,OAAO,KAAK,KAAK,MAAM;AAC9B,WAAO,IAAI,OAAO,KAAK,OAAK,EAAE,QAAQ,OAAO,KAAK,MAAM,CAAC,EAAC,MAAM,MAAK,MAAM,EAAE,UAAU,KAAK,QAAM,GAAG,SAAS,QAAQ,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;AAAA,EAC9I;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import { describe, it } from "node:test";
|
|
3
|
+
import { MarcRecord } from "@natlibfi/marc-record";
|
|
4
|
+
import validatorFactory from "./access-rights.js";
|
|
5
|
+
describe("access-rights", async () => {
|
|
6
|
+
const f337 = {
|
|
7
|
+
tag: "337",
|
|
8
|
+
ind1: " ",
|
|
9
|
+
ind2: " ",
|
|
10
|
+
subfields: [
|
|
11
|
+
{ code: "b", value: "c" },
|
|
12
|
+
{ code: "2", value: "rdamedia" }
|
|
13
|
+
]
|
|
14
|
+
};
|
|
15
|
+
const f337nonElectronic = {
|
|
16
|
+
tag: "337",
|
|
17
|
+
ind1: " ",
|
|
18
|
+
ind2: " ",
|
|
19
|
+
subfields: [
|
|
20
|
+
{ code: "a", value: "k\xE4ytett\xE4viss\xE4 ilman laitetta" },
|
|
21
|
+
{ code: "b", value: "n" },
|
|
22
|
+
{ code: "2", value: "rdamedia" }
|
|
23
|
+
]
|
|
24
|
+
};
|
|
25
|
+
const ldf5061old = {
|
|
26
|
+
tag: "506",
|
|
27
|
+
ind1: "1",
|
|
28
|
+
ind2: " ",
|
|
29
|
+
subfields: [
|
|
30
|
+
{ code: "a", value: "Aineisto on k\xE4ytett\xE4viss\xE4 vapaakappalekirjastoissa." },
|
|
31
|
+
{ code: "f", value: "Online access with authorization" },
|
|
32
|
+
{ code: "2", value: "star" },
|
|
33
|
+
{ code: "5", value: "FI-Vapaa" },
|
|
34
|
+
{ code: "9", value: "FENNI<KEEP>" }
|
|
35
|
+
]
|
|
36
|
+
};
|
|
37
|
+
const ldf5061new = {
|
|
38
|
+
tag: "506",
|
|
39
|
+
ind1: "1",
|
|
40
|
+
ind2: " ",
|
|
41
|
+
subfields: [
|
|
42
|
+
{ code: "a", value: "Aineisto on k\xE4ytett\xE4viss\xE4 vapaakappalety\xF6asemilla." },
|
|
43
|
+
{ code: "f", value: "Online access with authorization" },
|
|
44
|
+
{ code: "2", value: "star" },
|
|
45
|
+
{ code: "5", value: "FI-Vapaa" },
|
|
46
|
+
{ code: "9", value: "FENNI<KEEP>" }
|
|
47
|
+
]
|
|
48
|
+
};
|
|
49
|
+
const ldf540 = {
|
|
50
|
+
tag: "540",
|
|
51
|
+
ind1: " ",
|
|
52
|
+
ind2: " ",
|
|
53
|
+
subfields: [
|
|
54
|
+
{ code: "a", value: "Aineisto on k\xE4ytett\xE4viss\xE4 tutkimus- ja muihin tarkoituksiin;" },
|
|
55
|
+
{ code: "b", value: "Kansalliskirjasto;" },
|
|
56
|
+
{ code: "c", value: "Laki kulttuuriaineistojen tallettamisesta ja s\xE4ilytt\xE4misest\xE4" },
|
|
57
|
+
{ code: "u", value: "http://www.finlex.fi/fi/laki/ajantasa/2007/20071433" },
|
|
58
|
+
{ code: "5", value: "FI-Vapaa" },
|
|
59
|
+
{ code: "9", value: "FENNI<KEEP>" }
|
|
60
|
+
]
|
|
61
|
+
};
|
|
62
|
+
const f5060 = {
|
|
63
|
+
tag: "506",
|
|
64
|
+
ind1: "0",
|
|
65
|
+
ind2: " ",
|
|
66
|
+
subfields: [
|
|
67
|
+
{ code: "a", value: "Aineisto on vapaasti saatavissa." },
|
|
68
|
+
{ code: "f", value: "Unrestricted online access" },
|
|
69
|
+
{ code: "2", value: "star" },
|
|
70
|
+
{ code: "9", value: "FENNI<KEEP>" }
|
|
71
|
+
]
|
|
72
|
+
};
|
|
73
|
+
const f540 = {
|
|
74
|
+
tag: "540",
|
|
75
|
+
ind1: " ",
|
|
76
|
+
ind2: " ",
|
|
77
|
+
subfields: [{ code: "c", value: "This publication is copyrighted. You may download, display and print it for Your own personal use. Commercial use is prohibited." }]
|
|
78
|
+
};
|
|
79
|
+
it("Creates a validator", async () => {
|
|
80
|
+
const validator = await validatorFactory();
|
|
81
|
+
assert.equal(typeof validator, "object");
|
|
82
|
+
assert.equal(typeof validator.description, "string");
|
|
83
|
+
assert.equal(typeof validator.validate, "function");
|
|
84
|
+
});
|
|
85
|
+
const test = await (async () => {
|
|
86
|
+
const validator = await validatorFactory();
|
|
87
|
+
return {
|
|
88
|
+
validate: async (valid, ...recfields) => {
|
|
89
|
+
const result = await validator.validate(new MarcRecord({ fields: recfields }));
|
|
90
|
+
assert.deepEqual(result, { valid });
|
|
91
|
+
},
|
|
92
|
+
fix: async (recfields, resfields) => {
|
|
93
|
+
const record = new MarcRecord({ fields: recfields });
|
|
94
|
+
await validator.fix(record);
|
|
95
|
+
assert.deepEqual(record.fields, resfields);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
})();
|
|
99
|
+
describe("#validate", () => {
|
|
100
|
+
it("Finds the record valid; fields 5061 and 540 are missing but its ok since record is not electronic", async () => {
|
|
101
|
+
await test.validate(true, f337nonElectronic);
|
|
102
|
+
});
|
|
103
|
+
it("Finds the record valid; Legal deposit fields 5061 and 540", async () => {
|
|
104
|
+
await test.validate(true, f337, ldf5061new, ldf540);
|
|
105
|
+
});
|
|
106
|
+
it("Finds the record invalid; Old phrase in 5061", async () => {
|
|
107
|
+
await test.validate(false, f337, ldf5061old, ldf540);
|
|
108
|
+
});
|
|
109
|
+
it("Finds the record invalid; Missing 5061", async () => {
|
|
110
|
+
await test.validate(false, f337, f5060, ldf540);
|
|
111
|
+
});
|
|
112
|
+
it("Finds the record invalid; Missing 540", async () => {
|
|
113
|
+
await test.validate(false, f337, ldf5061new, f540);
|
|
114
|
+
});
|
|
115
|
+
it("Finds the record invalid; Missing 5061 and 540", async () => {
|
|
116
|
+
await test.validate(false, f337, f5060, f540);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
describe("#fix", () => {
|
|
120
|
+
it("Legal deposit fields 5061 and 540; Nothing to add", async () => {
|
|
121
|
+
await test.fix([ldf5061new, ldf540], [ldf5061new, ldf540]);
|
|
122
|
+
});
|
|
123
|
+
it("Old phrase in 5061; Overwritten with new phrase", async () => {
|
|
124
|
+
await test.fix([ldf5061old, ldf540], [ldf5061new, ldf540]);
|
|
125
|
+
});
|
|
126
|
+
it("540 but missing 5061; Adds 5061", async () => {
|
|
127
|
+
await test.fix([f5060, ldf540], [f5060, ldf5061new, ldf540]);
|
|
128
|
+
});
|
|
129
|
+
it("5061 but missing 540; Adds 540", async () => {
|
|
130
|
+
await test.fix([ldf5061new, f540], [ldf5061new, f540, ldf540]);
|
|
131
|
+
});
|
|
132
|
+
it("Both, 5061 and 540, missing; Adds 5061 and 540", async () => {
|
|
133
|
+
await test.fix([f5060, f540], [f5060, ldf5061new, f540, ldf540]);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
//# sourceMappingURL=access-rights.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/access-rights.test.js"],
|
|
4
|
+
"sourcesContent": ["import assert from 'node:assert';\nimport {describe, it} from 'node:test';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './access-rights.js';\n\n\ndescribe('access-rights', async () => {\n // Fields\n const f337 = {\n tag: '337',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'b', value: 'c'},\n {code: '2', value: 'rdamedia'}\n ]\n };\n\n const f337nonElectronic = {\n tag: '337',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'k\u00E4ytett\u00E4viss\u00E4 ilman laitetta'},\n {code: 'b', value: 'n'},\n {code: '2', value: 'rdamedia'}\n ]\n };\n\n const ldf5061old = {\n tag: '506',\n ind1: '1',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on k\u00E4ytett\u00E4viss\u00E4 vapaakappalekirjastoissa.'},\n {code: 'f', value: 'Online access with authorization'},\n {code: '2', value: 'star'},\n {code: '5', value: 'FI-Vapaa'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n\n const ldf5061new = {\n tag: '506',\n ind1: '1',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on k\u00E4ytett\u00E4viss\u00E4 vapaakappalety\u00F6asemilla.'},\n {code: 'f', value: 'Online access with authorization'},\n {code: '2', value: 'star'},\n {code: '5', value: 'FI-Vapaa'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n\n\n const ldf540 = {\n tag: '540',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on k\u00E4ytett\u00E4viss\u00E4 tutkimus- ja muihin tarkoituksiin;'},\n {code: 'b', value: 'Kansalliskirjasto;'},\n {code: 'c', value: 'Laki kulttuuriaineistojen tallettamisesta ja s\u00E4ilytt\u00E4misest\u00E4'},\n {code: 'u', value: 'http://www.finlex.fi/fi/laki/ajantasa/2007/20071433'},\n {code: '5', value: 'FI-Vapaa'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n\n const f5060 = {\n tag: '506',\n ind1: '0',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Aineisto on vapaasti saatavissa.'},\n {code: 'f', value: 'Unrestricted online access'},\n {code: '2', value: 'star'},\n {code: '9', value: 'FENNI<KEEP>'}\n ]\n };\n\n const f540 = {\n tag: '540',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'c', value: 'This publication is copyrighted. You may download, display and print it for Your own personal use. Commercial use is prohibited.'}]\n };\n\n it('Creates a validator', async () => {\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\n // Tests\n const test = await (async () => {\n const validator = await validatorFactory();\n return {\n validate: async (valid, ...recfields) => {\n const result = await validator.validate(new MarcRecord({fields: recfields}));\n assert.deepEqual(result, {valid});\n },\n\n fix: async (recfields, resfields) => {\n const record = new MarcRecord({fields: recfields});\n await validator.fix(record);\n assert.deepEqual(record.fields, resfields);\n }\n };\n })();\n\n describe('#validate', () => {\n it('Finds the record valid; fields 5061 and 540 are missing but its ok since record is not electronic', async () => {\n await test.validate(true, f337nonElectronic);\n });\n\n it('Finds the record valid; Legal deposit fields 5061 and 540', async () => {\n await test.validate(true, f337, ldf5061new, ldf540);\n });\n\n it('Finds the record invalid; Old phrase in 5061', async () => {\n await test.validate(false, f337, ldf5061old, ldf540);\n });\n\n it('Finds the record invalid; Missing 5061', async () => {\n await test.validate(false, f337, f5060, ldf540);\n });\n\n it('Finds the record invalid; Missing 540', async () => {\n await test.validate(false, f337, ldf5061new, f540);\n });\n\n it('Finds the record invalid; Missing 5061 and 540', async () => {\n await test.validate(false, f337, f5060, f540);\n });\n });\n\n describe('#fix', () => {\n it('Legal deposit fields 5061 and 540; Nothing to add', async () => {\n await test.fix([ldf5061new, ldf540], [ldf5061new, ldf540]);\n });\n\n it('Old phrase in 5061; Overwritten with new phrase', async () => {\n await test.fix([ldf5061old, ldf540], [ldf5061new, ldf540]);\n });\n\n it('540 but missing 5061; Adds 5061', async () => {\n await test.fix([f5060, ldf540], [f5060, ldf5061new, ldf540]);\n });\n\n it('5061 but missing 540; Adds 540', async () => {\n await test.fix([ldf5061new, f540], [ldf5061new, f540, ldf540]);\n });\n\n it('Both, 5061 and 540, missing; Adds 5061 and 540', async () => {\n await test.fix([f5060, f540], [f5060, ldf5061new, f540, ldf540]);\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,40 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = _default;
|
|
7
|
-
exports.getLanguageCode = getLanguageCode;
|
|
8
|
-
var _utils = require("./utils");
|
|
9
|
-
//import createDebugLogger from 'debug';
|
|
10
|
-
|
|
11
|
-
const description = 'Add missing 041 field based on 008/35-37';
|
|
12
|
-
|
|
13
|
-
// const multimediaRegexp = /multimedia/ui;
|
|
14
|
-
|
|
15
|
-
function _default() {
|
|
1
|
+
import { fieldToString, nvdebug } from "./utils.js";
|
|
2
|
+
const description = "Add missing 041 field based on 008/35-37";
|
|
3
|
+
export default function() {
|
|
16
4
|
return {
|
|
17
5
|
description,
|
|
18
6
|
validate,
|
|
19
7
|
fix
|
|
20
8
|
};
|
|
21
|
-
function isRealLanguageCode(languageCode =
|
|
22
|
-
|
|
23
|
-
if (!languageCode.match(/^[a-z]{3}$/u) || [
|
|
9
|
+
function isRealLanguageCode(languageCode = "|||") {
|
|
10
|
+
nvdebug(`Language code 008/35-37: ${languageCode}`);
|
|
11
|
+
if (!languageCode.match(/^[a-z]{3}$/u) || ["mul", "und", "zxx"].includes(languageCode)) {
|
|
24
12
|
return false;
|
|
25
13
|
}
|
|
26
|
-
// Assume that value is valid:
|
|
27
14
|
return true;
|
|
28
15
|
}
|
|
29
16
|
function determineSubfieldCode(record) {
|
|
30
17
|
const typeOfRecord = record.getTypeOfRecord(record);
|
|
31
|
-
if (typeOfRecord ===
|
|
32
|
-
return
|
|
18
|
+
if (typeOfRecord === "i" || typeOfRecord === "j") {
|
|
19
|
+
return "d";
|
|
33
20
|
}
|
|
34
|
-
return
|
|
21
|
+
return "a";
|
|
35
22
|
}
|
|
36
23
|
function generateContent(record) {
|
|
37
|
-
const languageCodeFields = record.get(
|
|
24
|
+
const languageCodeFields = record.get("041");
|
|
38
25
|
if (languageCodeFields.length > 0) {
|
|
39
26
|
return null;
|
|
40
27
|
}
|
|
@@ -43,25 +30,12 @@ function _default() {
|
|
|
43
30
|
return null;
|
|
44
31
|
}
|
|
45
32
|
const subfieldCode = determineSubfieldCode(record);
|
|
46
|
-
|
|
47
|
-
return {
|
|
48
|
-
tag: '041',
|
|
49
|
-
ind1: ' ',
|
|
50
|
-
ind2: ' ',
|
|
51
|
-
subfields: [{
|
|
52
|
-
code: subfieldCode,
|
|
53
|
-
value: languageCode
|
|
54
|
-
}]
|
|
55
|
-
};
|
|
33
|
+
return { tag: "041", ind1: " ", ind2: " ", subfields: [{ code: subfieldCode, value: languageCode }] };
|
|
56
34
|
}
|
|
57
35
|
function fix(record) {
|
|
58
|
-
|
|
36
|
+
nvdebug(`FIX ${description}...`);
|
|
59
37
|
const data = generateContent(record);
|
|
60
|
-
const res = {
|
|
61
|
-
message: [],
|
|
62
|
-
fix: [],
|
|
63
|
-
valid: true
|
|
64
|
-
};
|
|
38
|
+
const res = { message: [], fix: [], valid: true };
|
|
65
39
|
if (data) {
|
|
66
40
|
record.insertField(data);
|
|
67
41
|
return res;
|
|
@@ -69,26 +43,20 @@ function _default() {
|
|
|
69
43
|
return res;
|
|
70
44
|
}
|
|
71
45
|
function validate(record) {
|
|
72
|
-
|
|
46
|
+
nvdebug(`VALIDATE ${description}...`);
|
|
73
47
|
const data = generateContent(record);
|
|
74
48
|
if (!data) {
|
|
75
|
-
return {
|
|
76
|
-
message: [],
|
|
77
|
-
valid: true
|
|
78
|
-
};
|
|
49
|
+
return { message: [], valid: true };
|
|
79
50
|
}
|
|
80
|
-
const msg = `${description}: '${
|
|
81
|
-
return {
|
|
82
|
-
message: [msg],
|
|
83
|
-
valid: false
|
|
84
|
-
};
|
|
51
|
+
const msg = `${description}: '${fieldToString(data)}'`;
|
|
52
|
+
return { message: [msg], valid: false };
|
|
85
53
|
}
|
|
86
54
|
}
|
|
87
|
-
function getLanguageCode(record) {
|
|
88
|
-
const [f008] = record.get(
|
|
55
|
+
export function getLanguageCode(record) {
|
|
56
|
+
const [f008] = record.get("008");
|
|
89
57
|
if (f008 && f008.value.length === 40) {
|
|
90
58
|
return f008.value.substring(35, 38);
|
|
91
59
|
}
|
|
92
|
-
return
|
|
60
|
+
return "|||";
|
|
93
61
|
}
|
|
94
|
-
//# sourceMappingURL=addMissingField041.js.map
|
|
62
|
+
//# sourceMappingURL=addMissingField041.js.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/addMissingField041.js"],
|
|
4
|
+
"sourcesContent": ["//import createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils.js';\n\nconst description = 'Add missing 041 field based on 008/35-37';\n\n// const multimediaRegexp = /multimedia/ui;\n\nexport default function () {\n\n return {\n description, validate, fix\n };\n\n function isRealLanguageCode(languageCode = '|||') {\n nvdebug(`Language code 008/35-37: ${languageCode}`);\n if (!languageCode.match(/^[a-z]{3}$/u) || ['mul', 'und', 'zxx'].includes(languageCode)) {\n return false;\n }\n // Assume that value is valid:\n return true;\n }\n\n function determineSubfieldCode(record) {\n const typeOfRecord = record.getTypeOfRecord(record);\n if (typeOfRecord === 'i' || typeOfRecord === 'j') {\n return 'd';\n }\n return 'a';\n }\n\n function generateContent(record) {\n const languageCodeFields = record.get('041');\n if (languageCodeFields.length > 0) {\n return null;\n }\n const languageCode = getLanguageCode(record);\n if (!isRealLanguageCode(languageCode)) {\n return null;\n }\n const subfieldCode = determineSubfieldCode(record);\n // NB! Usemarcon-bookwhere had IND1=0...\n return {tag: '041', ind1: ' ', ind2: ' ', subfields: [{code: subfieldCode, value: languageCode}]};\n }\n\n function fix(record) {\n nvdebug(`FIX ${description}...`);\n const data = generateContent(record);\n const res = {message: [], fix: [], valid: true};\n if (data) {\n record.insertField(data);\n return res;\n }\n return res;\n }\n\n function validate(record) {\n nvdebug(`VALIDATE ${description}...`);\n const data = generateContent(record);\n if (!data) {\n return {message: [], valid: true};\n }\n const msg = `${description}: '${fieldToString(data)}'`;\n return {message: [msg], valid: false};\n }\n}\n\nexport function getLanguageCode(record) {\n const [f008] = record.get('008');\n if (f008 && f008.value.length === 40) {\n return f008.value.substring(35, 38);\n }\n return '|||';\n}\n"],
|
|
5
|
+
"mappings": "AACA,SAAQ,eAAe,eAAc;AAErC,MAAM,cAAc;AAIpB,0BAA2B;AAEzB,SAAO;AAAA,IACL;AAAA,IAAa;AAAA,IAAU;AAAA,EACzB;AAEA,WAAS,mBAAmB,eAAe,OAAO;AAChD,YAAQ,4BAA4B,YAAY,EAAE;AAClD,QAAI,CAAC,aAAa,MAAM,aAAa,KAAK,CAAC,OAAO,OAAO,KAAK,EAAE,SAAS,YAAY,GAAG;AACtF,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB,QAAQ;AACrC,UAAM,eAAe,OAAO,gBAAgB,MAAM;AAClD,QAAI,iBAAiB,OAAO,iBAAiB,KAAK;AAChD,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,WAAS,gBAAgB,QAAQ;AAC/B,UAAM,qBAAqB,OAAO,IAAI,KAAK;AAC3C,QAAI,mBAAmB,SAAS,GAAG;AACjC,aAAO;AAAA,IACT;AACA,UAAM,eAAe,gBAAgB,MAAM;AAC3C,QAAI,CAAC,mBAAmB,YAAY,GAAG;AACrC,aAAO;AAAA,IACT;AACA,UAAM,eAAe,sBAAsB,MAAM;AAEjD,WAAO,EAAC,KAAK,OAAO,MAAM,KAAK,MAAM,KAAK,WAAW,CAAC,EAAC,MAAM,cAAc,OAAO,aAAY,CAAC,EAAC;AAAA,EAClG;AAEA,WAAS,IAAI,QAAQ;AACnB,YAAQ,OAAO,WAAW,KAAK;AAC/B,UAAM,OAAO,gBAAgB,MAAM;AACnC,UAAM,MAAM,EAAC,SAAS,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,KAAI;AAC9C,QAAI,MAAM;AACR,aAAO,YAAY,IAAI;AACvB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAAS,QAAQ;AACxB,YAAQ,YAAY,WAAW,KAAK;AACpC,UAAM,OAAO,gBAAgB,MAAM;AACnC,QAAI,CAAC,MAAM;AACT,aAAO,EAAC,SAAS,CAAC,GAAG,OAAO,KAAI;AAAA,IAClC;AACA,UAAM,MAAM,GAAG,WAAW,MAAM,cAAc,IAAI,CAAC;AACnD,WAAO,EAAC,SAAS,CAAC,GAAG,GAAG,OAAO,MAAK;AAAA,EACtC;AACF;AAEO,gBAAS,gBAAgB,QAAQ;AACtC,QAAM,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK;AAC/B,MAAI,QAAQ,KAAK,MAAM,WAAW,IAAI;AACpC,WAAO,KAAK,MAAM,UAAU,IAAI,EAAE;AAAA,EACpC;AACA,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import { MarcRecord } from "@natlibfi/marc-record";
|
|
3
|
+
import validatorFactory from "./addMissingField041.js";
|
|
4
|
+
import { READERS } from "@natlibfi/fixura";
|
|
5
|
+
import generateTests from "@natlibfi/fixugen";
|
|
6
|
+
generateTests({
|
|
7
|
+
callback,
|
|
8
|
+
path: [import.meta.dirname, "..", "test-fixtures", "addMissingField041"],
|
|
9
|
+
useMetadataFile: true,
|
|
10
|
+
recurse: false,
|
|
11
|
+
fixura: {
|
|
12
|
+
reader: READERS.JSON
|
|
13
|
+
},
|
|
14
|
+
hooks: {
|
|
15
|
+
before: async () => {
|
|
16
|
+
testValidatorFactory();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
async function testValidatorFactory() {
|
|
21
|
+
const validator = await validatorFactory();
|
|
22
|
+
assert.equal(typeof validator, "object");
|
|
23
|
+
assert.equal(typeof validator.description, "string");
|
|
24
|
+
assert.equal(typeof validator.validate, "function");
|
|
25
|
+
assert.equal(typeof validator.fix, "function");
|
|
26
|
+
}
|
|
27
|
+
async function callback({ getFixture, fix = false }) {
|
|
28
|
+
const validator = await validatorFactory();
|
|
29
|
+
const record = new MarcRecord(getFixture("record.json"));
|
|
30
|
+
const expectedResult = getFixture("expectedResult.json");
|
|
31
|
+
if (!fix) {
|
|
32
|
+
const result = await validator.validate(record);
|
|
33
|
+
assert.deepEqual(result, expectedResult);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
await validator.fix(record);
|
|
37
|
+
assert.deepEqual(record, expectedResult);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=addMissingField041.test.js.map
|