@natlibfi/marc-record-validators-melinda 11.6.6 → 11.6.7

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.
Files changed (223) hide show
  1. package/.github/workflows/melinda-node-tests.yml +1 -1
  2. package/dist/access-rights.js +1 -5
  3. package/dist/access-rights.js.map +1 -1
  4. package/dist/addMissingField336.js +1 -1
  5. package/dist/addMissingField336.js.map +1 -1
  6. package/dist/cyrillux-usemarcon-replacement.js +41 -45
  7. package/dist/cyrillux-usemarcon-replacement.js.map +1 -1
  8. package/dist/cyrillux.js +13 -17
  9. package/dist/cyrillux.js.map +1 -1
  10. package/dist/disambiguateSeriesStatements.js +3 -4
  11. package/dist/disambiguateSeriesStatements.js.map +1 -1
  12. package/dist/double-commas.js +2 -1
  13. package/dist/double-commas.js.map +1 -1
  14. package/dist/duplicates-ind1.js +1 -1
  15. package/dist/duplicates-ind1.js.map +1 -1
  16. package/dist/empty-fields.js +0 -4
  17. package/dist/empty-fields.js.map +1 -1
  18. package/dist/ending-punctuation.js +21 -49
  19. package/dist/ending-punctuation.js.map +1 -1
  20. package/dist/ending-whitespace.js +0 -4
  21. package/dist/ending-whitespace.js.map +1 -1
  22. package/dist/field-008-18-34-character-groups.js +4 -5
  23. package/dist/field-008-18-34-character-groups.js.map +1 -1
  24. package/dist/field-505-separators.js +8 -6
  25. package/dist/field-505-separators.js.map +1 -1
  26. package/dist/field-521-fix.js +5 -6
  27. package/dist/field-521-fix.js.map +1 -1
  28. package/dist/field-exclusion.js +5 -12
  29. package/dist/field-exclusion.js.map +1 -1
  30. package/dist/field-exclusion.spec.js +3 -5
  31. package/dist/field-exclusion.spec.js.map +1 -1
  32. package/dist/field-structure.js +2 -5
  33. package/dist/field-structure.js.map +1 -1
  34. package/dist/fields-present.js +1 -1
  35. package/dist/fields-present.js.map +1 -1
  36. package/dist/fields-present.spec.js +1 -1
  37. package/dist/fields-present.spec.js.map +1 -1
  38. package/dist/fix-33X.js +5 -6
  39. package/dist/fix-33X.js.map +1 -1
  40. package/dist/fix-country-codes.js +3 -4
  41. package/dist/fix-country-codes.js.map +1 -1
  42. package/dist/fix-language-codes.js +12 -9
  43. package/dist/fix-language-codes.js.map +1 -1
  44. package/dist/fixRelatorTerms.js +8 -8
  45. package/dist/fixRelatorTerms.js.map +1 -1
  46. package/dist/fixed-fields.js +1 -4
  47. package/dist/fixed-fields.js.map +1 -1
  48. package/dist/identical-fields.js +2 -3
  49. package/dist/identical-fields.js.map +1 -1
  50. package/dist/indicator-fixes.js +14 -15
  51. package/dist/indicator-fixes.js.map +1 -1
  52. package/dist/isbn-issn.js +8 -11
  53. package/dist/isbn-issn.js.map +1 -1
  54. package/dist/item-language.js +5 -12
  55. package/dist/item-language.js.map +1 -1
  56. package/dist/merge-fields/counterpartField.js +6 -8
  57. package/dist/merge-fields/counterpartField.js.map +1 -1
  58. package/dist/merge-fields/index.js +3 -3
  59. package/dist/merge-fields/index.js.map +1 -1
  60. package/dist/merge-fields/mergeConstraints.js +0 -1
  61. package/dist/merge-fields/mergeConstraints.js.map +1 -1
  62. package/dist/merge-fields/mergeField.js +12 -18
  63. package/dist/merge-fields/mergeField.js.map +1 -1
  64. package/dist/merge-fields/mergeIndicator.js +5 -5
  65. package/dist/merge-fields/mergeIndicator.js.map +1 -1
  66. package/dist/merge-fields/mergeOrAddPostprocess.js +6 -9
  67. package/dist/merge-fields/mergeOrAddPostprocess.js.map +1 -1
  68. package/dist/merge-fields/mergeOrAddSubfield.js +6 -8
  69. package/dist/merge-fields/mergeOrAddSubfield.js.map +1 -1
  70. package/dist/merge-fields/mergeSubfield.js +8 -8
  71. package/dist/merge-fields/mergeSubfield.js.map +1 -1
  72. package/dist/merge-fields/removeDuplicateSubfields.js +1 -2
  73. package/dist/merge-fields/removeDuplicateSubfields.js.map +1 -1
  74. package/dist/merge-fields/worldKnowledge.js +1 -1
  75. package/dist/merge-fields/worldKnowledge.js.map +1 -1
  76. package/dist/mergeField500Lisapainokset.js +0 -3
  77. package/dist/mergeField500Lisapainokset.js.map +1 -1
  78. package/dist/mergeRelatorTermFields.js +3 -3
  79. package/dist/mergeRelatorTermFields.js.map +1 -1
  80. package/dist/modernize-502.js +6 -6
  81. package/dist/modernize-502.js.map +1 -1
  82. package/dist/multiple-subfield-0.js +4 -4
  83. package/dist/multiple-subfield-0.js.map +1 -1
  84. package/dist/non-breaking-space.js +0 -4
  85. package/dist/non-breaking-space.js.map +1 -1
  86. package/dist/normalize-dashes.js +5 -4
  87. package/dist/normalize-dashes.js.map +1 -1
  88. package/dist/normalize-identifiers.js +6 -6
  89. package/dist/normalize-identifiers.js.map +1 -1
  90. package/dist/normalize-qualifying-information.js +4 -4
  91. package/dist/normalize-qualifying-information.js.map +1 -1
  92. package/dist/normalize-utf8-diacritics.js +7 -7
  93. package/dist/normalize-utf8-diacritics.js.map +1 -1
  94. package/dist/normalizeFieldForComparison.js +21 -20
  95. package/dist/normalizeFieldForComparison.js.map +1 -1
  96. package/dist/normalizeSubfieldValueForComparison.js +1 -2
  97. package/dist/normalizeSubfieldValueForComparison.js.map +1 -1
  98. package/dist/prepublicationUtils.js +3 -3
  99. package/dist/prepublicationUtils.js.map +1 -1
  100. package/dist/punctuation/index.js +14 -31
  101. package/dist/punctuation/index.js.map +1 -1
  102. package/dist/punctuation2.js +9 -10
  103. package/dist/punctuation2.js.map +1 -1
  104. package/dist/reindexSubfield6OccurenceNumbers.js +8 -9
  105. package/dist/reindexSubfield6OccurenceNumbers.js.map +1 -1
  106. package/dist/removeDuplicateDataFields.js +18 -20
  107. package/dist/removeDuplicateDataFields.js.map +1 -1
  108. package/dist/removeInferiorDataFields.js +16 -19
  109. package/dist/removeInferiorDataFields.js.map +1 -1
  110. package/dist/resolvable-ext-references-melinda.js +4 -8
  111. package/dist/resolvable-ext-references-melinda.js.map +1 -1
  112. package/dist/resolveOrphanedSubfield6s.js +9 -9
  113. package/dist/resolveOrphanedSubfield6s.js.map +1 -1
  114. package/dist/sanitize-vocabulary-source-codes.js +9 -9
  115. package/dist/sanitize-vocabulary-source-codes.js.map +1 -1
  116. package/dist/sort-tags.js +2 -2
  117. package/dist/sort-tags.js.map +1 -1
  118. package/dist/sortFields.js +4 -9
  119. package/dist/sortFields.js.map +1 -1
  120. package/dist/sortRelatorTerms.js +4 -5
  121. package/dist/sortRelatorTerms.js.map +1 -1
  122. package/dist/sortSubfields.js +5 -6
  123. package/dist/sortSubfields.js.map +1 -1
  124. package/dist/stripPunctuation.js +2 -2
  125. package/dist/stripPunctuation.js.map +1 -1
  126. package/dist/subfield-exclusion.js +4 -11
  127. package/dist/subfield-exclusion.js.map +1 -1
  128. package/dist/subfield6Utils.js +12 -11
  129. package/dist/subfield6Utils.js.map +1 -1
  130. package/dist/subfield8Utils.js +8 -9
  131. package/dist/subfield8Utils.js.map +1 -1
  132. package/dist/subfieldValueNormalizations.js +5 -8
  133. package/dist/subfieldValueNormalizations.js.map +1 -1
  134. package/dist/sync-007-and-300.js +8 -8
  135. package/dist/sync-007-and-300.js.map +1 -1
  136. package/dist/translate-terms.js +5 -6
  137. package/dist/translate-terms.js.map +1 -1
  138. package/dist/typeOfDate-008.js +3 -4
  139. package/dist/typeOfDate-008.js.map +1 -1
  140. package/dist/unicode-decomposition.js +1 -1
  141. package/dist/unicode-decomposition.js.map +1 -1
  142. package/dist/update-field-540.js +5 -6
  143. package/dist/update-field-540.js.map +1 -1
  144. package/dist/urn.js +4 -9
  145. package/dist/urn.js.map +1 -1
  146. package/dist/utils.js +5 -9
  147. package/dist/utils.js.map +1 -1
  148. package/eslint.config.mjs +53 -0
  149. package/package.json +12 -13
  150. package/src/access-rights.js +4 -4
  151. package/src/addMissingField336.js +1 -1
  152. package/src/cyrillux-usemarcon-replacement.js +38 -38
  153. package/src/cyrillux.js +14 -14
  154. package/src/disambiguateSeriesStatements.js +3 -3
  155. package/src/double-commas.js +2 -2
  156. package/src/duplicates-ind1.js +1 -1
  157. package/src/empty-fields.js +4 -4
  158. package/src/ending-punctuation.js +46 -49
  159. package/src/ending-whitespace.js +0 -2
  160. package/src/field-008-18-34-character-groups.js +5 -5
  161. package/src/field-505-separators.js +6 -6
  162. package/src/field-521-fix.js +6 -6
  163. package/src/field-exclusion.js +12 -12
  164. package/src/field-exclusion.spec.js +4 -4
  165. package/src/field-structure.js +5 -5
  166. package/src/fields-present.js +1 -1
  167. package/src/fields-present.spec.js +1 -1
  168. package/src/fix-33X.js +5 -5
  169. package/src/fix-country-codes.js +3 -3
  170. package/src/fix-language-codes.js +10 -9
  171. package/src/fixRelatorTerms.js +8 -8
  172. package/src/fixed-fields.js +3 -3
  173. package/src/identical-fields.js +3 -3
  174. package/src/indicator-fixes.js +15 -15
  175. package/src/isbn-issn.js +11 -11
  176. package/src/item-language.js +10 -10
  177. package/src/merge-fields/counterpartField.js +7 -7
  178. package/src/merge-fields/index.js +3 -3
  179. package/src/merge-fields/mergeConstraints.js +1 -1
  180. package/src/merge-fields/mergeField.js +16 -17
  181. package/src/merge-fields/mergeIndicator.js +5 -5
  182. package/src/merge-fields/mergeOrAddPostprocess.js +9 -9
  183. package/src/merge-fields/mergeOrAddSubfield.js +6 -6
  184. package/src/merge-fields/mergeSubfield.js +8 -8
  185. package/src/merge-fields/removeDuplicateSubfields.js +1 -2
  186. package/src/merge-fields/worldKnowledge.js +1 -1
  187. package/src/mergeField500Lisapainokset.js +0 -2
  188. package/src/mergeRelatorTermFields.js +3 -3
  189. package/src/modernize-502.js +6 -6
  190. package/src/multiple-subfield-0.js +4 -4
  191. package/src/non-breaking-space.js +0 -2
  192. package/src/normalize-dashes.js +4 -4
  193. package/src/normalize-identifiers.js +6 -6
  194. package/src/normalize-qualifying-information.js +4 -4
  195. package/src/normalize-utf8-diacritics.js +7 -7
  196. package/src/normalizeFieldForComparison.js +20 -20
  197. package/src/normalizeSubfieldValueForComparison.js +1 -1
  198. package/src/prepublicationUtils.js +3 -3
  199. package/src/punctuation/index.js +29 -29
  200. package/src/punctuation2.js +10 -10
  201. package/src/reindexSubfield6OccurenceNumbers.js +9 -9
  202. package/src/removeDuplicateDataFields.js +21 -23
  203. package/src/removeInferiorDataFields.js +19 -19
  204. package/src/resolvable-ext-references-melinda.js +8 -8
  205. package/src/resolveOrphanedSubfield6s.js +9 -9
  206. package/src/sanitize-vocabulary-source-codes.js +8 -8
  207. package/src/sort-tags.js +2 -2
  208. package/src/sortFields.js +6 -6
  209. package/src/sortRelatorTerms.js +5 -5
  210. package/src/sortSubfields.js +6 -6
  211. package/src/stripPunctuation.js +2 -2
  212. package/src/subfield-exclusion.js +11 -11
  213. package/src/subfield6Utils.js +11 -11
  214. package/src/subfield8Utils.js +6 -9
  215. package/src/subfieldValueNormalizations.js +5 -7
  216. package/src/sync-007-and-300.js +8 -8
  217. package/src/translate-terms.js +3 -5
  218. package/src/typeOfDate-008.js +3 -3
  219. package/src/unicode-decomposition.js +1 -1
  220. package/src/update-field-540.js +6 -6
  221. package/src/urn.js +8 -6
  222. package/src/utils.js +8 -8
  223. package/.eslintignore +0 -1
