@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 +1,7 @@
|
|
|
1
|
-
{"version":3,"file":"removeDuplicateDataFields.js","names":["_debug","_interopRequireDefault","require","_utils","_subfield6Utils","_subfield8Utils","e","__esModule","default","LINK_ROOT","LINKED_AND_PROCESSED","LINKED_NOT_PROCESSED","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","removeDuplicateDatafields","duplicates","length","removeLinkNotes","fields","forEach","f","linkNote","newGetAllLinkedFields","field","useSixes","useEights","currField","undefined","related6s","get6s","linkField","related8s","add8s","find","linkedFields","filter","recordRemoveFieldOrSubfield8","currLinkingNumber","eights","subfields","sf","code","removeField","getSubfield8LinkingNumber","removeSubfield","newRecordRemoveFieldOrSubfield8","deleted","modified","removeDuplicateSubfield8Chains","seen","removables","seenLinkingNumbers","recordGetAllSubfield8LinkingNumbers","join","recordGetFieldsWithSubfield8LinkingNumber","normalizeOccurrenceNumber","linkedFieldsAsString","fieldsToNormalizedString","includes","push","fieldsToString","handleDuplicateSubfield8Chains","markIdenticalSubfield6Chains","chain","normalizeTag","some","tag","substring","chainAsString","compareWithChain","fieldToString","otherChain","fieldToChain","sameField","otherChainAsString","markIdenticalLoneFieldsAsDeletable","fieldAsString","fieldToNormalizedString","identicalLoneFields","acceptFieldsWithSubfield6","fieldsWithSubfield6","non880","occurrenceNumbers","fieldsGetOccurrenceNumbers","isSingleTagLinkingNumber","linkingNumber","relevantFields","fieldHasLinkingNumber","acceptFieldsWithSubfield8","fieldsWithSubfield8","requireSingleTag","linkingNumbers","fieldsGetAllSubfield8LinkingNumbers","anomaly8","f880","field1","field2","tmpMyId","result","isChainHead","fieldHasValidSubfield6","fieldHasValidSubfield8","fieldHandleDuplicateDatafields","dataFields","deletableFields","modifiedFields","map"],"sources":["../src/removeDuplicateDataFields.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldsToString, fieldToString, nvdebug} from './utils';\nimport {fieldHasValidSubfield6, fieldsGetOccurrenceNumbers, fieldsToNormalizedString, fieldToNormalizedString, get6s} from './subfield6Utils';\nimport {add8s, fieldHasLinkingNumber, fieldHasValidSubfield8, fieldsGetAllSubfield8LinkingNumbers, getSubfield8LinkingNumber, recordGetAllSubfield8LinkingNumbers, recordGetFieldsWithSubfield8LinkingNumber} from './subfield8Utils';\n\nconst LINK_ROOT = 4;\nconst LINKED_AND_PROCESSED = 2;\nconst LINKED_NOT_PROCESSED = 1;\n\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:removeDuplicateDataFields');\n\nexport default function () {\n return {\n description: 'Remove duplicate data fields. Certain exceptions apply, mainly too complited chained fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Remove duplicate data fields');\n const res = {message: [], fix: [], valid: true};\n removeDuplicateDatafields(record, true);\n // This can not really fail...\n return res;\n }\n\n function validate(record) {\n // Check max, and check number of different indexes\n nvdebug('Validate record: duplicate data fields cause (t)error', debug);\n\n const duplicates = removeDuplicateDatafields(record, false);\n\n //const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);\n\n const res = {message: duplicates};\n\n /*\n if (orphanedFields.length > 0) {\n res.message = [`${orphanedFields.length} orphaned occurrence number field(s) detected`];\n }\n */\n res.valid = res.message.length < 1;\n return res;\n }\n}\n\n\n/*\nfunction numberOfLinkageSubfields(field) {\n nvdebug(`N of Linkage Subs(${fieldToString(field)})`);\n const subfields = field.subfields.filter(sf => sf.code === '6' || sf.code === '8');\n return subfields.length;\n}\n*/\n\nfunction removeLinkNotes(record) {\n record.fields.forEach(f => delete f.linkNote); // eslint-disable-line array-callback-return\n}\n\n\nfunction newGetAllLinkedFields(field, record, useSixes = true, useEights = true) {\n removeLinkNotes(record); // should be clear, but let's play safe\n\n /* eslint-disable */\n field.linkNote = LINK_ROOT;\n\n let currField = field;\n\n // Loop until all linked fields have been processed:\n while (currField !== undefined) {\n if (useSixes) {\n const related6s = get6s(currField, record.fields)\n related6s.forEach(f => linkField(f));\n }\n if (useEights) {\n const related8s = add8s([currField], record);\n related8s.forEach(f => linkField(f));\n }\n if (currField.linkNote !== LINK_ROOT) {\n currField.linkNote = LINKED_AND_PROCESSED;\n }\n currField = record.fields.find(f => f.linkNote === LINKED_NOT_PROCESSED);\n }\n\n // Collect relevant fields:\n const linkedFields = record.fields.filter(f => f.linkNote);\n\n removeLinkNotes(record);\n\n return linkedFields;\n\n function linkField(f) {\n if (!f.linkNote) {\n f.linkNote = LINKED_NOT_PROCESSED;\n }\n }\n\n\n /* eslint-enable */\n}\n\n\nfunction recordRemoveFieldOrSubfield8(record, field, currLinkingNumber) {\n const eights = field.subfields.filter(sf => sf.code === '8');\n if (eights.length < 2) {\n record.removeField(field);\n return;\n }\n const subfields = field.subfields.filter(sf => getSubfield8LinkingNumber(sf) === currLinkingNumber);\n subfields.forEach(sf => record.removeSubfield(sf, field)); // eslint-disable-line array-callback-return\n}\n\nfunction newRecordRemoveFieldOrSubfield8(record, field, currLinkingNumber, fix) {\n const eights = field.subfields.filter(sf => sf.code === '8');\n if (eights.length < 2) {\n field.deleted = 1;\n return;\n }\n const subfields = field.subfields.filter(sf => getSubfield8LinkingNumber(sf) === currLinkingNumber);\n subfields.forEach(sf => {\n field.modified = 1;\n if (fix) {\n record.removeSubfield(sf, field);\n }\n });\n}\n\n\nexport function removeDuplicateSubfield8Chains(record, fix = true) {\n\n // Seen $8 subsfields in various fields:\n // 161 700\n // 17 710\n // 11 110\n // 8 730\n // 1 100\n // Given these stats, there's no need to check for 1XX-vs-7XX removals\n\n /* eslint-disable */\n let seen = {};\n\n let removables = []; // for validation\n\n nvdebug(\"CHAIN-8\");\n const seenLinkingNumbers = recordGetAllSubfield8LinkingNumbers(record);\n if (seenLinkingNumbers.length === 0) {\n return removables;\n }\n\n nvdebug(`seen linking numbers ($8): ${seenLinkingNumbers.join(', ')}`, debug);\n\n seenLinkingNumbers.forEach(currLinkingNumber => {\n const linkedFields = recordGetFieldsWithSubfield8LinkingNumber(record, currLinkingNumber) //getFieldsWithSubfield8Index(base, baseIndex);\n // As/If there's just one occurrence number it should be fine to use normalizeOccurrenceNumber = true\n const normalizeOccurrenceNumber = true;\n const linkedFieldsAsString = fieldsToNormalizedString(linkedFields, currLinkingNumber, normalizeOccurrenceNumber, true);\n nvdebug(`Results for LINKING NUMBER ${currLinkingNumber}:`, debug);\n nvdebug(`${linkedFieldsAsString}`, debug);\n\n if (linkedFieldsAsString in seen) {\n if (!removables.includes(linkedFieldsAsString)) {\n removables.push(linkedFieldsAsString);\n }\n\n if (fix) {\n nvdebug(`$8 CHAIN FIX: REMOVE $8 GROUP: ${fieldsToString(linkedFields)}`, debug);\n linkedFields.forEach(field => recordRemoveFieldOrSubfield8(record, field, currLinkingNumber));\n return;\n }\n\n nvdebug(`$8 VALIDATION: DUPLICATE DETECTED ${linkedFieldsAsString}`, debug);\n return;\n }\n nvdebug(`$8 DOUBLE REMOVAL OR VALIDATION: ADD2SEEN ${linkedFieldsAsString}`, debug);\n seen[linkedFieldsAsString] = 1;\n return;\n });\n\n /* eslint-enable */\n return removables;\n}\n\n\nexport function handleDuplicateSubfield8Chains(record, fix) {\n\n // Seen $8 subsfields in various fields:\n // 161 700\n // 17 710\n // 11 110\n // 8 730\n // 1 100\n // Given these stats, there's no need to check for 1XX-vs-7XX removals\n\n /* eslint-disable */\n let seen = {};\n\n nvdebug(\"CHAIN-8\");\n const seenLinkingNumbers = recordGetAllSubfield8LinkingNumbers(record);\n if (seenLinkingNumbers.length === 0) {\n return;\n }\n\n nvdebug(`seen linking numbers ($8): ${seenLinkingNumbers.join(', ')}`, debug);\n\n seenLinkingNumbers.forEach(currLinkingNumber => {\n const linkedFields = recordGetFieldsWithSubfield8LinkingNumber(record, currLinkingNumber) //getFieldsWithSubfield8Index(base, baseIndex);\n // As/If there's just one occurrence number it should be fine to use normalizeOccurrenceNumber = true\n const normalizeOccurrenceNumber = false; //true;\n const linkedFieldsAsString = fieldsToNormalizedString(linkedFields, currLinkingNumber, normalizeOccurrenceNumber, true);\n nvdebug(`Results for LINKING NUMBER ${currLinkingNumber}:`, debug);\n nvdebug(`${linkedFieldsAsString}`, debug);\n\n if (linkedFieldsAsString in seen) {\n nvdebug(`$8 CHAIN FIX: REMOVE $8 GROUP: ${fieldsToString(linkedFields)}`, debug);\n linkedFields.forEach(field => newRecordRemoveFieldOrSubfield8(record, field, currLinkingNumber, fix));\n return;\n }\n nvdebug(`$8 DOUBLE REMOVAL OR VALIDATION: ADD2SEEN ${linkedFieldsAsString}`, debug);\n seen[linkedFieldsAsString] = 1;\n return;\n });\n\n /* eslint-enable */\n\n}\n\nfunction markIdenticalSubfield6Chains(chain, record) {\n const normalizeOccurrenceNumber = true;\n const normalizeTag = chain.some(field => field.tag.substring(0, 1) === '1'); // 1XX can delete 7XX as well!\n const chainAsString = fieldsToNormalizedString(chain, 0, normalizeOccurrenceNumber, normalizeTag);\n\n nvdebug(`markIdenticalSubfield6Chains: ${chainAsString}`);\n record.fields.forEach(f => compareWithChain(f)); // eslint-disable-line array-callback-return\n\n\n function compareWithChain(f) {\n nvdebug(`FIELD2CHAIN ${fieldToString(f)}`);\n const otherChain = fieldToChain(f, record);\n // Not a lone field or chain (head) or ... or is-same-chain\n if (otherChain.length === 0 || sameField(chain[0], otherChain[0])) {\n return;\n }\n const otherChainAsString = fieldsToNormalizedString(otherChain, 0, normalizeOccurrenceNumber, normalizeTag);\n\n // Mark other chain as deleted:\n if (chainAsString === otherChainAsString) {\n otherChain.forEach(f => {\n nvdebug(` mark ${fieldToString(f)} as deleted ($6-chain)...`);\n f.deleted = 1;\n });\n return;\n }\n }\n\n}\n\nfunction markIdenticalLoneFieldsAsDeletable(field, record) {\n if (field.deleted) {\n return;\n }\n // targetLinkingNumber = 0, normalizedOccurenceNumber = false, normalizeTag = true)\n const normalizeTag = field.tag.substring(0, 1) === '1'; // 1XX can delete 7XX as well!\n const fieldAsString = fieldToNormalizedString(field, 0, false, normalizeTag);\n\n const identicalLoneFields = record.fields.filter(f => !sameField(f, field) && fieldToNormalizedString(f, 0, false, normalizeTag) === fieldAsString);\n\n // Mark fields as deleted:\n identicalLoneFields.forEach(f => {\n nvdebug(` mark ${fieldToString(f)} as deleted (lone field)...`);\n f.deleted = 1;\n });\n\n}\n\nfunction acceptFieldsWithSubfield6(fieldsWithSubfield6) {\n // There can be only one non-880 field:\n const non880 = fieldsWithSubfield6.filter(f => f.tag !== '880');\n if (non880.length > 1) {\n return false;\n }\n\n const occurrenceNumbers = fieldsGetOccurrenceNumbers(fieldsWithSubfield6);\n // Chain can contain only single occurrence number:\n if (occurrenceNumbers.length > 1) {\n return false;\n }\n\n return true;\n}\n\n\nfunction isSingleTagLinkingNumber(linkingNumber, fields, tag) {\n const relevantFields = fields.filter(f => fieldHasLinkingNumber(f, linkingNumber));\n if (relevantFields.some(f => f.tag !== tag)) {\n return false;\n }\n return true;\n}\n\nfunction acceptFieldsWithSubfield8(fieldsWithSubfield8, requireSingleTag = false) {\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fieldsWithSubfield8);\n if (linkingNumbers.some(linkingNumber => anomaly8(linkingNumber))) {\n return false;\n }\n return true;\n\n // If linking number\n function anomaly8(linkingNumber) {\n nvdebug(` Looking for anomalies in linkin number ${linkingNumber}`);\n const relevantFields = fieldsWithSubfield8.filter(f => fieldHasLinkingNumber(f, linkingNumber));\n if (requireSingleTag) {\n return !isSingleTagLinkingNumber(linkingNumber, relevantFields, relevantFields[0].tag);\n }\n\n const f880 = relevantFields.filter(f => f.tag === '880');\n if (f880.length === 0 || f880.length === relevantFields.length) {\n return false;\n }\n return true;\n }\n}\n\n\nexport function sameField(field1, field2) {\n field1.tmpMyId = 666;\n const result = field2.tmpMyId === 666 ? true : false;\n delete field1.tmpMyId;\n return result;\n}\n\nexport function isChainHead(field, chain) {\n return sameField(field, chain[0]);\n}\n\nexport function fieldToChain(field, record) {\n if (field.deleted || !field.subfields) {\n return [];\n }\n const chain = newGetAllLinkedFields(field, record, true, true);\n\n nvdebug(` Chain contains ${chain.length} field(s)`);\n if (!isChainHead(field, chain)) { // newGetAllLinkedFields() marks relevant record.fields!\n return [];\n }\n\n const fieldsWithSubfield6 = chain.filter(f => fieldHasValidSubfield6(f));\n // Hack: multiple $6 fields, but either all are non-880 or all are 880: treat field as a single entry\n if (fieldsWithSubfield6.length > 0) {\n const non880 = fieldsWithSubfield6.filter(f => f.tag !== '880');\n if (non880.length === 0 || non880.length === fieldsWithSubfield6.length) {\n return [field];\n }\n if (non880.length !== 1) {\n return [field];\n }\n }\n\n if (!acceptFieldsWithSubfield6(fieldsWithSubfield6)) { // Check tag subfield $6s are legal(ish)\n return [];\n }\n const fieldsWithSubfield8 = chain.filter(f => fieldHasValidSubfield8(f));\n if (!acceptFieldsWithSubfield8(fieldsWithSubfield8, false)) {\n return [];\n }\n\n //nvdebug(`Proceed with ${fieldsToString(chain)}`);\n\n\n return chain;\n}\n\n\nfunction fieldHandleDuplicateDatafields(field, record) {\n const chain = fieldToChain(field, record);\n nvdebug(` TRY TO HANDLE DUPLICATES OF '${fieldsToString(chain)}'`);\n\n if (chain.length === 0) {\n return;\n }\n\n const fieldsWithSubfield6 = chain.filter(f => fieldHasValidSubfield6(f));\n const fieldsWithSubfield8 = chain.filter(f => fieldHasValidSubfield8(f));\n\n // Lone fields:\n if (chain.length === 1) {\n markIdenticalLoneFieldsAsDeletable(chain[0], record);\n return;\n }\n if (fieldsWithSubfield6.length === 0) {\n\n if (fieldsWithSubfield8.length === 0) { // chain.length === 1?\n nvdebug(` Trying to find duplicates of single field '${fieldToString(chain[0])}'`);\n markIdenticalLoneFieldsAsDeletable(chain[0], record);\n return;\n }\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fieldsWithSubfield8);\n if (linkingNumbers.length < 2) {\n markIdenticalSubfield6Chains(chain, record);\n return;\n }\n }\n\n if (fieldsWithSubfield6.length > 0 && acceptFieldsWithSubfield8(fieldsWithSubfield8, true)) { // Checks that non-880 tags are all same\n // Chain is removable\n markIdenticalSubfield6Chains(chain, record);\n return;\n }\n\n\n nvdebug(` NO HANDLER FOUND FOR '${fieldsToString(chain)}'`);\n nvdebug(` N8s: ${fieldsWithSubfield6.length}`);\n\n}\n\n\nexport function removeDuplicateDatafields(record, fix = true) {\n // Sometimes only $8 subfield (vs the whole field) is removed. Thus they are handled separately:\n handleDuplicateSubfield8Chains(record, fix);\n\n const dataFields = record.fields.filter(f => f.subfields !== undefined);\n\n dataFields.forEach(f => fieldHandleDuplicateDatafields(f, record)); // eslint-disable-line array-callback-return\n\n const deletableFields = dataFields.filter(f => f.deleted);\n const modifiedFields = dataFields.filter(f => f.modified && !f.deleted);\n\n const result = deletableFields.map(f => `DEL: ${fieldToString(f)}`);\n if (modifiedFields.length) {\n modifiedFields.forEach(f => delete f.modified); // eslint-disable-line array-callback-return\n result.push(modifiedFields.map(f => `MOD: ${fieldToString(f)}`));\n }\n\n if (fix) {\n deletableFields.forEach(f => record.removeField(f)); // eslint-disable-line array-callback-return\n return result;\n }\n\n deletableFields.forEach(f => delete f.deleted); // eslint-disable-line array-callback-return\n deletableFields.forEach(f => delete f.modified); // eslint-disable-line array-callback-return\n\n\n return result;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/removeDuplicateDataFields.js"],
|
|
4
|
+
"sourcesContent": ["import createDebugLogger from 'debug';\nimport {fieldsToString, fieldToString, nvdebug} from './utils.js';\nimport {fieldHasValidSubfield6, fieldsGetOccurrenceNumbers, fieldsToNormalizedString, fieldToNormalizedString, get6s} from './subfield6Utils.js';\nimport {add8s, fieldHasLinkingNumber, fieldHasValidSubfield8, fieldsGetAllSubfield8LinkingNumbers, getSubfield8LinkingNumber, recordGetAllSubfield8LinkingNumbers, recordGetFieldsWithSubfield8LinkingNumber} from './subfield8Utils.js';\n\nconst LINK_ROOT = 4;\nconst LINKED_AND_PROCESSED = 2;\nconst LINKED_NOT_PROCESSED = 1;\n\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:removeDuplicateDataFields');\n\nexport default function () {\n return {\n description: 'Remove duplicate data fields. Certain exceptions apply, mainly too complited chained fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Remove duplicate data fields');\n const res = {message: [], fix: [], valid: true};\n removeDuplicateDatafields(record, true);\n // This can not really fail...\n return res;\n }\n\n function validate(record) {\n // Check max, and check number of different indexes\n nvdebug('Validate record: duplicate data fields cause (t)error', debug);\n\n const duplicates = removeDuplicateDatafields(record, false);\n\n //const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);\n\n const res = {message: duplicates};\n\n /*\n if (orphanedFields.length > 0) {\n res.message = [`${orphanedFields.length} orphaned occurrence number field(s) detected`];\n }\n */\n res.valid = res.message.length < 1;\n return res;\n }\n}\n\n\n/*\nfunction numberOfLinkageSubfields(field) {\n nvdebug(`N of Linkage Subs(${fieldToString(field)})`);\n const subfields = field.subfields.filter(sf => sf.code === '6' || sf.code === '8');\n return subfields.length;\n}\n*/\n\nfunction removeLinkNotes(record) {\n record.fields.forEach(f => delete f.linkNote);\n}\n\n\nfunction newGetAllLinkedFields(field, record, useSixes = true, useEights = true) {\n removeLinkNotes(record); // should be clear, but let's play safe\n\n field.linkNote = LINK_ROOT;\n\n let currField = field;\n\n // Loop until all linked fields have been processed:\n while (currField !== undefined) {\n if (useSixes) {\n const related6s = get6s(currField, record.fields)\n related6s.forEach(f => linkField(f));\n }\n if (useEights) {\n const related8s = add8s([currField], record);\n related8s.forEach(f => linkField(f));\n }\n if (currField.linkNote !== LINK_ROOT) {\n currField.linkNote = LINKED_AND_PROCESSED;\n }\n currField = record.fields.find(f => f.linkNote === LINKED_NOT_PROCESSED);\n }\n\n // Collect relevant fields:\n const linkedFields = record.fields.filter(f => f.linkNote);\n\n removeLinkNotes(record);\n\n return linkedFields;\n\n function linkField(f) {\n if (!f.linkNote) {\n f.linkNote = LINKED_NOT_PROCESSED;\n }\n }\n\n}\n\n\nfunction recordRemoveFieldOrSubfield8(record, field, currLinkingNumber) {\n const eights = field.subfields.filter(sf => sf.code === '8');\n if (eights.length < 2) {\n record.removeField(field);\n return;\n }\n const subfields = field.subfields.filter(sf => getSubfield8LinkingNumber(sf) === currLinkingNumber);\n subfields.forEach(sf => record.removeSubfield(sf, field));\n}\n\nfunction newRecordRemoveFieldOrSubfield8(record, field, currLinkingNumber, fix) {\n const eights = field.subfields.filter(sf => sf.code === '8');\n if (eights.length < 2) {\n field.deleted = 1;\n return;\n }\n const subfields = field.subfields.filter(sf => getSubfield8LinkingNumber(sf) === currLinkingNumber);\n subfields.forEach(sf => {\n field.modified = 1;\n if (fix) {\n record.removeSubfield(sf, field);\n }\n });\n}\n\n\nexport function removeDuplicateSubfield8Chains(record, fix = true) {\n\n // Seen $8 subsfields in various fields:\n // 161 700\n // 17 710\n // 11 110\n // 8 730\n // 1 100\n // Given these stats, there's no need to check for 1XX-vs-7XX removals\n\n let seen = {};\n\n let removables = []; // for validation\n\n nvdebug(\"CHAIN-8\");\n const seenLinkingNumbers = recordGetAllSubfield8LinkingNumbers(record);\n if (seenLinkingNumbers.length === 0) {\n return removables;\n }\n\n nvdebug(`seen linking numbers ($8): ${seenLinkingNumbers.join(', ')}`, debug);\n\n seenLinkingNumbers.forEach(currLinkingNumber => {\n const linkedFields = recordGetFieldsWithSubfield8LinkingNumber(record, currLinkingNumber) //getFieldsWithSubfield8Index(base, baseIndex);\n // As/If there's just one occurrence number it should be fine to use normalizeOccurrenceNumber = true\n const normalizeOccurrenceNumber = true;\n const linkedFieldsAsString = fieldsToNormalizedString(linkedFields, currLinkingNumber, normalizeOccurrenceNumber, true);\n nvdebug(`Results for LINKING NUMBER ${currLinkingNumber}:`, debug);\n nvdebug(`${linkedFieldsAsString}`, debug);\n\n if (linkedFieldsAsString in seen) {\n if (!removables.includes(linkedFieldsAsString)) {\n removables.push(linkedFieldsAsString);\n }\n\n if (fix) {\n nvdebug(`$8 CHAIN FIX: REMOVE $8 GROUP: ${fieldsToString(linkedFields)}`, debug);\n linkedFields.forEach(field => recordRemoveFieldOrSubfield8(record, field, currLinkingNumber));\n return;\n }\n\n nvdebug(`$8 VALIDATION: DUPLICATE DETECTED ${linkedFieldsAsString}`, debug);\n return;\n }\n nvdebug(`$8 DOUBLE REMOVAL OR VALIDATION: ADD2SEEN ${linkedFieldsAsString}`, debug);\n seen[linkedFieldsAsString] = 1;\n return;\n });\n\n return removables;\n}\n\n\nexport function handleDuplicateSubfield8Chains(record, fix) {\n\n // Seen $8 subsfields in various fields:\n // 161 700\n // 17 710\n // 11 110\n // 8 730\n // 1 100\n // Given these stats, there's no need to check for 1XX-vs-7XX removals\n\n let seen = {};\n\n nvdebug(\"CHAIN-8\");\n const seenLinkingNumbers = recordGetAllSubfield8LinkingNumbers(record);\n if (seenLinkingNumbers.length === 0) {\n return;\n }\n\n nvdebug(`seen linking numbers ($8): ${seenLinkingNumbers.join(', ')}`, debug);\n\n seenLinkingNumbers.forEach(currLinkingNumber => {\n const linkedFields = recordGetFieldsWithSubfield8LinkingNumber(record, currLinkingNumber) //getFieldsWithSubfield8Index(base, baseIndex);\n // As/If there's just one occurrence number it should be fine to use normalizeOccurrenceNumber = true\n const normalizeOccurrenceNumber = false; //true;\n const linkedFieldsAsString = fieldsToNormalizedString(linkedFields, currLinkingNumber, normalizeOccurrenceNumber, true);\n nvdebug(`Results for LINKING NUMBER ${currLinkingNumber}:`, debug);\n nvdebug(`${linkedFieldsAsString}`, debug);\n\n if (linkedFieldsAsString in seen) {\n nvdebug(`$8 CHAIN FIX: REMOVE $8 GROUP: ${fieldsToString(linkedFields)}`, debug);\n linkedFields.forEach(field => newRecordRemoveFieldOrSubfield8(record, field, currLinkingNumber, fix));\n return;\n }\n nvdebug(`$8 DOUBLE REMOVAL OR VALIDATION: ADD2SEEN ${linkedFieldsAsString}`, debug);\n seen[linkedFieldsAsString] = 1;\n return;\n });\n\n}\n\nfunction markIdenticalSubfield6Chains(chain, record) {\n const normalizeOccurrenceNumber = true;\n const normalizeTag = chain.some(field => field.tag.substring(0, 1) === '1'); // 1XX can delete 7XX as well!\n const chainAsString = fieldsToNormalizedString(chain, 0, normalizeOccurrenceNumber, normalizeTag);\n\n nvdebug(`markIdenticalSubfield6Chains: ${chainAsString}`);\n record.fields.forEach(f => compareWithChain(f));\n\n\n function compareWithChain(f) {\n nvdebug(`FIELD2CHAIN ${fieldToString(f)}`);\n const otherChain = fieldToChain(f, record);\n // Not a lone field or chain (head) or ... or is-same-chain\n if (otherChain.length === 0 || sameField(chain[0], otherChain[0])) {\n return;\n }\n const otherChainAsString = fieldsToNormalizedString(otherChain, 0, normalizeOccurrenceNumber, normalizeTag);\n\n // Mark other chain as deleted:\n if (chainAsString === otherChainAsString) {\n otherChain.forEach(f => {\n nvdebug(` mark ${fieldToString(f)} as deleted ($6-chain)...`);\n f.deleted = 1;\n });\n return;\n }\n }\n\n}\n\nfunction markIdenticalLoneFieldsAsDeletable(field, record) {\n if (field.deleted) {\n return;\n }\n // targetLinkingNumber = 0, normalizedOccurenceNumber = false, normalizeTag = true)\n const normalizeTag = field.tag.substring(0, 1) === '1'; // 1XX can delete 7XX as well!\n const fieldAsString = fieldToNormalizedString(field, 0, false, normalizeTag);\n\n const identicalLoneFields = record.fields.filter(f => !sameField(f, field) && fieldToNormalizedString(f, 0, false, normalizeTag) === fieldAsString);\n\n // Mark fields as deleted:\n identicalLoneFields.forEach(f => {\n nvdebug(` mark ${fieldToString(f)} as deleted (lone field)...`);\n f.deleted = 1;\n });\n\n}\n\nfunction acceptFieldsWithSubfield6(fieldsWithSubfield6) {\n // There can be only one non-880 field:\n const non880 = fieldsWithSubfield6.filter(f => f.tag !== '880');\n if (non880.length > 1) {\n return false;\n }\n\n const occurrenceNumbers = fieldsGetOccurrenceNumbers(fieldsWithSubfield6);\n // Chain can contain only single occurrence number:\n if (occurrenceNumbers.length > 1) {\n return false;\n }\n\n return true;\n}\n\n\nfunction isSingleTagLinkingNumber(linkingNumber, fields, tag) {\n const relevantFields = fields.filter(f => fieldHasLinkingNumber(f, linkingNumber));\n if (relevantFields.some(f => f.tag !== tag)) {\n return false;\n }\n return true;\n}\n\nfunction acceptFieldsWithSubfield8(fieldsWithSubfield8, requireSingleTag = false) {\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fieldsWithSubfield8);\n if (linkingNumbers.some(linkingNumber => anomaly8(linkingNumber))) {\n return false;\n }\n return true;\n\n // If linking number\n function anomaly8(linkingNumber) {\n nvdebug(` Looking for anomalies in linkin number ${linkingNumber}`);\n const relevantFields = fieldsWithSubfield8.filter(f => fieldHasLinkingNumber(f, linkingNumber));\n if (requireSingleTag) {\n return !isSingleTagLinkingNumber(linkingNumber, relevantFields, relevantFields[0].tag);\n }\n\n const f880 = relevantFields.filter(f => f.tag === '880');\n if (f880.length === 0 || f880.length === relevantFields.length) {\n return false;\n }\n return true;\n }\n}\n\n\nexport function sameField(field1, field2) {\n field1.tmpMyId = 666;\n const result = field2.tmpMyId === 666 ? true : false;\n delete field1.tmpMyId;\n return result;\n}\n\nexport function isChainHead(field, chain) {\n return sameField(field, chain[0]);\n}\n\nexport function fieldToChain(field, record) {\n if (field.deleted || !field.subfields) {\n return [];\n }\n const chain = newGetAllLinkedFields(field, record, true, true);\n\n nvdebug(` Chain contains ${chain.length} field(s)`);\n if (!isChainHead(field, chain)) { // newGetAllLinkedFields() marks relevant record.fields!\n return [];\n }\n\n const fieldsWithSubfield6 = chain.filter(f => fieldHasValidSubfield6(f));\n // Hack: multiple $6 fields, but either all are non-880 or all are 880: treat field as a single entry\n if (fieldsWithSubfield6.length > 0) {\n const non880 = fieldsWithSubfield6.filter(f => f.tag !== '880');\n if (non880.length === 0 || non880.length === fieldsWithSubfield6.length) {\n return [field];\n }\n if (non880.length !== 1) {\n return [field];\n }\n }\n\n if (!acceptFieldsWithSubfield6(fieldsWithSubfield6)) { // Check tag subfield $6s are legal(ish)\n return [];\n }\n const fieldsWithSubfield8 = chain.filter(f => fieldHasValidSubfield8(f));\n if (!acceptFieldsWithSubfield8(fieldsWithSubfield8, false)) {\n return [];\n }\n\n //nvdebug(`Proceed with ${fieldsToString(chain)}`);\n\n\n return chain;\n}\n\n\nfunction fieldHandleDuplicateDatafields(field, record) {\n const chain = fieldToChain(field, record);\n nvdebug(` TRY TO HANDLE DUPLICATES OF '${fieldsToString(chain)}'`);\n\n if (chain.length === 0) {\n return;\n }\n\n const fieldsWithSubfield6 = chain.filter(f => fieldHasValidSubfield6(f));\n const fieldsWithSubfield8 = chain.filter(f => fieldHasValidSubfield8(f));\n\n // Lone fields:\n if (chain.length === 1) {\n markIdenticalLoneFieldsAsDeletable(chain[0], record);\n return;\n }\n if (fieldsWithSubfield6.length === 0) {\n\n if (fieldsWithSubfield8.length === 0) { // chain.length === 1?\n nvdebug(` Trying to find duplicates of single field '${fieldToString(chain[0])}'`);\n markIdenticalLoneFieldsAsDeletable(chain[0], record);\n return;\n }\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fieldsWithSubfield8);\n if (linkingNumbers.length < 2) {\n markIdenticalSubfield6Chains(chain, record);\n return;\n }\n }\n\n if (fieldsWithSubfield6.length > 0 && acceptFieldsWithSubfield8(fieldsWithSubfield8, true)) { // Checks that non-880 tags are all same\n // Chain is removable\n markIdenticalSubfield6Chains(chain, record);\n return;\n }\n\n\n nvdebug(` NO HANDLER FOUND FOR '${fieldsToString(chain)}'`);\n nvdebug(` N8s: ${fieldsWithSubfield6.length}`);\n\n}\n\n\nexport function removeDuplicateDatafields(record, fix = true) {\n // Sometimes only $8 subfield (vs the whole field) is removed. Thus they are handled separately:\n handleDuplicateSubfield8Chains(record, fix);\n\n const dataFields = record.fields.filter(f => f.subfields !== undefined);\n\n dataFields.forEach(f => fieldHandleDuplicateDatafields(f, record));\n\n const deletableFields = dataFields.filter(f => f.deleted);\n const modifiedFields = dataFields.filter(f => f.modified && !f.deleted);\n\n const result = deletableFields.map(f => `DEL: ${fieldToString(f)}`);\n if (modifiedFields.length) {\n modifiedFields.forEach(f => delete f.modified);\n result.push(modifiedFields.map(f => `MOD: ${fieldToString(f)}`));\n }\n\n if (fix) {\n deletableFields.forEach(f => record.removeField(f));\n return result;\n }\n\n deletableFields.forEach(f => delete f.deleted);\n deletableFields.forEach(f => delete f.modified);\n\n\n return result;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["f"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import { MarcRecord } from "@natlibfi/marc-record";
|
|
3
|
+
import validatorFactory from "../src/removeDuplicateDataFields.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-duplicate-datafields"],
|
|
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/removeDuplicateDataFields: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=removeDuplicateDataFields.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/removeDuplicateDataFields.test.js"],
|
|
4
|
+
"sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/removeDuplicateDataFields.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-duplicate-datafields'],\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/removeDuplicateDataFields: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,6BAA6B;AAAA,EAChF,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,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
|
+
}
|