@natlibfi/marc-record-validators-melinda 3.2.0 → 3.3.14-alpha.2
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/CODEOWNERS +2 -0
- package/.github/dependabot.yml +40 -0
- package/.github/workflows/melinda-node-tests.yml +61 -0
- package/LICENSE.txt +21 -661
- package/README.md +4 -5
- package/dist/access-rights.js +94 -0
- package/dist/access-rights.js.map +1 -0
- package/dist/access-rights.spec.js +150 -0
- package/dist/access-rights.spec.js.map +1 -0
- package/dist/double-commas.js +17 -27
- package/dist/double-commas.js.map +1 -1
- package/dist/double-commas.spec.js +72 -27
- package/dist/double-commas.spec.js.map +1 -1
- package/dist/duplicates-ind1.js +47 -27
- package/dist/duplicates-ind1.js.map +1 -1
- package/dist/duplicates-ind1.spec.js +44 -27
- package/dist/duplicates-ind1.spec.js.map +1 -1
- package/dist/empty-fields.js +79 -29
- package/dist/empty-fields.js.map +1 -1
- package/dist/empty-fields.spec.js +113 -27
- package/dist/empty-fields.spec.js.map +1 -1
- package/dist/ending-punctuation-conf.js +772 -129
- package/dist/ending-punctuation-conf.js.map +1 -1
- package/dist/ending-punctuation.js +291 -72
- package/dist/ending-punctuation.js.map +1 -1
- package/dist/ending-punctuation.spec.js +2638 -118
- package/dist/ending-punctuation.spec.js.map +1 -1
- package/dist/ending-whitespace.js +58 -0
- package/dist/ending-whitespace.js.map +1 -0
- package/dist/ending-whitespace.spec.js +42 -0
- package/dist/ending-whitespace.spec.js.map +1 -0
- package/dist/field-521-fix.js +96 -0
- package/dist/field-521-fix.js.map +1 -0
- package/dist/field-521-fix.spec.js +51 -0
- package/dist/field-521-fix.spec.js.map +1 -0
- package/dist/field-exclusion.js +214 -63
- package/dist/field-exclusion.js.map +1 -1
- package/dist/field-exclusion.spec.js +1057 -31
- package/dist/field-exclusion.spec.js.map +1 -1
- package/dist/field-structure.js +249 -78
- package/dist/field-structure.js.map +1 -1
- package/dist/field-structure.spec.js +534 -31
- package/dist/field-structure.spec.js.map +1 -1
- package/dist/fields-present.js +31 -27
- package/dist/fields-present.js.map +1 -1
- package/dist/fields-present.spec.js +120 -27
- package/dist/fields-present.spec.js.map +1 -1
- package/dist/fixed-fields.js +72 -27
- package/dist/fixed-fields.js.map +1 -1
- package/dist/fixed-fields.spec.js +139 -27
- package/dist/fixed-fields.spec.js.map +1 -1
- package/dist/identical-fields.js +42 -28
- package/dist/identical-fields.js.map +1 -1
- package/dist/identical-fields.spec.js +98 -27
- package/dist/identical-fields.spec.js.map +1 -1
- package/dist/index.js +202 -27
- package/dist/index.js.map +1 -1
- package/dist/indicator-fixes.js +191 -0
- package/dist/indicator-fixes.js.map +1 -0
- package/dist/indicator-fixes.spec.js +51 -0
- package/dist/indicator-fixes.spec.js.map +1 -0
- package/dist/isbn-issn.js +266 -27
- package/dist/isbn-issn.js.map +1 -1
- package/dist/isbn-issn.spec.js +594 -27
- package/dist/isbn-issn.spec.js.map +1 -1
- package/dist/item-language.js +171 -27
- package/dist/item-language.js.map +1 -1
- package/dist/item-language.spec.js +305 -27
- package/dist/item-language.spec.js.map +1 -1
- package/dist/mergeField500Lisapainokset.js +155 -0
- package/dist/mergeField500Lisapainokset.js.map +1 -0
- package/dist/mergeField500Lisapainokset.spec.js +51 -0
- package/dist/mergeField500Lisapainokset.spec.js.map +1 -0
- package/dist/mergeRelatorTermFields.js +140 -0
- package/dist/mergeRelatorTermFields.js.map +1 -0
- package/dist/mergeRelatorTermFields.spec.js +51 -0
- package/dist/mergeRelatorTermFields.spec.js.map +1 -0
- package/dist/multiple-subfield-0.js +120 -0
- package/dist/multiple-subfield-0.js.map +1 -0
- package/dist/multiple-subfield-0.spec.js +51 -0
- package/dist/multiple-subfield-0.spec.js.map +1 -0
- package/dist/non-breaking-space.js +61 -0
- package/dist/non-breaking-space.js.map +1 -0
- package/dist/non-breaking-space.spec.js +42 -0
- package/dist/non-breaking-space.spec.js.map +1 -0
- package/dist/normalize-identifiers.js +210 -0
- package/dist/normalize-identifiers.js.map +1 -0
- package/dist/normalize-identifiers.spec.js +51 -0
- package/dist/normalize-identifiers.spec.js.map +1 -0
- package/dist/normalize-utf8-diacritics.js +140 -0
- package/dist/normalize-utf8-diacritics.js.map +1 -0
- package/dist/normalize-utf8-diacritics.spec.js +51 -0
- package/dist/normalize-utf8-diacritics.spec.js.map +1 -0
- package/dist/punctuation/index.js +281 -0
- package/dist/punctuation/index.js.map +1 -0
- package/dist/punctuation/rules/aut.js +332 -0
- package/dist/punctuation/rules/aut.js.map +1 -0
- package/dist/punctuation/rules/bib.js +374 -0
- package/dist/punctuation/rules/bib.js.map +1 -0
- package/dist/punctuation/rules/index.js +21 -0
- package/dist/punctuation/rules/index.js.map +1 -0
- package/dist/punctuation.spec.js +51 -0
- package/dist/punctuation.spec.js.map +1 -0
- package/dist/punctuation2.js +726 -0
- package/dist/punctuation2.js.map +1 -0
- package/dist/punctuation2.spec.js +51 -0
- package/dist/punctuation2.spec.js.map +1 -0
- package/dist/reindexSubfield6OccurenceNumbers.js +199 -0
- package/dist/reindexSubfield6OccurenceNumbers.js.map +1 -0
- package/dist/reindexSubfield6OccurenceNumbers.spec.js +51 -0
- package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +1 -0
- package/dist/removeDuplicateDataFields.js +405 -0
- package/dist/removeDuplicateDataFields.js.map +1 -0
- package/dist/removeDuplicateDataFields.spec.js +51 -0
- package/dist/removeDuplicateDataFields.spec.js.map +1 -0
- package/dist/removeInferiorDataFields.js +245 -0
- package/dist/removeInferiorDataFields.js.map +1 -0
- package/dist/removeInferiorDataFields.spec.js +51 -0
- package/dist/removeInferiorDataFields.spec.js.map +1 -0
- package/dist/resolvable-ext-references-melinda.js +112 -31
- package/dist/resolvable-ext-references-melinda.js.map +1 -1
- package/dist/resolvable-ext-references-melinda.spec.js +166 -27
- package/dist/resolvable-ext-references-melinda.spec.js.map +1 -1
- package/dist/resolveOrphanedSubfield6s.js +116 -0
- package/dist/resolveOrphanedSubfield6s.js.map +1 -0
- package/dist/resolveOrphanedSubfield6s.spec.js +51 -0
- package/dist/resolveOrphanedSubfield6s.spec.js.map +1 -0
- package/dist/sanitize-vocabulary-source-codes.js +93 -0
- package/dist/sanitize-vocabulary-source-codes.js.map +1 -0
- package/dist/sanitize-vocabulary-source-codes.spec.js +51 -0
- package/dist/sanitize-vocabulary-source-codes.spec.js.map +1 -0
- package/dist/sort-tags.js +53 -27
- package/dist/sort-tags.js.map +1 -1
- package/dist/sort-tags.spec.js +206 -27
- package/dist/sort-tags.spec.js.map +1 -1
- package/dist/sortRelatorTerms.js +135 -0
- package/dist/sortRelatorTerms.js.map +1 -0
- package/dist/sortRelatorTerms.spec.js +51 -0
- package/dist/sortRelatorTerms.spec.js.map +1 -0
- package/dist/sortSubfields.js +279 -0
- package/dist/sortSubfields.js.map +1 -0
- package/dist/sortSubfields.spec.js +51 -0
- package/dist/sortSubfields.spec.js.map +1 -0
- package/dist/stripPunctuation.js +49 -0
- package/dist/stripPunctuation.js.map +1 -0
- package/dist/stripPunctuation.spec.js +51 -0
- package/dist/stripPunctuation.spec.js.map +1 -0
- package/dist/subfield-exclusion.js +174 -57
- package/dist/subfield-exclusion.js.map +1 -1
- package/dist/subfield-exclusion.spec.js +521 -31
- package/dist/subfield-exclusion.spec.js.map +1 -1
- package/dist/subfield6Utils.js +457 -0
- package/dist/subfield6Utils.js.map +1 -0
- package/dist/subfield8Utils.js +99 -0
- package/dist/subfield8Utils.js.map +1 -0
- package/dist/typeOfDate-008.js +48 -0
- package/dist/typeOfDate-008.js.map +1 -0
- package/dist/typeOfDate-008.spec.js +47 -0
- package/dist/typeOfDate-008.spec.js.map +1 -0
- package/dist/unicode-decomposition.js +139 -30
- package/dist/unicode-decomposition.js.map +1 -1
- package/dist/unicode-decomposition.spec.js +90 -27
- package/dist/unicode-decomposition.spec.js.map +1 -1
- package/dist/update-field-540.js +119 -0
- package/dist/update-field-540.js.map +1 -0
- package/dist/update-field-540.spec.js +51 -0
- package/dist/update-field-540.spec.js.map +1 -0
- package/dist/urn.js +185 -0
- package/dist/urn.js.map +1 -0
- package/dist/urn.spec.js +238 -0
- package/dist/urn.spec.js.map +1 -0
- package/dist/utils.js +58 -0
- package/dist/utils.js.map +1 -0
- package/package.json +114 -124
- package/src/access-rights.js +84 -0
- package/src/access-rights.spec.js +126 -0
- package/src/double-commas.js +12 -49
- package/src/double-commas.spec.js +50 -82
- package/src/duplicates-ind1.js +34 -74
- package/src/duplicates-ind1.spec.js +39 -117
- package/src/empty-fields.js +62 -74
- package/src/empty-fields.spec.js +134 -207
- package/src/ending-punctuation-conf.js +679 -644
- package/src/ending-punctuation.js +260 -250
- package/src/ending-punctuation.spec.js +2545 -2322
- package/src/ending-whitespace.js +40 -0
- package/src/ending-whitespace.spec.js +44 -0
- package/src/field-521-fix.js +92 -0
- package/src/field-521-fix.spec.js +52 -0
- package/src/field-exclusion.js +197 -215
- package/src/field-exclusion.spec.js +883 -481
- package/src/field-structure.js +213 -271
- package/src/field-structure.spec.js +597 -474
- package/src/fields-present.js +19 -49
- package/src/fields-present.spec.js +90 -91
- package/src/fixed-fields.js +61 -94
- package/src/fixed-fields.spec.js +81 -125
- package/src/identical-fields.js +29 -48
- package/src/identical-fields.spec.js +114 -146
- package/src/index.js +41 -46
- package/src/indicator-fixes.js +211 -0
- package/src/indicator-fixes.spec.js +52 -0
- package/src/isbn-issn.js +254 -106
- package/src/isbn-issn.spec.js +399 -172
- package/src/item-language.js +158 -195
- package/src/item-language.spec.js +314 -306
- package/src/mergeField500Lisapainokset.js +153 -0
- package/src/mergeField500Lisapainokset.spec.js +52 -0
- package/src/mergeRelatorTermFields.js +143 -0
- package/src/mergeRelatorTermFields.spec.js +52 -0
- package/src/multiple-subfield-0.js +129 -0
- package/src/multiple-subfield-0.spec.js +52 -0
- package/src/non-breaking-space.js +49 -0
- package/src/non-breaking-space.spec.js +44 -0
- package/src/normalize-identifiers.js +197 -0
- package/src/normalize-identifiers.spec.js +52 -0
- package/src/normalize-utf8-diacritics.js +141 -0
- package/src/normalize-utf8-diacritics.spec.js +52 -0
- package/src/punctuation/index.js +292 -0
- package/src/punctuation/rules/aut.js +372 -0
- package/src/punctuation/rules/bib.js +420 -0
- package/src/punctuation/rules/index.js +7 -0
- package/src/punctuation.spec.js +52 -0
- package/src/punctuation2.js +441 -0
- package/src/punctuation2.spec.js +52 -0
- package/src/reindexSubfield6OccurenceNumbers.js +210 -0
- package/src/reindexSubfield6OccurenceNumbers.spec.js +52 -0
- package/src/removeDuplicateDataFields.js +447 -0
- package/src/removeDuplicateDataFields.spec.js +52 -0
- package/src/removeInferiorDataFields.js +259 -0
- package/src/removeInferiorDataFields.spec.js +52 -0
- package/src/resolvable-ext-references-melinda.js +89 -122
- package/src/resolvable-ext-references-melinda.spec.js +168 -198
- package/src/resolveOrphanedSubfield6s.js +115 -0
- package/src/resolveOrphanedSubfield6s.spec.js +52 -0
- package/src/sanitize-vocabulary-source-codes.js +99 -0
- package/src/sanitize-vocabulary-source-codes.spec.js +52 -0
- package/src/sort-tags.js +34 -60
- package/src/sort-tags.spec.js +256 -290
- package/src/sortRelatorTerms.js +142 -0
- package/src/sortRelatorTerms.spec.js +52 -0
- package/src/sortSubfields.js +176 -0
- package/src/sortSubfields.spec.js +52 -0
- package/src/stripPunctuation.js +42 -0
- package/src/stripPunctuation.spec.js +52 -0
- package/src/subfield-exclusion.js +157 -180
- package/src/subfield-exclusion.spec.js +507 -453
- package/src/subfield6Utils.js +485 -0
- package/src/subfield8Utils.js +102 -0
- package/src/typeOfDate-008.js +40 -0
- package/src/typeOfDate-008.spec.js +47 -0
- package/src/unicode-decomposition.js +130 -145
- package/src/unicode-decomposition.spec.js +89 -115
- package/src/update-field-540.js +99 -0
- package/src/update-field-540.spec.js +52 -0
- package/src/urn.js +164 -0
- package/src/urn.spec.js +231 -0
- package/src/utils.js +52 -0
- package/test-fixtures/duplicates-ind1/01/expectedResult.json +4 -0
- package/test-fixtures/duplicates-ind1/01/metadata.json +4 -0
- package/test-fixtures/duplicates-ind1/01/record.json +16 -0
- package/test-fixtures/duplicates-ind1/02/expectedResult.json +6 -0
- package/test-fixtures/duplicates-ind1/02/metadata.json +4 -0
- package/test-fixtures/duplicates-ind1/02/record.json +16 -0
- package/test-fixtures/duplicates-ind1/03/expectedResult.json +13 -0
- package/test-fixtures/duplicates-ind1/03/metadata.json +6 -0
- package/test-fixtures/duplicates-ind1/03/record.json +16 -0
- package/test-fixtures/ending-whitespace/01/expectedResult.json +4 -0
- package/test-fixtures/ending-whitespace/01/metadata.json +6 -0
- package/test-fixtures/ending-whitespace/01/record.json +15 -0
- package/test-fixtures/ending-whitespace/02/expectedResult.json +4 -0
- package/test-fixtures/ending-whitespace/02/metadata.json +6 -0
- package/test-fixtures/ending-whitespace/02/record.json +15 -0
- package/test-fixtures/ending-whitespace/03/expectedResult.json +17 -0
- package/test-fixtures/ending-whitespace/03/metadata.json +6 -0
- package/test-fixtures/ending-whitespace/03/record.json +15 -0
- package/test-fixtures/ending-whitespace/04/expectedResult.json +10 -0
- package/test-fixtures/ending-whitespace/04/metadata.json +6 -0
- package/test-fixtures/ending-whitespace/04/record.json +8 -0
- package/test-fixtures/fix521/01/expectedResult.json +6 -0
- package/test-fixtures/fix521/01/metadata.json +5 -0
- package/test-fixtures/fix521/01/record.json +13 -0
- package/test-fixtures/fix521/02/expectedResult.json +15 -0
- package/test-fixtures/fix521/02/metadata.json +5 -0
- package/test-fixtures/fix521/02/record.json +13 -0
- package/test-fixtures/fix521/03/expectedResult.json +5 -0
- package/test-fixtures/fix521/03/metadata.json +5 -0
- package/test-fixtures/fix521/03/record.json +13 -0
- package/test-fixtures/indicator-fixes/01/expectedResult.json +9 -0
- package/test-fixtures/indicator-fixes/01/metadata.json +5 -0
- package/test-fixtures/indicator-fixes/01/record.json +64 -0
- package/test-fixtures/indicator-fixes/02/expectedResult.json +66 -0
- package/test-fixtures/indicator-fixes/02/metadata.json +5 -0
- package/test-fixtures/indicator-fixes/02/record.json +64 -0
- package/test-fixtures/indicator-fixes/03/expectedResult.json +55 -0
- package/test-fixtures/indicator-fixes/03/metadata.json +5 -0
- package/test-fixtures/indicator-fixes/03/record.json +54 -0
- package/test-fixtures/indicator-fixes/04/expectedResult.json +66 -0
- package/test-fixtures/indicator-fixes/04/metadata.json +5 -0
- package/test-fixtures/indicator-fixes/04/record.json +65 -0
- package/test-fixtures/indicator-fixes/05/expectedResult.json +66 -0
- package/test-fixtures/indicator-fixes/05/metadata.json +5 -0
- package/test-fixtures/indicator-fixes/05/record.json +65 -0
- package/test-fixtures/indicator-fixes/06/expectedResult.json +75 -0
- package/test-fixtures/indicator-fixes/06/metadata.json +5 -0
- package/test-fixtures/indicator-fixes/06/record.json +74 -0
- package/test-fixtures/lisapainokset/fixer/01/expectedResult.json +37 -0
- package/test-fixtures/lisapainokset/fixer/01/metadata.json +6 -0
- package/test-fixtures/lisapainokset/fixer/01/record.json +61 -0
- package/test-fixtures/lisapainokset/fixer/02/expectedResult.json +44 -0
- package/test-fixtures/lisapainokset/fixer/02/metadata.json +6 -0
- package/test-fixtures/lisapainokset/fixer/02/record.json +45 -0
- package/test-fixtures/lisapainokset/fixer/03/expectedResult.json +21 -0
- package/test-fixtures/lisapainokset/fixer/03/metadata.json +6 -0
- package/test-fixtures/lisapainokset/fixer/03/record.json +45 -0
- package/test-fixtures/lisapainokset/validator/01/expectedResult.json +7 -0
- package/test-fixtures/lisapainokset/validator/01/metadata.json +6 -0
- package/test-fixtures/lisapainokset/validator/01/record.json +45 -0
- package/test-fixtures/lisapainokset/validator/02/expectedResult.json +6 -0
- package/test-fixtures/lisapainokset/validator/02/metadata.json +6 -0
- package/test-fixtures/lisapainokset/validator/02/record.json +61 -0
- package/test-fixtures/lisapainokset/validator/03/expectedResult.json +4 -0
- package/test-fixtures/lisapainokset/validator/03/metadata.json +6 -0
- package/test-fixtures/lisapainokset/validator/03/record.json +37 -0
- package/test-fixtures/mergeRelatorTermFields/fixer/01/expectedResult.json +14 -0
- package/test-fixtures/mergeRelatorTermFields/fixer/01/metadata.json +6 -0
- package/test-fixtures/mergeRelatorTermFields/fixer/01/record.json +16 -0
- package/test-fixtures/mergeRelatorTermFields/fixer/02/expectedResult.json +17 -0
- package/test-fixtures/mergeRelatorTermFields/fixer/02/metadata.json +6 -0
- package/test-fixtures/mergeRelatorTermFields/fixer/02/record.json +23 -0
- package/test-fixtures/mergeRelatorTermFields/validator/01/expectedResult.json +6 -0
- package/test-fixtures/mergeRelatorTermFields/validator/01/metadata.json +6 -0
- package/test-fixtures/mergeRelatorTermFields/validator/01/record.json +16 -0
- package/test-fixtures/mergeRelatorTermFields/validator/02/expectedResult.json +4 -0
- package/test-fixtures/mergeRelatorTermFields/validator/02/metadata.json +6 -0
- package/test-fixtures/mergeRelatorTermFields/validator/02/record.json +16 -0
- package/test-fixtures/non-breaking-space/01/expectedResult.json +4 -0
- package/test-fixtures/non-breaking-space/01/metadata.json +6 -0
- package/test-fixtures/non-breaking-space/01/record.json +15 -0
- package/test-fixtures/non-breaking-space/02/expectedResult.json +4 -0
- package/test-fixtures/non-breaking-space/02/metadata.json +6 -0
- package/test-fixtures/non-breaking-space/02/record.json +15 -0
- package/test-fixtures/non-breaking-space/03/expectedResult.json +17 -0
- package/test-fixtures/non-breaking-space/03/metadata.json +6 -0
- package/test-fixtures/non-breaking-space/03/record.json +15 -0
- package/test-fixtures/non-breaking-space/04/expectedResult.json +21 -0
- package/test-fixtures/non-breaking-space/04/metadata.json +6 -0
- package/test-fixtures/non-breaking-space/04/record.json +19 -0
- package/test-fixtures/normalize-identifiers/01/expectedResult.json +8 -0
- package/test-fixtures/normalize-identifiers/01/metadata.json +5 -0
- package/test-fixtures/normalize-identifiers/01/record.json +81 -0
- package/test-fixtures/normalize-identifiers/02/expectedResult.json +92 -0
- package/test-fixtures/normalize-identifiers/02/metadata.json +5 -0
- package/test-fixtures/normalize-identifiers/02/record.json +92 -0
- package/test-fixtures/normalize-identifiers/03/expectedResult.json +63 -0
- package/test-fixtures/normalize-identifiers/03/metadata.json +5 -0
- package/test-fixtures/normalize-identifiers/03/record.json +61 -0
- package/test-fixtures/normalize-identifiers/04/expectedResult.json +79 -0
- package/test-fixtures/normalize-identifiers/04/metadata.json +5 -0
- package/test-fixtures/normalize-identifiers/04/record.json +77 -0
- package/test-fixtures/normalize-utf8-diacritics/01/expectedResult.json +7 -0
- package/test-fixtures/normalize-utf8-diacritics/01/metadata.json +5 -0
- package/test-fixtures/normalize-utf8-diacritics/01/record.json +39 -0
- package/test-fixtures/normalize-utf8-diacritics/02/expectedResult.json +41 -0
- package/test-fixtures/normalize-utf8-diacritics/02/metadata.json +5 -0
- package/test-fixtures/normalize-utf8-diacritics/02/record.json +39 -0
- package/test-fixtures/normalize-utf8-diacritics/03/expectedResult.json +5 -0
- package/test-fixtures/normalize-utf8-diacritics/03/metadata.json +5 -0
- package/test-fixtures/normalize-utf8-diacritics/03/record.json +37 -0
- package/test-fixtures/normalize-utf8-diacritics/04/expectedResult.json +41 -0
- package/test-fixtures/normalize-utf8-diacritics/04/metadata.json +5 -0
- package/test-fixtures/normalize-utf8-diacritics/04/record.json +39 -0
- package/test-fixtures/normalize-utf8-diacritics/05/expectedResult.json +41 -0
- package/test-fixtures/normalize-utf8-diacritics/05/metadata.json +5 -0
- package/test-fixtures/normalize-utf8-diacritics/05/record.json +41 -0
- package/test-fixtures/punctuation/01/expectedResult.json +3 -0
- package/test-fixtures/punctuation/01/metadata.json +4 -0
- package/test-fixtures/punctuation/01/record.json +18 -0
- package/test-fixtures/punctuation/02/expectedResult.json +3 -0
- package/test-fixtures/punctuation/02/metadata.json +4 -0
- package/test-fixtures/punctuation/02/record.json +18 -0
- package/test-fixtures/punctuation/03/expectedResult.json +21 -0
- package/test-fixtures/punctuation/03/metadata.json +5 -0
- package/test-fixtures/punctuation/03/record.json +19 -0
- package/test-fixtures/punctuation/04/expectedResult.json +21 -0
- package/test-fixtures/punctuation/04/metadata.json +5 -0
- package/test-fixtures/punctuation/04/record.json +19 -0
- package/test-fixtures/punctuation/05/expectedResult.json +44 -0
- package/test-fixtures/punctuation/05/metadata.json +5 -0
- package/test-fixtures/punctuation/05/record.json +42 -0
- package/test-fixtures/punctuation2/01/expectedResult.json +12 -0
- package/test-fixtures/punctuation2/01/metadata.json +6 -0
- package/test-fixtures/punctuation2/01/record.json +37 -0
- package/test-fixtures/punctuation2/02/expectedResult.json +4 -0
- package/test-fixtures/punctuation2/02/metadata.json +6 -0
- package/test-fixtures/punctuation2/02/record.json +14 -0
- package/test-fixtures/punctuation2/04/expectedResult.json +7 -0
- package/test-fixtures/punctuation2/04/metadata.json +6 -0
- package/test-fixtures/punctuation2/04/record.json +22 -0
- package/test-fixtures/punctuation2/05/expectedResult.json +6 -0
- package/test-fixtures/punctuation2/05/metadata.json +6 -0
- package/test-fixtures/punctuation2/05/record.json +12 -0
- package/test-fixtures/punctuation2/98/expectedResult.json +45 -0
- package/test-fixtures/punctuation2/98/metadata.json +6 -0
- package/test-fixtures/punctuation2/98/record.json +43 -0
- package/test-fixtures/punctuation2/99/expectedResult.json +15 -0
- package/test-fixtures/punctuation2/99/metadata.json +6 -0
- package/test-fixtures/punctuation2/99/record.json +14 -0
- package/test-fixtures/reindex-sf6-occurence-numbers/f01/expectedResult.json +35 -0
- package/test-fixtures/reindex-sf6-occurence-numbers/f01/metadata.json +6 -0
- package/test-fixtures/reindex-sf6-occurence-numbers/f01/record.json +34 -0
- package/test-fixtures/reindex-sf6-occurence-numbers/f02/expectedResult.json +53 -0
- package/test-fixtures/reindex-sf6-occurence-numbers/f02/metadata.json +6 -0
- package/test-fixtures/reindex-sf6-occurence-numbers/f02/record.json +51 -0
- package/test-fixtures/reindex-sf6-occurence-numbers/f03/expectedResult.json +46 -0
- package/test-fixtures/reindex-sf6-occurence-numbers/f03/metadata.json +7 -0
- package/test-fixtures/reindex-sf6-occurence-numbers/f03/record.json +44 -0
- package/test-fixtures/reindex-sf6-occurence-numbers/v01/expectedResult.json +6 -0
- package/test-fixtures/reindex-sf6-occurence-numbers/v01/metadata.json +5 -0
- package/test-fixtures/reindex-sf6-occurence-numbers/v01/record.json +31 -0
- package/test-fixtures/reindex-sf6-occurence-numbers/v02/expectedResult.json +6 -0
- package/test-fixtures/reindex-sf6-occurence-numbers/v02/metadata.json +6 -0
- package/test-fixtures/reindex-sf6-occurence-numbers/v02/record.json +38 -0
- package/test-fixtures/reindex-sf6-occurence-numbers/v03/expectedResult.json +6 -0
- package/test-fixtures/reindex-sf6-occurence-numbers/v03/metadata.json +6 -0
- package/test-fixtures/reindex-sf6-occurence-numbers/v03/record.json +30 -0
- package/test-fixtures/remove-duplicate-datafields/f01/expectedResult.json +35 -0
- package/test-fixtures/remove-duplicate-datafields/f01/metadata.json +6 -0
- package/test-fixtures/remove-duplicate-datafields/f01/record.json +34 -0
- package/test-fixtures/remove-duplicate-datafields/f03/expectedResult.json +20 -0
- package/test-fixtures/remove-duplicate-datafields/f03/metadata.json +6 -0
- package/test-fixtures/remove-duplicate-datafields/f03/record.json +33 -0
- package/test-fixtures/remove-duplicate-datafields/f03b/expectedResult.json +20 -0
- package/test-fixtures/remove-duplicate-datafields/f03b/metadata.json +6 -0
- package/test-fixtures/remove-duplicate-datafields/f03b/record.json +35 -0
- package/test-fixtures/remove-duplicate-datafields/f03c/expectedResult.json +25 -0
- package/test-fixtures/remove-duplicate-datafields/f03c/metadata.json +6 -0
- package/test-fixtures/remove-duplicate-datafields/f03c/record.json +43 -0
- package/test-fixtures/remove-duplicate-datafields/f04/expectedResult.json +31 -0
- package/test-fixtures/remove-duplicate-datafields/f04/metadata.json +6 -0
- package/test-fixtures/remove-duplicate-datafields/f04/record.json +41 -0
- package/test-fixtures/remove-duplicate-datafields/f05/expectedResult.json +23 -0
- package/test-fixtures/remove-duplicate-datafields/f05/metadata.json +6 -0
- package/test-fixtures/remove-duplicate-datafields/f05/record.json +29 -0
- package/test-fixtures/remove-duplicate-datafields/f06/expectedResult.json +24 -0
- package/test-fixtures/remove-duplicate-datafields/f06/metadata.json +6 -0
- package/test-fixtures/remove-duplicate-datafields/f06/record.json +41 -0
- package/test-fixtures/remove-duplicate-datafields/f07/expectedResult.json +15 -0
- package/test-fixtures/remove-duplicate-datafields/f07/metadata.json +6 -0
- package/test-fixtures/remove-duplicate-datafields/f07/record.json +21 -0
- package/test-fixtures/remove-duplicate-datafields/f08/expectedResult.json +21 -0
- package/test-fixtures/remove-duplicate-datafields/f08/metadata.json +6 -0
- package/test-fixtures/remove-duplicate-datafields/f08/record.json +33 -0
- package/test-fixtures/remove-duplicate-datafields/f09/expectedResult.json +6 -0
- package/test-fixtures/remove-duplicate-datafields/f09/metadata.json +6 -0
- package/test-fixtures/remove-duplicate-datafields/f09/record.json +9 -0
- package/test-fixtures/remove-duplicate-datafields/f10/expectedResult.json +15 -0
- package/test-fixtures/remove-duplicate-datafields/f10/metadata.json +6 -0
- package/test-fixtures/remove-duplicate-datafields/f10/record.json +24 -0
- package/test-fixtures/remove-duplicate-datafields/f11/expectedResult.json +30 -0
- package/test-fixtures/remove-duplicate-datafields/f11/metadata.json +6 -0
- package/test-fixtures/remove-duplicate-datafields/f11/record.json +53 -0
- package/test-fixtures/remove-duplicate-datafields/v01/expectedResult.json +6 -0
- package/test-fixtures/remove-duplicate-datafields/v01/metadata.json +6 -0
- package/test-fixtures/remove-duplicate-datafields/v01/record.json +31 -0
- package/test-fixtures/remove-duplicate-datafields/v02/expectedResult.json +10 -0
- package/test-fixtures/remove-duplicate-datafields/v02/metadata.json +6 -0
- package/test-fixtures/remove-duplicate-datafields/v02/record.json +45 -0
- package/test-fixtures/remove-duplicate-datafields/v03/expectedResult.json +6 -0
- package/test-fixtures/remove-duplicate-datafields/v03/metadata.json +7 -0
- package/test-fixtures/remove-duplicate-datafields/v03/record.json +37 -0
- package/test-fixtures/remove-duplicate-datafields/v04/expectedResult.json +8 -0
- package/test-fixtures/remove-duplicate-datafields/v04/metadata.json +6 -0
- package/test-fixtures/remove-duplicate-datafields/v04/record.json +41 -0
- package/test-fixtures/remove-inferior-datafields/f01/expectedResult.json +21 -0
- package/test-fixtures/remove-inferior-datafields/f01/metadata.json +6 -0
- package/test-fixtures/remove-inferior-datafields/f01/record.json +31 -0
- package/test-fixtures/remove-inferior-datafields/f03/expectedResult.json +16 -0
- package/test-fixtures/remove-inferior-datafields/f03/metadata.json +6 -0
- package/test-fixtures/remove-inferior-datafields/f03/record.json +27 -0
- package/test-fixtures/remove-inferior-datafields/f04/expectedResult.json +31 -0
- package/test-fixtures/remove-inferior-datafields/f04/metadata.json +6 -0
- package/test-fixtures/remove-inferior-datafields/f04/record.json +38 -0
- package/test-fixtures/remove-inferior-datafields/f05/expectedResult.json +34 -0
- package/test-fixtures/remove-inferior-datafields/f05/metadata.json +6 -0
- package/test-fixtures/remove-inferior-datafields/f05/record.json +41 -0
- package/test-fixtures/remove-inferior-datafields/f06/expectedResult.json +16 -0
- package/test-fixtures/remove-inferior-datafields/f06/metadata.json +6 -0
- package/test-fixtures/remove-inferior-datafields/f06/record.json +20 -0
- package/test-fixtures/remove-inferior-datafields/v01/expectedResult.json +6 -0
- package/test-fixtures/remove-inferior-datafields/v01/metadata.json +6 -0
- package/test-fixtures/remove-inferior-datafields/v01/record.json +31 -0
- package/test-fixtures/remove-inferior-datafields/v02/expectedResult.json +6 -0
- package/test-fixtures/remove-inferior-datafields/v02/metadata.json +6 -0
- package/test-fixtures/remove-inferior-datafields/v02/record.json +21 -0
- package/test-fixtures/remove-orphanded-sf6s/f01/expectedResult.json +35 -0
- package/test-fixtures/remove-orphanded-sf6s/f01/metadata.json +6 -0
- package/test-fixtures/remove-orphanded-sf6s/f01/record.json +34 -0
- package/test-fixtures/remove-orphanded-sf6s/f02/expectedResult.json +40 -0
- package/test-fixtures/remove-orphanded-sf6s/f02/metadata.json +6 -0
- package/test-fixtures/remove-orphanded-sf6s/f02/record.json +43 -0
- package/test-fixtures/remove-orphanded-sf6s/v01/expectedResult.json +6 -0
- package/test-fixtures/remove-orphanded-sf6s/v01/metadata.json +6 -0
- package/test-fixtures/remove-orphanded-sf6s/v01/record.json +31 -0
- package/test-fixtures/remove-orphanded-sf6s/v02/expectedResult.json +6 -0
- package/test-fixtures/remove-orphanded-sf6s/v02/metadata.json +6 -0
- package/test-fixtures/remove-orphanded-sf6s/v02/record.json +31 -0
- package/test-fixtures/resolvable-ext-references-melinda.js +0 -27
- package/test-fixtures/sanitize-vocabulary-source-codes/f01/expectedResult.json +32 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/f01/metadata.json +6 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/f01/record.json +32 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/f02/expectedResult.json +24 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/f02/metadata.json +6 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/f02/record.json +24 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/v01/expectedResult.json +12 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/v01/metadata.json +6 -0
- package/test-fixtures/sanitize-vocabulary-source-codes/v01/record.json +24 -0
- package/test-fixtures/sort-relator-terms/f01/expectedResult.json +23 -0
- package/test-fixtures/sort-relator-terms/f01/metadata.json +6 -0
- package/test-fixtures/sort-relator-terms/f01/record.json +22 -0
- package/test-fixtures/sort-relator-terms/f02/expectedResult.json +26 -0
- package/test-fixtures/sort-relator-terms/f02/metadata.json +6 -0
- package/test-fixtures/sort-relator-terms/f02/record.json +22 -0
- package/test-fixtures/sort-relator-terms/v01/expectedResult.json +5 -0
- package/test-fixtures/sort-relator-terms/v01/metadata.json +6 -0
- package/test-fixtures/sort-relator-terms/v01/record.json +22 -0
- package/test-fixtures/sort-relator-terms/v02/expectedResult.json +6 -0
- package/test-fixtures/sort-relator-terms/v02/metadata.json +6 -0
- package/test-fixtures/sort-relator-terms/v02/record.json +14 -0
- package/test-fixtures/sort-subfields/f01/expectedResult.json +24 -0
- package/test-fixtures/sort-subfields/f01/metadata.json +6 -0
- package/test-fixtures/sort-subfields/f01/record.json +20 -0
- package/test-fixtures/sort-subfields/v01/expectedResult.json +5 -0
- package/test-fixtures/sort-subfields/v01/metadata.json +6 -0
- package/test-fixtures/sort-subfields/v01/record.json +24 -0
- package/test-fixtures/sort-subfields/v02/expectedResult.json +6 -0
- package/test-fixtures/sort-subfields/v02/metadata.json +6 -0
- package/test-fixtures/sort-subfields/v02/record.json +8 -0
- package/test-fixtures/strip-punctuation/01/expectedResult.json +12 -0
- package/test-fixtures/strip-punctuation/01/metadata.json +6 -0
- package/test-fixtures/strip-punctuation/01/record.json +37 -0
- package/test-fixtures/strip-punctuation/02/expectedResult.json +4 -0
- package/test-fixtures/strip-punctuation/02/metadata.json +6 -0
- package/test-fixtures/strip-punctuation/02/record.json +14 -0
- package/test-fixtures/strip-punctuation/04/expectedResult.json +6 -0
- package/test-fixtures/strip-punctuation/04/metadata.json +6 -0
- package/test-fixtures/strip-punctuation/04/record.json +22 -0
- package/test-fixtures/strip-punctuation/05/expectedResult.json +6 -0
- package/test-fixtures/strip-punctuation/05/metadata.json +6 -0
- package/test-fixtures/strip-punctuation/05/record.json +12 -0
- package/test-fixtures/strip-punctuation/98/expectedResult.json +44 -0
- package/test-fixtures/strip-punctuation/98/metadata.json +6 -0
- package/test-fixtures/strip-punctuation/98/record.json +45 -0
- package/test-fixtures/strip-punctuation/99/expectedResult.json +16 -0
- package/test-fixtures/strip-punctuation/99/metadata.json +6 -0
- package/test-fixtures/strip-punctuation/99/record.json +16 -0
- package/test-fixtures/subfield0/f01/expectedResult.json +25 -0
- package/test-fixtures/subfield0/f01/metadata.json +6 -0
- package/test-fixtures/subfield0/f01/record.json +23 -0
- package/test-fixtures/subfield0/f02/expectedResult.json +35 -0
- package/test-fixtures/subfield0/f02/metadata.json +6 -0
- package/test-fixtures/subfield0/f02/record.json +41 -0
- package/test-fixtures/subfield0/f03/expectedResult.json +21 -0
- package/test-fixtures/subfield0/f03/metadata.json +7 -0
- package/test-fixtures/subfield0/f03/record.json +24 -0
- package/test-fixtures/subfield0/v01/expectedResult.json +4 -0
- package/test-fixtures/subfield0/v01/metadata.json +6 -0
- package/test-fixtures/subfield0/v01/record.json +23 -0
- package/test-fixtures/subfield0/v02/expectedResult.json +9 -0
- package/test-fixtures/subfield0/v02/metadata.json +6 -0
- package/test-fixtures/subfield0/v02/record.json +38 -0
- package/test-fixtures/typeOfDate-008/01/expectedResult.json +3 -0
- package/test-fixtures/typeOfDate-008/01/metadata.json +4 -0
- package/test-fixtures/typeOfDate-008/01/record.json +14 -0
- package/test-fixtures/typeOfDate-008/02/expectedResult.json +4 -0
- package/test-fixtures/typeOfDate-008/02/metadata.json +4 -0
- package/test-fixtures/typeOfDate-008/02/record.json +14 -0
- package/test-fixtures/typeOfDate-008/03/expectedResult.json +14 -0
- package/test-fixtures/typeOfDate-008/03/metadata.json +5 -0
- package/test-fixtures/typeOfDate-008/03/record.json +14 -0
- package/test-fixtures/typeOfDate-008/04/expectedResult.json +14 -0
- package/test-fixtures/typeOfDate-008/04/metadata.json +5 -0
- package/test-fixtures/typeOfDate-008/04/record.json +14 -0
- package/test-fixtures/typeOfDate-008/05/expectedResult.json +14 -0
- package/test-fixtures/typeOfDate-008/05/metadata.json +5 -0
- package/test-fixtures/typeOfDate-008/05/record.json +14 -0
- package/test-fixtures/update-field-540/f01/expectedResult.json +23 -0
- package/test-fixtures/update-field-540/f01/metadata.json +6 -0
- package/test-fixtures/update-field-540/f01/record.json +23 -0
- package/test-fixtures/update-field-540/v01/expectedResult.json +7 -0
- package/test-fixtures/update-field-540/v01/metadata.json +6 -0
- package/test-fixtures/update-field-540/v01/record.json +23 -0
- package/.travis.yml +0 -10
|
@@ -1,28 +1,167 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _chai = _interopRequireDefault(require("chai"));
|
|
4
|
+
var _chaiAsPromised = _interopRequireDefault(require("chai-as-promised"));
|
|
5
|
+
var _marcRecord = require("@natlibfi/marc-record");
|
|
6
|
+
var _fetchMock = _interopRequireDefault(require("fetch-mock"));
|
|
7
|
+
var testContext = _interopRequireWildcard(require("../src/resolvable-ext-references-melinda"));
|
|
8
|
+
var _resolvableExtReferencesMelinda2 = require("../test-fixtures/resolvable-ext-references-melinda");
|
|
9
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
10
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
11
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
12
|
+
const {
|
|
13
|
+
expect
|
|
14
|
+
} = _chai.default;
|
|
15
|
+
_chai.default.use(_chaiAsPromised.default);
|
|
16
|
+
const endpoint = 'http://melinda.kansalliskirjasto.fi:210/fin01';
|
|
17
|
+
const queryParam = '?operation=searchRetrieve&maximumRecords=2&version=1&query=rec.id=';
|
|
18
|
+
const prefixPattern = /^\(FOOBAR\)/u;
|
|
19
|
+
const fields = {
|
|
20
|
+
773: ['w'],
|
|
21
|
+
833: ['w', 'p']
|
|
22
|
+
};
|
|
23
|
+
describe('resolvable-ext-references-melinda', () => {
|
|
24
|
+
afterEach(() => {
|
|
25
|
+
testContext.default.__ResetDependency__('fetch');
|
|
26
|
+
});
|
|
27
|
+
it('Creates a validator', async () => {
|
|
28
|
+
const validator = await testContext.default({
|
|
29
|
+
endpoint,
|
|
30
|
+
prefixPattern,
|
|
31
|
+
fields
|
|
32
|
+
});
|
|
33
|
+
expect(validator).to.be.an('object').that.has.any.keys('description', 'validate');
|
|
34
|
+
expect(validator.description).to.be.a('string');
|
|
35
|
+
expect(validator.validate).to.be.a('function');
|
|
36
|
+
});
|
|
37
|
+
it('Throws an error when prefixPattern not provided', async () => {
|
|
38
|
+
const validator = await testContext.default({
|
|
39
|
+
endpoint,
|
|
40
|
+
prefixPattern,
|
|
41
|
+
fields
|
|
42
|
+
});
|
|
43
|
+
// Cannot read property 'fields' of undefined or Cannot read properties of undefined (reading 'fields')'
|
|
44
|
+
await expect(validator.validate()).to.be.rejectedWith(Error, /^Cannot read propert/u);
|
|
45
|
+
});
|
|
46
|
+
describe('#validate', () => {
|
|
47
|
+
it('Finds prefixPattern on record and removes it', async () => {
|
|
48
|
+
const mock = _fetchMock.default.sandbox();
|
|
49
|
+
mock.get(`${endpoint}${queryParam}5000`, _resolvableExtReferencesMelinda2.fixture5000);
|
|
50
|
+
mock.get(`${endpoint}${queryParam}9550`, _resolvableExtReferencesMelinda2.fixture9550);
|
|
51
|
+
testContext.default.__Rewire__('fetch', mock);
|
|
52
|
+
const validator = await testContext.default({
|
|
53
|
+
endpoint,
|
|
54
|
+
prefixPattern,
|
|
55
|
+
fields
|
|
56
|
+
});
|
|
57
|
+
const record = new _marcRecord.MarcRecord({
|
|
58
|
+
fields: [{
|
|
59
|
+
tag: '001',
|
|
60
|
+
value: '123456'
|
|
61
|
+
}, {
|
|
62
|
+
tag: '035',
|
|
63
|
+
subfields: [{
|
|
64
|
+
code: 'a',
|
|
65
|
+
value: '(FI-MELINDA)123456'
|
|
66
|
+
}]
|
|
67
|
+
}, {
|
|
68
|
+
tag: '773',
|
|
69
|
+
subfields: [{
|
|
70
|
+
code: 'w',
|
|
71
|
+
value: '(FOOBAR)5000'
|
|
72
|
+
}]
|
|
73
|
+
}, {
|
|
74
|
+
tag: '833',
|
|
75
|
+
subfields: [{
|
|
76
|
+
code: 'p',
|
|
77
|
+
value: '(FOOBAR)9550'
|
|
78
|
+
}, {
|
|
79
|
+
code: 'c',
|
|
80
|
+
value: '(FI-MELINDA)8850'
|
|
81
|
+
}]
|
|
82
|
+
}]
|
|
83
|
+
});
|
|
84
|
+
const result = await validator.validate(record);
|
|
85
|
+
expect(result).to.eql({
|
|
86
|
+
valid: true,
|
|
87
|
+
messages: []
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
it('Finds no matching prefixPattern on record', async () => {
|
|
91
|
+
const mock = _fetchMock.default.sandbox();
|
|
92
|
+
mock.get(`${endpoint}5000`, _resolvableExtReferencesMelinda2.fixture5000);
|
|
93
|
+
testContext.default.__Rewire__('fetch', mock);
|
|
94
|
+
const validator = await testContext.default({
|
|
95
|
+
endpoint,
|
|
96
|
+
prefixPattern,
|
|
97
|
+
fields
|
|
98
|
+
});
|
|
99
|
+
const record = new _marcRecord.MarcRecord({
|
|
100
|
+
fields: [{
|
|
101
|
+
tag: '001',
|
|
102
|
+
value: '123456'
|
|
103
|
+
}, {
|
|
104
|
+
tag: '035',
|
|
105
|
+
subfields: [{
|
|
106
|
+
code: 'a',
|
|
107
|
+
value: '(FI-MELINDA)123456'
|
|
108
|
+
}]
|
|
109
|
+
}, {
|
|
110
|
+
tag: '773',
|
|
111
|
+
subfields: [{
|
|
112
|
+
code: 'w',
|
|
113
|
+
value: '(FI-MELINDA)123456'
|
|
114
|
+
}]
|
|
115
|
+
}, {
|
|
116
|
+
tag: '833',
|
|
117
|
+
subfields: [{
|
|
118
|
+
code: 'p',
|
|
119
|
+
value: '(FI-MELINDA)2620'
|
|
120
|
+
}, {
|
|
121
|
+
code: 'w',
|
|
122
|
+
value: '(FI-MELINDA)8850'
|
|
123
|
+
}]
|
|
124
|
+
}]
|
|
125
|
+
});
|
|
126
|
+
const result = await validator.validate(record);
|
|
127
|
+
expect(result).to.eql({
|
|
128
|
+
valid: true,
|
|
129
|
+
messages: []
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
it('Finds prefixPattern on record but values not resolvable', async () => {
|
|
133
|
+
const mock = _fetchMock.default.sandbox();
|
|
134
|
+
mock.get(`${endpoint}${queryParam}1000`, _resolvableExtReferencesMelinda2.fixture1000);
|
|
135
|
+
testContext.default.__Rewire__('fetch', mock);
|
|
136
|
+
const validator = await testContext.default({
|
|
137
|
+
endpoint,
|
|
138
|
+
prefixPattern,
|
|
139
|
+
fields
|
|
140
|
+
});
|
|
141
|
+
const record = new _marcRecord.MarcRecord({
|
|
142
|
+
fields: [{
|
|
143
|
+
tag: '001',
|
|
144
|
+
value: '123456'
|
|
145
|
+
}, {
|
|
146
|
+
tag: '035',
|
|
147
|
+
subfields: [{
|
|
148
|
+
code: 'a',
|
|
149
|
+
value: '(FI-MELINDA)123456'
|
|
150
|
+
}]
|
|
151
|
+
}, {
|
|
152
|
+
tag: '773',
|
|
153
|
+
subfields: [{
|
|
154
|
+
code: 'w',
|
|
155
|
+
value: '(FOOBAR)1000'
|
|
156
|
+
}]
|
|
157
|
+
}]
|
|
158
|
+
});
|
|
159
|
+
const result = await validator.validate(record);
|
|
160
|
+
expect(result).to.eql({
|
|
161
|
+
valid: false,
|
|
162
|
+
messages: ['Field 773$w with value 1000 is not resolvable']
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
});
|
|
28
167
|
//# sourceMappingURL=resolvable-ext-references-melinda.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/resolvable-ext-references-melinda.spec.js"],"names":["testContext","expect","chai","use","chaiAsPromised","endpoint","queryParam","prefixPattern","fields","describe","afterEach","default","__ResetDependency__","it","validator","to","be","an","that","has","any","keys","description","a","validate","rejectedWith","Error","mock","fetchMock","sandbox","get","fixture5000","fixture9550","__Rewire__","record","MarcRecord","tag","value","subfields","code","result","eql","valid","messages","fixture1000"],"mappings":"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","file":"resolvable-ext-references-melinda.spec.js","sourcesContent":["/**\n *\n * @licstart The following is the entire license notice for the JavaScript code in this file.\n *\n * MARC record validators used in Melinda\n *\n * Copyright (C) 2014-2018 University Of Helsinki (The National Library Of Finland)\n *\n * This file is part of marc-record-validators-melinda\n *\n * marc-record-validators-melinda program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * marc-record-validators-melinda is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n * @licend The above is the entire license notice\n * for the JavaScript code in this file.\n *\n */\n\n/* eslint-disable no-undef, max-nested-callbacks, no-unused-expressions */\n\n'use strict';\nimport chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport fetchMock from 'fetch-mock';\nimport * as testContext from '../src/resolvable-ext-references-melinda'; /* eslint-disable-line import/named */\nimport {fixture5000, fixture9550, fixture1000} from '../test-fixtures/resolvable-ext-references-melinda';\n\nconst {expect} = chai;\nchai.use(chaiAsPromised);\n\nconst endpoint = 'http://melinda.kansalliskirjasto.fi:210/fin01';\nconst queryParam = '?operation=searchRetrieve&maximumRecords=2&version=1&query=rec.id=';\nconst prefixPattern = /^\\(FOOBAR\\)/;\nconst fields = {\n\t773: ['w'],\n\t833: ['w', 'p']\n};\n\ndescribe('resolvable-ext-references-melinda', () => {\n\tafterEach(() => {\n\t\ttestContext.default.__ResetDependency__('fetch');\n\t});\n\n\tit('Creates a validator', async () => {\n\t\tconst validator = await testContext.default({endpoint, prefixPattern, fields});\n\n\t\texpect(validator)\n\t\t\t.to.be.an('object')\n\t\t\t.that.has.any.keys('description', 'validate');\n\n\t\texpect(validator.description).to.be.a('string');\n\t\texpect(validator.validate).to.be.a('function');\n\t});\n\n\tit('Throws an error when prefixPattern not provided', async () => {\n\t\tconst validator = await testContext.default({endpoint, prefixPattern, fields});\n\t\tawait expect(validator.validate()).to.be.rejectedWith(Error, 'Cannot read property \\'fields\\' of undefined');\n\t});\n\n\tdescribe('#validate', () => {\n\t\tit('Finds prefixPattern on record and removes it', async () => {\n\t\t\tconst mock = fetchMock.sandbox();\n\t\t\tmock.get(`${endpoint}${queryParam}5000`, fixture5000);\n\t\t\tmock.get(`${endpoint}${queryParam}9550`, fixture9550);\n\n\t\t\ttestContext.default.__Rewire__('fetch', mock);\n\t\t\tconst validator = await testContext.default({endpoint, prefixPattern, fields});\n\n\t\t\tconst record = new MarcRecord({\n\t\t\t\tfields: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '001',\n\t\t\t\t\t\tvalue: '123456'\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '035',\n\t\t\t\t\t\tsubfields: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcode: 'a',\n\t\t\t\t\t\t\t\tvalue: '(FI-MELINDA)123456'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '773',\n\t\t\t\t\t\tsubfields: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcode: 'w',\n\t\t\t\t\t\t\t\tvalue: '(FOOBAR)5000'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '833',\n\t\t\t\t\t\tsubfields: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcode: 'p',\n\t\t\t\t\t\t\t\tvalue: '(FOOBAR)9550'\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcode: 'c',\n\t\t\t\t\t\t\t\tvalue: '(FI-MELINDA)8850'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t});\n\t\t\tconst result = await validator.validate(record);\n\n\t\t\texpect(result).to.eql({valid: true, messages: []});\n\t\t});\n\n\t\tit('Finds no matching prefixPattern on record', async () => {\n\t\t\tconst mock = fetchMock.sandbox();\n\n\t\t\tmock.get(`${endpoint}5000`, fixture5000);\n\n\t\t\ttestContext.default.__Rewire__('fetch', mock);\n\t\t\tconst validator = await testContext.default({endpoint, prefixPattern, fields});\n\n\t\t\tconst record = new MarcRecord({\n\t\t\t\tfields: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '001',\n\t\t\t\t\t\tvalue: '123456'\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '035',\n\t\t\t\t\t\tsubfields: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcode: 'a',\n\t\t\t\t\t\t\t\tvalue: '(FI-MELINDA)123456'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '773',\n\t\t\t\t\t\tsubfields: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcode: 'w',\n\t\t\t\t\t\t\t\tvalue: '(FI-MELINDA)123456'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '833',\n\t\t\t\t\t\tsubfields: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcode: 'p',\n\t\t\t\t\t\t\t\tvalue: '(FI-MELINDA)2620'\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcode: 'w',\n\t\t\t\t\t\t\t\tvalue: '(FI-MELINDA)8850'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t});\n\t\t\tconst result = await validator.validate(record);\n\n\t\t\texpect(result).to.eql({valid: true, messages: []});\n\t\t});\n\n\t\tit('Finds prefixPattern on record but values not resolvable', async () => {\n\t\t\tconst mock = fetchMock.sandbox();\n\t\t\tmock.get(`${endpoint}${queryParam}1000`, fixture1000);\n\n\t\t\ttestContext.default.__Rewire__('fetch', mock);\n\t\t\tconst validator = await testContext.default({endpoint, prefixPattern, fields});\n\n\t\t\tconst record = new MarcRecord({\n\t\t\t\tfields: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '001',\n\t\t\t\t\t\tvalue: '123456'\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '035',\n\t\t\t\t\t\tsubfields: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcode: 'a',\n\t\t\t\t\t\t\t\tvalue: '(FI-MELINDA)123456'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '773',\n\t\t\t\t\t\tsubfields: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcode: 'w',\n\t\t\t\t\t\t\t\tvalue: '(FOOBAR)1000'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t});\n\t\t\tconst result = await validator.validate(record);\n\n\t\t\texpect(result).to.eql({valid: false, messages: ['Field 773$w with value 1000 is not resolvable']});\n\t\t});\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"resolvable-ext-references-melinda.spec.js","names":["_chai","_interopRequireDefault","require","_chaiAsPromised","_marcRecord","_fetchMock","testContext","_interopRequireWildcard","_resolvableExtReferencesMelinda2","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","expect","chai","use","chaiAsPromised","endpoint","queryParam","prefixPattern","fields","describe","afterEach","__ResetDependency__","it","validator","to","be","an","that","any","keys","description","a","validate","rejectedWith","Error","mock","fetchMock","sandbox","fixture5000","fixture9550","__Rewire__","record","MarcRecord","tag","value","subfields","code","result","eql","valid","messages","fixture1000"],"sources":["../src/resolvable-ext-references-melinda.spec.js"],"sourcesContent":["import chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport fetchMock from 'fetch-mock';\nimport * as testContext from '../src/resolvable-ext-references-melinda';\nimport {fixture5000, fixture9550, fixture1000} from '../test-fixtures/resolvable-ext-references-melinda';\n\nconst {expect} = chai;\nchai.use(chaiAsPromised);\n\nconst endpoint = 'http://melinda.kansalliskirjasto.fi:210/fin01';\nconst queryParam = '?operation=searchRetrieve&maximumRecords=2&version=1&query=rec.id=';\nconst prefixPattern = /^\\(FOOBAR\\)/u;\nconst fields = {\n 773: ['w'],\n 833: ['w', 'p']\n};\n\ndescribe('resolvable-ext-references-melinda', () => {\n afterEach(() => {\n testContext.default.__ResetDependency__('fetch');\n });\n\n it('Creates a validator', async () => {\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n it('Throws an error when prefixPattern not provided', async () => {\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n // Cannot read property 'fields' of undefined or Cannot read properties of undefined (reading 'fields')'\n await expect(validator.validate()).to.be.rejectedWith(Error, /^Cannot read propert/u);\n });\n\n describe('#validate', () => {\n it('Finds prefixPattern on record and removes it', async () => {\n const mock = fetchMock.sandbox();\n mock.get(`${endpoint}${queryParam}5000`, fixture5000);\n mock.get(`${endpoint}${queryParam}9550`, fixture9550);\n\n testContext.default.__Rewire__('fetch', mock);\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '123456'\n },\n {\n tag: '035',\n subfields: [\n {\n code: 'a',\n value: '(FI-MELINDA)123456'\n }\n ]\n },\n {\n tag: '773',\n subfields: [\n {\n code: 'w',\n value: '(FOOBAR)5000'\n }\n ]\n },\n {\n tag: '833',\n subfields: [\n {\n code: 'p',\n value: '(FOOBAR)9550'\n },\n {\n code: 'c',\n value: '(FI-MELINDA)8850'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: true, messages: []});\n });\n\n it('Finds no matching prefixPattern on record', async () => {\n const mock = fetchMock.sandbox();\n\n mock.get(`${endpoint}5000`, fixture5000);\n\n testContext.default.__Rewire__('fetch', mock);\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '123456'\n },\n {\n tag: '035',\n subfields: [\n {\n code: 'a',\n value: '(FI-MELINDA)123456'\n }\n ]\n },\n {\n tag: '773',\n subfields: [\n {\n code: 'w',\n value: '(FI-MELINDA)123456'\n }\n ]\n },\n {\n tag: '833',\n subfields: [\n {\n code: 'p',\n value: '(FI-MELINDA)2620'\n },\n {\n code: 'w',\n value: '(FI-MELINDA)8850'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: true, messages: []});\n });\n\n it('Finds prefixPattern on record but values not resolvable', async () => {\n const mock = fetchMock.sandbox();\n mock.get(`${endpoint}${queryParam}1000`, fixture1000);\n\n testContext.default.__Rewire__('fetch', mock);\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '123456'\n },\n {\n tag: '035',\n subfields: [\n {\n code: 'a',\n value: '(FI-MELINDA)123456'\n }\n ]\n },\n {\n tag: '773',\n subfields: [\n {\n code: 'w',\n value: '(FOOBAR)1000'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: false, messages: ['Field 773$w with value 1000 is not resolvable']});\n });\n });\n});\n"],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = _default;
|
|
7
|
+
exports.recordFixSubfield6OccurrenceNumbers = recordFixSubfield6OccurrenceNumbers;
|
|
8
|
+
var _debug = _interopRequireDefault(require("debug"));
|
|
9
|
+
var _utils = require("./utils");
|
|
10
|
+
var _subfield6Utils = require("./subfield6Utils");
|
|
11
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
12
|
+
// Relocated from melinda-marc-record-merge-reducers (and renamed)
|
|
13
|
+
|
|
14
|
+
const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda:resolveOrphanedSubfield6s');
|
|
15
|
+
function _default() {
|
|
16
|
+
return {
|
|
17
|
+
description: 'Remove occurrence-number-orphaned $6 subfields. In field 880, occurrence number becomes 00',
|
|
18
|
+
validate,
|
|
19
|
+
fix
|
|
20
|
+
};
|
|
21
|
+
function fix(record) {
|
|
22
|
+
(0, _utils.nvdebug)('Fix SF6 orphaned occurrence numbers');
|
|
23
|
+
const res = {
|
|
24
|
+
message: [],
|
|
25
|
+
fix: [],
|
|
26
|
+
valid: true
|
|
27
|
+
};
|
|
28
|
+
//message.fix = []; // eslint-disable-line functional/immutable-data
|
|
29
|
+
|
|
30
|
+
// This can not really fail...
|
|
31
|
+
recordFixSubfield6OccurrenceNumbers(record);
|
|
32
|
+
|
|
33
|
+
//message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data
|
|
34
|
+
return res;
|
|
35
|
+
}
|
|
36
|
+
function validate(record) {
|
|
37
|
+
// Check max, and check number of different indexes
|
|
38
|
+
(0, _utils.nvdebug)('Validate SF6 orphaned occurrence numbers', debug);
|
|
39
|
+
const fieldsContainingSubfield6 = record.fields.filter(field => (0, _utils.fieldHasSubfield)(field, '6'));
|
|
40
|
+
const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);
|
|
41
|
+
const res = {
|
|
42
|
+
message: []
|
|
43
|
+
};
|
|
44
|
+
if (orphanedFields.length > 0) {
|
|
45
|
+
// eslint-disable-line functional/no-conditional-statements
|
|
46
|
+
res.message = [`${orphanedFields.length} orphaned occurrence number field(s) detected`]; // eslint-disable-line functional/immutable-data
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data
|
|
50
|
+
return res;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function recordFixSubfield6OccurrenceNumbers(record) {
|
|
54
|
+
const fieldsContainingSubfield6 = record.fields.filter(field => (0, _utils.fieldHasSubfield)(field, '6'));
|
|
55
|
+
const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);
|
|
56
|
+
orphanedFields.forEach(field => fieldFixOrphanedSubfields(field));
|
|
57
|
+
function fieldFixOrphanedSubfields(field) {
|
|
58
|
+
// Field 880: orphaned $6 subfields: occurrence number is changed to '00':
|
|
59
|
+
if (field.tag === '880') {
|
|
60
|
+
field.subfields.forEach(sf => field880FixOrphanedSubfield(sf));
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// Non-880 fields get their orphaned $6s removed:
|
|
64
|
+
const remainingSubfields = field.subfields.filter(sf => !isOrphanedSubfield(sf, field.tag, fieldsContainingSubfield6));
|
|
65
|
+
if (remainingSubfields.length === 0) {
|
|
66
|
+
record.removeField(field);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
field.subfields = remainingSubfields; // eslint-disable-line functional/immutable-data
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function field880FixOrphanedSubfield(subfield) {
|
|
73
|
+
if (!isOrphanedSubfield(subfield, '880', fieldsContainingSubfield6)) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
// convert occurrence number to 00
|
|
77
|
+
(0, _subfield6Utils.subfield6ResetOccurrenceNumber)(subfield, '00');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function findPairForSubfield6OccurrenceNumber(subfield6, myTag, candPairFields) {
|
|
81
|
+
// We keep the crap!
|
|
82
|
+
if (!(0, _subfield6Utils.isValidSubfield6)(subfield6)) {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
(0, _utils.nvdebug)(`LOOKING FOR PAIR: ${myTag} ${(0, _utils.subfieldToString)(subfield6)}`);
|
|
86
|
+
candPairFields.forEach(field => (0, _utils.fieldToString)(field));
|
|
87
|
+
|
|
88
|
+
// Only valid $6 value that fails to map to another field is iffy...
|
|
89
|
+
const referredTag = subfield6.value.substring(0, 3);
|
|
90
|
+
const occurrenceNumber = (0, _subfield6Utils.subfield6GetOccurrenceNumber)(subfield6);
|
|
91
|
+
if (occurrenceNumber === '00') {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
const tagAndOccurrenceNumber = `${myTag}-${occurrenceNumber}`;
|
|
95
|
+
(0, _utils.nvdebug)(`Try to find occurrence number ${tagAndOccurrenceNumber} in field ${referredTag}...`);
|
|
96
|
+
//const relevantFields = fields.filter(field => field.tag === referredTag && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber));
|
|
97
|
+
const relevantFields = candPairFields.filter(field => field.tag === referredTag && (0, _subfield6Utils.fieldHasWantedTagAndOccurrenceNumber)(field, tagAndOccurrenceNumber));
|
|
98
|
+
if (relevantFields.length === 0) {
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
// This should always return just one (not sanity checking this for now):
|
|
102
|
+
return relevantFields[0];
|
|
103
|
+
}
|
|
104
|
+
function isOrphanedSubfield(subfield, tag, pairCandidateFields) {
|
|
105
|
+
if (!(0, _subfield6Utils.isValidSubfield6)(subfield) || (0, _subfield6Utils.subfield6GetOccurrenceNumber)(subfield) === '00') {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
return !findPairForSubfield6OccurrenceNumber(subfield, tag, pairCandidateFields);
|
|
109
|
+
}
|
|
110
|
+
function isOrphanedField(field, candidatePairFields) {
|
|
111
|
+
return field.subfields.some(sf => isOrphanedSubfield(sf, field.tag, candidatePairFields));
|
|
112
|
+
}
|
|
113
|
+
function getOrphanedFields(relevantFields) {
|
|
114
|
+
return relevantFields.filter(field => isOrphanedField(field, relevantFields));
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=resolveOrphanedSubfield6s.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveOrphanedSubfield6s.js","names":["_debug","_interopRequireDefault","require","_utils","_subfield6Utils","obj","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","recordFixSubfield6OccurrenceNumbers","fieldsContainingSubfield6","fields","filter","field","fieldHasSubfield","orphanedFields","getOrphanedFields","length","forEach","fieldFixOrphanedSubfields","tag","subfields","sf","field880FixOrphanedSubfield","remainingSubfields","isOrphanedSubfield","removeField","subfield","subfield6ResetOccurrenceNumber","findPairForSubfield6OccurrenceNumber","subfield6","myTag","candPairFields","isValidSubfield6","undefined","subfieldToString","fieldToString","referredTag","value","substring","occurrenceNumber","subfield6GetOccurrenceNumber","tagAndOccurrenceNumber","relevantFields","fieldHasWantedTagAndOccurrenceNumber","pairCandidateFields","isOrphanedField","candidatePairFields","some"],"sources":["../src/resolveOrphanedSubfield6s.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString, nvdebug, subfieldToString} from './utils';\nimport {fieldHasWantedTagAndOccurrenceNumber, isValidSubfield6, subfield6GetOccurrenceNumber, subfield6ResetOccurrenceNumber} from './subfield6Utils';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:resolveOrphanedSubfield6s');\n\nexport default function () {\n return {\n description: 'Remove occurrence-number-orphaned $6 subfields. In field 880, occurrence number becomes 00',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix SF6 orphaned occurrence numbers');\n const res = {message: [], fix: [], valid: true};\n //message.fix = []; // eslint-disable-line functional/immutable-data\n\n // This can not really fail...\n recordFixSubfield6OccurrenceNumbers(record);\n\n //message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validate(record) {\n // Check max, and check number of different indexes\n nvdebug('Validate SF6 orphaned occurrence numbers', debug);\n const fieldsContainingSubfield6 = record.fields.filter(field => fieldHasSubfield(field, '6'));\n\n const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);\n\n const res = {message: []};\n\n if (orphanedFields.length > 0) { // eslint-disable-line functional/no-conditional-statements\n res.message = [`${orphanedFields.length} orphaned occurrence number field(s) detected`]; // eslint-disable-line functional/immutable-data\n }\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\nexport function recordFixSubfield6OccurrenceNumbers(record) {\n const fieldsContainingSubfield6 = record.fields.filter(field => fieldHasSubfield(field, '6'));\n const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);\n\n orphanedFields.forEach(field => fieldFixOrphanedSubfields(field));\n\n function fieldFixOrphanedSubfields(field) {\n // Field 880: orphaned $6 subfields: occurrence number is changed to '00':\n if (field.tag === '880') {\n field.subfields.forEach(sf => field880FixOrphanedSubfield(sf));\n return;\n }\n // Non-880 fields get their orphaned $6s removed:\n const remainingSubfields = field.subfields.filter(sf => !isOrphanedSubfield(sf, field.tag, fieldsContainingSubfield6));\n if (remainingSubfields.length === 0) {\n record.removeField(field);\n return;\n }\n field.subfields = remainingSubfields; // eslint-disable-line functional/immutable-data\n }\n\n function field880FixOrphanedSubfield(subfield) {\n if (!isOrphanedSubfield(subfield, '880', fieldsContainingSubfield6)) {\n return;\n }\n // convert occurrence number to 00\n subfield6ResetOccurrenceNumber(subfield, '00');\n }\n}\n\n\nfunction findPairForSubfield6OccurrenceNumber(subfield6, myTag, candPairFields) {\n // We keep the crap!\n if (!isValidSubfield6(subfield6)) {\n return undefined;\n }\n nvdebug(`LOOKING FOR PAIR: ${myTag} ${subfieldToString(subfield6)}`);\n candPairFields.forEach(field => fieldToString(field));\n\n // Only valid $6 value that fails to map to another field is iffy...\n const referredTag = subfield6.value.substring(0, 3);\n\n const occurrenceNumber = subfield6GetOccurrenceNumber(subfield6);\n if (occurrenceNumber === '00') {\n return undefined;\n }\n const tagAndOccurrenceNumber = `${myTag}-${occurrenceNumber}`;\n nvdebug(`Try to find occurrence number ${tagAndOccurrenceNumber} in field ${referredTag}...`);\n //const relevantFields = fields.filter(field => field.tag === referredTag && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber));\n const relevantFields = candPairFields.filter(field => field.tag === referredTag && fieldHasWantedTagAndOccurrenceNumber(field, tagAndOccurrenceNumber));\n if (relevantFields.length === 0) {\n return undefined;\n }\n // This should always return just one (not sanity checking this for now):\n return relevantFields[0];\n}\n\nfunction isOrphanedSubfield(subfield, tag, pairCandidateFields) {\n if (!isValidSubfield6(subfield) || subfield6GetOccurrenceNumber(subfield) === '00') {\n return false;\n }\n return !findPairForSubfield6OccurrenceNumber(subfield, tag, pairCandidateFields);\n}\n\n\nfunction isOrphanedField(field, candidatePairFields) {\n return field.subfields.some(sf => isOrphanedSubfield(sf, field.tag, candidatePairFields));\n}\n\nfunction getOrphanedFields(relevantFields) {\n return relevantFields.filter(field => isOrphanedField(field, relevantFields));\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _chai = require("chai");
|
|
4
|
+
var _marcRecord = require("@natlibfi/marc-record");
|
|
5
|
+
var _resolveOrphanedSubfield6s = _interopRequireDefault(require("./resolveOrphanedSubfield6s"));
|
|
6
|
+
var _fixura = require("@natlibfi/fixura");
|
|
7
|
+
var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
|
|
8
|
+
var _debug = _interopRequireDefault(require("debug"));
|
|
9
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
|
+
(0, _fixugen.default)({
|
|
11
|
+
callback,
|
|
12
|
+
path: [__dirname, '..', 'test-fixtures', 'remove-orphanded-sf6s'],
|
|
13
|
+
useMetadataFile: true,
|
|
14
|
+
recurse: false,
|
|
15
|
+
fixura: {
|
|
16
|
+
reader: _fixura.READERS.JSON
|
|
17
|
+
},
|
|
18
|
+
mocha: {
|
|
19
|
+
before: () => testValidatorFactory()
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda/resolveOrphanedSubfield6s:test');
|
|
23
|
+
async function testValidatorFactory() {
|
|
24
|
+
const validator = await (0, _resolveOrphanedSubfield6s.default)();
|
|
25
|
+
(0, _chai.expect)(validator).to.be.an('object').that.has.any.keys('description', 'validate');
|
|
26
|
+
(0, _chai.expect)(validator.description).to.be.a('string');
|
|
27
|
+
(0, _chai.expect)(validator.validate).to.be.a('function');
|
|
28
|
+
}
|
|
29
|
+
async function callback({
|
|
30
|
+
getFixture,
|
|
31
|
+
enabled = true,
|
|
32
|
+
fix = false
|
|
33
|
+
}) {
|
|
34
|
+
if (enabled === false) {
|
|
35
|
+
debug('TEST SKIPPED!');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const validator = await (0, _resolveOrphanedSubfield6s.default)();
|
|
39
|
+
const record = new _marcRecord.MarcRecord(getFixture('record.json'));
|
|
40
|
+
const expectedResult = getFixture('expectedResult.json');
|
|
41
|
+
// console.log(expectedResult); // eslint-disable-line
|
|
42
|
+
|
|
43
|
+
if (!fix) {
|
|
44
|
+
const result = await validator.validate(record);
|
|
45
|
+
(0, _chai.expect)(result).to.eql(expectedResult);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
await validator.fix(record);
|
|
49
|
+
(0, _chai.expect)(record).to.eql(expectedResult);
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=resolveOrphanedSubfield6s.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveOrphanedSubfield6s.spec.js","names":["_chai","require","_marcRecord","_resolveOrphanedSubfield6s","_interopRequireDefault","_fixura","_fixugen","_debug","obj","__esModule","default","generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","debug","createDebugLogger","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","getFixture","enabled","fix","record","MarcRecord","expectedResult","result","eql"],"sources":["../src/resolveOrphanedSubfield6s.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './resolveOrphanedSubfield6s';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'remove-orphanded-sf6s'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/resolveOrphanedSubfield6s:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('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 expect(result).to.eql(expectedResult);\n return;\n }\n\n await validator.fix(record);\n expect(record).to.eql(expectedResult);\n}\n"],"mappings":";;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,0BAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAF,sBAAA,CAAAH,OAAA;AACA,IAAAM,MAAA,GAAAH,sBAAA,CAAAH,OAAA;AAAsC,SAAAG,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEtC,IAAAG,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,uBAAuB,CAAC;EACjEC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAEA,CAAA,KAAMC,oBAAoB,CAAC;EACrC;AACF,CAAC,CAAC;AACF,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,yEAAyE,CAAC;AAE1G,eAAeF,oBAAoBA,CAAA,EAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,kCAAgB,EAAC,CAAC;EAE1C,IAAAC,YAAM,EAACF,SAAS,CAAC,CACdG,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,QAAQ,CAAC,CAClBC,IAAI,CAACC,GAAG,CAACC,GAAG,CAACC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;EAE/C,IAAAP,YAAM,EAACF,SAAS,CAACU,WAAW,CAAC,CAACP,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,QAAQ,CAAC;EAC/C,IAAAT,YAAM,EAACF,SAAS,CAACY,QAAQ,CAAC,CAACT,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,UAAU,CAAC;AAChD;AAEA,eAAezB,QAAQA,CAAC;EAAC2B,UAAU;EAAEC,OAAO,GAAG,IAAI;EAAEC,GAAG,GAAG;AAAK,CAAC,EAAE;EACjE,IAAID,OAAO,KAAK,KAAK,EAAE;IACrBhB,KAAK,CAAC,eAAe,CAAC;IACtB;EACF;EAEA,MAAME,SAAS,GAAG,MAAM,IAAAC,kCAAgB,EAAC,CAAC;EAC1C,MAAMe,MAAM,GAAG,IAAIC,sBAAU,CAACJ,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMK,cAAc,GAAGL,UAAU,CAAC,qBAAqB,CAAC;EACxD;;EAEA,IAAI,CAACE,GAAG,EAAE;IACR,MAAMI,MAAM,GAAG,MAAMnB,SAAS,CAACY,QAAQ,CAACI,MAAM,CAAC;IAC/C,IAAAd,YAAM,EAACiB,MAAM,CAAC,CAAChB,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;IACrC;EACF;EAEA,MAAMlB,SAAS,CAACe,GAAG,CAACC,MAAM,CAAC;EAC3B,IAAAd,YAAM,EAACc,MAAM,CAAC,CAACb,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;AACvC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = _default;
|
|
7
|
+
var _utils = require("./utils");
|
|
8
|
+
//import createDebugLogger from 'debug';
|
|
9
|
+
|
|
10
|
+
//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes);
|
|
11
|
+
// Author(s): Nicholas Volk, Joni Ollila
|
|
12
|
+
function _default() {
|
|
13
|
+
return {
|
|
14
|
+
description: 'Validator for sanitizing vocabulary source codes in subfield $2 (MRA-532)',
|
|
15
|
+
validate,
|
|
16
|
+
fix
|
|
17
|
+
};
|
|
18
|
+
function fix(record) {
|
|
19
|
+
const fixedFields = getFieldsWithCrappySubfieldCode(record, true);
|
|
20
|
+
const remainingBadFields = getFieldsWithCrappySubfieldCode(record, false);
|
|
21
|
+
const remainingBadFieldsAsStrings = remainingBadFields.map(f => (0, _utils.fieldToString)(f));
|
|
22
|
+
|
|
23
|
+
// We are content
|
|
24
|
+
const fixedFieldsAsStrings = fixedFields.map(f => (0, _utils.fieldToString)(f));
|
|
25
|
+
return {
|
|
26
|
+
message: remainingBadFieldsAsStrings,
|
|
27
|
+
fix: fixedFieldsAsStrings,
|
|
28
|
+
valid: true
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function validate(record) {
|
|
32
|
+
const badFields = getFieldsWithCrappySubfieldCode(record, false);
|
|
33
|
+
if (badFields.length === 0) {
|
|
34
|
+
return {
|
|
35
|
+
'message': [],
|
|
36
|
+
'valid': true
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
const messages = badFields.map(f => (0, _utils.fieldToString)(f));
|
|
40
|
+
return {
|
|
41
|
+
'message': messages,
|
|
42
|
+
'valid': false
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// 'mts' is here as per specs. However, I think it should be 'mts/fin' or 'mts/swe'
|
|
48
|
+
const legalSubfieldCode = ['allars', 'mts', 'mts/fin', 'mts/swe', 'slm/fin', 'slm/swe', 'ysa', 'yso/fin', 'yso/swe'];
|
|
49
|
+
function stringFixVocabularySourceCode(value) {
|
|
50
|
+
// Try to remove spaces, change '//' to '/' and remove final '.' and '/':
|
|
51
|
+
const tmp = value.replace(/ /ug, '').replace(/\/+/ug, '/').replace(/^(?:slm|yso)\/$/u, 'local').replace(/[./]$/gu, '').replace(/^yso-(?:aika|paikat)\//u, 'yso/'); // IMP-HELMET crap. Also, they still have a '.' at the end of $a...
|
|
52
|
+
|
|
53
|
+
if (legalSubfieldCode.includes(tmp)) {
|
|
54
|
+
return tmp;
|
|
55
|
+
}
|
|
56
|
+
return value;
|
|
57
|
+
}
|
|
58
|
+
function isCrappySubfield2(subfield, fix) {
|
|
59
|
+
if (subfield.code !== '2' || legalSubfieldCode.includes(subfield.value)) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// If fixer modifies string, it's crap:
|
|
64
|
+
const fixedVersion = stringFixVocabularySourceCode(subfield.value);
|
|
65
|
+
if (fixedVersion !== subfield.value) {
|
|
66
|
+
if (fix) {
|
|
67
|
+
subfield.value = fixedVersion; // eslint-disable-line functional/immutable-data
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
// As we can't fix this here, apply this yso-rule only when validating!
|
|
73
|
+
if (!fix && subfield.value.indexOf('yso/') === 0) {
|
|
74
|
+
return !['yso/eng', 'yso/fin', 'yso/swe'].includes(subfield.value);
|
|
75
|
+
}
|
|
76
|
+
if (!fix && subfield.value.indexOf('slm/') === 0) {
|
|
77
|
+
return !['slm/fin', 'slm/swe'].includes(subfield.value);
|
|
78
|
+
}
|
|
79
|
+
if (!fix && subfield.value.indexOf('mts/') === 0) {
|
|
80
|
+
return !['mts/fin', 'mts/swe'].includes(subfield.value);
|
|
81
|
+
}
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
function fieldHasCrappySubfield2(field, fix) {
|
|
85
|
+
if (!field.tag.match(/^(?:6..|257|370|38.)$/u)) {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
return field.subfields.some(sf => isCrappySubfield2(sf, fix));
|
|
89
|
+
}
|
|
90
|
+
function getFieldsWithCrappySubfieldCode(record, fix) {
|
|
91
|
+
return record.get(/^6..$/u).filter(f => fieldHasCrappySubfield2(f, fix));
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=sanitize-vocabulary-source-codes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize-vocabulary-source-codes.js","names":["_utils","require","_default","description","validate","fix","record","fixedFields","getFieldsWithCrappySubfieldCode","remainingBadFields","remainingBadFieldsAsStrings","map","f","fieldToString","fixedFieldsAsStrings","message","valid","badFields","length","messages","legalSubfieldCode","stringFixVocabularySourceCode","value","tmp","replace","includes","isCrappySubfield2","subfield","code","fixedVersion","indexOf","fieldHasCrappySubfield2","field","tag","match","subfields","some","sf","get","filter"],"sources":["../src/sanitize-vocabulary-source-codes.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes);\n\n\n// Author(s): Nicholas Volk, Joni Ollila\nexport default function () {\n\n return {\n description: 'Validator for sanitizing vocabulary source codes in subfield $2 (MRA-532)',\n validate, fix\n };\n\n function fix(record) {\n const fixedFields = getFieldsWithCrappySubfieldCode(record, true);\n const remainingBadFields = getFieldsWithCrappySubfieldCode(record, false);\n const remainingBadFieldsAsStrings = remainingBadFields.map(f => fieldToString(f));\n\n // We are content\n const fixedFieldsAsStrings = fixedFields.map(f => fieldToString(f));\n\n return {message: remainingBadFieldsAsStrings, fix: fixedFieldsAsStrings, valid: true};\n }\n\n function validate(record) {\n const badFields = getFieldsWithCrappySubfieldCode(record, false);\n\n if (badFields.length === 0) {\n return {'message': [], 'valid': true};\n }\n\n const messages = badFields.map(f => fieldToString(f));\n\n return {'message': messages, 'valid': false};\n }\n}\n\n// 'mts' is here as per specs. However, I think it should be 'mts/fin' or 'mts/swe'\nconst legalSubfieldCode = ['allars', 'mts', 'mts/fin', 'mts/swe', 'slm/fin', 'slm/swe', 'ysa', 'yso/fin', 'yso/swe'];\n\nfunction stringFixVocabularySourceCode(value) {\n // Try to remove spaces, change '//' to '/' and remove final '.' and '/':\n const tmp = value.replace(/ /ug, '')\n .replace(/\\/+/ug, '/')\n .replace(/^(?:slm|yso)\\/$/u, 'local')\n .replace(/[./]$/gu, '')\n .replace(/^yso-(?:aika|paikat)\\//u, 'yso/'); // IMP-HELMET crap. Also, they still have a '.' at the end of $a...\n\n if (legalSubfieldCode.includes(tmp)) {\n return tmp;\n }\n\n return value;\n}\n\nfunction isCrappySubfield2(subfield, fix) {\n if (subfield.code !== '2' || legalSubfieldCode.includes(subfield.value)) {\n return false;\n }\n\n // If fixer modifies string, it's crap:\n const fixedVersion = stringFixVocabularySourceCode(subfield.value);\n\n if (fixedVersion !== subfield.value) {\n if (fix) {\n subfield.value = fixedVersion; // eslint-disable-line functional/immutable-data\n return true;\n }\n\n return true;\n }\n // As we can't fix this here, apply this yso-rule only when validating!\n if (!fix && subfield.value.indexOf('yso/') === 0) {\n return !['yso/eng', 'yso/fin', 'yso/swe'].includes(subfield.value);\n }\n\n if (!fix && subfield.value.indexOf('slm/') === 0) {\n return !['slm/fin', 'slm/swe'].includes(subfield.value);\n }\n\n if (!fix && subfield.value.indexOf('mts/') === 0) {\n return !['mts/fin', 'mts/swe'].includes(subfield.value);\n }\n\n return false;\n}\n\nfunction fieldHasCrappySubfield2(field, fix) {\n if (!field.tag.match(/^(?:6..|257|370|38.)$/u)) {\n return false;\n }\n\n return field.subfields.some(sf => isCrappySubfield2(sf, fix));\n}\n\nfunction getFieldsWithCrappySubfieldCode(record, fix) {\n return record.get(/^6..$/u).filter(f => fieldHasCrappySubfield2(f, fix));\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _chai = require("chai");
|
|
4
|
+
var _marcRecord = require("@natlibfi/marc-record");
|
|
5
|
+
var _sanitizeVocabularySourceCodes = _interopRequireDefault(require("./sanitize-vocabulary-source-codes"));
|
|
6
|
+
var _fixura = require("@natlibfi/fixura");
|
|
7
|
+
var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
|
|
8
|
+
var _debug = _interopRequireDefault(require("debug"));
|
|
9
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
|
+
(0, _fixugen.default)({
|
|
11
|
+
callback,
|
|
12
|
+
path: [__dirname, '..', 'test-fixtures', 'sanitize-vocabulary-source-codes'],
|
|
13
|
+
useMetadataFile: true,
|
|
14
|
+
recurse: false,
|
|
15
|
+
fixura: {
|
|
16
|
+
reader: _fixura.READERS.JSON
|
|
17
|
+
},
|
|
18
|
+
mocha: {
|
|
19
|
+
before: () => testValidatorFactory()
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes:test');
|
|
23
|
+
async function testValidatorFactory() {
|
|
24
|
+
const validator = await (0, _sanitizeVocabularySourceCodes.default)();
|
|
25
|
+
(0, _chai.expect)(validator).to.be.an('object').that.has.any.keys('description', 'validate');
|
|
26
|
+
(0, _chai.expect)(validator.description).to.be.a('string');
|
|
27
|
+
(0, _chai.expect)(validator.validate).to.be.a('function');
|
|
28
|
+
}
|
|
29
|
+
async function callback({
|
|
30
|
+
getFixture,
|
|
31
|
+
enabled = true,
|
|
32
|
+
fix = false
|
|
33
|
+
}) {
|
|
34
|
+
if (enabled === false) {
|
|
35
|
+
debug('TEST SKIPPED!');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const validator = await (0, _sanitizeVocabularySourceCodes.default)();
|
|
39
|
+
const record = new _marcRecord.MarcRecord(getFixture('record.json'));
|
|
40
|
+
const expectedResult = getFixture('expectedResult.json');
|
|
41
|
+
// console.log(expectedResult); // eslint-disable-line
|
|
42
|
+
|
|
43
|
+
if (!fix) {
|
|
44
|
+
const result = await validator.validate(record);
|
|
45
|
+
(0, _chai.expect)(result).to.eql(expectedResult);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
await validator.fix(record);
|
|
49
|
+
(0, _chai.expect)(record).to.eql(expectedResult);
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=sanitize-vocabulary-source-codes.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize-vocabulary-source-codes.spec.js","names":["_chai","require","_marcRecord","_sanitizeVocabularySourceCodes","_interopRequireDefault","_fixura","_fixugen","_debug","obj","__esModule","default","generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","debug","createDebugLogger","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","getFixture","enabled","fix","record","MarcRecord","expectedResult","result","eql"],"sources":["../src/sanitize-vocabulary-source-codes.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './sanitize-vocabulary-source-codes';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'sanitize-vocabulary-source-codes'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('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 expect(result).to.eql(expectedResult);\n return;\n }\n\n await validator.fix(record);\n expect(record).to.eql(expectedResult);\n}\n"],"mappings":";;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,8BAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAF,sBAAA,CAAAH,OAAA;AACA,IAAAM,MAAA,GAAAH,sBAAA,CAAAH,OAAA;AAAsC,SAAAG,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEtC,IAAAG,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,kCAAkC,CAAC;EAC5EC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAEA,CAAA,KAAMC,oBAAoB,CAAC;EACrC;AACF,CAAC,CAAC;AACF,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,gFAAgF,CAAC;AAEjH,eAAeF,oBAAoBA,CAAA,EAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,sCAAgB,EAAC,CAAC;EAE1C,IAAAC,YAAM,EAACF,SAAS,CAAC,CACdG,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,QAAQ,CAAC,CAClBC,IAAI,CAACC,GAAG,CAACC,GAAG,CAACC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;EAE/C,IAAAP,YAAM,EAACF,SAAS,CAACU,WAAW,CAAC,CAACP,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,QAAQ,CAAC;EAC/C,IAAAT,YAAM,EAACF,SAAS,CAACY,QAAQ,CAAC,CAACT,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,UAAU,CAAC;AAChD;AAEA,eAAezB,QAAQA,CAAC;EAAC2B,UAAU;EAAEC,OAAO,GAAG,IAAI;EAAEC,GAAG,GAAG;AAAK,CAAC,EAAE;EACjE,IAAID,OAAO,KAAK,KAAK,EAAE;IACrBhB,KAAK,CAAC,eAAe,CAAC;IACtB;EACF;EAEA,MAAME,SAAS,GAAG,MAAM,IAAAC,sCAAgB,EAAC,CAAC;EAC1C,MAAMe,MAAM,GAAG,IAAIC,sBAAU,CAACJ,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMK,cAAc,GAAGL,UAAU,CAAC,qBAAqB,CAAC;EACxD;;EAEA,IAAI,CAACE,GAAG,EAAE;IACR,MAAMI,MAAM,GAAG,MAAMnB,SAAS,CAACY,QAAQ,CAACI,MAAM,CAAC;IAC/C,IAAAd,YAAM,EAACiB,MAAM,CAAC,CAAChB,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;IACrC;EACF;EAEA,MAAMlB,SAAS,CAACe,GAAG,CAACC,MAAM,CAAC;EAC3B,IAAAd,YAAM,EAACc,MAAM,CAAC,CAACb,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;AACvC"}
|