package/dist/cyrillux.js CHANGED
@@ -30,11 +30,10 @@ function _default(config = {}) {
30
30
  fix
31
31
  };
32
32
  function preprocessConfig() {
33
- config.retainCyrillic = typeof config.retainCyrillic === 'undefined' ? true : config.retainCyrillic; // eslint-disable-line functional/immutable-data
34
- config.doISO9Transliteration = typeof config.doISO9Transliteration === 'undefined' ? true : config.doISO9Transliteration; // eslint-disable-line functional/immutable-data
35
- config.doSFS4900Transliteration = typeof config.doSFS4900Transliteration === 'undefined' ? true : config.doSFS4900Transliteration; // eslint-disable-line functional/immutable-data
36
- config.preferSFS4900 = setPreference(); // eslint-disable-line functional/immutable-data
37
-
33
+ config.retainCyrillic = typeof config.retainCyrillic === 'undefined' ? true : config.retainCyrillic;
34
+ config.doISO9Transliteration = typeof config.doISO9Transliteration === 'undefined' ? true : config.doISO9Transliteration;
35
+ config.doSFS4900Transliteration = typeof config.doSFS4900Transliteration === 'undefined' ? true : config.doSFS4900Transliteration;
36
+ config.preferSFS4900 = setPreference();
38
37
  function setPreference() {
39
38
  if (!config.doSFS4900Transliteration) {
40
39
  return false;
@@ -58,10 +57,8 @@ function _default(config = {}) {
58
57
  };
59
58
  preprocessConfig();
60
59
  const nBefore = record.fields.length;
61
- record.fields = processFields(record.fields); // eslint-disable-line functional/immutable-data
62
-
60
+ record.fields = processFields(record.fields);
63
61
  if (nBefore < record.fields.length) {
64
- // eslint-disable-line functional/no-conditional-statements
65
62
  (0, _reindexSubfield6OccurenceNumbers.default)().fix(record);
66
63
  (0, _sortFields.default)().fix(record);
67
64
  }
@@ -88,22 +85,22 @@ function _default(config = {}) {
88
85
  record.fields?.forEach(field => {
89
86
  validateField(field, res, record);
90
87
  });
91
- res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data
88
+ res.valid = !(res.message.length >= 1);
92
89
  return res;
93
90
  }
94
91
  function validateField(field, res, record) {
95
92
  const orig = (0, _utils.fieldToString)(field);
96
93
  const normalizedFields = processField((0, _clone.default)(field), record);
97
- const mod = (0, _utils.fieldsToString)(normalizedFields).replace(/\t__SEPARATOR__\t/ug, ', ').replace(/ (‡6 [0-9][0-9][0-9])-[0-9][0-9]+/gu, ' $1-NN'); // eslint-disable-line prefer-named-capture-group
94
+ const mod = (0, _utils.fieldsToString)(normalizedFields).replace(/\t__SEPARATOR__\t/ug, ', ').replace(/ (‡6 [0-9][0-9][0-9])-[0-9][0-9]+/gu, ' $1-NN');
98
95
  if (orig !== mod) {
99
96
  // Fail as the input is "broken"/"crap"/sumthing
100
- res.message.push(`CHANGE: ${orig} => ${mod}`); // eslint-disable-line functional/immutable-data
97
+ res.message.push(`CHANGE: ${orig} => ${mod}`);
101
98
  return;
102
99
  }
103
100
  return;
104
101
  }
105
102
  function isCyrillicCharacter(char) {
106
- return (0, _xregexp.default)('[\\p{Cyrillic}]').test(char); // eslint-disable-line new-cap
103
+ return (0, _xregexp.default)('[\\p{Cyrillic}]').test(char);
107
104
  }
108
105
  function containsCyrillicCharacters(str) {
109
106
  // from melinda-ui-cyrillux
@@ -199,7 +196,7 @@ function _default(config = {}) {
199
196
  // Translitetation goes to field 880:
200
197
 
201
198
  //const subfield6 = newField.subfields.find(sf => sf.code === '6');
202
- newField.tag = '880'; // eslint-disable-line functional/immutable-data
199
+ newField.tag = '880';
203
200
  (0, _subfield6Utils.resetSubfield6Tag)(subfield6, field.tag);
204
201
  return newField;
205
202
  }
@@ -334,8 +331,8 @@ function _default(config = {}) {
334
331
  }
335
332
  function createFieldForSfs4900Comparison(field, tag) {
336
333
  const clonedField = (0, _clone.default)(field);
337
- clonedField.tag = tag; // eslint-disable-line functional/immutable-data
338
- clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== '9' || sf.value !== sfs4900Trans); // eslint-disable-line functional/immutable-data
334
+ clonedField.tag = tag;
335
+ clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== '9' || sf.value !== sfs4900Trans);
339
336
  return (0, _punctuation.fieldStripPunctuation)(clonedField);
340
337
  }
341
338
  function transliterateSfs4900Pair(field, record) {
@@ -357,8 +354,7 @@ function _default(config = {}) {
357
354
  const newSFS4900Field = config.doSFS4900Transliteration ? mapFieldToSfs4900(field, occurrenceNumberAsString, languageCode) : undefined; // SFS-4900
358
355
 
359
356
  // Trigger the drop of original counterpart $6 :
360
- pairedField.cyrilluxSkip = 1; // eslint-disable-line functional/immutable-data
361
-
357
+ pairedField.cyrilluxSkip = 1;
362
358
  return [newMainField, newCyrillicField, newSFS4900Field].filter(f => f);
363
359
  }
364
360
  function processField(originalField, record, maxCreatedOccurrenceNumber = 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"cyrillux.js","names":["_clone","_interopRequireDefault","require","_utils","iso9","_interopRequireWildcard","_subfield6Utils","_xregexp","sfs4900","_sortFields","_reindexSubfield6OccurenceNumbers","_punctuation","_addMissingField","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","iso9Trans","cyrillicTrans","sfs4900Trans","_default","config","description","validate","fix","preprocessConfig","retainCyrillic","doISO9Transliteration","doSFS4900Transliteration","preferSFS4900","setPreference","record","res","message","valid","nBefore","fields","length","processFields","reindexSubfield6OccurenceNumbers","sortFields","input","output","currField","remainingInput","fakeRecord","createdMax","recordGetMaxSubfield6OccurrenceNumberAsInteger","result","processField","forEach","field","validateField","orig","fieldToString","normalizedFields","clone","mod","fieldsToString","replace","push","isCyrillicCharacter","char","XRegExp","test","containsCyrillicCharacters","str","split","some","fieldContainsCyrillicCharacters","subfields","sf","subfieldRequiresTransliteration","subfield","isControlSubfieldCode","code","value","tagCanBeTransliterated","tag","includes","fieldCanBeTransliterated","mapSubfieldToIso9","convertToLatin","mapSubfieldToSfs4900","lang","inputLang","mapField","occurrenceNumber","subfield6","deriveSubfield6","transliterationText","subfield9","fieldHasSubfield","transliterationFunc","filter","map","newField","ind1","ind2","resetSubfield6Tag","mapFieldToIso9","undefined","mapFieldToSfs4900","initialSubfield","mapFieldToCyrillicField880","nvdebug","newSubfield6","newSubfield9","getNewOccurrenceNumber","originalField","maxCreatedOccurrenceNumber","fieldGetMaxSubfield6OccurrenceNumberAsInteger","existingPairedFields","needsSfs4900Transliteration","sfs4900PairCanBeTransliterated","fieldGetOccurrenceNumberPairs","pairedField","occurrenceNumberAsString","fieldGetUnambiguousOccurrenceNumber","languageCode","getLanguageCode","field2","createFieldForSfs4900Comparison","field1","clonedField","fieldStripPunctuation","transliterateSfs4900Pair","tmpField","newMainField","newCyrillicField","newSFS4900Field","cyrilluxSkip","newOccurrenceNumberAsInt","newOccurrenceNumberAsString","intToOccurrenceNumberString"],"sources":["../src/cyrillux.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldHasSubfield, fieldToString, fieldsToString, isControlSubfieldCode, nvdebug} from './utils';\nimport * as iso9 from 'iso9_1995';\nimport {fieldGetMaxSubfield6OccurrenceNumberAsInteger, fieldGetOccurrenceNumberPairs, fieldGetUnambiguousOccurrenceNumber, intToOccurrenceNumberString, recordGetMaxSubfield6OccurrenceNumberAsInteger, resetSubfield6Tag} from './subfield6Utils';\n\nimport XRegExp from 'xregexp';\nimport * as sfs4900 from '@natlibfi/sfs-4900';\nimport {default as sortFields} from './sortFields';\nimport {default as reindexSubfield6OccurenceNumbers} from './reindexSubfield6OccurenceNumbers';\nimport {fieldStripPunctuation} from './punctuation2';\nimport {getLanguageCode} from './addMissingField041';\n\nconst iso9Trans = 'ISO9 <TRANS>';\nconst cyrillicTrans = 'CYRILLIC <TRANS>';\nconst sfs4900Trans = 'SFS4900 <TRANS>';\n\nexport default function (config = {}) {\n // console.log(`CONFIG=${JSON.stringify(config)}`); // eslint-disable-line no-console\n\n return {\n description: 'Cyrillux functionality: convert original field to latinitsa (ISO-9) and add 880s for original cyrillic and latinitsa (SFS-4900)',\n validate, fix\n };\n\n function preprocessConfig() {\n config.retainCyrillic = typeof config.retainCyrillic === 'undefined' ? true : config.retainCyrillic; // eslint-disable-line functional/immutable-data\n config.doISO9Transliteration = typeof config.doISO9Transliteration === 'undefined' ? true : config.doISO9Transliteration; // eslint-disable-line functional/immutable-data\n config.doSFS4900Transliteration = typeof config.doSFS4900Transliteration === 'undefined' ? true : config.doSFS4900Transliteration; // eslint-disable-line functional/immutable-data\n config.preferSFS4900 = setPreference(); // eslint-disable-line functional/immutable-data\n\n function setPreference() {\n if (!config.doSFS4900Transliteration) {\n return false;\n }\n if (!config.doISO9Transliteration && config.doSFS4900Transliteration) {\n return true;\n }\n if (typeof config.preferSFS4900 === 'undefined') {\n return false;\n }\n return config.preferSFS4900;\n }\n }\n\n function fix(record) {\n // console.log(`FIX has CONFIG=${JSON.stringify(config)}`); // eslint-disable-line no-console\n // Fix always succeeds\n const res = {message: [], fix: [], valid: true};\n\n preprocessConfig();\n\n const nBefore = record.fields.length;\n\n record.fields = processFields(record.fields); // eslint-disable-line functional/immutable-data\n\n if (nBefore < record.fields.length) { // eslint-disable-line functional/no-conditional-statements\n reindexSubfield6OccurenceNumbers().fix(record);\n sortFields().fix(record);\n }\n\n function processFields(input, output = []) {\n const [currField, ...remainingInput] = input;\n if (!currField) {\n return output;\n }\n\n const fakeRecord = {fields: output};\n const createdMax = recordGetMaxSubfield6OccurrenceNumberAsInteger(fakeRecord);\n const result = processField(currField, record, createdMax);\n\n return processFields(remainingInput, [...output, ...result]);\n }\n\n return res;\n }\n\n function validate(record) {\n const res = {message: [], valid: true};\n\n preprocessConfig();\n\n record.fields?.forEach(field => {\n validateField(field, res, record);\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validateField(field, res, record) {\n const orig = fieldToString(field);\n\n const normalizedFields = processField(clone(field), record);\n const mod = fieldsToString(normalizedFields).replace(/\\t__SEPARATOR__\\t/ug, ', ').replace(/ (‡6 [0-9][0-9][0-9])-[0-9][0-9]+/gu, ' $1-NN'); // eslint-disable-line prefer-named-capture-group\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`CHANGE: ${orig} => ${mod}`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n\n function isCyrillicCharacter(char) {\n return XRegExp('[\\\\p{Cyrillic}]').test(char); // eslint-disable-line new-cap\n }\n\n function containsCyrillicCharacters(str) { // from melinda-ui-cyrillux\n if (!str) {\n return false;\n }\n return str.split('').some(isCyrillicCharacter);\n }\n\n function fieldContainsCyrillicCharacters(field) { // based on melinda-ui-cyrillux\n return field.subfields && field.subfields.some(sf => subfieldRequiresTransliteration(sf));\n }\n\n function subfieldRequiresTransliteration(subfield) {\n if (isControlSubfieldCode(subfield.code)) {\n return false;\n }\n return containsCyrillicCharacters(subfield.value);\n }\n\n function tagCanBeTransliterated(tag) {\n return !['336', '337', '338', '880'].includes(tag);\n }\n\n function fieldCanBeTransliterated(field) {\n // Skip certain tags ('880' is the actual skip-me beef here, but we have seen other no-nos as well).\n // Discussion: We should probably also skip others like 05X-08X, 648, 650, 651, and 655, but this needs thinking...\n // Also I'd like to convert do CYRILLIC->ISO-9 in field 300 (and others?) without 880 mappings... (<- not implemented)\n\n // nvdebug(`fieldCanBeTransliterated('${fieldToString(field)}') in...`);\n if (!tagCanBeTransliterated(field.tag)) {\n return false;\n }\n\n if (!config.doISO9Transliteration && !config.doSFS4900Transliteration) {\n return false;\n }\n\n // Skip control fields:\n if (!field.subfields) {\n return false;\n }\n // When doing MELINDA-10330-ish, we noticed that $6 should not prevent translittaration per se, so this restriction is no longer applied!\n\n if (field.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>'))) {\n return false;\n }\n\n return fieldContainsCyrillicCharacters(field); // We have something to translitterate:\n }\n\n\n function mapSubfieldToIso9(subfield) {\n if (!subfieldRequiresTransliteration(subfield)) {\n return {code: subfield.code, value: subfield.value}; // just clone\n }\n const value = iso9.convertToLatin(subfield.value);\n\n return {code: subfield.code, value};\n }\n\n function mapSubfieldToSfs4900(subfield, lang = 'rus') {\n const inputLang = lang === 'ukr' ? 'ukr' : 'rus'; // Support 'ukr' and 'rus', default to 'rus'\n const value = subfieldRequiresTransliteration(subfield) ? sfs4900.convertToLatin(subfield.value, inputLang).result : subfield.value;\n //console.log(`VAL: ${subfield.value} => ${value} using ${lang}`); // eslint-disable-line no-console\n return {code: subfield.code, value};\n }\n\n function mapField(field, occurrenceNumber, iso9 = true, lang = 'rus') {\n const subfield6 = deriveSubfield6('880', field.subfields, occurrenceNumber);\n const transliterationText = iso9 ? iso9Trans : sfs4900Trans;\n\n const subfield9 = fieldHasSubfield(field, '9', transliterationText) ? [] : [{code: '9', value: transliterationText}]; // Add only if needed\n const transliterationFunc = iso9 ? mapSubfieldToIso9 : mapSubfieldToSfs4900;\n\n // NB! iso9 won't use lang\n const subfields = field.subfields.filter(sf => sf.code !== '6').map(sf => transliterationFunc(sf, lang));\n\n const newField = {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields: [subfield6, ...subfields, ...subfield9]};\n\n // Transliteration goes to the original field:\n if (!iso9 && config.preferSFS4900) {\n return newField;\n }\n if (iso9 && !config.preferSFS4900) {\n return newField;\n }\n // Translitetation goes to field 880:\n\n //const subfield6 = newField.subfields.find(sf => sf.code === '6');\n newField.tag = '880'; // eslint-disable-line functional/immutable-data\n resetSubfield6Tag(subfield6, field.tag);\n return newField;\n\n }\n\n function mapFieldToIso9(field, occurrenceNumber) {\n if (!config.doISO9Transliteration) {\n return undefined;\n }\n // Just converts the field to ISO-9 latinitsa, does not create any field-880s, so don't bother with $6 or $9 either\n if (!config.retainCyrillic && !config.preferSFS4900) {\n const subfields = field.subfields.map(sf => mapSubfieldToIso9(sf));\n return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields};\n }\n\n return mapField(field, occurrenceNumber, true, 'rus');\n\n }\n\n function mapFieldToSfs4900(field, occurrenceNumber, lang = 'rus') {\n if (!config.doSFS4900Transliteration) {\n return undefined;\n }\n // Just converts the field to SFS-4900 latinitsa, does not create any field-880s, so don't bother with $6 or $9 either\n if (!config.retainCyrillic && config.preferSFS4900) {\n const subfields = field.subfields.map(sf => mapSubfieldToSfs4900(sf, lang));\n return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields};\n }\n\n return mapField(field, occurrenceNumber, false, lang);\n }\n\n function deriveSubfield6(tag, subfields, occurrenceNumber) {\n const initialSubfield = {code: '6', value: `${tag}-${occurrenceNumber}`};\n if (tag === '880') { // If *tag in subfield $6* is 880, field is not 880 :D\n return initialSubfield;\n }\n // Try to use existing subfield\n const [subfield6] = subfields.filter(sf => sf.code === '6').map(sf => clone(sf));\n if (subfield6) {\n resetSubfield6Tag(subfield6, tag); // Should we update occurrence number?\n return subfield6;\n }\n\n return initialSubfield;\n }\n\n function mapFieldToCyrillicField880(field, occurrenceNumber) {\n if (!config.retainCyrillic) {\n return undefined;\n }\n nvdebug(`Derive CYR 880 from ${fieldToString(field)}`);\n const newSubfield6 = deriveSubfield6(field.tag, field.subfields, occurrenceNumber);\n const newSubfield9 = fieldHasSubfield(field, '9', cyrillicTrans) ? [] : [{code: '9', value: cyrillicTrans}];\n const subfields = [\n newSubfield6,\n ...field.subfields.filter(sf => sf.code !== '6').map(sf => clone(sf)),\n ...newSubfield9\n ];\n\n const newField = {tag: '880', ind1: field.ind1, ind2: field.ind2, subfields};\n nvdebug(` New CYR 880 ${fieldToString(newField)}`);\n return newField;\n }\n\n\n function getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber = 0) {\n const occurrenceNumber = fieldGetMaxSubfield6OccurrenceNumberAsInteger(originalField);\n // Return existing occurrence number:\n if (occurrenceNumber > 0) {\n return occurrenceNumber;\n }\n if (maxCreatedOccurrenceNumber) {\n return maxCreatedOccurrenceNumber + 1;\n }\n return recordGetMaxSubfield6OccurrenceNumberAsInteger(record) + 1;\n }\n\n function retainCyrillic(existingPairedFields) {\n // Should we move cyrillic content from a normali field to a 880?\n if (!config.retainCyrillic) {\n return false;\n }\n // Fail if we already have a paired 880 $9 <CYRILLIC> TRANS\n return !existingPairedFields.some(f => fieldHasSubfield(f, '9', cyrillicTrans));\n }\n\n function needsSfs4900Transliteration(existingPairedFields) {\n if (!config.doSFS4900Transliteration) {\n return false;\n }\n return !existingPairedFields.some(f => fieldHasSubfield(f, '9', sfs4900Trans));\n }\n\n function sfs4900PairCanBeTransliterated(field, record) {\n // MELINDA-10330: we already have public library data: (unmarked) SFS-4900 in FIELD and (unmarked) Cyrillic in 880\n if (!field.subfields || !tagCanBeTransliterated(field.tag) || !config.doISO9Transliteration || !config.retainCyrillic || !config.doSFS4900Transliteration) {\n return false;\n }\n\n // Original field: $9 ISO9 <TRANS> is the only legal <TRANS>\n if (fieldContainsCyrillicCharacters(field) || field.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>') && sf.value !== iso9Trans)) {\n return false;\n }\n\n const existingPairedFields = fieldGetOccurrenceNumberPairs(field, record.get('880'));\n if (existingPairedFields.length !== 1) {\n return false;\n }\n\n // Paired field: $9 CYRILLIC <TRANS> is the only legal <TRANS>\n const [pairedField] = existingPairedFields;\n nvdebug(`LOOKING FOR SFS4900 PAIR: ${fieldToString(field)}`);\n nvdebug(` HAVING PAIRED FIELD: ${fieldToString(pairedField)}`);\n if (!fieldContainsCyrillicCharacters(pairedField)) {\n return false;\n }\n if (pairedField.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>') && sf.value !== cyrillicTrans)) {\n return false;\n }\n\n // Actually check that original field and and sfs-4900-fied cyrillic field are equal (after punctuation clean-up),\n // and thus it's a real case of MELINDA-10330 ISO9 adding:\n const occurrenceNumberAsString = fieldGetUnambiguousOccurrenceNumber(field);\n const languageCode = getLanguageCode(record);\n const field2 = fieldToString(createFieldForSfs4900Comparison(mapFieldToSfs4900(pairedField, occurrenceNumberAsString, languageCode), field.tag));\n const field1 = fieldToString(createFieldForSfs4900Comparison(field, field.tag));\n nvdebug(`COMPARE CONTENTS:\\n '${field1}' vs\\n '${field2}': ${field1 === field2 ? 'OK' : 'FAIL'}`);\n return field1 === field2;\n }\n\n function createFieldForSfs4900Comparison(field, tag) {\n const clonedField = clone(field);\n clonedField.tag = tag; // eslint-disable-line functional/immutable-data\n clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== '9' || sf.value !== sfs4900Trans); // eslint-disable-line functional/immutable-data\n return fieldStripPunctuation(clonedField);\n }\n\n function transliterateSfs4900Pair(field, record) {\n // Handle MELINDA-10330: Field is already in SFS-4900 and the only paired field is in Cyrillic!\n if (!config.doISO9Transliteration) {\n return [];\n }\n const [pairedField] = fieldGetOccurrenceNumberPairs(field, record.get('880'));\n\n const occurrenceNumberAsString = fieldGetUnambiguousOccurrenceNumber(field);\n const languageCode = getLanguageCode(record);\n\n const tmpField = {'tag': field.tag, 'ind1': field.ind1, 'ind2': field.ind2, 'subfields': pairedField.subfields};\n\n const newMainField = config.doISO9Transliteration ? mapFieldToIso9(tmpField, occurrenceNumberAsString) : undefined; // Cyrillic => ISO-9\n const newCyrillicField = config.retainCyrillic ? mapFieldToCyrillicField880(tmpField, occurrenceNumberAsString) : undefined; // CYRILLIC\n const newSFS4900Field = config.doSFS4900Transliteration ? mapFieldToSfs4900(field, occurrenceNumberAsString, languageCode) : undefined; // SFS-4900\n\n // Trigger the drop of original counterpart $6 :\n pairedField.cyrilluxSkip = 1; // eslint-disable-line functional/immutable-data\n\n return [newMainField, newCyrillicField, newSFS4900Field].filter(f => f);\n }\n\n\n function processField(originalField, record, maxCreatedOccurrenceNumber = 0) {\n if (!fieldCanBeTransliterated(originalField)) {\n if (sfs4900PairCanBeTransliterated(originalField, record)) { // MELINDA-10330\n return transliterateSfs4900Pair(originalField, record);\n }\n if (originalField.cyrilluxSkip) { // MELINDA-10330 hack to remove 880 fields that were replaced/sort-of processed with their counterpair.\n return [];\n }\n return [originalField];\n }\n\n // nvdebug(`PROCESSING: ${fieldToString(originalField)}`);\n\n const newOccurrenceNumberAsInt = getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber);\n const newOccurrenceNumberAsString = intToOccurrenceNumberString(newOccurrenceNumberAsInt);\n const languageCode = getLanguageCode(record);\n\n // nvdebug(`NEW OCCURRENCE NUMBER: '${newOccurrenceNumberAsString}'`);\n\n const existingPairedFields = fieldGetOccurrenceNumberPairs(originalField, record.get('880'));\n\n // nvdebug(`NUMBER OF PAIRED 880 FIELDS: ${existingPairedFields.length}`);\n\n const newMainField = mapFieldToIso9(originalField, newOccurrenceNumberAsString); // ISO-9\n const newCyrillicField = retainCyrillic(existingPairedFields) ? mapFieldToCyrillicField880(originalField, newOccurrenceNumberAsString) : undefined; // CYRILLIC\n const newSFS4900Field = needsSfs4900Transliteration(existingPairedFields) ? mapFieldToSfs4900(originalField, newOccurrenceNumberAsString, languageCode) : undefined; /// SFS-4900\n\n return [newMainField, newCyrillicField, newSFS4900Field].filter(f => f);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"cyrillux.js","names":["_clone","_interopRequireDefault","require","_utils","iso9","_interopRequireWildcard","_subfield6Utils","_xregexp","sfs4900","_sortFields","_reindexSubfield6OccurenceNumbers","_punctuation","_addMissingField","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","iso9Trans","cyrillicTrans","sfs4900Trans","_default","config","description","validate","fix","preprocessConfig","retainCyrillic","doISO9Transliteration","doSFS4900Transliteration","preferSFS4900","setPreference","record","res","message","valid","nBefore","fields","length","processFields","reindexSubfield6OccurenceNumbers","sortFields","input","output","currField","remainingInput","fakeRecord","createdMax","recordGetMaxSubfield6OccurrenceNumberAsInteger","result","processField","forEach","field","validateField","orig","fieldToString","normalizedFields","clone","mod","fieldsToString","replace","push","isCyrillicCharacter","char","XRegExp","test","containsCyrillicCharacters","str","split","some","fieldContainsCyrillicCharacters","subfields","sf","subfieldRequiresTransliteration","subfield","isControlSubfieldCode","code","value","tagCanBeTransliterated","tag","includes","fieldCanBeTransliterated","mapSubfieldToIso9","convertToLatin","mapSubfieldToSfs4900","lang","inputLang","mapField","occurrenceNumber","subfield6","deriveSubfield6","transliterationText","subfield9","fieldHasSubfield","transliterationFunc","filter","map","newField","ind1","ind2","resetSubfield6Tag","mapFieldToIso9","undefined","mapFieldToSfs4900","initialSubfield","mapFieldToCyrillicField880","nvdebug","newSubfield6","newSubfield9","getNewOccurrenceNumber","originalField","maxCreatedOccurrenceNumber","fieldGetMaxSubfield6OccurrenceNumberAsInteger","existingPairedFields","needsSfs4900Transliteration","sfs4900PairCanBeTransliterated","fieldGetOccurrenceNumberPairs","pairedField","occurrenceNumberAsString","fieldGetUnambiguousOccurrenceNumber","languageCode","getLanguageCode","field2","createFieldForSfs4900Comparison","field1","clonedField","fieldStripPunctuation","transliterateSfs4900Pair","tmpField","newMainField","newCyrillicField","newSFS4900Field","cyrilluxSkip","newOccurrenceNumberAsInt","newOccurrenceNumberAsString","intToOccurrenceNumberString"],"sources":["../src/cyrillux.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport clone from 'clone';\nimport {fieldHasSubfield, fieldToString, fieldsToString, isControlSubfieldCode, nvdebug} from './utils';\nimport * as iso9 from 'iso9_1995';\nimport {fieldGetMaxSubfield6OccurrenceNumberAsInteger, fieldGetOccurrenceNumberPairs, fieldGetUnambiguousOccurrenceNumber, intToOccurrenceNumberString, recordGetMaxSubfield6OccurrenceNumberAsInteger, resetSubfield6Tag} from './subfield6Utils';\n\nimport XRegExp from 'xregexp';\nimport * as sfs4900 from '@natlibfi/sfs-4900';\nimport {default as sortFields} from './sortFields';\nimport {default as reindexSubfield6OccurenceNumbers} from './reindexSubfield6OccurenceNumbers';\nimport {fieldStripPunctuation} from './punctuation2';\nimport {getLanguageCode} from './addMissingField041';\n\nconst iso9Trans = 'ISO9 <TRANS>';\nconst cyrillicTrans = 'CYRILLIC <TRANS>';\nconst sfs4900Trans = 'SFS4900 <TRANS>';\n\nexport default function (config = {}) {\n // console.log(`CONFIG=${JSON.stringify(config)}`); // eslint-disable-line no-console\n\n return {\n description: 'Cyrillux functionality: convert original field to latinitsa (ISO-9) and add 880s for original cyrillic and latinitsa (SFS-4900)',\n validate, fix\n };\n\n function preprocessConfig() {\n config.retainCyrillic = typeof config.retainCyrillic === 'undefined' ? true : config.retainCyrillic;\n config.doISO9Transliteration = typeof config.doISO9Transliteration === 'undefined' ? true : config.doISO9Transliteration;\n config.doSFS4900Transliteration = typeof config.doSFS4900Transliteration === 'undefined' ? true : config.doSFS4900Transliteration;\n config.preferSFS4900 = setPreference();\n\n function setPreference() {\n if (!config.doSFS4900Transliteration) {\n return false;\n }\n if (!config.doISO9Transliteration && config.doSFS4900Transliteration) {\n return true;\n }\n if (typeof config.preferSFS4900 === 'undefined') {\n return false;\n }\n return config.preferSFS4900;\n }\n }\n\n function fix(record) {\n // console.log(`FIX has CONFIG=${JSON.stringify(config)}`); // eslint-disable-line no-console\n // Fix always succeeds\n const res = {message: [], fix: [], valid: true};\n\n preprocessConfig();\n\n const nBefore = record.fields.length;\n\n record.fields = processFields(record.fields);\n\n if (nBefore < record.fields.length) {\n reindexSubfield6OccurenceNumbers().fix(record);\n sortFields().fix(record);\n }\n\n function processFields(input, output = []) {\n const [currField, ...remainingInput] = input;\n if (!currField) {\n return output;\n }\n\n const fakeRecord = {fields: output};\n const createdMax = recordGetMaxSubfield6OccurrenceNumberAsInteger(fakeRecord);\n const result = processField(currField, record, createdMax);\n\n return processFields(remainingInput, [...output, ...result]);\n }\n\n return res;\n }\n\n function validate(record) {\n const res = {message: [], valid: true};\n\n preprocessConfig();\n\n record.fields?.forEach(field => {\n validateField(field, res, record);\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function validateField(field, res, record) {\n const orig = fieldToString(field);\n\n const normalizedFields = processField(clone(field), record);\n const mod = fieldsToString(normalizedFields).replace(/\\t__SEPARATOR__\\t/ug, ', ').replace(/ (‡6 [0-9][0-9][0-9])-[0-9][0-9]+/gu, ' $1-NN');\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`CHANGE: ${orig} => ${mod}`);\n return;\n }\n return;\n }\n\n function isCyrillicCharacter(char) {\n return XRegExp('[\\\\p{Cyrillic}]').test(char);\n }\n\n function containsCyrillicCharacters(str) { // from melinda-ui-cyrillux\n if (!str) {\n return false;\n }\n return str.split('').some(isCyrillicCharacter);\n }\n\n function fieldContainsCyrillicCharacters(field) { // based on melinda-ui-cyrillux\n return field.subfields && field.subfields.some(sf => subfieldRequiresTransliteration(sf));\n }\n\n function subfieldRequiresTransliteration(subfield) {\n if (isControlSubfieldCode(subfield.code)) {\n return false;\n }\n return containsCyrillicCharacters(subfield.value);\n }\n\n function tagCanBeTransliterated(tag) {\n return !['336', '337', '338', '880'].includes(tag);\n }\n\n function fieldCanBeTransliterated(field) {\n // Skip certain tags ('880' is the actual skip-me beef here, but we have seen other no-nos as well).\n // Discussion: We should probably also skip others like 05X-08X, 648, 650, 651, and 655, but this needs thinking...\n // Also I'd like to convert do CYRILLIC->ISO-9 in field 300 (and others?) without 880 mappings... (<- not implemented)\n\n // nvdebug(`fieldCanBeTransliterated('${fieldToString(field)}') in...`);\n if (!tagCanBeTransliterated(field.tag)) {\n return false;\n }\n\n if (!config.doISO9Transliteration && !config.doSFS4900Transliteration) {\n return false;\n }\n\n // Skip control fields:\n if (!field.subfields) {\n return false;\n }\n // When doing MELINDA-10330-ish, we noticed that $6 should not prevent translittaration per se, so this restriction is no longer applied!\n\n if (field.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>'))) {\n return false;\n }\n\n return fieldContainsCyrillicCharacters(field); // We have something to translitterate:\n }\n\n\n function mapSubfieldToIso9(subfield) {\n if (!subfieldRequiresTransliteration(subfield)) {\n return {code: subfield.code, value: subfield.value}; // just clone\n }\n const value = iso9.convertToLatin(subfield.value);\n\n return {code: subfield.code, value};\n }\n\n function mapSubfieldToSfs4900(subfield, lang = 'rus') {\n const inputLang = lang === 'ukr' ? 'ukr' : 'rus'; // Support 'ukr' and 'rus', default to 'rus'\n const value = subfieldRequiresTransliteration(subfield) ? sfs4900.convertToLatin(subfield.value, inputLang).result : subfield.value;\n //console.log(`VAL: ${subfield.value} => ${value} using ${lang}`); // eslint-disable-line no-console\n return {code: subfield.code, value};\n }\n\n function mapField(field, occurrenceNumber, iso9 = true, lang = 'rus') {\n const subfield6 = deriveSubfield6('880', field.subfields, occurrenceNumber);\n const transliterationText = iso9 ? iso9Trans : sfs4900Trans;\n\n const subfield9 = fieldHasSubfield(field, '9', transliterationText) ? [] : [{code: '9', value: transliterationText}]; // Add only if needed\n const transliterationFunc = iso9 ? mapSubfieldToIso9 : mapSubfieldToSfs4900;\n\n // NB! iso9 won't use lang\n const subfields = field.subfields.filter(sf => sf.code !== '6').map(sf => transliterationFunc(sf, lang));\n\n const newField = {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields: [subfield6, ...subfields, ...subfield9]};\n\n // Transliteration goes to the original field:\n if (!iso9 && config.preferSFS4900) {\n return newField;\n }\n if (iso9 && !config.preferSFS4900) {\n return newField;\n }\n // Translitetation goes to field 880:\n\n //const subfield6 = newField.subfields.find(sf => sf.code === '6');\n newField.tag = '880';\n resetSubfield6Tag(subfield6, field.tag);\n return newField;\n\n }\n\n function mapFieldToIso9(field, occurrenceNumber) {\n if (!config.doISO9Transliteration) {\n return undefined;\n }\n // Just converts the field to ISO-9 latinitsa, does not create any field-880s, so don't bother with $6 or $9 either\n if (!config.retainCyrillic && !config.preferSFS4900) {\n const subfields = field.subfields.map(sf => mapSubfieldToIso9(sf));\n return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields};\n }\n\n return mapField(field, occurrenceNumber, true, 'rus');\n\n }\n\n function mapFieldToSfs4900(field, occurrenceNumber, lang = 'rus') {\n if (!config.doSFS4900Transliteration) {\n return undefined;\n }\n // Just converts the field to SFS-4900 latinitsa, does not create any field-880s, so don't bother with $6 or $9 either\n if (!config.retainCyrillic && config.preferSFS4900) {\n const subfields = field.subfields.map(sf => mapSubfieldToSfs4900(sf, lang));\n return {tag: field.tag, ind1: field.ind1, ind2: field.ind2, subfields};\n }\n\n return mapField(field, occurrenceNumber, false, lang);\n }\n\n function deriveSubfield6(tag, subfields, occurrenceNumber) {\n const initialSubfield = {code: '6', value: `${tag}-${occurrenceNumber}`};\n if (tag === '880') { // If *tag in subfield $6* is 880, field is not 880 :D\n return initialSubfield;\n }\n // Try to use existing subfield\n const [subfield6] = subfields.filter(sf => sf.code === '6').map(sf => clone(sf));\n if (subfield6) {\n resetSubfield6Tag(subfield6, tag); // Should we update occurrence number?\n return subfield6;\n }\n\n return initialSubfield;\n }\n\n function mapFieldToCyrillicField880(field, occurrenceNumber) {\n if (!config.retainCyrillic) {\n return undefined;\n }\n nvdebug(`Derive CYR 880 from ${fieldToString(field)}`);\n const newSubfield6 = deriveSubfield6(field.tag, field.subfields, occurrenceNumber);\n const newSubfield9 = fieldHasSubfield(field, '9', cyrillicTrans) ? [] : [{code: '9', value: cyrillicTrans}];\n const subfields = [\n newSubfield6,\n ...field.subfields.filter(sf => sf.code !== '6').map(sf => clone(sf)),\n ...newSubfield9\n ];\n\n const newField = {tag: '880', ind1: field.ind1, ind2: field.ind2, subfields};\n nvdebug(` New CYR 880 ${fieldToString(newField)}`);\n return newField;\n }\n\n\n function getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber = 0) {\n const occurrenceNumber = fieldGetMaxSubfield6OccurrenceNumberAsInteger(originalField);\n // Return existing occurrence number:\n if (occurrenceNumber > 0) {\n return occurrenceNumber;\n }\n if (maxCreatedOccurrenceNumber) {\n return maxCreatedOccurrenceNumber + 1;\n }\n return recordGetMaxSubfield6OccurrenceNumberAsInteger(record) + 1;\n }\n\n function retainCyrillic(existingPairedFields) {\n // Should we move cyrillic content from a normali field to a 880?\n if (!config.retainCyrillic) {\n return false;\n }\n // Fail if we already have a paired 880 $9 <CYRILLIC> TRANS\n return !existingPairedFields.some(f => fieldHasSubfield(f, '9', cyrillicTrans));\n }\n\n function needsSfs4900Transliteration(existingPairedFields) {\n if (!config.doSFS4900Transliteration) {\n return false;\n }\n return !existingPairedFields.some(f => fieldHasSubfield(f, '9', sfs4900Trans));\n }\n\n function sfs4900PairCanBeTransliterated(field, record) {\n // MELINDA-10330: we already have public library data: (unmarked) SFS-4900 in FIELD and (unmarked) Cyrillic in 880\n if (!field.subfields || !tagCanBeTransliterated(field.tag) || !config.doISO9Transliteration || !config.retainCyrillic || !config.doSFS4900Transliteration) {\n return false;\n }\n\n // Original field: $9 ISO9 <TRANS> is the only legal <TRANS>\n if (fieldContainsCyrillicCharacters(field) || field.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>') && sf.value !== iso9Trans)) {\n return false;\n }\n\n const existingPairedFields = fieldGetOccurrenceNumberPairs(field, record.get('880'));\n if (existingPairedFields.length !== 1) {\n return false;\n }\n\n // Paired field: $9 CYRILLIC <TRANS> is the only legal <TRANS>\n const [pairedField] = existingPairedFields;\n nvdebug(`LOOKING FOR SFS4900 PAIR: ${fieldToString(field)}`);\n nvdebug(` HAVING PAIRED FIELD: ${fieldToString(pairedField)}`);\n if (!fieldContainsCyrillicCharacters(pairedField)) {\n return false;\n }\n if (pairedField.subfields.some(sf => sf.code === '9' && sf.value.includes('<TRANS>') && sf.value !== cyrillicTrans)) {\n return false;\n }\n\n // Actually check that original field and and sfs-4900-fied cyrillic field are equal (after punctuation clean-up),\n // and thus it's a real case of MELINDA-10330 ISO9 adding:\n const occurrenceNumberAsString = fieldGetUnambiguousOccurrenceNumber(field);\n const languageCode = getLanguageCode(record);\n const field2 = fieldToString(createFieldForSfs4900Comparison(mapFieldToSfs4900(pairedField, occurrenceNumberAsString, languageCode), field.tag));\n const field1 = fieldToString(createFieldForSfs4900Comparison(field, field.tag));\n nvdebug(`COMPARE CONTENTS:\\n '${field1}' vs\\n '${field2}': ${field1 === field2 ? 'OK' : 'FAIL'}`);\n return field1 === field2;\n }\n\n function createFieldForSfs4900Comparison(field, tag) {\n const clonedField = clone(field);\n clonedField.tag = tag;\n clonedField.subfields = clonedField.subfields.filter(sf => sf.code !== '9' || sf.value !== sfs4900Trans);\n return fieldStripPunctuation(clonedField);\n }\n\n function transliterateSfs4900Pair(field, record) {\n // Handle MELINDA-10330: Field is already in SFS-4900 and the only paired field is in Cyrillic!\n if (!config.doISO9Transliteration) {\n return [];\n }\n const [pairedField] = fieldGetOccurrenceNumberPairs(field, record.get('880'));\n\n const occurrenceNumberAsString = fieldGetUnambiguousOccurrenceNumber(field);\n const languageCode = getLanguageCode(record);\n\n const tmpField = {'tag': field.tag, 'ind1': field.ind1, 'ind2': field.ind2, 'subfields': pairedField.subfields};\n\n const newMainField = config.doISO9Transliteration ? mapFieldToIso9(tmpField, occurrenceNumberAsString) : undefined; // Cyrillic => ISO-9\n const newCyrillicField = config.retainCyrillic ? mapFieldToCyrillicField880(tmpField, occurrenceNumberAsString) : undefined; // CYRILLIC\n const newSFS4900Field = config.doSFS4900Transliteration ? mapFieldToSfs4900(field, occurrenceNumberAsString, languageCode) : undefined; // SFS-4900\n\n // Trigger the drop of original counterpart $6 :\n pairedField.cyrilluxSkip = 1;\n\n return [newMainField, newCyrillicField, newSFS4900Field].filter(f => f);\n }\n\n\n function processField(originalField, record, maxCreatedOccurrenceNumber = 0) {\n if (!fieldCanBeTransliterated(originalField)) {\n if (sfs4900PairCanBeTransliterated(originalField, record)) { // MELINDA-10330\n return transliterateSfs4900Pair(originalField, record);\n }\n if (originalField.cyrilluxSkip) { // MELINDA-10330 hack to remove 880 fields that were replaced/sort-of processed with their counterpair.\n return [];\n }\n return [originalField];\n }\n\n // nvdebug(`PROCESSING: ${fieldToString(originalField)}`);\n\n const newOccurrenceNumberAsInt = getNewOccurrenceNumber(originalField, record, maxCreatedOccurrenceNumber);\n const newOccurrenceNumberAsString = intToOccurrenceNumberString(newOccurrenceNumberAsInt);\n const languageCode = getLanguageCode(record);\n\n // nvdebug(`NEW OCCURRENCE NUMBER: '${newOccurrenceNumberAsString}'`);\n\n const existingPairedFields = fieldGetOccurrenceNumberPairs(originalField, record.get('880'));\n\n // nvdebug(`NUMBER OF PAIRED 880 FIELDS: ${existingPairedFields.length}`);\n\n const newMainField = mapFieldToIso9(originalField, newOccurrenceNumberAsString); // ISO-9\n const newCyrillicField = retainCyrillic(existingPairedFields) ? mapFieldToCyrillicField880(originalField, newOccurrenceNumberAsString) : undefined; // CYRILLIC\n const newSFS4900Field = needsSfs4900Transliteration(existingPairedFields) ? mapFieldToSfs4900(originalField, newOccurrenceNumberAsString, languageCode) : undefined; /// SFS-4900\n\n return [newMainField, newCyrillicField, newSFS4900Field].filter(f => f);\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -80,15 +80,14 @@ function _default() {
80
80
 
81
81
  // fixer:
82
82
  if (reallyFix) {
83
- currField.subfields = currField.subfields.filter(sf => !deletableStrings.includes((0, _utils.subfieldToString)(sf))); // eslint-disable-line functional/immutable-data
83
+ currField.subfields = currField.subfields.filter(sf => !deletableStrings.includes((0, _utils.subfieldToString)(sf)));
84
84
  (0, _punctuation.fieldFixPunctuation)(currField);
85
85
  return fix490x(recordType, remainingFields, reallyFix, message);
86
86
  }
87
87
  // validators:
88
88
  const clonedField = (0, _clone.default)(currField);
89
89
  const originalString = (0, _utils.fieldToString)(clonedField);
90
- clonedField.subfields = clonedField.subfields.filter(sf => !deletableStrings.includes((0, _utils.subfieldToString)(sf))); // eslint-disable-line functional/immutable-data
91
-
90
+ clonedField.subfields = clonedField.subfields.filter(sf => !deletableStrings.includes((0, _utils.subfieldToString)(sf)));
92
91
  const newMessage = `Replace '${originalString}' with '${(0, _utils.fieldToString)(clonedField)}'`;
93
92
  return fix490x(recordType, remainingFields, reallyFix, [...message, newMessage]);
94
93
  }
@@ -176,7 +175,7 @@ function search(sruClient, query, one = false) {
176
175
  // console.info(`SRU query: $${searchUrl}`);
177
176
 
178
177
  sruClient.searchRetrieve(query).on('record', xmlString => {
179
- promises.push(_marcRecordSerializers.MARCXML.from(xmlString, noValidation)); // eslint-disable-line functional/immutable-data
178
+ promises.push(_marcRecordSerializers.MARCXML.from(xmlString, noValidation));
180
179
  }).on('end', async () => {
181
180
  try {
182
181
  if (promises.length > 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"disambiguateSeriesStatements.js","names":["_debug","_interopRequireDefault","require","_utils","_marcRecordSerializers","_melindaCommons","_clone","_sruClient","_punctuation","e","__esModule","default","debug","createDebugLogger","ELECTRONIC","PRINTED","NEITHER_OR_UNKNOWN","SRU_API_URL","_default","sruClient","createSruClient","description","validate","fix","record","recordType","getRecordType","relevantFields","getRelevantFields","fields","message","fix490x","valid","length","getValidIssnSubfields","field","subfields","filter","sf","code","value","match","isRelevantField","tag","f","reallyFix","currField","remainingFields","validXs","deletableXs","getRemovableSubfields","deletableStrings","map","subfieldToString","nvdebug","join","includes","fieldFixPunctuation","clonedField","clone","originalString","fieldToString","newMessage","removables","currSubfield","remainingXs","isRemoveable","isRemovableSubfield","subfield","issn","substring","issnRecords","issnToRecords","some","r","isMismatchingRecord","issnRecordType","records","search","f337","get","b","sruApiUrl","sruClientOptions","url","recordSchema","retrieveAll","maxRecordsPerRequest","createNatlibfiSruClient","query","one","Promise","resolve","reject","promises","noValidation","subfieldValues","searchRetrieve","on","xmlString","push","MARCXML","from","firstPromise","firstRecord","all","Error","error"],"sources":["../src/disambiguateSeriesStatements.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldToString, nvdebug, subfieldToString} from './utils';\nimport {MARCXML} from '@natlibfi/marc-record-serializers';\nimport {Error} from '@natlibfi/melinda-commons';\nimport clone from 'clone';\nimport {default as createNatlibfiSruClient} from '@natlibfi/sru-client';\nimport {fieldFixPunctuation} from './punctuation2';\n\n//const {default: createNatlibfiSruClient} = natlibfiSruClient;\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:disambiguateSeriesStatements');\n\nconst ELECTRONIC = 1;\nconst PRINTED = 2;\nconst NEITHER_OR_UNKNOWN = 0;\nconst SRU_API_URL = 'https://sru.api.melinda.kansalliskirjasto.fi/bib';\n\n// Author(s): Nicholas Volk\nexport default function () {\n const sruClient = createSruClient(SRU_API_URL);\n\n return {\n description: 'Disambiguate between printed and electonic series statements (490 with multiple $xs)',\n validate, fix\n };\n\n async function fix(record) {\n const recordType = getRecordType(record);\n\n const relevantFields = getRelevantFields(record.fields);\n const message = await fix490x(recordType, relevantFields, true);\n\n return {message, fix: [], valid: true};\n }\n\n async function validate(record) {\n const recordType = getRecordType(record);\n\n const relevantFields = getRelevantFields(record.fields);\n const message = await fix490x(recordType, relevantFields, false);\n\n return {message, valid: message.length === 0};\n }\n\n\n function getValidIssnSubfields(field) {\n const subfields = field.subfields?.filter(sf => sf.code === 'x' && sf.value.match(/^[0-9]{4}-[0-9][0-9][0-9][0-9Xx][^0-9Xx]*$/u));\n return subfields;\n }\n\n function isRelevantField(field) {\n if (field.tag !== '490') {\n return false;\n }\n return getValidIssnSubfields(field).length > 1;\n }\n\n function getRelevantFields(fields) {\n return fields.filter(f => isRelevantField(f));\n }\n\n async function fix490x(recordType, fields, reallyFix, message = []) {\n\n if (recordType === NEITHER_OR_UNKNOWN) {\n return message;\n }\n const [currField, ...remainingFields] = fields;\n\n if (!currField) {\n return message;\n }\n\n const validXs = getValidIssnSubfields(currField);\n\n const deletableXs = await getRemovableSubfields(validXs, recordType);\n\n if (deletableXs.length === 0 || deletableXs.length === validXs.length) {\n return fix490x(recordType, remainingFields, reallyFix, message);\n }\n\n const deletableStrings = deletableXs.map(sf => subfieldToString(sf));\n nvdebug(`Field has removable ISSNS: '${deletableStrings.join(', ')}`, debug);\n\n // fixer:\n if (reallyFix) {\n currField.subfields = currField.subfields.filter(sf => !deletableStrings.includes(subfieldToString(sf))); // eslint-disable-line functional/immutable-data\n fieldFixPunctuation(currField);\n return fix490x(recordType, remainingFields, reallyFix, message);\n }\n // validators:\n const clonedField = clone(currField);\n const originalString = fieldToString(clonedField);\n clonedField.subfields = clonedField.subfields.filter(sf => !deletableStrings.includes(subfieldToString(sf))); // eslint-disable-line functional/immutable-data\n\n const newMessage = `Replace '${originalString}' with '${fieldToString(clonedField)}'`;\n\n return fix490x(recordType, remainingFields, reallyFix, [...message, newMessage]);\n }\n\n async function getRemovableSubfields(validXs, recordType, removables = []) {\n const [currSubfield, ...remainingXs] = validXs;\n\n if (!currSubfield) {\n return removables;\n }\n\n const isRemoveable = await isRemovableSubfield(currSubfield, recordType);\n if (isRemoveable) {\n return getRemovableSubfields(remainingXs, recordType, [...removables, currSubfield]);\n }\n return getRemovableSubfields(remainingXs, recordType, removables);\n }\n\n async function isRemovableSubfield(subfield, recordType) {\n //console.info(` isRemovableField() in...`); // eslint-disable-line no-console\n const issn = subfield.value.substring(0, 9); // Strip punctuation (ISSN consists of nine letter, eg. \"1234-5678\")\n\n //console.info(` got ISSN ${issn}`); // eslint-disable-line no-console\n const issnRecords = await issnToRecords(issn);\n //console.info(` ISSN returned ${issnRecords.length} record(s)`); // eslint-disable-line no-console\n\n // !isMismatchingRecord !== isMatchingRecord as NEITHER_OR_UNKNOWN record type is neutral. Thus double negative \"not mismatch\". Sorry about that.\n if (issnRecords.some(r => !isMismatchingRecord(r))) {\n return false;\n }\n return true;\n\n function isMismatchingRecord(r) {\n const issnRecordType = getRecordType(r);\n if (issnRecordType === NEITHER_OR_UNKNOWN) {\n return false;\n }\n return issnRecordType !== recordType;\n }\n }\n\n async function issnToRecords(issn) {\n //console.log('issnToRecords() in...'); // eslint-disable-line no-console\n const records = await search(sruClient, `bath.issn=${issn}`);\n //console.log(`ISSN2RECORDS got ${records.length} record(s)!`); // eslint-disable-line no-console\n return records;\n }\n\n function getRecordType(record) {\n const f337 = record.get('337');\n if (f337.length !== 1) {\n return NEITHER_OR_UNKNOWN;\n }\n\n const b = f337[0].subfields.filter(sf => sf.code === 'b');\n if (b.length !== 1) {\n return NEITHER_OR_UNKNOWN;\n }\n\n if (b[0].value === 'c') {\n return ELECTRONIC;\n }\n\n if (b[0].value === 'n') {\n return PRINTED;\n }\n\n return NEITHER_OR_UNKNOWN;\n }\n\n}\n\n// All the code below is copypasted from melinda-ui-artikkelit project file src/services/sruServices/sruClient.js\n\nexport function createSruClient(sruApiUrl) {\n\n const sruClientOptions = {\n url: sruApiUrl,\n recordSchema: 'marcxml',\n retrieveAll: false,\n maxRecordsPerRequest: 100\n };\n\n return createNatlibfiSruClient(sruClientOptions);\n}\n\n\n/*******************************************************************************/\n/* Search and retrieve (copypaste from melinda-ui-artikkelit) */\n\nexport function search(sruClient, query, one = false) {\n\n return new Promise((resolve, reject) => {\n const promises = [];\n\n const noValidation = {\n fields: false,\n subfields: false,\n subfieldValues: false\n };\n\n // console.info(`SRU query: $${searchUrl}`);\n\n sruClient.searchRetrieve(query)\n .on('record', xmlString => {\n promises.push(MARCXML.from(xmlString, noValidation)); // eslint-disable-line functional/immutable-data\n })\n .on('end', async () => {\n try {\n\n if (promises.length > 0) {\n\n if (one) {\n const [firstPromise] = promises;\n const firstRecord = await firstPromise;\n return resolve(firstRecord);\n }\n\n const records = await Promise.all(promises);\n return resolve(records);\n }\n reject(new Error(404, 'No records found with search and retrieve'));\n\n } catch (error) {\n reject(error);\n }\n })\n .on('error', error => {\n reject(error);\n });\n });\n}\n\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"disambiguateSeriesStatements.js","names":["_debug","_interopRequireDefault","require","_utils","_marcRecordSerializers","_melindaCommons","_clone","_sruClient","_punctuation","e","__esModule","default","debug","createDebugLogger","ELECTRONIC","PRINTED","NEITHER_OR_UNKNOWN","SRU_API_URL","_default","sruClient","createSruClient","description","validate","fix","record","recordType","getRecordType","relevantFields","getRelevantFields","fields","message","fix490x","valid","length","getValidIssnSubfields","field","subfields","filter","sf","code","value","match","isRelevantField","tag","f","reallyFix","currField","remainingFields","validXs","deletableXs","getRemovableSubfields","deletableStrings","map","subfieldToString","nvdebug","join","includes","fieldFixPunctuation","clonedField","clone","originalString","fieldToString","newMessage","removables","currSubfield","remainingXs","isRemoveable","isRemovableSubfield","subfield","issn","substring","issnRecords","issnToRecords","some","r","isMismatchingRecord","issnRecordType","records","search","f337","get","b","sruApiUrl","sruClientOptions","url","recordSchema","retrieveAll","maxRecordsPerRequest","createNatlibfiSruClient","query","one","Promise","resolve","reject","promises","noValidation","subfieldValues","searchRetrieve","on","xmlString","push","MARCXML","from","firstPromise","firstRecord","all","Error","error"],"sources":["../src/disambiguateSeriesStatements.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldToString, nvdebug, subfieldToString} from './utils';\nimport {MARCXML} from '@natlibfi/marc-record-serializers';\nimport {Error} from '@natlibfi/melinda-commons';\nimport clone from 'clone';\nimport {default as createNatlibfiSruClient} from '@natlibfi/sru-client';\nimport {fieldFixPunctuation} from './punctuation2';\n\n//const {default: createNatlibfiSruClient} = natlibfiSruClient;\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:disambiguateSeriesStatements');\n\nconst ELECTRONIC = 1;\nconst PRINTED = 2;\nconst NEITHER_OR_UNKNOWN = 0;\nconst SRU_API_URL = 'https://sru.api.melinda.kansalliskirjasto.fi/bib';\n\n// Author(s): Nicholas Volk\nexport default function () {\n const sruClient = createSruClient(SRU_API_URL);\n\n return {\n description: 'Disambiguate between printed and electonic series statements (490 with multiple $xs)',\n validate, fix\n };\n\n async function fix(record) {\n const recordType = getRecordType(record);\n\n const relevantFields = getRelevantFields(record.fields);\n const message = await fix490x(recordType, relevantFields, true);\n\n return {message, fix: [], valid: true};\n }\n\n async function validate(record) {\n const recordType = getRecordType(record);\n\n const relevantFields = getRelevantFields(record.fields);\n const message = await fix490x(recordType, relevantFields, false);\n\n return {message, valid: message.length === 0};\n }\n\n\n function getValidIssnSubfields(field) {\n const subfields = field.subfields?.filter(sf => sf.code === 'x' && sf.value.match(/^[0-9]{4}-[0-9][0-9][0-9][0-9Xx][^0-9Xx]*$/u));\n return subfields;\n }\n\n function isRelevantField(field) {\n if (field.tag !== '490') {\n return false;\n }\n return getValidIssnSubfields(field).length > 1;\n }\n\n function getRelevantFields(fields) {\n return fields.filter(f => isRelevantField(f));\n }\n\n async function fix490x(recordType, fields, reallyFix, message = []) {\n\n if (recordType === NEITHER_OR_UNKNOWN) {\n return message;\n }\n const [currField, ...remainingFields] = fields;\n\n if (!currField) {\n return message;\n }\n\n const validXs = getValidIssnSubfields(currField);\n\n const deletableXs = await getRemovableSubfields(validXs, recordType);\n\n if (deletableXs.length === 0 || deletableXs.length === validXs.length) {\n return fix490x(recordType, remainingFields, reallyFix, message);\n }\n\n const deletableStrings = deletableXs.map(sf => subfieldToString(sf));\n nvdebug(`Field has removable ISSNS: '${deletableStrings.join(', ')}`, debug);\n\n // fixer:\n if (reallyFix) {\n currField.subfields = currField.subfields.filter(sf => !deletableStrings.includes(subfieldToString(sf)));\n fieldFixPunctuation(currField);\n return fix490x(recordType, remainingFields, reallyFix, message);\n }\n // validators:\n const clonedField = clone(currField);\n const originalString = fieldToString(clonedField);\n clonedField.subfields = clonedField.subfields.filter(sf => !deletableStrings.includes(subfieldToString(sf)));\n\n const newMessage = `Replace '${originalString}' with '${fieldToString(clonedField)}'`;\n\n return fix490x(recordType, remainingFields, reallyFix, [...message, newMessage]);\n }\n\n async function getRemovableSubfields(validXs, recordType, removables = []) {\n const [currSubfield, ...remainingXs] = validXs;\n\n if (!currSubfield) {\n return removables;\n }\n\n const isRemoveable = await isRemovableSubfield(currSubfield, recordType);\n if (isRemoveable) {\n return getRemovableSubfields(remainingXs, recordType, [...removables, currSubfield]);\n }\n return getRemovableSubfields(remainingXs, recordType, removables);\n }\n\n async function isRemovableSubfield(subfield, recordType) {\n //console.info(` isRemovableField() in...`); // eslint-disable-line no-console\n const issn = subfield.value.substring(0, 9); // Strip punctuation (ISSN consists of nine letter, eg. \"1234-5678\")\n\n //console.info(` got ISSN ${issn}`); // eslint-disable-line no-console\n const issnRecords = await issnToRecords(issn);\n //console.info(` ISSN returned ${issnRecords.length} record(s)`); // eslint-disable-line no-console\n\n // !isMismatchingRecord !== isMatchingRecord as NEITHER_OR_UNKNOWN record type is neutral. Thus double negative \"not mismatch\". Sorry about that.\n if (issnRecords.some(r => !isMismatchingRecord(r))) {\n return false;\n }\n return true;\n\n function isMismatchingRecord(r) {\n const issnRecordType = getRecordType(r);\n if (issnRecordType === NEITHER_OR_UNKNOWN) {\n return false;\n }\n return issnRecordType !== recordType;\n }\n }\n\n async function issnToRecords(issn) {\n //console.log('issnToRecords() in...'); // eslint-disable-line no-console\n const records = await search(sruClient, `bath.issn=${issn}`);\n //console.log(`ISSN2RECORDS got ${records.length} record(s)!`); // eslint-disable-line no-console\n return records;\n }\n\n function getRecordType(record) {\n const f337 = record.get('337');\n if (f337.length !== 1) {\n return NEITHER_OR_UNKNOWN;\n }\n\n const b = f337[0].subfields.filter(sf => sf.code === 'b');\n if (b.length !== 1) {\n return NEITHER_OR_UNKNOWN;\n }\n\n if (b[0].value === 'c') {\n return ELECTRONIC;\n }\n\n if (b[0].value === 'n') {\n return PRINTED;\n }\n\n return NEITHER_OR_UNKNOWN;\n }\n\n}\n\n// All the code below is copypasted from melinda-ui-artikkelit project file src/services/sruServices/sruClient.js\n\nexport function createSruClient(sruApiUrl) {\n\n const sruClientOptions = {\n url: sruApiUrl,\n recordSchema: 'marcxml',\n retrieveAll: false,\n maxRecordsPerRequest: 100\n };\n\n return createNatlibfiSruClient(sruClientOptions);\n}\n\n\n/*******************************************************************************/\n/* Search and retrieve (copypaste from melinda-ui-artikkelit) */\n\nexport function search(sruClient, query, one = false) {\n\n return new Promise((resolve, reject) => {\n const promises = [];\n\n const noValidation = {\n fields: false,\n subfields: false,\n subfieldValues: false\n };\n\n // console.info(`SRU query: $${searchUrl}`);\n\n sruClient.searchRetrieve(query)\n .on('record', xmlString => {\n promises.push(MARCXML.from(xmlString, noValidation));\n })\n .on('end', async () => {\n try {\n\n if (promises.length > 0) {\n\n if (one) {\n const [firstPromise] = promises;\n const firstRecord = await firstPromise;\n return resolve(firstRecord);\n }\n\n const records = await Promise.all(promises);\n return resolve(records);\n }\n reject(new Error(404, 'No records found with search and retrieve'));\n\n } catch (error) {\n reject(error);\n }\n })\n .on('error', error => {\n reject(error);\n });\n });\n}\n\n"],"mappings":"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","ignoreList":[]}
@@ -11,7 +11,8 @@ function _default() {
11
11
  valid: !record.get(/^700$/u).some(f => f.subfields.every(sf => sf.code === 'e' && /,,/u.test(sf.value)))
12
12
  }),
13
13
  fix: record => record.get(/^700$/u).forEach(f => f.subfields.filter(sf => sf.code === 'e').forEach(sf => {
14
- sf.value = sf.value.replace(/,,/u, ','); // eslint-disable-line functional/immutable-data
14
+ // eslint-disable-line array-callback-return
15
+ sf.value = sf.value.replace(/,,/u, ',');
15
16
  }))
16
17
  };
17
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"double-commas.js","names":["_default","description","validate","record","valid","get","some","f","subfields","every","sf","code","test","value","fix","forEach","filter","replace"],"sources":["../src/double-commas.js"],"sourcesContent":["export default function () {\n return {\n description: 'Handle double commas in 700$e-subfields',\n validate: record => ({\n valid: !record\n .get(/^700$/u)\n .some(f => f.subfields.every(sf => sf.code === 'e' && (/,,/u).test(sf.value)))\n }),\n fix: record => record.get(/^700$/u).forEach(f => f.subfields.filter(sf => sf.code === 'e').forEach(sf => {\n sf.value = sf.value.replace(/,,/u, ','); // eslint-disable-line functional/immutable-data\n }))\n };\n}\n"],"mappings":";;;;;;AAAe,SAAAA,SAAA,EAAY;EACzB,OAAO;IACLC,WAAW,EAAE,yCAAyC;IACtDC,QAAQ,EAAEC,MAAM,KAAK;MACnBC,KAAK,EAAE,CAACD,MAAM,CACXE,GAAG,CAAC,QAAQ,CAAC,CACbC,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACC,SAAS,CAACC,KAAK,CAACC,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAK,GAAG,IAAK,KAAK,CAAEC,IAAI,CAACF,EAAE,CAACG,KAAK,CAAC,CAAC;IACjF,CAAC,CAAC;IACFC,GAAG,EAAEX,MAAM,IAAIA,MAAM,CAACE,GAAG,CAAC,QAAQ,CAAC,CAACU,OAAO,CAACR,CAAC,IAAIA,CAAC,CAACC,SAAS,CAACQ,MAAM,CAACN,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAK,GAAG,CAAC,CAACI,OAAO,CAACL,EAAE,IAAI;MACvGA,EAAE,CAACG,KAAK,GAAGH,EAAE,CAACG,KAAK,CAACI,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC;EACJ,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"file":"double-commas.js","names":["_default","description","validate","record","valid","get","some","f","subfields","every","sf","code","test","value","fix","forEach","filter","replace"],"sources":["../src/double-commas.js"],"sourcesContent":["export default function () {\n return {\n description: 'Handle double commas in 700$e-subfields',\n validate: record => ({\n valid: !record\n .get(/^700$/u)\n .some(f => f.subfields.every(sf => sf.code === 'e' && (/,,/u).test(sf.value)))\n }),\n fix: record => record.get(/^700$/u).forEach(f => f.subfields.filter(sf => sf.code === 'e').forEach(sf => { // eslint-disable-line array-callback-return\n sf.value = sf.value.replace(/,,/u, ',');\n }))\n };\n}\n"],"mappings":";;;;;;AAAe,SAAAA,SAAA,EAAY;EACzB,OAAO;IACLC,WAAW,EAAE,yCAAyC;IACtDC,QAAQ,EAAEC,MAAM,KAAK;MACnBC,KAAK,EAAE,CAACD,MAAM,CACXE,GAAG,CAAC,QAAQ,CAAC,CACbC,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACC,SAAS,CAACC,KAAK,CAACC,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAK,GAAG,IAAK,KAAK,CAAEC,IAAI,CAACF,EAAE,CAACG,KAAK,CAAC,CAAC;IACjF,CAAC,CAAC;IACFC,GAAG,EAAEX,MAAM,IAAIA,MAAM,CAACE,GAAG,CAAC,QAAQ,CAAC,CAACU,OAAO,CAACR,CAAC,IAAIA,CAAC,CAACC,SAAS,CAACQ,MAAM,CAACN,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAK,GAAG,CAAC,CAACI,OAAO,CAACL,EAAE,IAAI;MAAE;MACzGA,EAAE,CAACG,KAAK,GAAGH,EAAE,CAACG,KAAK,CAACI,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;IACzC,CAAC,CAAC;EACJ,CAAC;AACH","ignoreList":[]}
@@ -30,7 +30,7 @@ function _default(tagPattern) {
30
30
  }) => item) // eslint-disable-line no-unused-vars
31
31
  .forEach(({
32
32
  obj
33
- }) => record.removeField(obj));
33
+ }) => record.removeField(obj)); // eslint-disable-line array-callback-return
34
34
  }
35
35
  function iterateFields(record) {
36
36
  return record.fields.map(obj => ({
@@ -1 +1 @@
1
- {"version":3,"file":"duplicates-ind1.js","names":["_default","tagPattern","RegExp","description","validate","fix","Error","record","invalid","iterateFields","find","obj","validation","valid","messages","tag","filter","item","map","forEach","removeField","fields","matches","field","test","ind1","hasDuplicate","fieldA","some","fieldB","subfields","length","every","aSf","bSf","code","value"],"sources":["../src/duplicates-ind1.js"],"sourcesContent":["export default function (tagPattern) {\n if (tagPattern instanceof RegExp) {\n return {\n description:\n 'Handles data fields that only differ in the first indicator',\n validate,\n fix\n };\n }\n\n throw new Error('No tagPattern provided');\n\n function validate(record) {\n const invalid = iterateFields(record)\n .find(obj => obj.validation === true);\n return invalid ? {valid: false, messages: [`Multiple ${invalid.obj.tag} fields which only differ in the first indicator`]} : {valid: true, messages: []};\n }\n\n function fix(record) {\n iterateFields(record)\n .filter(item => item.validation === false)\n .map(({validation, ...item}) => item) // eslint-disable-line no-unused-vars\n .forEach(({obj}) => record.removeField(obj));\n }\n\n function iterateFields(record) {\n return record.fields.map(obj => ({validation: matches(obj, record.fields), obj}));\n }\n\n function matches(field, fields) {\n return tagPattern.test(field.tag) && field.ind1 === ' ' && hasDuplicate(field, fields);\n }\n\n function hasDuplicate(fieldA, fields) {\n return fields.some(fieldB => fieldA !== fieldB &&\n fieldA.tag === fieldB.tag &&\n fieldA.ind1 !== fieldB.ind1 &&\n fieldA.subfields.length === fieldB.subfields.length &&\n fieldA.subfields.every(aSf => fieldB.subfields.some(bSf => aSf.code === bSf.code && aSf.value === bSf.value)));\n }\n}\n"],"mappings":";;;;;;AAAe,SAAAA,SAAUC,UAAU,EAAE;EACnC,IAAIA,UAAU,YAAYC,MAAM,EAAE;IAChC,OAAO;MACLC,WAAW,EACT,6DAA6D;MAC/DC,QAAQ;MACRC;IACF,CAAC;EACH;EAEA,MAAM,IAAIC,KAAK,CAAC,wBAAwB,CAAC;EAEzC,SAASF,QAAQA,CAACG,MAAM,EAAE;IACxB,MAAMC,OAAO,GAAGC,aAAa,CAACF,MAAM,CAAC,CAClCG,IAAI,CAACC,GAAG,IAAIA,GAAG,CAACC,UAAU,KAAK,IAAI,CAAC;IACvC,OAAOJ,OAAO,GAAG;MAACK,KAAK,EAAE,KAAK;MAAEC,QAAQ,EAAE,CAAC,YAAYN,OAAO,CAACG,GAAG,CAACI,GAAG,kDAAkD;IAAC,CAAC,GAAG;MAACF,KAAK,EAAE,IAAI;MAAEC,QAAQ,EAAE;IAAE,CAAC;EAC1J;EAEA,SAAST,GAAGA,CAACE,MAAM,EAAE;IACnBE,aAAa,CAACF,MAAM,CAAC,CAClBS,MAAM,CAACC,IAAI,IAAIA,IAAI,CAACL,UAAU,KAAK,KAAK,CAAC,CACzCM,GAAG,CAAC,CAAC;MAACN,UAAU;MAAE,GAAGK;IAAI,CAAC,KAAKA,IAAI,CAAC,CAAC;IAAA,CACrCE,OAAO,CAAC,CAAC;MAACR;IAAG,CAAC,KAAKJ,MAAM,CAACa,WAAW,CAACT,GAAG,CAAC,CAAC;EAChD;EAEA,SAASF,aAAaA,CAACF,MAAM,EAAE;IAC7B,OAAOA,MAAM,CAACc,MAAM,CAACH,GAAG,CAACP,GAAG,KAAK;MAACC,UAAU,EAAEU,OAAO,CAACX,GAAG,EAAEJ,MAAM,CAACc,MAAM,CAAC;MAAEV;IAAG,CAAC,CAAC,CAAC;EACnF;EAEA,SAASW,OAAOA,CAACC,KAAK,EAAEF,MAAM,EAAE;IAC9B,OAAOpB,UAAU,CAACuB,IAAI,CAACD,KAAK,CAACR,GAAG,CAAC,IAAIQ,KAAK,CAACE,IAAI,KAAK,GAAG,IAAIC,YAAY,CAACH,KAAK,EAAEF,MAAM,CAAC;EACxF;EAEA,SAASK,YAAYA,CAACC,MAAM,EAAEN,MAAM,EAAE;IACpC,OAAOA,MAAM,CAACO,IAAI,CAACC,MAAM,IAAIF,MAAM,KAAKE,MAAM,IAC5CF,MAAM,CAACZ,GAAG,KAAKc,MAAM,CAACd,GAAG,IACzBY,MAAM,CAACF,IAAI,KAAKI,MAAM,CAACJ,IAAI,IAC3BE,MAAM,CAACG,SAAS,CAACC,MAAM,KAAKF,MAAM,CAACC,SAAS,CAACC,MAAM,IACnDJ,MAAM,CAACG,SAAS,CAACE,KAAK,CAACC,GAAG,IAAIJ,MAAM,CAACC,SAAS,CAACF,IAAI,CAACM,GAAG,IAAID,GAAG,CAACE,IAAI,KAAKD,GAAG,CAACC,IAAI,IAAIF,GAAG,CAACG,KAAK,KAAKF,GAAG,CAACE,KAAK,CAAC,CAAC,CAAC;EAClH;AACF","ignoreList":[]}
1
+ {"version":3,"file":"duplicates-ind1.js","names":["_default","tagPattern","RegExp","description","validate","fix","Error","record","invalid","iterateFields","find","obj","validation","valid","messages","tag","filter","item","map","forEach","removeField","fields","matches","field","test","ind1","hasDuplicate","fieldA","some","fieldB","subfields","length","every","aSf","bSf","code","value"],"sources":["../src/duplicates-ind1.js"],"sourcesContent":["export default function (tagPattern) {\n if (tagPattern instanceof RegExp) {\n return {\n description:\n 'Handles data fields that only differ in the first indicator',\n validate,\n fix\n };\n }\n\n throw new Error('No tagPattern provided');\n\n function validate(record) {\n const invalid = iterateFields(record)\n .find(obj => obj.validation === true);\n return invalid ? {valid: false, messages: [`Multiple ${invalid.obj.tag} fields which only differ in the first indicator`]} : {valid: true, messages: []};\n }\n\n function fix(record) {\n iterateFields(record)\n .filter(item => item.validation === false)\n .map(({validation, ...item}) => item) // eslint-disable-line no-unused-vars\n .forEach(({obj}) => record.removeField(obj)); // eslint-disable-line array-callback-return\n }\n\n function iterateFields(record) {\n return record.fields.map(obj => ({validation: matches(obj, record.fields), obj}));\n }\n\n function matches(field, fields) {\n return tagPattern.test(field.tag) && field.ind1 === ' ' && hasDuplicate(field, fields);\n }\n\n function hasDuplicate(fieldA, fields) {\n return fields.some(fieldB => fieldA !== fieldB &&\n fieldA.tag === fieldB.tag &&\n fieldA.ind1 !== fieldB.ind1 &&\n fieldA.subfields.length === fieldB.subfields.length &&\n fieldA.subfields.every(aSf => fieldB.subfields.some(bSf => aSf.code === bSf.code && aSf.value === bSf.value)));\n }\n}\n"],"mappings":";;;;;;AAAe,SAAAA,SAAUC,UAAU,EAAE;EACnC,IAAIA,UAAU,YAAYC,MAAM,EAAE;IAChC,OAAO;MACLC,WAAW,EACT,6DAA6D;MAC/DC,QAAQ;MACRC;IACF,CAAC;EACH;EAEA,MAAM,IAAIC,KAAK,CAAC,wBAAwB,CAAC;EAEzC,SAASF,QAAQA,CAACG,MAAM,EAAE;IACxB,MAAMC,OAAO,GAAGC,aAAa,CAACF,MAAM,CAAC,CAClCG,IAAI,CAACC,GAAG,IAAIA,GAAG,CAACC,UAAU,KAAK,IAAI,CAAC;IACvC,OAAOJ,OAAO,GAAG;MAACK,KAAK,EAAE,KAAK;MAAEC,QAAQ,EAAE,CAAC,YAAYN,OAAO,CAACG,GAAG,CAACI,GAAG,kDAAkD;IAAC,CAAC,GAAG;MAACF,KAAK,EAAE,IAAI;MAAEC,QAAQ,EAAE;IAAE,CAAC;EAC1J;EAEA,SAAST,GAAGA,CAACE,MAAM,EAAE;IACnBE,aAAa,CAACF,MAAM,CAAC,CAClBS,MAAM,CAACC,IAAI,IAAIA,IAAI,CAACL,UAAU,KAAK,KAAK,CAAC,CACzCM,GAAG,CAAC,CAAC;MAACN,UAAU;MAAE,GAAGK;IAAI,CAAC,KAAKA,IAAI,CAAC,CAAC;IAAA,CACrCE,OAAO,CAAC,CAAC;MAACR;IAAG,CAAC,KAAKJ,MAAM,CAACa,WAAW,CAACT,GAAG,CAAC,CAAC,CAAC,CAAC;EAClD;EAEA,SAASF,aAAaA,CAACF,MAAM,EAAE;IAC7B,OAAOA,MAAM,CAACc,MAAM,CAACH,GAAG,CAACP,GAAG,KAAK;MAACC,UAAU,EAAEU,OAAO,CAACX,GAAG,EAAEJ,MAAM,CAACc,MAAM,CAAC;MAAEV;IAAG,CAAC,CAAC,CAAC;EACnF;EAEA,SAASW,OAAOA,CAACC,KAAK,EAAEF,MAAM,EAAE;IAC9B,OAAOpB,UAAU,CAACuB,IAAI,CAACD,KAAK,CAACR,GAAG,CAAC,IAAIQ,KAAK,CAACE,IAAI,KAAK,GAAG,IAAIC,YAAY,CAACH,KAAK,EAAEF,MAAM,CAAC;EACxF;EAEA,SAASK,YAAYA,CAACC,MAAM,EAAEN,MAAM,EAAE;IACpC,OAAOA,MAAM,CAACO,IAAI,CAACC,MAAM,IAAIF,MAAM,KAAKE,MAAM,IAC5CF,MAAM,CAACZ,GAAG,KAAKc,MAAM,CAACd,GAAG,IACzBY,MAAM,CAACF,IAAI,KAAKI,MAAM,CAACJ,IAAI,IAC3BE,MAAM,CAACG,SAAS,CAACC,MAAM,KAAKF,MAAM,CAACC,SAAS,CAACC,MAAM,IACnDJ,MAAM,CAACG,SAAS,CAACE,KAAK,CAACC,GAAG,IAAIJ,MAAM,CAACC,SAAS,CAACF,IAAI,CAACM,GAAG,IAAID,GAAG,CAACE,IAAI,KAAKD,GAAG,CAACC,IAAI,IAAIF,GAAG,CAACG,KAAK,KAAKF,GAAG,CAACE,KAAK,CAAC,CAAC,CAAC;EAClH;AACF","ignoreList":[]}
@@ -39,18 +39,14 @@ function _default() {
39
39
  const errors = findErrors(record.fields);
40
40
  errors.forEach(error => {
41
41
  if (error.code === ERRORS.MISSING_SUBFIELD_VALUES) {
42
- // eslint-disable-line functional/no-conditional-statements
43
42
  if (error.emptySubfields.length === error.field.subfields.length) {
44
- // eslint-disable-line functional/no-conditional-statements
45
43
  record.removeField(error.field);
46
44
  } else {
47
- // eslint-disable-line functional/no-conditional-statements
48
45
  error.emptySubfields.forEach(sf => {
49
46
  record.removeSubfield(sf, error.field);
50
47
  });
51
48
  }
52
49
  } else {
53
- // eslint-disable-line functional/no-conditional-statements
54
50
  record.removeField(error.field);
55
51
  }
56
52
  });
@@ -1 +1 @@
1
- {"version":3,"file":"empty-fields.js","names":["ERRORS","EMPTY_SUBFIELDS","MISSING_SUBFIELD_VALUES","_default","description","validate","fix","record","errors","findErrors","fields","length","valid","messages","map","error","code","field","tag","emptySubfields","sf","join","forEach","subfields","removeField","removeSubfield","reduce","concat","subfieldsWithoutValue","filter","value"],"sources":["../src/empty-fields.js"],"sourcesContent":["const ERRORS = {\n EMPTY_SUBFIELDS: 2,\n MISSING_SUBFIELD_VALUES: 3\n};\n\nexport default function () {\n return {\n description: 'Handles empty fields',\n validate,\n fix\n };\n\n function validate(record) {\n const errors = findErrors(record.fields);\n if (errors.length > 0) {\n return {\n valid: false,\n messages: errors.map(error => { // eslint-disable-line array-callback-return\n switch (error.code) {\n case ERRORS.EMPTY_SUBFIELDS:\n return `Field ${error.field.tag} has no subfields`;\n case ERRORS.MISSING_SUBFIELD_VALUES:\n return `Field ${error.field.tag} has missing subfield values: ${error.emptySubfields.map(sf => sf.code).join()}`;\n default:\n }\n })\n };\n }\n\n return {valid: true};\n }\n\n function fix(record) {\n const errors = findErrors(record.fields);\n errors.forEach(error => {\n if (error.code === ERRORS.MISSING_SUBFIELD_VALUES) { // eslint-disable-line functional/no-conditional-statements\n if (error.emptySubfields.length === error.field.subfields.length) { // eslint-disable-line functional/no-conditional-statements\n record.removeField(error.field);\n } else { // eslint-disable-line functional/no-conditional-statements\n error.emptySubfields.forEach(sf => {\n record.removeSubfield(sf, error.field);\n });\n }\n } else { // eslint-disable-line functional/no-conditional-statements\n record.removeField(error.field);\n }\n });\n }\n\n function findErrors(fields) {\n return fields.reduce((errors, field) => {\n if (field.subfields) {\n if (field.subfields.length === 0) {\n return errors.concat({field, code: ERRORS.EMPTY_SUBFIELDS});\n }\n\n const subfieldsWithoutValue = field.subfields.filter(sf => !sf.value);\n\n if (subfieldsWithoutValue.length > 0) {\n return errors.concat({\n field,\n emptySubfields: subfieldsWithoutValue,\n code: ERRORS.MISSING_SUBFIELD_VALUES\n });\n }\n }\n\n return errors;\n }, []);\n }\n}\n"],"mappings":";;;;;;AAAA,MAAMA,MAAM,GAAG;EACbC,eAAe,EAAE,CAAC;EAClBC,uBAAuB,EAAE;AAC3B,CAAC;AAEc,SAAAC,SAAA,EAAY;EACzB,OAAO;IACLC,WAAW,EAAE,sBAAsB;IACnCC,QAAQ;IACRC;EACF,CAAC;EAED,SAASD,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAMC,MAAM,GAAGC,UAAU,CAACF,MAAM,CAACG,MAAM,CAAC;IACxC,IAAIF,MAAM,CAACG,MAAM,GAAG,CAAC,EAAE;MACrB,OAAO;QACLC,KAAK,EAAE,KAAK;QACZC,QAAQ,EAAEL,MAAM,CAACM,GAAG,CAACC,KAAK,IAAI;UAAE;UAC9B,QAAQA,KAAK,CAACC,IAAI;YAClB,KAAKhB,MAAM,CAACC,eAAe;cACzB,OAAO,SAASc,KAAK,CAACE,KAAK,CAACC,GAAG,mBAAmB;YACpD,KAAKlB,MAAM,CAACE,uBAAuB;cACjC,OAAO,SAASa,KAAK,CAACE,KAAK,CAACC,GAAG,iCAAiCH,KAAK,CAACI,cAAc,CAACL,GAAG,CAACM,EAAE,IAAIA,EAAE,CAACJ,IAAI,CAAC,CAACK,IAAI,CAAC,CAAC,EAAE;YAClH;UACA;QACF,CAAC;MACH,CAAC;IACH;IAEA,OAAO;MAACT,KAAK,EAAE;IAAI,CAAC;EACtB;EAEA,SAASN,GAAGA,CAACC,MAAM,EAAE;IACnB,MAAMC,MAAM,GAAGC,UAAU,CAACF,MAAM,CAACG,MAAM,CAAC;IACxCF,MAAM,CAACc,OAAO,CAACP,KAAK,IAAI;MACtB,IAAIA,KAAK,CAACC,IAAI,KAAKhB,MAAM,CAACE,uBAAuB,EAAE;QAAE;QACnD,IAAIa,KAAK,CAACI,cAAc,CAACR,MAAM,KAAKI,KAAK,CAACE,KAAK,CAACM,SAAS,CAACZ,MAAM,EAAE;UAAE;UAClEJ,MAAM,CAACiB,WAAW,CAACT,KAAK,CAACE,KAAK,CAAC;QACjC,CAAC,MAAM;UAAE;UACPF,KAAK,CAACI,cAAc,CAACG,OAAO,CAACF,EAAE,IAAI;YACjCb,MAAM,CAACkB,cAAc,CAACL,EAAE,EAAEL,KAAK,CAACE,KAAK,CAAC;UACxC,CAAC,CAAC;QACJ;MACF,CAAC,MAAM;QAAE;QACPV,MAAM,CAACiB,WAAW,CAACT,KAAK,CAACE,KAAK,CAAC;MACjC;IACF,CAAC,CAAC;EACJ;EAEA,SAASR,UAAUA,CAACC,MAAM,EAAE;IAC1B,OAAOA,MAAM,CAACgB,MAAM,CAAC,CAAClB,MAAM,EAAES,KAAK,KAAK;MACtC,IAAIA,KAAK,CAACM,SAAS,EAAE;QACnB,IAAIN,KAAK,CAACM,SAAS,CAACZ,MAAM,KAAK,CAAC,EAAE;UAChC,OAAOH,MAAM,CAACmB,MAAM,CAAC;YAACV,KAAK;YAAED,IAAI,EAAEhB,MAAM,CAACC;UAAe,CAAC,CAAC;QAC7D;QAEA,MAAM2B,qBAAqB,GAAGX,KAAK,CAACM,SAAS,CAACM,MAAM,CAACT,EAAE,IAAI,CAACA,EAAE,CAACU,KAAK,CAAC;QAErE,IAAIF,qBAAqB,CAACjB,MAAM,GAAG,CAAC,EAAE;UACpC,OAAOH,MAAM,CAACmB,MAAM,CAAC;YACnBV,KAAK;YACLE,cAAc,EAAES,qBAAqB;YACrCZ,IAAI,EAAEhB,MAAM,CAACE;UACf,CAAC,CAAC;QACJ;MACF;MAEA,OAAOM,MAAM;IACf,CAAC,EAAE,EAAE,CAAC;EACR;AACF","ignoreList":[]}
1
+ {"version":3,"file":"empty-fields.js","names":["ERRORS","EMPTY_SUBFIELDS","MISSING_SUBFIELD_VALUES","_default","description","validate","fix","record","errors","findErrors","fields","length","valid","messages","map","error","code","field","tag","emptySubfields","sf","join","forEach","subfields","removeField","removeSubfield","reduce","concat","subfieldsWithoutValue","filter","value"],"sources":["../src/empty-fields.js"],"sourcesContent":["const ERRORS = {\n EMPTY_SUBFIELDS: 2,\n MISSING_SUBFIELD_VALUES: 3\n};\n\nexport default function () {\n return {\n description: 'Handles empty fields',\n validate,\n fix\n };\n\n function validate(record) {\n const errors = findErrors(record.fields);\n if (errors.length > 0) {\n return {\n valid: false,\n messages: errors.map(error => { // eslint-disable-line array-callback-return\n switch (error.code) {\n case ERRORS.EMPTY_SUBFIELDS:\n return `Field ${error.field.tag} has no subfields`;\n case ERRORS.MISSING_SUBFIELD_VALUES:\n return `Field ${error.field.tag} has missing subfield values: ${error.emptySubfields.map(sf => sf.code).join()}`;\n default:\n }\n })\n };\n }\n\n return {valid: true};\n }\n\n function fix(record) {\n const errors = findErrors(record.fields);\n errors.forEach(error => {\n if (error.code === ERRORS.MISSING_SUBFIELD_VALUES) {\n if (error.emptySubfields.length === error.field.subfields.length) {\n record.removeField(error.field);\n } else {\n error.emptySubfields.forEach(sf => {\n record.removeSubfield(sf, error.field);\n });\n }\n } else {\n record.removeField(error.field);\n }\n });\n }\n\n function findErrors(fields) {\n return fields.reduce((errors, field) => {\n if (field.subfields) {\n if (field.subfields.length === 0) {\n return errors.concat({field, code: ERRORS.EMPTY_SUBFIELDS});\n }\n\n const subfieldsWithoutValue = field.subfields.filter(sf => !sf.value);\n\n if (subfieldsWithoutValue.length > 0) {\n return errors.concat({\n field,\n emptySubfields: subfieldsWithoutValue,\n code: ERRORS.MISSING_SUBFIELD_VALUES\n });\n }\n }\n\n return errors;\n }, []);\n }\n}\n"],"mappings":";;;;;;AAAA,MAAMA,MAAM,GAAG;EACbC,eAAe,EAAE,CAAC;EAClBC,uBAAuB,EAAE;AAC3B,CAAC;AAEc,SAAAC,SAAA,EAAY;EACzB,OAAO;IACLC,WAAW,EAAE,sBAAsB;IACnCC,QAAQ;IACRC;EACF,CAAC;EAED,SAASD,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAMC,MAAM,GAAGC,UAAU,CAACF,MAAM,CAACG,MAAM,CAAC;IACxC,IAAIF,MAAM,CAACG,MAAM,GAAG,CAAC,EAAE;MACrB,OAAO;QACLC,KAAK,EAAE,KAAK;QACZC,QAAQ,EAAEL,MAAM,CAACM,GAAG,CAACC,KAAK,IAAI;UAAE;UAC9B,QAAQA,KAAK,CAACC,IAAI;YAClB,KAAKhB,MAAM,CAACC,eAAe;cACzB,OAAO,SAASc,KAAK,CAACE,KAAK,CAACC,GAAG,mBAAmB;YACpD,KAAKlB,MAAM,CAACE,uBAAuB;cACjC,OAAO,SAASa,KAAK,CAACE,KAAK,CAACC,GAAG,iCAAiCH,KAAK,CAACI,cAAc,CAACL,GAAG,CAACM,EAAE,IAAIA,EAAE,CAACJ,IAAI,CAAC,CAACK,IAAI,CAAC,CAAC,EAAE;YAClH;UACA;QACF,CAAC;MACH,CAAC;IACH;IAEA,OAAO;MAACT,KAAK,EAAE;IAAI,CAAC;EACtB;EAEA,SAASN,GAAGA,CAACC,MAAM,EAAE;IACnB,MAAMC,MAAM,GAAGC,UAAU,CAACF,MAAM,CAACG,MAAM,CAAC;IACxCF,MAAM,CAACc,OAAO,CAACP,KAAK,IAAI;MACtB,IAAIA,KAAK,CAACC,IAAI,KAAKhB,MAAM,CAACE,uBAAuB,EAAE;QACjD,IAAIa,KAAK,CAACI,cAAc,CAACR,MAAM,KAAKI,KAAK,CAACE,KAAK,CAACM,SAAS,CAACZ,MAAM,EAAE;UAChEJ,MAAM,CAACiB,WAAW,CAACT,KAAK,CAACE,KAAK,CAAC;QACjC,CAAC,MAAM;UACLF,KAAK,CAACI,cAAc,CAACG,OAAO,CAACF,EAAE,IAAI;YACjCb,MAAM,CAACkB,cAAc,CAACL,EAAE,EAAEL,KAAK,CAACE,KAAK,CAAC;UACxC,CAAC,CAAC;QACJ;MACF,CAAC,MAAM;QACLV,MAAM,CAACiB,WAAW,CAACT,KAAK,CAACE,KAAK,CAAC;MACjC;IACF,CAAC,CAAC;EACJ;EAEA,SAASR,UAAUA,CAACC,MAAM,EAAE;IAC1B,OAAOA,MAAM,CAACgB,MAAM,CAAC,CAAClB,MAAM,EAAES,KAAK,KAAK;MACtC,IAAIA,KAAK,CAACM,SAAS,EAAE;QACnB,IAAIN,KAAK,CAACM,SAAS,CAACZ,MAAM,KAAK,CAAC,EAAE;UAChC,OAAOH,MAAM,CAACmB,MAAM,CAAC;YAACV,KAAK;YAAED,IAAI,EAAEhB,MAAM,CAACC;UAAe,CAAC,CAAC;QAC7D;QAEA,MAAM2B,qBAAqB,GAAGX,KAAK,CAACM,SAAS,CAACM,MAAM,CAACT,EAAE,IAAI,CAACA,EAAE,CAACU,KAAK,CAAC;QAErE,IAAIF,qBAAqB,CAACjB,MAAM,GAAG,CAAC,EAAE;UACpC,OAAOH,MAAM,CAACmB,MAAM,CAAC;YACnBV,KAAK;YACLE,cAAc,EAAES,qBAAqB;YACrCZ,IAAI,EAAEhB,MAAM,CAACE;UACf,CAAC,CAAC;QACJ;MACF;MAEA,OAAOM,MAAM;IACf,CAAC,EAAE,EAAE,CAAC;EACR;AACF","ignoreList":[]}