@natlibfi/marc-record-validators-melinda 3.2.0 → 3.3.14-alpha.3
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
package/dist/isbn-issn.js
CHANGED
|
@@ -1,28 +1,267 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _isbn = _interopRequireDefault(require("isbn3"));
|
|
8
|
+
var _issnVerify = _interopRequireDefault(require("@natlibfi/issn-verify"));
|
|
9
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
|
+
// handleInvalid: move invalid 020$a to 020$z, and invalid 022$a to 022$y
|
|
11
|
+
var _default = ({
|
|
12
|
+
hyphenateISBN = false,
|
|
13
|
+
handleInvalid = false
|
|
14
|
+
} = {}) => {
|
|
15
|
+
return {
|
|
16
|
+
validate,
|
|
17
|
+
fix,
|
|
18
|
+
description: 'Validates ISBN and ISSN values'
|
|
19
|
+
};
|
|
20
|
+
function stringHasSpace(str) {
|
|
21
|
+
return str.indexOf(' ') > -1;
|
|
22
|
+
}
|
|
23
|
+
function trimSpaces(value) {
|
|
24
|
+
return value.replace(/^\s+/u, '').replace(/\s+$/u, '').replace(/\s+/gu, ' ');
|
|
25
|
+
}
|
|
26
|
+
function isMultiWord(inputString) {
|
|
27
|
+
const trimmedString = trimSpaces(inputString);
|
|
28
|
+
return stringHasSpace(trimmedString);
|
|
29
|
+
}
|
|
30
|
+
function getFirstWord(inputString) {
|
|
31
|
+
const trimmedString = trimSpaces(inputString);
|
|
32
|
+
const arr = trimmedString.split(' ');
|
|
33
|
+
return arr[0];
|
|
34
|
+
}
|
|
35
|
+
function invalidISBN(isbn) {
|
|
36
|
+
const isbnOnly = getFirstWord(isbn);
|
|
37
|
+
const auditedIsbn = _isbn.default.audit(isbnOnly);
|
|
38
|
+
return !auditedIsbn.validIsbn;
|
|
39
|
+
}
|
|
40
|
+
function invalidSubfield(subfield) {
|
|
41
|
+
if (subfield.code !== 'a') {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
return invalidISBN(subfield.value) || isMultiWord(subfield.value);
|
|
45
|
+
}
|
|
46
|
+
function invalidField020(field) {
|
|
47
|
+
if (field.subfields && field.subfields.some(sf => invalidSubfield(sf))) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
function subfieldsIsbnRequiresHyphenation(subfield) {
|
|
53
|
+
if (!hyphenateISBN || !['a', 'z'].includes(subfield.code)) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
const isbn = getFirstWord(subfield.value);
|
|
57
|
+
if (subfield.code === 'a') {
|
|
58
|
+
return requiresHyphenation(isbn);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// $z is a bit hacky: hyphenation is required only iff valid and no '-' chars
|
|
62
|
+
if (isbn.indexOf('-') > -1) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
return !invalidISBN(isbn);
|
|
66
|
+
function requiresHyphenation(isbn) {
|
|
67
|
+
if (!hyphenateISBN) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
// Handle old notation such as "978-952-396-001-5 (nid.)"
|
|
71
|
+
const isbn2 = getFirstWord(isbn);
|
|
72
|
+
if (invalidISBN(isbn2)) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
const parsedIsbn = _isbn.default.parse(isbn2);
|
|
76
|
+
// Return true only if existing ISBN is a valid and hyphenated 10 or 13 digit ISBN:
|
|
77
|
+
return !(isbn2 === parsedIsbn.isbn10h || isbn2 === parsedIsbn.isbn13h);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function getRelevantFields(record) {
|
|
81
|
+
//return record.get(/^(?:020|022)$/u).filter(field => {
|
|
82
|
+
return record.fields.filter(field => {
|
|
83
|
+
if (!field.subfields) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
// Check ISBN:
|
|
87
|
+
if (field.tag === '020') {
|
|
88
|
+
if (invalidField020(field)) {
|
|
89
|
+
// checks multiwordness
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
return fieldsIsbnRequiresHyphenation(field);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Check ISSN:
|
|
96
|
+
if (field.tag === '022') {
|
|
97
|
+
if (invalidField022(field)) {
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
const subfield = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');
|
|
101
|
+
return !(0, _issnVerify.default)(subfield.value);
|
|
102
|
+
}
|
|
103
|
+
return false;
|
|
104
|
+
});
|
|
105
|
+
function fieldsIsbnRequiresHyphenation(field) {
|
|
106
|
+
return field.subfields && field.subfields.some(sf => subfieldsIsbnRequiresHyphenation(sf));
|
|
107
|
+
}
|
|
108
|
+
function invalidField022(field) {
|
|
109
|
+
const subfieldAorL = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');
|
|
110
|
+
if (subfieldAorL === undefined) {
|
|
111
|
+
const subfieldY = field.subfields.find(sf => sf.code === 'y');
|
|
112
|
+
if (subfieldY) {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function validate(record) {
|
|
121
|
+
const fields = getRelevantFields(record);
|
|
122
|
+
if (fields.length === 0) {
|
|
123
|
+
return {
|
|
124
|
+
valid: true
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
return fields.map(field => {
|
|
128
|
+
if (field.tag === '020') {
|
|
129
|
+
const subfieldA = field.subfields.find(sf => sf.code === 'a');
|
|
130
|
+
if (subfieldA) {
|
|
131
|
+
return {
|
|
132
|
+
name: 'ISBN',
|
|
133
|
+
value: subfieldA.value
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
const subfieldZ = field.subfields.find(sf => sf.code === 'z');
|
|
137
|
+
if (subfieldZ) {
|
|
138
|
+
return {
|
|
139
|
+
name: 'ISBN (subfield Z)',
|
|
140
|
+
value: subfieldZ.value
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
name: 'ISBN',
|
|
145
|
+
value: undefined
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
name: 'ISSN',
|
|
150
|
+
value: getISSN()
|
|
151
|
+
};
|
|
152
|
+
function getISSN() {
|
|
153
|
+
const subfieldAorL = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');
|
|
154
|
+
if (subfieldAorL) {
|
|
155
|
+
return subfieldAorL.value;
|
|
156
|
+
}
|
|
157
|
+
return undefined;
|
|
158
|
+
}
|
|
159
|
+
}).reduce((acc, obj) => {
|
|
160
|
+
const {
|
|
161
|
+
name,
|
|
162
|
+
value
|
|
163
|
+
} = obj;
|
|
164
|
+
const msg = `${name} (${value}) is not valid`;
|
|
165
|
+
return {
|
|
166
|
+
...acc,
|
|
167
|
+
messages: acc.messages.concat(msg)
|
|
168
|
+
};
|
|
169
|
+
}, {
|
|
170
|
+
valid: false,
|
|
171
|
+
messages: []
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
function fix(record) {
|
|
175
|
+
getRelevantFields(record).forEach(field => {
|
|
176
|
+
if (field.tag === '020') {
|
|
177
|
+
field.subfields.forEach(subfield => fixField020Subfield(field, subfield));
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
// 022 ISSN:
|
|
181
|
+
const subfield = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');
|
|
182
|
+
if (subfield && handleInvalid) {
|
|
183
|
+
// eslint-disable-line functional/no-conditional-statements
|
|
184
|
+
// $a/$l => $y (bit overkill to add $z and remove $a/$l instead of just renaming)
|
|
185
|
+
field.subfields.push({
|
|
186
|
+
code: 'y',
|
|
187
|
+
value: subfield.value
|
|
188
|
+
}); // eslint-disable-line functional/immutable-data
|
|
189
|
+
record.removeSubfield(subfield, field);
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
function fixField020Subfield(field, subfield) {
|
|
193
|
+
split020A(); // subfield and field are in the scope
|
|
194
|
+
addHyphens(subfield);
|
|
195
|
+
handleInvalidIsbn(field, subfield); // remove 020$a, add 020$z, Do this last, as it uses deletion
|
|
196
|
+
return;
|
|
197
|
+
function addHyphens(subfield) {
|
|
198
|
+
if (!subfieldsIsbnRequiresHyphenation(subfield)) {
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
// ISBN is valid but is missing hyphens
|
|
202
|
+
const normalizedValue = normalizeIsbnValue(subfield.value);
|
|
203
|
+
if (normalizedValue !== undefined) {
|
|
204
|
+
// eslint-disable-line functional/no-conditional-statements
|
|
205
|
+
subfield.value = normalizedValue; // eslint-disable-line functional/immutable-data
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function handleInvalidIsbn(field, subfield) {
|
|
210
|
+
if (subfield.code !== 'a' || !handleInvalid) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
const head = getFirstWord(subfield.value);
|
|
214
|
+
if (!invalidISBN(head)) {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
// $a => $z (bit overkill to add $z and remove $a instead of just renaming, but too lazy to fix/test thorougly)
|
|
218
|
+
field.subfields.push({
|
|
219
|
+
code: 'z',
|
|
220
|
+
value: subfield.value
|
|
221
|
+
}); // eslint-disable-line functional/immutable-data
|
|
222
|
+
record.removeSubfield(subfield, field);
|
|
223
|
+
}
|
|
224
|
+
function split020A() {
|
|
225
|
+
// Move non-initial words from $a to $q:
|
|
226
|
+
if (subfield.code !== 'a') {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
const value = trimSpaces(subfield.value);
|
|
230
|
+
const position = value.indexOf(' ');
|
|
231
|
+
if (position === -1) {
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
const head = getFirstWord(value);
|
|
235
|
+
if (invalidISBN(head)) {
|
|
236
|
+
// Don't split, if first word ain't ISBN
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
const tail = value.substring(position + 1);
|
|
240
|
+
subfield.value = head; // eslint-disable-line functional/immutable-data
|
|
241
|
+
field.subfields.push({
|
|
242
|
+
code: 'q',
|
|
243
|
+
value: tail
|
|
244
|
+
}); // eslint-disable-line functional/immutable-data
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
function normalizeIsbnValue(value) {
|
|
248
|
+
const trimmedValue = getFirstWord(value);
|
|
249
|
+
//const trimmedValue = trimISBN(value); // NB! This might lose information that should be stored in $q...
|
|
250
|
+
const auditResult = _isbn.default.audit(trimmedValue);
|
|
251
|
+
if (!auditResult.validIsbn) {
|
|
252
|
+
return undefined;
|
|
253
|
+
}
|
|
254
|
+
const numbersOnly = trimmedValue.replace(/[^0-9Xx]+/ug, '');
|
|
255
|
+
const parsedIsbn = _isbn.default.parse(trimmedValue);
|
|
256
|
+
if (hyphenateISBN) {
|
|
257
|
+
// eslint-disable-line functional/no-conditional-statements
|
|
258
|
+
return numbersOnly.length === 10 ? parsedIsbn.isbn10h : parsedIsbn.isbn13h; // eslint-disable-line functional/immutable-data
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return numbersOnly.length === 10 ? parsedIsbn.isbn10 : parsedIsbn.isbn13; // eslint-disable-line functional/immutable-data
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
exports.default = _default;
|
|
28
267
|
//# sourceMappingURL=isbn-issn.js.map
|
package/dist/isbn-issn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/isbn-issn.js"],"names":["record","fields","getInvalidFields","length","valid","map","field","tag","value","subfields","find","sf","code","name","getISSN","reduce","acc","obj","messages","push","validate","forEach","subfield","removeSubfield","fix","description","get","filter"],"mappings":"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","file":"isbn-issn.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 require-await */\n'use strict';\nimport {validate as validateISBN} from 'beautify-isbn';\nimport validateISSN from 'issn-verify';\n\nexport default async function () {\n\treturn {\n\t\tdescription: 'Validates ISBN and ISSN values',\n\t\tvalidate,\n\t\tfix\n\t};\n\n\tfunction getInvalidFields(record) {\n\t\treturn record.get(/^(020|022)$/).filter(field => {\n\t\t\tif (field.tag === '020') {\n\t\t\t\tconst subfield = field.subfields.find(sf => sf.code === 'a');\n\t\t\t\tif (subfield) {\n\t\t\t\t\treturn !validateISBN(subfield.value);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst subfield = field.subfields\n\t\t\t\t\t.find(sf => sf.code === 'a' || sf.code === 'l');\n\n\t\t\t\tif (subfield) {\n\t\t\t\t\treturn !validateISSN(subfield.value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t});\n\t}\n\n\tasync function validate(record) {\n\t\tconst fields = getInvalidFields(record);\n\n\t\tif (fields.length === 0) {\n\t\t\treturn {valid: true};\n\t\t}\n\n\t\treturn fields\n\t\t\t.map(field => {\n\t\t\t\tif (field.tag === '020') {\n\t\t\t\t\tconst {value} = field.subfields.find(sf => sf.code === 'a');\n\t\t\t\t\treturn {name: 'ISBN', value};\n\t\t\t\t}\n\n\t\t\t\treturn {name: 'ISSN', value: getISSN()};\n\n\t\t\t\tfunction getISSN() {\n\t\t\t\t\treturn field.subfields.find(sf => {\n\t\t\t\t\t\treturn sf.code === 'a' || sf.code === 'l';\n\t\t\t\t\t}).value;\n\t\t\t\t}\n\t\t\t})\n\t\t\t.reduce((acc, obj) => {\n\t\t\t\tconst {name, value} = obj;\n\t\t\t\tacc.messages.push(`${name} ${value} is not valid`);\n\t\t\t\treturn acc;\n\t\t\t}, {valid: false, messages: []});\n\t}\n\n\tasync function fix(record) {\n\t\tgetInvalidFields(record).forEach(field => {\n\t\t\tif (field.tag === '020') {\n\t\t\t\tconst subfield = field.subfields.find(sf => sf.code === 'a');\n\n\t\t\t\tfield.subfields.push({code: 'z', value: subfield.value});\n\t\t\t\trecord.removeSubfield(subfield, field);\n\t\t\t} else {\n\t\t\t\tconst subfield = field.subfields\n\t\t\t\t\t.find(sf => sf.code === 'a' || sf.code === 'l');\n\n\t\t\t\tfield.subfields.push({code: 'y', value: subfield.value});\n\t\t\t\trecord.removeSubfield(subfield, field);\n\t\t\t}\n\t\t});\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"isbn-issn.js","names":["_isbn","_interopRequireDefault","require","_issnVerify","obj","__esModule","default","_default","hyphenateISBN","handleInvalid","validate","fix","description","stringHasSpace","str","indexOf","trimSpaces","value","replace","isMultiWord","inputString","trimmedString","getFirstWord","arr","split","invalidISBN","isbn","isbnOnly","auditedIsbn","ISBN","audit","validIsbn","invalidSubfield","subfield","code","invalidField020","field","subfields","some","sf","subfieldsIsbnRequiresHyphenation","includes","requiresHyphenation","isbn2","parsedIsbn","parse","isbn10h","isbn13h","getRelevantFields","record","fields","filter","tag","fieldsIsbnRequiresHyphenation","invalidField022","find","validateISSN","subfieldAorL","undefined","subfieldY","length","valid","map","subfieldA","name","subfieldZ","getISSN","reduce","acc","msg","messages","concat","forEach","fixField020Subfield","push","removeSubfield","split020A","addHyphens","handleInvalidIsbn","normalizedValue","normalizeIsbnValue","head","position","tail","substring","trimmedValue","auditResult","numbersOnly","isbn10","isbn13","exports"],"sources":["../src/isbn-issn.js"],"sourcesContent":["import ISBN from 'isbn3';\nimport validateISSN from '@natlibfi/issn-verify';\n\n// handleInvalid: move invalid 020$a to 020$z, and invalid 022$a to 022$y\nexport default ({hyphenateISBN = false, handleInvalid = false} = {}) => {\n return {\n validate, fix,\n description: 'Validates ISBN and ISSN values'\n };\n\n function stringHasSpace(str) {\n return str.indexOf(' ') > -1;\n }\n\n function trimSpaces(value) {\n return value.replace(/^\\s+/u, '').replace(/\\s+$/u, '').replace(/\\s+/gu, ' ');\n }\n\n function isMultiWord(inputString) {\n const trimmedString = trimSpaces(inputString);\n return stringHasSpace(trimmedString);\n }\n\n function getFirstWord(inputString) {\n const trimmedString = trimSpaces(inputString);\n const arr = trimmedString.split(' ');\n return arr[0];\n }\n\n function invalidISBN(isbn) {\n const isbnOnly = getFirstWord(isbn);\n const auditedIsbn = ISBN.audit(isbnOnly);\n return !auditedIsbn.validIsbn;\n }\n\n function invalidSubfield(subfield) {\n if (subfield.code !== 'a') {\n return false;\n }\n return invalidISBN(subfield.value) || isMultiWord(subfield.value);\n }\n\n\n function invalidField020(field) {\n if (field.subfields && field.subfields.some(sf => invalidSubfield(sf))) {\n return true;\n }\n return false;\n }\n\n function subfieldsIsbnRequiresHyphenation(subfield) {\n if (!hyphenateISBN || !['a', 'z'].includes(subfield.code)) {\n return false;\n }\n\n const isbn = getFirstWord(subfield.value);\n if (subfield.code === 'a') {\n return requiresHyphenation(isbn);\n }\n\n // $z is a bit hacky: hyphenation is required only iff valid and no '-' chars\n if (isbn.indexOf('-') > -1) {\n return false;\n }\n return !invalidISBN(isbn);\n\n function requiresHyphenation(isbn) {\n if (!hyphenateISBN) {\n return false;\n }\n // Handle old notation such as \"978-952-396-001-5 (nid.)\"\n const isbn2 = getFirstWord(isbn);\n\n if (invalidISBN(isbn2)) {\n return false;\n }\n\n const parsedIsbn = ISBN.parse(isbn2);\n // Return true only if existing ISBN is a valid and hyphenated 10 or 13 digit ISBN:\n return !(isbn2 === parsedIsbn.isbn10h || isbn2 === parsedIsbn.isbn13h);\n }\n }\n\n function getRelevantFields(record) {\n //return record.get(/^(?:020|022)$/u).filter(field => {\n return record.fields.filter(field => {\n if (!field.subfields) {\n return false;\n }\n // Check ISBN:\n if (field.tag === '020') {\n if (invalidField020(field)) { // checks multiwordness\n return true;\n }\n return fieldsIsbnRequiresHyphenation(field);\n }\n\n // Check ISSN:\n if (field.tag === '022') {\n if (invalidField022(field)) {\n return true;\n }\n\n const subfield = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');\n\n return !validateISSN(subfield.value);\n }\n return false;\n });\n\n function fieldsIsbnRequiresHyphenation(field) {\n return field.subfields && field.subfields.some(sf => subfieldsIsbnRequiresHyphenation(sf));\n }\n\n function invalidField022(field) {\n const subfieldAorL = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');\n\n if (subfieldAorL === undefined) {\n const subfieldY = field.subfields.find(sf => sf.code === 'y');\n if (subfieldY) {\n return false;\n }\n\n return true;\n }\n return false;\n }\n }\n\n function validate(record) {\n const fields = getRelevantFields(record);\n\n if (fields.length === 0) {\n return {valid: true};\n }\n\n return fields\n .map(field => {\n if (field.tag === '020') {\n const subfieldA = field.subfields.find(sf => sf.code === 'a');\n if (subfieldA) {\n return {name: 'ISBN', value: subfieldA.value};\n }\n const subfieldZ = field.subfields.find(sf => sf.code === 'z');\n if (subfieldZ) {\n return {name: 'ISBN (subfield Z)', value: subfieldZ.value};\n }\n\n return {name: 'ISBN', value: undefined};\n }\n\n return {name: 'ISSN', value: getISSN()};\n\n function getISSN() {\n const subfieldAorL = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');\n\n if (subfieldAorL) {\n return subfieldAorL.value;\n }\n\n return undefined;\n }\n })\n .reduce((acc, obj) => {\n const {name, value} = obj;\n const msg = `${name} (${value}) is not valid`;\n\n return {...acc, messages: acc.messages.concat(msg)};\n }, {valid: false, messages: []});\n }\n\n\n function fix(record) {\n getRelevantFields(record).forEach(field => {\n if (field.tag === '020') {\n field.subfields.forEach(subfield => fixField020Subfield(field, subfield));\n return;\n }\n // 022 ISSN:\n const subfield = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');\n if (subfield && handleInvalid) { // eslint-disable-line functional/no-conditional-statements\n // $a/$l => $y (bit overkill to add $z and remove $a/$l instead of just renaming)\n field.subfields.push({code: 'y', value: subfield.value}); // eslint-disable-line functional/immutable-data\n record.removeSubfield(subfield, field);\n }\n });\n\n\n function fixField020Subfield(field, subfield) {\n split020A(); // subfield and field are in the scope\n addHyphens(subfield);\n handleInvalidIsbn(field, subfield); // remove 020$a, add 020$z, Do this last, as it uses deletion\n return;\n\n function addHyphens(subfield) {\n if (!subfieldsIsbnRequiresHyphenation(subfield)) {\n return;\n }\n // ISBN is valid but is missing hyphens\n const normalizedValue = normalizeIsbnValue(subfield.value);\n if (normalizedValue !== undefined) { // eslint-disable-line functional/no-conditional-statements\n subfield.value = normalizedValue; // eslint-disable-line functional/immutable-data\n }\n }\n\n function handleInvalidIsbn(field, subfield) {\n if (subfield.code !== 'a' || !handleInvalid) {\n return;\n }\n const head = getFirstWord(subfield.value);\n if (!invalidISBN(head)) {\n return;\n }\n // $a => $z (bit overkill to add $z and remove $a instead of just renaming, but too lazy to fix/test thorougly)\n field.subfields.push({code: 'z', value: subfield.value}); // eslint-disable-line functional/immutable-data\n record.removeSubfield(subfield, field);\n }\n\n function split020A() {\n // Move non-initial words from $a to $q:\n if (subfield.code !== 'a') {\n return;\n }\n const value = trimSpaces(subfield.value);\n const position = value.indexOf(' ');\n if (position === -1) {\n return;\n }\n const head = getFirstWord(value);\n if (invalidISBN(head)) { // Don't split, if first word ain't ISBN\n return;\n }\n const tail = value.substring(position + 1);\n subfield.value = head; // eslint-disable-line functional/immutable-data\n field.subfields.push({code: 'q', value: tail}); // eslint-disable-line functional/immutable-data\n }\n\n function normalizeIsbnValue(value) {\n const trimmedValue = getFirstWord(value);\n //const trimmedValue = trimISBN(value); // NB! This might lose information that should be stored in $q...\n const auditResult = ISBN.audit(trimmedValue);\n if (!auditResult.validIsbn) {\n return undefined;\n }\n const numbersOnly = trimmedValue.replace(/[^0-9Xx]+/ug, '');\n const parsedIsbn = ISBN.parse(trimmedValue);\n if (hyphenateISBN) { // eslint-disable-line functional/no-conditional-statements\n return numbersOnly.length === 10 ? parsedIsbn.isbn10h : parsedIsbn.isbn13h; // eslint-disable-line functional/immutable-data\n }\n return numbersOnly.length === 10 ? parsedIsbn.isbn10 : parsedIsbn.isbn13; // eslint-disable-line functional/immutable-data\n }\n }\n }\n};\n"],"mappings":"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"}
|