@natlibfi/marc-record-validators-melinda 11.6.6 → 11.6.7-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/melinda-node-tests.yml +1 -1
- package/dist/access-rights.js +1 -5
- package/dist/access-rights.js.map +1 -1
- package/dist/addMissingField336.js +1 -1
- package/dist/addMissingField336.js.map +1 -1
- package/dist/cyrillux-usemarcon-replacement.js +41 -45
- package/dist/cyrillux-usemarcon-replacement.js.map +1 -1
- package/dist/cyrillux.js +13 -17
- package/dist/cyrillux.js.map +1 -1
- package/dist/disambiguateSeriesStatements.js +3 -4
- package/dist/disambiguateSeriesStatements.js.map +1 -1
- package/dist/double-commas.js +2 -1
- package/dist/double-commas.js.map +1 -1
- package/dist/duplicates-ind1.js +1 -1
- package/dist/duplicates-ind1.js.map +1 -1
- package/dist/empty-fields.js +0 -4
- package/dist/empty-fields.js.map +1 -1
- package/dist/ending-punctuation.js +21 -49
- package/dist/ending-punctuation.js.map +1 -1
- package/dist/ending-whitespace.js +0 -4
- package/dist/ending-whitespace.js.map +1 -1
- package/dist/field-008-18-34-character-groups.js +4 -5
- package/dist/field-008-18-34-character-groups.js.map +1 -1
- package/dist/field-505-separators.js +8 -6
- package/dist/field-505-separators.js.map +1 -1
- package/dist/field-521-fix.js +5 -6
- package/dist/field-521-fix.js.map +1 -1
- package/dist/field-exclusion.js +5 -12
- package/dist/field-exclusion.js.map +1 -1
- package/dist/field-exclusion.spec.js +3 -5
- package/dist/field-exclusion.spec.js.map +1 -1
- package/dist/field-structure.js +2 -5
- package/dist/field-structure.js.map +1 -1
- package/dist/fields-present.js +1 -1
- package/dist/fields-present.js.map +1 -1
- package/dist/fields-present.spec.js +1 -1
- package/dist/fields-present.spec.js.map +1 -1
- package/dist/fix-33X.js +5 -6
- package/dist/fix-33X.js.map +1 -1
- package/dist/fix-country-codes.js +3 -4
- package/dist/fix-country-codes.js.map +1 -1
- package/dist/fix-language-codes.js +12 -9
- package/dist/fix-language-codes.js.map +1 -1
- package/dist/fixRelatorTerms.js +8 -8
- package/dist/fixRelatorTerms.js.map +1 -1
- package/dist/fixed-fields.js +1 -4
- package/dist/fixed-fields.js.map +1 -1
- package/dist/identical-fields.js +2 -3
- package/dist/identical-fields.js.map +1 -1
- package/dist/indicator-fixes.js +14 -15
- package/dist/indicator-fixes.js.map +1 -1
- package/dist/isbn-issn.js +8 -11
- package/dist/isbn-issn.js.map +1 -1
- package/dist/item-language.js +5 -12
- package/dist/item-language.js.map +1 -1
- package/dist/merge-fields/counterpartField.js +6 -8
- package/dist/merge-fields/counterpartField.js.map +1 -1
- package/dist/merge-fields/index.js +3 -3
- package/dist/merge-fields/index.js.map +1 -1
- package/dist/merge-fields/mergeConstraints.js +0 -1
- package/dist/merge-fields/mergeConstraints.js.map +1 -1
- package/dist/merge-fields/mergeField.js +12 -18
- package/dist/merge-fields/mergeField.js.map +1 -1
- package/dist/merge-fields/mergeIndicator.js +5 -5
- package/dist/merge-fields/mergeIndicator.js.map +1 -1
- package/dist/merge-fields/mergeOrAddPostprocess.js +6 -9
- package/dist/merge-fields/mergeOrAddPostprocess.js.map +1 -1
- package/dist/merge-fields/mergeOrAddSubfield.js +6 -8
- package/dist/merge-fields/mergeOrAddSubfield.js.map +1 -1
- package/dist/merge-fields/mergeSubfield.js +8 -8
- package/dist/merge-fields/mergeSubfield.js.map +1 -1
- package/dist/merge-fields/removeDuplicateSubfields.js +1 -2
- package/dist/merge-fields/removeDuplicateSubfields.js.map +1 -1
- package/dist/merge-fields/worldKnowledge.js +1 -1
- package/dist/merge-fields/worldKnowledge.js.map +1 -1
- package/dist/mergeField500Lisapainokset.js +0 -3
- package/dist/mergeField500Lisapainokset.js.map +1 -1
- package/dist/mergeRelatorTermFields.js +3 -3
- package/dist/mergeRelatorTermFields.js.map +1 -1
- package/dist/modernize-502.js +6 -6
- package/dist/modernize-502.js.map +1 -1
- package/dist/multiple-subfield-0.js +4 -4
- package/dist/multiple-subfield-0.js.map +1 -1
- package/dist/non-breaking-space.js +0 -4
- package/dist/non-breaking-space.js.map +1 -1
- package/dist/normalize-dashes.js +5 -4
- package/dist/normalize-dashes.js.map +1 -1
- package/dist/normalize-identifiers.js +6 -6
- package/dist/normalize-identifiers.js.map +1 -1
- package/dist/normalize-qualifying-information.js +4 -4
- package/dist/normalize-qualifying-information.js.map +1 -1
- package/dist/normalize-utf8-diacritics.js +7 -7
- package/dist/normalize-utf8-diacritics.js.map +1 -1
- package/dist/normalizeFieldForComparison.js +21 -20
- package/dist/normalizeFieldForComparison.js.map +1 -1
- package/dist/normalizeSubfieldValueForComparison.js +1 -2
- package/dist/normalizeSubfieldValueForComparison.js.map +1 -1
- package/dist/prepublicationUtils.js +3 -3
- package/dist/prepublicationUtils.js.map +1 -1
- package/dist/punctuation/index.js +14 -31
- package/dist/punctuation/index.js.map +1 -1
- package/dist/punctuation2.js +9 -10
- package/dist/punctuation2.js.map +1 -1
- package/dist/reindexSubfield6OccurenceNumbers.js +8 -9
- package/dist/reindexSubfield6OccurenceNumbers.js.map +1 -1
- package/dist/removeDuplicateDataFields.js +18 -20
- package/dist/removeDuplicateDataFields.js.map +1 -1
- package/dist/removeInferiorDataFields.js +16 -19
- package/dist/removeInferiorDataFields.js.map +1 -1
- package/dist/resolvable-ext-references-melinda.js +4 -8
- package/dist/resolvable-ext-references-melinda.js.map +1 -1
- package/dist/resolveOrphanedSubfield6s.js +9 -9
- package/dist/resolveOrphanedSubfield6s.js.map +1 -1
- package/dist/sanitize-vocabulary-source-codes.js +9 -9
- package/dist/sanitize-vocabulary-source-codes.js.map +1 -1
- package/dist/sort-tags.js +2 -2
- package/dist/sort-tags.js.map +1 -1
- package/dist/sortFields.js +4 -9
- package/dist/sortFields.js.map +1 -1
- package/dist/sortRelatorTerms.js +4 -5
- package/dist/sortRelatorTerms.js.map +1 -1
- package/dist/sortSubfields.js +5 -6
- package/dist/sortSubfields.js.map +1 -1
- package/dist/stripPunctuation.js +2 -2
- package/dist/stripPunctuation.js.map +1 -1
- package/dist/subfield-exclusion.js +4 -11
- package/dist/subfield-exclusion.js.map +1 -1
- package/dist/subfield6Utils.js +12 -11
- package/dist/subfield6Utils.js.map +1 -1
- package/dist/subfield8Utils.js +8 -9
- package/dist/subfield8Utils.js.map +1 -1
- package/dist/subfieldValueNormalizations.js +5 -8
- package/dist/subfieldValueNormalizations.js.map +1 -1
- package/dist/sync-007-and-300.js +8 -8
- package/dist/sync-007-and-300.js.map +1 -1
- package/dist/translate-terms.js +5 -6
- package/dist/translate-terms.js.map +1 -1
- package/dist/typeOfDate-008.js +3 -4
- package/dist/typeOfDate-008.js.map +1 -1
- package/dist/unicode-decomposition.js +1 -1
- package/dist/unicode-decomposition.js.map +1 -1
- package/dist/update-field-540.js +5 -6
- package/dist/update-field-540.js.map +1 -1
- package/dist/urn.js +4 -9
- package/dist/urn.js.map +1 -1
- package/dist/utils.js +5 -9
- package/dist/utils.js.map +1 -1
- package/eslint.config.mjs +53 -0
- package/package.json +12 -13
- package/src/access-rights.js +4 -4
- package/src/addMissingField336.js +1 -1
- package/src/cyrillux-usemarcon-replacement.js +38 -38
- package/src/cyrillux.js +14 -14
- package/src/disambiguateSeriesStatements.js +3 -3
- package/src/double-commas.js +2 -2
- package/src/duplicates-ind1.js +1 -1
- package/src/empty-fields.js +4 -4
- package/src/ending-punctuation.js +46 -49
- package/src/ending-whitespace.js +0 -2
- package/src/field-008-18-34-character-groups.js +5 -5
- package/src/field-505-separators.js +6 -6
- package/src/field-521-fix.js +6 -6
- package/src/field-exclusion.js +12 -12
- package/src/field-exclusion.spec.js +4 -4
- package/src/field-structure.js +5 -5
- package/src/fields-present.js +1 -1
- package/src/fields-present.spec.js +1 -1
- package/src/fix-33X.js +5 -5
- package/src/fix-country-codes.js +3 -3
- package/src/fix-language-codes.js +10 -9
- package/src/fixRelatorTerms.js +8 -8
- package/src/fixed-fields.js +3 -3
- package/src/identical-fields.js +3 -3
- package/src/indicator-fixes.js +15 -15
- package/src/isbn-issn.js +11 -11
- package/src/item-language.js +10 -10
- package/src/merge-fields/counterpartField.js +7 -7
- package/src/merge-fields/index.js +3 -3
- package/src/merge-fields/mergeConstraints.js +1 -1
- package/src/merge-fields/mergeField.js +16 -17
- package/src/merge-fields/mergeIndicator.js +5 -5
- package/src/merge-fields/mergeOrAddPostprocess.js +9 -9
- package/src/merge-fields/mergeOrAddSubfield.js +6 -6
- package/src/merge-fields/mergeSubfield.js +8 -8
- package/src/merge-fields/removeDuplicateSubfields.js +1 -2
- package/src/merge-fields/worldKnowledge.js +1 -1
- package/src/mergeField500Lisapainokset.js +0 -2
- package/src/mergeRelatorTermFields.js +3 -3
- package/src/modernize-502.js +6 -6
- package/src/multiple-subfield-0.js +4 -4
- package/src/non-breaking-space.js +0 -2
- package/src/normalize-dashes.js +4 -4
- package/src/normalize-identifiers.js +6 -6
- package/src/normalize-qualifying-information.js +4 -4
- package/src/normalize-utf8-diacritics.js +7 -7
- package/src/normalizeFieldForComparison.js +20 -20
- package/src/normalizeSubfieldValueForComparison.js +1 -1
- package/src/prepublicationUtils.js +3 -3
- package/src/punctuation/index.js +29 -29
- package/src/punctuation2.js +10 -10
- package/src/reindexSubfield6OccurenceNumbers.js +9 -9
- package/src/removeDuplicateDataFields.js +21 -23
- package/src/removeInferiorDataFields.js +19 -19
- package/src/resolvable-ext-references-melinda.js +8 -8
- package/src/resolveOrphanedSubfield6s.js +9 -9
- package/src/sanitize-vocabulary-source-codes.js +8 -8
- package/src/sort-tags.js +2 -2
- package/src/sortFields.js +6 -6
- package/src/sortRelatorTerms.js +5 -5
- package/src/sortSubfields.js +6 -6
- package/src/stripPunctuation.js +2 -2
- package/src/subfield-exclusion.js +11 -11
- package/src/subfield6Utils.js +11 -11
- package/src/subfield8Utils.js +6 -9
- package/src/subfieldValueNormalizations.js +5 -7
- package/src/sync-007-and-300.js +8 -8
- package/src/translate-terms.js +3 -5
- package/src/typeOfDate-008.js +3 -3
- package/src/unicode-decomposition.js +1 -1
- package/src/update-field-540.js +6 -6
- package/src/urn.js +8 -6
- package/src/utils.js +8 -8
- package/.eslintignore +0 -1
package/src/field-structure.js
CHANGED
|
@@ -104,8 +104,8 @@ export default function (config) {
|
|
|
104
104
|
configMatchesSpec(val, key, confSpec);
|
|
105
105
|
|
|
106
106
|
// Concat all excluded elements to array
|
|
107
|
-
if (confSpec[key].excl) {
|
|
108
|
-
excluded.push(...confSpec[key].excl);
|
|
107
|
+
if (confSpec[key].excl) {
|
|
108
|
+
excluded.push(...confSpec[key].excl);
|
|
109
109
|
}
|
|
110
110
|
});
|
|
111
111
|
|
|
@@ -132,9 +132,9 @@ export default function (config) {
|
|
|
132
132
|
}
|
|
133
133
|
|
|
134
134
|
// Check subfields/dependencies recursively
|
|
135
|
-
if (key === 'subfields' || key === 'dependencies') {
|
|
135
|
+
if (key === 'subfields' || key === 'dependencies') {
|
|
136
136
|
forEach(data, ([, subObj]) => {
|
|
137
|
-
if (typeof subObj === 'object') {
|
|
137
|
+
if (typeof subObj === 'object') {
|
|
138
138
|
forEach(subObj, ([subKey, subVal]) => {
|
|
139
139
|
configMatchesSpec(subVal, subKey, key === 'subfields' ? subSpec : depSpec);
|
|
140
140
|
});
|
|
@@ -198,7 +198,7 @@ export default function (config) {
|
|
|
198
198
|
// Check that subfield stuff
|
|
199
199
|
if (confField === 'subfields') {
|
|
200
200
|
const strict = confObj.strict || false; // Defaults to false
|
|
201
|
-
let elementsTotal = 0;
|
|
201
|
+
let elementsTotal = 0;
|
|
202
202
|
const valid = !Object.entries(confObj.subfields).some(([key, val]) => {
|
|
203
203
|
const matching = recordSubObj.subfields.filter(({code}) => code === key);
|
|
204
204
|
elementsTotal += matching.length; // Calculate amount of record objects matching all confObj objects
|
package/src/fields-present.js
CHANGED
|
@@ -15,7 +15,7 @@ export default function (tagPatterns) {
|
|
|
15
15
|
return result ? undefined : pattern;
|
|
16
16
|
});
|
|
17
17
|
const isEmpty = missingFields.every(index => index === undefined);
|
|
18
|
-
let errorMessage = ['The following tag patterns are not present in the record tag field: '];
|
|
18
|
+
let errorMessage = ['The following tag patterns are not present in the record tag field: '];
|
|
19
19
|
errorMessage = errorMessage.concat(missingFields).join(' ');
|
|
20
20
|
|
|
21
21
|
return isEmpty ? {valid: true, messages: []} : {valid: false, messages: [errorMessage]};
|
|
@@ -51,7 +51,7 @@ describe('fields-present', () => {
|
|
|
51
51
|
expect(result).to.eql({valid: true, messages: []});
|
|
52
52
|
});
|
|
53
53
|
it('Finds the record valid', async () => {
|
|
54
|
-
const tagPatterns = [/^(020|022|024)$/u];
|
|
54
|
+
const tagPatterns = [/^(020|022|024)$/u];
|
|
55
55
|
const validator = await validatorFactory(tagPatterns);
|
|
56
56
|
const record = new MarcRecord({
|
|
57
57
|
fields: [
|
package/src/fix-33X.js
CHANGED
|
@@ -376,7 +376,7 @@ export default function () {
|
|
|
376
376
|
nvdebug(`FIX ${description}...`);
|
|
377
377
|
const catLang = getCatalogingLanguage(record) || 'fin';
|
|
378
378
|
const fields = getRelevantFields(record);
|
|
379
|
-
fields.forEach(f => fixField(f, catLang));
|
|
379
|
+
fields.forEach(f => fixField(f, catLang)); // eslint-disable-line array-callback-return
|
|
380
380
|
nvdebug(` GOT ${fields.length}...`);
|
|
381
381
|
// FFS: we actually need newFields array here! Videogame, for example, might be
|
|
382
382
|
// 336 ## ‡a kaksiulotteinen liikkuva kuva ‡b tdi ‡2 rdacontent
|
|
@@ -395,7 +395,7 @@ export default function () {
|
|
|
395
395
|
}
|
|
396
396
|
const originalStrings = fields.map(f => fieldToString(f));
|
|
397
397
|
const clonedFields = fields.map(f => clone(f));
|
|
398
|
-
clonedFields.forEach(f => fixField(f, catLang));
|
|
398
|
+
clonedFields.forEach(f => fixField(f, catLang)); // eslint-disable-line array-callback-return
|
|
399
399
|
const modifiedStrings = clonedFields.map(f => fieldToString(f));
|
|
400
400
|
|
|
401
401
|
const changes = originalStrings.map((str, i) => `'${str}' => '${modifiedStrings[i]}'`);
|
|
@@ -467,9 +467,9 @@ export default function () {
|
|
|
467
467
|
return;
|
|
468
468
|
}
|
|
469
469
|
|
|
470
|
-
subfieldA.value = newTerm;
|
|
471
|
-
field.subfields.push({'code': 'b', 'value': code});
|
|
472
|
-
field.subfields.push(tagToSubfield2(field.tag));
|
|
470
|
+
subfieldA.value = newTerm;
|
|
471
|
+
field.subfields.push({'code': 'b', 'value': code});
|
|
472
|
+
field.subfields.push(tagToSubfield2(field.tag));
|
|
473
473
|
|
|
474
474
|
function codeToTerm(code) {
|
|
475
475
|
if (field.tag === '336') {
|
package/src/fix-country-codes.js
CHANGED
|
@@ -44,9 +44,9 @@ export default function () {
|
|
|
44
44
|
return res;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
res.message.push(`Modify 008/15-17: '${originalCountryCode}' => '${modifiedCountryCode}'`);
|
|
47
|
+
res.message.push(`Modify 008/15-17: '${originalCountryCode}' => '${modifiedCountryCode}'`);
|
|
48
48
|
|
|
49
|
-
res.valid = false;
|
|
49
|
+
res.valid = false;
|
|
50
50
|
return res;
|
|
51
51
|
}
|
|
52
52
|
|
|
@@ -54,7 +54,7 @@ export default function () {
|
|
|
54
54
|
const originalCountryCode = getCountryCodeFromField008(field008);
|
|
55
55
|
const modifiedCountryCode = deprecatedCountryCodeToCurrentCountryCode(originalCountryCode);
|
|
56
56
|
if (originalCountryCode !== modifiedCountryCode && modifiedCountryCode.length === 3) {
|
|
57
|
-
field008.value = `${field008.value.substring(0, 15)}${modifiedCountryCode}${field008.value.substring(18)}`;
|
|
57
|
+
field008.value = `${field008.value.substring(0, 15)}${modifiedCountryCode}${field008.value.substring(18)}`;
|
|
58
58
|
return;
|
|
59
59
|
}
|
|
60
60
|
}
|
|
@@ -25,7 +25,7 @@ export default function () {
|
|
|
25
25
|
fixLanguageField008(field008);
|
|
26
26
|
|
|
27
27
|
const f041 = record.get('041');
|
|
28
|
-
f041.forEach(f => fixField041(f));
|
|
28
|
+
f041.forEach(f => fixField041(f)); // eslint-disable-line array-callback-return
|
|
29
29
|
|
|
30
30
|
return res;
|
|
31
31
|
}
|
|
@@ -37,9 +37,10 @@ export default function () {
|
|
|
37
37
|
validateField008(record, res);
|
|
38
38
|
|
|
39
39
|
const f041 = record.get('041');
|
|
40
|
-
f041.forEach(f => validateField041(f, res));
|
|
41
40
|
|
|
42
|
-
|
|
41
|
+
f041.forEach(f => validateField041(f, res)); // eslint-disable-line array-callback-return
|
|
42
|
+
|
|
43
|
+
res.valid = !(res.message.length >= 1);
|
|
43
44
|
return res;
|
|
44
45
|
}
|
|
45
46
|
|
|
@@ -56,8 +57,8 @@ export default function () {
|
|
|
56
57
|
return;
|
|
57
58
|
}
|
|
58
59
|
|
|
59
|
-
res.message.push(`Modify 008/35-37: '${originalLanguage}' => '${modifiedLanguage}'`);
|
|
60
|
-
res.valid = false;
|
|
60
|
+
res.message.push(`Modify 008/35-37: '${originalLanguage}' => '${modifiedLanguage}'`);
|
|
61
|
+
res.valid = false;
|
|
61
62
|
}
|
|
62
63
|
|
|
63
64
|
|
|
@@ -78,7 +79,7 @@ export default function () {
|
|
|
78
79
|
return;
|
|
79
80
|
}
|
|
80
81
|
const msg = `${originalString} => ${modifiedString}`;
|
|
81
|
-
res.message.push(msg);
|
|
82
|
+
res.message.push(msg);
|
|
82
83
|
|
|
83
84
|
}
|
|
84
85
|
|
|
@@ -87,7 +88,7 @@ export default function () {
|
|
|
87
88
|
const originalLanguage = getLanguageFromField008(field008);
|
|
88
89
|
const modifiedLanguage = deprecatedLanguageToCurrentLanguage(originalLanguage);
|
|
89
90
|
if (originalLanguage !== modifiedLanguage && modifiedLanguage.length === 3) {
|
|
90
|
-
field008.value = `${field008.value.substring(0, 35)}${modifiedLanguage}${field008.value.substring(38)}`;
|
|
91
|
+
field008.value = `${field008.value.substring(0, 35)}${modifiedLanguage}${field008.value.substring(38)}`;
|
|
91
92
|
return;
|
|
92
93
|
}
|
|
93
94
|
}
|
|
@@ -97,13 +98,13 @@ export default function () {
|
|
|
97
98
|
return;
|
|
98
99
|
}
|
|
99
100
|
|
|
100
|
-
field.subfields.forEach(sf => fixField041Subfield(sf));
|
|
101
|
+
field.subfields.forEach(sf => fixField041Subfield(sf)); // eslint-disable-line array-callback-return
|
|
101
102
|
|
|
102
103
|
function fixField041Subfield(subfield) {
|
|
103
104
|
if (!isRelevantField041SubfieldCode(subfield)) {
|
|
104
105
|
return;
|
|
105
106
|
}
|
|
106
|
-
subfield.value = deprecatedLanguageToCurrentLanguage(subfield.value);
|
|
107
|
+
subfield.value = deprecatedLanguageToCurrentLanguage(subfield.value);
|
|
107
108
|
}
|
|
108
109
|
}
|
|
109
110
|
|
package/src/fixRelatorTerms.js
CHANGED
|
@@ -42,12 +42,12 @@ export default function () {
|
|
|
42
42
|
fieldFixRelatorTerms(field, language, language);
|
|
43
43
|
const clonedFieldAsString = fieldToString(clonedField);
|
|
44
44
|
const fieldAsString = fieldToString(field);
|
|
45
|
-
if (fieldAsString !== clonedFieldAsString) {
|
|
46
|
-
res.message.push(`${fieldAsString} => ${clonedFieldAsString}`);
|
|
45
|
+
if (fieldAsString !== clonedFieldAsString) {
|
|
46
|
+
res.message.push(`${fieldAsString} => ${clonedFieldAsString}`);
|
|
47
47
|
}
|
|
48
48
|
});
|
|
49
49
|
|
|
50
|
-
res.valid = !(res.message.length >= 1);
|
|
50
|
+
res.valid = !(res.message.length >= 1);
|
|
51
51
|
return res;
|
|
52
52
|
}
|
|
53
53
|
}
|
|
@@ -139,7 +139,7 @@ function subfieldHandleRelatorTermAbbreviation(subfield, language) {
|
|
|
139
139
|
const hit = `${finnishAbbreviations[lcValue]}${punc}`;
|
|
140
140
|
nvdebug(`Relator hit: ${hit}`, debugDev);
|
|
141
141
|
// NB! 'esitt.' => 'esittäjä'
|
|
142
|
-
subfield.value = hit;
|
|
142
|
+
subfield.value = hit;
|
|
143
143
|
return;
|
|
144
144
|
}
|
|
145
145
|
}
|
|
@@ -157,7 +157,7 @@ function fieldHandleRelatorTermAbbreviations(field, language) {
|
|
|
157
157
|
}
|
|
158
158
|
|
|
159
159
|
const originalValue = fieldToString(field);
|
|
160
|
-
field.subfields.forEach(sf => subfieldHandleRelatorTermAbbreviation(sf, language));
|
|
160
|
+
field.subfields.forEach(sf => subfieldHandleRelatorTermAbbreviation(sf, language)); // eslint-disable-line array-callback-return
|
|
161
161
|
const modifiedValue = fieldToString(field);
|
|
162
162
|
if (modifiedValue === originalValue) {
|
|
163
163
|
return;
|
|
@@ -212,7 +212,7 @@ function subfieldTranslateRelatorTerm(subfield, fromLanguage, toLanguage) {
|
|
|
212
212
|
if (subfield.code !== 'e') {
|
|
213
213
|
return;
|
|
214
214
|
}
|
|
215
|
-
subfield.value = translateRelatorTerm(subfield.value, fromLanguage, toLanguage);
|
|
215
|
+
subfield.value = translateRelatorTerm(subfield.value, fromLanguage, toLanguage);
|
|
216
216
|
}
|
|
217
217
|
|
|
218
218
|
export function fieldFixRelatorTerms(field, fromLanguage, toLanguage) {
|
|
@@ -222,7 +222,7 @@ export function fieldFixRelatorTerms(field, fromLanguage, toLanguage) {
|
|
|
222
222
|
}
|
|
223
223
|
fieldHandleRelatorTermAbbreviations(field, fromLanguage);
|
|
224
224
|
|
|
225
|
-
field.subfields.forEach(sf => subfieldTranslateRelatorTerm(sf, fromLanguage, toLanguage));
|
|
225
|
+
field.subfields.forEach(sf => subfieldTranslateRelatorTerm(sf, fromLanguage, toLanguage)); // eslint-disable-line array-callback-return
|
|
226
226
|
}
|
|
227
227
|
|
|
228
228
|
|
|
@@ -230,7 +230,7 @@ export function recordFixRelatorTerms(record, defaultToLanguage = null, defaultF
|
|
|
230
230
|
const fromLanguage = defaultFromLanguage ? defaultFromLanguage : getCatalogingLanguage(record);
|
|
231
231
|
const toLanguage = defaultToLanguage ? defaultToLanguage : getCatalogingLanguage(record);
|
|
232
232
|
|
|
233
|
-
record.fields.forEach(field => translateField(field, fromLanguage, toLanguage));
|
|
233
|
+
record.fields.forEach(field => translateField(field, fromLanguage, toLanguage)); // eslint-disable-line array-callback-return
|
|
234
234
|
|
|
235
235
|
function translateField(field, from, to) {
|
|
236
236
|
fieldFixRelatorTerms(field, from, to);
|
package/src/fixed-fields.js
CHANGED
|
@@ -11,11 +11,11 @@ export default function (configuration) {
|
|
|
11
11
|
|
|
12
12
|
function validate(record) {
|
|
13
13
|
const messages = configuration.reduce((messages, item) => {
|
|
14
|
-
let results;
|
|
14
|
+
let results;
|
|
15
15
|
|
|
16
|
-
if (item.leader) {
|
|
16
|
+
if (item.leader) {
|
|
17
17
|
results = validateField(record.leader, item);
|
|
18
|
-
} else {
|
|
18
|
+
} else {
|
|
19
19
|
results = record.get(item.tag)
|
|
20
20
|
.map(f => validateField(f.value, item, f.tag));
|
|
21
21
|
}
|
package/src/identical-fields.js
CHANGED
|
@@ -23,13 +23,13 @@ export default function () {
|
|
|
23
23
|
function fix(record) {
|
|
24
24
|
record.fields
|
|
25
25
|
.filter(tag => !uniqWith(record.fields).includes(tag))
|
|
26
|
-
.forEach(tag => record.removeField(tag));
|
|
26
|
+
.forEach(tag => record.removeField(tag)); // eslint-disable-line array-callback-return
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
function uniqWith(fields) {
|
|
30
30
|
return fields.reduce((uniq, field) => {
|
|
31
|
-
if (!uniq.some(f => MarcRecord.isEqual(f, field))) {
|
|
32
|
-
uniq.push(field);
|
|
31
|
+
if (!uniq.some(f => MarcRecord.isEqual(f, field))) {
|
|
32
|
+
uniq.push(field);
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
return uniq;
|
package/src/indicator-fixes.js
CHANGED
|
@@ -25,7 +25,7 @@ export default function () {
|
|
|
25
25
|
|
|
26
26
|
validateRecord(record, res);
|
|
27
27
|
|
|
28
|
-
res.valid = res.message.length < 1;
|
|
28
|
+
res.valid = res.message.length < 1;
|
|
29
29
|
return res;
|
|
30
30
|
}
|
|
31
31
|
|
|
@@ -35,22 +35,22 @@ export default function () {
|
|
|
35
35
|
const clonedFields = JSON.parse(JSON.stringify(record.fields));
|
|
36
36
|
recordNormalizeIndicators(record);
|
|
37
37
|
|
|
38
|
-
record.fields.forEach((field, index) => compareFields(field, index));
|
|
38
|
+
record.fields.forEach((field, index) => compareFields(field, index)); // eslint-disable-line array-callback-return
|
|
39
39
|
|
|
40
40
|
function compareFields(field, index) {
|
|
41
41
|
const origFieldAsString = fieldToString(clonedFields[index]);
|
|
42
42
|
//const clonedFieldAsString = fieldToString(field);
|
|
43
|
-
if (clonedFields[index].ind1 !== field.ind1) {
|
|
43
|
+
if (clonedFields[index].ind1 !== field.ind1) {
|
|
44
44
|
//nvdebug(`FIX IND1: '${clonedFields[index].ind1}' => '${field.ind1}': ${clonedFieldAsString}`);
|
|
45
|
-
res.message.push(`Expected IND1 for '${origFieldAsString}' is '${field.ind1}'`);
|
|
45
|
+
res.message.push(`Expected IND1 for '${origFieldAsString}' is '${field.ind1}'`);
|
|
46
46
|
}
|
|
47
|
-
if (clonedFields[index].ind2 !== field.ind2) {
|
|
47
|
+
if (clonedFields[index].ind2 !== field.ind2) {
|
|
48
48
|
//nvdebug(`FIX IND2: '${clonedFields[index].ind2}' => '${field.ind2}': ${clonedFieldAsString}`);
|
|
49
|
-
res.message.push(`Expected IND2 for '${origFieldAsString}' is '${field.ind2}'`);
|
|
49
|
+
res.message.push(`Expected IND2 for '${origFieldAsString}' is '${field.ind2}'`);
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
52
|
// Validator should not change the original record:
|
|
53
|
-
record.fields = clonedFields;
|
|
53
|
+
record.fields = clonedFields;
|
|
54
54
|
return;
|
|
55
55
|
}
|
|
56
56
|
}
|
|
@@ -133,7 +133,7 @@ function normalizeNonFilingIndicator1(field, languages = []) {
|
|
|
133
133
|
return;
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
-
field.ind1 = determineNonFilingIndicatorValue(field, languages);
|
|
136
|
+
field.ind1 = determineNonFilingIndicatorValue(field, languages);
|
|
137
137
|
}
|
|
138
138
|
|
|
139
139
|
function normalizeNonFilingIndicator2(field, languages = []) {
|
|
@@ -141,7 +141,7 @@ function normalizeNonFilingIndicator2(field, languages = []) {
|
|
|
141
141
|
return;
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
-
field.ind2 = determineNonFilingIndicatorValue(field, languages);
|
|
144
|
+
field.ind2 = determineNonFilingIndicatorValue(field, languages);
|
|
145
145
|
}
|
|
146
146
|
|
|
147
147
|
const fiktiivisenAineistonLisaluokatFI = ['Eläimet', 'Erotiikka', 'Erä', 'Fantasia', 'Historia', 'Huumori', 'Jännitys', 'Kauhu', 'Novellit', 'Romantiikka', 'Scifi', 'Sota', 'Urheilu', 'Uskonto'];
|
|
@@ -158,7 +158,7 @@ function normalize084Indicator1(field) {
|
|
|
158
158
|
|
|
159
159
|
// https://marc21.kansalliskirjasto.fi/bib/05X-08X.htm#084 and https://finto.fi/ykl/fi/page/fiktioluokka
|
|
160
160
|
if (field.ind1 !== '9' && containsFiktiivisenAineistonLisaluokka(field) && field.subfields.some(sf => sf.code === '2' && sf.value === 'ykl')) {
|
|
161
|
-
field.ind1 = '9';
|
|
161
|
+
field.ind1 = '9';
|
|
162
162
|
return;
|
|
163
163
|
}
|
|
164
164
|
}
|
|
@@ -168,7 +168,7 @@ function normalize245Indicator1(field, record) {
|
|
|
168
168
|
return;
|
|
169
169
|
}
|
|
170
170
|
const field1XX = record.get('^1..$');
|
|
171
|
-
field.ind1 = field1XX.length === 0 ? '0' : '1';
|
|
171
|
+
field.ind1 = field1XX.length === 0 ? '0' : '1';
|
|
172
172
|
}
|
|
173
173
|
|
|
174
174
|
function normalize776Indicator2(field) {
|
|
@@ -177,7 +177,7 @@ function normalize776Indicator2(field) {
|
|
|
177
177
|
}
|
|
178
178
|
// If subfield $i exists, ind2 must me '8'
|
|
179
179
|
if (field.subfields.some(sf => sf.code === 'i')) {
|
|
180
|
-
field.ind2 = '8';
|
|
180
|
+
field.ind2 = '8';
|
|
181
181
|
return;
|
|
182
182
|
}
|
|
183
183
|
}
|
|
@@ -193,13 +193,13 @@ function recordNormalize490(record) {
|
|
|
193
193
|
if (fields490.length <= fields8XX.length) {
|
|
194
194
|
// Trace found for each field 490:
|
|
195
195
|
fields490.forEach(f => {
|
|
196
|
-
f.ind1 = '1';
|
|
196
|
+
f.ind1 = '1';
|
|
197
197
|
});
|
|
198
198
|
return;
|
|
199
199
|
}
|
|
200
200
|
if (fields8XX.length === 0) { // Fields 490 are always untraced (no traces found)
|
|
201
201
|
fields490.forEach(f => {
|
|
202
|
-
f.ind1 = '0';
|
|
202
|
+
f.ind1 = '0';
|
|
203
203
|
});
|
|
204
204
|
return;
|
|
205
205
|
}
|
|
@@ -235,7 +235,7 @@ export function recordNormalizeIndicators(record) {
|
|
|
235
235
|
// Language is used to handle non-filing indicators
|
|
236
236
|
const languages = getLanguages(record);
|
|
237
237
|
|
|
238
|
-
record.fields.forEach(field => fieldNormalizeIndicators(field, record, languages));
|
|
238
|
+
record.fields.forEach(field => fieldNormalizeIndicators(field, record, languages)); // eslint-disable-line array-callback-return
|
|
239
239
|
|
|
240
240
|
}
|
|
241
241
|
|
package/src/isbn-issn.js
CHANGED
|
@@ -173,14 +173,14 @@ export default ({hyphenateISBN = false, handleInvalid = false} = {}) => {
|
|
|
173
173
|
function fix(record) {
|
|
174
174
|
getRelevantFields(record).forEach(field => {
|
|
175
175
|
if (field.tag === '020') {
|
|
176
|
-
field.subfields.forEach(subfield => fixField020Subfield(field, subfield));
|
|
176
|
+
field.subfields.forEach(subfield => fixField020Subfield(field, subfield)); // eslint-disable-line array-callback-return
|
|
177
177
|
return;
|
|
178
178
|
}
|
|
179
179
|
// 022 ISSN:
|
|
180
180
|
const subfield = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');
|
|
181
|
-
if (subfield && handleInvalid) {
|
|
181
|
+
if (subfield && handleInvalid) {
|
|
182
182
|
// $a/$l => $y (bit overkill to add $z and remove $a/$l instead of just renaming)
|
|
183
|
-
field.subfields.push({code: 'y', value: subfield.value});
|
|
183
|
+
field.subfields.push({code: 'y', value: subfield.value});
|
|
184
184
|
record.removeSubfield(subfield, field);
|
|
185
185
|
}
|
|
186
186
|
});
|
|
@@ -198,8 +198,8 @@ export default ({hyphenateISBN = false, handleInvalid = false} = {}) => {
|
|
|
198
198
|
}
|
|
199
199
|
// ISBN is valid but is missing hyphens
|
|
200
200
|
const normalizedValue = normalizeIsbnValue(subfield.value);
|
|
201
|
-
if (normalizedValue !== undefined) {
|
|
202
|
-
subfield.value = normalizedValue;
|
|
201
|
+
if (normalizedValue !== undefined) {
|
|
202
|
+
subfield.value = normalizedValue;
|
|
203
203
|
}
|
|
204
204
|
}
|
|
205
205
|
|
|
@@ -212,7 +212,7 @@ export default ({hyphenateISBN = false, handleInvalid = false} = {}) => {
|
|
|
212
212
|
return;
|
|
213
213
|
}
|
|
214
214
|
// $a => $z (bit overkill to add $z and remove $a instead of just renaming, but too lazy to fix/test thorougly)
|
|
215
|
-
field.subfields.push({code: 'z', value: subfield.value});
|
|
215
|
+
field.subfields.push({code: 'z', value: subfield.value});
|
|
216
216
|
record.removeSubfield(subfield, field);
|
|
217
217
|
}
|
|
218
218
|
|
|
@@ -231,8 +231,8 @@ export default ({hyphenateISBN = false, handleInvalid = false} = {}) => {
|
|
|
231
231
|
return;
|
|
232
232
|
}
|
|
233
233
|
const tail = value.substring(position + 1);
|
|
234
|
-
subfield.value = head;
|
|
235
|
-
field.subfields.push({code: 'q', value: tail});
|
|
234
|
+
subfield.value = head;
|
|
235
|
+
field.subfields.push({code: 'q', value: tail});
|
|
236
236
|
}
|
|
237
237
|
|
|
238
238
|
function normalizeIsbnValue(value) {
|
|
@@ -244,10 +244,10 @@ export default ({hyphenateISBN = false, handleInvalid = false} = {}) => {
|
|
|
244
244
|
}
|
|
245
245
|
const numbersOnly = trimmedValue.replace(/[^0-9Xx]+/ug, '');
|
|
246
246
|
const parsedIsbn = ISBN.parse(trimmedValue);
|
|
247
|
-
if (hyphenateISBN) {
|
|
248
|
-
return numbersOnly.length === 10 ? parsedIsbn.isbn10h : parsedIsbn.isbn13h;
|
|
247
|
+
if (hyphenateISBN) {
|
|
248
|
+
return numbersOnly.length === 10 ? parsedIsbn.isbn10h : parsedIsbn.isbn13h;
|
|
249
249
|
}
|
|
250
|
-
return numbersOnly.length === 10 ? parsedIsbn.isbn10 : parsedIsbn.isbn13;
|
|
250
|
+
return numbersOnly.length === 10 ? parsedIsbn.isbn10 : parsedIsbn.isbn13;
|
|
251
251
|
}
|
|
252
252
|
}
|
|
253
253
|
}
|
package/src/item-language.js
CHANGED
|
@@ -49,24 +49,24 @@ export default async function (tagPattern, treshold = 0.9) {
|
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
if (results.detected && results.detected !== results.currentCode) {
|
|
52
|
-
const f008 = record.get(/^008$/u).shift();
|
|
52
|
+
const f008 = record.get(/^008$/u).shift();
|
|
53
53
|
|
|
54
|
-
if (f008) {
|
|
54
|
+
if (f008) {
|
|
55
55
|
const start = f008.value.slice(0, 35);
|
|
56
56
|
const end = f008.value.slice(38);
|
|
57
|
-
f008.value = `${start}${results.detected}${end}`;
|
|
57
|
+
f008.value = `${start}${results.detected}${end}`;
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
const f041 = record.get(/^041$/u).shift();
|
|
60
|
+
const f041 = record.get(/^041$/u).shift();
|
|
61
61
|
|
|
62
62
|
if (f041) {
|
|
63
63
|
const subfield = f041.subfields.find(sf => sf.code === 'a');
|
|
64
64
|
|
|
65
|
-
if (subfield) {
|
|
66
|
-
subfield.value = results.detected;
|
|
67
|
-
} else {
|
|
68
|
-
f041.subfields.push({code: 'a', value: results.detected});
|
|
69
|
-
f041.subfields.sort((a, b) => {
|
|
65
|
+
if (subfield) {
|
|
66
|
+
subfield.value = results.detected;
|
|
67
|
+
} else {
|
|
68
|
+
f041.subfields.push({code: 'a', value: results.detected});
|
|
69
|
+
f041.subfields.sort((a, b) => {
|
|
70
70
|
if (a.code < b.code) {
|
|
71
71
|
return -1;
|
|
72
72
|
}
|
|
@@ -78,7 +78,7 @@ export default async function (tagPattern, treshold = 0.9) {
|
|
|
78
78
|
return 0;
|
|
79
79
|
});
|
|
80
80
|
}
|
|
81
|
-
} else {
|
|
81
|
+
} else {
|
|
82
82
|
record.insertField({tag: '041', ind1: ' ', ind2: ' ', subfields: [
|
|
83
83
|
{
|
|
84
84
|
code: 'a',
|
|
@@ -49,8 +49,8 @@ function differentPublisherSubfields(field1, field2) {
|
|
|
49
49
|
|
|
50
50
|
export function splitToNameAndQualifier(value) {
|
|
51
51
|
if (value.match(/^.* \([^()]+\)$/u)) {
|
|
52
|
-
const name = value.replace(/^(.*) \([^()]+\)$/u, '$1');
|
|
53
|
-
const qualifier = value.replace(/^.* (\([^()]+\))$/u, '$1');
|
|
52
|
+
const name = value.replace(/^(.*) \([^()]+\)$/u, '$1');
|
|
53
|
+
const qualifier = value.replace(/^.* (\([^()]+\))$/u, '$1');
|
|
54
54
|
return [name, qualifier];
|
|
55
55
|
}
|
|
56
56
|
return [value, undefined];
|
|
@@ -189,7 +189,7 @@ function pairableValue(tag, subfieldCode, value1, value2) {
|
|
|
189
189
|
|
|
190
190
|
|
|
191
191
|
function counterpartExtraNormalize(tag, subfieldCode, value) {
|
|
192
|
-
|
|
192
|
+
|
|
193
193
|
// Remove trailing punctuation:
|
|
194
194
|
value = value.replace(/(\S)(?:,|\.|\?|!|\. -| *:| *;| =| \/)$/u, '$1');
|
|
195
195
|
// Remove brackets:
|
|
@@ -540,7 +540,7 @@ function fieldToNamePart(field) {
|
|
|
540
540
|
const subsetField = {'tag': field.tag, 'ind1': field.ind1, 'ind2': field.ind2, subfields: relevantSubfields};
|
|
541
541
|
|
|
542
542
|
/*
|
|
543
|
-
if (index > -1) {
|
|
543
|
+
if (index > -1) {
|
|
544
544
|
debugDev(`Name subset: ${fieldToString(subsetField)}`);
|
|
545
545
|
}
|
|
546
546
|
*/
|
|
@@ -624,7 +624,7 @@ function mergablePairWithAltName(normCandField, normalizedField, altName, config
|
|
|
624
624
|
if (!a) {
|
|
625
625
|
return false;
|
|
626
626
|
}
|
|
627
|
-
a.value = altName;
|
|
627
|
+
a.value = altName;
|
|
628
628
|
|
|
629
629
|
return mergablePair(normCandField, normalizedField, config);
|
|
630
630
|
}
|
|
@@ -683,9 +683,9 @@ function getCounterpartCandidates(field, record) {
|
|
|
683
683
|
}
|
|
684
684
|
|
|
685
685
|
export function baseIsSource(base, source) {
|
|
686
|
-
base.localTest = true;
|
|
686
|
+
base.localTest = true;
|
|
687
687
|
const result = source.localTest;
|
|
688
|
-
delete base.localTest;
|
|
688
|
+
delete base.localTest;
|
|
689
689
|
return result;
|
|
690
690
|
}
|
|
691
691
|
|
|
@@ -29,7 +29,7 @@ export default function () {
|
|
|
29
29
|
//const candFields = record.fields.toReversed(); // Node 20+ only! Filter via config?
|
|
30
30
|
const fields = config && config.tagPattern ? record.get(config.tagPattern) : record.get(/^[1678](?:00|10|11|30)$/u);
|
|
31
31
|
|
|
32
|
-
fields.reverse();
|
|
32
|
+
fields.reverse();
|
|
33
33
|
const mergedField = fields.find(f => mergeField(record, record, f, config));
|
|
34
34
|
if (!mergedField) {
|
|
35
35
|
return;
|
|
@@ -41,9 +41,9 @@ export default function () {
|
|
|
41
41
|
|
|
42
42
|
function fix(record, config = undefined) {
|
|
43
43
|
const config2 = config || defaultConfig;
|
|
44
|
-
record.internalMerge = true;
|
|
44
|
+
record.internalMerge = true;
|
|
45
45
|
mergeFieldsWithinRecord(record, config2);
|
|
46
|
-
delete record.internalMerge;
|
|
46
|
+
delete record.internalMerge;
|
|
47
47
|
// Remove deleted fields and field.merged marks:
|
|
48
48
|
postprocessRecords(record, record);
|
|
49
49
|
|
|
@@ -303,7 +303,7 @@ export function getMergeConstraintsForTag(tag, constraintName) {
|
|
|
303
303
|
return null;
|
|
304
304
|
}
|
|
305
305
|
// NB! should we support multiple contains for a field? Eg. 505$a vs 505($tg)+
|
|
306
|
-
if (tagsConstraintsArray.length > 1) {
|
|
306
|
+
if (tagsConstraintsArray.length > 1) {
|
|
307
307
|
debugDev(`WARNING\tMultiple values for '${constraintName}' (N=${tagsConstraintsArray.length}) found in ${tag}. Using first values.`);
|
|
308
308
|
}
|
|
309
309
|
return constraintToValue(tagsConstraintsArray[0], constraintName);
|