@natlibfi/marc-record-validators-melinda 9.0.1 → 9.0.3-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.drone.yml CHANGED
@@ -13,12 +13,12 @@ steps:
13
13
  - name: audit
14
14
  image: node:14
15
15
  commands:
16
- - npm audit --package-lock-only --production --audit-level=moderate
16
+ - npm audit --package-lock-only --production --audit-level=high
17
17
 
18
18
  - name: install
19
19
  image: node:14
20
20
  environment:
21
- NPM_CONFIG_IGNORE_SCRIPTS: true
21
+ NPM_CONFIG_IGNORE_SCRIPTS: 'true'
22
22
  commands:
23
23
  - npm ci
24
24
 
@@ -50,7 +50,8 @@ steps:
50
50
  token:
51
51
  from_secret: npm_token
52
52
  when:
53
- event: tag
53
+ event:
54
+ - tag
54
55
  ---
55
56
  kind: pipeline
56
57
  type: docker
@@ -87,6 +88,6 @@ name: gpg_key
87
88
  data: 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
88
89
  ---
89
90
  kind: signature
90
- hmac: 976ccc627b05500d5bcf91a1ccdc5c2b0cdfdd18e151220f1a7ca985542cb2d0
91
+ hmac: 1a867e59721ed47b824f3d3bf976b2d398b669bfabe071309469746f46b58207
91
92
 
92
93
  ...
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
  });