@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 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
- const subfield = field.subfields.find(sf => sf.code === 'a');
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 !== parsedIsbn.isbn13h;
73
+ return !(subfield.value === parsedIsbn.isbn10h || subfield.value === parsedIsbn.isbn13h);
81
74
  }
82
75
 
83
- return subfield.value !== parsedIsbn.isbn13;
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
- const sfY = field.subfields.find(sf => sf.code === 'y');
85
+ return !(0, _issnVerify.default)(subfield.value);
86
+ });
88
87
 
89
- if (subfield === undefined) {
90
- if (sfY) {
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 !(0, _issnVerify.default)(subfield.value);
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 sfvalue = field.subfields.find(sf => sf.code === 'a');
137
+ const subfieldA = field.subfields.find(sf => sf.code === 'a');
113
138
 
114
- if (sfvalue) {
139
+ if (subfieldA) {
115
140
  return {
116
141
  name: 'ISBN',
117
- value: sfvalue.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 result = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');
158
+ const subfieldAorL = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');
134
159
 
135
- if (result) {
136
- return result.value;
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 trimmedValue = trimSpaces(subfield.value);
164
-
165
- const auditResult = _isbn.default.audit(trimmedValue);
188
+ const normalizedValue = normalizeIsbnValue(subfield.value);
166
189
 
167
- if (auditResult.validIsbn) {
168
- const parsedIsbn = _isbn.default.parse(trimmedValue);
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: trimmedValue
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
 
@@ -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"}
@@ -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-2020 University Of Helsinki (The National Library Of Finland)
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 => excludeFields(record, config, false),
88
- fix: record => excludeFields(record, config, true)
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 excludeFields(record, conf, fix) {
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":"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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\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-2020 University Of Helsinki (The National Library Of Finland)
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
@@ -14,7 +14,7 @@
14
14
  "url": "git@github.com:natlibfi/marc-record-validators-melinda.git"
15
15
  },
16
16
  "license": "LGPL-3.0+",
17
- "version": "9.0.2",
17
+ "version": "9.0.4",
18
18
  "main": "./dist/index.js",
19
19
  "publishConfig": {
20
20
  "access": "public"
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
- const subfield = field.subfields.find(sf => sf.code === 'a');
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 !== parsedIsbn.isbn13h;
55
+ return !(subfield.value === parsedIsbn.isbn10h || subfield.value === parsedIsbn.isbn13h);
65
56
  }
66
57
 
67
- return subfield.value !== parsedIsbn.isbn13;
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
- if (subfield === undefined) {
74
- if (sfY) {
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
- return !validateISSN(subfield.value);
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 sfvalue = field.subfields.find(sf => sf.code === 'a');
96
- if (sfvalue) {
97
- return {name: 'ISBN', value: sfvalue.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 result = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');
124
+ const subfieldAorL = field.subfields.find(sf => sf.code === 'a' || sf.code === 'l');
107
125
 
108
- if (result) {
109
- return result.value;
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 trimmedValue = trimSpaces(subfield.value);
130
- const auditResult = ISBN.audit(trimmedValue);
131
- if (auditResult.validIsbn) {
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: trimmedValue}); // eslint-disable-line functional/immutable-data
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
  };
@@ -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: ['ISBN ( 9789519155470) is not valid']
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: ['ISBN (9789519155470) is not valid']});
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
- tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'z', value: 'foo'}]
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
- tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '9786003770171'}]
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
- tag: '020', ind1: ' ', ind2: ' ', subfields: [{code: 'a', value: '978-9916-605-32-5'}]
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-2020 University Of Helsinki (The National Library Of Finland)
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 => excludeFields(record, config, false),
80
- fix: record => excludeFields(record, config, true)
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 excludeFields(record, conf, fix) {
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-2020 University Of Helsinki (The National Library Of Finland)
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 = [