@natlibfi/marc-record-validators-melinda 9.0.2 → 9.0.4
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/dist/isbn-issn.js +81 -42
- package/dist/isbn-issn.js.map +1 -1
- package/dist/isbn-issn.spec.js +91 -3
- package/dist/isbn-issn.spec.js.map +1 -1
- package/dist/subfield-exclusion.js +10 -5
- package/dist/subfield-exclusion.js.map +1 -1
- package/dist/subfield-exclusion.spec.js +55 -1
- package/dist/subfield-exclusion.spec.js.map +1 -1
- package/package.json +1 -1
- package/src/isbn-issn.js +67 -38
- package/src/isbn-issn.spec.js +52 -12
- package/src/subfield-exclusion.js +8 -4
- package/src/subfield-exclusion.spec.js +52 -1
package/dist/isbn-issn.js
CHANGED
|
@@ -51,51 +51,76 @@ var _default = ({
|
|
|
51
51
|
function getInvalidFields(record) {
|
|
52
52
|
return record.get(/^(020|022)$/u).filter(field => {
|
|
53
53
|
// eslint-disable-line prefer-named-capture-group
|
|
54
|
+
// Check ISBN:
|
|
54
55
|
if (field.tag === '020') {
|
|
55
|
-
|
|
56
|
-
const sfZ = field.subfields.find(sf => sf.code === 'z');
|
|
57
|
-
|
|
58
|
-
if (subfield === undefined) {
|
|
59
|
-
if (sfZ) {
|
|
60
|
-
return false;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return true;
|
|
64
|
-
} // If value contains space
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
if (subfield.value.indexOf(' ') > -1) {
|
|
56
|
+
if (invalidField020(field)) {
|
|
68
57
|
return true;
|
|
69
58
|
}
|
|
70
59
|
|
|
60
|
+
const subfield = field.subfields.find(sf => sf.code === 'a');
|
|
61
|
+
|
|
71
62
|
const auditedIsbn = _isbn.default.audit(subfield.value);
|
|
72
63
|
|
|
73
64
|
if (!auditedIsbn.validIsbn) {
|
|
74
65
|
return true;
|
|
75
|
-
}
|
|
66
|
+
} // Should we refactor code by adding a function that returns legal set of values,
|
|
67
|
+
// and then we compare subfield.value against that list?
|
|
68
|
+
|
|
76
69
|
|
|
77
70
|
const parsedIsbn = _isbn.default.parse(subfield.value);
|
|
78
71
|
|
|
79
72
|
if (hyphenateISBN) {
|
|
80
|
-
return subfield.value
|
|
73
|
+
return !(subfield.value === parsedIsbn.isbn10h || subfield.value === parsedIsbn.isbn13h);
|
|
81
74
|
}
|
|
82
75
|
|
|
83
|
-
return subfield.value
|
|
76
|
+
return !(subfield.value === parsedIsbn.isbn10 || subfield.value === parsedIsbn.isbn13);
|
|
77
|
+
} // Check ISSN:
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
if (invalidField022(field)) {
|
|
81
|
+
return true;
|
|
84
82
|
}
|
|
85
83
|
|
|
86
84
|
const subfield = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');
|
|
87
|
-
|
|
85
|
+
return !(0, _issnVerify.default)(subfield.value);
|
|
86
|
+
});
|
|
88
87
|
|
|
89
|
-
|
|
90
|
-
|
|
88
|
+
function invalidField020(field) {
|
|
89
|
+
const subfieldA = field.subfields.find(sf => sf.code === 'a');
|
|
90
|
+
|
|
91
|
+
if (subfieldA === undefined) {
|
|
92
|
+
const subfieldZ = field.subfields.find(sf => sf.code === 'z');
|
|
93
|
+
|
|
94
|
+
if (subfieldZ !== undefined) {
|
|
91
95
|
return false;
|
|
92
96
|
}
|
|
93
97
|
|
|
98
|
+
return true;
|
|
99
|
+
} // If value contains space, it's not ok (it's typically something like "1234567890 (nid.)")
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
if (subfieldA.value.indexOf(' ') > -1) {
|
|
94
103
|
return true;
|
|
95
104
|
}
|
|
96
105
|
|
|
97
|
-
return
|
|
98
|
-
}
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function invalidField022(field) {
|
|
110
|
+
const subfieldAorL = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');
|
|
111
|
+
|
|
112
|
+
if (subfieldAorL === undefined) {
|
|
113
|
+
const subfieldY = field.subfields.find(sf => sf.code === 'y');
|
|
114
|
+
|
|
115
|
+
if (subfieldY) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
99
124
|
}
|
|
100
125
|
|
|
101
126
|
function validate(record) {
|
|
@@ -109,12 +134,12 @@ var _default = ({
|
|
|
109
134
|
|
|
110
135
|
return fields.map(field => {
|
|
111
136
|
if (field.tag === '020') {
|
|
112
|
-
const
|
|
137
|
+
const subfieldA = field.subfields.find(sf => sf.code === 'a');
|
|
113
138
|
|
|
114
|
-
if (
|
|
139
|
+
if (subfieldA) {
|
|
115
140
|
return {
|
|
116
141
|
name: 'ISBN',
|
|
117
|
-
value:
|
|
142
|
+
value: subfieldA.value
|
|
118
143
|
};
|
|
119
144
|
}
|
|
120
145
|
|
|
@@ -130,10 +155,10 @@ var _default = ({
|
|
|
130
155
|
};
|
|
131
156
|
|
|
132
157
|
function getISSN() {
|
|
133
|
-
const
|
|
158
|
+
const subfieldAorL = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');
|
|
134
159
|
|
|
135
|
-
if (
|
|
136
|
-
return
|
|
160
|
+
if (subfieldAorL) {
|
|
161
|
+
return subfieldAorL.value;
|
|
137
162
|
}
|
|
138
163
|
|
|
139
164
|
return undefined;
|
|
@@ -160,26 +185,16 @@ var _default = ({
|
|
|
160
185
|
|
|
161
186
|
if (subfield) {
|
|
162
187
|
// ISBN is valid but is missing hyphens
|
|
163
|
-
const
|
|
164
|
-
|
|
165
|
-
const auditResult = _isbn.default.audit(trimmedValue);
|
|
188
|
+
const normalizedValue = normalizeIsbnValue(subfield.value);
|
|
166
189
|
|
|
167
|
-
if (
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
if (hyphenateISBN) {
|
|
171
|
-
// eslint-disable-line functional/no-conditional-statement
|
|
172
|
-
subfield.value = parsedIsbn.isbn13h; // eslint-disable-line functional/immutable-data
|
|
173
|
-
} else {
|
|
174
|
-
// eslint-disable-line functional/no-conditional-statement
|
|
175
|
-
// Just trim
|
|
176
|
-
subfield.value = parsedIsbn.isbn13; // eslint-disable-line functional/immutable-data
|
|
177
|
-
}
|
|
190
|
+
if (normalizedValue !== undefined) {
|
|
191
|
+
// eslint-disable-line functional/no-conditional-statement
|
|
192
|
+
subfield.value = normalizedValue; // eslint-disable-line functional/immutable-data
|
|
178
193
|
} else if (handleInvalid) {
|
|
179
194
|
// eslint-disable-line functional/no-conditional-statement
|
|
180
195
|
field.subfields.push({
|
|
181
196
|
code: 'z',
|
|
182
|
-
value:
|
|
197
|
+
value: subfield.value
|
|
183
198
|
}); // eslint-disable-line functional/immutable-data
|
|
184
199
|
|
|
185
200
|
record.removeSubfield(subfield, field);
|
|
@@ -200,9 +215,33 @@ var _default = ({
|
|
|
200
215
|
}
|
|
201
216
|
});
|
|
202
217
|
|
|
218
|
+
function normalizeIsbnValue(value) {
|
|
219
|
+
const trimmedValue = trimISBN(value); // NB! This might lose information that should be stored in $q...
|
|
220
|
+
|
|
221
|
+
const auditResult = _isbn.default.audit(trimmedValue);
|
|
222
|
+
|
|
223
|
+
if (auditResult.validIsbn) {
|
|
224
|
+
const parsedIsbn = _isbn.default.parse(trimmedValue);
|
|
225
|
+
|
|
226
|
+
if (hyphenateISBN) {
|
|
227
|
+
// eslint-disable-line functional/no-conditional-statement
|
|
228
|
+
return trimmedValue.length === 10 ? parsedIsbn.isbn10h : parsedIsbn.isbn13h; // eslint-disable-line functional/immutable-data
|
|
229
|
+
} // Just trim
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
return trimmedValue.length === 10 ? parsedIsbn.isbn10 : parsedIsbn.isbn13; // eslint-disable-line functional/immutable-data
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return undefined;
|
|
236
|
+
}
|
|
237
|
+
|
|
203
238
|
function trimSpaces(value) {
|
|
204
239
|
return value.replace(/\s/gu, '');
|
|
205
240
|
}
|
|
241
|
+
|
|
242
|
+
function trimISBN(value) {
|
|
243
|
+
return trimSpaces(value.replace(/\s\D+$/gu, '')); // handle "1234567890 (nid.)" => "1234567890" as well as spaces
|
|
244
|
+
}
|
|
206
245
|
}
|
|
207
246
|
};
|
|
208
247
|
|
package/dist/isbn-issn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/isbn-issn.js"],"names":["hyphenateISBN","handleInvalid","validate","fix","description","getInvalidFields","record","get","filter","field","tag","subfield","subfields","find","sf","code","sfZ","undefined","value","indexOf","auditedIsbn","ISBN","audit","validIsbn","parsedIsbn","parse","isbn13h","isbn13","sfY","fields","length","valid","map","sfvalue","name","getISSN","result","reduce","acc","obj","msg","messages","concat","forEach","trimmedValue","trimSpaces","auditResult","push","removeSubfield","replace"],"mappings":"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","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-2020 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 Lesser 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 Lesser General Public License for more details.\n*\n* You should have received a copy of the GNU Lesser 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\nimport ISBN from 'isbn3';\nimport validateISSN from '@natlibfi/issn-verify';\n\nexport default ({hyphenateISBN = false, handleInvalid = false} = {}) => {\n return {\n validate, fix,\n description: 'Validates ISBN and ISSN values'\n };\n\n function getInvalidFields(record) {\n return record.get(/^(020|022)$/u).filter(field => { // eslint-disable-line prefer-named-capture-group\n if (field.tag === '020') {\n const subfield = field.subfields.find(sf => sf.code === 'a');\n const sfZ = field.subfields.find(sf => sf.code === 'z');\n\n if (subfield === undefined) {\n if (sfZ) {\n return false;\n }\n\n return true;\n }\n\n // If value contains space\n if (subfield.value.indexOf(' ') > -1) {\n return true;\n }\n\n const auditedIsbn = ISBN.audit(subfield.value);\n if (!auditedIsbn.validIsbn) {\n return true;\n }\n\n const parsedIsbn = ISBN.parse(subfield.value);\n if (hyphenateISBN) {\n return subfield.value !== parsedIsbn.isbn13h;\n }\n\n return subfield.value !== parsedIsbn.isbn13;\n }\n\n const subfield = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');\n const sfY = field.subfields.find(sf => sf.code === 'y');\n\n if (subfield === undefined) {\n if (sfY) {\n return false;\n }\n\n return true;\n }\n\n return !validateISSN(subfield.value);\n });\n }\n\n function validate(record) {\n const fields = getInvalidFields(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 sfvalue = field.subfields.find(sf => sf.code === 'a');\n if (sfvalue) {\n return {name: 'ISBN', value: sfvalue.value};\n }\n\n return {name: 'ISBN', value: undefined};\n }\n\n return {name: 'ISSN', value: getISSN()};\n\n function getISSN() {\n const result = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');\n\n if (result) {\n return result.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 function fix(record) {\n getInvalidFields(record).forEach(field => {\n if (field.tag === '020') {\n const subfield = field.subfields.find(sf => sf.code === 'a');\n if (subfield) {\n // ISBN is valid but is missing hyphens\n const trimmedValue = trimSpaces(subfield.value);\n const auditResult = ISBN.audit(trimmedValue);\n if (auditResult.validIsbn) {\n const parsedIsbn = ISBN.parse(trimmedValue);\n if (hyphenateISBN) { // eslint-disable-line functional/no-conditional-statement\n subfield.value = parsedIsbn.isbn13h; // eslint-disable-line functional/immutable-data\n } else { // eslint-disable-line functional/no-conditional-statement\n // Just trim\n subfield.value = parsedIsbn.isbn13; // eslint-disable-line functional/immutable-data\n }\n } else if (handleInvalid) { // eslint-disable-line functional/no-conditional-statement\n field.subfields.push({code: 'z', value: trimmedValue}); // eslint-disable-line functional/immutable-data\n record.removeSubfield(subfield, field);\n }\n }\n } else {\n const subfield = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');\n if (subfield && handleInvalid) { // eslint-disable-line functional/no-conditional-statement\n field.subfields.push({code: 'y', value: trimSpaces(subfield.value)}); // eslint-disable-line functional/immutable-data\n record.removeSubfield(subfield, field);\n }\n }\n });\n\n function trimSpaces(value) {\n return value.replace(/\\s/gu, '');\n }\n }\n};\n"],"file":"isbn-issn.js"}
|
|
1
|
+
{"version":3,"sources":["../src/isbn-issn.js"],"names":["hyphenateISBN","handleInvalid","validate","fix","description","getInvalidFields","record","get","filter","field","tag","invalidField020","subfield","subfields","find","sf","code","auditedIsbn","ISBN","audit","value","validIsbn","parsedIsbn","parse","isbn10h","isbn13h","isbn10","isbn13","invalidField022","subfieldA","undefined","subfieldZ","indexOf","subfieldAorL","subfieldY","fields","length","valid","map","name","getISSN","reduce","acc","obj","msg","messages","concat","forEach","normalizedValue","normalizeIsbnValue","push","removeSubfield","trimSpaces","trimmedValue","trimISBN","auditResult","replace"],"mappings":"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","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-2020 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 Lesser 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 Lesser General Public License for more details.\n*\n* You should have received a copy of the GNU Lesser 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\nimport ISBN from 'isbn3';\nimport validateISSN from '@natlibfi/issn-verify';\n\nexport default ({hyphenateISBN = false, handleInvalid = false} = {}) => {\n return {\n validate, fix,\n description: 'Validates ISBN and ISSN values'\n };\n\n function getInvalidFields(record) {\n return record.get(/^(020|022)$/u).filter(field => { // eslint-disable-line prefer-named-capture-group\n // Check ISBN:\n if (field.tag === '020') {\n if (invalidField020(field)) {\n return true;\n }\n\n const subfield = field.subfields.find(sf => sf.code === 'a');\n const auditedIsbn = ISBN.audit(subfield.value);\n if (!auditedIsbn.validIsbn) {\n return true;\n }\n // Should we refactor code by adding a function that returns legal set of values,\n // and then we compare subfield.value against that list?\n const parsedIsbn = ISBN.parse(subfield.value);\n if (hyphenateISBN) {\n return !(subfield.value === parsedIsbn.isbn10h || subfield.value === parsedIsbn.isbn13h);\n }\n\n return !(subfield.value === parsedIsbn.isbn10 || subfield.value === parsedIsbn.isbn13);\n }\n // Check ISSN:\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\n function invalidField020(field) {\n const subfieldA = field.subfields.find(sf => sf.code === 'a');\n\n if (subfieldA === undefined) {\n const subfieldZ = field.subfields.find(sf => sf.code === 'z');\n if (subfieldZ !== undefined) {\n return false;\n }\n return true;\n }\n\n // If value contains space, it's not ok (it's typically something like \"1234567890 (nid.)\")\n if (subfieldA.value.indexOf(' ') > -1) {\n return true;\n }\n return false;\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 = getInvalidFields(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\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 function fix(record) {\n getInvalidFields(record).forEach(field => {\n if (field.tag === '020') {\n const subfield = field.subfields.find(sf => sf.code === 'a');\n if (subfield) {\n // ISBN is valid but is missing hyphens\n const normalizedValue = normalizeIsbnValue(subfield.value);\n if (normalizedValue !== undefined) { // eslint-disable-line functional/no-conditional-statement\n subfield.value = normalizedValue; // eslint-disable-line functional/immutable-data\n } else if (handleInvalid) { // eslint-disable-line functional/no-conditional-statement\n field.subfields.push({code: 'z', value: subfield.value}); // eslint-disable-line functional/immutable-data\n record.removeSubfield(subfield, field);\n }\n }\n } else {\n const subfield = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');\n if (subfield && handleInvalid) { // eslint-disable-line functional/no-conditional-statement\n field.subfields.push({code: 'y', value: trimSpaces(subfield.value)}); // eslint-disable-line functional/immutable-data\n record.removeSubfield(subfield, field);\n }\n }\n });\n\n function normalizeIsbnValue(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 const parsedIsbn = ISBN.parse(trimmedValue);\n if (hyphenateISBN) { // eslint-disable-line functional/no-conditional-statement\n return trimmedValue.length === 10 ? parsedIsbn.isbn10h : parsedIsbn.isbn13h; // eslint-disable-line functional/immutable-data\n }\n // Just trim\n return trimmedValue.length === 10 ? parsedIsbn.isbn10 : parsedIsbn.isbn13; // eslint-disable-line functional/immutable-data\n }\n return undefined;\n }\n\n function trimSpaces(value) {\n return value.replace(/\\s/gu, '');\n }\n\n function trimISBN(value) {\n return trimSpaces(value.replace(/\\s\\D+$/gu, '')); // handle \"1234567890 (nid.)\" => \"1234567890\" as well as spaces\n }\n }\n};\n"],"file":"isbn-issn.js"}
|
package/dist/isbn-issn.spec.js
CHANGED
|
@@ -56,6 +56,14 @@ describe('isbn-issn', () => {
|
|
|
56
56
|
code: 'a',
|
|
57
57
|
value: '978-600-377-017-1'
|
|
58
58
|
}]
|
|
59
|
+
}, {
|
|
60
|
+
tag: '020',
|
|
61
|
+
ind1: ' ',
|
|
62
|
+
ind2: ' ',
|
|
63
|
+
subfields: [{
|
|
64
|
+
code: 'a',
|
|
65
|
+
value: '90-6831-372-X'
|
|
66
|
+
}]
|
|
59
67
|
}, {
|
|
60
68
|
tag: '022',
|
|
61
69
|
ind1: ' ',
|
|
@@ -147,12 +155,20 @@ describe('isbn-issn', () => {
|
|
|
147
155
|
code: 'a',
|
|
148
156
|
value: ' 9789519155470'
|
|
149
157
|
}]
|
|
158
|
+
}, {
|
|
159
|
+
tag: '020',
|
|
160
|
+
ind1: ' ',
|
|
161
|
+
ind2: ' ',
|
|
162
|
+
subfields: [{
|
|
163
|
+
code: 'a',
|
|
164
|
+
value: '978-600-377-017-1 (nid.)'
|
|
165
|
+
}]
|
|
150
166
|
}]
|
|
151
167
|
});
|
|
152
168
|
const result = await validator.validate(record);
|
|
153
169
|
(0, _chai.expect)(result).to.eql({
|
|
154
170
|
valid: false,
|
|
155
|
-
messages: ['ISBN ( 9789519155470) is not valid']
|
|
171
|
+
messages: ['ISBN ( 9789519155470) is not valid', 'ISBN (978-600-377-017-1 (nid.)) is not valid']
|
|
156
172
|
});
|
|
157
173
|
});
|
|
158
174
|
it('Finds the record invalid (ISSN in \'l\'-subfield)', async () => {
|
|
@@ -182,7 +198,7 @@ describe('isbn-issn', () => {
|
|
|
182
198
|
messages: ['ISBN (foo) is not valid', 'ISSN (bar) is not valid']
|
|
183
199
|
});
|
|
184
200
|
});
|
|
185
|
-
it('Finds the record invalid (ISBN without hyphens)', async () => {
|
|
201
|
+
it('Finds the record invalid (valid ISBN without hyphens)', async () => {
|
|
186
202
|
const validator = await (0, _isbnIssn.default)({
|
|
187
203
|
hyphenateISBN: true
|
|
188
204
|
});
|
|
@@ -195,12 +211,20 @@ describe('isbn-issn', () => {
|
|
|
195
211
|
code: 'a',
|
|
196
212
|
value: '9789519155470'
|
|
197
213
|
}]
|
|
214
|
+
}, {
|
|
215
|
+
tag: '020',
|
|
216
|
+
ind1: ' ',
|
|
217
|
+
ind2: ' ',
|
|
218
|
+
subfields: [{
|
|
219
|
+
code: 'a',
|
|
220
|
+
value: '386006004X'
|
|
221
|
+
}]
|
|
198
222
|
}]
|
|
199
223
|
});
|
|
200
224
|
const result = await validator.validate(record);
|
|
201
225
|
(0, _chai.expect)(result).to.eql({
|
|
202
226
|
valid: false,
|
|
203
|
-
messages: ['ISBN (9789519155470) is not valid']
|
|
227
|
+
messages: ['ISBN (9789519155470) is not valid', 'ISBN (386006004X) is not valid']
|
|
204
228
|
});
|
|
205
229
|
});
|
|
206
230
|
it.skip('Finds the record invalid (Missing ISBN)');
|
|
@@ -220,6 +244,14 @@ describe('isbn-issn', () => {
|
|
|
220
244
|
code: 'a',
|
|
221
245
|
value: 'foo'
|
|
222
246
|
}]
|
|
247
|
+
}, {
|
|
248
|
+
tag: '020',
|
|
249
|
+
ind1: ' ',
|
|
250
|
+
ind2: ' ',
|
|
251
|
+
subfields: [{
|
|
252
|
+
code: 'a',
|
|
253
|
+
value: 'crappy val'
|
|
254
|
+
}]
|
|
223
255
|
}]
|
|
224
256
|
});
|
|
225
257
|
await validator.fix(record);
|
|
@@ -231,6 +263,14 @@ describe('isbn-issn', () => {
|
|
|
231
263
|
code: 'z',
|
|
232
264
|
value: 'foo'
|
|
233
265
|
}]
|
|
266
|
+
}, {
|
|
267
|
+
tag: '020',
|
|
268
|
+
ind1: ' ',
|
|
269
|
+
ind2: ' ',
|
|
270
|
+
subfields: [{
|
|
271
|
+
code: 'z',
|
|
272
|
+
value: 'crappy val'
|
|
273
|
+
}]
|
|
234
274
|
}]);
|
|
235
275
|
});
|
|
236
276
|
it('Moves invalid ISSN to y-subfield', async () => {
|
|
@@ -296,6 +336,14 @@ describe('isbn-issn', () => {
|
|
|
296
336
|
code: 'a',
|
|
297
337
|
value: ' 9786003770171'
|
|
298
338
|
}]
|
|
339
|
+
}, {
|
|
340
|
+
tag: '020',
|
|
341
|
+
ind1: ' ',
|
|
342
|
+
ind2: ' ',
|
|
343
|
+
subfields: [{
|
|
344
|
+
code: 'a',
|
|
345
|
+
value: '9786003770171 (nid.)'
|
|
346
|
+
}]
|
|
299
347
|
}]
|
|
300
348
|
});
|
|
301
349
|
await validator.fix(record);
|
|
@@ -307,6 +355,14 @@ describe('isbn-issn', () => {
|
|
|
307
355
|
code: 'a',
|
|
308
356
|
value: '9786003770171'
|
|
309
357
|
}]
|
|
358
|
+
}, {
|
|
359
|
+
tag: '020',
|
|
360
|
+
ind1: ' ',
|
|
361
|
+
ind2: ' ',
|
|
362
|
+
subfields: [{
|
|
363
|
+
code: 'a',
|
|
364
|
+
value: '9786003770171'
|
|
365
|
+
}]
|
|
310
366
|
}]);
|
|
311
367
|
});
|
|
312
368
|
it('Trims spaces and hyphenates value', async () => {
|
|
@@ -348,6 +404,22 @@ describe('isbn-issn', () => {
|
|
|
348
404
|
code: 'a',
|
|
349
405
|
value: '9789916605325'
|
|
350
406
|
}]
|
|
407
|
+
}, {
|
|
408
|
+
tag: '020',
|
|
409
|
+
ind1: ' ',
|
|
410
|
+
ind2: ' ',
|
|
411
|
+
subfields: [{
|
|
412
|
+
code: 'a',
|
|
413
|
+
value: '917153086X'
|
|
414
|
+
}]
|
|
415
|
+
}, {
|
|
416
|
+
tag: '020',
|
|
417
|
+
ind1: ' ',
|
|
418
|
+
ind2: ' ',
|
|
419
|
+
subfields: [{
|
|
420
|
+
code: 'a',
|
|
421
|
+
value: '386006004X (nid.)'
|
|
422
|
+
}]
|
|
351
423
|
}]
|
|
352
424
|
});
|
|
353
425
|
await validator.fix(record);
|
|
@@ -359,6 +431,22 @@ describe('isbn-issn', () => {
|
|
|
359
431
|
code: 'a',
|
|
360
432
|
value: '978-9916-605-32-5'
|
|
361
433
|
}]
|
|
434
|
+
}, {
|
|
435
|
+
tag: '020',
|
|
436
|
+
ind1: ' ',
|
|
437
|
+
ind2: ' ',
|
|
438
|
+
subfields: [{
|
|
439
|
+
code: 'a',
|
|
440
|
+
value: '91-7153-086-X'
|
|
441
|
+
}]
|
|
442
|
+
}, {
|
|
443
|
+
tag: '020',
|
|
444
|
+
ind1: ' ',
|
|
445
|
+
ind2: ' ',
|
|
446
|
+
subfields: [{
|
|
447
|
+
code: 'a',
|
|
448
|
+
value: '3-86006-004-X'
|
|
449
|
+
}]
|
|
362
450
|
}]);
|
|
363
451
|
});
|
|
364
452
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/isbn-issn.spec.js"],"names":["describe","it","validator","to","be","an","that","has","any","keys","description","a","validate","hyphenateISBN","record","MarcRecord","fields","tag","ind1","ind2","subfields","code","value","result","eql","valid","messages","skip","handleInvalid","fix"],"mappings":"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","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-2020 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 Lesser 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 Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser 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\nimport {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/isbn-issn';\n\ndescribe('isbn-issn', () => {\n it('Creates a validator', async () => {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n describe('#validate', () => {\n it('Finds the record valid', async () => {\n const validator = await validatorFactory({hyphenateISBN: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '978-600-377-017-1'}]\n },\n {\n tag: '022',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '0355-0893'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: true});\n });\n\n it('Finds the record invalid', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'foo'}]\n },\n {\n tag: '022',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'bar'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({\n valid: false, messages: [\n 'ISBN (foo) is not valid',\n 'ISSN (bar) is not valid'\n ]\n });\n });\n\n it('Finds the invalid 020 field', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'q', value: 'nidottu'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({\n valid: false, messages: ['ISBN (undefined) is not valid']\n });\n });\n\n it('Finds the invalid 022 field', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '022',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'z', value: '0000-0000'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({\n valid: false, messages: ['ISSN (undefined) is not valid']\n });\n });\n\n it('Finds the record invalid (Spaces in ISBN)', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: ' 9789519155470'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({\n valid: false, messages: ['ISBN ( 9789519155470) is not valid']\n });\n });\n\n it('Finds the record invalid (ISSN in \\'l\\'-subfield)', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'foo'}]\n },\n {\n tag: '022',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'l', value: 'bar'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({\n valid: false, messages: [\n 'ISBN (foo) is not valid',\n 'ISSN (bar) is not valid'\n ]\n });\n });\n\n it('Finds the record invalid (ISBN without hyphens)', async () => {\n const validator = await validatorFactory({hyphenateISBN: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '9789519155470'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: false, messages: ['ISBN (9789519155470) is not valid']});\n });\n\n it.skip('Finds the record invalid (Missing ISBN)');\n it.skip('Finds the record invalid (Missing ISSN)');\n });\n\n describe('#fix', () => {\n it('Moves invalid ISBN to z-subfield', async () => {\n const validator = await validatorFactory({handleInvalid: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '020', ind1: ' ', ind2: ' ',\n subfields: [{code: 'a', value: 'foo'}]\n }\n ]\n });\n\n await validator.fix(record);\n\n expect(record.fields).to.eql([\n {\n tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'z', value: 'foo'}]\n }\n ]);\n });\n\n it('Moves invalid ISSN to y-subfield', async () => {\n const validator = await validatorFactory({handleInvalid: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '022', ind1: ' ', ind2: ' ',\n subfields: [{code: 'a', value: 'foo'}]\n }\n ]\n });\n\n await validator.fix(record);\n\n expect(record.fields).to.eql([\n {\n tag: '022', ind1: ' ', ind2: ' ', subfields: [{code: 'y', value: 'foo'}]\n }\n ]);\n });\n\n it('Moves invalid ISSN to y-subfield (Origin l-subfield)', async () => {\n const validator = await validatorFactory({handleInvalid: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '022', ind1: ' ', ind2: ' ',\n subfields: [{code: 'l', value: 'foo'}]\n }\n ]\n });\n\n await validator.fix(record);\n\n expect(record.fields).to.eql([\n {\n tag: '022', ind1: ' ', ind2: ' ', subfields: [{code: 'y', value: 'foo'}]\n }\n ]);\n });\n\n it('Trims spaces from value (No hyphenate)', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: ' 9786003770171'}]\n }\n ]\n });\n await validator.fix(record);\n\n expect(record.fields).to.eql([\n {\n tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '9786003770171'}]\n }\n ]);\n });\n\n it('Trims spaces and hyphenates value', async () => {\n const validator = await validatorFactory({hyphenateISBN: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: ' 9786003770171'}]\n }\n ]\n });\n await validator.fix(record);\n\n expect(record.fields).to.eql([\n {\n tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '978-600-377-017-1'}]\n }\n ]);\n });\n\n it('Adds hyphens to ISBN', async () => {\n const validator = await validatorFactory({hyphenateISBN: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '020', ind1: ' ', ind2: ' ',\n subfields: [{code: 'a', value: '9789916605325'}]\n }\n ]\n });\n\n await validator.fix(record);\n\n expect(record.fields).to.eql([\n {\n tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '978-9916-605-32-5'}]\n }\n ]);\n });\n });\n});\n"],"file":"isbn-issn.spec.js"}
|
|
1
|
+
{"version":3,"sources":["../src/isbn-issn.spec.js"],"names":["describe","it","validator","to","be","an","that","has","any","keys","description","a","validate","hyphenateISBN","record","MarcRecord","fields","tag","ind1","ind2","subfields","code","value","result","eql","valid","messages","skip","handleInvalid","fix"],"mappings":"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","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-2020 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 Lesser 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 Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser 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\nimport {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/isbn-issn';\n\ndescribe('isbn-issn', () => {\n it('Creates a validator', async () => {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n describe('#validate', () => {\n it('Finds the record valid', async () => {\n const validator = await validatorFactory({hyphenateISBN: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '978-600-377-017-1'}]\n },\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '90-6831-372-X'}]\n },\n {\n tag: '022',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '0355-0893'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: true});\n });\n\n it('Finds the record invalid', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'foo'}]\n },\n {\n tag: '022',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'bar'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({\n valid: false, messages: [\n 'ISBN (foo) is not valid',\n 'ISSN (bar) is not valid'\n ]\n });\n });\n\n it('Finds the invalid 020 field', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'q', value: 'nidottu'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({\n valid: false, messages: ['ISBN (undefined) is not valid']\n });\n });\n\n it('Finds the invalid 022 field', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '022',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'z', value: '0000-0000'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({\n valid: false, messages: ['ISSN (undefined) is not valid']\n });\n });\n\n it('Finds the record invalid (Spaces in ISBN)', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: ' 9789519155470'}]\n },\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '978-600-377-017-1 (nid.)'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({\n valid: false, messages: [\n 'ISBN ( 9789519155470) is not valid',\n 'ISBN (978-600-377-017-1 (nid.)) is not valid'\n ]\n });\n });\n\n it('Finds the record invalid (ISSN in \\'l\\'-subfield)', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'foo'}]\n },\n {\n tag: '022',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'l', value: 'bar'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({\n valid: false, messages: [\n 'ISBN (foo) is not valid',\n 'ISSN (bar) is not valid'\n ]\n });\n });\n\n it('Finds the record invalid (valid ISBN without hyphens)', async () => {\n const validator = await validatorFactory({hyphenateISBN: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '9789519155470'}]\n },\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '386006004X'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: false, messages: [\n 'ISBN (9789519155470) is not valid',\n 'ISBN (386006004X) is not valid'\n ]});\n });\n\n it.skip('Finds the record invalid (Missing ISBN)');\n it.skip('Finds the record invalid (Missing ISSN)');\n });\n\n describe('#fix', () => {\n it('Moves invalid ISBN to z-subfield', async () => {\n const validator = await validatorFactory({handleInvalid: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '020', ind1: ' ', ind2: ' ',\n subfields: [{code: 'a', value: 'foo'}]\n },\n {\n tag: '020', ind1: ' ', ind2: ' ',\n subfields: [{code: 'a', value: 'crappy val'}]\n }\n ]\n });\n\n await validator.fix(record);\n\n expect(record.fields).to.eql([\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'z', value: 'foo'}]},\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'z', value: 'crappy val'}]}\n ]);\n });\n\n it('Moves invalid ISSN to y-subfield', async () => {\n const validator = await validatorFactory({handleInvalid: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '022', ind1: ' ', ind2: ' ',\n subfields: [{code: 'a', value: 'foo'}]\n }\n ]\n });\n\n await validator.fix(record);\n\n expect(record.fields).to.eql([\n {\n tag: '022', ind1: ' ', ind2: ' ', subfields: [{code: 'y', value: 'foo'}]\n }\n ]);\n });\n\n it('Moves invalid ISSN to y-subfield (Origin l-subfield)', async () => {\n const validator = await validatorFactory({handleInvalid: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '022', ind1: ' ', ind2: ' ',\n subfields: [{code: 'l', value: 'foo'}]\n }\n ]\n });\n\n await validator.fix(record);\n\n expect(record.fields).to.eql([\n {\n tag: '022', ind1: ' ', ind2: ' ', subfields: [{code: 'y', value: 'foo'}]\n }\n ]);\n });\n\n it('Trims spaces from value (No hyphenate)', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: ' 9786003770171'}]\n },\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: '9786003770171 (nid.)'}]\n }\n ]\n });\n await validator.fix(record);\n\n expect(record.fields).to.eql([\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '9786003770171'}]},\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '9786003770171'}]}\n ]);\n });\n\n it('Trims spaces and hyphenates value', async () => {\n const validator = await validatorFactory({hyphenateISBN: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: ' 9786003770171'}]\n }\n ]\n });\n await validator.fix(record);\n\n expect(record.fields).to.eql([\n {\n tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '978-600-377-017-1'}]\n }\n ]);\n });\n\n it('Adds hyphens to ISBN', async () => {\n const validator = await validatorFactory({hyphenateISBN: true});\n const record = new MarcRecord({\n fields: [\n {\n tag: '020', ind1: ' ', ind2: ' ',\n subfields: [{code: 'a', value: '9789916605325'}]\n },\n {\n tag: '020', ind1: ' ', ind2: ' ',\n subfields: [{code: 'a', value: '917153086X'}]\n },\n {\n tag: '020', ind1: ' ', ind2: ' ',\n subfields: [{code: 'a', value: '386006004X (nid.)'}]\n }\n ]\n });\n\n await validator.fix(record);\n\n expect(record.fields).to.eql([\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '978-9916-605-32-5'}]},\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '91-7153-086-X'}]},\n {tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '3-86006-004-X'}]}\n ]);\n });\n });\n});\n"],"file":"isbn-issn.spec.js"}
|
|
@@ -11,7 +11,7 @@ exports.default = _default;
|
|
|
11
11
|
*
|
|
12
12
|
* MARC record validators used in Melinda
|
|
13
13
|
*
|
|
14
|
-
* Copyright (c) 2014-
|
|
14
|
+
* Copyright (c) 2014-2022 University Of Helsinki (The National Library Of Finland)
|
|
15
15
|
*
|
|
16
16
|
* This file is part of marc-record-validators-melinda
|
|
17
17
|
*
|
|
@@ -84,8 +84,8 @@ function _default(config) {
|
|
|
84
84
|
configValid(config);
|
|
85
85
|
return {
|
|
86
86
|
description: 'Checks that the record does not contain the configured subfields',
|
|
87
|
-
validate: record =>
|
|
88
|
-
fix: record =>
|
|
87
|
+
validate: record => excludeSubfields(record, config, false),
|
|
88
|
+
fix: record => excludeSubfields(record, config, true)
|
|
89
89
|
}; /// /////////////////////////////////////////
|
|
90
90
|
// These check that configuration is valid
|
|
91
91
|
|
|
@@ -140,7 +140,7 @@ function _default(config) {
|
|
|
140
140
|
// These check that record is valid
|
|
141
141
|
|
|
142
142
|
|
|
143
|
-
function
|
|
143
|
+
function excludeSubfields(record, conf, fix) {
|
|
144
144
|
const res = {
|
|
145
145
|
message: [],
|
|
146
146
|
valid: true
|
|
@@ -185,7 +185,12 @@ function _default(config) {
|
|
|
185
185
|
}
|
|
186
186
|
}
|
|
187
187
|
});
|
|
188
|
-
excluded.forEach(sf => record.removeSubfield(sf, element));
|
|
188
|
+
excluded.forEach(sf => record.removeSubfield(sf, element)); // If no subfields remains, the whole field will be removed as well:
|
|
189
|
+
|
|
190
|
+
if (element.subfields && element.subfields.length === 0) {
|
|
191
|
+
// eslint-disable-line functional/no-conditional-statement
|
|
192
|
+
record.removeField(element);
|
|
193
|
+
}
|
|
189
194
|
});
|
|
190
195
|
}
|
|
191
196
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/subfield-exclusion.js"],"names":["confSpec","tag","type","mandatory","ind1","ind2","subfields","code","value","forEach","obj","fun","Object","entries","isRegExp","re","RegExp","config","Array","isArray","TypeError","configValid","description","validate","record","excludeFields","fix","checkMandatory","key","val","configMatchesSpec","data","spec","Error","subObj","subKey","subVal","conf","res","message","valid","confObj","found","get","element","every","confKey","confField","test","subField","excluded","elemSub","subFieldCodeFine","subFieldValueFine","push","sf","removeSubfield","length"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA,MAAMA,QAAQ,GAAG;AACfC,EAAAA,GAAG,EAAE;AAAE;AACLC,IAAAA,IAAI,EAAE,QADH;AAEHC,IAAAA,SAAS,EAAE;AAFR,GADU;AAKfC,EAAAA,IAAI,EAAE;AAAE;AACNF,IAAAA,IAAI,EAAE,QADF,CACW;;AADX,GALS;AAQfG,EAAAA,IAAI,EAAE;AAAE;AACNH,IAAAA,IAAI,EAAE,QADF,CACW;;AADX,GARS;AAWfI,EAAAA,SAAS,EAAE;AAAE;AACXC,IAAAA,IAAI,EAAE;AACJL,MAAAA,IAAI,EAAE,QADF;AAEJC,MAAAA,SAAS,EAAE;AAFP,KADG;AAKTK,IAAAA,KAAK,EAAE;AACLN,MAAAA,IAAI,EAAE;AADD,KALE;AAQTC,IAAAA,SAAS,EAAE;AARF;AAXI,CAAjB;;AAuBA,SAASM,OAAT,CAAiBC,GAAjB,EAAsBC,GAAtB,EAA2B;AACzBC,EAAAA,MAAM,CAACC,OAAP,CAAeH,GAAf,EAAoBD,OAApB,CAA4BE,GAA5B;AACD;;AAED,SAASG,QAAT,CAAkBC,EAAlB,EAAsB;AACpB,SAAOA,EAAE,YAAYC,MAArB;AACD;;AAEc,kBAAUC,MAAV,EAAkB;AAC/B,MAAI,CAACC,KAAK,CAACC,OAAN,CAAcF,MAAd,CAAL,EAA4B;AAC1B,UAAM,IAAIG,SAAJ,CAAc,kCAAd,CAAN;AACD;;AAEDC,EAAAA,WAAW,CAACJ,MAAD,CAAX;AAEA,SAAO;AACLK,IAAAA,WAAW,EACT,kEAFG;AAGLC,IAAAA,QAAQ,EAAEC,MAAM,IAAIC,aAAa,CAACD,MAAD,EAASP,MAAT,EAAiB,KAAjB,CAH5B;AAILS,IAAAA,GAAG,EAAEF,MAAM,IAAIC,aAAa,CAACD,MAAD,EAASP,MAAT,EAAiB,IAAjB;AAJvB,GAAP,CAP+B,CAc/B;AACA;;AACA,WAASI,WAAT,CAAqBJ,MAArB,EAA6B;AAC3BA,IAAAA,MAAM,CAACR,OAAP,CAAeC,GAAG,IAAI;AACpBiB,MAAAA,cAAc,CAAC3B,QAAD,EAAWU,GAAX,CAAd;AAEAD,MAAAA,OAAO,CAACC,GAAD,EAAM,CAAC,CAACkB,GAAD,EAAMC,GAAN,CAAD,KAAgB;AAC3BC,QAAAA,iBAAiB,CAACD,GAAD,EAAMD,GAAN,EAAW5B,QAAX,CAAjB;AACD,OAFM,CAAP;AAGD,KAND;AAOD,GAxB8B,CA0B/B;;;AACA,WAAS8B,iBAAT,CAA2BC,IAA3B,EAAiCH,GAAjC,EAAsCI,IAAtC,EAA4C;AAC1C;AACA,QAAI,CAACA,IAAI,CAACJ,GAAD,CAAT,EAAgB;AACd,YAAM,IAAIK,KAAJ,CAAW,iDAAgDL,GAAI,EAA/D,CAAN;AACD,KAJyC,CAM1C;;;AACA,QAAI,OAAOG,IAAP,KAAgBC,IAAI,CAACJ,GAAD,CAAJ,CAAU1B,IAA1B,IACD8B,IAAI,CAACJ,GAAD,CAAJ,CAAU1B,IAAV,KAAmB,QAAnB,IAA+B,CAACY,QAAQ,CAACiB,IAAD,CAD3C,EACoD;AAClD,YAAM,IAAIE,KAAJ,CAAW,oDAAmDL,GAAI,EAAlE,CAAN;AACD,KAVyC,CAY1C;;;AACA,QAAIA,GAAG,KAAK,WAAZ,EAAyB;AAAE;AACzBnB,MAAAA,OAAO,CAACsB,IAAD,EAAO,CAAC,GAAGG,MAAH,CAAD,KAAgB;AAC5B;AACA,YAAI,OAAOA,MAAP,KAAkB,QAAlB,IAA8B,CAAChB,KAAK,CAACC,OAAN,CAAce,MAAd,CAAnC,EAA0D;AAAE;AAC1DP,UAAAA,cAAc,CAACK,IAAI,CAACJ,GAAD,CAAL,EAAYM,MAAZ,CAAd;AAEAzB,UAAAA,OAAO,CAACyB,MAAD,EAAS,CAAC,CAACC,MAAD,EAASC,MAAT,CAAD,KAAsB;AACpCN,YAAAA,iBAAiB,CAACM,MAAD,EAASD,MAAT,EAAiBH,IAAI,CAACJ,GAAD,CAArB,CAAjB;AACD,WAFM,CAAP;AAGD,SAND,MAMO;AACL,gBAAM,IAAIR,SAAJ,CAAe,uCAAsCc,MAAO,aAA5D,CAAN;AACD;AACF,OAXM,CAAP;AAYD;AACF;;AAED,WAASP,cAAT,CAAwBK,IAAxB,EAA8BtB,GAA9B,EAAmC;AACjC;AACAD,IAAAA,OAAO,CAACuB,IAAD,EAAO,CAAC,CAACJ,GAAD,EAAMC,GAAN,CAAD,KAAgB;AAC5B,UAAIA,GAAG,CAAC1B,SAAJ,IAAiB,OAAOO,GAAG,CAACkB,GAAD,CAAV,KAAoB,WAAzC,EAAsD;AACpD,cAAM,IAAIK,KAAJ,CAAW,wDAAuDL,GAAI,EAAtE,CAAN;AACD;AACF,KAJM,CAAP;AAKD,GA/D8B,CAgE/B;AAEA;AACA;;;AACA,WAASH,aAAT,CAAuBD,MAAvB,EAA+Ba,IAA/B,EAAqCX,GAArC,EAA0C;AACxC,UAAMY,GAAG,GAAG;AAACC,MAAAA,OAAO,EAAE,EAAV;AAAcC,MAAAA,KAAK,EAAE;AAArB,KAAZ,CADwC,CAGxC;;AACAH,IAAAA,IAAI,CAAC5B,OAAL,CAAagC,OAAO,IAAI;AACtB,YAAMC,KAAK,GAAGlB,MAAM,CAACmB,GAAP,CAAWF,OAAO,CAACxC,GAAnB,CAAd,CADsB,CACiB;AAEvC;;AACAyC,MAAAA,KAAK,CAACjC,OAAN,CAAcmC,OAAO,IAAI;AACvB;AACA,YAAIhC,MAAM,CAACC,OAAP,CAAe4B,OAAf,EAAwBI,KAAxB,CAA8B,CAAC,CAACC,OAAD,EAAUC,SAAV,CAAD,KAA0B;AAC1D;AACA,cAAID,OAAO,KAAK,KAAZ,IAAqBA,OAAO,KAAK,WAArC,EAAkD;AAChD,mBAAO,IAAP;AACD,WAJyD,CAM1D;;;AACA,cAAIF,OAAO,CAACE,OAAD,CAAP,IAAoBhC,QAAQ,CAACiC,SAAD,CAA5B,IAA2CA,SAAS,CAACC,IAAV,CAAeJ,OAAO,CAACE,OAAD,CAAtB,CAA/C,EAAiF;AAC/E,mBAAO,IAAP;AACD,WATyD,CAW1D;;;AACA,iBAAO,KAAP;AACD,SAbG,CAAJ,EAaI;AAAE;AACJ;AACAL,UAAAA,OAAO,CAACnC,SAAR,CAAkBG,OAAlB,CAA0BwC,QAAQ,IAAI;AACpC,kBAAMC,QAAQ,GAAG,EAAjB;AAEAN,YAAAA,OAAO,CAACtC,SAAR,CAAkBG,OAAlB,CAA0B0C,OAAO,IAAI;AACnC;AACA,oBAAMC,gBAAgB,GAAGH,QAAQ,CAAC1C,IAAT,IAAiB4C,OAAO,CAAC5C,IAAzB,IAAiC0C,QAAQ,CAAC1C,IAAT,CAAcyC,IAAd,CAAmBG,OAAO,CAAC5C,IAA3B,CAA1D;AACA,oBAAM8C,iBAAiB,GAAGJ,QAAQ,CAACzC,KAAT,IAAkB2C,OAAO,CAAC3C,KAA1B,IAAmCyC,QAAQ,CAACzC,KAAT,CAAewC,IAAf,CAAoBG,OAAO,CAAC3C,KAA5B,CAA7D;;AACA,kBAAI4C,gBAAgB,KAAK,OAAOH,QAAQ,CAACzC,KAAhB,KAA0B,WAA1B,IAAyC6C,iBAA9C,CAApB,EAAsF;AACpF,oBAAI3B,GAAJ,EAAS;AAAE;AACTwB,kBAAAA,QAAQ,CAACI,IAAT,CAAcH,OAAd,EADO,CACiB;AACzB,iBAFD,MAEO;AAAE;AACPb,kBAAAA,GAAG,CAACC,OAAJ,CAAYe,IAAZ,CAAkB,aAAYV,OAAO,CAAC3C,GAAI,KAAIkD,OAAO,CAAC5C,IAAK,oBAA3D,EADK,CAC4E;AAClF;AACF;AACF,aAXD;AAaA2C,YAAAA,QAAQ,CAACzC,OAAT,CAAiB8C,EAAE,IAAI/B,MAAM,CAACgC,cAAP,CAAsBD,EAAtB,EAA0BX,OAA1B,CAAvB;AACD,WAjBD;AAkBD;AACF,OApCD;AAqCD,KAzCD,EAJwC,CA+CxC;;AACA,QAAI,CAAClB,GAAL,EAAU;AACR,UAAIY,GAAG,CAACC,OAAJ,CAAYkB,MAAZ,GAAqB,CAAzB,EAA4B;AAAE;AAC5BnB,QAAAA,GAAG,CAACE,KAAJ,GAAY,KAAZ,CAD0B,CACP;AACpB;;AAED,aAAOF,GAAP;AACD,KAtDuC,CAuDxC;;AACD;AACF","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-2020 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 Lesser 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 Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser 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\n// Tag (RegExp): Pattern to match the field's tags Mandatory\n// ind1 (RegExp): Pattern to match the field's ind1 property\n// ind2 (RegExp): Pattern to match the field's ind2 property\n// subfields (Array<Object>): An array of objects with the following properties (Mandatory):\n// // code (RegExp): Pattern to match the subfield's code Mandatory\n// // value (RegExp): Pattern to match the subfield's value\n\n// Configuration specification\nconst confSpec = {\n tag: { // Pattern to match the field's tags\n type: 'RegExp',\n mandatory: true\n },\n ind1: { // Pattern to match the field's ind1 property.\n type: 'RegExp' // Array<Indicator>\n },\n ind2: { // Pattern to match the field's ind2 property.\n type: 'RegExp' // Array<Indicator>\n },\n subfields: { // An array of objects with the following properties\n code: {\n type: 'RegExp',\n mandatory: true\n },\n value: {\n type: 'RegExp'\n },\n mandatory: true\n }\n};\n\nfunction forEach(obj, fun) {\n Object.entries(obj).forEach(fun);\n}\n\nfunction isRegExp(re) {\n return re instanceof RegExp;\n}\n\nexport default function (config) {\n if (!Array.isArray(config)) {\n throw new TypeError('Configuration array not provided');\n }\n\n configValid(config);\n\n return {\n description:\n 'Checks that the record does not contain the configured subfields',\n validate: record => excludeFields(record, config, false),\n fix: record => excludeFields(record, config, true)\n };\n\n /// /////////////////////////////////////////\n // These check that configuration is valid\n function configValid(config) {\n config.forEach(obj => {\n checkMandatory(confSpec, obj);\n\n forEach(obj, ([key, val]) => {\n configMatchesSpec(val, key, confSpec);\n });\n });\n }\n\n // Recursive validator\n function configMatchesSpec(data, key, spec) {\n // Field not found in configuration spec\n if (!spec[key]) {\n throw new Error(`Configuration not valid - unidentified value: ${key}`);\n }\n\n // If configuration type does not match type in configuration spec\n if (typeof data !== spec[key].type &&\n (spec[key].type === 'RegExp' && !isRegExp(data))) {\n throw new Error(`Configuration not valid - invalid data type for: ${key}`);\n }\n\n // Check subfields recursively\n if (key === 'subfields') { // eslint-disable-line functional/no-conditional-statement\n forEach(data, ([, subObj]) => {\n // Console.log(\"subObj: \", subObj, \" type: \", typeof subObj, !(Array.isArray(subObj)))\n if (typeof subObj === 'object' && !Array.isArray(subObj)) { // eslint-disable-line functional/no-conditional-statement\n checkMandatory(spec[key], subObj);\n\n forEach(subObj, ([subKey, subVal]) => {\n configMatchesSpec(subVal, subKey, spec[key]);\n });\n } else {\n throw new TypeError(`Configuration not valid - subfield: ${subObj} not object`);\n }\n });\n }\n }\n\n function checkMandatory(spec, obj) {\n // Check if all mandatory fields are present\n forEach(spec, ([key, val]) => {\n if (val.mandatory && typeof obj[key] === 'undefined') {\n throw new Error(`Configuration not valid - missing mandatory element: ${key}`);\n }\n });\n }\n /// /////////////////////////////////////////\n\n /// /////////////////////////////////////////\n // These check that record is valid\n function excludeFields(record, conf, fix) {\n const res = {message: [], valid: true};\n\n // Parse trough every element of config array\n conf.forEach(confObj => {\n const found = record.get(confObj.tag); // Find matching record fields based on mandatory tag\n\n // Check if some of found record fields matches all configuration fields\n found.forEach(element => {\n // Compare each found element against each configuration object\n if (Object.entries(confObj).every(([confKey, confField]) => {\n // Tag already checked at .get(), subfields later\n if (confKey === 'tag' || confKey === 'subfields') {\n return true;\n }\n\n // Configuration object is RegExp and record value matches it\n if (element[confKey] && isRegExp(confField) && confField.test(element[confKey])) {\n return true;\n }\n\n // Configuration object not found from found element\n return false;\n })) { // eslint-disable-line functional/no-conditional-statement\n // All configuration fields match, check if some subfields should be excluded.\n confObj.subfields.forEach(subField => {\n const excluded = [];\n\n element.subfields.forEach(elemSub => {\n // Check if subfield matches configuration spec\n const subFieldCodeFine = subField.code && elemSub.code && subField.code.test(elemSub.code);\n const subFieldValueFine = subField.value && elemSub.value && subField.value.test(elemSub.value);\n if (subFieldCodeFine && (typeof subField.value === 'undefined' || subFieldValueFine)) {\n if (fix) { // eslint-disable-line functional/no-conditional-statement\n excluded.push(elemSub); // eslint-disable-line functional/immutable-data\n } else { // eslint-disable-line functional/no-conditional-statement\n res.message.push(`Subfield $${element.tag}$$${elemSub.code}should be excluded`); // eslint-disable-line functional/immutable-data\n }\n }\n });\n\n excluded.forEach(sf => record.removeSubfield(sf, element));\n });\n }\n });\n });\n\n // Fix does not send response\n if (!fix) {\n if (res.message.length > 0) { // eslint-disable-line functional/no-conditional-statement\n res.valid = false; // eslint-disable-line functional/immutable-data\n }\n\n return res;\n }\n // Res.fix.push('Field $' + element.tag + ' excluded');\n }\n}\n"],"file":"subfield-exclusion.js"}
|
|
1
|
+
{"version":3,"sources":["../src/subfield-exclusion.js"],"names":["confSpec","tag","type","mandatory","ind1","ind2","subfields","code","value","forEach","obj","fun","Object","entries","isRegExp","re","RegExp","config","Array","isArray","TypeError","configValid","description","validate","record","excludeSubfields","fix","checkMandatory","key","val","configMatchesSpec","data","spec","Error","subObj","subKey","subVal","conf","res","message","valid","confObj","found","get","element","every","confKey","confField","test","subField","excluded","elemSub","subFieldCodeFine","subFieldValueFine","push","sf","removeSubfield","length","removeField"],"mappings":"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","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-2022 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 Lesser 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 Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser 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\n// Tag (RegExp): Pattern to match the field's tags Mandatory\n// ind1 (RegExp): Pattern to match the field's ind1 property\n// ind2 (RegExp): Pattern to match the field's ind2 property\n// subfields (Array<Object>): An array of objects with the following properties (Mandatory):\n// // code (RegExp): Pattern to match the subfield's code Mandatory\n// // value (RegExp): Pattern to match the subfield's value\n\n// Configuration specification\nconst confSpec = {\n tag: { // Pattern to match the field's tags\n type: 'RegExp',\n mandatory: true\n },\n ind1: { // Pattern to match the field's ind1 property.\n type: 'RegExp' // Array<Indicator>\n },\n ind2: { // Pattern to match the field's ind2 property.\n type: 'RegExp' // Array<Indicator>\n },\n subfields: { // An array of objects with the following properties\n code: {\n type: 'RegExp',\n mandatory: true\n },\n value: {\n type: 'RegExp'\n },\n mandatory: true\n }\n};\n\nfunction forEach(obj, fun) {\n Object.entries(obj).forEach(fun);\n}\n\nfunction isRegExp(re) {\n return re instanceof RegExp;\n}\n\nexport default function (config) {\n if (!Array.isArray(config)) {\n throw new TypeError('Configuration array not provided');\n }\n\n configValid(config);\n\n return {\n description:\n 'Checks that the record does not contain the configured subfields',\n validate: record => excludeSubfields(record, config, false),\n fix: record => excludeSubfields(record, config, true)\n };\n\n /// /////////////////////////////////////////\n // These check that configuration is valid\n function configValid(config) {\n config.forEach(obj => {\n checkMandatory(confSpec, obj);\n\n forEach(obj, ([key, val]) => {\n configMatchesSpec(val, key, confSpec);\n });\n });\n }\n\n // Recursive validator\n function configMatchesSpec(data, key, spec) {\n // Field not found in configuration spec\n if (!spec[key]) {\n throw new Error(`Configuration not valid - unidentified value: ${key}`);\n }\n\n // If configuration type does not match type in configuration spec\n if (typeof data !== spec[key].type &&\n (spec[key].type === 'RegExp' && !isRegExp(data))) {\n throw new Error(`Configuration not valid - invalid data type for: ${key}`);\n }\n\n // Check subfields recursively\n if (key === 'subfields') { // eslint-disable-line functional/no-conditional-statement\n forEach(data, ([, subObj]) => {\n // Console.log(\"subObj: \", subObj, \" type: \", typeof subObj, !(Array.isArray(subObj)))\n if (typeof subObj === 'object' && !Array.isArray(subObj)) { // eslint-disable-line functional/no-conditional-statement\n checkMandatory(spec[key], subObj);\n\n forEach(subObj, ([subKey, subVal]) => {\n configMatchesSpec(subVal, subKey, spec[key]);\n });\n } else {\n throw new TypeError(`Configuration not valid - subfield: ${subObj} not object`);\n }\n });\n }\n }\n\n function checkMandatory(spec, obj) {\n // Check if all mandatory fields are present\n forEach(spec, ([key, val]) => {\n if (val.mandatory && typeof obj[key] === 'undefined') {\n throw new Error(`Configuration not valid - missing mandatory element: ${key}`);\n }\n });\n }\n /// /////////////////////////////////////////\n\n /// /////////////////////////////////////////\n // These check that record is valid\n function excludeSubfields(record, conf, fix) {\n const res = {message: [], valid: true};\n\n // Parse trough every element of config array\n conf.forEach(confObj => {\n const found = record.get(confObj.tag); // Find matching record fields based on mandatory tag\n\n // Check if some of found record fields matches all configuration fields\n found.forEach(element => {\n // Compare each found element against each configuration object\n if (Object.entries(confObj).every(([confKey, confField]) => {\n // Tag already checked at .get(), subfields later\n if (confKey === 'tag' || confKey === 'subfields') {\n return true;\n }\n\n // Configuration object is RegExp and record value matches it\n if (element[confKey] && isRegExp(confField) && confField.test(element[confKey])) {\n return true;\n }\n\n // Configuration object not found from found element\n return false;\n })) { // eslint-disable-line functional/no-conditional-statement\n // All configuration fields match, check if some subfields should be excluded.\n confObj.subfields.forEach(subField => {\n const excluded = [];\n\n element.subfields.forEach(elemSub => {\n // Check if subfield matches configuration spec\n const subFieldCodeFine = subField.code && elemSub.code && subField.code.test(elemSub.code);\n const subFieldValueFine = subField.value && elemSub.value && subField.value.test(elemSub.value);\n if (subFieldCodeFine && (typeof subField.value === 'undefined' || subFieldValueFine)) {\n if (fix) { // eslint-disable-line functional/no-conditional-statement\n excluded.push(elemSub); // eslint-disable-line functional/immutable-data\n } else { // eslint-disable-line functional/no-conditional-statement\n res.message.push(`Subfield $${element.tag}$$${elemSub.code}should be excluded`); // eslint-disable-line functional/immutable-data\n }\n }\n });\n\n excluded.forEach(sf => record.removeSubfield(sf, element));\n // If no subfields remains, the whole field will be removed as well:\n if (element.subfields && element.subfields.length === 0) { // eslint-disable-line functional/no-conditional-statement\n record.removeField(element);\n }\n });\n }\n });\n });\n\n // Fix does not send response\n if (!fix) {\n if (res.message.length > 0) { // eslint-disable-line functional/no-conditional-statement\n res.valid = false; // eslint-disable-line functional/immutable-data\n }\n\n return res;\n }\n // Res.fix.push('Field $' + element.tag + ' excluded');\n }\n}\n"],"file":"subfield-exclusion.js"}
|
|
@@ -14,7 +14,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
14
14
|
*
|
|
15
15
|
* MARC record validators used in Melinda
|
|
16
16
|
*
|
|
17
|
-
* Copyright (c) 2014-
|
|
17
|
+
* Copyright (c) 2014-2022 University Of Helsinki (The National Library Of Finland)
|
|
18
18
|
*
|
|
19
19
|
* This file is part of marc-record-validators-melinda
|
|
20
20
|
*
|
|
@@ -308,6 +308,60 @@ describe('subfield-exclusion', () => {
|
|
|
308
308
|
await validator.fix(recordInvalid);
|
|
309
309
|
(0, _chai.expect)(recordInvalid.equalsTo(recordInvalidFixed)).to.eql(true);
|
|
310
310
|
});
|
|
311
|
+
});
|
|
312
|
+
describe('#validate: Remove only subfield -> remove field as well', () => {
|
|
313
|
+
const config = [{
|
|
314
|
+
tag: /^041$/u,
|
|
315
|
+
subfields: [{
|
|
316
|
+
code: /^[ad]$/u,
|
|
317
|
+
value: /^zxx$/u
|
|
318
|
+
}]
|
|
319
|
+
}];
|
|
320
|
+
const recordOriginal = new _marcRecord.MarcRecord({
|
|
321
|
+
leader: 'foo',
|
|
322
|
+
fields: [{
|
|
323
|
+
tag: '041',
|
|
324
|
+
ind1: ' ',
|
|
325
|
+
ind2: ' ',
|
|
326
|
+
subfields: [{
|
|
327
|
+
code: 'a',
|
|
328
|
+
value: 'zxx'
|
|
329
|
+
}]
|
|
330
|
+
}, {
|
|
331
|
+
tag: '245',
|
|
332
|
+
ind1: ' ',
|
|
333
|
+
ind2: ' ',
|
|
334
|
+
subfields: [{
|
|
335
|
+
code: 'a',
|
|
336
|
+
value: 'Fubar'
|
|
337
|
+
}]
|
|
338
|
+
}]
|
|
339
|
+
});
|
|
340
|
+
const recordModified = new _marcRecord.MarcRecord({
|
|
341
|
+
leader: 'foo',
|
|
342
|
+
fields: [{
|
|
343
|
+
tag: '245',
|
|
344
|
+
ind1: ' ',
|
|
345
|
+
ind2: ' ',
|
|
346
|
+
subfields: [{
|
|
347
|
+
code: 'a',
|
|
348
|
+
value: 'Fubar'
|
|
349
|
+
}]
|
|
350
|
+
}]
|
|
351
|
+
});
|
|
352
|
+
it('Finds the record with 041$a zxx invalid (spec)', async () => {
|
|
353
|
+
const validator = await (0, _subfieldExclusion.default)(config);
|
|
354
|
+
const result = await validator.validate(recordOriginal);
|
|
355
|
+
(0, _chai.expect)(result).to.eql({
|
|
356
|
+
valid: false,
|
|
357
|
+
message: ['Subfield $041$$ashould be excluded']
|
|
358
|
+
});
|
|
359
|
+
});
|
|
360
|
+
it('Repairs invalid record', async () => {
|
|
361
|
+
const validator = await (0, _subfieldExclusion.default)(config);
|
|
362
|
+
await validator.fix(recordOriginal);
|
|
363
|
+
(0, _chai.expect)(recordOriginal.equalsTo(recordModified)).to.eql(true);
|
|
364
|
+
});
|
|
311
365
|
}); // Complex configuration https://github.com/NatLibFi/marc-record-validators-melinda/issues/46
|
|
312
366
|
|
|
313
367
|
describe('#validate: Complex configuration (spec)', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/subfield-exclusion.spec.js"],"names":["describe","it","config","tag","subfields","code","validator","to","be","an","that","has","any","keys","description","a","validate","ind2","value","error","with","property","unidentified","recordValid","MarcRecord","leader","fields","ind1","recordInvalid","recordInvalidFixed","result","eql","valid","message","fix","equalsTo","configInd","recordIndInvalid","recordIndInvalidFixed"],"mappings":"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","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-2020 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 Lesser 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 Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser 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\nimport {expect} from 'chai';\n//import chaiAsPromised from 'chai-as-promised';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/subfield-exclusion';\n\n//chai.use(chaiAsPromised);\n\n// Factory validation\ndescribe('subfield-exclusion', () => {\n describe('#validate: Check configuration validation', () => {\n it('Creates a validator from simple config', async () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [{code: /4/u}]\n }\n ];\n\n const validator = await validatorFactory(config);\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n it('Creates a validator from complex config', async () => {\n const config = [\n {\n tag: /^210$/u,\n ind2: /\\s/u,\n subfields: [\n {\n code: /2/u,\n value: /.+/u\n }\n ]\n }\n ];\n\n const validator = await validatorFactory(config);\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n it('Fails to create a validator from invalid config - subfields missing', () => {\n const config = [\n {\n tag: /^210$/u\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - missing mandatory element: subfields');\n }\n });\n\n it('Fails to create a validator from invalid config - tag', () => {\n const config = [\n {\n tag: '500',\n subfields: [{code: /9/u, value: /^(?!FENNI<KEEP>).*$/u}]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - invalid data type for: tag');\n }\n });\n\n it('Fails to create a validator from invalid config - missing array', () => {\n const config = {\n tag: '500',\n subfields: [{code: /9/u, value: /^(?!FENNI<KEEP>).*$/u}]\n };\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration array not provided');\n }\n });\n\n it('Fails to create a validator from invalid config - code', () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [{code: 9, value: /^(?!FENNI<KEEP>).*$/u}]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - invalid data type for: code');\n }\n });\n\n it('Fails to create a validator from invalid config - value', () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [{code: /9/u, value: 'Fenni'}]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - invalid data type for: value');\n }\n });\n\n\n it('Fails to create a validator from invalid config - missing mandatory: tag', () => {\n const config = [\n {\n value: /^500$/u,\n subfields: [{code: /9/u, value: /^(?!FENNI<KEEP>).*$/u}]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - missing mandatory element: tag');\n }\n });\n\n it('Fails to create a validator from invalid config - subfield not object: array', () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [\n ['/9/', '/^(?!FENNI<KEEP>).*$/'],\n {value: /^(?!FENNI<KEEP>).*$/u}\n ]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - subfield: /9/,/^(?!FENNI<KEEP>).*$/ not object');\n }\n });\n\n it('Fails to create a validator from invalid config - subfield not object: string', () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [\n '/9/',\n '/^(?!FENNI<KEEP>).*$/',\n {value: /^(?!FENNI<KEEP>).*$/u}\n ]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - subfield: /9/ not object');\n }\n });\n\n it('Fails to create a validator from invalid config - missing mandatory: subfield.code', () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [\n {code: /9/u, value: /^(?!FENNI<KEEP>).*$/u},\n {value: /^(?!FENNI<KEEP>).*$/u}\n ]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - missing mandatory element: code');\n }\n });\n\n it('Fails to create a validator from invalid config - unidentified field: unidentified', () => {\n const config = [\n {\n tag: /^500$/u,\n unidentified: /^500$/u,\n subfields: [\n {code: /9/u, value: /^(?!FENNI<KEEP>).*$/u},\n {value: /^(?!FENNI<KEEP>).*$/u}\n ]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - unidentified value: unidentified');\n }\n });\n });\n\n // Simple configuration https://github.com/NatLibFi/marc-record-validators-melinda/issues/46\n describe('#validate: Simple configuration (spec)', () => {\n const config = [\n {\n tag: /^100$/u,\n subfields: [{code: /4/u}]\n }\n ];\n\n const recordValid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Foo Bar'}]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n const recordInvalid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Foo Bar'},\n {code: '4', value: 'att'}\n ]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n const recordInvalidFixed = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Foo Bar'}]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n it('Finds the record valid (spec)', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordValid);\n expect(result).to.eql({valid: true, message: []});\n });\n\n it('Finds the record invalid (spec)', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordInvalid);\n expect(result).to.eql({valid: false, message: ['Subfield $100$$4should be excluded']});\n });\n\n it('Repairs invalid record', async () => {\n const validator = await validatorFactory(config);\n await validator.fix(recordInvalid);\n expect(recordInvalid.equalsTo(recordInvalidFixed)).to.eql(true);\n });\n });\n\n // Complex configuration https://github.com/NatLibFi/marc-record-validators-melinda/issues/46\n describe('#validate: Complex configuration (spec)', () => {\n const config = [\n {\n tag: /^210$/u,\n ind2: /\\s/u,\n subfields: [{code: /2/u, value: /.+/u}]\n }\n ];\n\n const recordValid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '210',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Foo'}]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n const recordInvalid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '210',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Foo'},\n {code: '2', value: 'dnlm'}\n ]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n const recordInvalidFixed = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '210',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Foo'}]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n it('Finds the record valid (spec)', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordValid);\n expect(result).to.eql({valid: true, message: []});\n });\n\n it('Finds the record invalid (spec)', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordInvalid);\n expect(result).to.eql({valid: false, message: ['Subfield $210$$2should be excluded']});\n });\n\n it('Repairs invalid record', async () => {\n const validator = await validatorFactory(config);\n await validator.fix(recordInvalid);\n expect(recordInvalid.equalsTo(recordInvalidFixed)).to.eql(true);\n });\n });\n\n // More special cases to increase coverage\n describe('#validate: Custom configuration', () => {\n const configInd = [\n {\n tag: /^500$/u,\n ind1: /^8$/u,\n ind2: /^4$/u,\n subfields: [{code: /2/u, value: /.+/u}]\n }\n ];\n\n const recordValid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '210',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Foo'}]\n }, {\n tag: '500',\n subfields: [\n {code: 'a', value: 'Foo'},\n {code: '2', value: 'dnlm'}\n ]\n }\n ]\n });\n\n const recordIndInvalid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }, {\n tag: '500',\n ind1: '8',\n ind2: '4',\n subfields: [\n {code: 'a', value: 'Foo'},\n {code: '2', value: 'dnlm'}\n ]\n }\n ]\n });\n\n const recordIndInvalidFixed = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }, {\n tag: '500',\n ind1: '8',\n ind2: '4',\n subfields: [{code: 'a', value: 'Foo'}]\n }\n ]\n });\n\n it('Finds the record valid - Ind1&Ind2', async () => {\n const validator = await validatorFactory(configInd);\n const result = await validator.validate(recordValid);\n expect(result).to.eql({valid: true, message: []});\n });\n\n it('Finds the record invalid - Ind', async () => {\n const validator = await validatorFactory(configInd);\n const result = await validator.validate(recordIndInvalid);\n expect(result).to.eql({valid: false, message: ['Subfield $500$$2should be excluded']});\n });\n\n it('Repairs invalid record', async () => {\n const validator = await validatorFactory(configInd);\n await validator.fix(recordIndInvalid);\n expect(recordIndInvalid.equalsTo(recordIndInvalidFixed)).to.eql(true);\n });\n });\n});\n"],"file":"subfield-exclusion.spec.js"}
|
|
1
|
+
{"version":3,"sources":["../src/subfield-exclusion.spec.js"],"names":["describe","it","config","tag","subfields","code","validator","to","be","an","that","has","any","keys","description","a","validate","ind2","value","error","with","property","unidentified","recordValid","MarcRecord","leader","fields","ind1","recordInvalid","recordInvalidFixed","result","eql","valid","message","fix","equalsTo","recordOriginal","recordModified","configInd","recordIndInvalid","recordIndInvalidFixed"],"mappings":"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","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-2022 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 Lesser 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 Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser 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\nimport {expect} from 'chai';\n//import chaiAsPromised from 'chai-as-promised';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/subfield-exclusion';\n\n//chai.use(chaiAsPromised);\n\n// Factory validation\ndescribe('subfield-exclusion', () => {\n describe('#validate: Check configuration validation', () => {\n it('Creates a validator from simple config', async () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [{code: /4/u}]\n }\n ];\n\n const validator = await validatorFactory(config);\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n it('Creates a validator from complex config', async () => {\n const config = [\n {\n tag: /^210$/u,\n ind2: /\\s/u,\n subfields: [\n {\n code: /2/u,\n value: /.+/u\n }\n ]\n }\n ];\n\n const validator = await validatorFactory(config);\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n it('Fails to create a validator from invalid config - subfields missing', () => {\n const config = [\n {\n tag: /^210$/u\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - missing mandatory element: subfields');\n }\n });\n\n it('Fails to create a validator from invalid config - tag', () => {\n const config = [\n {\n tag: '500',\n subfields: [{code: /9/u, value: /^(?!FENNI<KEEP>).*$/u}]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - invalid data type for: tag');\n }\n });\n\n it('Fails to create a validator from invalid config - missing array', () => {\n const config = {\n tag: '500',\n subfields: [{code: /9/u, value: /^(?!FENNI<KEEP>).*$/u}]\n };\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration array not provided');\n }\n });\n\n it('Fails to create a validator from invalid config - code', () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [{code: 9, value: /^(?!FENNI<KEEP>).*$/u}]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - invalid data type for: code');\n }\n });\n\n it('Fails to create a validator from invalid config - value', () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [{code: /9/u, value: 'Fenni'}]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - invalid data type for: value');\n }\n });\n\n\n it('Fails to create a validator from invalid config - missing mandatory: tag', () => {\n const config = [\n {\n value: /^500$/u,\n subfields: [{code: /9/u, value: /^(?!FENNI<KEEP>).*$/u}]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - missing mandatory element: tag');\n }\n });\n\n it('Fails to create a validator from invalid config - subfield not object: array', () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [\n ['/9/', '/^(?!FENNI<KEEP>).*$/'],\n {value: /^(?!FENNI<KEEP>).*$/u}\n ]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - subfield: /9/,/^(?!FENNI<KEEP>).*$/ not object');\n }\n });\n\n it('Fails to create a validator from invalid config - subfield not object: string', () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [\n '/9/',\n '/^(?!FENNI<KEEP>).*$/',\n {value: /^(?!FENNI<KEEP>).*$/u}\n ]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - subfield: /9/ not object');\n }\n });\n\n it('Fails to create a validator from invalid config - missing mandatory: subfield.code', () => {\n const config = [\n {\n tag: /^500$/u,\n subfields: [\n {code: /9/u, value: /^(?!FENNI<KEEP>).*$/u},\n {value: /^(?!FENNI<KEEP>).*$/u}\n ]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - missing mandatory element: code');\n }\n });\n\n it('Fails to create a validator from invalid config - unidentified field: unidentified', () => {\n const config = [\n {\n tag: /^500$/u,\n unidentified: /^500$/u,\n subfields: [\n {code: /9/u, value: /^(?!FENNI<KEEP>).*$/u},\n {value: /^(?!FENNI<KEEP>).*$/u}\n ]\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - unidentified value: unidentified');\n }\n });\n });\n\n // Simple configuration https://github.com/NatLibFi/marc-record-validators-melinda/issues/46\n describe('#validate: Simple configuration (spec)', () => {\n const config = [\n {\n tag: /^100$/u,\n subfields: [{code: /4/u}]\n }\n ];\n\n const recordValid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Foo Bar'}]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n const recordInvalid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Foo Bar'},\n {code: '4', value: 'att'}\n ]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n const recordInvalidFixed = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Foo Bar'}]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n it('Finds the record valid (spec)', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordValid);\n expect(result).to.eql({valid: true, message: []});\n });\n\n it('Finds the record invalid (spec)', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordInvalid);\n expect(result).to.eql({valid: false, message: ['Subfield $100$$4should be excluded']});\n });\n\n it('Repairs invalid record', async () => {\n const validator = await validatorFactory(config);\n await validator.fix(recordInvalid);\n expect(recordInvalid.equalsTo(recordInvalidFixed)).to.eql(true);\n });\n });\n\n\n describe('#validate: Remove only subfield -> remove field as well', () => {\n const config = [\n {\n tag: /^041$/u,\n subfields: [{code: /^[ad]$/u, value: /^zxx$/u}]\n }\n ];\n\n const recordOriginal = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '041',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'zxx'}]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n const recordModified = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n it('Finds the record with 041$a zxx invalid (spec)', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordOriginal);\n expect(result).to.eql({valid: false, message: ['Subfield $041$$ashould be excluded']});\n });\n\n it('Repairs invalid record', async () => {\n const validator = await validatorFactory(config);\n await validator.fix(recordOriginal);\n expect(recordOriginal.equalsTo(recordModified)).to.eql(true);\n });\n });\n\n // Complex configuration https://github.com/NatLibFi/marc-record-validators-melinda/issues/46\n describe('#validate: Complex configuration (spec)', () => {\n const config = [\n {\n tag: /^210$/u,\n ind2: /\\s/u,\n subfields: [{code: /2/u, value: /.+/u}]\n }\n ];\n\n const recordValid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '210',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Foo'}]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n const recordInvalid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '210',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {code: 'a', value: 'Foo'},\n {code: '2', value: 'dnlm'}\n ]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n const recordInvalidFixed = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '210',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Foo'}]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }\n ]\n });\n\n it('Finds the record valid (spec)', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordValid);\n expect(result).to.eql({valid: true, message: []});\n });\n\n it('Finds the record invalid (spec)', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordInvalid);\n expect(result).to.eql({valid: false, message: ['Subfield $210$$2should be excluded']});\n });\n\n it('Repairs invalid record', async () => {\n const validator = await validatorFactory(config);\n await validator.fix(recordInvalid);\n expect(recordInvalid.equalsTo(recordInvalidFixed)).to.eql(true);\n });\n });\n\n // More special cases to increase coverage\n describe('#validate: Custom configuration', () => {\n const configInd = [\n {\n tag: /^500$/u,\n ind1: /^8$/u,\n ind2: /^4$/u,\n subfields: [{code: /2/u, value: /.+/u}]\n }\n ];\n\n const recordValid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '210',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Foo'}]\n }, {\n tag: '500',\n subfields: [\n {code: 'a', value: 'Foo'},\n {code: '2', value: 'dnlm'}\n ]\n }\n ]\n });\n\n const recordIndInvalid = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }, {\n tag: '500',\n ind1: '8',\n ind2: '4',\n subfields: [\n {code: 'a', value: 'Foo'},\n {code: '2', value: 'dnlm'}\n ]\n }\n ]\n });\n\n const recordIndInvalidFixed = new MarcRecord({\n leader: 'foo',\n fields: [\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [{code: 'a', value: 'Fubar'}]\n }, {\n tag: '500',\n ind1: '8',\n ind2: '4',\n subfields: [{code: 'a', value: 'Foo'}]\n }\n ]\n });\n\n it('Finds the record valid - Ind1&Ind2', async () => {\n const validator = await validatorFactory(configInd);\n const result = await validator.validate(recordValid);\n expect(result).to.eql({valid: true, message: []});\n });\n\n it('Finds the record invalid - Ind', async () => {\n const validator = await validatorFactory(configInd);\n const result = await validator.validate(recordIndInvalid);\n expect(result).to.eql({valid: false, message: ['Subfield $500$$2should be excluded']});\n });\n\n it('Repairs invalid record', async () => {\n const validator = await validatorFactory(configInd);\n await validator.fix(recordIndInvalid);\n expect(recordIndInvalid.equalsTo(recordIndInvalidFixed)).to.eql(true);\n });\n });\n});\n"],"file":"subfield-exclusion.spec.js"}
|
package/package.json
CHANGED
package/src/isbn-issn.js
CHANGED
|
@@ -37,49 +37,67 @@ export default ({hyphenateISBN = false, handleInvalid = false} = {}) => {
|
|
|
37
37
|
|
|
38
38
|
function getInvalidFields(record) {
|
|
39
39
|
return record.get(/^(020|022)$/u).filter(field => { // eslint-disable-line prefer-named-capture-group
|
|
40
|
+
// Check ISBN:
|
|
40
41
|
if (field.tag === '020') {
|
|
41
|
-
|
|
42
|
-
const sfZ = field.subfields.find(sf => sf.code === 'z');
|
|
43
|
-
|
|
44
|
-
if (subfield === undefined) {
|
|
45
|
-
if (sfZ) {
|
|
46
|
-
return false;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return true;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// If value contains space
|
|
53
|
-
if (subfield.value.indexOf(' ') > -1) {
|
|
42
|
+
if (invalidField020(field)) {
|
|
54
43
|
return true;
|
|
55
44
|
}
|
|
56
45
|
|
|
46
|
+
const subfield = field.subfields.find(sf => sf.code === 'a');
|
|
57
47
|
const auditedIsbn = ISBN.audit(subfield.value);
|
|
58
48
|
if (!auditedIsbn.validIsbn) {
|
|
59
49
|
return true;
|
|
60
50
|
}
|
|
61
|
-
|
|
51
|
+
// Should we refactor code by adding a function that returns legal set of values,
|
|
52
|
+
// and then we compare subfield.value against that list?
|
|
62
53
|
const parsedIsbn = ISBN.parse(subfield.value);
|
|
63
54
|
if (hyphenateISBN) {
|
|
64
|
-
return subfield.value
|
|
55
|
+
return !(subfield.value === parsedIsbn.isbn10h || subfield.value === parsedIsbn.isbn13h);
|
|
65
56
|
}
|
|
66
57
|
|
|
67
|
-
return subfield.value
|
|
58
|
+
return !(subfield.value === parsedIsbn.isbn10 || subfield.value === parsedIsbn.isbn13);
|
|
59
|
+
}
|
|
60
|
+
// Check ISSN:
|
|
61
|
+
if (invalidField022(field)) {
|
|
62
|
+
return true;
|
|
68
63
|
}
|
|
69
64
|
|
|
70
65
|
const subfield = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');
|
|
71
|
-
const sfY = field.subfields.find(sf => sf.code === 'y');
|
|
72
66
|
|
|
73
|
-
|
|
74
|
-
|
|
67
|
+
return !validateISSN(subfield.value);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
function invalidField020(field) {
|
|
71
|
+
const subfieldA = field.subfields.find(sf => sf.code === 'a');
|
|
72
|
+
|
|
73
|
+
if (subfieldA === undefined) {
|
|
74
|
+
const subfieldZ = field.subfields.find(sf => sf.code === 'z');
|
|
75
|
+
if (subfieldZ !== undefined) {
|
|
75
76
|
return false;
|
|
76
77
|
}
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
77
80
|
|
|
81
|
+
// If value contains space, it's not ok (it's typically something like "1234567890 (nid.)")
|
|
82
|
+
if (subfieldA.value.indexOf(' ') > -1) {
|
|
78
83
|
return true;
|
|
79
84
|
}
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
80
87
|
|
|
81
|
-
|
|
82
|
-
|
|
88
|
+
function invalidField022(field) {
|
|
89
|
+
const subfieldAorL = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');
|
|
90
|
+
|
|
91
|
+
if (subfieldAorL === undefined) {
|
|
92
|
+
const subfieldY = field.subfields.find(sf => sf.code === 'y');
|
|
93
|
+
if (subfieldY) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
83
101
|
}
|
|
84
102
|
|
|
85
103
|
function validate(record) {
|
|
@@ -92,9 +110,9 @@ export default ({hyphenateISBN = false, handleInvalid = false} = {}) => {
|
|
|
92
110
|
return fields
|
|
93
111
|
.map(field => {
|
|
94
112
|
if (field.tag === '020') {
|
|
95
|
-
const
|
|
96
|
-
if (
|
|
97
|
-
return {name: 'ISBN', value:
|
|
113
|
+
const subfieldA = field.subfields.find(sf => sf.code === 'a');
|
|
114
|
+
if (subfieldA) {
|
|
115
|
+
return {name: 'ISBN', value: subfieldA.value};
|
|
98
116
|
}
|
|
99
117
|
|
|
100
118
|
return {name: 'ISBN', value: undefined};
|
|
@@ -103,10 +121,10 @@ export default ({hyphenateISBN = false, handleInvalid = false} = {}) => {
|
|
|
103
121
|
return {name: 'ISSN', value: getISSN()};
|
|
104
122
|
|
|
105
123
|
function getISSN() {
|
|
106
|
-
const
|
|
124
|
+
const subfieldAorL = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');
|
|
107
125
|
|
|
108
|
-
if (
|
|
109
|
-
return
|
|
126
|
+
if (subfieldAorL) {
|
|
127
|
+
return subfieldAorL.value;
|
|
110
128
|
}
|
|
111
129
|
|
|
112
130
|
return undefined;
|
|
@@ -126,18 +144,11 @@ export default ({hyphenateISBN = false, handleInvalid = false} = {}) => {
|
|
|
126
144
|
const subfield = field.subfields.find(sf => sf.code === 'a');
|
|
127
145
|
if (subfield) {
|
|
128
146
|
// ISBN is valid but is missing hyphens
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
const parsedIsbn = ISBN.parse(trimmedValue);
|
|
133
|
-
if (hyphenateISBN) { // eslint-disable-line functional/no-conditional-statement
|
|
134
|
-
subfield.value = parsedIsbn.isbn13h; // eslint-disable-line functional/immutable-data
|
|
135
|
-
} else { // eslint-disable-line functional/no-conditional-statement
|
|
136
|
-
// Just trim
|
|
137
|
-
subfield.value = parsedIsbn.isbn13; // eslint-disable-line functional/immutable-data
|
|
138
|
-
}
|
|
147
|
+
const normalizedValue = normalizeIsbnValue(subfield.value);
|
|
148
|
+
if (normalizedValue !== undefined) { // eslint-disable-line functional/no-conditional-statement
|
|
149
|
+
subfield.value = normalizedValue; // eslint-disable-line functional/immutable-data
|
|
139
150
|
} else if (handleInvalid) { // eslint-disable-line functional/no-conditional-statement
|
|
140
|
-
field.subfields.push({code: 'z', value:
|
|
151
|
+
field.subfields.push({code: 'z', value: subfield.value}); // eslint-disable-line functional/immutable-data
|
|
141
152
|
record.removeSubfield(subfield, field);
|
|
142
153
|
}
|
|
143
154
|
}
|
|
@@ -150,8 +161,26 @@ export default ({hyphenateISBN = false, handleInvalid = false} = {}) => {
|
|
|
150
161
|
}
|
|
151
162
|
});
|
|
152
163
|
|
|
164
|
+
function normalizeIsbnValue(value) {
|
|
165
|
+
const trimmedValue = trimISBN(value); // NB! This might lose information that should be stored in $q...
|
|
166
|
+
const auditResult = ISBN.audit(trimmedValue);
|
|
167
|
+
if (auditResult.validIsbn) {
|
|
168
|
+
const parsedIsbn = ISBN.parse(trimmedValue);
|
|
169
|
+
if (hyphenateISBN) { // eslint-disable-line functional/no-conditional-statement
|
|
170
|
+
return trimmedValue.length === 10 ? parsedIsbn.isbn10h : parsedIsbn.isbn13h; // eslint-disable-line functional/immutable-data
|
|
171
|
+
}
|
|
172
|
+
// Just trim
|
|
173
|
+
return trimmedValue.length === 10 ? parsedIsbn.isbn10 : parsedIsbn.isbn13; // eslint-disable-line functional/immutable-data
|
|
174
|
+
}
|
|
175
|
+
return undefined;
|
|
176
|
+
}
|
|
177
|
+
|
|
153
178
|
function trimSpaces(value) {
|
|
154
179
|
return value.replace(/\s/gu, '');
|
|
155
180
|
}
|
|
181
|
+
|
|
182
|
+
function trimISBN(value) {
|
|
183
|
+
return trimSpaces(value.replace(/\s\D+$/gu, '')); // handle "1234567890 (nid.)" => "1234567890" as well as spaces
|
|
184
|
+
}
|
|
156
185
|
}
|
|
157
186
|
};
|
package/src/isbn-issn.spec.js
CHANGED
|
@@ -54,6 +54,12 @@ describe('isbn-issn', () => {
|
|
|
54
54
|
ind2: ' ',
|
|
55
55
|
subfields: [{code: 'a', value: '978-600-377-017-1'}]
|
|
56
56
|
},
|
|
57
|
+
{
|
|
58
|
+
tag: '020',
|
|
59
|
+
ind1: ' ',
|
|
60
|
+
ind2: ' ',
|
|
61
|
+
subfields: [{code: 'a', value: '90-6831-372-X'}]
|
|
62
|
+
},
|
|
57
63
|
{
|
|
58
64
|
tag: '022',
|
|
59
65
|
ind1: ' ',
|
|
@@ -142,13 +148,22 @@ describe('isbn-issn', () => {
|
|
|
142
148
|
ind1: ' ',
|
|
143
149
|
ind2: ' ',
|
|
144
150
|
subfields: [{code: 'a', value: ' 9789519155470'}]
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
tag: '020',
|
|
154
|
+
ind1: ' ',
|
|
155
|
+
ind2: ' ',
|
|
156
|
+
subfields: [{code: 'a', value: '978-600-377-017-1 (nid.)'}]
|
|
145
157
|
}
|
|
146
158
|
]
|
|
147
159
|
});
|
|
148
160
|
const result = await validator.validate(record);
|
|
149
161
|
|
|
150
162
|
expect(result).to.eql({
|
|
151
|
-
valid: false, messages: [
|
|
163
|
+
valid: false, messages: [
|
|
164
|
+
'ISBN ( 9789519155470) is not valid',
|
|
165
|
+
'ISBN (978-600-377-017-1 (nid.)) is not valid'
|
|
166
|
+
]
|
|
152
167
|
});
|
|
153
168
|
});
|
|
154
169
|
|
|
@@ -180,7 +195,7 @@ describe('isbn-issn', () => {
|
|
|
180
195
|
});
|
|
181
196
|
});
|
|
182
197
|
|
|
183
|
-
it('Finds the record invalid (ISBN without hyphens)', async () => {
|
|
198
|
+
it('Finds the record invalid (valid ISBN without hyphens)', async () => {
|
|
184
199
|
const validator = await validatorFactory({hyphenateISBN: true});
|
|
185
200
|
const record = new MarcRecord({
|
|
186
201
|
fields: [
|
|
@@ -189,12 +204,21 @@ describe('isbn-issn', () => {
|
|
|
189
204
|
ind1: ' ',
|
|
190
205
|
ind2: ' ',
|
|
191
206
|
subfields: [{code: 'a', value: '9789519155470'}]
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
tag: '020',
|
|
210
|
+
ind1: ' ',
|
|
211
|
+
ind2: ' ',
|
|
212
|
+
subfields: [{code: 'a', value: '386006004X'}]
|
|
192
213
|
}
|
|
193
214
|
]
|
|
194
215
|
});
|
|
195
216
|
const result = await validator.validate(record);
|
|
196
217
|
|
|
197
|
-
expect(result).to.eql({valid: false, messages: [
|
|
218
|
+
expect(result).to.eql({valid: false, messages: [
|
|
219
|
+
'ISBN (9789519155470) is not valid',
|
|
220
|
+
'ISBN (386006004X) is not valid'
|
|
221
|
+
]});
|
|
198
222
|
});
|
|
199
223
|
|
|
200
224
|
it.skip('Finds the record invalid (Missing ISBN)');
|
|
@@ -209,6 +233,10 @@ describe('isbn-issn', () => {
|
|
|
209
233
|
{
|
|
210
234
|
tag: '020', ind1: ' ', ind2: ' ',
|
|
211
235
|
subfields: [{code: 'a', value: 'foo'}]
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
tag: '020', ind1: ' ', ind2: ' ',
|
|
239
|
+
subfields: [{code: 'a', value: 'crappy val'}]
|
|
212
240
|
}
|
|
213
241
|
]
|
|
214
242
|
});
|
|
@@ -216,9 +244,8 @@ describe('isbn-issn', () => {
|
|
|
216
244
|
await validator.fix(record);
|
|
217
245
|
|
|
218
246
|
expect(record.fields).to.eql([
|
|
219
|
-
{
|
|
220
|
-
|
|
221
|
-
}
|
|
247
|
+
{tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'z', value: 'foo'}]},
|
|
248
|
+
{tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'z', value: 'crappy val'}]}
|
|
222
249
|
]);
|
|
223
250
|
});
|
|
224
251
|
|
|
@@ -271,15 +298,20 @@ describe('isbn-issn', () => {
|
|
|
271
298
|
ind1: ' ',
|
|
272
299
|
ind2: ' ',
|
|
273
300
|
subfields: [{code: 'a', value: ' 9786003770171'}]
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
tag: '020',
|
|
304
|
+
ind1: ' ',
|
|
305
|
+
ind2: ' ',
|
|
306
|
+
subfields: [{code: 'a', value: '9786003770171 (nid.)'}]
|
|
274
307
|
}
|
|
275
308
|
]
|
|
276
309
|
});
|
|
277
310
|
await validator.fix(record);
|
|
278
311
|
|
|
279
312
|
expect(record.fields).to.eql([
|
|
280
|
-
{
|
|
281
|
-
|
|
282
|
-
}
|
|
313
|
+
{tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '9786003770171'}]},
|
|
314
|
+
{tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '9786003770171'}]}
|
|
283
315
|
]);
|
|
284
316
|
});
|
|
285
317
|
|
|
@@ -311,6 +343,14 @@ describe('isbn-issn', () => {
|
|
|
311
343
|
{
|
|
312
344
|
tag: '020', ind1: ' ', ind2: ' ',
|
|
313
345
|
subfields: [{code: 'a', value: '9789916605325'}]
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
tag: '020', ind1: ' ', ind2: ' ',
|
|
349
|
+
subfields: [{code: 'a', value: '917153086X'}]
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
tag: '020', ind1: ' ', ind2: ' ',
|
|
353
|
+
subfields: [{code: 'a', value: '386006004X (nid.)'}]
|
|
314
354
|
}
|
|
315
355
|
]
|
|
316
356
|
});
|
|
@@ -318,9 +358,9 @@ describe('isbn-issn', () => {
|
|
|
318
358
|
await validator.fix(record);
|
|
319
359
|
|
|
320
360
|
expect(record.fields).to.eql([
|
|
321
|
-
{
|
|
322
|
-
|
|
323
|
-
}
|
|
361
|
+
{tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '978-9916-605-32-5'}]},
|
|
362
|
+
{tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '91-7153-086-X'}]},
|
|
363
|
+
{tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '3-86006-004-X'}]}
|
|
324
364
|
]);
|
|
325
365
|
});
|
|
326
366
|
});
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* MARC record validators used in Melinda
|
|
6
6
|
*
|
|
7
|
-
* Copyright (c) 2014-
|
|
7
|
+
* Copyright (c) 2014-2022 University Of Helsinki (The National Library Of Finland)
|
|
8
8
|
*
|
|
9
9
|
* This file is part of marc-record-validators-melinda
|
|
10
10
|
*
|
|
@@ -76,8 +76,8 @@ export default function (config) {
|
|
|
76
76
|
return {
|
|
77
77
|
description:
|
|
78
78
|
'Checks that the record does not contain the configured subfields',
|
|
79
|
-
validate: record =>
|
|
80
|
-
fix: record =>
|
|
79
|
+
validate: record => excludeSubfields(record, config, false),
|
|
80
|
+
fix: record => excludeSubfields(record, config, true)
|
|
81
81
|
};
|
|
82
82
|
|
|
83
83
|
/// /////////////////////////////////////////
|
|
@@ -134,7 +134,7 @@ export default function (config) {
|
|
|
134
134
|
|
|
135
135
|
/// /////////////////////////////////////////
|
|
136
136
|
// These check that record is valid
|
|
137
|
-
function
|
|
137
|
+
function excludeSubfields(record, conf, fix) {
|
|
138
138
|
const res = {message: [], valid: true};
|
|
139
139
|
|
|
140
140
|
// Parse trough every element of config array
|
|
@@ -176,6 +176,10 @@ export default function (config) {
|
|
|
176
176
|
});
|
|
177
177
|
|
|
178
178
|
excluded.forEach(sf => record.removeSubfield(sf, element));
|
|
179
|
+
// If no subfields remains, the whole field will be removed as well:
|
|
180
|
+
if (element.subfields && element.subfields.length === 0) { // eslint-disable-line functional/no-conditional-statement
|
|
181
|
+
record.removeField(element);
|
|
182
|
+
}
|
|
179
183
|
});
|
|
180
184
|
}
|
|
181
185
|
});
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* MARC record validators used in Melinda
|
|
6
6
|
*
|
|
7
|
-
* Copyright (c) 2014-
|
|
7
|
+
* Copyright (c) 2014-2022 University Of Helsinki (The National Library Of Finland)
|
|
8
8
|
*
|
|
9
9
|
* This file is part of marc-record-validators-melinda
|
|
10
10
|
*
|
|
@@ -322,6 +322,57 @@ describe('subfield-exclusion', () => {
|
|
|
322
322
|
});
|
|
323
323
|
});
|
|
324
324
|
|
|
325
|
+
|
|
326
|
+
describe('#validate: Remove only subfield -> remove field as well', () => {
|
|
327
|
+
const config = [
|
|
328
|
+
{
|
|
329
|
+
tag: /^041$/u,
|
|
330
|
+
subfields: [{code: /^[ad]$/u, value: /^zxx$/u}]
|
|
331
|
+
}
|
|
332
|
+
];
|
|
333
|
+
|
|
334
|
+
const recordOriginal = new MarcRecord({
|
|
335
|
+
leader: 'foo',
|
|
336
|
+
fields: [
|
|
337
|
+
{
|
|
338
|
+
tag: '041',
|
|
339
|
+
ind1: ' ',
|
|
340
|
+
ind2: ' ',
|
|
341
|
+
subfields: [{code: 'a', value: 'zxx'}]
|
|
342
|
+
}, {
|
|
343
|
+
tag: '245',
|
|
344
|
+
ind1: ' ',
|
|
345
|
+
ind2: ' ',
|
|
346
|
+
subfields: [{code: 'a', value: 'Fubar'}]
|
|
347
|
+
}
|
|
348
|
+
]
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
const recordModified = new MarcRecord({
|
|
352
|
+
leader: 'foo',
|
|
353
|
+
fields: [
|
|
354
|
+
{
|
|
355
|
+
tag: '245',
|
|
356
|
+
ind1: ' ',
|
|
357
|
+
ind2: ' ',
|
|
358
|
+
subfields: [{code: 'a', value: 'Fubar'}]
|
|
359
|
+
}
|
|
360
|
+
]
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
it('Finds the record with 041$a zxx invalid (spec)', async () => {
|
|
364
|
+
const validator = await validatorFactory(config);
|
|
365
|
+
const result = await validator.validate(recordOriginal);
|
|
366
|
+
expect(result).to.eql({valid: false, message: ['Subfield $041$$ashould be excluded']});
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
it('Repairs invalid record', async () => {
|
|
370
|
+
const validator = await validatorFactory(config);
|
|
371
|
+
await validator.fix(recordOriginal);
|
|
372
|
+
expect(recordOriginal.equalsTo(recordModified)).to.eql(true);
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
|
|
325
376
|
// Complex configuration https://github.com/NatLibFi/marc-record-validators-melinda/issues/46
|
|
326
377
|
describe('#validate: Complex configuration (spec)', () => {
|
|
327
378
|
const config = [
|