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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/.github/workflows/melinda-node-tests.yml +1 -1
  2. package/dist/access-rights.js +1 -5
  3. package/dist/access-rights.js.map +1 -1
  4. package/dist/addMissingField336.js +1 -1
  5. package/dist/addMissingField336.js.map +1 -1
  6. package/dist/cyrillux-usemarcon-replacement.js +41 -45
  7. package/dist/cyrillux-usemarcon-replacement.js.map +1 -1
  8. package/dist/cyrillux.js +13 -17
  9. package/dist/cyrillux.js.map +1 -1
  10. package/dist/disambiguateSeriesStatements.js +3 -4
  11. package/dist/disambiguateSeriesStatements.js.map +1 -1
  12. package/dist/double-commas.js +2 -1
  13. package/dist/double-commas.js.map +1 -1
  14. package/dist/duplicates-ind1.js +1 -1
  15. package/dist/duplicates-ind1.js.map +1 -1
  16. package/dist/empty-fields.js +0 -4
  17. package/dist/empty-fields.js.map +1 -1
  18. package/dist/ending-punctuation.js +21 -49
  19. package/dist/ending-punctuation.js.map +1 -1
  20. package/dist/ending-whitespace.js +0 -4
  21. package/dist/ending-whitespace.js.map +1 -1
  22. package/dist/field-008-18-34-character-groups.js +4 -5
  23. package/dist/field-008-18-34-character-groups.js.map +1 -1
  24. package/dist/field-505-separators.js +8 -6
  25. package/dist/field-505-separators.js.map +1 -1
  26. package/dist/field-521-fix.js +5 -6
  27. package/dist/field-521-fix.js.map +1 -1
  28. package/dist/field-exclusion.js +5 -12
  29. package/dist/field-exclusion.js.map +1 -1
  30. package/dist/field-exclusion.spec.js +3 -5
  31. package/dist/field-exclusion.spec.js.map +1 -1
  32. package/dist/field-structure.js +2 -5
  33. package/dist/field-structure.js.map +1 -1
  34. package/dist/fields-present.js +1 -1
  35. package/dist/fields-present.js.map +1 -1
  36. package/dist/fields-present.spec.js +1 -1
  37. package/dist/fields-present.spec.js.map +1 -1
  38. package/dist/fix-33X.js +5 -6
  39. package/dist/fix-33X.js.map +1 -1
  40. package/dist/fix-country-codes.js +3 -4
  41. package/dist/fix-country-codes.js.map +1 -1
  42. package/dist/fix-language-codes.js +12 -9
  43. package/dist/fix-language-codes.js.map +1 -1
  44. package/dist/fixRelatorTerms.js +8 -8
  45. package/dist/fixRelatorTerms.js.map +1 -1
  46. package/dist/fixed-fields.js +1 -4
  47. package/dist/fixed-fields.js.map +1 -1
  48. package/dist/identical-fields.js +2 -3
  49. package/dist/identical-fields.js.map +1 -1
  50. package/dist/indicator-fixes.js +14 -15
  51. package/dist/indicator-fixes.js.map +1 -1
  52. package/dist/isbn-issn.js +8 -11
  53. package/dist/isbn-issn.js.map +1 -1
  54. package/dist/item-language.js +5 -12
  55. package/dist/item-language.js.map +1 -1
  56. package/dist/merge-fields/counterpartField.js +6 -8
  57. package/dist/merge-fields/counterpartField.js.map +1 -1
  58. package/dist/merge-fields/index.js +3 -3
  59. package/dist/merge-fields/index.js.map +1 -1
  60. package/dist/merge-fields/mergeConstraints.js +0 -1
  61. package/dist/merge-fields/mergeConstraints.js.map +1 -1
  62. package/dist/merge-fields/mergeField.js +12 -18
  63. package/dist/merge-fields/mergeField.js.map +1 -1
  64. package/dist/merge-fields/mergeIndicator.js +5 -5
  65. package/dist/merge-fields/mergeIndicator.js.map +1 -1
  66. package/dist/merge-fields/mergeOrAddPostprocess.js +6 -9
  67. package/dist/merge-fields/mergeOrAddPostprocess.js.map +1 -1
  68. package/dist/merge-fields/mergeOrAddSubfield.js +6 -8
  69. package/dist/merge-fields/mergeOrAddSubfield.js.map +1 -1
  70. package/dist/merge-fields/mergeSubfield.js +8 -8
  71. package/dist/merge-fields/mergeSubfield.js.map +1 -1
  72. package/dist/merge-fields/removeDuplicateSubfields.js +1 -2
  73. package/dist/merge-fields/removeDuplicateSubfields.js.map +1 -1
  74. package/dist/merge-fields/worldKnowledge.js +1 -1
  75. package/dist/merge-fields/worldKnowledge.js.map +1 -1
  76. package/dist/mergeField500Lisapainokset.js +0 -3
  77. package/dist/mergeField500Lisapainokset.js.map +1 -1
  78. package/dist/mergeRelatorTermFields.js +3 -3
  79. package/dist/mergeRelatorTermFields.js.map +1 -1
  80. package/dist/modernize-502.js +6 -6
  81. package/dist/modernize-502.js.map +1 -1
  82. package/dist/multiple-subfield-0.js +4 -4
  83. package/dist/multiple-subfield-0.js.map +1 -1
  84. package/dist/non-breaking-space.js +0 -4
  85. package/dist/non-breaking-space.js.map +1 -1
  86. package/dist/normalize-dashes.js +5 -4
  87. package/dist/normalize-dashes.js.map +1 -1
  88. package/dist/normalize-identifiers.js +6 -6
  89. package/dist/normalize-identifiers.js.map +1 -1
  90. package/dist/normalize-qualifying-information.js +4 -4
  91. package/dist/normalize-qualifying-information.js.map +1 -1
  92. package/dist/normalize-utf8-diacritics.js +7 -7
  93. package/dist/normalize-utf8-diacritics.js.map +1 -1
  94. package/dist/normalizeFieldForComparison.js +21 -20
  95. package/dist/normalizeFieldForComparison.js.map +1 -1
  96. package/dist/normalizeSubfieldValueForComparison.js +1 -2
  97. package/dist/normalizeSubfieldValueForComparison.js.map +1 -1
  98. package/dist/prepublicationUtils.js +3 -3
  99. package/dist/prepublicationUtils.js.map +1 -1
  100. package/dist/punctuation/index.js +14 -31
  101. package/dist/punctuation/index.js.map +1 -1
  102. package/dist/punctuation2.js +9 -10
  103. package/dist/punctuation2.js.map +1 -1
  104. package/dist/reindexSubfield6OccurenceNumbers.js +8 -9
  105. package/dist/reindexSubfield6OccurenceNumbers.js.map +1 -1
  106. package/dist/removeDuplicateDataFields.js +18 -20
  107. package/dist/removeDuplicateDataFields.js.map +1 -1
  108. package/dist/removeInferiorDataFields.js +16 -19
  109. package/dist/removeInferiorDataFields.js.map +1 -1
  110. package/dist/resolvable-ext-references-melinda.js +4 -8
  111. package/dist/resolvable-ext-references-melinda.js.map +1 -1
  112. package/dist/resolveOrphanedSubfield6s.js +9 -9
  113. package/dist/resolveOrphanedSubfield6s.js.map +1 -1
  114. package/dist/sanitize-vocabulary-source-codes.js +9 -9
  115. package/dist/sanitize-vocabulary-source-codes.js.map +1 -1
  116. package/dist/sort-tags.js +2 -2
  117. package/dist/sort-tags.js.map +1 -1
  118. package/dist/sortFields.js +4 -9
  119. package/dist/sortFields.js.map +1 -1
  120. package/dist/sortRelatorTerms.js +4 -5
  121. package/dist/sortRelatorTerms.js.map +1 -1
  122. package/dist/sortSubfields.js +5 -6
  123. package/dist/sortSubfields.js.map +1 -1
  124. package/dist/stripPunctuation.js +2 -2
  125. package/dist/stripPunctuation.js.map +1 -1
  126. package/dist/subfield-exclusion.js +4 -11
  127. package/dist/subfield-exclusion.js.map +1 -1
  128. package/dist/subfield6Utils.js +12 -11
  129. package/dist/subfield6Utils.js.map +1 -1
  130. package/dist/subfield8Utils.js +8 -9
  131. package/dist/subfield8Utils.js.map +1 -1
  132. package/dist/subfieldValueNormalizations.js +5 -8
  133. package/dist/subfieldValueNormalizations.js.map +1 -1
  134. package/dist/sync-007-and-300.js +8 -8
  135. package/dist/sync-007-and-300.js.map +1 -1
  136. package/dist/translate-terms.js +5 -6
  137. package/dist/translate-terms.js.map +1 -1
  138. package/dist/typeOfDate-008.js +3 -4
  139. package/dist/typeOfDate-008.js.map +1 -1
  140. package/dist/unicode-decomposition.js +1 -1
  141. package/dist/unicode-decomposition.js.map +1 -1
  142. package/dist/update-field-540.js +5 -6
  143. package/dist/update-field-540.js.map +1 -1
  144. package/dist/urn.js +4 -9
  145. package/dist/urn.js.map +1 -1
  146. package/dist/utils.js +5 -9
  147. package/dist/utils.js.map +1 -1
  148. package/eslint.config.mjs +53 -0
  149. package/package.json +12 -13
  150. package/src/access-rights.js +4 -4
  151. package/src/addMissingField336.js +1 -1
  152. package/src/cyrillux-usemarcon-replacement.js +38 -38
  153. package/src/cyrillux.js +14 -14
  154. package/src/disambiguateSeriesStatements.js +3 -3
  155. package/src/double-commas.js +2 -2
  156. package/src/duplicates-ind1.js +1 -1
  157. package/src/empty-fields.js +4 -4
  158. package/src/ending-punctuation.js +46 -49
  159. package/src/ending-whitespace.js +0 -2
  160. package/src/field-008-18-34-character-groups.js +5 -5
  161. package/src/field-505-separators.js +6 -6
  162. package/src/field-521-fix.js +6 -6
  163. package/src/field-exclusion.js +12 -12
  164. package/src/field-exclusion.spec.js +4 -4
  165. package/src/field-structure.js +5 -5
  166. package/src/fields-present.js +1 -1
  167. package/src/fields-present.spec.js +1 -1
  168. package/src/fix-33X.js +5 -5
  169. package/src/fix-country-codes.js +3 -3
  170. package/src/fix-language-codes.js +10 -9
  171. package/src/fixRelatorTerms.js +8 -8
  172. package/src/fixed-fields.js +3 -3
  173. package/src/identical-fields.js +3 -3
  174. package/src/indicator-fixes.js +15 -15
  175. package/src/isbn-issn.js +11 -11
  176. package/src/item-language.js +10 -10
  177. package/src/merge-fields/counterpartField.js +7 -7
  178. package/src/merge-fields/index.js +3 -3
  179. package/src/merge-fields/mergeConstraints.js +1 -1
  180. package/src/merge-fields/mergeField.js +16 -17
  181. package/src/merge-fields/mergeIndicator.js +5 -5
  182. package/src/merge-fields/mergeOrAddPostprocess.js +9 -9
  183. package/src/merge-fields/mergeOrAddSubfield.js +6 -6
  184. package/src/merge-fields/mergeSubfield.js +8 -8
  185. package/src/merge-fields/removeDuplicateSubfields.js +1 -2
  186. package/src/merge-fields/worldKnowledge.js +1 -1
  187. package/src/mergeField500Lisapainokset.js +0 -2
  188. package/src/mergeRelatorTermFields.js +3 -3
  189. package/src/modernize-502.js +6 -6
  190. package/src/multiple-subfield-0.js +4 -4
  191. package/src/non-breaking-space.js +0 -2
  192. package/src/normalize-dashes.js +4 -4
  193. package/src/normalize-identifiers.js +6 -6
  194. package/src/normalize-qualifying-information.js +4 -4
  195. package/src/normalize-utf8-diacritics.js +7 -7
  196. package/src/normalizeFieldForComparison.js +20 -20
  197. package/src/normalizeSubfieldValueForComparison.js +1 -1
  198. package/src/prepublicationUtils.js +3 -3
  199. package/src/punctuation/index.js +29 -29
  200. package/src/punctuation2.js +10 -10
  201. package/src/reindexSubfield6OccurenceNumbers.js +9 -9
  202. package/src/removeDuplicateDataFields.js +21 -23
  203. package/src/removeInferiorDataFields.js +19 -19
  204. package/src/resolvable-ext-references-melinda.js +8 -8
  205. package/src/resolveOrphanedSubfield6s.js +9 -9
  206. package/src/sanitize-vocabulary-source-codes.js +8 -8
  207. package/src/sort-tags.js +2 -2
  208. package/src/sortFields.js +6 -6
  209. package/src/sortRelatorTerms.js +5 -5
  210. package/src/sortSubfields.js +6 -6
  211. package/src/stripPunctuation.js +2 -2
  212. package/src/subfield-exclusion.js +11 -11
  213. package/src/subfield6Utils.js +11 -11
  214. package/src/subfield8Utils.js +6 -9
  215. package/src/subfieldValueNormalizations.js +5 -7
  216. package/src/sync-007-and-300.js +8 -8
  217. package/src/translate-terms.js +3 -5
  218. package/src/typeOfDate-008.js +3 -3
  219. package/src/unicode-decomposition.js +1 -1
  220. package/src/update-field-540.js +6 -6
  221. package/src/urn.js +8 -6
  222. package/src/utils.js +8 -8
  223. package/.eslintignore +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"sortSubfields.js","names":["_clone","_interopRequireDefault","require","_debug","_utils","e","__esModule","default","debug","createDebugLogger","debugDev","extend","defaultSortOrderStringFinns","defaultSortOrderStringOthers","defaultSortOrderFinns","split","defaultSortOrderOthers","_default","defaultTagPattern","description","validate","fix","getRelevantFields","record","tagPattern","datafields","fields","filter","f","subfields","regexp","RegExp","test","tag","res","message","valid","relevantFields","forEach","field","sortAdjacentSubfields","clonedField","clone","clonedFieldAsString","fieldToString","fieldAsString","push","length","sortOrderForX00","sortOrderForX10","sortOrderForX11","sortOrderFor7XX","sortOrderFor246","subfieldSortOrder","getSubfieldSortOrder","entry","currEntry","sortOrder","nvdebug","swapSubfields","loopAgain","some","sf","index","currPos","getPosition","prevPos","tmp","subfield","indexOf","code","includes","value","twoBeforeZero","sf2","moveSubfield6ToTheFront","sf6s","others","externalSortOrder","finnishWay","controlSubfieldOrder","sortOrderForField","defaultSortOrder","subfieldOrder"],"sources":["../src/sortSubfields.js"],"sourcesContent":["// Author(s): Nicholas Volk\n\nimport clone from 'clone';\nimport createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortSubfields');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst defaultSortOrderStringFinns = '8673abcdefghijklmnopqrstuvwxyz420159'; // NB! We Finns like $2 before $0 in 6XX...\nconst defaultSortOrderStringOthers = '8673abcdefghijklmnopqrstuvwxyz402159';\n\nconst defaultSortOrderFinns = defaultSortOrderStringFinns.split('');\nconst defaultSortOrderOthers = defaultSortOrderStringOthers.split('');\n\n\nexport default function (defaultTagPattern) {\n\n return {\n description: 'Swap adjacent subfields',\n validate, fix\n };\n\n function getRelevantFields(record, tagPattern) {\n const datafields = record.fields.filter(f => f.subfields);\n if (!tagPattern) {\n return datafields;\n }\n\n const regexp = new RegExp(tagPattern, 'u');\n return datafields.filter(f => regexp.test(f.tag));\n }\n\n function fix(record, tagPattern = defaultTagPattern) {\n const res = {message: [], fix: [], valid: true};\n\n const relevantFields = getRelevantFields(record, tagPattern);\n\n relevantFields.forEach(field => {\n sortAdjacentSubfields(field);\n });\n\n return res;\n }\n\n function validate(record, tagPattern = defaultTagPattern) {\n const res = {message: []};\n\n const relevantFields = getRelevantFields(record, tagPattern);\n\n relevantFields.forEach(field => {\n const clonedField = clone(field);\n sortAdjacentSubfields(clonedField);\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(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\n// X00, X10, X11 and X130 could also for their own sets...\n// (ouch! sometimes $c comes after $d...): LoC: 100 0# ‡a Black Foot, ‡c Chief, ‡d d. 1877 ‡c (Spirit)\nconst sortOrderForX00 = ['i', 'a', 'b', 'q', 'c', 'd', 'e', 't', 'u', 'l', 'f', 'x', 'y', 'z', '0', '5', '9']; // skip $g. Can't remember why, though...\nconst sortOrderForX10 = ['i', 'a', 'b', 't', 'n', 'c', 'e', 'v', 'w', 'x', 'y', 'z', '0', '5', '9']; // somewhat iffy\nconst sortOrderForX11 = ['a', 'n', 'd', 'c', 'e', 'g', 'j', '0', '5', '9'];\nconst sortOrderFor7XX = ['8', '7', 'i', 'a', 's', 't', 'b', 'c', 'd', 'm', 'h', 'k', 'o', 'x', 'z', 'g', 'q', 'w'];\nconst sortOrderFor246 = ['i', 'a', 'b', 'n', 'p', 'f', '5', '9']; // Used by field 946 as well\n\n// List *only* exceptional order here. Otherwise default order is used.\nconst subfieldSortOrder = [\n {'tag': '017', 'sortOrder': ['i', 'a', 'b', 'd']},\n {'tag': '028', 'sortOrder': ['b', 'a', 'q']}, // National convention\n //{'tag': '031', 'sortOrder': ['a', 'b', 'c', 'm', 'e', 'd']}, // utter guesswork\n {'tag': '040', 'sortOrder': ['8', 'a', 'b', 'e', 'c', 'd', 'x']},\n {'tag': '041', 'sortOrder': ['8', 'a', 'd', 'j', 'p', 'h', 'e', 'g', 'm']}, // guesswork\n {'tag': '048', 'sortOrder': ['8', 'b', 'a']},\n {'tag': '100', 'sortOrder': sortOrderForX00},\n {'tag': '110', 'sortOrder': sortOrderForX10},\n {'tag': '111', 'sortOrder': sortOrderForX11},\n {'tag': '130', 'sortOrder': ['a', 'n', 'p', 'k', 'l']},\n {'tag': '240', 'sortOrder': ['a', 'm', 'n', 'p', 's', 'l', '2', '0', '1', '5', '9']},\n {'tag': '245', 'sortOrder': ['a', 'b', 'n', 'p', 'k', 'f', 'c']},\n {'tag': '246', 'sortOrder': sortOrderFor246},\n {'tag': '382', 'sortOrder': ['a']},\n {'tag': '385', 'sortOrder': ['8', 'm', 'n', 'a', '2', '0']},\n {'tag': '386', 'sortOrder': ['8', 'm', 'n', 'a']},\n {'tag': '490', 'sortOrder': ['a', 'x', 'y', 'v', 'l']},\n {'tag': '505', 'sortOrder': ['a']},\n {'tag': '526', 'sortOrder': ['i', 'a', 'b', 'x', 'z']},\n {'tag': '534', 'sortOrder': ['3', 'p', 'a', 't', 'l', 'c', 'f', 'b', 'e', 'o', 'x', 'z']},\n {'tag': '540', 'sortOrder': ['a', 'b', 'c', 'd', 'f', '2', 'u']},\n {'tag': '600', 'sortOrder': sortOrderForX00},\n {'tag': '610', 'sortOrder': sortOrderForX10},\n {'tag': '611', 'sortOrder': sortOrderForX11},\n {'tag': '650', 'sortOrder': ['a', 'x', 'y', 'z']},\n {'tag': '700', 'sortOrder': sortOrderForX00},\n {'tag': '710', 'sortOrder': sortOrderForX10},\n {'tag': '711', 'sortOrder': sortOrderForX11},\n {'tag': '760', 'sortOrder': sortOrderFor7XX},\n {'tag': '762', 'sortOrder': sortOrderFor7XX},\n {'tag': '765', 'sortOrder': sortOrderFor7XX},\n {'tag': '767', 'sortOrder': sortOrderFor7XX},\n {'tag': '770', 'sortOrder': sortOrderFor7XX},\n {'tag': '772', 'sortOrder': sortOrderFor7XX},\n {'tag': '773', 'sortOrder': sortOrderFor7XX},\n {'tag': '774', 'sortOrder': sortOrderFor7XX},\n {'tag': '775', 'sortOrder': sortOrderFor7XX},\n {'tag': '776', 'sortOrder': sortOrderFor7XX},\n {'tag': '777', 'sortOrder': sortOrderFor7XX},\n {'tag': '780', 'sortOrder': sortOrderFor7XX},\n {'tag': '785', 'sortOrder': sortOrderFor7XX},\n {'tag': '786', 'sortOrder': sortOrderFor7XX},\n {'tag': '787', 'sortOrder': sortOrderFor7XX},\n {'tag': '788', 'sortOrder': sortOrderFor7XX},\n {'tag': '800', 'sortOrder': sortOrderForX00},\n {'tag': '810', 'sortOrder': sortOrderForX10},\n {'tag': '811', 'sortOrder': sortOrderForX11},\n {'tag': '830', 'sortOrder': ['a', 'n', 'x', 'v']}, // INCOMPLETE, SAME AS 490? APPARENTLY NOT...\n {'tag': '856', 'sortOrder': ['3', 'u', 'q', 'x', 'y', 'z', '5']}, // incomplete, LoC examples are inconclusive\n {'tag': '880', 'sortOrder': ['a']},\n {'tag': '946', 'sortOrder': sortOrderFor246},\n {'tag': 'LOW', 'sortOrder': ['a', 'b', 'c', 'l', 'h']},\n {'tag': 'SID', 'sortOrder': ['c', 'b']} // Hack, so that default order is not used\n];\n\nfunction getSubfieldSortOrder(field) {\n const entry = subfieldSortOrder.filter(currEntry => field.tag === currEntry.tag);\n if (entry.length > 0 && 'sortOrder' in entry[0]) {\n debugDev(`sort order for ${field.tag}: ${entry[0].sortOrder}`);\n return entry[0].sortOrder;\n }\n nvdebug(`WARNING!\\tNo subfield order found for ${field.tag}.`);\n return [];\n}\n\n\nfunction swapSubfields(field, sortOrder) {\n if (!field.subfields) {\n return;\n }\n\n const loopAgain = field.subfields.some((sf, index) => {\n if (index === 0) {\n return false;\n }\n const currPos = getPosition(sf, sortOrder);\n const prevPos = getPosition(field.subfields[index - 1], sortOrder);\n if (currPos === -1 || prevPos === -1 || currPos >= prevPos) {\n return false;\n }\n // Swap:\n const tmp = field.subfields[index - 1];\n field.subfields[index - 1] = sf; // eslint-disable-line functional/immutable-data\n field.subfields[index] = tmp; // eslint-disable-line functional/immutable-data\n return true;\n });\n\n if (loopAgain) {\n return swapSubfields(field, sortOrder);\n }\n\n return;\n\n function getPosition(subfield, sortOrder) {\n // Magic exception that *always* comes first, used by Aleph in linking overlong fields\n if (sortOrder.indexOf('9') > -1 && subfield.code === '9' && ['^', '^^'].includes(subfield.value)) {\n return -0.5; // normal \"best value\" is 0, and \"worst value\" is N\n }\n return sortOrder.indexOf(subfield.code);\n }\n}\n\n\nfunction twoBeforeZero(field) {\n const sf2 = field.subfields.filter(sf => sf.code === '2');\n if (sf2.length !== 1) {\n return true; // both true and false are ok here\n }\n // MRA-465: gcipplatform (field 753)\n // rdasco (344), creatorbio (353), gbd (668), lsch (eg. 385)\n if (['creatorbio', 'gbd', 'gcipplatform', 'lscsh', 'rdasco'].includes(sf2[0].value)) {\n return false;\n }\n return true;\n}\n\nfunction moveSubfield6ToTheFront(field) {\n // https://www.loc.gov/marc/bibliographic/ecbdcntf.html says \"Subfield $6 is always the first subfield in the field.\"\n const sf6s = field.subfields.filter(sf => sf.code === '6');\n const others = field.subfields.filter(sf => sf.code !== '6');\n field.subfields = [...sf6s, ...others]; // eslint-disable-line functional/immutable-data\n}\n\nexport function sortAdjacentSubfields(field, externalSortOrder = []) {\n if (!field.subfields) {\n return field;\n }\n\n moveSubfield6ToTheFront(field); // specs: \"Subfield $6 is always the first subfield in the field.\"\n\n // Features:\n // - Swap only sort adjacent pairs.\n // - No sorting over unlisted subfield codes. Thus a given subfield can not shift to wrong side of 700$t...\n\n // Implement: 880 field should use values from $6...\n\n // Should we support multiple sort orders per field?\n\n // Try to handle control subfield order. This is not 100% fool proof. Control subfields are pretty stable, though.\n // However, there are exceptions (eg. $9 ^^ comes first and $2 $0 is a Finnish convention...)\n\n\n const finnishWay = twoBeforeZero(field);\n const controlSubfieldOrder = finnishWay ? ['8', '7', '3', 'a', '4', '2', '0', '1', '5', '9'] : ['8', '7', '3', 'a', '4', '0', '2', '1', '5', '9'];\n swapSubfields(field, controlSubfieldOrder);\n\n const sortOrderForField = externalSortOrder.length > 0 ? externalSortOrder : getSubfieldSortOrder(field);\n //nvdebug(`INTERMEDIATE SUBFIELD ORDER FOR ${field.tag}: ${sortOrderForField.join(', ')}`);\n\n const defaultSortOrder = finnishWay ? defaultSortOrderFinns : defaultSortOrderOthers; // $2 vs $0\n const subfieldOrder = sortOrderForField.length > 0 ? sortOrderForField : defaultSortOrder;\n //nvdebug(`FINAL SUBFIELD ORDER (FINNISH=${finnishWay}) FOR ${field.tag}: ${subfieldOrder.join(', ')}`);\n //if (sortOrder === null) { return field; } //// Currently always sort..\n //nvdebug(`IN: ${fieldToString(field)}`);\n swapSubfields(field, subfieldOrder);\n //nvdebug(`OUT: ${fieldToString(field)}`);\n\n return field;\n}\n\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"sortSubfields.js","names":["_clone","_interopRequireDefault","require","_debug","_utils","e","__esModule","default","debug","createDebugLogger","debugDev","extend","defaultSortOrderStringFinns","defaultSortOrderStringOthers","defaultSortOrderFinns","split","defaultSortOrderOthers","_default","defaultTagPattern","description","validate","fix","getRelevantFields","record","tagPattern","datafields","fields","filter","f","subfields","regexp","RegExp","test","tag","res","message","valid","relevantFields","forEach","field","sortAdjacentSubfields","clonedField","clone","clonedFieldAsString","fieldToString","fieldAsString","push","length","sortOrderForX00","sortOrderForX10","sortOrderForX11","sortOrderFor7XX","sortOrderFor246","subfieldSortOrder","getSubfieldSortOrder","entry","currEntry","sortOrder","nvdebug","swapSubfields","loopAgain","some","sf","index","currPos","getPosition","prevPos","tmp","subfield","indexOf","code","includes","value","twoBeforeZero","sf2","moveSubfield6ToTheFront","sf6s","others","externalSortOrder","finnishWay","controlSubfieldOrder","sortOrderForField","defaultSortOrder","subfieldOrder"],"sources":["../src/sortSubfields.js"],"sourcesContent":["// Author(s): Nicholas Volk\n\nimport clone from 'clone';\nimport createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortSubfields');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst defaultSortOrderStringFinns = '8673abcdefghijklmnopqrstuvwxyz420159'; // NB! We Finns like $2 before $0 in 6XX...\nconst defaultSortOrderStringOthers = '8673abcdefghijklmnopqrstuvwxyz402159';\n\nconst defaultSortOrderFinns = defaultSortOrderStringFinns.split('');\nconst defaultSortOrderOthers = defaultSortOrderStringOthers.split('');\n\n\nexport default function (defaultTagPattern) {\n\n return {\n description: 'Swap adjacent subfields',\n validate, fix\n };\n\n function getRelevantFields(record, tagPattern) {\n const datafields = record.fields.filter(f => f.subfields);\n if (!tagPattern) {\n return datafields;\n }\n\n const regexp = new RegExp(tagPattern, 'u');\n return datafields.filter(f => regexp.test(f.tag));\n }\n\n function fix(record, tagPattern = defaultTagPattern) {\n const res = {message: [], fix: [], valid: true};\n\n const relevantFields = getRelevantFields(record, tagPattern);\n\n relevantFields.forEach(field => {\n sortAdjacentSubfields(field);\n });\n\n return res;\n }\n\n function validate(record, tagPattern = defaultTagPattern) {\n const res = {message: []};\n\n const relevantFields = getRelevantFields(record, tagPattern);\n\n relevantFields.forEach(field => {\n const clonedField = clone(field);\n sortAdjacentSubfields(clonedField);\n const clonedFieldAsString = fieldToString(clonedField);\n const fieldAsString = fieldToString(field);\n if (fieldAsString !== clonedFieldAsString) {\n res.message.push(clonedFieldAsString);\n }\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n}\n\n\n// X00, X10, X11 and X130 could also for their own sets...\n// (ouch! sometimes $c comes after $d...): LoC: 100 0# ‡a Black Foot, ‡c Chief, ‡d d. 1877 ‡c (Spirit)\nconst sortOrderForX00 = ['i', 'a', 'b', 'q', 'c', 'd', 'e', 't', 'u', 'l', 'f', 'x', 'y', 'z', '0', '5', '9']; // skip $g. Can't remember why, though...\nconst sortOrderForX10 = ['i', 'a', 'b', 't', 'n', 'c', 'e', 'v', 'w', 'x', 'y', 'z', '0', '5', '9']; // somewhat iffy\nconst sortOrderForX11 = ['a', 'n', 'd', 'c', 'e', 'g', 'j', '0', '5', '9'];\nconst sortOrderFor7XX = ['8', '7', 'i', 'a', 's', 't', 'b', 'c', 'd', 'm', 'h', 'k', 'o', 'x', 'z', 'g', 'q', 'w'];\nconst sortOrderFor246 = ['i', 'a', 'b', 'n', 'p', 'f', '5', '9']; // Used by field 946 as well\n\n// List *only* exceptional order here. Otherwise default order is used.\nconst subfieldSortOrder = [\n {'tag': '017', 'sortOrder': ['i', 'a', 'b', 'd']},\n {'tag': '028', 'sortOrder': ['b', 'a', 'q']}, // National convention\n //{'tag': '031', 'sortOrder': ['a', 'b', 'c', 'm', 'e', 'd']}, // utter guesswork\n {'tag': '040', 'sortOrder': ['8', 'a', 'b', 'e', 'c', 'd', 'x']},\n {'tag': '041', 'sortOrder': ['8', 'a', 'd', 'j', 'p', 'h', 'e', 'g', 'm']}, // guesswork\n {'tag': '048', 'sortOrder': ['8', 'b', 'a']},\n {'tag': '100', 'sortOrder': sortOrderForX00},\n {'tag': '110', 'sortOrder': sortOrderForX10},\n {'tag': '111', 'sortOrder': sortOrderForX11},\n {'tag': '130', 'sortOrder': ['a', 'n', 'p', 'k', 'l']},\n {'tag': '240', 'sortOrder': ['a', 'm', 'n', 'p', 's', 'l', '2', '0', '1', '5', '9']},\n {'tag': '245', 'sortOrder': ['a', 'b', 'n', 'p', 'k', 'f', 'c']},\n {'tag': '246', 'sortOrder': sortOrderFor246},\n {'tag': '382', 'sortOrder': ['a']},\n {'tag': '385', 'sortOrder': ['8', 'm', 'n', 'a', '2', '0']},\n {'tag': '386', 'sortOrder': ['8', 'm', 'n', 'a']},\n {'tag': '490', 'sortOrder': ['a', 'x', 'y', 'v', 'l']},\n {'tag': '505', 'sortOrder': ['a']},\n {'tag': '526', 'sortOrder': ['i', 'a', 'b', 'x', 'z']},\n {'tag': '534', 'sortOrder': ['3', 'p', 'a', 't', 'l', 'c', 'f', 'b', 'e', 'o', 'x', 'z']},\n {'tag': '540', 'sortOrder': ['a', 'b', 'c', 'd', 'f', '2', 'u']},\n {'tag': '600', 'sortOrder': sortOrderForX00},\n {'tag': '610', 'sortOrder': sortOrderForX10},\n {'tag': '611', 'sortOrder': sortOrderForX11},\n {'tag': '650', 'sortOrder': ['a', 'x', 'y', 'z']},\n {'tag': '700', 'sortOrder': sortOrderForX00},\n {'tag': '710', 'sortOrder': sortOrderForX10},\n {'tag': '711', 'sortOrder': sortOrderForX11},\n {'tag': '760', 'sortOrder': sortOrderFor7XX},\n {'tag': '762', 'sortOrder': sortOrderFor7XX},\n {'tag': '765', 'sortOrder': sortOrderFor7XX},\n {'tag': '767', 'sortOrder': sortOrderFor7XX},\n {'tag': '770', 'sortOrder': sortOrderFor7XX},\n {'tag': '772', 'sortOrder': sortOrderFor7XX},\n {'tag': '773', 'sortOrder': sortOrderFor7XX},\n {'tag': '774', 'sortOrder': sortOrderFor7XX},\n {'tag': '775', 'sortOrder': sortOrderFor7XX},\n {'tag': '776', 'sortOrder': sortOrderFor7XX},\n {'tag': '777', 'sortOrder': sortOrderFor7XX},\n {'tag': '780', 'sortOrder': sortOrderFor7XX},\n {'tag': '785', 'sortOrder': sortOrderFor7XX},\n {'tag': '786', 'sortOrder': sortOrderFor7XX},\n {'tag': '787', 'sortOrder': sortOrderFor7XX},\n {'tag': '788', 'sortOrder': sortOrderFor7XX},\n {'tag': '800', 'sortOrder': sortOrderForX00},\n {'tag': '810', 'sortOrder': sortOrderForX10},\n {'tag': '811', 'sortOrder': sortOrderForX11},\n {'tag': '830', 'sortOrder': ['a', 'n', 'x', 'v']}, // INCOMPLETE, SAME AS 490? APPARENTLY NOT...\n {'tag': '856', 'sortOrder': ['3', 'u', 'q', 'x', 'y', 'z', '5']}, // incomplete, LoC examples are inconclusive\n {'tag': '880', 'sortOrder': ['a']},\n {'tag': '946', 'sortOrder': sortOrderFor246},\n {'tag': 'LOW', 'sortOrder': ['a', 'b', 'c', 'l', 'h']},\n {'tag': 'SID', 'sortOrder': ['c', 'b']} // Hack, so that default order is not used\n];\n\nfunction getSubfieldSortOrder(field) {\n const entry = subfieldSortOrder.filter(currEntry => field.tag === currEntry.tag);\n if (entry.length > 0 && 'sortOrder' in entry[0]) {\n debugDev(`sort order for ${field.tag}: ${entry[0].sortOrder}`);\n return entry[0].sortOrder;\n }\n nvdebug(`WARNING!\\tNo subfield order found for ${field.tag}.`);\n return [];\n}\n\n\nfunction swapSubfields(field, sortOrder) {\n if (!field.subfields) {\n return;\n }\n\n const loopAgain = field.subfields.some((sf, index) => {\n if (index === 0) {\n return false;\n }\n const currPos = getPosition(sf, sortOrder);\n const prevPos = getPosition(field.subfields[index - 1], sortOrder);\n if (currPos === -1 || prevPos === -1 || currPos >= prevPos) {\n return false;\n }\n // Swap:\n const tmp = field.subfields[index - 1];\n field.subfields[index - 1] = sf;\n field.subfields[index] = tmp;\n return true;\n });\n\n if (loopAgain) {\n return swapSubfields(field, sortOrder);\n }\n\n return;\n\n function getPosition(subfield, sortOrder) {\n // Magic exception that *always* comes first, used by Aleph in linking overlong fields\n if (sortOrder.indexOf('9') > -1 && subfield.code === '9' && ['^', '^^'].includes(subfield.value)) {\n return -0.5; // normal \"best value\" is 0, and \"worst value\" is N\n }\n return sortOrder.indexOf(subfield.code);\n }\n}\n\n\nfunction twoBeforeZero(field) {\n const sf2 = field.subfields.filter(sf => sf.code === '2');\n if (sf2.length !== 1) {\n return true; // both true and false are ok here\n }\n // MRA-465: gcipplatform (field 753)\n // rdasco (344), creatorbio (353), gbd (668), lsch (eg. 385)\n if (['creatorbio', 'gbd', 'gcipplatform', 'lscsh', 'rdasco'].includes(sf2[0].value)) {\n return false;\n }\n return true;\n}\n\nfunction moveSubfield6ToTheFront(field) {\n // https://www.loc.gov/marc/bibliographic/ecbdcntf.html says \"Subfield $6 is always the first subfield in the field.\"\n const sf6s = field.subfields.filter(sf => sf.code === '6');\n const others = field.subfields.filter(sf => sf.code !== '6');\n field.subfields = [...sf6s, ...others];\n}\n\nexport function sortAdjacentSubfields(field, externalSortOrder = []) {\n if (!field.subfields) {\n return field;\n }\n\n moveSubfield6ToTheFront(field); // specs: \"Subfield $6 is always the first subfield in the field.\"\n\n // Features:\n // - Swap only sort adjacent pairs.\n // - No sorting over unlisted subfield codes. Thus a given subfield can not shift to wrong side of 700$t...\n\n // Implement: 880 field should use values from $6...\n\n // Should we support multiple sort orders per field?\n\n // Try to handle control subfield order. This is not 100% fool proof. Control subfields are pretty stable, though.\n // However, there are exceptions (eg. $9 ^^ comes first and $2 $0 is a Finnish convention...)\n\n\n const finnishWay = twoBeforeZero(field);\n const controlSubfieldOrder = finnishWay ? ['8', '7', '3', 'a', '4', '2', '0', '1', '5', '9'] : ['8', '7', '3', 'a', '4', '0', '2', '1', '5', '9'];\n swapSubfields(field, controlSubfieldOrder);\n\n const sortOrderForField = externalSortOrder.length > 0 ? externalSortOrder : getSubfieldSortOrder(field);\n //nvdebug(`INTERMEDIATE SUBFIELD ORDER FOR ${field.tag}: ${sortOrderForField.join(', ')}`);\n\n const defaultSortOrder = finnishWay ? defaultSortOrderFinns : defaultSortOrderOthers; // $2 vs $0\n const subfieldOrder = sortOrderForField.length > 0 ? sortOrderForField : defaultSortOrder;\n //nvdebug(`FINAL SUBFIELD ORDER (FINNISH=${finnishWay}) FOR ${field.tag}: ${subfieldOrder.join(', ')}`);\n //if (sortOrder === null) { return field; } //// Currently always sort..\n //nvdebug(`IN: ${fieldToString(field)}`);\n swapSubfields(field, subfieldOrder);\n //nvdebug(`OUT: ${fieldToString(field)}`);\n\n return field;\n}\n\n"],"mappings":"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","ignoreList":[]}
@@ -30,7 +30,7 @@ function _default() {
30
30
  fix: [],
31
31
  valid: true
32
32
  };
33
- record.fields.forEach(f => (0, _punctuation.fieldStripPunctuation)(f));
33
+ record.fields.forEach(f => (0, _punctuation.fieldStripPunctuation)(f)); // eslint-disable-line array-callback-return
34
34
  return res;
35
35
  }
