@natlibfi/marc-record-validators-melinda 11.6.6 → 11.6.7-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -1 +1 @@
1
- {"version":3,"file":"resolvable-ext-references-melinda.js","names":["_xml2js","require","_nodeFetch","_interopRequireDefault","e","__esModule","default","_default","endpoint","prefixPattern","fields","RegExp","description","validate","Error","record","validateResult","validateRecord","removedPrefixes","subfields","reduce","prev","current","Object","keys","forEach","key","tag","push","matchingTags","filter","item","values","value","code","obj","test","replace","resolveValidation","length","validateMatchingTags","then","result","valid","messages","tags","resolved","Promise","all","map","getData","every","recID","queryParam","response","fetch","xml","text","resolve","parseString","err","slice","position","parseInt"],"sources":["../src/resolvable-ext-references-melinda.js"],"sourcesContent":["import {parseString} from 'xml2js';\nimport fetch from 'node-fetch';\n\nexport default function ({endpoint, prefixPattern, fields}) {\n if (typeof endpoint === 'string' && prefixPattern instanceof RegExp && typeof fields === 'object') {\n return {\n description: 'Checks if Melinda entity references are resolvable',\n validate\n };\n }\n\n throw new Error('Error in validation parameters');\n\n async function validate(record) {\n const validateResult = await validateRecord(record);\n return validateResult;\n }\n\n function validateRecord(record) {\n const removedPrefixes = [];\n\n // Filter matching field keys from record.fields\n const subfields = record.fields.reduce((prev, current) => {\n Object.keys(fields).forEach(key => {\n if (key === current.tag) { // eslint-disable-line functional/no-conditional-statements\n prev.push(current); // eslint-disable-line functional/immutable-data\n }\n });\n return prev;\n }, []);\n\n // Filter matching objects from subfields\n const matchingTags = [...subfields].reduce((prev, current) => {\n Object.keys(fields).forEach(key => {\n if (key === current.tag) { // eslint-disable-line functional/no-conditional-statements\n current.subfields.filter(item => {\n if (Object.values(fields[key]).filter(value => value === item.code)[0]) { // eslint-disable-line functional/no-conditional-statements\n prev.push({tag: current.tag, code: item.code, value: item.value}); // eslint-disable-line functional/immutable-data\n }\n\n return prev;\n });\n }\n });\n return prev;\n }, []);\n\n // Matching prefixPattern is removed from object value field.\n matchingTags.forEach(obj => {\n if (prefixPattern.test(obj.value)) { // eslint-disable-line functional/no-conditional-statements\n obj.value = obj.value.replace(prefixPattern, ''); // eslint-disable-line functional/immutable-data\n removedPrefixes.push(obj); // eslint-disable-line functional/immutable-data\n }\n });\n return resolveValidation(removedPrefixes);\n }\n\n function resolveValidation(removedPrefixes) {\n // If matching prefixPatterns found make an API call\n if (removedPrefixes.length > 0) {\n return validateMatchingTags(removedPrefixes).then(result => result);\n }\n\n return {valid: true, messages: []};\n }\n\n async function validateMatchingTags(tags) {\n const resolved = await Promise.all(tags.map(obj => getData(obj.value).then(valid => ({valid, ...obj}))));\n\n if (resolved.every(value => value.valid === true)) {\n return {valid: true, messages: []};\n }\n\n return {valid: false, messages: resolved.map(obj => `Field ${obj.tag}$${obj.code} with value ${obj.value} is not resolvable`)};\n }\n\n async function getData(recID) {\n const queryParam = '?operation=searchRetrieve&maximumRecords=2&version=1&query=rec.id=';\n\n const response = await fetch(`${endpoint}${queryParam}${recID}`);\n\n const xml = await response.text();\n\n return new Promise(resolve => {\n parseString(xml, (err, result) => {\n const record = result['zs:searchRetrieveResponse']['zs:records'].slice(-1)?.[0];\n const position = parseInt(record?.['zs:record'].slice(-1)?.[0]['zs:recordPosition'][0], 10);\n resolve(position === 1 && !err);\n });\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"resolvable-ext-references-melinda.js","names":["_xml2js","require","_nodeFetch","_interopRequireDefault","e","__esModule","default","_default","endpoint","prefixPattern","fields","RegExp","description","validate","Error","record","validateResult","validateRecord","removedPrefixes","subfields","reduce","prev","current","Object","keys","forEach","key","tag","push","matchingTags","filter","item","values","value","code","obj","test","replace","resolveValidation","length","validateMatchingTags","then","result","valid","messages","tags","resolved","Promise","all","map","getData","every","recID","queryParam","response","fetch","xml","text","resolve","parseString","err","slice","position","parseInt"],"sources":["../src/resolvable-ext-references-melinda.js"],"sourcesContent":["import {parseString} from 'xml2js';\nimport fetch from 'node-fetch';\n\nexport default function ({endpoint, prefixPattern, fields}) {\n if (typeof endpoint === 'string' && prefixPattern instanceof RegExp && typeof fields === 'object') {\n return {\n description: 'Checks if Melinda entity references are resolvable',\n validate\n };\n }\n\n throw new Error('Error in validation parameters');\n\n async function validate(record) {\n const validateResult = await validateRecord(record);\n return validateResult;\n }\n\n function validateRecord(record) {\n const removedPrefixes = [];\n\n // Filter matching field keys from record.fields\n const subfields = record.fields.reduce((prev, current) => {\n Object.keys(fields).forEach(key => {\n if (key === current.tag) {\n prev.push(current);\n }\n });\n return prev;\n }, []);\n\n // Filter matching objects from subfields\n const matchingTags = [...subfields].reduce((prev, current) => {\n Object.keys(fields).forEach(key => {\n if (key === current.tag) {\n current.subfields.filter(item => {\n if (Object.values(fields[key]).filter(value => value === item.code)[0]) {\n prev.push({tag: current.tag, code: item.code, value: item.value});\n }\n\n return prev;\n });\n }\n });\n return prev;\n }, []);\n\n // Matching prefixPattern is removed from object value field.\n matchingTags.forEach(obj => {\n if (prefixPattern.test(obj.value)) {\n obj.value = obj.value.replace(prefixPattern, '');\n removedPrefixes.push(obj);\n }\n });\n return resolveValidation(removedPrefixes);\n }\n\n function resolveValidation(removedPrefixes) {\n // If matching prefixPatterns found make an API call\n if (removedPrefixes.length > 0) {\n return validateMatchingTags(removedPrefixes).then(result => result);\n }\n\n return {valid: true, messages: []};\n }\n\n async function validateMatchingTags(tags) {\n const resolved = await Promise.all(tags.map(obj => getData(obj.value).then(valid => ({valid, ...obj}))));\n\n if (resolved.every(value => value.valid === true)) {\n return {valid: true, messages: []};\n }\n\n return {valid: false, messages: resolved.map(obj => `Field ${obj.tag}$${obj.code} with value ${obj.value} is not resolvable`)};\n }\n\n async function getData(recID) {\n const queryParam = '?operation=searchRetrieve&maximumRecords=2&version=1&query=rec.id=';\n\n const response = await fetch(`${endpoint}${queryParam}${recID}`);\n\n const xml = await response.text();\n\n return new Promise(resolve => {\n parseString(xml, (err, result) => {\n const record = result['zs:searchRetrieveResponse']['zs:records'].slice(-1)?.[0];\n const position = parseInt(record?.['zs:record'].slice(-1)?.[0]['zs:recordPosition'][0], 10);\n resolve(position === 1 && !err);\n });\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -25,12 +25,12 @@ function _default() {
25
25
  fix: [],
26
26
  valid: true
27
27
  };
28
- //message.fix = []; // eslint-disable-line functional/immutable-data
28
+ //message.fix = [];
29
29
 
30
30
  // This can not really fail...
31
31
  recordFixSubfield6OccurrenceNumbers(record);
32
32
 
33
- //message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data
33
+ //message.valid = !(message.message.length >= 1);
34
34
  return res;
35
35
  }
36
36
  function validate(record) {
@@ -42,21 +42,21 @@ function _default() {
42
42
  message: []
43
43
  };
44
44
  if (orphanedFields.length > 0) {
45
- // eslint-disable-line functional/no-conditional-statements
46
- res.message = [`${orphanedFields.length} orphaned occurrence number field(s) detected`]; // eslint-disable-line functional/immutable-data
45
+ res.message = [`${orphanedFields.length} orphaned occurrence number field(s) detected`];
47
46
  }
48
- res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data
47
+ res.valid = res.message.length < 1;
49
48
  return res;
50
49
  }
51
50
  }
52
51
  function recordFixSubfield6OccurrenceNumbers(record) {
53
52
  const fieldsContainingSubfield6 = record.fields.filter(field => (0, _utils.fieldHasSubfield)(field, '6'));
54
53
  const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);
55
- orphanedFields.forEach(field => fieldFixOrphanedSubfields(field));
54
+ orphanedFields.forEach(field => fieldFixOrphanedSubfields(field)); // eslint-disable-line array-callback-return
55
+
56
56
  function fieldFixOrphanedSubfields(field) {
57
57
  // Field 880: orphaned $6 subfields: occurrence number is changed to '00':
58
58
  if (field.tag === '880') {
59
- field.subfields.forEach(sf => field880FixOrphanedSubfield(sf));
59
+ field.subfields.forEach(sf => field880FixOrphanedSubfield(sf)); // eslint-disable-line array-callback-return
60
60
  return;
61
61
  }
62
62
  // Non-880 fields get their orphaned $6s removed:
@@ -65,7 +65,7 @@ function recordFixSubfield6OccurrenceNumbers(record) {
65
65
  record.removeField(field);
66
66
  return;
67
67
  }
68
- field.subfields = remainingSubfields; // eslint-disable-line functional/immutable-data
68
+ field.subfields = remainingSubfields;
69
69
  }
70
70
  function field880FixOrphanedSubfield(subfield) {
71
71
  if (!isOrphanedSubfield(subfield, '880', fieldsContainingSubfield6)) {
@@ -81,7 +81,7 @@ function findPairForSubfield6OccurrenceNumber(subfield6, myTag, candPairFields)
81
81
  return undefined;
82
82
  }
83
83
  (0, _utils.nvdebug)(`LOOKING FOR PAIR: ${myTag} ${(0, _utils.subfieldToString)(subfield6)}`);
84
- candPairFields.forEach(field => (0, _utils.fieldToString)(field));
84
+ candPairFields.forEach(field => (0, _utils.fieldToString)(field)); // eslint-disable-line array-callback-return
85
85
 
86
86
  // Only valid $6 value that fails to map to another field is iffy...
87
87
  const referredTag = subfield6.value.substring(0, 3);
@@ -1 +1 @@
1
- {"version":3,"file":"resolveOrphanedSubfield6s.js","names":["_debug","_interopRequireDefault","require","_utils","_subfield6Utils","e","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","recordFixSubfield6OccurrenceNumbers","fieldsContainingSubfield6","fields","filter","field","fieldHasSubfield","orphanedFields","getOrphanedFields","length","forEach","fieldFixOrphanedSubfields","tag","subfields","sf","field880FixOrphanedSubfield","remainingSubfields","isOrphanedSubfield","removeField","subfield","subfield6ResetOccurrenceNumber","findPairForSubfield6OccurrenceNumber","subfield6","myTag","candPairFields","isValidSubfield6","undefined","subfieldToString","fieldToString","referredTag","value","substring","occurrenceNumber","subfield6GetOccurrenceNumber","tagAndOccurrenceNumber","relevantFields","fieldHasWantedTagAndOccurrenceNumber","pairCandidateFields","isOrphanedField","candidatePairFields","some"],"sources":["../src/resolveOrphanedSubfield6s.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString, nvdebug, subfieldToString} from './utils';\nimport {fieldHasWantedTagAndOccurrenceNumber, isValidSubfield6, subfield6GetOccurrenceNumber, subfield6ResetOccurrenceNumber} from './subfield6Utils';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:resolveOrphanedSubfield6s');\n\nexport default function () {\n return {\n description: 'Remove occurrence-number-orphaned $6 subfields. In field 880, occurrence number becomes 00',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix SF6 orphaned occurrence numbers');\n const res = {message: [], fix: [], valid: true};\n //message.fix = []; // eslint-disable-line functional/immutable-data\n\n // This can not really fail...\n recordFixSubfield6OccurrenceNumbers(record);\n\n //message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validate(record) {\n // Check max, and check number of different indexes\n nvdebug('Validate SF6 orphaned occurrence numbers', debug);\n const fieldsContainingSubfield6 = record.fields.filter(field => fieldHasSubfield(field, '6'));\n\n const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);\n\n const res = {message: []};\n\n if (orphanedFields.length > 0) { // eslint-disable-line functional/no-conditional-statements\n res.message = [`${orphanedFields.length} orphaned occurrence number field(s) detected`]; // eslint-disable-line functional/immutable-data\n }\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\nexport function recordFixSubfield6OccurrenceNumbers(record) {\n const fieldsContainingSubfield6 = record.fields.filter(field => fieldHasSubfield(field, '6'));\n const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);\n\n orphanedFields.forEach(field => fieldFixOrphanedSubfields(field));\n\n function fieldFixOrphanedSubfields(field) {\n // Field 880: orphaned $6 subfields: occurrence number is changed to '00':\n if (field.tag === '880') {\n field.subfields.forEach(sf => field880FixOrphanedSubfield(sf));\n return;\n }\n // Non-880 fields get their orphaned $6s removed:\n const remainingSubfields = field.subfields.filter(sf => !isOrphanedSubfield(sf, field.tag, fieldsContainingSubfield6));\n if (remainingSubfields.length === 0) {\n record.removeField(field);\n return;\n }\n field.subfields = remainingSubfields; // eslint-disable-line functional/immutable-data\n }\n\n function field880FixOrphanedSubfield(subfield) {\n if (!isOrphanedSubfield(subfield, '880', fieldsContainingSubfield6)) {\n return;\n }\n // convert occurrence number to 00\n subfield6ResetOccurrenceNumber(subfield, '00');\n }\n}\n\n\nfunction findPairForSubfield6OccurrenceNumber(subfield6, myTag, candPairFields) {\n // We keep the crap!\n if (!isValidSubfield6(subfield6)) {\n return undefined;\n }\n nvdebug(`LOOKING FOR PAIR: ${myTag} ${subfieldToString(subfield6)}`);\n candPairFields.forEach(field => fieldToString(field));\n\n // Only valid $6 value that fails to map to another field is iffy...\n const referredTag = subfield6.value.substring(0, 3);\n\n const occurrenceNumber = subfield6GetOccurrenceNumber(subfield6);\n if (occurrenceNumber === '00') {\n return undefined;\n }\n const tagAndOccurrenceNumber = `${myTag}-${occurrenceNumber}`;\n nvdebug(`Try to find occurrence number ${tagAndOccurrenceNumber} in field ${referredTag}...`);\n //const relevantFields = fields.filter(field => field.tag === referredTag && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber));\n const relevantFields = candPairFields.filter(field => field.tag === referredTag && fieldHasWantedTagAndOccurrenceNumber(field, tagAndOccurrenceNumber));\n if (relevantFields.length === 0) {\n return undefined;\n }\n // This should always return just one (not sanity checking this for now):\n return relevantFields[0];\n}\n\nfunction isOrphanedSubfield(subfield, tag, pairCandidateFields) {\n if (!isValidSubfield6(subfield) || subfield6GetOccurrenceNumber(subfield) === '00') {\n return false;\n }\n return !findPairForSubfield6OccurrenceNumber(subfield, tag, pairCandidateFields);\n}\n\n\nfunction isOrphanedField(field, candidatePairFields) {\n return field.subfields.some(sf => isOrphanedSubfield(sf, field.tag, candidatePairFields));\n}\n\nfunction getOrphanedFields(relevantFields) {\n return relevantFields.filter(field => isOrphanedField(field, relevantFields));\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"resolveOrphanedSubfield6s.js","names":["_debug","_interopRequireDefault","require","_utils","_subfield6Utils","e","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","recordFixSubfield6OccurrenceNumbers","fieldsContainingSubfield6","fields","filter","field","fieldHasSubfield","orphanedFields","getOrphanedFields","length","forEach","fieldFixOrphanedSubfields","tag","subfields","sf","field880FixOrphanedSubfield","remainingSubfields","isOrphanedSubfield","removeField","subfield","subfield6ResetOccurrenceNumber","findPairForSubfield6OccurrenceNumber","subfield6","myTag","candPairFields","isValidSubfield6","undefined","subfieldToString","fieldToString","referredTag","value","substring","occurrenceNumber","subfield6GetOccurrenceNumber","tagAndOccurrenceNumber","relevantFields","fieldHasWantedTagAndOccurrenceNumber","pairCandidateFields","isOrphanedField","candidatePairFields","some"],"sources":["../src/resolveOrphanedSubfield6s.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString, nvdebug, subfieldToString} from './utils';\nimport {fieldHasWantedTagAndOccurrenceNumber, isValidSubfield6, subfield6GetOccurrenceNumber, subfield6ResetOccurrenceNumber} from './subfield6Utils';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:resolveOrphanedSubfield6s');\n\nexport default function () {\n return {\n description: 'Remove occurrence-number-orphaned $6 subfields. In field 880, occurrence number becomes 00',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix SF6 orphaned occurrence numbers');\n const res = {message: [], fix: [], valid: true};\n //message.fix = [];\n\n // This can not really fail...\n recordFixSubfield6OccurrenceNumbers(record);\n\n //message.valid = !(message.message.length >= 1);\n return res;\n }\n\n function validate(record) {\n // Check max, and check number of different indexes\n nvdebug('Validate SF6 orphaned occurrence numbers', debug);\n const fieldsContainingSubfield6 = record.fields.filter(field => fieldHasSubfield(field, '6'));\n\n const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);\n\n const res = {message: []};\n\n if (orphanedFields.length > 0) {\n res.message = [`${orphanedFields.length} orphaned occurrence number field(s) detected`];\n }\n res.valid = res.message.length < 1;\n return res;\n }\n}\n\nexport function recordFixSubfield6OccurrenceNumbers(record) {\n const fieldsContainingSubfield6 = record.fields.filter(field => fieldHasSubfield(field, '6'));\n const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);\n\n orphanedFields.forEach(field => fieldFixOrphanedSubfields(field)); // eslint-disable-line array-callback-return\n\n function fieldFixOrphanedSubfields(field) {\n // Field 880: orphaned $6 subfields: occurrence number is changed to '00':\n if (field.tag === '880') {\n field.subfields.forEach(sf => field880FixOrphanedSubfield(sf)); // eslint-disable-line array-callback-return\n return;\n }\n // Non-880 fields get their orphaned $6s removed:\n const remainingSubfields = field.subfields.filter(sf => !isOrphanedSubfield(sf, field.tag, fieldsContainingSubfield6));\n if (remainingSubfields.length === 0) {\n record.removeField(field);\n return;\n }\n field.subfields = remainingSubfields;\n }\n\n function field880FixOrphanedSubfield(subfield) {\n if (!isOrphanedSubfield(subfield, '880', fieldsContainingSubfield6)) {\n return;\n }\n // convert occurrence number to 00\n subfield6ResetOccurrenceNumber(subfield, '00');\n }\n}\n\n\nfunction findPairForSubfield6OccurrenceNumber(subfield6, myTag, candPairFields) {\n // We keep the crap!\n if (!isValidSubfield6(subfield6)) {\n return undefined;\n }\n nvdebug(`LOOKING FOR PAIR: ${myTag} ${subfieldToString(subfield6)}`);\n candPairFields.forEach(field => fieldToString(field)); // eslint-disable-line array-callback-return\n\n // Only valid $6 value that fails to map to another field is iffy...\n const referredTag = subfield6.value.substring(0, 3);\n\n const occurrenceNumber = subfield6GetOccurrenceNumber(subfield6);\n if (occurrenceNumber === '00') {\n return undefined;\n }\n const tagAndOccurrenceNumber = `${myTag}-${occurrenceNumber}`;\n nvdebug(`Try to find occurrence number ${tagAndOccurrenceNumber} in field ${referredTag}...`);\n //const relevantFields = fields.filter(field => field.tag === referredTag && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber));\n const relevantFields = candPairFields.filter(field => field.tag === referredTag && fieldHasWantedTagAndOccurrenceNumber(field, tagAndOccurrenceNumber));\n if (relevantFields.length === 0) {\n return undefined;\n }\n // This should always return just one (not sanity checking this for now):\n return relevantFields[0];\n}\n\nfunction isOrphanedSubfield(subfield, tag, pairCandidateFields) {\n if (!isValidSubfield6(subfield) || subfield6GetOccurrenceNumber(subfield) === '00') {\n return false;\n }\n return !findPairForSubfield6OccurrenceNumber(subfield, tag, pairCandidateFields);\n}\n\n\nfunction isOrphanedField(field, candidatePairFields) {\n return field.subfields.some(sf => isOrphanedSubfield(sf, field.tag, candidatePairFields));\n}\n\nfunction getOrphanedFields(relevantFields) {\n return relevantFields.filter(field => isOrphanedField(field, relevantFields));\n}\n"],"mappings":"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","ignoreList":[]}
@@ -25,7 +25,7 @@ function _default() {
25
25
  valid: true
26
26
  };
27
27
  const relevantFields = getRelevantFields(record);
28
- relevantFields.forEach(f => fieldSanitizeVocabularySourceCode(f));
28
+ relevantFields.forEach(f => fieldSanitizeVocabularySourceCode(f)); // eslint-disable-line array-callback-return
29
29
  return res;
30
30
  }
31
31
  function validate(record) {
@@ -33,8 +33,9 @@ function _default() {
33
33
  message: []
34
34
  };
35
35
  const relevantFields = getRelevantFields(record);
36
- relevantFields.forEach(field => validateField(field, res));
37
- res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data
36
+ relevantFields.forEach(field => validateField(field, res)); // eslint-disable-line array-callback-return
37
+
38
+ res.valid = !(res.message.length >= 1);
38
39
  return res;
39
40
  }
40
41
  function getRelevantFields(record) {
@@ -46,25 +47,25 @@ function _default() {
46
47
  const mod = (0, _utils.fieldToString)(normalizedField);
47
48
  if (orig !== mod) {
48
49
  // Fail as the input is "broken"/"crap"/sumthing
49
- res.message.push(`FIXABLE: '${orig}' => '${mod}'`); // eslint-disable-line functional/immutable-data
50
+ res.message.push(`FIXABLE: '${orig}' => '${mod}'`);
50
51
  return;
51
52
  }
52
53
  // Handle illegal values here
53
54
  if (fieldHasUnfixableVocabularySourceCode(field)) {
54
- res.message.push(`CAN'T BE FIXED AUTOMATICALLY: '${orig}'`); // eslint-disable-line functional/immutable-data
55
+ res.message.push(`CAN'T BE FIXED AUTOMATICALLY: '${orig}'`);
55
56
  return;
56
57
  }
57
58
  return;
58
59
  }
59
60
  function fieldSanitizeVocabularySourceCode(field) {
60
- field.subfields.forEach(sf => subfieldSanitizeVocabularySourceCode(sf));
61
+ field.subfields.forEach(sf => subfieldSanitizeVocabularySourceCode(sf)); // eslint-disable-line array-callback-return
61
62
  return field;
62
63
  }
63
64
  function subfieldSanitizeVocabularySourceCode(subfield) {
64
65
  if (subfield.code !== '2') {
65
66
  return;
66
67
  }
67
- subfield.value = stringFixVocabularySourceCode(subfield.value); // eslint-disable-line functional/immutable-data
68
+ subfield.value = stringFixVocabularySourceCode(subfield.value);
68
69
  }
69
70
  }
70
71
 
@@ -72,8 +73,7 @@ function _default() {
72
73
  const legalSubfieldCode = ['allars', 'kauno', 'kauno/fin', 'kauno/swe', 'mts', 'mts/fin', 'mts/swe', 'slm', 'slm/fin', 'slm/swe', 'ysa', 'yso', 'yso/eng', 'yso/fin', 'yso/sme', 'yso/swe'];
73
74
  function stringFixVocabularySourceCode(value) {
74
75
  // Try to remove spaces, change '//' to '/' and remove final '.' and '/':
75
- const tmp = value.replace(/ /ug, '').replace(/\/+/ug, '/').replace(/(.)[./]$/gu, '$1') // eslint-disable-line prefer-named-capture-group
76
- .replace(/^yso-(?:aika|paikat)\//u, 'yso/'); // IMP-HELMET crap. Also, they still have a '.' at the end of $a...
76
+ const tmp = value.replace(/ /ug, '').replace(/\/+/ug, '/').replace(/(.)[./]$/gu, '$1').replace(/^yso-(?:aika|paikat)\//u, 'yso/'); // IMP-HELMET crap. Also, they still have a '.' at the end of $a...
77
77
 
78
78
  // NB! Use the modified value ONLY if the result (tmp variable) is a legal subfield code...
79
79
  if (legalSubfieldCode.includes(tmp)) {
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize-vocabulary-source-codes.js","names":["_utils","require","_clone","_interopRequireDefault","e","__esModule","default","_default","description","validate","fix","record","res","message","valid","relevantFields","getRelevantFields","forEach","f","fieldSanitizeVocabularySourceCode","field","validateField","length","fields","filter","subfields","tag","match","orig","fieldToString","normalizedField","clone","mod","push","fieldHasUnfixableVocabularySourceCode","sf","subfieldSanitizeVocabularySourceCode","subfield","code","value","stringFixVocabularySourceCode","legalSubfieldCode","tmp","replace","includes","some","subfieldHasUnfixableVocabularySourceCode","indexOf"],"sources":["../src/sanitize-vocabulary-source-codes.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils';\nimport clone from 'clone';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes);\n\n// Author(s): Nicholas Volk, Joni Ollila\nexport default function () {\n\n return {\n description: 'Validator for sanitizing vocabulary source codes in subfield $2 (MRA-532)',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n const relevantFields = getRelevantFields(record);\n relevantFields.forEach(f => fieldSanitizeVocabularySourceCode(f));\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n const relevantFields = getRelevantFields(record);\n\n relevantFields.forEach(field => validateField(field, res));\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function getRelevantFields(record) {\n return record.fields.filter(f => f.subfields && f.tag.match(/^(?:6..|257|370|38.)$/u));\n }\n\n function validateField(field, res) {\n const orig = fieldToString(field);\n\n const normalizedField = fieldSanitizeVocabularySourceCode(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`FIXABLE: '${orig}' => '${mod}'`); // eslint-disable-line functional/immutable-data\n return;\n }\n // Handle illegal values here\n if (fieldHasUnfixableVocabularySourceCode(field)) {\n res.message.push(`CAN'T BE FIXED AUTOMATICALLY: '${orig}'`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n\n\n function fieldSanitizeVocabularySourceCode(field) {\n field.subfields.forEach(sf => subfieldSanitizeVocabularySourceCode(sf));\n return field;\n }\n\n function subfieldSanitizeVocabularySourceCode(subfield) {\n if (subfield.code !== '2') {\n return;\n }\n subfield.value = stringFixVocabularySourceCode(subfield.value); // eslint-disable-line functional/immutable-data\n }\n\n}\n\n// Note that language suffix is optional\nconst legalSubfieldCode = ['allars', 'kauno', 'kauno/fin', 'kauno/swe', 'mts', 'mts/fin', 'mts/swe', 'slm', 'slm/fin', 'slm/swe', 'ysa', 'yso', 'yso/eng', 'yso/fin', 'yso/sme', 'yso/swe'];\n\nfunction stringFixVocabularySourceCode(value) {\n // Try to remove spaces, change '//' to '/' and remove final '.' and '/':\n const tmp = value.replace(/ /ug, '')\n .replace(/\\/+/ug, '/')\n .replace(/(.)[./]$/gu, '$1') // eslint-disable-line prefer-named-capture-group\n .replace(/^yso-(?:aika|paikat)\\//u, 'yso/'); // IMP-HELMET crap. Also, they still have a '.' at the end of $a...\n\n // NB! Use the modified value ONLY if the result (tmp variable) is a legal subfield code...\n if (legalSubfieldCode.includes(tmp)) {\n return tmp;\n }\n\n return value;\n}\n\nfunction fieldHasUnfixableVocabularySourceCode(field) {\n return field.subfields.some(sf => subfieldHasUnfixableVocabularySourceCode(sf));\n}\n\nfunction subfieldHasUnfixableVocabularySourceCode(subfield) {\n if (subfield.code !== '2') {\n return false;\n }\n\n // As we can't fix this here, apply this yso-rule only when validating!\n if (subfield.value.indexOf('yso/') === 0) {\n return !['yso/eng', 'yso/fin', 'yso/sme', 'yso/swe'].includes(subfield.value);\n }\n\n if (subfield.value.indexOf('slm/') === 0) {\n return !['slm/fin', 'slm/swe'].includes(subfield.value);\n }\n\n if (subfield.value.indexOf('mts/') === 0) {\n return !['mts/fin', 'mts/swe'].includes(subfield.value);\n }\n\n if (subfield.value.indexOf('kauno/') === 0) {\n return !['kauno/fin', 'kauno/swe'].includes(subfield.value);\n }\n\n return false;\n}\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAC,sBAAA,CAAAF,OAAA;AAA0B,SAAAE,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAF1B;;AAIA;;AAEA;AACe,SAAAG,SAAA,EAAY;EAEzB,OAAO;IACLC,WAAW,EAAE,2EAA2E;IACxFC,QAAQ;IAAEC;EACZ,CAAC;EAED,SAASA,GAAGA,CAACC,MAAM,EAAE;IACnB,MAAMC,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEH,GAAG,EAAE,EAAE;MAAEI,KAAK,EAAE;IAAI,CAAC;IAC/C,MAAMC,cAAc,GAAGC,iBAAiB,CAACL,MAAM,CAAC;IAChDI,cAAc,CAACE,OAAO,CAACC,CAAC,IAAIC,iCAAiC,CAACD,CAAC,CAAC,CAAC;IACjE,OAAON,GAAG;EACZ;EAEA,SAASH,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAMC,GAAG,GAAG;MAACC,OAAO,EAAE;IAAE,CAAC;IACzB,MAAME,cAAc,GAAGC,iBAAiB,CAACL,MAAM,CAAC;IAEhDI,cAAc,CAACE,OAAO,CAACG,KAAK,IAAIC,aAAa,CAACD,KAAK,EAAER,GAAG,CAAC,CAAC;IAE1DA,GAAG,CAACE,KAAK,GAAG,EAAEF,GAAG,CAACC,OAAO,CAACS,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;IACxC,OAAOV,GAAG;EACZ;EAEA,SAASI,iBAAiBA,CAACL,MAAM,EAAE;IACjC,OAAOA,MAAM,CAACY,MAAM,CAACC,MAAM,CAACN,CAAC,IAAIA,CAAC,CAACO,SAAS,IAAIP,CAAC,CAACQ,GAAG,CAACC,KAAK,CAAC,wBAAwB,CAAC,CAAC;EACxF;EAEA,SAASN,aAAaA,CAACD,KAAK,EAAER,GAAG,EAAE;IACjC,MAAMgB,IAAI,GAAG,IAAAC,oBAAa,EAACT,KAAK,CAAC;IAEjC,MAAMU,eAAe,GAAGX,iCAAiC,CAAC,IAAAY,cAAK,EAACX,KAAK,CAAC,CAAC;IACvE,MAAMY,GAAG,GAAG,IAAAH,oBAAa,EAACC,eAAe,CAAC;IAC1C,IAAIF,IAAI,KAAKI,GAAG,EAAE;MAAE;MAClBpB,GAAG,CAACC,OAAO,CAACoB,IAAI,CAAC,aAAaL,IAAI,SAASI,GAAG,GAAG,CAAC,CAAC,CAAC;MACpD;IACF;IACA;IACA,IAAIE,qCAAqC,CAACd,KAAK,CAAC,EAAE;MAChDR,GAAG,CAACC,OAAO,CAACoB,IAAI,CAAC,kCAAkCL,IAAI,GAAG,CAAC,CAAC,CAAC;MAC7D;IACF;IACA;EACF;EAGA,SAAST,iCAAiCA,CAACC,KAAK,EAAE;IAChDA,KAAK,CAACK,SAAS,CAACR,OAAO,CAACkB,EAAE,IAAIC,oCAAoC,CAACD,EAAE,CAAC,CAAC;IACvE,OAAOf,KAAK;EACd;EAEA,SAASgB,oCAAoCA,CAACC,QAAQ,EAAE;IACtD,IAAIA,QAAQ,CAACC,IAAI,KAAK,GAAG,EAAE;MACzB;IACF;IACAD,QAAQ,CAACE,KAAK,GAAGC,6BAA6B,CAACH,QAAQ,CAACE,KAAK,CAAC,CAAC,CAAC;EAClE;AAEF;;AAEA;AACA,MAAME,iBAAiB,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;AAE3L,SAASD,6BAA6BA,CAACD,KAAK,EAAE;EAC5C;EACA,MAAMG,GAAG,GAAGH,KAAK,CAACI,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CACjCA,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CACrBA,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;EAAA,CAC5BA,OAAO,CAAC,yBAAyB,EAAE,MAAM,CAAC,CAAC,CAAC;;EAE/C;EACA,IAAIF,iBAAiB,CAACG,QAAQ,CAACF,GAAG,CAAC,EAAE;IACnC,OAAOA,GAAG;EACZ;EAEA,OAAOH,KAAK;AACd;AAEA,SAASL,qCAAqCA,CAACd,KAAK,EAAE;EACpD,OAAOA,KAAK,CAACK,SAAS,CAACoB,IAAI,CAACV,EAAE,IAAIW,wCAAwC,CAACX,EAAE,CAAC,CAAC;AACjF;AAEA,SAASW,wCAAwCA,CAACT,QAAQ,EAAE;EAC1D,IAAIA,QAAQ,CAACC,IAAI,KAAK,GAAG,EAAE;IACzB,OAAO,KAAK;EACd;;EAEA;EACA,IAAID,QAAQ,CAACE,KAAK,CAACQ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;IACxC,OAAO,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAACH,QAAQ,CAACP,QAAQ,CAACE,KAAK,CAAC;EAC/E;EAEA,IAAIF,QAAQ,CAACE,KAAK,CAACQ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;IACxC,OAAO,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAACH,QAAQ,CAACP,QAAQ,CAACE,KAAK,CAAC;EACzD;EAEA,IAAIF,QAAQ,CAACE,KAAK,CAACQ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;IACxC,OAAO,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAACH,QAAQ,CAACP,QAAQ,CAACE,KAAK,CAAC;EACzD;EAEA,IAAIF,QAAQ,CAACE,KAAK,CAACQ,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;IAC1C,OAAO,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAACH,QAAQ,CAACP,QAAQ,CAACE,KAAK,CAAC;EAC7D;EAEA,OAAO,KAAK;AACd","ignoreList":[]}
1
+ {"version":3,"file":"sanitize-vocabulary-source-codes.js","names":["_utils","require","_clone","_interopRequireDefault","e","__esModule","default","_default","description","validate","fix","record","res","message","valid","relevantFields","getRelevantFields","forEach","f","fieldSanitizeVocabularySourceCode","field","validateField","length","fields","filter","subfields","tag","match","orig","fieldToString","normalizedField","clone","mod","push","fieldHasUnfixableVocabularySourceCode","sf","subfieldSanitizeVocabularySourceCode","subfield","code","value","stringFixVocabularySourceCode","legalSubfieldCode","tmp","replace","includes","some","subfieldHasUnfixableVocabularySourceCode","indexOf"],"sources":["../src/sanitize-vocabulary-source-codes.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils';\nimport clone from 'clone';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes);\n\n// Author(s): Nicholas Volk, Joni Ollila\nexport default function () {\n\n return {\n description: 'Validator for sanitizing vocabulary source codes in subfield $2 (MRA-532)',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n const relevantFields = getRelevantFields(record);\n relevantFields.forEach(f => fieldSanitizeVocabularySourceCode(f)); // eslint-disable-line array-callback-return\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n const relevantFields = getRelevantFields(record);\n\n relevantFields.forEach(field => validateField(field, res)); // eslint-disable-line array-callback-return\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function getRelevantFields(record) {\n return record.fields.filter(f => f.subfields && f.tag.match(/^(?:6..|257|370|38.)$/u));\n }\n\n function validateField(field, res) {\n const orig = fieldToString(field);\n\n const normalizedField = fieldSanitizeVocabularySourceCode(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`FIXABLE: '${orig}' => '${mod}'`);\n return;\n }\n // Handle illegal values here\n if (fieldHasUnfixableVocabularySourceCode(field)) {\n res.message.push(`CAN'T BE FIXED AUTOMATICALLY: '${orig}'`);\n return;\n }\n return;\n }\n\n\n function fieldSanitizeVocabularySourceCode(field) {\n field.subfields.forEach(sf => subfieldSanitizeVocabularySourceCode(sf)); // eslint-disable-line array-callback-return\n return field;\n }\n\n function subfieldSanitizeVocabularySourceCode(subfield) {\n if (subfield.code !== '2') {\n return;\n }\n subfield.value = stringFixVocabularySourceCode(subfield.value);\n }\n\n}\n\n// Note that language suffix is optional\nconst legalSubfieldCode = ['allars', 'kauno', 'kauno/fin', 'kauno/swe', 'mts', 'mts/fin', 'mts/swe', 'slm', 'slm/fin', 'slm/swe', 'ysa', 'yso', 'yso/eng', 'yso/fin', 'yso/sme', 'yso/swe'];\n\nfunction stringFixVocabularySourceCode(value) {\n // Try to remove spaces, change '//' to '/' and remove final '.' and '/':\n const tmp = value.replace(/ /ug, '')\n .replace(/\\/+/ug, '/')\n .replace(/(.)[./]$/gu, '$1')\n .replace(/^yso-(?:aika|paikat)\\//u, 'yso/'); // IMP-HELMET crap. Also, they still have a '.' at the end of $a...\n\n // NB! Use the modified value ONLY if the result (tmp variable) is a legal subfield code...\n if (legalSubfieldCode.includes(tmp)) {\n return tmp;\n }\n\n return value;\n}\n\nfunction fieldHasUnfixableVocabularySourceCode(field) {\n return field.subfields.some(sf => subfieldHasUnfixableVocabularySourceCode(sf));\n}\n\nfunction subfieldHasUnfixableVocabularySourceCode(subfield) {\n if (subfield.code !== '2') {\n return false;\n }\n\n // As we can't fix this here, apply this yso-rule only when validating!\n if (subfield.value.indexOf('yso/') === 0) {\n return !['yso/eng', 'yso/fin', 'yso/sme', 'yso/swe'].includes(subfield.value);\n }\n\n if (subfield.value.indexOf('slm/') === 0) {\n return !['slm/fin', 'slm/swe'].includes(subfield.value);\n }\n\n if (subfield.value.indexOf('mts/') === 0) {\n return !['mts/fin', 'mts/swe'].includes(subfield.value);\n }\n\n if (subfield.value.indexOf('kauno/') === 0) {\n return !['kauno/fin', 'kauno/swe'].includes(subfield.value);\n }\n\n return false;\n}\n"],"mappings":"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","ignoreList":[]}
package/dist/sort-tags.js CHANGED
@@ -33,8 +33,8 @@ function sortPatternFields(record, tagPattern) {
33
33
  const matchingTags = record.fields.map(field => tagPattern.some(pattern => pattern.test(field.tag)) ? field : null).filter(tag => tag);
34
34
  const sortedArray = sortFields(record.fields);
35
35
  const fixedArray = sortedArray.filter(field => !tagPattern.some(pattern => pattern.test(field.tag)));
36
- fixedArray.splice(index(sortedArray, tagPattern), 0, ...matchingTags); // eslint-disable-line functional/immutable-data
37
- record.fields = fixedArray; // eslint-disable-line functional/immutable-data
36
+ fixedArray.splice(index(sortedArray, tagPattern), 0, ...matchingTags);
37
+ record.fields = fixedArray;
38
38
  }
39
39
  function sortFields(fields) {
40
40
  return [...fields].sort((a, b) => {
@@ -1 +1 @@
1
- {"version":3,"file":"sort-tags.js","names":["_marcRecord","require","_default","tagPattern","description","validate","fix","record","sort","MarcRecord","isEqual","fields","valid","messages","sortPatternFields","sortFields","matchingTags","map","field","some","pattern","test","tag","filter","sortedArray","fixedArray","splice","index","a","b","findIndex"],"sources":["../src/sort-tags.js"],"sourcesContent":["import {MarcRecord} from '@natlibfi/marc-record';\n\nexport default function (tagPattern) {\n return {\n description:\n 'Handles field ordering',\n validate,\n fix: async record => ({\n fix: await sort(record, tagPattern)\n })\n };\n\n function validate(record, tagPattern) {\n return MarcRecord.isEqual(record.fields, sort(record.fields, tagPattern)) ? {valid: true, messages: []} : {valid: false, messages: ['Fields are in incorrect order']};\n }\n\n function sort(record, tagPattern) {\n if (tagPattern) {\n return sortPatternFields(record, tagPattern);\n }\n\n return sortFields(record);\n }\n}\n\nfunction sortPatternFields(record, tagPattern) {\n const matchingTags = record.fields.map(field => tagPattern.some(pattern => pattern.test(field.tag)) ? field : null).filter(tag => tag);\n const sortedArray = sortFields(record.fields);\n const fixedArray = sortedArray.filter(field => !tagPattern.some(pattern => pattern.test(field.tag)));\n fixedArray.splice(index(sortedArray, tagPattern), 0, ...matchingTags); // eslint-disable-line functional/immutable-data\n record.fields = fixedArray; // eslint-disable-line functional/immutable-data\n}\n\nfunction sortFields(fields) {\n return [...fields].sort((a, b) => {\n if (a.tag > b.tag) {\n return 1;\n }\n if (b.tag > a.tag) {\n return -1;\n }\n return 0;\n });\n}\n\nfunction index(fields, tagPattern) {\n return fields.findIndex(field => tagPattern.some(pattern => pattern.test(field.tag)));\n}\n"],"mappings":";;;;;;AAAA,IAAAA,WAAA,GAAAC,OAAA;AAEe,SAAAC,SAAUC,UAAU,EAAE;EACnC,OAAO;IACLC,WAAW,EACT,wBAAwB;IAC1BC,QAAQ;IACRC,GAAG,EAAE,MAAMC,MAAM,KAAK;MACpBD,GAAG,EAAE,MAAME,IAAI,CAACD,MAAM,EAAEJ,UAAU;IACpC,CAAC;EACH,CAAC;EAED,SAASE,QAAQA,CAACE,MAAM,EAAEJ,UAAU,EAAE;IACpC,OAAOM,sBAAU,CAACC,OAAO,CAACH,MAAM,CAACI,MAAM,EAAEH,IAAI,CAACD,MAAM,CAACI,MAAM,EAAER,UAAU,CAAC,CAAC,GAAG;MAACS,KAAK,EAAE,IAAI;MAAEC,QAAQ,EAAE;IAAE,CAAC,GAAG;MAACD,KAAK,EAAE,KAAK;MAAEC,QAAQ,EAAE,CAAC,+BAA+B;IAAC,CAAC;EACvK;EAEA,SAASL,IAAIA,CAACD,MAAM,EAAEJ,UAAU,EAAE;IAChC,IAAIA,UAAU,EAAE;MACd,OAAOW,iBAAiB,CAACP,MAAM,EAAEJ,UAAU,CAAC;IAC9C;IAEA,OAAOY,UAAU,CAACR,MAAM,CAAC;EAC3B;AACF;AAEA,SAASO,iBAAiBA,CAACP,MAAM,EAAEJ,UAAU,EAAE;EAC7C,MAAMa,YAAY,GAAGT,MAAM,CAACI,MAAM,CAACM,GAAG,CAACC,KAAK,IAAIf,UAAU,CAACgB,IAAI,CAACC,OAAO,IAAIA,OAAO,CAACC,IAAI,CAACH,KAAK,CAACI,GAAG,CAAC,CAAC,GAAGJ,KAAK,GAAG,IAAI,CAAC,CAACK,MAAM,CAACD,GAAG,IAAIA,GAAG,CAAC;EACtI,MAAME,WAAW,GAAGT,UAAU,CAACR,MAAM,CAACI,MAAM,CAAC;EAC7C,MAAMc,UAAU,GAAGD,WAAW,CAACD,MAAM,CAACL,KAAK,IAAI,CAACf,UAAU,CAACgB,IAAI,CAACC,OAAO,IAAIA,OAAO,CAACC,IAAI,CAACH,KAAK,CAACI,GAAG,CAAC,CAAC,CAAC;EACpGG,UAAU,CAACC,MAAM,CAACC,KAAK,CAACH,WAAW,EAAErB,UAAU,CAAC,EAAE,CAAC,EAAE,GAAGa,YAAY,CAAC,CAAC,CAAC;EACvET,MAAM,CAACI,MAAM,GAAGc,UAAU,CAAC,CAAC;AAC9B;AAEA,SAASV,UAAUA,CAACJ,MAAM,EAAE;EAC1B,OAAO,CAAC,GAAGA,MAAM,CAAC,CAACH,IAAI,CAAC,CAACoB,CAAC,EAAEC,CAAC,KAAK;IAChC,IAAID,CAAC,CAACN,GAAG,GAAGO,CAAC,CAACP,GAAG,EAAE;MACjB,OAAO,CAAC;IACV;IACA,IAAIO,CAAC,CAACP,GAAG,GAAGM,CAAC,CAACN,GAAG,EAAE;MACjB,OAAO,CAAC,CAAC;IACX;IACA,OAAO,CAAC;EACV,CAAC,CAAC;AACJ;AAEA,SAASK,KAAKA,CAAChB,MAAM,EAAER,UAAU,EAAE;EACjC,OAAOQ,MAAM,CAACmB,SAAS,CAACZ,KAAK,IAAIf,UAAU,CAACgB,IAAI,CAACC,OAAO,IAAIA,OAAO,CAACC,IAAI,CAACH,KAAK,CAACI,GAAG,CAAC,CAAC,CAAC;AACvF","ignoreList":[]}
1
+ {"version":3,"file":"sort-tags.js","names":["_marcRecord","require","_default","tagPattern","description","validate","fix","record","sort","MarcRecord","isEqual","fields","valid","messages","sortPatternFields","sortFields","matchingTags","map","field","some","pattern","test","tag","filter","sortedArray","fixedArray","splice","index","a","b","findIndex"],"sources":["../src/sort-tags.js"],"sourcesContent":["import {MarcRecord} from '@natlibfi/marc-record';\n\nexport default function (tagPattern) {\n return {\n description:\n 'Handles field ordering',\n validate,\n fix: async record => ({\n fix: await sort(record, tagPattern)\n })\n };\n\n function validate(record, tagPattern) {\n return MarcRecord.isEqual(record.fields, sort(record.fields, tagPattern)) ? {valid: true, messages: []} : {valid: false, messages: ['Fields are in incorrect order']};\n }\n\n function sort(record, tagPattern) {\n if (tagPattern) {\n return sortPatternFields(record, tagPattern);\n }\n\n return sortFields(record);\n }\n}\n\nfunction sortPatternFields(record, tagPattern) {\n const matchingTags = record.fields.map(field => tagPattern.some(pattern => pattern.test(field.tag)) ? field : null).filter(tag => tag);\n const sortedArray = sortFields(record.fields);\n const fixedArray = sortedArray.filter(field => !tagPattern.some(pattern => pattern.test(field.tag)));\n fixedArray.splice(index(sortedArray, tagPattern), 0, ...matchingTags);\n record.fields = fixedArray;\n}\n\nfunction sortFields(fields) {\n return [...fields].sort((a, b) => {\n if (a.tag > b.tag) {\n return 1;\n }\n if (b.tag > a.tag) {\n return -1;\n }\n return 0;\n });\n}\n\nfunction index(fields, tagPattern) {\n return fields.findIndex(field => tagPattern.some(pattern => pattern.test(field.tag)));\n}\n"],"mappings":";;;;;;AAAA,IAAAA,WAAA,GAAAC,OAAA;AAEe,SAAAC,SAAUC,UAAU,EAAE;EACnC,OAAO;IACLC,WAAW,EACT,wBAAwB;IAC1BC,QAAQ;IACRC,GAAG,EAAE,MAAMC,MAAM,KAAK;MACpBD,GAAG,EAAE,MAAME,IAAI,CAACD,MAAM,EAAEJ,UAAU;IACpC,CAAC;EACH,CAAC;EAED,SAASE,QAAQA,CAACE,MAAM,EAAEJ,UAAU,EAAE;IACpC,OAAOM,sBAAU,CAACC,OAAO,CAACH,MAAM,CAACI,MAAM,EAAEH,IAAI,CAACD,MAAM,CAACI,MAAM,EAAER,UAAU,CAAC,CAAC,GAAG;MAACS,KAAK,EAAE,IAAI;MAAEC,QAAQ,EAAE;IAAE,CAAC,GAAG;MAACD,KAAK,EAAE,KAAK;MAAEC,QAAQ,EAAE,CAAC,+BAA+B;IAAC,CAAC;EACvK;EAEA,SAASL,IAAIA,CAACD,MAAM,EAAEJ,UAAU,EAAE;IAChC,IAAIA,UAAU,EAAE;MACd,OAAOW,iBAAiB,CAACP,MAAM,EAAEJ,UAAU,CAAC;IAC9C;IAEA,OAAOY,UAAU,CAACR,MAAM,CAAC;EAC3B;AACF;AAEA,SAASO,iBAAiBA,CAACP,MAAM,EAAEJ,UAAU,EAAE;EAC7C,MAAMa,YAAY,GAAGT,MAAM,CAACI,MAAM,CAACM,GAAG,CAACC,KAAK,IAAIf,UAAU,CAACgB,IAAI,CAACC,OAAO,IAAIA,OAAO,CAACC,IAAI,CAACH,KAAK,CAACI,GAAG,CAAC,CAAC,GAAGJ,KAAK,GAAG,IAAI,CAAC,CAACK,MAAM,CAACD,GAAG,IAAIA,GAAG,CAAC;EACtI,MAAME,WAAW,GAAGT,UAAU,CAACR,MAAM,CAACI,MAAM,CAAC;EAC7C,MAAMc,UAAU,GAAGD,WAAW,CAACD,MAAM,CAACL,KAAK,IAAI,CAACf,UAAU,CAACgB,IAAI,CAACC,OAAO,IAAIA,OAAO,CAACC,IAAI,CAACH,KAAK,CAACI,GAAG,CAAC,CAAC,CAAC;EACpGG,UAAU,CAACC,MAAM,CAACC,KAAK,CAACH,WAAW,EAAErB,UAAU,CAAC,EAAE,CAAC,EAAE,GAAGa,YAAY,CAAC;EACrET,MAAM,CAACI,MAAM,GAAGc,UAAU;AAC5B;AAEA,SAASV,UAAUA,CAACJ,MAAM,EAAE;EAC1B,OAAO,CAAC,GAAGA,MAAM,CAAC,CAACH,IAAI,CAAC,CAACoB,CAAC,EAAEC,CAAC,KAAK;IAChC,IAAID,CAAC,CAACN,GAAG,GAAGO,CAAC,CAACP,GAAG,EAAE;MACjB,OAAO,CAAC;IACV;IACA,IAAIO,CAAC,CAACP,GAAG,GAAGM,CAAC,CAACN,GAAG,EAAE;MACjB,OAAO,CAAC,CAAC;IACX;IACA,OAAO,CAAC;EACV,CAAC,CAAC;AACJ;AAEA,SAASK,KAAKA,CAAChB,MAAM,EAAER,UAAU,EAAE;EACjC,OAAOQ,MAAM,CAACmB,SAAS,CAACZ,KAAK,IAAIf,UAAU,CAACgB,IAAI,CAACC,OAAO,IAAIA,OAAO,CAACC,IAAI,CAACH,KAAK,CAACI,GAAG,CAAC,CAAC,CAAC;AACvF","ignoreList":[]}
@@ -33,8 +33,7 @@ function _default() {
33
33
  fix: [],
34
34
  valid: true
35
35
  };
36
- record.fields.sort(fieldOrderComparator); // eslint-disable-line functional/immutable-data
37
-
36
+ record.fields.sort(fieldOrderComparator);
38
37
  return res;
39
38
  }
40
39
  function validate(record) {
@@ -42,14 +41,12 @@ function _default() {
42
41
  message: []
43
42
  };
44
43
  const fields = record.fields.map(f => (0, _clone.default)(f));
45
- fields.sort(fieldOrderComparator); // eslint-disable-line functional/immutable-data
46
-
44
+ fields.sort(fieldOrderComparator);
47
45
  const relocatedFields = fields.filter((f, i) => (0, _utils.fieldToString)(f) !== (0, _utils.fieldToString)(record.fields[i]));
48
46
  if (relocatedFields.length > 0) {
49
- // eslint-disable-line functional/no-conditional-statements
50
- res.message.push(`${relocatedFields.length} field(s) in new places`); // eslint-disable-line functional/immutable-data
47
+ res.message.push(`${relocatedFields.length} field(s) in new places`);
51
48
  }
52
- res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data
49
+ res.valid = !(res.message.length >= 1);
53
50
  return res;
54
51
  }
55
52
  }
@@ -239,8 +236,6 @@ function fieldOrderComparator(fieldA, fieldB) {
239
236
  return (0, _marcFieldSort.fieldOrderComparator)(fieldA, fieldB, sorterFunctions);
240
237
  }
241
238
  function sortByIndexTerms(fieldA, fieldB) {
242
- // eslint-disable-line complexity, max-statements
243
-
244
239
  const indexTermFields = ['600', '610', '611', '630', '648', '650', '651', '652', '653', '654', '655', '656', '657', '658', '659', '662'];
245
240
  function scoreInd2(val) {
246
241
  const ind2Score = {
@@ -1 +1 @@
1
- {"version":3,"file":"sortFields.js","names":["_clone","_interopRequireDefault","require","_utils","_marcFieldSort","_subfield8Utils","_subfield6Utils","e","__esModule","default","BIG_BAD_NUMBER","_default","description","validate","fix","record","res","message","valid","fields","sort","fieldOrderComparator","map","f","clone","relocatedFields","filter","i","fieldToString","length","push","relatorTermScore","relatorTermScoreBk","relatorTermScoreMu","relatorTermScoreVm","normalizeValue","value","replace","scoreRelatorTermBk","normalizedValue","scoreRelatorTermMu","scoreRelatorTermVm","scoreRelatorTerm","typeOfMaterial","undefined","fieldA","fieldB","sorterFunctions","sortByTag","sortByIndexTerms","sortAlphabetically","sortByRelatorTerm","sortBySubfield6","preferFenniKeep","sortByFieldLinkAndSequenceNumber","globalFieldOrderComparator","indexTermFields","scoreInd2","val","ind2Score","tag","includes","ind2","scoreDictionary","dictionary","dictionarySortIndex","dictionaryA","selectFirstValue","dictionaryB","dictScoreA","dictScoreB","preferKeep","keepOwner","hasKeepA","fieldHasSubfield","hasKeepB","fenniPreference","violaPreference","fieldGetMaxRelatorTermScore","field","subfields","relatorSubfieldCode","sf","code","scores","Math","max","scoreA","scoreB","fieldGetMinLinkAndSequenceNumber","relevantSubfields","isValidSubfield8","parseFloat","min","compareLinkingTags","tagStringA","fieldGetUnambiguousTag","tagStringB","compareOccurrenceNumbers","stringA","fieldGetUnambiguousOccurrenceNumber","stringB","parseInt","linkingTagComparisonResult","subcode","subfield","slice"],"sources":["../src/sortFields.js"],"sourcesContent":["// Taken from project marc-record-js, file marcSortFields.js as this contains more and more Melinda-specific rules.\n\nimport clone from 'clone';\n//import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString} from './utils';\nimport {sortByTag, sortAlphabetically, fieldOrderComparator as globalFieldOrderComparator} from '@natlibfi/marc-record/dist/marcFieldSort';\nimport {isValidSubfield8} from './subfield8Utils';\nimport {fieldGetUnambiguousOccurrenceNumber, fieldGetUnambiguousTag} from './subfield6Utils';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortFields');\n//const debugData = debug.extend('data');\n//const debugDev = debug.extend('dev');\n\nconst BIG_BAD_NUMBER = 999999999;\nexport default function () {\n\n return {\n description: 'Sort fields using both generic and Melinda specific rules',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n record.fields.sort(fieldOrderComparator); // eslint-disable-line functional/immutable-data\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const fields = record.fields.map(f => clone(f));\n fields.sort(fieldOrderComparator); // eslint-disable-line functional/immutable-data\n\n\n const relocatedFields = fields.filter((f, i) => fieldToString(f) !== fieldToString(record.fields[i]));\n\n if (relocatedFields.length > 0) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(`${relocatedFields.length} field(s) in new places`); // eslint-disable-line functional/immutable-data\n }\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\nconst relatorTermScore = { // Here bigger is better\n // NB! This is exportable as field internal $e sorting in marc-record-validators-js uses this.\n // NB! The more abstract, the earlier it appears.\n // Note that terms with same abstraction level might also have order preferences\n // We should 1) check the order of these, and 2) add translations (support Swedish at the very least)\n // work/teos > expression/ekspressio > manifestation/manifestaatin,\n // Work https://finto.fi/mts/fi/page/m1298\n 'säveltäjä': 100, 'composer': 100,\n 'kirjoittaja': 100, 'author': 100,\n 'libretisti': 100,\n 'sarjakuvantekijä': 100, 'soitonoppaan tekijä': 100,\n 'kartantekijä': 99,\n 'taiteilija': 98,\n 'designer': 90,\n 'sanoittaja': 90,\n 'käsikirjoittaja': 90,\n\n 'kuvaaja': 89, 'valokuvaaja': 89,\n 'kokoaja': 86,\n 'alkuperäisidean luoja': 85,\n 'teoksella kunnioitettu': 84, 'gratulaation kohde': 84,\n 'julkaisija': 82,\n 'tuottaja': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'sovittaja': 79, 'arranger': 79,\n 'toimittaja': 78, 'editor': 78,\n 'kuvittaja': 77,\n 'esipuheen kirjoittaja': 76,\n 'alkusanojen kirjoittaja': 75, 'loppusanojen kirjoittaja': 75,\n\n 'esittäjä': 74,\n 'johtaja': 73, // orkesterinjohtaja\n 'editointi': 71, // for music, editor/toimittaja is another thing\n 'kääntäjä': 70,\n 'lukija': 61, 'kertoja': 61,\n // Manifestation level: https://finto.fi/mts/fi/page/m491\n 'graafinen suunnittelija': 50,\n 'kustantaja': 41\n // Item level: https://finto.fi/mts/fi/page/m1157\n};\n\nconst relatorTermScoreBk = {\n // https://finto.fi/mts/fi/page/m34 100-81\n 'libretisti': 100, 'sarjakuvantekijä': 100,\n 'kirjoittaja': 99, 'author': 99, 'soitonoppaan tekijä': 99,\n 'kuvaaja': 98, 'valokuvaaja': 98,\n 'kokoaja': 86, 'designer': 86,\n 'alkuperäisidean luoja': 85,\n 'teoksella kunnioitettu': 84, 'gratulaation kohde': 84,\n 'säveltäjä': 83, // if 300$e has CD etc\n 'sanoittaja': 82,\n 'julkaisija': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'toimittaja': 78,\n 'kuvittaja': 77,\n 'esipuheen kirjoittaja': 76,\n 'alkusanojen kirjoittaja': 75, 'loppusanojen kirjoittaja': 75,\n 'kääntäjä': 70,\n 'sovittaja': 50,\n // manifestaatio\n 'graafinen suunnittelija': 40,\n // kappale/item\n 'sitoja': 25,\n 'gratulaation kirjoittaja': 24\n};\n\nconst relatorTermScoreMu = {\n 'säveltäjä': 100,\n 'sanoittaja': 99,\n 'soitonoppaan tekijä': 98,\n 'alkuperäisidean luoja': 85,\n 'teoksella kunnioitettu': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'sovittaja': 79,\n 'johtaja': 78,\n 'esittäjä': 77,\n 'lukija': 76,\n 'miksaaja': 75,\n // manifestaatio\n 'esittäjä (manifestaatio)': 69,\n\n 'graafinen suunnittelija': 50,\n 'valmistaja': 41,\n 'jakaja': 40\n // kappale/item\n\n};\n\nconst relatorTermScoreVm = { // Visual Material\n // Work\n 'ohjaaja': 100,\n 'kirjoittaja': 99, 'author': 99, // Here we assume that film/whatever is based on author's book\n 'käsikirjoittaja': 98, 'designer': 98,\n 'kuvaaja': 89,\n 'säveltäjä': 86, // Volatile. John Williams?\n 'alkuperäisidean luoja': 85,\n 'julkaisija': 82,\n 'tuottaja': 81,\n // Expression\n 'leikkaaja': 80,\n 'sovittaja': 79,\n 'johtaja': 78,\n 'esittäjä': 77,\n 'lukija': 76,\n 'miksaaja': 75,\n 'kääntäjä': 70,\n // Manifestation\n 'kaivertaja': 60,\n 'graafinen suunnittelija': 59,\n 'kustantaja': 42,\n 'elokuvan jakelija': 41, 'jakaja': 41\n\n // Item\n};\n\nfunction normalizeValue(value) {\n // Removing last punc char is good enough for our purposes.\n // We don't handle abbreviations here etc.\n // Brackets should not happen either, should they?\n return value.replace(/[.,]$/u, '');\n}\n\nfunction scoreRelatorTermBk(normalizedValue) {\n if (normalizedValue in relatorTermScoreBk) {\n return relatorTermScoreBk[normalizedValue];\n }\n return 0;\n}\n\nfunction scoreRelatorTermMu(normalizedValue) {\n if (normalizedValue in relatorTermScoreMu) {\n return relatorTermScoreMu[normalizedValue];\n }\n return 0;\n}\n\nfunction scoreRelatorTermVm(normalizedValue) {\n if (normalizedValue in relatorTermScoreVm) {\n return relatorTermScoreVm[normalizedValue];\n }\n return 0;\n}\n\nexport function scoreRelatorTerm(value, typeOfMaterial = undefined) {\n // NB! We are currently using type of material only for sorting relator terms, not 7XX fields!!!\n const normalizedValue = normalizeValue(value);\n if (typeOfMaterial === 'BK') { // Books\n return scoreRelatorTermBk(normalizedValue);\n }\n if (typeOfMaterial === 'MU') { // Music (NB: audio books should be BK in this context!)\n return scoreRelatorTermMu(normalizedValue);\n }\n if (typeOfMaterial === 'VM') { // video material\n return scoreRelatorTermVm(normalizedValue);\n }\n if (normalizedValue in relatorTermScore) {\n return relatorTermScore[normalizedValue];\n }\n return 0;\n}\n\nexport function fieldOrderComparator(fieldA, fieldB) {\n\n //const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n\n const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortBySubfield6, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n //const sorterFunctions = [sortByIndexTerms, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n\n return globalFieldOrderComparator(fieldA, fieldB, sorterFunctions);\n}\n\nfunction sortByIndexTerms(fieldA, fieldB) { // eslint-disable-line complexity, max-statements\n\n const indexTermFields = ['600', '610', '611', '630', '648', '650', '651', '652', '653', '654', '655', '656', '657', '658', '659', '662'];\n\n function scoreInd2(val) {\n const ind2Score = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 8, '5': 5, '6': 6, '7': 7};\n\n if (val in ind2Score) {\n return ind2Score[val];\n }\n return 9;\n }\n\n // ATM this is not needed.\n // You may need this, if you change compare function order in sorterFunctions\n // istanbul ignore next\n if (fieldA.tag !== fieldB.tag) {\n return 0;\n }\n\n if (!indexTermFields.includes(fieldA.tag)) {\n return 0;\n }\n\n // Puts ind2=4 last\n if (scoreInd2(fieldA.ind2) > scoreInd2(fieldB.ind2)) {\n return 1;\n }\n if (scoreInd2(fieldA.ind2) < scoreInd2(fieldB.ind2)) {\n return -1;\n }\n\n function scoreDictionary(dictionary) {\n const dictionarySortIndex = {\n 'yso/fin': 0,\n 'yso/swe': 1,\n 'yso/eng': 2,\n 'slm/fin': 0.1,\n 'slm/swe': 1.1,\n 'kauno/fin': 2.1,\n 'kauno/swe': 2.2,\n 'kaunokki': 4,\n 'bella': 5\n };\n\n if (dictionary in dictionarySortIndex) {\n return dictionarySortIndex[dictionary];\n }\n return BIG_BAD_NUMBER;\n }\n\n const dictionaryA = selectFirstValue(fieldA, '2');\n const dictionaryB = selectFirstValue(fieldB, '2');\n\n const dictScoreA = scoreDictionary(dictionaryA);\n const dictScoreB = scoreDictionary(dictionaryB);\n // Use priority order for listed dictionaries:\n if (dictScoreA > dictScoreB) {\n return 1;\n }\n if (dictScoreA < dictScoreB) {\n return -1;\n }\n // Unlisted dictionaries: sort $2 value alphabetically:\n //if (dictScoreA === BIG_BAD_NUMBER) {\n if (dictionaryA > dictionaryB) {\n return 1;\n }\n if (dictionaryA < dictionaryB) {\n return -1;\n }\n //}\n return 0;\n}\n\n\nfunction preferKeep(fieldA, fieldB, keepOwner = 'FENNI') {\n const hasKeepA = fieldHasSubfield(fieldA, '9', `${keepOwner}<KEEP>`);\n const hasKeepB = fieldHasSubfield(fieldB, '9', `${keepOwner}<KEEP>`);\n\n if (hasKeepA && !hasKeepB) {\n return -1;\n }\n if (!hasKeepA && hasKeepB) {\n return 1;\n }\n\n return 0;\n}\n\n\nfunction preferFenniKeep(fieldA, fieldB) {\n const fenniPreference = preferKeep(fieldA, fieldB, 'FENNI');\n if (fenniPreference !== 0) {\n return fenniPreference;\n }\n const violaPreference = preferKeep(fieldA, fieldB, 'VIOLA');\n if (violaPreference !== 0) {\n return violaPreference;\n }\n return preferKeep(fieldA, fieldB, 'FIKKA');\n}\n\nfunction sortByRelatorTerm(fieldA, fieldB) {\n //if (!['600', '610', '611', '630', '700', '710', '711', '730', '800', '810', '811', '830'].includes(fieldA.tag)) {\n if (!['700', '710', '711', '730'].includes(fieldA.tag)) {\n return 0;\n }\n\n function fieldGetMaxRelatorTermScore(field) {\n if (!field.subfields) {\n return -2;\n }\n // If field has $t, it's a teos-nimeke-auktoriteetti, and thus meaningless. These should follow all $t-less fields...\n if (fieldHasSubfield(field, 't')) {\n return -2;\n }\n const relatorSubfieldCode = ['611', '711', '811'].includes(field.tag) ? 'j' : 'e';\n const e = field.subfields.filter(sf => sf.code === relatorSubfieldCode);\n if (e.length === 0) { // No $e is still better than having a $t\n return -1;\n }\n const scores = e.map(sf => scoreRelatorTerm(sf.value));\n //debugDev(`RELATOR SCORE FOR '${fieldToString(field)}': ${scores.join(', ')}`);\n return Math.max(...scores);\n }\n\n const scoreA = fieldGetMaxRelatorTermScore(fieldA);\n const scoreB = fieldGetMaxRelatorTermScore(fieldB);\n\n if (scoreA < scoreB) {\n return 1;\n }\n if (scoreA > scoreB) {\n return -1;\n }\n return 0;\n}\n\n\nfunction fieldGetMinLinkAndSequenceNumber(field) {\n if (!field.subfields) {\n return BIG_BAD_NUMBER;\n }\n const relevantSubfields = field.subfields.filter(sf => isValidSubfield8(sf));\n // If val is something like \"1.2\\x\" parseFloat() would give a syntax erro because of hex-like escape sequnce (at least on Chrome). Thus remove tail:\n const scores = relevantSubfields.map(sf => parseFloat(sf.value.replace(/\\\\.*$/u, '')));\n if (scores.length === 0) {\n return BIG_BAD_NUMBER;\n }\n return Math.min(...scores);\n}\n\nfunction sortByFieldLinkAndSequenceNumber(fieldA, fieldB) { // Sort by subfield $8 that is...\n const scoreA = fieldGetMinLinkAndSequenceNumber(fieldA);\n const scoreB = fieldGetMinLinkAndSequenceNumber(fieldB);\n //debugDev(` sf-8-A-score for '${fieldToString(fieldA)}: ${scoreA}`);\n //debugDev(` sf-8-B-score for '${fieldToString(fieldB)}: ${scoreB}`);\n if (scoreA === scoreB) {\n return 0;\n }\n if (scoreB === 0) {\n return 1;\n }\n if (scoreA === 0) {\n return -1;\n }\n if (scoreA > scoreB) { // smaller is better\n return 1;\n }\n return -1;\n}\n\n\nfunction sortBySubfield6(fieldA, fieldB) { // Sort by subfield $6, ex-sortByOccurrenceNumber...\n if (fieldA.tag !== '880' || fieldB.tag !== '880') {\n return 0;\n }\n\n function compareLinkingTags() {\n const tagStringA = fieldGetUnambiguousTag(fieldA);\n const tagStringB = fieldGetUnambiguousTag(fieldB);\n if (tagStringA === tagStringB || !tagStringA || !tagStringB) {\n return 0;\n }\n if (tagStringA > tagStringB) {\n return 1;\n }\n return -1;\n }\n\n function compareOccurrenceNumbers() {\n const stringA = fieldGetUnambiguousOccurrenceNumber(fieldA);\n const stringB = fieldGetUnambiguousOccurrenceNumber(fieldB);\n if (stringA === stringB) { // No action required here\n return 0;\n }\n\n // Handle expections: no occurrence number, occurrence number '00':\n if (!stringB || stringB === '00') {\n if (!stringA || stringA === '00') {\n return 0;\n }\n return -1;\n }\n if (!stringA || stringA === '00') {\n return 1;\n }\n\n // NB! We need compare ints as occurrence number can exceed 99 and be a three-digit value!\n const scoreA = parseInt(stringA, 10);\n const scoreB = parseInt(stringB, 10);\n\n if (scoreA > scoreB) { // smaller is better, thus '00' is the best\n return 1;\n }\n return -1;\n }\n\n const linkingTagComparisonResult = compareLinkingTags();\n if (linkingTagComparisonResult !== 0) {\n return linkingTagComparisonResult;\n }\n\n return compareOccurrenceNumbers();\n}\n\n\nfunction selectFirstValue(field, subcode) {\n return field.subfields\n .filter(subfield => subcode === subfield.code)\n .map(subfield => subfield.value)\n .slice(0, 1);\n}\n\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"sortFields.js","names":["_clone","_interopRequireDefault","require","_utils","_marcFieldSort","_subfield8Utils","_subfield6Utils","e","__esModule","default","BIG_BAD_NUMBER","_default","description","validate","fix","record","res","message","valid","fields","sort","fieldOrderComparator","map","f","clone","relocatedFields","filter","i","fieldToString","length","push","relatorTermScore","relatorTermScoreBk","relatorTermScoreMu","relatorTermScoreVm","normalizeValue","value","replace","scoreRelatorTermBk","normalizedValue","scoreRelatorTermMu","scoreRelatorTermVm","scoreRelatorTerm","typeOfMaterial","undefined","fieldA","fieldB","sorterFunctions","sortByTag","sortByIndexTerms","sortAlphabetically","sortByRelatorTerm","sortBySubfield6","preferFenniKeep","sortByFieldLinkAndSequenceNumber","globalFieldOrderComparator","indexTermFields","scoreInd2","val","ind2Score","tag","includes","ind2","scoreDictionary","dictionary","dictionarySortIndex","dictionaryA","selectFirstValue","dictionaryB","dictScoreA","dictScoreB","preferKeep","keepOwner","hasKeepA","fieldHasSubfield","hasKeepB","fenniPreference","violaPreference","fieldGetMaxRelatorTermScore","field","subfields","relatorSubfieldCode","sf","code","scores","Math","max","scoreA","scoreB","fieldGetMinLinkAndSequenceNumber","relevantSubfields","isValidSubfield8","parseFloat","min","compareLinkingTags","tagStringA","fieldGetUnambiguousTag","tagStringB","compareOccurrenceNumbers","stringA","fieldGetUnambiguousOccurrenceNumber","stringB","parseInt","linkingTagComparisonResult","subcode","subfield","slice"],"sources":["../src/sortFields.js"],"sourcesContent":["// Taken from project marc-record-js, file marcSortFields.js as this contains more and more Melinda-specific rules.\n\nimport clone from 'clone';\n//import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString} from './utils';\nimport {sortByTag, sortAlphabetically, fieldOrderComparator as globalFieldOrderComparator} from '@natlibfi/marc-record/dist/marcFieldSort';\nimport {isValidSubfield8} from './subfield8Utils';\nimport {fieldGetUnambiguousOccurrenceNumber, fieldGetUnambiguousTag} from './subfield6Utils';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortFields');\n//const debugData = debug.extend('data');\n//const debugDev = debug.extend('dev');\n\nconst BIG_BAD_NUMBER = 999999999;\nexport default function () {\n\n return {\n description: 'Sort fields using both generic and Melinda specific rules',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n record.fields.sort(fieldOrderComparator);\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const fields = record.fields.map(f => clone(f));\n fields.sort(fieldOrderComparator);\n\n\n const relocatedFields = fields.filter((f, i) => fieldToString(f) !== fieldToString(record.fields[i]));\n\n if (relocatedFields.length > 0) {\n res.message.push(`${relocatedFields.length} field(s) in new places`);\n }\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n}\n\n\nconst relatorTermScore = { // Here bigger is better\n // NB! This is exportable as field internal $e sorting in marc-record-validators-js uses this.\n // NB! The more abstract, the earlier it appears.\n // Note that terms with same abstraction level might also have order preferences\n // We should 1) check the order of these, and 2) add translations (support Swedish at the very least)\n // work/teos > expression/ekspressio > manifestation/manifestaatin,\n // Work https://finto.fi/mts/fi/page/m1298\n 'säveltäjä': 100, 'composer': 100,\n 'kirjoittaja': 100, 'author': 100,\n 'libretisti': 100,\n 'sarjakuvantekijä': 100, 'soitonoppaan tekijä': 100,\n 'kartantekijä': 99,\n 'taiteilija': 98,\n 'designer': 90,\n 'sanoittaja': 90,\n 'käsikirjoittaja': 90,\n\n 'kuvaaja': 89, 'valokuvaaja': 89,\n 'kokoaja': 86,\n 'alkuperäisidean luoja': 85,\n 'teoksella kunnioitettu': 84, 'gratulaation kohde': 84,\n 'julkaisija': 82,\n 'tuottaja': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'sovittaja': 79, 'arranger': 79,\n 'toimittaja': 78, 'editor': 78,\n 'kuvittaja': 77,\n 'esipuheen kirjoittaja': 76,\n 'alkusanojen kirjoittaja': 75, 'loppusanojen kirjoittaja': 75,\n\n 'esittäjä': 74,\n 'johtaja': 73, // orkesterinjohtaja\n 'editointi': 71, // for music, editor/toimittaja is another thing\n 'kääntäjä': 70,\n 'lukija': 61, 'kertoja': 61,\n // Manifestation level: https://finto.fi/mts/fi/page/m491\n 'graafinen suunnittelija': 50,\n 'kustantaja': 41\n // Item level: https://finto.fi/mts/fi/page/m1157\n};\n\nconst relatorTermScoreBk = {\n // https://finto.fi/mts/fi/page/m34 100-81\n 'libretisti': 100, 'sarjakuvantekijä': 100,\n 'kirjoittaja': 99, 'author': 99, 'soitonoppaan tekijä': 99,\n 'kuvaaja': 98, 'valokuvaaja': 98,\n 'kokoaja': 86, 'designer': 86,\n 'alkuperäisidean luoja': 85,\n 'teoksella kunnioitettu': 84, 'gratulaation kohde': 84,\n 'säveltäjä': 83, // if 300$e has CD etc\n 'sanoittaja': 82,\n 'julkaisija': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'toimittaja': 78,\n 'kuvittaja': 77,\n 'esipuheen kirjoittaja': 76,\n 'alkusanojen kirjoittaja': 75, 'loppusanojen kirjoittaja': 75,\n 'kääntäjä': 70,\n 'sovittaja': 50,\n // manifestaatio\n 'graafinen suunnittelija': 40,\n // kappale/item\n 'sitoja': 25,\n 'gratulaation kirjoittaja': 24\n};\n\nconst relatorTermScoreMu = {\n 'säveltäjä': 100,\n 'sanoittaja': 99,\n 'soitonoppaan tekijä': 98,\n 'alkuperäisidean luoja': 85,\n 'teoksella kunnioitettu': 81,\n // expression: https://finto.fi/mts/fi/page/m153\n 'sovittaja': 79,\n 'johtaja': 78,\n 'esittäjä': 77,\n 'lukija': 76,\n 'miksaaja': 75,\n // manifestaatio\n 'esittäjä (manifestaatio)': 69,\n\n 'graafinen suunnittelija': 50,\n 'valmistaja': 41,\n 'jakaja': 40\n // kappale/item\n\n};\n\nconst relatorTermScoreVm = { // Visual Material\n // Work\n 'ohjaaja': 100,\n 'kirjoittaja': 99, 'author': 99, // Here we assume that film/whatever is based on author's book\n 'käsikirjoittaja': 98, 'designer': 98,\n 'kuvaaja': 89,\n 'säveltäjä': 86, // Volatile. John Williams?\n 'alkuperäisidean luoja': 85,\n 'julkaisija': 82,\n 'tuottaja': 81,\n // Expression\n 'leikkaaja': 80,\n 'sovittaja': 79,\n 'johtaja': 78,\n 'esittäjä': 77,\n 'lukija': 76,\n 'miksaaja': 75,\n 'kääntäjä': 70,\n // Manifestation\n 'kaivertaja': 60,\n 'graafinen suunnittelija': 59,\n 'kustantaja': 42,\n 'elokuvan jakelija': 41, 'jakaja': 41\n\n // Item\n};\n\nfunction normalizeValue(value) {\n // Removing last punc char is good enough for our purposes.\n // We don't handle abbreviations here etc.\n // Brackets should not happen either, should they?\n return value.replace(/[.,]$/u, '');\n}\n\nfunction scoreRelatorTermBk(normalizedValue) {\n if (normalizedValue in relatorTermScoreBk) {\n return relatorTermScoreBk[normalizedValue];\n }\n return 0;\n}\n\nfunction scoreRelatorTermMu(normalizedValue) {\n if (normalizedValue in relatorTermScoreMu) {\n return relatorTermScoreMu[normalizedValue];\n }\n return 0;\n}\n\nfunction scoreRelatorTermVm(normalizedValue) {\n if (normalizedValue in relatorTermScoreVm) {\n return relatorTermScoreVm[normalizedValue];\n }\n return 0;\n}\n\nexport function scoreRelatorTerm(value, typeOfMaterial = undefined) {\n // NB! We are currently using type of material only for sorting relator terms, not 7XX fields!!!\n const normalizedValue = normalizeValue(value);\n if (typeOfMaterial === 'BK') { // Books\n return scoreRelatorTermBk(normalizedValue);\n }\n if (typeOfMaterial === 'MU') { // Music (NB: audio books should be BK in this context!)\n return scoreRelatorTermMu(normalizedValue);\n }\n if (typeOfMaterial === 'VM') { // video material\n return scoreRelatorTermVm(normalizedValue);\n }\n if (normalizedValue in relatorTermScore) {\n return relatorTermScore[normalizedValue];\n }\n return 0;\n}\n\nexport function fieldOrderComparator(fieldA, fieldB) {\n\n //const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n\n const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortBySubfield6, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n //const sorterFunctions = [sortByIndexTerms, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];\n\n return globalFieldOrderComparator(fieldA, fieldB, sorterFunctions);\n}\n\nfunction sortByIndexTerms(fieldA, fieldB) {\n\n const indexTermFields = ['600', '610', '611', '630', '648', '650', '651', '652', '653', '654', '655', '656', '657', '658', '659', '662'];\n\n function scoreInd2(val) {\n const ind2Score = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 8, '5': 5, '6': 6, '7': 7};\n\n if (val in ind2Score) {\n return ind2Score[val];\n }\n return 9;\n }\n\n // ATM this is not needed.\n // You may need this, if you change compare function order in sorterFunctions\n // istanbul ignore next\n if (fieldA.tag !== fieldB.tag) {\n return 0;\n }\n\n if (!indexTermFields.includes(fieldA.tag)) {\n return 0;\n }\n\n // Puts ind2=4 last\n if (scoreInd2(fieldA.ind2) > scoreInd2(fieldB.ind2)) {\n return 1;\n }\n if (scoreInd2(fieldA.ind2) < scoreInd2(fieldB.ind2)) {\n return -1;\n }\n\n function scoreDictionary(dictionary) {\n const dictionarySortIndex = {\n 'yso/fin': 0,\n 'yso/swe': 1,\n 'yso/eng': 2,\n 'slm/fin': 0.1,\n 'slm/swe': 1.1,\n 'kauno/fin': 2.1,\n 'kauno/swe': 2.2,\n 'kaunokki': 4,\n 'bella': 5\n };\n\n if (dictionary in dictionarySortIndex) {\n return dictionarySortIndex[dictionary];\n }\n return BIG_BAD_NUMBER;\n }\n\n const dictionaryA = selectFirstValue(fieldA, '2');\n const dictionaryB = selectFirstValue(fieldB, '2');\n\n const dictScoreA = scoreDictionary(dictionaryA);\n const dictScoreB = scoreDictionary(dictionaryB);\n // Use priority order for listed dictionaries:\n if (dictScoreA > dictScoreB) {\n return 1;\n }\n if (dictScoreA < dictScoreB) {\n return -1;\n }\n // Unlisted dictionaries: sort $2 value alphabetically:\n //if (dictScoreA === BIG_BAD_NUMBER) {\n if (dictionaryA > dictionaryB) {\n return 1;\n }\n if (dictionaryA < dictionaryB) {\n return -1;\n }\n //}\n return 0;\n}\n\n\nfunction preferKeep(fieldA, fieldB, keepOwner = 'FENNI') {\n const hasKeepA = fieldHasSubfield(fieldA, '9', `${keepOwner}<KEEP>`);\n const hasKeepB = fieldHasSubfield(fieldB, '9', `${keepOwner}<KEEP>`);\n\n if (hasKeepA && !hasKeepB) {\n return -1;\n }\n if (!hasKeepA && hasKeepB) {\n return 1;\n }\n\n return 0;\n}\n\n\nfunction preferFenniKeep(fieldA, fieldB) {\n const fenniPreference = preferKeep(fieldA, fieldB, 'FENNI');\n if (fenniPreference !== 0) {\n return fenniPreference;\n }\n const violaPreference = preferKeep(fieldA, fieldB, 'VIOLA');\n if (violaPreference !== 0) {\n return violaPreference;\n }\n return preferKeep(fieldA, fieldB, 'FIKKA');\n}\n\nfunction sortByRelatorTerm(fieldA, fieldB) {\n //if (!['600', '610', '611', '630', '700', '710', '711', '730', '800', '810', '811', '830'].includes(fieldA.tag)) {\n if (!['700', '710', '711', '730'].includes(fieldA.tag)) {\n return 0;\n }\n\n function fieldGetMaxRelatorTermScore(field) {\n if (!field.subfields) {\n return -2;\n }\n // If field has $t, it's a teos-nimeke-auktoriteetti, and thus meaningless. These should follow all $t-less fields...\n if (fieldHasSubfield(field, 't')) {\n return -2;\n }\n const relatorSubfieldCode = ['611', '711', '811'].includes(field.tag) ? 'j' : 'e';\n const e = field.subfields.filter(sf => sf.code === relatorSubfieldCode);\n if (e.length === 0) { // No $e is still better than having a $t\n return -1;\n }\n const scores = e.map(sf => scoreRelatorTerm(sf.value));\n //debugDev(`RELATOR SCORE FOR '${fieldToString(field)}': ${scores.join(', ')}`);\n return Math.max(...scores);\n }\n\n const scoreA = fieldGetMaxRelatorTermScore(fieldA);\n const scoreB = fieldGetMaxRelatorTermScore(fieldB);\n\n if (scoreA < scoreB) {\n return 1;\n }\n if (scoreA > scoreB) {\n return -1;\n }\n return 0;\n}\n\n\nfunction fieldGetMinLinkAndSequenceNumber(field) {\n if (!field.subfields) {\n return BIG_BAD_NUMBER;\n }\n const relevantSubfields = field.subfields.filter(sf => isValidSubfield8(sf));\n // If val is something like \"1.2\\x\" parseFloat() would give a syntax erro because of hex-like escape sequnce (at least on Chrome). Thus remove tail:\n const scores = relevantSubfields.map(sf => parseFloat(sf.value.replace(/\\\\.*$/u, '')));\n if (scores.length === 0) {\n return BIG_BAD_NUMBER;\n }\n return Math.min(...scores);\n}\n\nfunction sortByFieldLinkAndSequenceNumber(fieldA, fieldB) { // Sort by subfield $8 that is...\n const scoreA = fieldGetMinLinkAndSequenceNumber(fieldA);\n const scoreB = fieldGetMinLinkAndSequenceNumber(fieldB);\n //debugDev(` sf-8-A-score for '${fieldToString(fieldA)}: ${scoreA}`);\n //debugDev(` sf-8-B-score for '${fieldToString(fieldB)}: ${scoreB}`);\n if (scoreA === scoreB) {\n return 0;\n }\n if (scoreB === 0) {\n return 1;\n }\n if (scoreA === 0) {\n return -1;\n }\n if (scoreA > scoreB) { // smaller is better\n return 1;\n }\n return -1;\n}\n\n\nfunction sortBySubfield6(fieldA, fieldB) { // Sort by subfield $6, ex-sortByOccurrenceNumber...\n if (fieldA.tag !== '880' || fieldB.tag !== '880') {\n return 0;\n }\n\n function compareLinkingTags() {\n const tagStringA = fieldGetUnambiguousTag(fieldA);\n const tagStringB = fieldGetUnambiguousTag(fieldB);\n if (tagStringA === tagStringB || !tagStringA || !tagStringB) {\n return 0;\n }\n if (tagStringA > tagStringB) {\n return 1;\n }\n return -1;\n }\n\n function compareOccurrenceNumbers() {\n const stringA = fieldGetUnambiguousOccurrenceNumber(fieldA);\n const stringB = fieldGetUnambiguousOccurrenceNumber(fieldB);\n if (stringA === stringB) { // No action required here\n return 0;\n }\n\n // Handle expections: no occurrence number, occurrence number '00':\n if (!stringB || stringB === '00') {\n if (!stringA || stringA === '00') {\n return 0;\n }\n return -1;\n }\n if (!stringA || stringA === '00') {\n return 1;\n }\n\n // NB! We need compare ints as occurrence number can exceed 99 and be a three-digit value!\n const scoreA = parseInt(stringA, 10);\n const scoreB = parseInt(stringB, 10);\n\n if (scoreA > scoreB) { // smaller is better, thus '00' is the best\n return 1;\n }\n return -1;\n }\n\n const linkingTagComparisonResult = compareLinkingTags();\n if (linkingTagComparisonResult !== 0) {\n return linkingTagComparisonResult;\n }\n\n return compareOccurrenceNumbers();\n}\n\n\nfunction selectFirstValue(field, subcode) {\n return field.subfields\n .filter(subfield => subcode === subfield.code)\n .map(subfield => subfield.value)\n .slice(0, 1);\n}\n\n"],"mappings":"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","ignoreList":[]}
@@ -50,11 +50,10 @@ function _default() {
50
50
  const clonedFieldAsString = (0, _utils.fieldToString)(clonedField);
51
51
  const fieldAsString = (0, _utils.fieldToString)(field);
52
52
  if (fieldAsString !== clonedFieldAsString) {
53
- // eslint-disable-line functional/no-conditional-statements
54
- res.message.push(`${fieldAsString} => ${clonedFieldAsString}`); // eslint-disable-line functional/immutable-data
53
+ res.message.push(`${fieldAsString} => ${clonedFieldAsString}`);
55
54
  }
56
55
  });
57
- res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data
56
+ res.valid = !(res.message.length >= 1);
58
57
  return res;
59
58
  }
60
59
  }
@@ -103,8 +102,8 @@ function swapRelatorTermSubfields(field, typeOfMaterial = undefined) {
103
102
 
104
103
  // Swap:
105
104
  const tmp = field.subfields[index - 1];
106
- field.subfields[index - 1] = field.subfields[index]; // eslint-disable-line functional/immutable-data
107
- field.subfields[index] = tmp; // eslint-disable-line functional/immutable-data
105
+ field.subfields[index - 1] = field.subfields[index];
106
+ field.subfields[index] = tmp;
108
107
  (0, _punctuation.fieldFixPunctuation)(field);
109
108
  return true;
110
109
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sortRelatorTerms.js","names":["_clone","_interopRequireDefault","require","_utils","_punctuation","_sortFields","e","__esModule","default","WORST_WORK","_default","description","validate","fix","record","res","message","valid","typeOfMaterial","recordToTypeOfMaterial","fields","forEach","field","sortAdjacentRelatorTerms","clonedField","clone","clonedFieldAsString","fieldToString","fieldAsString","push","length","leader","undefined","charAt","getTypeOfMaterial","tagToRelatorTermSubfieldCode","tag","includes","isRelatorTermTag","swapRelatorTermSubfields","subfields","subfieldCode","swapPosition","findIndex","subfield","index","isSwappable","swapRelatorTermPair","tmp","fieldFixPunctuation","sf","code","currScore","scoreRelatorTerm","value","prevSubfield","prevScore"],"sources":["../src/sortRelatorTerms.js"],"sourcesContent":["// Validator/fixer for sorting $e relator term subfields\n//\n// Author(s): Nicholas Volk\n\nimport clone from 'clone';\n//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils';\nimport {fieldFixPunctuation} from './punctuation2';\nimport {scoreRelatorTerm} from './sortFields';\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortRelatorTerms');\n//const debugData = debug.extend('data');\n\nconst WORST_WORK = 81;\n\n\nexport default function () {\n\n return {\n description: 'Sort adjacent $e subfields in field [1678][01]0',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n const typeOfMaterial = recordToTypeOfMaterial(record);\n\n record.fields.forEach(field => {\n sortAdjacentRelatorTerms(field, typeOfMaterial);\n });\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const typeOfMaterial = recordToTypeOfMaterial(record);\n\n record.fields.forEach(field => {\n const clonedField = clone(field);\n sortAdjacentRelatorTerms(clonedField, typeOfMaterial);\n const clonedFieldAsString = fieldToString(clonedField);\n const fieldAsString = fieldToString(field);\n if (fieldAsString !== clonedFieldAsString) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(`${fieldAsString} => ${clonedFieldAsString}`); // eslint-disable-line functional/immutable-data\n }\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\nfunction recordToTypeOfMaterial(record) {\n if (!record.leader) {\n return undefined;\n }\n\n if (record.leader.charAt(6) === 'i') { // Audio books should follow rules of a book, I guess...\n return 'BK';\n }\n\n return record.getTypeOfMaterial();\n}\n\nexport function tagToRelatorTermSubfieldCode(tag) {\n if (['100', '110', '600', '610', '700', '710', '720', '751', '752', '800', '810'].includes(tag)) {\n return 'e';\n }\n if (['111', '611', '711', '811'].includes(tag)) {\n return 'j';\n }\n return '?'; // No need to complain. Nothing is found.\n}\n\nfunction isRelatorTermTag(tag) {\n // NV: 111/711, 751 and 752 are very rare\n return ['e', 'j'].includes(tagToRelatorTermSubfieldCode(tag));\n}\n\nfunction swapRelatorTermSubfields(field, typeOfMaterial = undefined) {\n if (!field.subfields) {\n return;\n }\n\n const subfieldCode = tagToRelatorTermSubfieldCode(field.tag);\n\n //console.log(`Processing ${fieldToString(field)}`); // eslint-disable-line no-console\n\n const swapPosition = field.subfields.findIndex((subfield, index) => isSwappable(subfield, index));\n\n if (swapPosition > 0) {\n swapRelatorTermPair(swapPosition);\n swapRelatorTermSubfields(field, typeOfMaterial); // uh, evil recursion...\n return;\n }\n\n //console.log(`END ${fieldToString(field)}`); // eslint-disable-line no-console\n\n function swapRelatorTermPair(index) {\n //console.log(` SWAP`); // eslint-disable-line no-console\n\n // Swap:\n const tmp = field.subfields[index - 1];\n field.subfields[index - 1] = field.subfields[index]; // eslint-disable-line functional/immutable-data\n field.subfields[index] = tmp; // eslint-disable-line functional/immutable-data\n fieldFixPunctuation(field);\n return true;\n }\n\n function isSwappable(sf, index) {\n // NB! we should fix 'e' to 'e' or 'j'....\n if (index === 0 || sf.code !== subfieldCode) {\n return false;\n }\n const currScore = scoreRelatorTerm(sf.value, typeOfMaterial);\n if (currScore === 0) {\n return false;\n }\n const prevSubfield = field.subfields[index - 1];\n if (prevSubfield.code !== subfieldCode) {\n return false;\n }\n const prevScore = scoreRelatorTerm(prevSubfield.value, typeOfMaterial);\n // console.log(`PREV: ${prevSubfield.value}/${prevScore}, CURR: ${sf.value}/${currScore}`); // eslint-disable-line no-console\n // If this subfield maps to a Work, then subfields can be swapped, even if we don't have a score for the prev subfield!\n if (prevScore === 0 && currScore < WORST_WORK) {\n return false;\n }\n return currScore > prevScore;\n }\n\n}\n\nexport function sortAdjacentRelatorTerms(field, typeOfMaterial = undefined) {\n if (!field.subfields || !isRelatorTermTag(field.tag)) {\n return field;\n }\n swapRelatorTermSubfields(field, typeOfMaterial);\n\n return field;\n}\n\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"sortRelatorTerms.js","names":["_clone","_interopRequireDefault","require","_utils","_punctuation","_sortFields","e","__esModule","default","WORST_WORK","_default","description","validate","fix","record","res","message","valid","typeOfMaterial","recordToTypeOfMaterial","fields","forEach","field","sortAdjacentRelatorTerms","clonedField","clone","clonedFieldAsString","fieldToString","fieldAsString","push","length","leader","undefined","charAt","getTypeOfMaterial","tagToRelatorTermSubfieldCode","tag","includes","isRelatorTermTag","swapRelatorTermSubfields","subfields","subfieldCode","swapPosition","findIndex","subfield","index","isSwappable","swapRelatorTermPair","tmp","fieldFixPunctuation","sf","code","currScore","scoreRelatorTerm","value","prevSubfield","prevScore"],"sources":["../src/sortRelatorTerms.js"],"sourcesContent":["// Validator/fixer for sorting $e relator term subfields\n//\n// Author(s): Nicholas Volk\n\nimport clone from 'clone';\n//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils';\nimport {fieldFixPunctuation} from './punctuation2';\nimport {scoreRelatorTerm} from './sortFields';\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortRelatorTerms');\n//const debugData = debug.extend('data');\n\nconst WORST_WORK = 81;\n\n\nexport default function () {\n\n return {\n description: 'Sort adjacent $e subfields in field [1678][01]0',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n const typeOfMaterial = recordToTypeOfMaterial(record);\n\n record.fields.forEach(field => {\n sortAdjacentRelatorTerms(field, typeOfMaterial);\n });\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const typeOfMaterial = recordToTypeOfMaterial(record);\n\n record.fields.forEach(field => {\n const clonedField = clone(field);\n sortAdjacentRelatorTerms(clonedField, typeOfMaterial);\n const clonedFieldAsString = fieldToString(clonedField);\n const fieldAsString = fieldToString(field);\n if (fieldAsString !== clonedFieldAsString) {\n res.message.push(`${fieldAsString} => ${clonedFieldAsString}`);\n }\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n}\n\n\nfunction recordToTypeOfMaterial(record) {\n if (!record.leader) {\n return undefined;\n }\n\n if (record.leader.charAt(6) === 'i') { // Audio books should follow rules of a book, I guess...\n return 'BK';\n }\n\n return record.getTypeOfMaterial();\n}\n\nexport function tagToRelatorTermSubfieldCode(tag) {\n if (['100', '110', '600', '610', '700', '710', '720', '751', '752', '800', '810'].includes(tag)) {\n return 'e';\n }\n if (['111', '611', '711', '811'].includes(tag)) {\n return 'j';\n }\n return '?'; // No need to complain. Nothing is found.\n}\n\nfunction isRelatorTermTag(tag) {\n // NV: 111/711, 751 and 752 are very rare\n return ['e', 'j'].includes(tagToRelatorTermSubfieldCode(tag));\n}\n\nfunction swapRelatorTermSubfields(field, typeOfMaterial = undefined) {\n if (!field.subfields) {\n return;\n }\n\n const subfieldCode = tagToRelatorTermSubfieldCode(field.tag);\n\n //console.log(`Processing ${fieldToString(field)}`); // eslint-disable-line no-console\n\n const swapPosition = field.subfields.findIndex((subfield, index) => isSwappable(subfield, index));\n\n if (swapPosition > 0) {\n swapRelatorTermPair(swapPosition);\n swapRelatorTermSubfields(field, typeOfMaterial); // uh, evil recursion...\n return;\n }\n\n //console.log(`END ${fieldToString(field)}`); // eslint-disable-line no-console\n\n function swapRelatorTermPair(index) {\n //console.log(` SWAP`); // eslint-disable-line no-console\n\n // Swap:\n const tmp = field.subfields[index - 1];\n field.subfields[index - 1] = field.subfields[index];\n field.subfields[index] = tmp;\n fieldFixPunctuation(field);\n return true;\n }\n\n function isSwappable(sf, index) {\n // NB! we should fix 'e' to 'e' or 'j'....\n if (index === 0 || sf.code !== subfieldCode) {\n return false;\n }\n const currScore = scoreRelatorTerm(sf.value, typeOfMaterial);\n if (currScore === 0) {\n return false;\n }\n const prevSubfield = field.subfields[index - 1];\n if (prevSubfield.code !== subfieldCode) {\n return false;\n }\n const prevScore = scoreRelatorTerm(prevSubfield.value, typeOfMaterial);\n // console.log(`PREV: ${prevSubfield.value}/${prevScore}, CURR: ${sf.value}/${currScore}`); // eslint-disable-line no-console\n // If this subfield maps to a Work, then subfields can be swapped, even if we don't have a score for the prev subfield!\n if (prevScore === 0 && currScore < WORST_WORK) {\n return false;\n }\n return currScore > prevScore;\n }\n\n}\n\nexport function sortAdjacentRelatorTerms(field, typeOfMaterial = undefined) {\n if (!field.subfields || !isRelatorTermTag(field.tag)) {\n return field;\n }\n swapRelatorTermSubfields(field, typeOfMaterial);\n\n return field;\n}\n\n"],"mappings":"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","ignoreList":[]}
@@ -55,11 +55,10 @@ function _default(defaultTagPattern) {
55
55
  const clonedFieldAsString = (0, _utils.fieldToString)(clonedField);
56
56
  const fieldAsString = (0, _utils.fieldToString)(field);
57
57
  if (fieldAsString !== clonedFieldAsString) {
58
- // eslint-disable-line functional/no-conditional-statements
59
- res.message.push(clonedFieldAsString); // eslint-disable-line functional/immutable-data
58
+ res.message.push(clonedFieldAsString);
60
59
  }
61
60
  });
62
- res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data
61
+ res.valid = !(res.message.length >= 1);
63
62
  return res;
64
63
  }
65
64
  }
@@ -264,8 +263,8 @@ function swapSubfields(field, sortOrder) {
264
263
  }
265
264
  // Swap:
266
265
  const tmp = field.subfields[index - 1];
267
- field.subfields[index - 1] = sf; // eslint-disable-line functional/immutable-data
268
- field.subfields[index] = tmp; // eslint-disable-line functional/immutable-data
266
+ field.subfields[index - 1] = sf;
267
+ field.subfields[index] = tmp;
269
268
  return true;
270
269
  });
271
270
  if (loopAgain) {
@@ -296,7 +295,7 @@ function moveSubfield6ToTheFront(field) {
296
295
  // https://www.loc.gov/marc/bibliographic/ecbdcntf.html says "Subfield $6 is always the first subfield in the field."
297
296
  const sf6s = field.subfields.filter(sf => sf.code === '6');
298
297
  const others = field.subfields.filter(sf => sf.code !== '6');
299
- field.subfields = [...sf6s, ...others]; // eslint-disable-line functional/immutable-data
298
+ field.subfields = [...sf6s, ...others];
300
299
  }
301
300
  function sortAdjacentSubfields(field, externalSortOrder = []) {
302
301
  if (!field.subfields) {