36
36
  function validate(record) {
@@ -42,7 +42,7 @@ function _default() {
42
42
  const res = {
43
43
  message: messages
44
44
  };
45
- res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data
45
+ res.valid = res.message.length < 1;
46
46
  return res;
47
47
  }
48
48
  }
@@ -1 +1 @@
1
- {"version":3,"file":"stripPunctuation.js","names":["_punctuation","require","_utils","_default","description","validate","fix","record","nvdebug","res","message","valid","fields","forEach","f","fieldStripPunctuation","fieldsNeedingModification","filter","fieldNeedsModification","values","map","fieldToString","newValues","fieldGetFixedString","messages","val","i","length"],"sources":["../src/stripPunctuation.js"],"sourcesContent":["/*\n* stripPunctuation.js -- try and remove a marc field punctuation (based on and reverse of punctuation2.js)\n*\n* Author(s): Nicholas Volk <nicholas.volk@helsinki.fi>\n*\n*/\n\nimport {fieldGetFixedString, fieldNeedsModification, fieldStripPunctuation} from './punctuation2';\n// import createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils';\n\n// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation2');\n\nexport default function () {\n return {\n description: 'Strip punctuation to data fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Strip punctuation to data fields: fixer');\n const res = {message: [], fix: [], valid: true};\n record.fields.forEach(f => fieldStripPunctuation(f));\n return res;\n }\n\n function validate(record) {\n nvdebug('Strip punctuation to data fields: validate');\n\n const fieldsNeedingModification = record.fields.filter(f => fieldNeedsModification(f, false));\n\n const values = fieldsNeedingModification.map(f => fieldToString(f));\n const newValues = fieldsNeedingModification.map(f => fieldGetFixedString(f, false));\n\n const messages = values.map((val, i) => `'${val}' => '${newValues[i]}'`);\n\n const res = {message: messages};\n\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n"],"mappings":";;;;;;AAOA,IAAAA,YAAA,GAAAC,OAAA;AAEA,IAAAC,MAAA,GAAAD,OAAA;AATA;AACA;AACA;AACA;AACA;AACA;;AAGA;;AAGA;;AAEe,SAAAE,SAAA,EAAY;EACzB,OAAO;IACLC,WAAW,EAAE,kCAAkC;IAC/CC,QAAQ;IAAEC;EACZ,CAAC;EAED,SAASA,GAAGA,CAACC,MAAM,EAAE;IACnB,IAAAC,cAAO,EAAC,yCAAyC,CAAC;IAClD,MAAMC,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEJ,GAAG,EAAE,EAAE;MAAEK,KAAK,EAAE;IAAI,CAAC;IAC/CJ,MAAM,CAACK,MAAM,CAACC,OAAO,CAACC,CAAC,IAAI,IAAAC,kCAAqB,EAACD,CAAC,CAAC,CAAC;IACpD,OAAOL,GAAG;EACZ;EAEA,SAASJ,QAAQA,CAACE,MAAM,EAAE;IACxB,IAAAC,cAAO,EAAC,4CAA4C,CAAC;IAErD,MAAMQ,yBAAyB,GAAGT,MAAM,CAACK,MAAM,CAACK,MAAM,CAACH,CAAC,IAAI,IAAAI,mCAAsB,EAACJ,CAAC,EAAE,KAAK,CAAC,CAAC;IAE7F,MAAMK,MAAM,GAAGH,yBAAyB,CAACI,GAAG,CAACN,CAAC,IAAI,IAAAO,oBAAa,EAACP,CAAC,CAAC,CAAC;IACnE,MAAMQ,SAAS,GAAGN,yBAAyB,CAACI,GAAG,CAACN,CAAC,IAAI,IAAAS,gCAAmB,EAACT,CAAC,EAAE,KAAK,CAAC,CAAC;IAEnF,MAAMU,QAAQ,GAAGL,MAAM,CAACC,GAAG,CAAC,CAACK,GAAG,EAAEC,CAAC,KAAK,IAAID,GAAG,SAASH,SAAS,CAACI,CAAC,CAAC,GAAG,CAAC;IAExE,MAAMjB,GAAG,GAAG;MAACC,OAAO,EAAEc;IAAQ,CAAC;IAE/Bf,GAAG,CAACE,KAAK,GAAGF,GAAG,CAACC,OAAO,CAACiB,MAAM,GAAG,CAAC,CAAC,CAAC;IACpC,OAAOlB,GAAG;EACZ;AACF","ignoreList":[]}
1
+ {"version":3,"file":"stripPunctuation.js","names":["_punctuation","require","_utils","_default","description","validate","fix","record","nvdebug","res","message","valid","fields","forEach","f","fieldStripPunctuation","fieldsNeedingModification","filter","fieldNeedsModification","values","map","fieldToString","newValues","fieldGetFixedString","messages","val","i","length"],"sources":["../src/stripPunctuation.js"],"sourcesContent":["/*\n* stripPunctuation.js -- try and remove a marc field punctuation (based on and reverse of punctuation2.js)\n*\n* Author(s): Nicholas Volk <nicholas.volk@helsinki.fi>\n*\n*/\n\nimport {fieldGetFixedString, fieldNeedsModification, fieldStripPunctuation} from './punctuation2';\n// import createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils';\n\n// const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation2');\n\nexport default function () {\n return {\n description: 'Strip punctuation to data fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Strip punctuation to data fields: fixer');\n const res = {message: [], fix: [], valid: true};\n record.fields.forEach(f => fieldStripPunctuation(f)); // eslint-disable-line array-callback-return\n return res;\n }\n\n function validate(record) {\n nvdebug('Strip punctuation to data fields: validate');\n\n const fieldsNeedingModification = record.fields.filter(f => fieldNeedsModification(f, false));\n\n const values = fieldsNeedingModification.map(f => fieldToString(f));\n const newValues = fieldsNeedingModification.map(f => fieldGetFixedString(f, false));\n\n const messages = values.map((val, i) => `'${val}' => '${newValues[i]}'`);\n\n const res = {message: messages};\n\n res.valid = res.message.length < 1;\n return res;\n }\n}\n"],"mappings":";;;;;;AAOA,IAAAA,YAAA,GAAAC,OAAA;AAEA,IAAAC,MAAA,GAAAD,OAAA;AATA;AACA;AACA;AACA;AACA;AACA;;AAGA;;AAGA;;AAEe,SAAAE,SAAA,EAAY;EACzB,OAAO;IACLC,WAAW,EAAE,kCAAkC;IAC/CC,QAAQ;IAAEC;EACZ,CAAC;EAED,SAASA,GAAGA,CAACC,MAAM,EAAE;IACnB,IAAAC,cAAO,EAAC,yCAAyC,CAAC;IAClD,MAAMC,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEJ,GAAG,EAAE,EAAE;MAAEK,KAAK,EAAE;IAAI,CAAC;IAC/CJ,MAAM,CAACK,MAAM,CAACC,OAAO,CAACC,CAAC,IAAI,IAAAC,kCAAqB,EAACD,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,OAAOL,GAAG;EACZ;EAEA,SAASJ,QAAQA,CAACE,MAAM,EAAE;IACxB,IAAAC,cAAO,EAAC,4CAA4C,CAAC;IAErD,MAAMQ,yBAAyB,GAAGT,MAAM,CAACK,MAAM,CAACK,MAAM,CAACH,CAAC,IAAI,IAAAI,mCAAsB,EAACJ,CAAC,EAAE,KAAK,CAAC,CAAC;IAE7F,MAAMK,MAAM,GAAGH,yBAAyB,CAACI,GAAG,CAACN,CAAC,IAAI,IAAAO,oBAAa,EAACP,CAAC,CAAC,CAAC;IACnE,MAAMQ,SAAS,GAAGN,yBAAyB,CAACI,GAAG,CAACN,CAAC,IAAI,IAAAS,gCAAmB,EAACT,CAAC,EAAE,KAAK,CAAC,CAAC;IAEnF,MAAMU,QAAQ,GAAGL,MAAM,CAACC,GAAG,CAAC,CAACK,GAAG,EAAEC,CAAC,KAAK,IAAID,GAAG,SAASH,SAAS,CAACI,CAAC,CAAC,GAAG,CAAC;IAExE,MAAMjB,GAAG,GAAG;MAACC,OAAO,EAAEc;IAAQ,CAAC;IAE/Bf,GAAG,CAACE,KAAK,GAAGF,GAAG,CAACC,OAAO,CAACiB,MAAM,GAAG,CAAC;IAClC,OAAOlB,GAAG;EACZ;AACF","ignoreList":[]}
@@ -80,11 +80,9 @@ function _default(config) {
80
80
 
81
81
  // Check subfields recursively
82
82
  if (key === 'subfields') {
83
- // eslint-disable-line functional/no-conditional-statements
84
83
  forEach(data, ([, subObj]) => {
85
84
  // Console.log("subObj: ", subObj, " type: ", typeof subObj, !(Array.isArray(subObj)))
86
85
  if (typeof subObj === 'object' && !Array.isArray(subObj)) {
87
- // eslint-disable-line functional/no-conditional-statements
88
86
  checkMandatory(spec[key], subObj);
89
87
  forEach(subObj, ([subKey, subVal]) => {
90
88
  configMatchesSpec(subVal, subKey, spec[key]);
@@ -134,7 +132,6 @@ function _default(config) {
134
132
  // Configuration object not found from found element
135
133
  return false;
136
134
  })) {
137
- // eslint-disable-line functional/no-conditional-statements
138
135
  // All configuration fields match, check if some subfields should be excluded.
139
136
  confObj.subfields.forEach(subField => {
140
137
  const excluded = [];
@@ -144,18 +141,15 @@ function _default(config) {
144
141
  const subFieldValueFine = subField.value && elemSub.value && subField.value.test(elemSub.value);
145
142
  if (subFieldCodeFine && (typeof subField.value === 'undefined' || subFieldValueFine)) {
146
143
  if (fix) {
147
- // eslint-disable-line functional/no-conditional-statements
148
- excluded.push(elemSub); // eslint-disable-line functional/immutable-data
144
+ excluded.push(elemSub);
149
145
  } else {
150
- // eslint-disable-line functional/no-conditional-statements
151
- res.message.push(`Subfield $${element.tag}$$${elemSub.code}should be excluded`); // eslint-disable-line functional/immutable-data
146
+ res.message.push(`Subfield $${element.tag}$$${elemSub.code}should be excluded`);
152
147
  }
153
148
  }
154
149
  });
155
- excluded.forEach(sf => record.removeSubfield(sf, element));
150
+ excluded.forEach(sf => record.removeSubfield(sf, element)); // eslint-disable-line array-callback-return
156
151
  // If no subfields remains, the whole field will be removed as well:
157
152
  if (element.subfields && element.subfields.length === 0) {
158
- // eslint-disable-line functional/no-conditional-statements
159
153
  record.removeField(element);
160
154
  }
161
155
  });
@@ -166,8 +160,7 @@ function _default(config) {
166
160
  // Fix does not send response
167
161
  if (!fix) {
168
162
  if (res.message.length > 0) {
169
- // eslint-disable-line functional/no-conditional-statements
170
- res.valid = false; // eslint-disable-line functional/immutable-data
163
+ res.valid = false;
171
164
  }
172
165
  return res;
173
166
  }
@@ -1 +1 @@
1
- {"version":3,"file":"subfield-exclusion.js","names":["confSpec","tag","type","mandatory","ind1","ind2","subfields","code","value","forEach","obj","fun","Object","entries","isRegExp","re","RegExp","_default","config","Array","isArray","TypeError","configValid","description","validate","record","excludeSubfields","fix","checkMandatory","key","val","configMatchesSpec","data","spec","Error","subObj","subKey","subVal","conf","res","message","valid","confObj","found","get","element","every","confKey","confField","test","subField","excluded","elemSub","subFieldCodeFine","subFieldValueFine","push","sf","removeSubfield","length","removeField"],"sources":["../src/subfield-exclusion.js"],"sourcesContent":["// Tag (RegExp): Pattern to match the field's tags Mandatory\n// ind1 (RegExp): Pattern to match the field's ind1 property\n// ind2 (RegExp): Pattern to match the field's ind2 property\n// subfields (Array<Object>): An array of objects with the following properties (Mandatory):\n// // code (RegExp): Pattern to match the subfield's code Mandatory\n// // value (RegExp): Pattern to match the subfield's value\n\n// Configuration specification\nconst confSpec = {\n tag: { // Pattern to match the field's tags\n type: 'RegExp',\n mandatory: true\n },\n ind1: { // Pattern to match the field's ind1 property.\n type: 'RegExp' // Array<Indicator>\n },\n ind2: { // Pattern to match the field's ind2 property.\n type: 'RegExp' // Array<Indicator>\n },\n subfields: { // An array of objects with the following properties\n code: {\n type: 'RegExp',\n mandatory: true\n },\n value: {\n type: 'RegExp'\n },\n mandatory: true\n }\n};\n\nfunction forEach(obj, fun) {\n Object.entries(obj).forEach(fun);\n}\n\nfunction isRegExp(re) {\n return re instanceof RegExp;\n}\n\nexport default function (config) {\n if (!Array.isArray(config)) {\n throw new TypeError('Configuration array not provided');\n }\n\n configValid(config);\n\n return {\n description:\n 'Checks that the record does not contain the configured subfields',\n validate: record => excludeSubfields(record, config, false),\n fix: record => excludeSubfields(record, config, true)\n };\n\n /// /////////////////////////////////////////\n // These check that configuration is valid\n function configValid(config) {\n config.forEach(obj => {\n checkMandatory(confSpec, obj);\n\n forEach(obj, ([key, val]) => {\n configMatchesSpec(val, key, confSpec);\n });\n });\n }\n\n // Recursive validator\n function configMatchesSpec(data, key, spec) {\n // Field not found in configuration spec\n if (!spec[key]) {\n throw new Error(`Configuration not valid - unidentified value: ${key}`);\n }\n\n // If configuration type does not match type in configuration spec\n if (typeof data !== spec[key].type &&\n (spec[key].type === 'RegExp' && !isRegExp(data))) {\n throw new Error(`Configuration not valid - invalid data type for: ${key}`);\n }\n\n // Check subfields recursively\n if (key === 'subfields') { // eslint-disable-line functional/no-conditional-statements\n forEach(data, ([, subObj]) => {\n // Console.log(\"subObj: \", subObj, \" type: \", typeof subObj, !(Array.isArray(subObj)))\n if (typeof subObj === 'object' && !Array.isArray(subObj)) { // eslint-disable-line functional/no-conditional-statements\n checkMandatory(spec[key], subObj);\n\n forEach(subObj, ([subKey, subVal]) => {\n configMatchesSpec(subVal, subKey, spec[key]);\n });\n } else {\n throw new TypeError(`Configuration not valid - subfield: ${subObj} not object`);\n }\n });\n }\n }\n\n function checkMandatory(spec, obj) {\n // Check if all mandatory fields are present\n forEach(spec, ([key, val]) => {\n if (val.mandatory && typeof obj[key] === 'undefined') {\n throw new Error(`Configuration not valid - missing mandatory element: ${key}`);\n }\n });\n }\n /// /////////////////////////////////////////\n\n /// /////////////////////////////////////////\n // These check that record is valid\n function excludeSubfields(record, conf, fix) {\n const res = {message: [], valid: true};\n\n // Parse trough every element of config array\n conf.forEach(confObj => {\n const found = record.get(confObj.tag); // Find matching record fields based on mandatory tag\n\n // Check if some of found record fields matches all configuration fields\n found.forEach(element => {\n // Compare each found element against each configuration object\n if (Object.entries(confObj).every(([confKey, confField]) => {\n // Tag already checked at .get(), subfields later\n if (confKey === 'tag' || confKey === 'subfields') {\n return true;\n }\n\n // Configuration object is RegExp and record value matches it\n if (element[confKey] && isRegExp(confField) && confField.test(element[confKey])) {\n return true;\n }\n\n // Configuration object not found from found element\n return false;\n })) { // eslint-disable-line functional/no-conditional-statements\n // All configuration fields match, check if some subfields should be excluded.\n confObj.subfields.forEach(subField => {\n const excluded = [];\n\n element.subfields.forEach(elemSub => {\n // Check if subfield matches configuration spec\n const subFieldCodeFine = subField.code && elemSub.code && subField.code.test(elemSub.code);\n const subFieldValueFine = subField.value && elemSub.value && subField.value.test(elemSub.value);\n if (subFieldCodeFine && (typeof subField.value === 'undefined' || subFieldValueFine)) {\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n excluded.push(elemSub); // eslint-disable-line functional/immutable-data\n } else { // eslint-disable-line functional/no-conditional-statements\n res.message.push(`Subfield $${element.tag}$$${elemSub.code}should be excluded`); // eslint-disable-line functional/immutable-data\n }\n }\n });\n\n excluded.forEach(sf => record.removeSubfield(sf, element));\n // If no subfields remains, the whole field will be removed as well:\n if (element.subfields && element.subfields.length === 0) { // eslint-disable-line functional/no-conditional-statements\n record.removeField(element);\n }\n });\n }\n });\n });\n\n // Fix does not send response\n if (!fix) {\n if (res.message.length > 0) { // eslint-disable-line functional/no-conditional-statements\n res.valid = false; // eslint-disable-line functional/immutable-data\n }\n\n return res;\n }\n // Res.fix.push('Field $' + element.tag + ' excluded');\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"subfield-exclusion.js","names":["confSpec","tag","type","mandatory","ind1","ind2","subfields","code","value","forEach","obj","fun","Object","entries","isRegExp","re","RegExp","_default","config","Array","isArray","TypeError","configValid","description","validate","record","excludeSubfields","fix","checkMandatory","key","val","configMatchesSpec","data","spec","Error","subObj","subKey","subVal","conf","res","message","valid","confObj","found","get","element","every","confKey","confField","test","subField","excluded","elemSub","subFieldCodeFine","subFieldValueFine","push","sf","removeSubfield","length","removeField"],"sources":["../src/subfield-exclusion.js"],"sourcesContent":["// Tag (RegExp): Pattern to match the field's tags Mandatory\n// ind1 (RegExp): Pattern to match the field's ind1 property\n// ind2 (RegExp): Pattern to match the field's ind2 property\n// subfields (Array<Object>): An array of objects with the following properties (Mandatory):\n// // code (RegExp): Pattern to match the subfield's code Mandatory\n// // value (RegExp): Pattern to match the subfield's value\n\n// Configuration specification\nconst confSpec = {\n tag: { // Pattern to match the field's tags\n type: 'RegExp',\n mandatory: true\n },\n ind1: { // Pattern to match the field's ind1 property.\n type: 'RegExp' // Array<Indicator>\n },\n ind2: { // Pattern to match the field's ind2 property.\n type: 'RegExp' // Array<Indicator>\n },\n subfields: { // An array of objects with the following properties\n code: {\n type: 'RegExp',\n mandatory: true\n },\n value: {\n type: 'RegExp'\n },\n mandatory: true\n }\n};\n\nfunction forEach(obj, fun) {\n Object.entries(obj).forEach(fun);\n}\n\nfunction isRegExp(re) {\n return re instanceof RegExp;\n}\n\nexport default function (config) {\n if (!Array.isArray(config)) {\n throw new TypeError('Configuration array not provided');\n }\n\n configValid(config);\n\n return {\n description:\n 'Checks that the record does not contain the configured subfields',\n validate: record => excludeSubfields(record, config, false),\n fix: record => excludeSubfields(record, config, true)\n };\n\n /// /////////////////////////////////////////\n // These check that configuration is valid\n function configValid(config) {\n config.forEach(obj => {\n checkMandatory(confSpec, obj);\n\n forEach(obj, ([key, val]) => {\n configMatchesSpec(val, key, confSpec);\n });\n });\n }\n\n // Recursive validator\n function configMatchesSpec(data, key, spec) {\n // Field not found in configuration spec\n if (!spec[key]) {\n throw new Error(`Configuration not valid - unidentified value: ${key}`);\n }\n\n // If configuration type does not match type in configuration spec\n if (typeof data !== spec[key].type &&\n (spec[key].type === 'RegExp' && !isRegExp(data))) {\n throw new Error(`Configuration not valid - invalid data type for: ${key}`);\n }\n\n // Check subfields recursively\n if (key === 'subfields') {\n forEach(data, ([, subObj]) => {\n // Console.log(\"subObj: \", subObj, \" type: \", typeof subObj, !(Array.isArray(subObj)))\n if (typeof subObj === 'object' && !Array.isArray(subObj)) {\n checkMandatory(spec[key], subObj);\n\n forEach(subObj, ([subKey, subVal]) => {\n configMatchesSpec(subVal, subKey, spec[key]);\n });\n } else {\n throw new TypeError(`Configuration not valid - subfield: ${subObj} not object`);\n }\n });\n }\n }\n\n function checkMandatory(spec, obj) {\n // Check if all mandatory fields are present\n forEach(spec, ([key, val]) => {\n if (val.mandatory && typeof obj[key] === 'undefined') {\n throw new Error(`Configuration not valid - missing mandatory element: ${key}`);\n }\n });\n }\n /// /////////////////////////////////////////\n\n /// /////////////////////////////////////////\n // These check that record is valid\n function excludeSubfields(record, conf, fix) {\n const res = {message: [], valid: true};\n\n // Parse trough every element of config array\n conf.forEach(confObj => {\n const found = record.get(confObj.tag); // Find matching record fields based on mandatory tag\n\n // Check if some of found record fields matches all configuration fields\n found.forEach(element => {\n // Compare each found element against each configuration object\n if (Object.entries(confObj).every(([confKey, confField]) => {\n // Tag already checked at .get(), subfields later\n if (confKey === 'tag' || confKey === 'subfields') {\n return true;\n }\n\n // Configuration object is RegExp and record value matches it\n if (element[confKey] && isRegExp(confField) && confField.test(element[confKey])) {\n return true;\n }\n\n // Configuration object not found from found element\n return false;\n })) {\n // All configuration fields match, check if some subfields should be excluded.\n confObj.subfields.forEach(subField => {\n const excluded = [];\n\n element.subfields.forEach(elemSub => {\n // Check if subfield matches configuration spec\n const subFieldCodeFine = subField.code && elemSub.code && subField.code.test(elemSub.code);\n const subFieldValueFine = subField.value && elemSub.value && subField.value.test(elemSub.value);\n if (subFieldCodeFine && (typeof subField.value === 'undefined' || subFieldValueFine)) {\n if (fix) {\n excluded.push(elemSub);\n } else {\n res.message.push(`Subfield $${element.tag}$$${elemSub.code}should be excluded`);\n }\n }\n });\n\n excluded.forEach(sf => record.removeSubfield(sf, element)); // eslint-disable-line array-callback-return\n // If no subfields remains, the whole field will be removed as well:\n if (element.subfields && element.subfields.length === 0) {\n record.removeField(element);\n }\n });\n }\n });\n });\n\n // Fix does not send response\n if (!fix) {\n if (res.message.length > 0) {\n res.valid = false;\n }\n\n return res;\n }\n // Res.fix.push('Field $' + element.tag + ' excluded');\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -79,9 +79,9 @@ function subfield6ResetOccurrenceNumber(subfield, occurrenceNumber) {
79
79
  return;
80
80
  }
81
81
  const occurrenceNumberAsString = typeof occurrenceNumber === 'number' ? intToOccurrenceNumberString(occurrenceNumber) : occurrenceNumber;
82
- const newValue = subfield.value.substring(0, 4) + occurrenceNumberAsString + subfield6GetTail(subfield); // eslint-disable-line functional/immutable-data
82
+ const newValue = subfield.value.substring(0, 4) + occurrenceNumberAsString + subfield6GetTail(subfield);
83
83
  //nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`);
84
- subfield.value = newValue; // eslint-disable-line functional/immutable-data
84
+ subfield.value = newValue;
85
85
  }
86
86
  function subfield6GetTail(subfield) {
87
87
  if (isValidSubfield6(subfield)) {
@@ -95,7 +95,7 @@ function subfield6HasWantedTagAndOccurrenceNumber(subfield, tagAndOccurrenceNumb
95
95
  return false;
96
96
  }
97
97
  // We could also use generic code and go getTag()+'-'+getIndex() instead of regexp...
98
- const key = subfield.value.replace(/^([0-9][0-9][0-9]-[0-9][0-9]+).*$/u, '$1'); // eslint-disable-line prefer-named-capture-group
98
+ const key = subfield.value.replace(/^([0-9][0-9][0-9]-[0-9][0-9]+).*$/u, '$1');
99
99
  (0, _utils.nvdebug)(` Compare '${key}' vs '${tagAndOccurrenceNumber}'`);
100
100
  return key === tagAndOccurrenceNumber;
101
101
  }
@@ -121,7 +121,8 @@ function fieldHasOccurrenceNumber(field, occurrenceNumber) {
121
121
  return field.subfields && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber);
122
122
  }
123
123
  function fieldResetOccurrenceNumber(field, newOccurrenceNumber, oldOccurrenceNumber = undefined) {
124
- field.subfields.forEach(subfield => innerReset(subfield));
124
+ field.subfields.forEach(subfield => innerReset(subfield)); // eslint-disable-line array-callback-return
125
+
125
126
  function innerReset(subfield) {
126
127
  // (Optional) Check that this is really the occurrence number we wan't to reseot
127
128
  if (oldOccurrenceNumber !== undefined) {
@@ -208,13 +209,13 @@ function subfieldSevenToOneOccurrenceNumber(subfield) {
208
209
  if (subfield.code !== '6' || subfield.value.substring(0, 1) !== '7') {
209
210
  return;
210
211
  }
211
- subfield.value = `1${subfield.value.substring(1)}`; // eslint-disable-line functional/immutable-data
212
+ subfield.value = `1${subfield.value.substring(1)}`;
212
213
  }
213
214
  function fieldSevenToOneOccurrenceNumber(field) {
214
215
  if (field.tag !== '880') {
215
216
  return;
216
217
  }
217
- field.subfields.forEach(sf => subfieldSevenToOneOccurrenceNumber(sf));
218
+ field.subfields.forEach(sf => subfieldSevenToOneOccurrenceNumber(sf)); // eslint-disable-line array-callback-return
218
219
  }
219
220
  function fieldGetOccurrenceNumberPairs(field, candFields) {
220
221
  // NB! TAG!=880 returns 880 fields, TAG==880 returns non-880 field
@@ -225,7 +226,7 @@ function fieldGetOccurrenceNumberPairs(field, candFields) {
225
226
  return pairs;
226
227
  }
227
228
  (0, _utils.nvdebug)(`${pairs.length} PAIR(S) FOUND FOR '${(0, _utils.fieldToString)(field)}'`);
228
- pairs.forEach(pairedField => (0, _utils.nvdebug)(` '${(0, _utils.fieldToString)(pairedField)}'`));
229
+ pairs.forEach(pairedField => (0, _utils.nvdebug)(` '${(0, _utils.fieldToString)(pairedField)}'`)); // eslint-disable-line array-callback-return
229
230
  return pairs;
230
231
  }
231
232
  function fieldGetOccurrenceNumbers(field) {
@@ -342,13 +343,13 @@ function guessTargetLinkingNumber(fields, defaultTargetLinkingNumber) {
342
343
  return defaultTargetLinkingNumber;
343
344
  }
344
345
  const linkingNumbers = (0, _subfield8Utils.fieldsGetAllSubfield8LinkingNumbers)(fields);
345
- return linkingNumbers.length === 1 ? linkingNumbers[0] : 0; // eslint-disable-line no-param-reassign
346
+ return linkingNumbers.length === 1 ? linkingNumbers[0] : 0;
346
347
  }
347
348
  function fieldsToNormalizedString(fields, defaultTargetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTag = false) {
348
349
  const targetLinkingNumber = guessTargetLinkingNumber(fields, defaultTargetLinkingNumber);
349
350
  (0, _utils.nvdebug)(`fieldsToNormalizedString: OCC: ${normalizeOccurrenceNumber}`);
350
351
  const strings = fields.map(field => fieldToNormalizedString(field, targetLinkingNumber, normalizeOccurrenceNumber, normalizeEntryTag));
351
- strings.sort(); // eslint-disable-line functional/immutable-data
352
+ strings.sort();
352
353
  return strings.join('\t__SEPARATOR__\t');
353
354
  }
354
355
 
@@ -455,7 +456,7 @@ function get6s(field, candidateFields) {
455
456
  (0, _utils.nvdebug)(occurrenceNumbers.join(' -- '));
456
457
  const relevantFields = candidateFields.filter(f => occurrenceNumbers.some(o => fieldHasOccurrenceNumber(f, o)));
457
458
  (0, _utils.nvdebug)(`${(0, _utils.fieldToString)(field)}: $6-RELFIELDS FOUND: ${relevantFields.length}...`);
458
- relevantFields.forEach(f => (0, _utils.nvdebug)((0, _utils.fieldToString)(f)));
459
+ relevantFields.forEach(f => (0, _utils.nvdebug)((0, _utils.fieldToString)(f))); // eslint-disable-line array-callback-return
459
460
  return relevantFields;
460
461
  }
461
462
  function resetSubfield6Tag(subfield, tag) {
@@ -465,6 +466,6 @@ function resetSubfield6Tag(subfield, tag) {
465
466
  // NB! mainly for 1XX<->7XX transfers
466
467
  const newValue = `${tag}-${subfield.value.substring(4)}`;
467
468
  (0, _utils.nvdebug)(`Set subfield $6 value from ${(0, _utils.subfieldToString)(subfield)} to ${newValue}`, debugDev);
468
- subfield.value = newValue; // eslint-disable-line functional/immutable-data
469
+ subfield.value = newValue;
469
470
  }
470
471
  //# sourceMappingURL=subfield6Utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"subfield6Utils.js","names":["_debug","_interopRequireDefault","require","_subfield8Utils","_utils","e","__esModule","default","debug","createDebugLogger","debugDev","extend","sf6Regexp","isValidSubfield6","subfield","code","value","match","subfield6GetTag","substring","undefined","subfield6GetOccurrenceNumber","replace","subfield6GetOccurrenceNumberAsInteger","index","result","parseInt","subfield6ResetOccurrenceNumber","occurrenceNumber","occurrenceNumberAsString","intToOccurrenceNumberString","newValue","subfield6GetTail","subfield6HasWantedTagAndOccurrenceNumber","tagAndOccurrenceNumber","key","nvdebug","fieldGetUnambiguousTag","field","tags","subfields","filter","sf","length","fieldGetUnambiguousOccurrenceNumber","occurrenceNumbers","fieldHasOccurrenceNumber","some","fieldResetOccurrenceNumber","newOccurrenceNumber","oldOccurrenceNumber","forEach","innerReset","currOccurrenceNumber","i","fieldGetMaxSubfield6OccurrenceNumberAsInteger","sf6s","vals","map","Math","max","fieldHasWantedTagAndOccurrenceNumber","fieldHasValidSubfield6","isSubfield6Pair","otherField","tagsArePairable6","tag","fieldIndex","otherFieldIndex","tag1","tag2","subfieldSevenToOneOccurrenceNumber","fieldSevenToOneOccurrenceNumber","fieldGetOccurrenceNumberPairs","candFields","pairs","fieldToString","pairedField","fieldGetOccurrenceNumbers","subfieldExtractOccurrenceNumber","includes","push","fieldsGetOccurrenceNumbers","fields","f","fieldProcessOccurrenceNumbers","newOccurrenceNumbers","is7XX","normalizeEntryTag","subfieldToNormalizedString","targetLinkingNumber","normalizeOccurrenceNumber","normalizeEntryTagBoolean","isValidSubfield8","currLinkingNumber","getSubfield8LinkingNumber","normVal","subfieldToString","fieldToNormalizedString","ind1","ind2","formatAndNormalizeSubfields","join","guessTargetLinkingNumber","defaultTargetLinkingNumber","linkingNumbers","fieldsGetAllSubfield8LinkingNumbers","fieldsToNormalizedString","strings","sort","getFirstField","record","fieldsAsStrings","findIndex","isRelevantSubfield6Chain","non880","every","fieldHasSubfield","fieldIsFirstFieldInChain","chain","firstField","getAllLinkedSubfield6Fields","get6s","moreFields","add8s","isFirstLinkedSubfield6Field","fieldsToString","recordGetSubfield6ChainHeads","recordGetMaxSubfield6OccurrenceNumberAsInteger","candidateFields","sixes","relevantFields","o","resetSubfield6Tag"],"sources":["../src/subfield6Utils.js"],"sourcesContent":["import createDebugLogger from 'debug';\n// const debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/subfield6Utils');\n\nimport {add8s, fieldsGetAllSubfield8LinkingNumbers, getSubfield8LinkingNumber, isValidSubfield8} from './subfield8Utils';\nimport {fieldHasSubfield, fieldToString, fieldsToString, nvdebug, subfieldToString} from './utils';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:subfield6Utils');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n// NB! Subfield 6 is non-repeatable and it should always comes first!\n// NB! Index size should always be 2 (preceding 0 required for 01..09) However, support for 100+ was added on 2023-02-27.\n// NB! Index value '00' are left as they are (is not paired/indexed/whatever.\nconst sf6Regexp = /^[0-9][0-9][0-9]-(?:[0-9][0-9]|[1-9][0-9]+)(?:[^0-9].*)?$/u;\n\nexport function isValidSubfield6(subfield) {\n if (subfield.code !== '6') {\n return false;\n }\n return subfield.value.match(sf6Regexp);\n}\n\nexport function subfield6GetTag(subfield) {\n if (isValidSubfield6(subfield)) {\n return subfield.value.substring(0, 3);\n }\n return undefined;\n}\n\nexport function subfield6GetOccurrenceNumber(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.substring(4).replace(/\\D.*$/u, '');\n }\n return undefined;\n}\n\nexport function subfield6GetOccurrenceNumberAsInteger(subfield) {\n const index = subfield6GetOccurrenceNumber(subfield);\n if (index === undefined || index === '00') {\n return 0;\n }\n const result = parseInt(index, 10);\n //nvdebug(`SF6: ${subfield.value} => ${index} => ${result}`, debug);\n return result;\n}\n\nexport function subfield6ResetOccurrenceNumber(subfield, occurrenceNumber) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n const occurrenceNumberAsString = typeof occurrenceNumber === 'number' ? intToOccurrenceNumberString(occurrenceNumber) : occurrenceNumber;\n\n const newValue = subfield.value.substring(0, 4) + occurrenceNumberAsString + subfield6GetTail(subfield); // eslint-disable-line functional/immutable-data\n //nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`);\n subfield.value = newValue; // eslint-disable-line functional/immutable-data\n}\n\n\nfunction subfield6GetTail(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.replace(/^\\d+-\\d+/u, '');\n }\n return '';\n}\n\nexport function subfield6HasWantedTagAndOccurrenceNumber(subfield, tagAndOccurrenceNumber) {\n if (subfield.code !== '6') {\n return false;\n }\n // We could also use generic code and go getTag()+'-'+getIndex() instead of regexp...\n const key = subfield.value.replace(/^([0-9][0-9][0-9]-[0-9][0-9]+).*$/u, '$1'); // eslint-disable-line prefer-named-capture-group\n nvdebug(` Compare '${key}' vs '${tagAndOccurrenceNumber}'`);\n return key === tagAndOccurrenceNumber;\n}\n\n// <= SUBFIELD, FIELD =>\n\nexport function fieldGetUnambiguousTag(field) {\n const tags = field.subfields.filter(sf => subfield6GetTag(sf));\n if (tags.length === 1) {\n return subfield6GetTag(tags[0]);\n }\n return undefined;\n}\n\nexport function fieldGetUnambiguousOccurrenceNumber(field) {\n const occurrenceNumbers = field.subfields.filter(sf => subfield6GetOccurrenceNumber(sf));\n if (occurrenceNumbers.length === 1) {\n return subfield6GetOccurrenceNumber(occurrenceNumbers[0]);\n }\n return undefined;\n}\n\nexport function fieldHasOccurrenceNumber(field, occurrenceNumber) {\n //nvdebug(`${occurrenceNumber} vs ${fieldToString(field)}`);\n return field.subfields && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber);\n}\n\nexport function fieldResetOccurrenceNumber(field, newOccurrenceNumber, oldOccurrenceNumber = undefined) {\n field.subfields.forEach(subfield => innerReset(subfield));\n\n function innerReset(subfield) {\n // (Optional) Check that this is really the occurrence number we wan't to reseot\n if (oldOccurrenceNumber !== undefined) {\n const currOccurrenceNumber = subfield6GetOccurrenceNumber(subfield);\n if (currOccurrenceNumber !== oldOccurrenceNumber) {\n return;\n }\n }\n subfield6ResetOccurrenceNumber(subfield, newOccurrenceNumber);\n }\n}\n\nexport function intToOccurrenceNumberString(i) {\n return i < 10 ? `0${i}` : `${i}`;\n}\n\nexport function fieldGetMaxSubfield6OccurrenceNumberAsInteger(field) {\n // used by reducer!\n //nvdebug(`Checking subfields $6 from ${JSON.stringify(field)}`);\n const sf6s = field.subfields ? field.subfields.filter(subfield => isValidSubfield6(subfield)) : [];\n if (sf6s.length === 0) {\n return 0;\n }\n // There should always be one, but here we check every subfield.\n //nvdebug(`Got ${field.subfields} $6-subfield(s) from ${JSON.stringify(field)}`, debug);\n const vals = sf6s.map(sf => subfield6GetOccurrenceNumberAsInteger(sf));\n return Math.max(...vals);\n}\n\nexport function fieldHasWantedTagAndOccurrenceNumber(field, tagAndOccurrenceNumber) {\n return field.subfields && field.subfields.some(sf => subfield6HasWantedTagAndOccurrenceNumber(sf, tagAndOccurrenceNumber));\n}\n\n\n/*\nexport function getFieldsWithGivenOccurrenceNumberSubfield6(record, occurrenceNumberAsString) {\n const record.fields.filter(field => field\n\n function fieldHasIndex(field, index) {\n if (!field.subfields) {\n return false;\n }\n return field.subfields.find(sf => isValidSubfield6(sf) && subfieldGetOccurrenceNumber6(sf) === index);\n }\n}\n*/\n\n\nexport function fieldHasValidSubfield6(field) {\n return field.subfields && field.subfields.some(sf => isValidSubfield6(sf));\n}\n\nexport function isSubfield6Pair(field, otherField) {\n // No need to log this:\n //nvdebug(`LOOK for $6-pair:\\n ${fieldToString(field)}\\n ${fieldToString(otherField)}`);\n if (!fieldHasValidSubfield6(field) || !fieldHasValidSubfield6(otherField)) {\n return false;\n }\n\n if (!tagsArePairable6(field.tag, otherField.tag)) {\n //nvdebug(` FAILED. REASON: TAGS NOT PAIRABLE!`);\n return false;\n }\n\n\n const fieldIndex = fieldGetUnambiguousOccurrenceNumber(field);\n if (fieldIndex === undefined || fieldIndex === '00') {\n //nvdebug(` FAILED. REASON: NO INDEX FOUND`);\n return false;\n }\n\n const otherFieldIndex = fieldGetUnambiguousOccurrenceNumber(otherField);\n\n\n if (fieldIndex !== otherFieldIndex) {\n //nvdebug(` FAILURE: INDEXES: ${fieldIndex} vs ${otherFieldIndex}`);\n return false;\n }\n\n if (fieldGetUnambiguousTag(field) !== otherField.tag || field.tag !== fieldGetUnambiguousTag(otherField)) {\n //nvdebug(` FAILURE: TAG vs $6 TAG`);\n return false;\n }\n return true;\n\n function tagsArePairable6(tag1, tag2) {\n // How to do XOR operation in one line? Well, this is probably more readable...\n if (tag1 === '880' && tag2 === '880') {\n return false;\n }\n if (tag1 !== '880' && tag2 !== '880') {\n return false;\n }\n return true;\n }\n}\n\n\nfunction subfieldSevenToOneOccurrenceNumber(subfield) {\n if (subfield.code !== '6' || subfield.value.substring(0, 1) !== '7') {\n return;\n }\n subfield.value = `1${subfield.value.substring(1)}`; // eslint-disable-line functional/immutable-data\n}\n\nexport function fieldSevenToOneOccurrenceNumber(field) {\n if (field.tag !== '880') {\n return;\n }\n field.subfields.forEach(sf => subfieldSevenToOneOccurrenceNumber(sf));\n}\n\n\nexport function fieldGetOccurrenceNumberPairs(field, candFields) {\n // NB! TAG!=880 returns 880 fields, TAG==880 returns non-880 field\n //nvdebug(` Trying to finds pair for ${fieldToString(field)} in ${candFields.length} fields`);\n const pairs = candFields.filter(otherField => isSubfield6Pair(field, otherField));\n if (pairs.length === 0) {\n nvdebug(`NO PAIRS FOUND FOR '${fieldToString(field)}'`);\n return pairs;\n }\n nvdebug(`${pairs.length} PAIR(S) FOUND FOR '${fieldToString(field)}'`);\n pairs.forEach(pairedField => nvdebug(` '${fieldToString(pairedField)}'`));\n return pairs;\n}\n\nexport function fieldGetOccurrenceNumbers(field) {\n /* eslint-disable */\n let occurrenceNumbers = [];\n field.subfields?.forEach(sf => subfieldExtractOccurrenceNumber(sf));\n\n function subfieldExtractOccurrenceNumber(sf) {\n if (!isValidSubfield6(sf)) {\n return;\n }\n const occurrenceNumber = subfield6GetOccurrenceNumber(sf);\n if (occurrenceNumber === '00' || occurrenceNumbers.includes(occurrenceNumber)) {\n return;\n }\n occurrenceNumbers.push(occurrenceNumber);\n }\n /* eslint-enable */\n return occurrenceNumbers;\n}\n\nexport function fieldsGetOccurrenceNumbers(fields) {\n /* eslint-disable */\n let occurrenceNumbers = [];\n\n fields.forEach(f => fieldProcessOccurrenceNumbers(f));\n\n function fieldProcessOccurrenceNumbers(f) {\n const newOccurrenceNumbers = fieldGetOccurrenceNumbers(f);\n newOccurrenceNumbers.forEach(occurrenceNumber => {\n if (!occurrenceNumbers.includes(occurrenceNumber)) {\n occurrenceNumbers.push(occurrenceNumber);\n }\n\n });\n }\n /* eslint-enable */\n return occurrenceNumbers;\n}\n\n/*\nexport function fieldGetSubfield6Pair(field, record) {\n const pairedFields = record.fields.filter(otherField => isSubfield6Pair(field, otherField));\n if (pairedFields.length !== 1) {\n return undefined;\n }\n // NB! It is theoretically possible to have multiple pairable 880 fields (one for each encoding)\n nvdebug(`fieldGetSubfield6Pair(): ${fieldToString(field)} => ${fieldToString(pairedFields[0])}`);\n return pairedFields[0];\n}\n*/\n\n/*\nexport function pairAndStringify6(field, record) {\n const pair6 = fieldGetSubfield6Pair(field, record);\n if (!pair6) {\n return fieldToNormalizedString(field);\n }\n return fieldsToNormalizedString([field, pair6]);\n}\n*/\n\n// Frequencly list for $6 subfields in 1XX/7XX fields:\n// 231115 100\n// 183832 700\n// 28773 710\n// 2047 711\n// 661 110\n// 341 111\n// 284 130\n// 63 730\n// Thus there's a real risk of ending up with, say, identical 100 vs 700 chains.\n// Semi-hackily support 1XX/7XX-version: 7XX can be deleted if corresponding 1XX exists:\n\nexport function is7XX(tag) {\n return ['700', '710', '711', '730'].includes(tag);\n}\n\n\nfunction normalizeEntryTag(tag) {\n if (tag.match(/^[17](?:00|10|11|30)$/u)) {\n return `X${tag.substring(1)}`;\n }\n return tag;\n}\n\nfunction subfieldToNormalizedString(sf, tag, targetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTagBoolean = false) {\n // targetLinkingNumber refers to $8.\n // normalizeEntryTagBoolean refers to 1XX/7XX tag values in subfield $6 value.\n if (isValidSubfield6(sf)) { // && targetLinkingNumber === 0) {\n // 1XX/7XX (entry tag) normalization:\n const tag2 = normalizeEntryTagBoolean ? normalizeEntryTag(tag) : tag;\n\n const occurrenceNumber = normalizeOccurrenceNumber ? 'XX' : subfield6GetOccurrenceNumber(sf);\n // If we are normalizing a $8 chain, don't normalize $6 occurrence number!\n // Replace $6 occurrence number with XX:\n return ` ‡${sf.code} ${tag2}-${occurrenceNumber}${subfield6GetTail(sf)}`;\n }\n\n if (isValidSubfield8(sf)) {\n const currLinkingNumber = getSubfield8LinkingNumber(sf); //getSubfield8Index(sf);\n if (targetLinkingNumber > 0 && currLinkingNumber === targetLinkingNumber) {\n // For $8 we should only XX the index we are looking at...\n const normVal = sf.value.replace(/^[0-9]+/u, 'XX');\n return ` ‡${sf.code} ${normVal}`;\n }\n return ''; // Other $8 subfields are meaningless in this context\n }\n return ` ${subfieldToString(sf)}`; // `‡${sf.code} ${sf.value}`;\n}\n\nexport function fieldToNormalizedString(field, targetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTagBoolean = false) {\n if ('subfields' in field) {\n const tag2 = normalizeEntryTagBoolean ? normalizeEntryTag(field.tag) : field.tag;\n return `${tag2} ${field.ind1}${field.ind2}${formatAndNormalizeSubfields(field)}`;\n }\n return `${field.tag} ${field.value}`;\n\n function formatAndNormalizeSubfields(field) {\n return field.subfields.map(sf => subfieldToNormalizedString(sf, field.tag, targetLinkingNumber, normalizeOccurrenceNumber, normalizeEntryTagBoolean)).join('');\n }\n\n}\n\n\nfunction guessTargetLinkingNumber(fields, defaultTargetLinkingNumber) {\n if (defaultTargetLinkingNumber !== 0) {\n return defaultTargetLinkingNumber;\n }\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fields);\n return linkingNumbers.length === 1 ? linkingNumbers[0] : 0; // eslint-disable-line no-param-reassign\n}\n\nexport function fieldsToNormalizedString(fields, defaultTargetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTag = false) {\n const targetLinkingNumber = guessTargetLinkingNumber(fields, defaultTargetLinkingNumber);\n\n nvdebug(`fieldsToNormalizedString: OCC: ${normalizeOccurrenceNumber}`);\n const strings = fields.map(field => fieldToNormalizedString(field, targetLinkingNumber, normalizeOccurrenceNumber, normalizeEntryTag));\n strings.sort(); // eslint-disable-line functional/immutable-data\n return strings.join('\\t__SEPARATOR__\\t');\n}\n\n\n/*\n\nexport function removeField6IfNeeded(field, record, fieldsAsString) {\n const pairField = fieldGetSubfield6Pair(field, record);\n const asString = pairField ? fieldsToNormalizedString([field, pairField]) : fieldToNormalizedString(field);\n nvdebug(`SOURCE: ${asString} -- REALITY: ${fieldToString(field)}`);\n const tmp = pairField ? fieldToString(pairField) : 'HUTI';\n nvdebug(`PAIR: ${tmp}`);\n nvdebug(`BASE:\\n ${fieldsAsString.join('\\n ')}`);\n if (!fieldsAsString.includes(asString)) {\n return;\n }\n nvdebug(`Duplicate $6 removal: ${fieldToString(field)}`);\n record.removeField(field);\n\n if (pairField === undefined) {\n return;\n }\n nvdebug(`Duplicate $6 removal (pair): ${fieldToString(pairField)}`);\n record.removeField(pairField);\n}\n*/\n\nfunction getFirstField(record, fields) {\n const fieldsAsStrings = fields.map(field => fieldToString(field));\n //record.fields.forEach((field, i) => nvdebug(`${i}:\\t${fieldToString(field)}`));\n //nvdebug(`getFirstField: ${fieldsAsStrings.join('\\t')}`);\n const i = record.fields.findIndex(field => fieldsAsStrings.includes(fieldToString(field)));\n if (i > -1) {\n const field = record.fields[i];\n //nvdebug(`1st F: ${i + 1}/${record.fields.length} ${fieldToString(field)}`);\n return field;\n }\n return undefined;\n}\n\nfunction isRelevantSubfield6Chain(fields) {\n if (fields.length < 2) { // 1 non-880-field and 1+ 880 fields\n return false;\n }\n const non880 = fields.filter(f => f.tag !== '880');\n if (non880.length !== 1) {\n return false;\n }\n\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fields);\n if (linkingNumbers.length !== 0) {\n return false;\n }\n\n return fields.every(f => fieldHasSubfield(f, '6'));\n}\n\nexport function fieldIsFirstFieldInChain(field, chain, record) {\n // Interpretation of first: position of field in record (however, we might have a duplicate field. See tests...)\n const firstField = getFirstField(record, chain);\n if (firstField) {\n return fieldToString(field) === fieldToString(firstField);\n }\n return false;\n\n}\n\n\nexport function getAllLinkedSubfield6Fields(field, record) {\n const fields = get6s(field, record);\n const moreFields = add8s(fields, record);\n\n // Currently we don't handle fields with more than one $6 and/or $8 subfield.\n if (moreFields.length > fields.length) {\n return []; // Don't fix!\n }\n return moreFields;\n}\n\nexport function isFirstLinkedSubfield6Field(field, record) {\n if (!field.subfields) { // Is not a datafield\n return false;\n }\n const chain = getAllLinkedSubfield6Fields(field, record);\n if (!isRelevantSubfield6Chain(chain)) {\n nvdebug(`Rejected 6: ${fieldsToString(chain)}`);\n return false;\n }\n\n return fieldIsFirstFieldInChain(field, chain, record);\n}\n\nexport function recordGetSubfield6ChainHeads(record) {\n return record.fields.filter(field => isFirstLinkedSubfield6Field(field, record));\n}\n\nexport function recordGetMaxSubfield6OccurrenceNumberAsInteger(record) {\n if (record.fields.length === 0) {\n return 0;\n }\n // Should we cache the value here?\n const vals = record.fields.map((field) => fieldGetMaxSubfield6OccurrenceNumberAsInteger(field));\n return Math.max(...vals);\n}\n\nexport function get6s(field, candidateFields) { // NB! Convert field to fields!!!\n // Get all fields with given occurrence number\n const sixes = field.subfields.filter(sf => isValidSubfield6(sf));\n\n if (sixes.length === 0) {\n return [field];\n }\n nvdebug(`SIXES: ${sixes.length}`);\n const occurrenceNumbers = sixes.map(sf => subfield6GetOccurrenceNumber(sf)).filter(value => value !== undefined && value !== '00');\n nvdebug(occurrenceNumbers.join(' -- '));\n\n const relevantFields = candidateFields.filter(f => occurrenceNumbers.some(o => fieldHasOccurrenceNumber(f, o)));\n nvdebug(`${fieldToString(field)}: $6-RELFIELDS FOUND: ${relevantFields.length}...`);\n relevantFields.forEach(f => nvdebug(fieldToString(f)));\n return relevantFields;\n}\n\nexport function resetSubfield6Tag(subfield, tag) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n // NB! mainly for 1XX<->7XX transfers\n const newValue = `${tag}-${subfield.value.substring(4)}`;\n nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`, debugDev);\n subfield.value = newValue; // eslint-disable-line functional/immutable-data\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"subfield6Utils.js","names":["_debug","_interopRequireDefault","require","_subfield8Utils","_utils","e","__esModule","default","debug","createDebugLogger","debugDev","extend","sf6Regexp","isValidSubfield6","subfield","code","value","match","subfield6GetTag","substring","undefined","subfield6GetOccurrenceNumber","replace","subfield6GetOccurrenceNumberAsInteger","index","result","parseInt","subfield6ResetOccurrenceNumber","occurrenceNumber","occurrenceNumberAsString","intToOccurrenceNumberString","newValue","subfield6GetTail","subfield6HasWantedTagAndOccurrenceNumber","tagAndOccurrenceNumber","key","nvdebug","fieldGetUnambiguousTag","field","tags","subfields","filter","sf","length","fieldGetUnambiguousOccurrenceNumber","occurrenceNumbers","fieldHasOccurrenceNumber","some","fieldResetOccurrenceNumber","newOccurrenceNumber","oldOccurrenceNumber","forEach","innerReset","currOccurrenceNumber","i","fieldGetMaxSubfield6OccurrenceNumberAsInteger","sf6s","vals","map","Math","max","fieldHasWantedTagAndOccurrenceNumber","fieldHasValidSubfield6","isSubfield6Pair","otherField","tagsArePairable6","tag","fieldIndex","otherFieldIndex","tag1","tag2","subfieldSevenToOneOccurrenceNumber","fieldSevenToOneOccurrenceNumber","fieldGetOccurrenceNumberPairs","candFields","pairs","fieldToString","pairedField","fieldGetOccurrenceNumbers","subfieldExtractOccurrenceNumber","includes","push","fieldsGetOccurrenceNumbers","fields","f","fieldProcessOccurrenceNumbers","newOccurrenceNumbers","is7XX","normalizeEntryTag","subfieldToNormalizedString","targetLinkingNumber","normalizeOccurrenceNumber","normalizeEntryTagBoolean","isValidSubfield8","currLinkingNumber","getSubfield8LinkingNumber","normVal","subfieldToString","fieldToNormalizedString","ind1","ind2","formatAndNormalizeSubfields","join","guessTargetLinkingNumber","defaultTargetLinkingNumber","linkingNumbers","fieldsGetAllSubfield8LinkingNumbers","fieldsToNormalizedString","strings","sort","getFirstField","record","fieldsAsStrings","findIndex","isRelevantSubfield6Chain","non880","every","fieldHasSubfield","fieldIsFirstFieldInChain","chain","firstField","getAllLinkedSubfield6Fields","get6s","moreFields","add8s","isFirstLinkedSubfield6Field","fieldsToString","recordGetSubfield6ChainHeads","recordGetMaxSubfield6OccurrenceNumberAsInteger","candidateFields","sixes","relevantFields","o","resetSubfield6Tag"],"sources":["../src/subfield6Utils.js"],"sourcesContent":["import createDebugLogger from 'debug';\n// const debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/subfield6Utils');\n\nimport {add8s, fieldsGetAllSubfield8LinkingNumbers, getSubfield8LinkingNumber, isValidSubfield8} from './subfield8Utils';\nimport {fieldHasSubfield, fieldToString, fieldsToString, nvdebug, subfieldToString} from './utils';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:subfield6Utils');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n// NB! Subfield 6 is non-repeatable and it should always comes first!\n// NB! Index size should always be 2 (preceding 0 required for 01..09) However, support for 100+ was added on 2023-02-27.\n// NB! Index value '00' are left as they are (is not paired/indexed/whatever.\nconst sf6Regexp = /^[0-9][0-9][0-9]-(?:[0-9][0-9]|[1-9][0-9]+)(?:[^0-9].*)?$/u;\n\nexport function isValidSubfield6(subfield) {\n if (subfield.code !== '6') {\n return false;\n }\n return subfield.value.match(sf6Regexp);\n}\n\nexport function subfield6GetTag(subfield) {\n if (isValidSubfield6(subfield)) {\n return subfield.value.substring(0, 3);\n }\n return undefined;\n}\n\nexport function subfield6GetOccurrenceNumber(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.substring(4).replace(/\\D.*$/u, '');\n }\n return undefined;\n}\n\nexport function subfield6GetOccurrenceNumberAsInteger(subfield) {\n const index = subfield6GetOccurrenceNumber(subfield);\n if (index === undefined || index === '00') {\n return 0;\n }\n const result = parseInt(index, 10);\n //nvdebug(`SF6: ${subfield.value} => ${index} => ${result}`, debug);\n return result;\n}\n\nexport function subfield6ResetOccurrenceNumber(subfield, occurrenceNumber) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n const occurrenceNumberAsString = typeof occurrenceNumber === 'number' ? intToOccurrenceNumberString(occurrenceNumber) : occurrenceNumber;\n\n const newValue = subfield.value.substring(0, 4) + occurrenceNumberAsString + subfield6GetTail(subfield);\n //nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`);\n subfield.value = newValue;\n}\n\n\nfunction subfield6GetTail(subfield) {\n if (isValidSubfield6(subfield)) {\n // Skip \"TAG-\" prefix. 2023-02-20: removed 2-digit requirement from here...\n return subfield.value.replace(/^\\d+-\\d+/u, '');\n }\n return '';\n}\n\nexport function subfield6HasWantedTagAndOccurrenceNumber(subfield, tagAndOccurrenceNumber) {\n if (subfield.code !== '6') {\n return false;\n }\n // We could also use generic code and go getTag()+'-'+getIndex() instead of regexp...\n const key = subfield.value.replace(/^([0-9][0-9][0-9]-[0-9][0-9]+).*$/u, '$1');\n nvdebug(` Compare '${key}' vs '${tagAndOccurrenceNumber}'`);\n return key === tagAndOccurrenceNumber;\n}\n\n// <= SUBFIELD, FIELD =>\n\nexport function fieldGetUnambiguousTag(field) {\n const tags = field.subfields.filter(sf => subfield6GetTag(sf));\n if (tags.length === 1) {\n return subfield6GetTag(tags[0]);\n }\n return undefined;\n}\n\nexport function fieldGetUnambiguousOccurrenceNumber(field) {\n const occurrenceNumbers = field.subfields.filter(sf => subfield6GetOccurrenceNumber(sf));\n if (occurrenceNumbers.length === 1) {\n return subfield6GetOccurrenceNumber(occurrenceNumbers[0]);\n }\n return undefined;\n}\n\nexport function fieldHasOccurrenceNumber(field, occurrenceNumber) {\n //nvdebug(`${occurrenceNumber} vs ${fieldToString(field)}`);\n return field.subfields && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber);\n}\n\nexport function fieldResetOccurrenceNumber(field, newOccurrenceNumber, oldOccurrenceNumber = undefined) {\n field.subfields.forEach(subfield => innerReset(subfield)); // eslint-disable-line array-callback-return\n\n function innerReset(subfield) {\n // (Optional) Check that this is really the occurrence number we wan't to reseot\n if (oldOccurrenceNumber !== undefined) {\n const currOccurrenceNumber = subfield6GetOccurrenceNumber(subfield);\n if (currOccurrenceNumber !== oldOccurrenceNumber) {\n return;\n }\n }\n subfield6ResetOccurrenceNumber(subfield, newOccurrenceNumber);\n }\n}\n\nexport function intToOccurrenceNumberString(i) {\n return i < 10 ? `0${i}` : `${i}`;\n}\n\nexport function fieldGetMaxSubfield6OccurrenceNumberAsInteger(field) {\n // used by reducer!\n //nvdebug(`Checking subfields $6 from ${JSON.stringify(field)}`);\n const sf6s = field.subfields ? field.subfields.filter(subfield => isValidSubfield6(subfield)) : [];\n if (sf6s.length === 0) {\n return 0;\n }\n // There should always be one, but here we check every subfield.\n //nvdebug(`Got ${field.subfields} $6-subfield(s) from ${JSON.stringify(field)}`, debug);\n const vals = sf6s.map(sf => subfield6GetOccurrenceNumberAsInteger(sf));\n return Math.max(...vals);\n}\n\nexport function fieldHasWantedTagAndOccurrenceNumber(field, tagAndOccurrenceNumber) {\n return field.subfields && field.subfields.some(sf => subfield6HasWantedTagAndOccurrenceNumber(sf, tagAndOccurrenceNumber));\n}\n\n\n/*\nexport function getFieldsWithGivenOccurrenceNumberSubfield6(record, occurrenceNumberAsString) {\n const record.fields.filter(field => field\n\n function fieldHasIndex(field, index) {\n if (!field.subfields) {\n return false;\n }\n return field.subfields.find(sf => isValidSubfield6(sf) && subfieldGetOccurrenceNumber6(sf) === index);\n }\n}\n*/\n\n\nexport function fieldHasValidSubfield6(field) {\n return field.subfields && field.subfields.some(sf => isValidSubfield6(sf));\n}\n\nexport function isSubfield6Pair(field, otherField) {\n // No need to log this:\n //nvdebug(`LOOK for $6-pair:\\n ${fieldToString(field)}\\n ${fieldToString(otherField)}`);\n if (!fieldHasValidSubfield6(field) || !fieldHasValidSubfield6(otherField)) {\n return false;\n }\n\n if (!tagsArePairable6(field.tag, otherField.tag)) {\n //nvdebug(` FAILED. REASON: TAGS NOT PAIRABLE!`);\n return false;\n }\n\n\n const fieldIndex = fieldGetUnambiguousOccurrenceNumber(field);\n if (fieldIndex === undefined || fieldIndex === '00') {\n //nvdebug(` FAILED. REASON: NO INDEX FOUND`);\n return false;\n }\n\n const otherFieldIndex = fieldGetUnambiguousOccurrenceNumber(otherField);\n\n\n if (fieldIndex !== otherFieldIndex) {\n //nvdebug(` FAILURE: INDEXES: ${fieldIndex} vs ${otherFieldIndex}`);\n return false;\n }\n\n if (fieldGetUnambiguousTag(field) !== otherField.tag || field.tag !== fieldGetUnambiguousTag(otherField)) {\n //nvdebug(` FAILURE: TAG vs $6 TAG`);\n return false;\n }\n return true;\n\n function tagsArePairable6(tag1, tag2) {\n // How to do XOR operation in one line? Well, this is probably more readable...\n if (tag1 === '880' && tag2 === '880') {\n return false;\n }\n if (tag1 !== '880' && tag2 !== '880') {\n return false;\n }\n return true;\n }\n}\n\n\nfunction subfieldSevenToOneOccurrenceNumber(subfield) {\n if (subfield.code !== '6' || subfield.value.substring(0, 1) !== '7') {\n return;\n }\n subfield.value = `1${subfield.value.substring(1)}`;\n}\n\nexport function fieldSevenToOneOccurrenceNumber(field) {\n if (field.tag !== '880') {\n return;\n }\n field.subfields.forEach(sf => subfieldSevenToOneOccurrenceNumber(sf)); // eslint-disable-line array-callback-return\n}\n\n\nexport function fieldGetOccurrenceNumberPairs(field, candFields) {\n // NB! TAG!=880 returns 880 fields, TAG==880 returns non-880 field\n //nvdebug(` Trying to finds pair for ${fieldToString(field)} in ${candFields.length} fields`);\n const pairs = candFields.filter(otherField => isSubfield6Pair(field, otherField));\n if (pairs.length === 0) {\n nvdebug(`NO PAIRS FOUND FOR '${fieldToString(field)}'`);\n return pairs;\n }\n nvdebug(`${pairs.length} PAIR(S) FOUND FOR '${fieldToString(field)}'`);\n pairs.forEach(pairedField => nvdebug(` '${fieldToString(pairedField)}'`)); // eslint-disable-line array-callback-return\n return pairs;\n}\n\nexport function fieldGetOccurrenceNumbers(field) {\n /* eslint-disable */\n let occurrenceNumbers = [];\n field.subfields?.forEach(sf => subfieldExtractOccurrenceNumber(sf));\n\n function subfieldExtractOccurrenceNumber(sf) {\n if (!isValidSubfield6(sf)) {\n return;\n }\n const occurrenceNumber = subfield6GetOccurrenceNumber(sf);\n if (occurrenceNumber === '00' || occurrenceNumbers.includes(occurrenceNumber)) {\n return;\n }\n occurrenceNumbers.push(occurrenceNumber);\n }\n /* eslint-enable */\n return occurrenceNumbers;\n}\n\nexport function fieldsGetOccurrenceNumbers(fields) {\n /* eslint-disable */\n let occurrenceNumbers = [];\n\n fields.forEach(f => fieldProcessOccurrenceNumbers(f));\n\n function fieldProcessOccurrenceNumbers(f) {\n const newOccurrenceNumbers = fieldGetOccurrenceNumbers(f);\n newOccurrenceNumbers.forEach(occurrenceNumber => {\n if (!occurrenceNumbers.includes(occurrenceNumber)) {\n occurrenceNumbers.push(occurrenceNumber);\n }\n\n });\n }\n /* eslint-enable */\n return occurrenceNumbers;\n}\n\n/*\nexport function fieldGetSubfield6Pair(field, record) {\n const pairedFields = record.fields.filter(otherField => isSubfield6Pair(field, otherField));\n if (pairedFields.length !== 1) {\n return undefined;\n }\n // NB! It is theoretically possible to have multiple pairable 880 fields (one for each encoding)\n nvdebug(`fieldGetSubfield6Pair(): ${fieldToString(field)} => ${fieldToString(pairedFields[0])}`);\n return pairedFields[0];\n}\n*/\n\n/*\nexport function pairAndStringify6(field, record) {\n const pair6 = fieldGetSubfield6Pair(field, record);\n if (!pair6) {\n return fieldToNormalizedString(field);\n }\n return fieldsToNormalizedString([field, pair6]);\n}\n*/\n\n// Frequencly list for $6 subfields in 1XX/7XX fields:\n// 231115 100\n// 183832 700\n// 28773 710\n// 2047 711\n// 661 110\n// 341 111\n// 284 130\n// 63 730\n// Thus there's a real risk of ending up with, say, identical 100 vs 700 chains.\n// Semi-hackily support 1XX/7XX-version: 7XX can be deleted if corresponding 1XX exists:\n\nexport function is7XX(tag) {\n return ['700', '710', '711', '730'].includes(tag);\n}\n\n\nfunction normalizeEntryTag(tag) {\n if (tag.match(/^[17](?:00|10|11|30)$/u)) {\n return `X${tag.substring(1)}`;\n }\n return tag;\n}\n\nfunction subfieldToNormalizedString(sf, tag, targetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTagBoolean = false) {\n // targetLinkingNumber refers to $8.\n // normalizeEntryTagBoolean refers to 1XX/7XX tag values in subfield $6 value.\n if (isValidSubfield6(sf)) { // && targetLinkingNumber === 0) {\n // 1XX/7XX (entry tag) normalization:\n const tag2 = normalizeEntryTagBoolean ? normalizeEntryTag(tag) : tag;\n\n const occurrenceNumber = normalizeOccurrenceNumber ? 'XX' : subfield6GetOccurrenceNumber(sf);\n // If we are normalizing a $8 chain, don't normalize $6 occurrence number!\n // Replace $6 occurrence number with XX:\n return ` ‡${sf.code} ${tag2}-${occurrenceNumber}${subfield6GetTail(sf)}`;\n }\n\n if (isValidSubfield8(sf)) {\n const currLinkingNumber = getSubfield8LinkingNumber(sf); //getSubfield8Index(sf);\n if (targetLinkingNumber > 0 && currLinkingNumber === targetLinkingNumber) {\n // For $8 we should only XX the index we are looking at...\n const normVal = sf.value.replace(/^[0-9]+/u, 'XX');\n return ` ‡${sf.code} ${normVal}`;\n }\n return ''; // Other $8 subfields are meaningless in this context\n }\n return ` ${subfieldToString(sf)}`; // `‡${sf.code} ${sf.value}`;\n}\n\nexport function fieldToNormalizedString(field, targetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTagBoolean = false) {\n if ('subfields' in field) {\n const tag2 = normalizeEntryTagBoolean ? normalizeEntryTag(field.tag) : field.tag;\n return `${tag2} ${field.ind1}${field.ind2}${formatAndNormalizeSubfields(field)}`;\n }\n return `${field.tag} ${field.value}`;\n\n function formatAndNormalizeSubfields(field) {\n return field.subfields.map(sf => subfieldToNormalizedString(sf, field.tag, targetLinkingNumber, normalizeOccurrenceNumber, normalizeEntryTagBoolean)).join('');\n }\n\n}\n\n\nfunction guessTargetLinkingNumber(fields, defaultTargetLinkingNumber) {\n if (defaultTargetLinkingNumber !== 0) {\n return defaultTargetLinkingNumber;\n }\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fields);\n return linkingNumbers.length === 1 ? linkingNumbers[0] : 0;\n}\n\nexport function fieldsToNormalizedString(fields, defaultTargetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTag = false) {\n const targetLinkingNumber = guessTargetLinkingNumber(fields, defaultTargetLinkingNumber);\n\n nvdebug(`fieldsToNormalizedString: OCC: ${normalizeOccurrenceNumber}`);\n const strings = fields.map(field => fieldToNormalizedString(field, targetLinkingNumber, normalizeOccurrenceNumber, normalizeEntryTag));\n strings.sort();\n return strings.join('\\t__SEPARATOR__\\t');\n}\n\n\n/*\n\nexport function removeField6IfNeeded(field, record, fieldsAsString) {\n const pairField = fieldGetSubfield6Pair(field, record);\n const asString = pairField ? fieldsToNormalizedString([field, pairField]) : fieldToNormalizedString(field);\n nvdebug(`SOURCE: ${asString} -- REALITY: ${fieldToString(field)}`);\n const tmp = pairField ? fieldToString(pairField) : 'HUTI';\n nvdebug(`PAIR: ${tmp}`);\n nvdebug(`BASE:\\n ${fieldsAsString.join('\\n ')}`);\n if (!fieldsAsString.includes(asString)) {\n return;\n }\n nvdebug(`Duplicate $6 removal: ${fieldToString(field)}`);\n record.removeField(field);\n\n if (pairField === undefined) {\n return;\n }\n nvdebug(`Duplicate $6 removal (pair): ${fieldToString(pairField)}`);\n record.removeField(pairField);\n}\n*/\n\nfunction getFirstField(record, fields) {\n const fieldsAsStrings = fields.map(field => fieldToString(field));\n //record.fields.forEach((field, i) => nvdebug(`${i}:\\t${fieldToString(field)}`));\n //nvdebug(`getFirstField: ${fieldsAsStrings.join('\\t')}`);\n const i = record.fields.findIndex(field => fieldsAsStrings.includes(fieldToString(field)));\n if (i > -1) {\n const field = record.fields[i];\n //nvdebug(`1st F: ${i + 1}/${record.fields.length} ${fieldToString(field)}`);\n return field;\n }\n return undefined;\n}\n\nfunction isRelevantSubfield6Chain(fields) {\n if (fields.length < 2) { // 1 non-880-field and 1+ 880 fields\n return false;\n }\n const non880 = fields.filter(f => f.tag !== '880');\n if (non880.length !== 1) {\n return false;\n }\n\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fields);\n if (linkingNumbers.length !== 0) {\n return false;\n }\n\n return fields.every(f => fieldHasSubfield(f, '6'));\n}\n\nexport function fieldIsFirstFieldInChain(field, chain, record) {\n // Interpretation of first: position of field in record (however, we might have a duplicate field. See tests...)\n const firstField = getFirstField(record, chain);\n if (firstField) {\n return fieldToString(field) === fieldToString(firstField);\n }\n return false;\n\n}\n\n\nexport function getAllLinkedSubfield6Fields(field, record) {\n const fields = get6s(field, record);\n const moreFields = add8s(fields, record);\n\n // Currently we don't handle fields with more than one $6 and/or $8 subfield.\n if (moreFields.length > fields.length) {\n return []; // Don't fix!\n }\n return moreFields;\n}\n\nexport function isFirstLinkedSubfield6Field(field, record) {\n if (!field.subfields) { // Is not a datafield\n return false;\n }\n const chain = getAllLinkedSubfield6Fields(field, record);\n if (!isRelevantSubfield6Chain(chain)) {\n nvdebug(`Rejected 6: ${fieldsToString(chain)}`);\n return false;\n }\n\n return fieldIsFirstFieldInChain(field, chain, record);\n}\n\nexport function recordGetSubfield6ChainHeads(record) {\n return record.fields.filter(field => isFirstLinkedSubfield6Field(field, record));\n}\n\nexport function recordGetMaxSubfield6OccurrenceNumberAsInteger(record) {\n if (record.fields.length === 0) {\n return 0;\n }\n // Should we cache the value here?\n const vals = record.fields.map((field) => fieldGetMaxSubfield6OccurrenceNumberAsInteger(field));\n return Math.max(...vals);\n}\n\nexport function get6s(field, candidateFields) { // NB! Convert field to fields!!!\n // Get all fields with given occurrence number\n const sixes = field.subfields.filter(sf => isValidSubfield6(sf));\n\n if (sixes.length === 0) {\n return [field];\n }\n nvdebug(`SIXES: ${sixes.length}`);\n const occurrenceNumbers = sixes.map(sf => subfield6GetOccurrenceNumber(sf)).filter(value => value !== undefined && value !== '00');\n nvdebug(occurrenceNumbers.join(' -- '));\n\n const relevantFields = candidateFields.filter(f => occurrenceNumbers.some(o => fieldHasOccurrenceNumber(f, o)));\n nvdebug(`${fieldToString(field)}: $6-RELFIELDS FOUND: ${relevantFields.length}...`);\n relevantFields.forEach(f => nvdebug(fieldToString(f))); // eslint-disable-line array-callback-return\n return relevantFields;\n}\n\nexport function resetSubfield6Tag(subfield, tag) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n // NB! mainly for 1XX<->7XX transfers\n const newValue = `${tag}-${subfield.value.substring(4)}`;\n nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`, debugDev);\n subfield.value = newValue;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -16,8 +16,7 @@ var _utils = require("./utils");
16
16
  // import createDebugLogger from 'debug';
17
17
  // const debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/subfield8Utils');
18
18
 
19
- const sf8Regexp = /^([1-9][0-9]*)(?:\.[0-9]+)?(?:\\[acprux])?$/u; // eslint-disable-line prefer-named-capture-group
20
-
19
+ const sf8Regexp = /^([1-9][0-9]*)(?:\.[0-9]+)?(?:\\[acprux])?$/u;
21
20
  function isValidSubfield8(subfield) {
22
21
  if (subfield.code !== '8') {
23
22
  return false;
@@ -54,7 +53,6 @@ function recordGetFieldsWithSubfield8LinkingNumber(record, linkingNumber) {
54
53
  return record.fields.filter(field => fieldHasLinkingNumber(field, linkingNumber));
55
54
  }
56
55
  function fieldsGetAllSubfield8LinkingNumbers(fields) {
57
- /* eslint-disable */
58
56
  let subfield8LinkingNumbers = [];
59
57
  fields.forEach(field => {
60
58
  if (!field.subfields) {
@@ -69,7 +67,6 @@ function fieldsGetAllSubfield8LinkingNumbers(fields) {
69
67
  });
70
68
  });
71
69
  return subfield8LinkingNumbers;
72
- /* eslint-enable */
73
70
  }
74
71
  function recordGetAllSubfield8LinkingNumbers(record) {
75
72
  return fieldsGetAllSubfield8LinkingNumbers(record.fields);
@@ -80,16 +77,18 @@ function add8s(fields, record) {
80
77
  return fields;
81
78
  }
82
79
  (0, _utils.nvdebug)(`Linking number(s): ${linkingNumbers.join(', ')}`);
83
- linkingNumbers.forEach(number => collectLinkingNumberFields(number));
84
- fields.forEach(f => (0, _utils.nvdebug)(`AFTER ADDING 8s: '${(0, _utils.fieldToString)(f)}'`));
80
+ linkingNumbers.forEach(number => collectLinkingNumberFields(number)); // eslint-disable-line array-callback-return
81
+
82
+ fields.forEach(f => (0, _utils.nvdebug)(`AFTER ADDING 8s: '${(0, _utils.fieldToString)(f)}'`)); // eslint-disable-line array-callback-return
83
+
85
84
  return fields;
86
85
  function collectLinkingNumberFields(linkingNumber) {
87
86
  // Remove existing hits (to avoid field repetition):
88
- fields = fields.filter(f => !fieldHasLinkingNumber(f, linkingNumber)); // eslint-disable-line functional/immutable-data, no-param-reassign
87
+ fields = fields.filter(f => !fieldHasLinkingNumber(f, linkingNumber));
89
88
  // Add them and their "sisters" back:
90
89
  const addableFields = record.fields.filter(f => fieldHasLinkingNumber(f, linkingNumber));
91
- addableFields.forEach(f => (0, _utils.nvdebug)(`(RE-?)ADD ${(0, _utils.fieldToString)(f)}`));
92
- fields = fields.concat(addableFields); // eslint-disable-line functional/immutable-data, no-param-reassign
90
+ addableFields.forEach(f => (0, _utils.nvdebug)(`(RE-?)ADD ${(0, _utils.fieldToString)(f)}`)); // eslint-disable-line array-callback-return
91
+ fields = fields.concat(addableFields);
93
92
  }
94
93
  }
95
94
  function fieldHasValidSubfield8(field) {