@natlibfi/marc-record-validators-melinda 11.6.7 → 12.0.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. package/.github/workflows/melinda-node-tests.yml +1 -1
  2. package/dist/access-rights.js +63 -91
  3. package/dist/access-rights.js.map +7 -1
  4. package/dist/access-rights.test.js +137 -0
  5. package/dist/access-rights.test.js.map +7 -0
  6. package/dist/addMissingField041.js +21 -53
  7. package/dist/addMissingField041.js.map +7 -1
  8. package/dist/addMissingField041.test.js +39 -0
  9. package/dist/addMissingField041.test.js.map +7 -0
  10. package/dist/addMissingField336.js +99 -191
  11. package/dist/addMissingField336.js.map +7 -1
  12. package/dist/addMissingField336.test.js +39 -0
  13. package/dist/addMissingField336.test.js.map +7 -0
  14. package/dist/addMissingField337.js +63 -132
  15. package/dist/addMissingField337.js.map +7 -1
  16. package/dist/addMissingField337.test.js +39 -0
  17. package/dist/addMissingField337.test.js.map +7 -0
  18. package/dist/addMissingField338.js +147 -253
  19. package/dist/addMissingField338.js.map +7 -1
  20. package/dist/addMissingField338.test.js +39 -0
  21. package/dist/addMissingField338.test.js.map +7 -0
  22. package/dist/cyrillux-usemarcon-replacement.js +119 -272
  23. package/dist/cyrillux-usemarcon-replacement.js.map +7 -1
  24. package/dist/cyrillux-usemarcon-replacement.test.js +46 -0
  25. package/dist/cyrillux-usemarcon-replacement.test.js.map +7 -0
  26. package/dist/cyrillux.js +119 -223
  27. package/dist/cyrillux.js.map +7 -1
  28. package/dist/cyrillux.test.js +39 -0
  29. package/dist/cyrillux.test.js.map +7 -0
  30. package/dist/disambiguateSeriesStatements.js +40 -81
  31. package/dist/disambiguateSeriesStatements.js.map +7 -1
  32. package/dist/disambiguateSeriesStatements.test.js +44 -0
  33. package/dist/disambiguateSeriesStatements.test.js.map +7 -0
  34. package/dist/double-commas.js +7 -14
  35. package/dist/double-commas.js.map +7 -1
  36. package/dist/double-commas.test.js +48 -0
  37. package/dist/double-commas.test.js.map +7 -0
  38. package/dist/duplicates-ind1.js +10 -31
  39. package/dist/duplicates-ind1.js.map +7 -1
  40. package/dist/duplicates-ind1.test.js +40 -0
  41. package/dist/duplicates-ind1.test.js.map +7 -0
  42. package/dist/empty-fields.js +10 -22
  43. package/dist/empty-fields.js.map +7 -1
  44. package/dist/empty-fields.test.js +129 -0
  45. package/dist/empty-fields.test.js.map +7 -0
  46. package/dist/ending-punctuation-conf.js +871 -769
  47. package/dist/ending-punctuation-conf.js.map +7 -1
  48. package/dist/ending-punctuation.js +84 -167
  49. package/dist/ending-punctuation.js.map +7 -1
  50. package/dist/ending-punctuation.test.js +2290 -0
  51. package/dist/ending-punctuation.test.js.map +7 -0
  52. package/dist/ending-whitespace.js +10 -35
  53. package/dist/ending-whitespace.js.map +7 -1
  54. package/dist/ending-whitespace.test.js +38 -0
  55. package/dist/ending-whitespace.test.js.map +7 -0
  56. package/dist/field-008-18-34-character-groups.js +40 -125
  57. package/dist/field-008-18-34-character-groups.js.map +7 -1
  58. package/dist/field-008-18-34-character-groups.test.js +45 -0
  59. package/dist/field-008-18-34-character-groups.test.js.map +7 -0
  60. package/dist/field-505-separators.js +19 -39
  61. package/dist/field-505-separators.js.map +7 -1
  62. package/dist/field-505-separators.test.js +45 -0
  63. package/dist/field-505-separators.test.js.map +7 -0
  64. package/dist/field-521-fix.js +19 -47
  65. package/dist/field-521-fix.js.map +7 -1
  66. package/dist/field-521-fix.test.js +44 -0
  67. package/dist/field-521-fix.test.js.map +7 -0
  68. package/dist/field-exclusion.js +37 -91
  69. package/dist/field-exclusion.js.map +7 -1
  70. package/dist/field-exclusion.test.js +821 -0
  71. package/dist/field-exclusion.test.js.map +7 -0
  72. package/dist/field-structure.js +52 -104
  73. package/dist/field-structure.js.map +7 -1
  74. package/dist/field-structure.test.js +587 -0
  75. package/dist/field-structure.test.js.map +7 -0
  76. package/dist/field33XUtils.js +119 -503
  77. package/dist/field33XUtils.js.map +7 -1
  78. package/dist/fields-present.js +11 -23
  79. package/dist/fields-present.js.map +7 -1
  80. package/dist/fields-present.test.js +95 -0
  81. package/dist/fields-present.test.js.map +7 -0
  82. package/dist/fix-33X.js +393 -431
  83. package/dist/fix-33X.js.map +7 -1
  84. package/dist/fix-33X.test.js +39 -0
  85. package/dist/fix-33X.test.js.map +7 -0
  86. package/dist/fix-country-codes.js +20 -50
  87. package/dist/fix-country-codes.js.map +7 -1
  88. package/dist/fix-country-codes.test.js +44 -0
  89. package/dist/fix-country-codes.test.js.map +7 -0
  90. package/dist/fix-language-codes.js +23 -53
  91. package/dist/fix-language-codes.js.map +7 -1
  92. package/dist/fix-language-codes.test.js +38 -0
  93. package/dist/fix-language-codes.test.js.map +7 -0
  94. package/dist/fixRelatorTerms.js +82 -209
  95. package/dist/fixRelatorTerms.js.map +7 -1
  96. package/dist/fixRelatorTerms.test.js +44 -0
  97. package/dist/fixRelatorTerms.test.js.map +7 -0
  98. package/dist/fixed-fields.js +21 -30
  99. package/dist/fixed-fields.js.map +7 -1
  100. package/dist/fixed-fields.test.js +87 -0
  101. package/dist/fixed-fields.test.js.map +7 -0
  102. package/dist/identical-fields.js +8 -24
  103. package/dist/identical-fields.js.map +7 -1
  104. package/dist/identical-fields.test.js +119 -0
  105. package/dist/identical-fields.test.js.map +7 -0
  106. package/dist/index.js +119 -413
  107. package/dist/index.js.map +7 -1
  108. package/dist/indicator-fixes.js +57 -95
  109. package/dist/indicator-fixes.js.map +7 -1
  110. package/dist/indicator-fixes.test.js +42 -0
  111. package/dist/indicator-fixes.test.js.map +7 -0
  112. package/dist/isbn-issn.js +66 -126
  113. package/dist/isbn-issn.js.map +7 -1
  114. package/dist/isbn-issn.test.js +398 -0
  115. package/dist/isbn-issn.test.js.map +7 -0
  116. package/dist/item-language.js +32 -65
  117. package/dist/item-language.js.map +7 -1
  118. package/dist/item-language.test.js +322 -0
  119. package/dist/item-language.test.js.map +7 -0
  120. package/dist/melindaCustomMergeFields.js +5182 -11233
  121. package/dist/melindaCustomMergeFields.js.map +7 -1
  122. package/dist/merge-fields/controlSubfields.js +75 -142
  123. package/dist/merge-fields/controlSubfields.js.map +7 -1
  124. package/dist/merge-fields/counterpartField.js +182 -379
  125. package/dist/merge-fields/counterpartField.js.map +7 -1
  126. package/dist/merge-fields/index.js +15 -49
  127. package/dist/merge-fields/index.js.map +7 -1
  128. package/dist/merge-fields/mergableIndicator.js +18 -51
  129. package/dist/merge-fields/mergableIndicator.js.map +7 -1
  130. package/dist/merge-fields/mergableTag.js +78 -30
  131. package/dist/merge-fields/mergableTag.js.map +7 -1
  132. package/dist/merge-fields/mergeConfig.js +66 -171
  133. package/dist/merge-fields/mergeConfig.js.map +7 -1
  134. package/dist/merge-fields/mergeConstraints.js +323 -1214
  135. package/dist/merge-fields/mergeConstraints.js.map +7 -1
  136. package/dist/merge-fields/mergeField.js +47 -111
  137. package/dist/merge-fields/mergeField.js.map +7 -1
  138. package/dist/merge-fields/mergeIndicator.js +64 -118
  139. package/dist/merge-fields/mergeIndicator.js.map +7 -1
  140. package/dist/merge-fields/mergeOrAddPostprocess.js +14 -38
  141. package/dist/merge-fields/mergeOrAddPostprocess.js.map +7 -1
  142. package/dist/merge-fields/mergeOrAddSubfield.js +62 -104
  143. package/dist/merge-fields/mergeOrAddSubfield.js.map +7 -1
  144. package/dist/merge-fields/mergeSubfield.js +47 -95
  145. package/dist/merge-fields/mergeSubfield.js.map +7 -1
  146. package/dist/merge-fields/removeDuplicateSubfields.js +18 -31
  147. package/dist/merge-fields/removeDuplicateSubfields.js.map +7 -1
  148. package/dist/merge-fields/worldKnowledge.js +15 -40
  149. package/dist/merge-fields/worldKnowledge.js.map +7 -1
  150. package/dist/merge-fields.test.js +44 -0
  151. package/dist/merge-fields.test.js.map +7 -0
  152. package/dist/mergeField500Lisapainokset.js +28 -57
  153. package/dist/mergeField500Lisapainokset.js.map +7 -1
  154. package/dist/mergeField500Lisapainokset.test.js +44 -0
  155. package/dist/mergeField500Lisapainokset.test.js.map +7 -0
  156. package/dist/mergeRelatorTermFields.js +33 -69
  157. package/dist/mergeRelatorTermFields.js.map +7 -1
  158. package/dist/mergeRelatorTermFields.test.js +44 -0
  159. package/dist/mergeRelatorTermFields.test.js.map +7 -0
  160. package/dist/modernize-502.js +23 -55
  161. package/dist/modernize-502.js.map +7 -1
  162. package/dist/modernize-502.test.js +38 -0
  163. package/dist/modernize-502.test.js.map +7 -0
  164. package/dist/multiple-subfield-0.js +23 -48
  165. package/dist/multiple-subfield-0.js.map +7 -1
  166. package/dist/multiple-subfield-0.test.js +44 -0
  167. package/dist/multiple-subfield-0.test.js.map +7 -0
  168. package/dist/non-breaking-space.js +11 -32
  169. package/dist/non-breaking-space.js.map +7 -1
  170. package/dist/non-breaking-space.test.js +38 -0
  171. package/dist/non-breaking-space.test.js.map +7 -0
  172. package/dist/normalize-dashes.js +18 -37
  173. package/dist/normalize-dashes.js.map +7 -1
  174. package/dist/normalize-dashes.test.js +44 -0
  175. package/dist/normalize-dashes.test.js.map +7 -0
  176. package/dist/normalize-identifiers.js +54 -140
  177. package/dist/normalize-identifiers.js.map +7 -1
  178. package/dist/normalize-identifiers.test.js +44 -0
  179. package/dist/normalize-identifiers.test.js.map +7 -0
  180. package/dist/normalize-qualifying-information.js +23 -48
  181. package/dist/normalize-qualifying-information.js.map +7 -1
  182. package/dist/normalize-qualifying-information.test.js +44 -0
  183. package/dist/normalize-qualifying-information.test.js.map +7 -0
  184. package/dist/normalize-utf8-diacritics.js +19 -105
  185. package/dist/normalize-utf8-diacritics.js.map +7 -1
  186. package/dist/normalize-utf8-diacritics.test.js +44 -0
  187. package/dist/normalize-utf8-diacritics.test.js.map +7 -0
  188. package/dist/normalizeFieldForComparison.js +67 -158
  189. package/dist/normalizeFieldForComparison.js.map +7 -1
  190. package/dist/normalizeSubfieldValueForComparison.js +37 -77
  191. package/dist/normalizeSubfieldValueForComparison.js.map +7 -1
  192. package/dist/prepublicationUtils.js +58 -111
  193. package/dist/prepublicationUtils.js.map +7 -1
  194. package/dist/punctuation/index.js +56 -72
  195. package/dist/punctuation/index.js.map +7 -1
  196. package/dist/punctuation/rules/aut.js +372 -331
  197. package/dist/punctuation/rules/aut.js.map +7 -1
  198. package/dist/punctuation/rules/bib.js +420 -373
  199. package/dist/punctuation/rules/bib.js.map +7 -1
  200. package/dist/punctuation/rules/index.js +7 -21
  201. package/dist/punctuation/rules/index.js.map +7 -1
  202. package/dist/punctuation.test.js +44 -0
  203. package/dist/punctuation.test.js.map +7 -0
  204. package/dist/punctuation2.js +251 -800
  205. package/dist/punctuation2.js.map +7 -1
  206. package/dist/punctuation2.test.js +44 -0
  207. package/dist/punctuation2.test.js.map +7 -0
  208. package/dist/reindexSubfield6OccurenceNumbers.js +61 -96
  209. package/dist/reindexSubfield6OccurenceNumbers.js.map +7 -1
  210. package/dist/reindexSubfield6OccurenceNumbers.test.js +44 -0
  211. package/dist/reindexSubfield6OccurenceNumbers.test.js.map +7 -0
  212. package/dist/removeDuplicateDataFields.js +102 -202
  213. package/dist/removeDuplicateDataFields.js.map +7 -1
  214. package/dist/removeDuplicateDataFields.test.js +44 -0
  215. package/dist/removeDuplicateDataFields.test.js.map +7 -0
  216. package/dist/removeInferiorDataFields.js +103 -227
  217. package/dist/removeInferiorDataFields.js.map +7 -1
  218. package/dist/removeInferiorDataFields.test.js +44 -0
  219. package/dist/removeInferiorDataFields.test.js.map +7 -0
  220. package/dist/resolvable-ext-references-melinda.js +25 -60
  221. package/dist/resolvable-ext-references-melinda.js.map +7 -1
  222. package/dist/resolvable-ext-references-melinda.test.js +160 -0
  223. package/dist/resolvable-ext-references-melinda.test.js.map +7 -0
  224. package/dist/resolveOrphanedSubfield6s.js +33 -64
  225. package/dist/resolveOrphanedSubfield6s.js.map +7 -1
  226. package/dist/resolveOrphanedSubfield6s.test.js +44 -0
  227. package/dist/resolveOrphanedSubfield6s.test.js.map +7 -0
  228. package/dist/sanitize-vocabulary-source-codes.js +27 -55
  229. package/dist/sanitize-vocabulary-source-codes.js.map +7 -1
  230. package/dist/sanitize-vocabulary-source-codes.test.js +45 -0
  231. package/dist/sanitize-vocabulary-source-codes.test.js.map +7 -0
  232. package/dist/sort-tags.js +13 -25
  233. package/dist/sort-tags.js.map +7 -1
  234. package/dist/sort-tags.test.js +261 -0
  235. package/dist/sort-tags.test.js.map +7 -0
  236. package/dist/sortFields.js +152 -222
  237. package/dist/sortFields.js.map +7 -1
  238. package/dist/sortFields.test.js +44 -0
  239. package/dist/sortFields.test.js.map +7 -0
  240. package/dist/sortRelatorTerms.js +30 -68
  241. package/dist/sortRelatorTerms.js.map +7 -1
  242. package/dist/sortRelatorTerms.test.js +44 -0
  243. package/dist/sortRelatorTerms.test.js.map +7 -0
  244. package/dist/sortSubfields.js +102 -255
  245. package/dist/sortSubfields.js.map +7 -1
  246. package/dist/sortSubfields.test.js +44 -0
  247. package/dist/sortSubfields.test.js.map +7 -0
  248. package/dist/stripPunctuation.js +13 -36
  249. package/dist/stripPunctuation.js.map +7 -1
  250. package/dist/stripPunctuation.test.js +44 -0
  251. package/dist/stripPunctuation.test.js.map +7 -0
  252. package/dist/subfield-exclusion.js +28 -75
  253. package/dist/subfield-exclusion.js.map +7 -1
  254. package/dist/subfield-exclusion.test.js +471 -0
  255. package/dist/subfield-exclusion.test.js.map +7 -0
  256. package/dist/subfield6Utils.js +107 -269
  257. package/dist/subfield6Utils.js.map +7 -1
  258. package/dist/subfield8Utils.js +26 -50
  259. package/dist/subfield8Utils.js.map +7 -1
  260. package/dist/subfieldValueNormalizations.js +40 -74
  261. package/dist/subfieldValueNormalizations.js.map +7 -1
  262. package/dist/subfieldValueNormalizations.test.js +45 -0
  263. package/dist/subfieldValueNormalizations.test.js.map +7 -0
  264. package/dist/sync-007-and-300.js +22 -53
  265. package/dist/sync-007-and-300.js.map +7 -1
  266. package/dist/sync-007-and-300.test.js +44 -0
  267. package/dist/sync-007-and-300.test.js.map +7 -0
  268. package/dist/translate-terms.js +67 -155
  269. package/dist/translate-terms.js.map +7 -1
  270. package/dist/translate-terms.test.js +44 -0
  271. package/dist/translate-terms.test.js.map +7 -0
  272. package/dist/typeOfDate-008.js +10 -25
  273. package/dist/typeOfDate-008.js.map +7 -1
  274. package/dist/typeOfDate-008.test.js +40 -0
  275. package/dist/typeOfDate-008.test.js.map +7 -0
  276. package/dist/unicode-decomposition.js +94 -107
  277. package/dist/unicode-decomposition.js.map +7 -1
  278. package/dist/unicode-decomposition.test.js +94 -0
  279. package/dist/unicode-decomposition.test.js.map +7 -0
  280. package/dist/update-field-540.js +30 -75
  281. package/dist/update-field-540.js.map +7 -1
  282. package/dist/update-field-540.test.js +44 -0
  283. package/dist/update-field-540.test.js.map +7 -0
  284. package/dist/urn.js +55 -128
  285. package/dist/urn.js.map +7 -1
  286. package/dist/urn.test.js +44 -0
  287. package/dist/urn.test.js.map +7 -0
  288. package/dist/utils.js +72 -126
  289. package/dist/utils.js.map +7 -1
  290. package/eslint.config.mjs +1 -2
  291. package/package.json +21 -93
  292. package/src/access-rights.js +1 -1
  293. package/src/{access-rights.spec.js → access-rights.test.js} +9 -10
  294. package/src/addMissingField041.js +1 -1
  295. package/src/{addMissingField336.spec.js → addMissingField041.test.js} +13 -14
  296. package/src/addMissingField336.js +3 -3
  297. package/src/{addMissingField041.spec.js → addMissingField336.test.js} +13 -14
  298. package/src/addMissingField337.js +2 -2
  299. package/src/{addMissingField337.spec.js → addMissingField337.test.js} +13 -14
  300. package/src/addMissingField338.js +2 -2
  301. package/src/{addMissingField338.spec.js → addMissingField338.test.js} +13 -14
  302. package/src/cyrillux-usemarcon-replacement.js +18 -18
  303. package/src/cyrillux-usemarcon-replacement.test.js +55 -0
  304. package/src/cyrillux.js +19 -12
  305. package/src/{cyrillux.spec.js → cyrillux.test.js} +13 -14
  306. package/src/disambiguateSeriesStatements.js +2 -2
  307. package/src/{disambiguateSeriesStatements.spec.js → disambiguateSeriesStatements.test.js} +12 -13
  308. package/src/double-commas.js +1 -1
  309. package/src/{double-commas.spec.js → double-commas.test.js} +9 -11
  310. package/src/duplicates-ind1.js +1 -1
  311. package/src/{duplicates-ind1.spec.js → duplicates-ind1.test.js} +12 -13
  312. package/src/{empty-fields.spec.js → empty-fields.test.js} +11 -13
  313. package/src/ending-punctuation.js +1 -1
  314. package/src/{ending-punctuation.spec.js → ending-punctuation.test.js} +172 -173
  315. package/src/{ending-whitespace.spec.js → ending-whitespace.test.js} +12 -13
  316. package/src/field-008-18-34-character-groups.js +2 -2
  317. package/src/{field-008-18-34-character-groups.spec.js → field-008-18-34-character-groups.test.js} +13 -13
  318. package/src/field-505-separators.js +3 -3
  319. package/src/{field-505-separators.spec.js → field-505-separators.test.js} +16 -14
  320. package/src/field-521-fix.js +2 -2
  321. package/src/{field-521-fix.spec.js → field-521-fix.test.js} +12 -13
  322. package/src/field-exclusion.js +1 -1
  323. package/src/{field-exclusion.spec.js → field-exclusion.test.js} +60 -57
  324. package/src/{field-structure.spec.js → field-structure.test.js} +29 -29
  325. package/src/{fields-present.spec.js → fields-present.test.js} +12 -15
  326. package/src/fix-33X.js +4 -4
  327. package/src/{fix-33X.spec.js → fix-33X.test.js} +13 -14
  328. package/src/fix-country-codes.js +1 -1
  329. package/src/{fix-country-codes.spec.js → fix-country-codes.test.js} +12 -13
  330. package/src/fix-language-codes.js +5 -5
  331. package/src/{fix-language-codes.spec.js → fix-language-codes.test.js} +12 -13
  332. package/src/fixRelatorTerms.js +5 -5
  333. package/src/{fixRelatorTerms.spec.js → fixRelatorTerms.test.js} +13 -13
  334. package/src/{fixed-fields.spec.js → fixed-fields.test.js} +11 -14
  335. package/src/identical-fields.js +1 -1
  336. package/src/{identical-fields.spec.js → identical-fields.test.js} +9 -11
  337. package/src/index.js +58 -58
  338. package/src/indicator-fixes.js +3 -3
  339. package/src/{indicator-fixes.spec.js → indicator-fixes.test.js} +9 -12
  340. package/src/isbn-issn.js +1 -1
  341. package/src/{isbn-issn.spec.js → isbn-issn.test.js} +20 -22
  342. package/src/{item-language.spec.js → item-language.test.js} +21 -22
  343. package/src/merge-fields/controlSubfields.js +1 -1
  344. package/src/merge-fields/counterpartField.js +8 -9
  345. package/src/merge-fields/index.js +1 -1
  346. package/src/merge-fields/mergableIndicator.js +1 -1
  347. package/src/merge-fields/mergeField.js +6 -6
  348. package/src/merge-fields/mergeIndicator.js +1 -1
  349. package/src/merge-fields/mergeOrAddPostprocess.js +4 -4
  350. package/src/merge-fields/mergeOrAddSubfield.js +2 -2
  351. package/src/merge-fields/mergeSubfield.js +4 -4
  352. package/src/merge-fields/removeDuplicateSubfields.js +2 -2
  353. package/src/{merge-fields.spec.js → merge-fields.test.js} +12 -13
  354. package/src/{mergeField500Lisapainokset.spec.js → mergeField500Lisapainokset.test.js} +12 -13
  355. package/src/mergeRelatorTermFields.js +5 -7
  356. package/src/{mergeRelatorTermFields.spec.js → mergeRelatorTermFields.test.js} +12 -13
  357. package/src/modernize-502.js +1 -1
  358. package/src/{modernize-502.spec.js → modernize-502.test.js} +12 -13
  359. package/src/multiple-subfield-0.js +3 -3
  360. package/src/{multiple-subfield-0.spec.js → multiple-subfield-0.test.js} +13 -13
  361. package/src/{non-breaking-space.spec.js → non-breaking-space.test.js} +12 -13
  362. package/src/normalize-dashes.js +2 -2
  363. package/src/{normalize-dashes.spec.js → normalize-dashes.test.js} +12 -13
  364. package/src/normalize-identifiers.js +1 -1
  365. package/src/{normalize-identifiers.spec.js → normalize-identifiers.test.js} +12 -13
  366. package/src/normalize-qualifying-information.js +2 -2
  367. package/src/{normalize-qualifying-information.spec.js → normalize-qualifying-information.test.js} +12 -13
  368. package/src/normalize-utf8-diacritics.js +2 -2
  369. package/src/{normalize-utf8-diacritics.spec.js → normalize-utf8-diacritics.test.js} +13 -13
  370. package/src/normalizeFieldForComparison.js +6 -6
  371. package/src/normalizeSubfieldValueForComparison.js +1 -1
  372. package/src/prepublicationUtils.js +4 -4
  373. package/src/punctuation/index.js +1 -1
  374. package/src/punctuation/rules/index.js +2 -2
  375. package/src/{punctuation.spec.js → punctuation.test.js} +12 -13
  376. package/src/punctuation2.js +4 -4
  377. package/src/{punctuation2.spec.js → punctuation2.test.js} +12 -13
  378. package/src/reindexSubfield6OccurenceNumbers.js +5 -7
  379. package/src/{reindexSubfield6OccurenceNumbers.spec.js → reindexSubfield6OccurenceNumbers.test.js} +12 -13
  380. package/src/removeDuplicateDataFields.js +11 -19
  381. package/src/{removeDuplicateDataFields.spec.js → removeDuplicateDataFields.test.js} +12 -13
  382. package/src/removeInferiorDataFields.js +11 -11
  383. package/src/{removeInferiorDataFields.spec.js → removeInferiorDataFields.test.js} +13 -13
  384. package/src/resolvable-ext-references-melinda.js +1 -1
  385. package/src/{resolvable-ext-references-melinda.spec.js → resolvable-ext-references-melinda.test.js} +42 -27
  386. package/src/resolveOrphanedSubfield6s.js +5 -5
  387. package/src/{resolveOrphanedSubfield6s.spec.js → resolveOrphanedSubfield6s.test.js} +13 -13
  388. package/src/sanitize-vocabulary-source-codes.js +4 -4
  389. package/src/{sanitize-vocabulary-source-codes.spec.js → sanitize-vocabulary-source-codes.test.js} +16 -14
  390. package/src/{sort-tags.spec.js → sort-tags.test.js} +9 -11
  391. package/src/sortFields.js +4 -4
  392. package/src/{sortFields.spec.js → sortFields.test.js} +12 -13
  393. package/src/sortRelatorTerms.js +3 -3
  394. package/src/{sortRelatorTerms.spec.js → sortRelatorTerms.test.js} +13 -13
  395. package/src/sortSubfields.js +1 -1
  396. package/src/{sortSubfields.spec.js → sortSubfields.test.js} +13 -13
  397. package/src/stripPunctuation.js +3 -3
  398. package/src/{stripPunctuation.spec.js → stripPunctuation.test.js} +13 -13
  399. package/src/subfield-exclusion.js +1 -1
  400. package/src/{subfield-exclusion.spec.js → subfield-exclusion.test.js} +45 -36
  401. package/src/subfield6Utils.js +6 -10
  402. package/src/subfield8Utils.js +4 -4
  403. package/src/subfieldValueNormalizations.js +3 -3
  404. package/src/{subfieldValueNormalizations.spec.js → subfieldValueNormalizations.test.js} +18 -14
  405. package/src/sync-007-and-300.js +2 -2
  406. package/src/{sync-007-and-300.spec.js → sync-007-and-300.test.js} +13 -13
  407. package/src/translate-terms.js +3 -3
  408. package/src/{translate-terms.spec.js → translate-terms.test.js} +13 -13
  409. package/src/{typeOfDate-008.spec.js → typeOfDate-008.test.js} +12 -13
  410. package/src/{unicode-decomposition.spec.js → unicode-decomposition.test.js} +10 -16
  411. package/src/update-field-540.js +2 -2
  412. package/src/{update-field-540.spec.js → update-field-540.test.js} +13 -10
  413. package/src/urn.js +2 -2
  414. package/src/{urn.spec.js → urn.test.js} +12 -13
  415. package/src/utils.js +3 -3
  416. package/test-fixtures/field-505-separators/03/expectedResult.json +3 -1
  417. package/test-fixtures/field-505-separators/03/record.json +3 -0
  418. package/test-fixtures/normalize-subfield-value/01/metadata.json +4 -1
  419. package/test-fixtures/normalize-subfield-value/01/record.json +3 -0
  420. package/test-fixtures/normalize-subfield-value/02/expectedResult.json +3 -1
  421. package/test-fixtures/normalize-subfield-value/02/metadata.json +2 -1
  422. package/test-fixtures/normalize-subfield-value/02/record.json +3 -0
  423. package/test-fixtures/sanitize-vocabulary-source-codes/f03/expectedResult.json +3 -1
  424. package/test-fixtures/sanitize-vocabulary-source-codes/f04/expectedResult.json +3 -1
  425. package/test-fixtures/sanitize-vocabulary-source-codes/v04/metadata.json +1 -4
  426. package/test-fixtures/sanitize-vocabulary-source-codes/v04/record.json +1 -1
  427. package/dist/access-rights.spec.js +0 -195
  428. package/dist/access-rights.spec.js.map +0 -1
  429. package/dist/addMissingField041.spec.js +0 -45
  430. package/dist/addMissingField041.spec.js.map +0 -1
  431. package/dist/addMissingField336.spec.js +0 -45
  432. package/dist/addMissingField336.spec.js.map +0 -1
  433. package/dist/addMissingField337.spec.js +0 -43
  434. package/dist/addMissingField337.spec.js.map +0 -1
  435. package/dist/addMissingField338.spec.js +0 -45
  436. package/dist/addMissingField338.spec.js.map +0 -1
  437. package/dist/cyrillux-usemarcon-replacement.spec.js +0 -45
  438. package/dist/cyrillux-usemarcon-replacement.spec.js.map +0 -1
  439. package/dist/cyrillux.spec.js +0 -46
  440. package/dist/cyrillux.spec.js.map +0 -1
  441. package/dist/disambiguateSeriesStatements.spec.js +0 -51
  442. package/dist/disambiguateSeriesStatements.spec.js.map +0 -1
  443. package/dist/double-commas.spec.js +0 -73
  444. package/dist/double-commas.spec.js.map +0 -1
  445. package/dist/duplicates-ind1.spec.js +0 -45
  446. package/dist/duplicates-ind1.spec.js.map +0 -1
  447. package/dist/empty-fields.spec.js +0 -118
  448. package/dist/empty-fields.spec.js.map +0 -1
  449. package/dist/ending-punctuation.spec.js +0 -2654
  450. package/dist/ending-punctuation.spec.js.map +0 -1
  451. package/dist/ending-whitespace.spec.js +0 -42
  452. package/dist/ending-whitespace.spec.js.map +0 -1
  453. package/dist/field-008-18-34-character-groups.spec.js +0 -51
  454. package/dist/field-008-18-34-character-groups.spec.js.map +0 -1
  455. package/dist/field-505-separators.spec.js +0 -51
  456. package/dist/field-505-separators.spec.js.map +0 -1
  457. package/dist/field-521-fix.spec.js +0 -51
  458. package/dist/field-521-fix.spec.js.map +0 -1
  459. package/dist/field-exclusion.spec.js +0 -1054
  460. package/dist/field-exclusion.spec.js.map +0 -1
  461. package/dist/field-structure.spec.js +0 -535
  462. package/dist/field-structure.spec.js.map +0 -1
  463. package/dist/fields-present.spec.js +0 -121
  464. package/dist/fields-present.spec.js.map +0 -1
  465. package/dist/fix-33X.spec.js +0 -45
  466. package/dist/fix-33X.spec.js.map +0 -1
  467. package/dist/fix-country-codes.spec.js +0 -51
  468. package/dist/fix-country-codes.spec.js.map +0 -1
  469. package/dist/fix-language-codes.spec.js +0 -44
  470. package/dist/fix-language-codes.spec.js.map +0 -1
  471. package/dist/fixRelatorTerms.spec.js +0 -51
  472. package/dist/fixRelatorTerms.spec.js.map +0 -1
  473. package/dist/fixed-fields.spec.js +0 -140
  474. package/dist/fixed-fields.spec.js.map +0 -1
  475. package/dist/identical-fields.spec.js +0 -99
  476. package/dist/identical-fields.spec.js.map +0 -1
  477. package/dist/indicator-fixes.spec.js +0 -51
  478. package/dist/indicator-fixes.spec.js.map +0 -1
  479. package/dist/isbn-issn.spec.js +0 -595
  480. package/dist/isbn-issn.spec.js.map +0 -1
  481. package/dist/item-language.spec.js +0 -306
  482. package/dist/item-language.spec.js.map +0 -1
  483. package/dist/melindaCustomMergeFields.json +0 -5120
  484. package/dist/merge-fields.spec.js +0 -51
  485. package/dist/merge-fields.spec.js.map +0 -1
  486. package/dist/mergeField500Lisapainokset.spec.js +0 -51
  487. package/dist/mergeField500Lisapainokset.spec.js.map +0 -1
  488. package/dist/mergeRelatorTermFields.spec.js +0 -51
  489. package/dist/mergeRelatorTermFields.spec.js.map +0 -1
  490. package/dist/modernize-502.spec.js +0 -49
  491. package/dist/modernize-502.spec.js.map +0 -1
  492. package/dist/multiple-subfield-0.spec.js +0 -51
  493. package/dist/multiple-subfield-0.spec.js.map +0 -1
  494. package/dist/non-breaking-space.spec.js +0 -42
  495. package/dist/non-breaking-space.spec.js.map +0 -1
  496. package/dist/normalize-dashes.spec.js +0 -51
  497. package/dist/normalize-dashes.spec.js.map +0 -1
  498. package/dist/normalize-identifiers.spec.js +0 -51
  499. package/dist/normalize-identifiers.spec.js.map +0 -1
  500. package/dist/normalize-qualifying-information.spec.js +0 -51
  501. package/dist/normalize-qualifying-information.spec.js.map +0 -1
  502. package/dist/normalize-utf8-diacritics.spec.js +0 -51
  503. package/dist/normalize-utf8-diacritics.spec.js.map +0 -1
  504. package/dist/punctuation.spec.js +0 -51
  505. package/dist/punctuation.spec.js.map +0 -1
  506. package/dist/punctuation2.spec.js +0 -51
  507. package/dist/punctuation2.spec.js.map +0 -1
  508. package/dist/reindexSubfield6OccurenceNumbers.spec.js +0 -51
  509. package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +0 -1
  510. package/dist/removeDuplicateDataFields.spec.js +0 -51
  511. package/dist/removeDuplicateDataFields.spec.js.map +0 -1
  512. package/dist/removeInferiorDataFields.spec.js +0 -51
  513. package/dist/removeInferiorDataFields.spec.js.map +0 -1
  514. package/dist/resolvable-ext-references-melinda.spec.js +0 -166
  515. package/dist/resolvable-ext-references-melinda.spec.js.map +0 -1
  516. package/dist/resolveOrphanedSubfield6s.spec.js +0 -51
  517. package/dist/resolveOrphanedSubfield6s.spec.js.map +0 -1
  518. package/dist/sanitize-vocabulary-source-codes.spec.js +0 -51
  519. package/dist/sanitize-vocabulary-source-codes.spec.js.map +0 -1
  520. package/dist/sort-tags.spec.js +0 -207
  521. package/dist/sort-tags.spec.js.map +0 -1
  522. package/dist/sortFields.spec.js +0 -51
  523. package/dist/sortFields.spec.js.map +0 -1
  524. package/dist/sortRelatorTerms.spec.js +0 -51
  525. package/dist/sortRelatorTerms.spec.js.map +0 -1
  526. package/dist/sortSubfields.spec.js +0 -52
  527. package/dist/sortSubfields.spec.js.map +0 -1
  528. package/dist/stripPunctuation.spec.js +0 -51
  529. package/dist/stripPunctuation.spec.js.map +0 -1
  530. package/dist/subfield-exclusion.spec.js +0 -523
  531. package/dist/subfield-exclusion.spec.js.map +0 -1
  532. package/dist/subfieldValueNormalizations.spec.js +0 -51
  533. package/dist/subfieldValueNormalizations.spec.js.map +0 -1
  534. package/dist/sync-007-and-300.spec.js +0 -51
  535. package/dist/sync-007-and-300.spec.js.map +0 -1
  536. package/dist/translate-terms.spec.js +0 -51
  537. package/dist/translate-terms.spec.js.map +0 -1
  538. package/dist/typeOfDate-008.spec.js +0 -47
  539. package/dist/typeOfDate-008.spec.js.map +0 -1
  540. package/dist/unicode-decomposition.spec.js +0 -91
  541. package/dist/unicode-decomposition.spec.js.map +0 -1
  542. package/dist/update-field-540.spec.js +0 -51
  543. package/dist/update-field-540.spec.js.map +0 -1
  544. package/dist/urn.spec.js +0 -52
  545. package/dist/urn.spec.js.map +0 -1
  546. package/src/cyrillux-usemarcon-replacement.spec.js +0 -47
@@ -1 +1,7 @@
1
- {"version":3,"file":"reindexSubfield6OccurenceNumbers.js","names":["_debug","_interopRequireDefault","require","_utils","_subfield6Utils","e","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","recordDisambiguateSharedSubfield6OccurrenceNumbers","recordResetSubfield6OccurrenceNumbers","recordGetSharedOccurrenceNumbers","length","push","max","recordGetMaxSubfield6OccurrenceNumberAsInteger","size","recordGetNumberOfUniqueSubfield6OccurrenceNumbers","getPotentialSharedOccurrenceNumberFields","occurrenceNumber","fields","filter","f","tag","subfields","some","sf","subfield6GetOccurrenceNumber","subfieldHasSharedOccurrenceNumber","subfield","candFields","relevantFields","fieldHasSharedOccurrenceNumber","field","fieldsContainingSubfield6","fieldHasSubfield","sharedOccurrenceNumberFields","forEach","disambiguateOccurrenceNumber","disambiguateable","fieldGetUnambiguousOccurrenceNumber","fieldToString","undefined","allRelevantFields","relevantFieldsWithCurrFieldTag","candField","newOccurrenceNumberAsInt","newOccurrenceNumber","intToOccurrenceNumberString","pairedFields","fieldGetOccurrenceNumberPairs","fieldResetOccurrenceNumber","pairedField","indexArray","gatherFieldData","gatherSubfieldData","isValidSubfield6","i","subfield6GetOccurrenceNumberAsInteger","n","elem","currentInt","oldtoNewCache","fieldResetSubfield6","subfieldReset6","currIndex","newIndex","mapCurrIndexToNewIndex","subfield6ResetOccurrenceNumber"],"sources":["../src/reindexSubfield6OccurenceNumbers.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString, nvdebug} from './utils';\nimport {fieldGetOccurrenceNumberPairs, fieldGetUnambiguousOccurrenceNumber, fieldResetOccurrenceNumber, intToOccurrenceNumberString, isValidSubfield6,\n recordGetMaxSubfield6OccurrenceNumberAsInteger,\n subfield6GetOccurrenceNumber, subfield6GetOccurrenceNumberAsInteger, subfield6ResetOccurrenceNumber} from './subfield6Utils';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:reindexSubfield6OccurrenceNumbers');\n\n\n// NB! This validator/fixer has two functionalities:\n// 1) normal reindexing of occurrence numbers\n// 2) disambiguation (when possible) of unambiguous occurrence numbers\n\nexport default function () {\n return {\n description: 'Reindex occurrence numbers in $6 subfield so that they start from 01 and end in NN',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix SF6 occurrence numbers', debug);\n const res = {message: [], fix: [], valid: true};\n //message.fix = [];\n\n // This can not really fail...\n\n recordDisambiguateSharedSubfield6OccurrenceNumbers(record);\n recordResetSubfield6OccurrenceNumbers(record);\n\n // message.valid = !(message.message.length >= 1);\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n nvdebug('Validate SF6 occurrence number multiuses', debug);\n if (recordGetSharedOccurrenceNumbers(record).length) {\n res.message.push(`Multi-use of occurrence number(s) detected`);\n }\n\n // Check max, and check number of different indexes\n nvdebug('Validate SF6 occurrence number (max vs n instances)', debug);\n const max = recordGetMaxSubfield6OccurrenceNumberAsInteger(record);\n const size = recordGetNumberOfUniqueSubfield6OccurrenceNumbers(record);\n\n\n if (max !== size) {\n res.message.push(`Gaps detected in occurrence numbers: found ${size}, seen max ${max}`);\n }\n res.valid = res.message.length < 1;\n return res;\n }\n}\n\nfunction getPotentialSharedOccurrenceNumberFields(occurrenceNumber, fields) {\n return fields.filter(f => f.tag !== '880' && f.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber));\n}\n\nfunction subfieldHasSharedOccurrenceNumber(subfield, candFields) {\n const occurrenceNumber = subfield6GetOccurrenceNumber(subfield);\n if (!occurrenceNumber || occurrenceNumber === '00') {\n return false;\n }\n const relevantFields = getPotentialSharedOccurrenceNumberFields(occurrenceNumber, candFields);\n // record.fields.filter(f => f.tag !== '880' && fieldHasOccurrenceNumber(f, occurrenceNumber));\n return relevantFields.length > 1;\n}\n\nfunction fieldHasSharedOccurrenceNumber(field, candFields) {\n if (!field.subfields || field.tag === '880') { // Should not happen\n return false;\n }\n\n // What if there are multiple $6s in a given field? Should not be, but...\n return field.subfields.some(subfield => subfieldHasSharedOccurrenceNumber(subfield, candFields));\n\n}\n\nfunction recordGetSharedOccurrenceNumbers(record) {\n const fieldsContainingSubfield6 = record.fields.filter(field => field.tag !== '880' && fieldHasSubfield(field, '6'));\n // fieldsContainingSubfield6.some(field => fieldHasSharedOccurrenceNumber(field, fieldsContainingSubfield6)))\n return fieldsContainingSubfield6.filter(field => fieldHasSharedOccurrenceNumber(field, fieldsContainingSubfield6));\n}\n\nfunction recordDisambiguateSharedSubfield6OccurrenceNumbers(record) {\n const sharedOccurrenceNumberFields = recordGetSharedOccurrenceNumbers(record);\n if (sharedOccurrenceNumberFields.length < 2) {\n return;\n }\n nvdebug(`Disambiguate occurrence numbers (N=${sharedOccurrenceNumberFields.length}) in...`, debug);\n sharedOccurrenceNumberFields.forEach(field => disambiguateOccurrenceNumber(field)); // eslint-disable-line array-callback-return\n\n function disambiguateable(field) {\n if (field.tag === '880') { // Not needed, already filtered...\n return false;\n }\n const occurrenceNumber = fieldGetUnambiguousOccurrenceNumber(field);\n nvdebug(` Trying to disambiguate ${occurrenceNumber} in '${fieldToString(field)}`);\n if (occurrenceNumber === undefined) {\n return false;\n }\n const allRelevantFields = getPotentialSharedOccurrenceNumberFields(occurrenceNumber, sharedOccurrenceNumberFields);\n if (allRelevantFields.length < 2) {\n nvdebug(` Currently only ${allRelevantFields.length} field(s) use occurrence number ${occurrenceNumber}. No action required.`);\n return false;\n }\n nvdebug(` Currently ${allRelevantFields.length} field(s) use occurrence number ${occurrenceNumber}. ACTION REQUIRED!`);\n const relevantFieldsWithCurrFieldTag = allRelevantFields.filter(candField => field.tag === candField.tag);\n\n if (relevantFieldsWithCurrFieldTag.length !== 1) {\n nvdebug(` Number of them using tag ${field.tag} is ${relevantFieldsWithCurrFieldTag.length}. Can not disambiguate!`);\n return false;\n }\n\n return true;\n }\n\n function disambiguateOccurrenceNumber(field) {\n if (!disambiguateable(field)) {\n return;\n }\n // Reset field:\n const occurrenceNumber = fieldGetUnambiguousOccurrenceNumber(field);\n const newOccurrenceNumberAsInt = recordGetMaxSubfield6OccurrenceNumberAsInteger(record) + 1;\n const newOccurrenceNumber = intToOccurrenceNumberString(newOccurrenceNumberAsInt);\n const pairedFields = fieldGetOccurrenceNumberPairs(field, record.fields);\n\n nvdebug(` Reindex '${fieldToString(field)}' occurrence number and it's ${pairedFields.length} pair(s) using '${newOccurrenceNumber}'`, debug);\n\n fieldResetOccurrenceNumber(field, newOccurrenceNumber, occurrenceNumber);\n pairedFields.forEach(pairedField => fieldResetOccurrenceNumber(pairedField, newOccurrenceNumber, occurrenceNumber)); // eslint-disable-line array-callback-return\n\n }\n\n\n}\nfunction recordGetNumberOfUniqueSubfield6OccurrenceNumbers(record) {\n // Calculates the number of used different occurrence numbers\n /* eslint-disable */\n let indexArray = [];\n record.fields.forEach(field => gatherFieldData(field));\n\n function gatherFieldData(field) {\n if (!field.subfields) {\n return;\n }\n field.subfields.forEach(subfield => gatherSubfieldData(subfield));\n }\n\n function gatherSubfieldData(subfield) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n const i = subfield6GetOccurrenceNumberAsInteger(subfield);\n if (i === 0) {\n return\n }\n indexArray[i] = 1;\n }\n let n = 0;\n indexArray.forEach(elem => n+= elem); \n /* eslint-enable */\n return n;\n}\n\nexport function recordResetSubfield6OccurrenceNumbers(record) { // Remove gaps\n /* eslint-disable */\n let currentInt = 1;\n let oldtoNewCache = {};\n\n record.fields.forEach(field => fieldResetSubfield6(field));\n\n function fieldResetSubfield6(field) {\n nvdebug(`fieldResetSubfield6(${fieldToString(field)}), CURR:${currentInt}`, debug);\n if (!field.subfields) {\n return;\n }\n field.subfields.forEach(subfield => subfieldReset6(subfield));\n }\n\n function subfieldReset6(subfield) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n const currIndex = subfield6GetOccurrenceNumber(subfield);\n if (currIndex === undefined || currIndex === '00') {\n return;\n }\n\n const newIndex = mapCurrIndexToNewIndex(currIndex);\n //nvdebug(`subfieldReset6(${subfieldToString(subfield)}): ${newIndex}`, debug);\n subfield6ResetOccurrenceNumber(subfield, newIndex);\n }\n\n function mapCurrIndexToNewIndex(currIndex) {\n if(currIndex in oldtoNewCache) {\n return oldtoNewCache[currIndex];\n }\n const newIndex = intToOccurrenceNumberString(currentInt);\n oldtoNewCache[currIndex] = newIndex;\n currentInt++;\n return newIndex;\n }\n\n /* eslint-enable */\n\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/reindexSubfield6OccurenceNumbers.js"],
4
+ "sourcesContent": ["import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString, nvdebug} from './utils.js';\nimport {fieldGetOccurrenceNumberPairs, fieldGetUnambiguousOccurrenceNumber, fieldResetOccurrenceNumber, intToOccurrenceNumberString, isValidSubfield6,\n recordGetMaxSubfield6OccurrenceNumberAsInteger,\n subfield6GetOccurrenceNumber, subfield6GetOccurrenceNumberAsInteger, subfield6ResetOccurrenceNumber} from './subfield6Utils.js';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:reindexSubfield6OccurrenceNumbers');\n\n\n// NB! This validator/fixer has two functionalities:\n// 1) normal reindexing of occurrence numbers\n// 2) disambiguation (when possible) of unambiguous occurrence numbers\n\nexport default function () {\n return {\n description: 'Reindex occurrence numbers in $6 subfield so that they start from 01 and end in NN',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix SF6 occurrence numbers', debug);\n const res = {message: [], fix: [], valid: true};\n //message.fix = [];\n\n // This can not really fail...\n\n recordDisambiguateSharedSubfield6OccurrenceNumbers(record);\n recordResetSubfield6OccurrenceNumbers(record);\n\n // message.valid = !(message.message.length >= 1);\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n nvdebug('Validate SF6 occurrence number multiuses', debug);\n if (recordGetSharedOccurrenceNumbers(record).length) {\n res.message.push(`Multi-use of occurrence number(s) detected`);\n }\n\n // Check max, and check number of different indexes\n nvdebug('Validate SF6 occurrence number (max vs n instances)', debug);\n const max = recordGetMaxSubfield6OccurrenceNumberAsInteger(record);\n const size = recordGetNumberOfUniqueSubfield6OccurrenceNumbers(record);\n\n\n if (max !== size) {\n res.message.push(`Gaps detected in occurrence numbers: found ${size}, seen max ${max}`);\n }\n res.valid = res.message.length < 1;\n return res;\n }\n}\n\nfunction getPotentialSharedOccurrenceNumberFields(occurrenceNumber, fields) {\n return fields.filter(f => f.tag !== '880' && f.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber));\n}\n\nfunction subfieldHasSharedOccurrenceNumber(subfield, candFields) {\n const occurrenceNumber = subfield6GetOccurrenceNumber(subfield);\n if (!occurrenceNumber || occurrenceNumber === '00') {\n return false;\n }\n const relevantFields = getPotentialSharedOccurrenceNumberFields(occurrenceNumber, candFields);\n // record.fields.filter(f => f.tag !== '880' && fieldHasOccurrenceNumber(f, occurrenceNumber));\n return relevantFields.length > 1;\n}\n\nfunction fieldHasSharedOccurrenceNumber(field, candFields) {\n if (!field.subfields || field.tag === '880') { // Should not happen\n return false;\n }\n\n // What if there are multiple $6s in a given field? Should not be, but...\n return field.subfields.some(subfield => subfieldHasSharedOccurrenceNumber(subfield, candFields));\n\n}\n\nfunction recordGetSharedOccurrenceNumbers(record) {\n const fieldsContainingSubfield6 = record.fields.filter(field => field.tag !== '880' && fieldHasSubfield(field, '6'));\n // fieldsContainingSubfield6.some(field => fieldHasSharedOccurrenceNumber(field, fieldsContainingSubfield6)))\n return fieldsContainingSubfield6.filter(field => fieldHasSharedOccurrenceNumber(field, fieldsContainingSubfield6));\n}\n\nfunction recordDisambiguateSharedSubfield6OccurrenceNumbers(record) {\n const sharedOccurrenceNumberFields = recordGetSharedOccurrenceNumbers(record);\n if (sharedOccurrenceNumberFields.length < 2) {\n return;\n }\n nvdebug(`Disambiguate occurrence numbers (N=${sharedOccurrenceNumberFields.length}) in...`, debug);\n sharedOccurrenceNumberFields.forEach(field => disambiguateOccurrenceNumber(field));\n\n function disambiguateable(field) {\n if (field.tag === '880') { // Not needed, already filtered...\n return false;\n }\n const occurrenceNumber = fieldGetUnambiguousOccurrenceNumber(field);\n nvdebug(` Trying to disambiguate ${occurrenceNumber} in '${fieldToString(field)}`);\n if (occurrenceNumber === undefined) {\n return false;\n }\n const allRelevantFields = getPotentialSharedOccurrenceNumberFields(occurrenceNumber, sharedOccurrenceNumberFields);\n if (allRelevantFields.length < 2) {\n nvdebug(` Currently only ${allRelevantFields.length} field(s) use occurrence number ${occurrenceNumber}. No action required.`);\n return false;\n }\n nvdebug(` Currently ${allRelevantFields.length} field(s) use occurrence number ${occurrenceNumber}. ACTION REQUIRED!`);\n const relevantFieldsWithCurrFieldTag = allRelevantFields.filter(candField => field.tag === candField.tag);\n\n if (relevantFieldsWithCurrFieldTag.length !== 1) {\n nvdebug(` Number of them using tag ${field.tag} is ${relevantFieldsWithCurrFieldTag.length}. Can not disambiguate!`);\n return false;\n }\n\n return true;\n }\n\n function disambiguateOccurrenceNumber(field) {\n if (!disambiguateable(field)) {\n return;\n }\n // Reset field:\n const occurrenceNumber = fieldGetUnambiguousOccurrenceNumber(field);\n const newOccurrenceNumberAsInt = recordGetMaxSubfield6OccurrenceNumberAsInteger(record) + 1;\n const newOccurrenceNumber = intToOccurrenceNumberString(newOccurrenceNumberAsInt);\n const pairedFields = fieldGetOccurrenceNumberPairs(field, record.fields);\n\n nvdebug(` Reindex '${fieldToString(field)}' occurrence number and it's ${pairedFields.length} pair(s) using '${newOccurrenceNumber}'`, debug);\n\n fieldResetOccurrenceNumber(field, newOccurrenceNumber, occurrenceNumber);\n pairedFields.forEach(pairedField => fieldResetOccurrenceNumber(pairedField, newOccurrenceNumber, occurrenceNumber));\n\n }\n\n\n}\nfunction recordGetNumberOfUniqueSubfield6OccurrenceNumbers(record) {\n // Calculates the number of used different occurrence numbers\n let indexArray = [];\n record.fields.forEach(field => gatherFieldData(field));\n\n function gatherFieldData(field) {\n if (!field.subfields) {\n return;\n }\n field.subfields.forEach(subfield => gatherSubfieldData(subfield));\n }\n\n function gatherSubfieldData(subfield) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n const i = subfield6GetOccurrenceNumberAsInteger(subfield);\n if (i === 0) {\n return\n }\n indexArray[i] = 1;\n }\n let n = 0;\n indexArray.forEach(elem => n+= elem);\n return n;\n}\n\nexport function recordResetSubfield6OccurrenceNumbers(record) { // Remove gaps\n /* eslint-disable */\n let currentInt = 1;\n let oldtoNewCache = {};\n\n record.fields.forEach(field => fieldResetSubfield6(field));\n\n function fieldResetSubfield6(field) {\n nvdebug(`fieldResetSubfield6(${fieldToString(field)}), CURR:${currentInt}`, debug);\n if (!field.subfields) {\n return;\n }\n field.subfields.forEach(subfield => subfieldReset6(subfield));\n }\n\n function subfieldReset6(subfield) {\n if (!isValidSubfield6(subfield)) {\n return;\n }\n const currIndex = subfield6GetOccurrenceNumber(subfield);\n if (currIndex === undefined || currIndex === '00') {\n return;\n }\n\n const newIndex = mapCurrIndexToNewIndex(currIndex);\n //nvdebug(`subfieldReset6(${subfieldToString(subfield)}): ${newIndex}`, debug);\n subfield6ResetOccurrenceNumber(subfield, newIndex);\n }\n\n function mapCurrIndexToNewIndex(currIndex) {\n if(currIndex in oldtoNewCache) {\n return oldtoNewCache[currIndex];\n }\n const newIndex = intToOccurrenceNumberString(currentInt);\n oldtoNewCache[currIndex] = newIndex;\n currentInt++;\n return newIndex;\n }\n\n /* eslint-enable */\n\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,44 @@
1
+ import assert from "node:assert";
2
+ import { MarcRecord } from "@natlibfi/marc-record";
3
+ import validatorFactory from "./reindexSubfield6OccurenceNumbers.js";
4
+ import { READERS } from "@natlibfi/fixura";
5
+ import generateTests from "@natlibfi/fixugen";
6
+ import createDebugLogger from "debug";
7
+ generateTests({
8
+ callback,
9
+ path: [import.meta.dirname, "..", "test-fixtures", "reindex-sf6-occurence-numbers"],
10
+ useMetadataFile: true,
11
+ recurse: false,
12
+ fixura: {
13
+ reader: READERS.JSON
14
+ },
15
+ hooks: {
16
+ before: async () => {
17
+ testValidatorFactory();
18
+ }
19
+ }
20
+ });
21
+ const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda/reindexSubfield6OccurrenceNumbers:test");
22
+ async function testValidatorFactory() {
23
+ const validator = await validatorFactory();
24
+ assert.equal(typeof validator, "object");
25
+ assert.equal(typeof validator.description, "string");
26
+ assert.equal(typeof validator.validate, "function");
27
+ }
28
+ async function callback({ getFixture, enabled = true, fix = false }) {
29
+ if (enabled === false) {
30
+ debug("TEST SKIPPED!");
31
+ return;
32
+ }
33
+ const validator = await validatorFactory();
34
+ const record = new MarcRecord(getFixture("record.json"));
35
+ const expectedResult = getFixture("expectedResult.json");
36
+ if (!fix) {
37
+ const result = await validator.validate(record);
38
+ assert.deepEqual(result, expectedResult);
39
+ return;
40
+ }
41
+ await validator.fix(record);
42
+ assert.deepEqual(record, expectedResult);
43
+ }
44
+ //# sourceMappingURL=reindexSubfield6OccurenceNumbers.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/reindexSubfield6OccurenceNumbers.test.js"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './reindexSubfield6OccurenceNumbers.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'reindex-sf6-occurence-numbers'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/reindexSubfield6OccurrenceNumbers:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n}\n\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
5
+ "mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAC1B,OAAO,uBAAuB;AAE9B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,+BAA+B;AAAA,EAClF,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,YAAY;AAClB,2BAAqB;AAAA,IACvB;AAAA,EACF;AACF,CAAC;AACD,MAAM,QAAQ,kBAAkB,iFAAiF;AAEjH,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,SAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AACpD;AAEA,eAAe,SAAS,EAAC,YAAY,UAAU,MAAM,MAAM,MAAK,GAAG;AACjE,MAAI,YAAY,OAAO;AACrB,UAAM,eAAe;AACrB;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,iBAAiB;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,QAAM,iBAAiB,WAAW,qBAAqB;AAGvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,cAAc;AACzC;",
6
+ "names": []
7
+ }
@@ -1,101 +1,53 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = _default;
7
- exports.fieldToChain = fieldToChain;
8
- exports.handleDuplicateSubfield8Chains = handleDuplicateSubfield8Chains;
9
- exports.isChainHead = isChainHead;
10
- exports.removeDuplicateDatafields = removeDuplicateDatafields;
11
- exports.removeDuplicateSubfield8Chains = removeDuplicateSubfield8Chains;
12
- exports.sameField = sameField;
13
- var _debug = _interopRequireDefault(require("debug"));
14
- var _utils = require("./utils");
15
- var _subfield6Utils = require("./subfield6Utils");
16
- var _subfield8Utils = require("./subfield8Utils");
17
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
1
+ import createDebugLogger from "debug";
2
+ import { fieldsToString, fieldToString, nvdebug } from "./utils.js";
3
+ import { fieldHasValidSubfield6, fieldsGetOccurrenceNumbers, fieldsToNormalizedString, fieldToNormalizedString, get6s } from "./subfield6Utils.js";
4
+ import { add8s, fieldHasLinkingNumber, fieldHasValidSubfield8, fieldsGetAllSubfield8LinkingNumbers, getSubfield8LinkingNumber, recordGetAllSubfield8LinkingNumbers, recordGetFieldsWithSubfield8LinkingNumber } from "./subfield8Utils.js";
18
5
  const LINK_ROOT = 4;
19
6
  const LINKED_AND_PROCESSED = 2;
20
7
  const LINKED_NOT_PROCESSED = 1;
21
-
22
- // Relocated from melinda-marc-record-merge-reducers (and renamed)
23
-
24
- const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda:removeDuplicateDataFields');
25
- function _default() {
8
+ const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda:removeDuplicateDataFields");
9
+ export default function() {
26
10
  return {
27
- description: 'Remove duplicate data fields. Certain exceptions apply, mainly too complited chained fields',
11
+ description: "Remove duplicate data fields. Certain exceptions apply, mainly too complited chained fields",
28
12
  validate,
29
13
  fix
30
14
  };
31
15
  function fix(record) {
32
- (0, _utils.nvdebug)('Remove duplicate data fields');
33
- const res = {
34
- message: [],
35
- fix: [],
36
- valid: true
37
- };
16
+ nvdebug("Remove duplicate data fields");
17
+ const res = { message: [], fix: [], valid: true };
38
18
  removeDuplicateDatafields(record, true);
39
- // This can not really fail...
40
19
  return res;
41
20
  }
42
21
  function validate(record) {
43
- // Check max, and check number of different indexes
44
- (0, _utils.nvdebug)('Validate record: duplicate data fields cause (t)error', debug);
22
+ nvdebug("Validate record: duplicate data fields cause (t)error", debug);
45
23
  const duplicates = removeDuplicateDatafields(record, false);
46
-
47
- //const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);
48
-
49
- const res = {
50
- message: duplicates
51
- };
52
-
53
- /*
54
- if (orphanedFields.length > 0) {
55
- res.message = [`${orphanedFields.length} orphaned occurrence number field(s) detected`];
56
- }
57
- */
24
+ const res = { message: duplicates };
58
25
  res.valid = res.message.length < 1;
59
26
  return res;
60
27
  }
61
28
  }
62
-
63
- /*
64
- function numberOfLinkageSubfields(field) {
65
- nvdebug(`N of Linkage Subs(${fieldToString(field)})`);
66
- const subfields = field.subfields.filter(sf => sf.code === '6' || sf.code === '8');
67
- return subfields.length;
68
- }
69
- */
70
-
71
29
  function removeLinkNotes(record) {
72
- record.fields.forEach(f => delete f.linkNote); // eslint-disable-line array-callback-return
30
+ record.fields.forEach((f) => delete f.linkNote);
73
31
  }
74
32
  function newGetAllLinkedFields(field, record, useSixes = true, useEights = true) {
75
- removeLinkNotes(record); // should be clear, but let's play safe
76
-
77
- /* eslint-disable */
33
+ removeLinkNotes(record);
78
34
  field.linkNote = LINK_ROOT;
79
35
  let currField = field;
80
-
81
- // Loop until all linked fields have been processed:
82
- while (currField !== undefined) {
36
+ while (currField !== void 0) {
83
37
  if (useSixes) {
84
- const related6s = (0, _subfield6Utils.get6s)(currField, record.fields);
85
- related6s.forEach(f => linkField(f));
38
+ const related6s = get6s(currField, record.fields);
39
+ related6s.forEach((f) => linkField(f));
86
40
  }
87
41
  if (useEights) {
88
- const related8s = (0, _subfield8Utils.add8s)([currField], record);
89
- related8s.forEach(f => linkField(f));
42
+ const related8s = add8s([currField], record);
43
+ related8s.forEach((f) => linkField(f));
90
44
  }
91
45
  if (currField.linkNote !== LINK_ROOT) {
92
46
  currField.linkNote = LINKED_AND_PROCESSED;
93
47
  }
94
- currField = record.fields.find(f => f.linkNote === LINKED_NOT_PROCESSED);
48
+ currField = record.fields.find((f) => f.linkNote === LINKED_NOT_PROCESSED);
95
49
  }
96
-
97
- // Collect relevant fields:
98
- const linkedFields = record.fields.filter(f => f.linkNote);
50
+ const linkedFields = record.fields.filter((f) => f.linkNote);
99
51
  removeLinkNotes(record);
100
52
  return linkedFields;
101
53
  function linkField(f) {
@@ -103,135 +55,104 @@ function newGetAllLinkedFields(field, record, useSixes = true, useEights = true)
103
55
  f.linkNote = LINKED_NOT_PROCESSED;
104
56
  }
105
57
  }
106
-
107
- /* eslint-enable */
108
58
  }
109
59
  function recordRemoveFieldOrSubfield8(record, field, currLinkingNumber) {
110
- const eights = field.subfields.filter(sf => sf.code === '8');
60
+ const eights = field.subfields.filter((sf) => sf.code === "8");
111
61
  if (eights.length < 2) {
112
62
  record.removeField(field);
113
63
  return;
114
64
  }
115
- const subfields = field.subfields.filter(sf => (0, _subfield8Utils.getSubfield8LinkingNumber)(sf) === currLinkingNumber);
116
- subfields.forEach(sf => record.removeSubfield(sf, field)); // eslint-disable-line array-callback-return
65
+ const subfields = field.subfields.filter((sf) => getSubfield8LinkingNumber(sf) === currLinkingNumber);
66
+ subfields.forEach((sf) => record.removeSubfield(sf, field));
117
67
  }
118
68
  function newRecordRemoveFieldOrSubfield8(record, field, currLinkingNumber, fix) {
119
- const eights = field.subfields.filter(sf => sf.code === '8');
69
+ const eights = field.subfields.filter((sf) => sf.code === "8");
120
70
  if (eights.length < 2) {
121
71
  field.deleted = 1;
122
72
  return;
123
73
  }
124
- const subfields = field.subfields.filter(sf => (0, _subfield8Utils.getSubfield8LinkingNumber)(sf) === currLinkingNumber);
125
- subfields.forEach(sf => {
74
+ const subfields = field.subfields.filter((sf) => getSubfield8LinkingNumber(sf) === currLinkingNumber);
75
+ subfields.forEach((sf) => {
126
76
  field.modified = 1;
127
77
  if (fix) {
128
78
  record.removeSubfield(sf, field);
129
79
  }
130
80
  });
131
81
  }
132
- function removeDuplicateSubfield8Chains(record, fix = true) {
133
- // Seen $8 subsfields in various fields:
134
- // 161 700
135
- // 17 710
136
- // 11 110
137
- // 8 730
138
- // 1 100
139
- // Given these stats, there's no need to check for 1XX-vs-7XX removals
140
-
141
- /* eslint-disable */
82
+ export function removeDuplicateSubfield8Chains(record, fix = true) {
142
83
  let seen = {};
143
- let removables = []; // for validation
144
-
145
- (0, _utils.nvdebug)("CHAIN-8");
146
- const seenLinkingNumbers = (0, _subfield8Utils.recordGetAllSubfield8LinkingNumbers)(record);
84
+ let removables = [];
85
+ nvdebug("CHAIN-8");
86
+ const seenLinkingNumbers = recordGetAllSubfield8LinkingNumbers(record);
147
87
  if (seenLinkingNumbers.length === 0) {
148
88
  return removables;
149
89
  }
150
- (0, _utils.nvdebug)(`seen linking numbers ($8): ${seenLinkingNumbers.join(', ')}`, debug);
151
- seenLinkingNumbers.forEach(currLinkingNumber => {
152
- const linkedFields = (0, _subfield8Utils.recordGetFieldsWithSubfield8LinkingNumber)(record, currLinkingNumber); //getFieldsWithSubfield8Index(base, baseIndex);
153
- // As/If there's just one occurrence number it should be fine to use normalizeOccurrenceNumber = true
90
+ nvdebug(`seen linking numbers ($8): ${seenLinkingNumbers.join(", ")}`, debug);
91
+ seenLinkingNumbers.forEach((currLinkingNumber) => {
92
+ const linkedFields = recordGetFieldsWithSubfield8LinkingNumber(record, currLinkingNumber);
154
93
  const normalizeOccurrenceNumber = true;
155
- const linkedFieldsAsString = (0, _subfield6Utils.fieldsToNormalizedString)(linkedFields, currLinkingNumber, normalizeOccurrenceNumber, true);
156
- (0, _utils.nvdebug)(`Results for LINKING NUMBER ${currLinkingNumber}:`, debug);
157
- (0, _utils.nvdebug)(`${linkedFieldsAsString}`, debug);
94
+ const linkedFieldsAsString = fieldsToNormalizedString(linkedFields, currLinkingNumber, normalizeOccurrenceNumber, true);
95
+ nvdebug(`Results for LINKING NUMBER ${currLinkingNumber}:`, debug);
96
+ nvdebug(`${linkedFieldsAsString}`, debug);
158
97
  if (linkedFieldsAsString in seen) {
159
98
  if (!removables.includes(linkedFieldsAsString)) {
160
99
  removables.push(linkedFieldsAsString);
161
100
  }
162
101
  if (fix) {
163
- (0, _utils.nvdebug)(`$8 CHAIN FIX: REMOVE $8 GROUP: ${(0, _utils.fieldsToString)(linkedFields)}`, debug);
164
- linkedFields.forEach(field => recordRemoveFieldOrSubfield8(record, field, currLinkingNumber));
102
+ nvdebug(`$8 CHAIN FIX: REMOVE $8 GROUP: ${fieldsToString(linkedFields)}`, debug);
103
+ linkedFields.forEach((field) => recordRemoveFieldOrSubfield8(record, field, currLinkingNumber));
165
104
  return;
166
105
  }
167
- (0, _utils.nvdebug)(`$8 VALIDATION: DUPLICATE DETECTED ${linkedFieldsAsString}`, debug);
106
+ nvdebug(`$8 VALIDATION: DUPLICATE DETECTED ${linkedFieldsAsString}`, debug);
168
107
  return;
169
108
  }
170
- (0, _utils.nvdebug)(`$8 DOUBLE REMOVAL OR VALIDATION: ADD2SEEN ${linkedFieldsAsString}`, debug);
109
+ nvdebug(`$8 DOUBLE REMOVAL OR VALIDATION: ADD2SEEN ${linkedFieldsAsString}`, debug);
171
110
  seen[linkedFieldsAsString] = 1;
172
111
  return;
173
112
  });
174
-
175
- /* eslint-enable */
176
113
  return removables;
177
114
  }
178
- function handleDuplicateSubfield8Chains(record, fix) {
179
- // Seen $8 subsfields in various fields:
180
- // 161 700
181
- // 17 710
182
- // 11 110
183
- // 8 730
184
- // 1 100
185
- // Given these stats, there's no need to check for 1XX-vs-7XX removals
186
-
187
- /* eslint-disable */
115
+ export function handleDuplicateSubfield8Chains(record, fix) {
188
116
  let seen = {};
189
- (0, _utils.nvdebug)("CHAIN-8");
190
- const seenLinkingNumbers = (0, _subfield8Utils.recordGetAllSubfield8LinkingNumbers)(record);
117
+ nvdebug("CHAIN-8");
118
+ const seenLinkingNumbers = recordGetAllSubfield8LinkingNumbers(record);
191
119
  if (seenLinkingNumbers.length === 0) {
192
120
  return;
193
121
  }
194
- (0, _utils.nvdebug)(`seen linking numbers ($8): ${seenLinkingNumbers.join(', ')}`, debug);
195
- seenLinkingNumbers.forEach(currLinkingNumber => {
196
- const linkedFields = (0, _subfield8Utils.recordGetFieldsWithSubfield8LinkingNumber)(record, currLinkingNumber); //getFieldsWithSubfield8Index(base, baseIndex);
197
- // As/If there's just one occurrence number it should be fine to use normalizeOccurrenceNumber = true
198
- const normalizeOccurrenceNumber = false; //true;
199
- const linkedFieldsAsString = (0, _subfield6Utils.fieldsToNormalizedString)(linkedFields, currLinkingNumber, normalizeOccurrenceNumber, true);
200
- (0, _utils.nvdebug)(`Results for LINKING NUMBER ${currLinkingNumber}:`, debug);
201
- (0, _utils.nvdebug)(`${linkedFieldsAsString}`, debug);
122
+ nvdebug(`seen linking numbers ($8): ${seenLinkingNumbers.join(", ")}`, debug);
123
+ seenLinkingNumbers.forEach((currLinkingNumber) => {
124
+ const linkedFields = recordGetFieldsWithSubfield8LinkingNumber(record, currLinkingNumber);
125
+ const normalizeOccurrenceNumber = false;
126
+ const linkedFieldsAsString = fieldsToNormalizedString(linkedFields, currLinkingNumber, normalizeOccurrenceNumber, true);
127
+ nvdebug(`Results for LINKING NUMBER ${currLinkingNumber}:`, debug);
128
+ nvdebug(`${linkedFieldsAsString}`, debug);
202
129
  if (linkedFieldsAsString in seen) {
203
- (0, _utils.nvdebug)(`$8 CHAIN FIX: REMOVE $8 GROUP: ${(0, _utils.fieldsToString)(linkedFields)}`, debug);
204
- linkedFields.forEach(field => newRecordRemoveFieldOrSubfield8(record, field, currLinkingNumber, fix));
130
+ nvdebug(`$8 CHAIN FIX: REMOVE $8 GROUP: ${fieldsToString(linkedFields)}`, debug);
131
+ linkedFields.forEach((field) => newRecordRemoveFieldOrSubfield8(record, field, currLinkingNumber, fix));
205
132
  return;
206
133
  }
207
- (0, _utils.nvdebug)(`$8 DOUBLE REMOVAL OR VALIDATION: ADD2SEEN ${linkedFieldsAsString}`, debug);
134
+ nvdebug(`$8 DOUBLE REMOVAL OR VALIDATION: ADD2SEEN ${linkedFieldsAsString}`, debug);
208
135
  seen[linkedFieldsAsString] = 1;
209
136
  return;
210
137
  });
211
-
212
- /* eslint-enable */
213
138
  }
214
139
  function markIdenticalSubfield6Chains(chain, record) {
215
140
  const normalizeOccurrenceNumber = true;
216
- const normalizeTag = chain.some(field => field.tag.substring(0, 1) === '1'); // 1XX can delete 7XX as well!
217
- const chainAsString = (0, _subfield6Utils.fieldsToNormalizedString)(chain, 0, normalizeOccurrenceNumber, normalizeTag);
218
- (0, _utils.nvdebug)(`markIdenticalSubfield6Chains: ${chainAsString}`);
219
- record.fields.forEach(f => compareWithChain(f)); // eslint-disable-line array-callback-return
220
-
141
+ const normalizeTag = chain.some((field) => field.tag.substring(0, 1) === "1");
142
+ const chainAsString = fieldsToNormalizedString(chain, 0, normalizeOccurrenceNumber, normalizeTag);
143
+ nvdebug(`markIdenticalSubfield6Chains: ${chainAsString}`);
144
+ record.fields.forEach((f) => compareWithChain(f));
221
145
  function compareWithChain(f) {
222
- (0, _utils.nvdebug)(`FIELD2CHAIN ${(0, _utils.fieldToString)(f)}`);
146
+ nvdebug(`FIELD2CHAIN ${fieldToString(f)}`);
223
147
  const otherChain = fieldToChain(f, record);
224
- // Not a lone field or chain (head) or ... or is-same-chain
225
148
  if (otherChain.length === 0 || sameField(chain[0], otherChain[0])) {
226
149
  return;
227
150
  }
228
- const otherChainAsString = (0, _subfield6Utils.fieldsToNormalizedString)(otherChain, 0, normalizeOccurrenceNumber, normalizeTag);
229
-
230
- // Mark other chain as deleted:
151
+ const otherChainAsString = fieldsToNormalizedString(otherChain, 0, normalizeOccurrenceNumber, normalizeTag);
231
152
  if (chainAsString === otherChainAsString) {
232
- otherChain.forEach(f => {
233
- (0, _utils.nvdebug)(` mark ${(0, _utils.fieldToString)(f)} as deleted ($6-chain)...`);
234
- f.deleted = 1;
153
+ otherChain.forEach((f2) => {
154
+ nvdebug(` mark ${fieldToString(f2)} as deleted ($6-chain)...`);
155
+ f2.deleted = 1;
235
156
  });
236
157
  return;
237
158
  }
@@ -241,81 +162,72 @@ function markIdenticalLoneFieldsAsDeletable(field, record) {
241
162
  if (field.deleted) {
242
163
  return;
243
164
  }
244
- // targetLinkingNumber = 0, normalizedOccurenceNumber = false, normalizeTag = true)
245
- const normalizeTag = field.tag.substring(0, 1) === '1'; // 1XX can delete 7XX as well!
246
- const fieldAsString = (0, _subfield6Utils.fieldToNormalizedString)(field, 0, false, normalizeTag);
247
- const identicalLoneFields = record.fields.filter(f => !sameField(f, field) && (0, _subfield6Utils.fieldToNormalizedString)(f, 0, false, normalizeTag) === fieldAsString);
248
-
249
- // Mark fields as deleted:
250
- identicalLoneFields.forEach(f => {
251
- (0, _utils.nvdebug)(` mark ${(0, _utils.fieldToString)(f)} as deleted (lone field)...`);
165
+ const normalizeTag = field.tag.substring(0, 1) === "1";
166
+ const fieldAsString = fieldToNormalizedString(field, 0, false, normalizeTag);
167
+ const identicalLoneFields = record.fields.filter((f) => !sameField(f, field) && fieldToNormalizedString(f, 0, false, normalizeTag) === fieldAsString);
168
+ identicalLoneFields.forEach((f) => {
169
+ nvdebug(` mark ${fieldToString(f)} as deleted (lone field)...`);
252
170
  f.deleted = 1;
253
171
  });
254
172
  }
255
173
  function acceptFieldsWithSubfield6(fieldsWithSubfield6) {
256
- // There can be only one non-880 field:
257
- const non880 = fieldsWithSubfield6.filter(f => f.tag !== '880');
174
+ const non880 = fieldsWithSubfield6.filter((f) => f.tag !== "880");
258
175
  if (non880.length > 1) {
259
176
  return false;
260
177
  }
261
- const occurrenceNumbers = (0, _subfield6Utils.fieldsGetOccurrenceNumbers)(fieldsWithSubfield6);
262
- // Chain can contain only single occurrence number:
178
+ const occurrenceNumbers = fieldsGetOccurrenceNumbers(fieldsWithSubfield6);
263
179
  if (occurrenceNumbers.length > 1) {
264
180
  return false;
265
181
  }
266
182
  return true;
267
183
  }
268
184
  function isSingleTagLinkingNumber(linkingNumber, fields, tag) {
269
- const relevantFields = fields.filter(f => (0, _subfield8Utils.fieldHasLinkingNumber)(f, linkingNumber));
270
- if (relevantFields.some(f => f.tag !== tag)) {
185
+ const relevantFields = fields.filter((f) => fieldHasLinkingNumber(f, linkingNumber));
186
+ if (relevantFields.some((f) => f.tag !== tag)) {
271
187
  return false;
272
188
  }
273
189
  return true;
274
190
  }
275
191
  function acceptFieldsWithSubfield8(fieldsWithSubfield8, requireSingleTag = false) {
276
- const linkingNumbers = (0, _subfield8Utils.fieldsGetAllSubfield8LinkingNumbers)(fieldsWithSubfield8);
277
- if (linkingNumbers.some(linkingNumber => anomaly8(linkingNumber))) {
192
+ const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fieldsWithSubfield8);
193
+ if (linkingNumbers.some((linkingNumber) => anomaly8(linkingNumber))) {
278
194
  return false;
279
195
  }
280
196
  return true;
281
-
282
- // If linking number
283
197
  function anomaly8(linkingNumber) {
284
- (0, _utils.nvdebug)(` Looking for anomalies in linkin number ${linkingNumber}`);
285
- const relevantFields = fieldsWithSubfield8.filter(f => (0, _subfield8Utils.fieldHasLinkingNumber)(f, linkingNumber));
198
+ nvdebug(` Looking for anomalies in linkin number ${linkingNumber}`);
199
+ const relevantFields = fieldsWithSubfield8.filter((f) => fieldHasLinkingNumber(f, linkingNumber));
286
200
  if (requireSingleTag) {
287
201
  return !isSingleTagLinkingNumber(linkingNumber, relevantFields, relevantFields[0].tag);
288
202
  }
289
- const f880 = relevantFields.filter(f => f.tag === '880');
203
+ const f880 = relevantFields.filter((f) => f.tag === "880");
290
204
  if (f880.length === 0 || f880.length === relevantFields.length) {
291
205
  return false;
292
206
  }
293
207
  return true;
294
208
  }
295
209
  }
296
- function sameField(field1, field2) {
210
+ export function sameField(field1, field2) {
297
211
  field1.tmpMyId = 666;
298
212
  const result = field2.tmpMyId === 666 ? true : false;
299
213
  delete field1.tmpMyId;
300
214
  return result;
301
215
  }
302
- function isChainHead(field, chain) {
216
+ export function isChainHead(field, chain) {
303
217
  return sameField(field, chain[0]);
304
218
  }
305
- function fieldToChain(field, record) {
219
+ export function fieldToChain(field, record) {
306
220
  if (field.deleted || !field.subfields) {
307
221
  return [];
308
222
  }
309
223
  const chain = newGetAllLinkedFields(field, record, true, true);
310
- (0, _utils.nvdebug)(` Chain contains ${chain.length} field(s)`);
224
+ nvdebug(` Chain contains ${chain.length} field(s)`);
311
225
  if (!isChainHead(field, chain)) {
312
- // newGetAllLinkedFields() marks relevant record.fields!
313
226
  return [];
314
227
  }
315
- const fieldsWithSubfield6 = chain.filter(f => (0, _subfield6Utils.fieldHasValidSubfield6)(f));
316
- // Hack: multiple $6 fields, but either all are non-880 or all are 880: treat field as a single entry
228
+ const fieldsWithSubfield6 = chain.filter((f) => fieldHasValidSubfield6(f));
317
229
  if (fieldsWithSubfield6.length > 0) {
318
- const non880 = fieldsWithSubfield6.filter(f => f.tag !== '880');
230
+ const non880 = fieldsWithSubfield6.filter((f) => f.tag !== "880");
319
231
  if (non880.length === 0 || non880.length === fieldsWithSubfield6.length) {
320
232
  return [field];
321
233
  }
@@ -324,74 +236,62 @@ function fieldToChain(field, record) {
324
236
  }
325
237
  }
326
238
  if (!acceptFieldsWithSubfield6(fieldsWithSubfield6)) {
327
- // Check tag subfield $6s are legal(ish)
328
239
  return [];
329
240
  }
330
- const fieldsWithSubfield8 = chain.filter(f => (0, _subfield8Utils.fieldHasValidSubfield8)(f));
241
+ const fieldsWithSubfield8 = chain.filter((f) => fieldHasValidSubfield8(f));
331
242
  if (!acceptFieldsWithSubfield8(fieldsWithSubfield8, false)) {
332
243
  return [];
333
244
  }
334
-
335
- //nvdebug(`Proceed with ${fieldsToString(chain)}`);
336
-
337
245
  return chain;
338
246
  }
339
247
  function fieldHandleDuplicateDatafields(field, record) {
340
248
  const chain = fieldToChain(field, record);
341
- (0, _utils.nvdebug)(` TRY TO HANDLE DUPLICATES OF '${(0, _utils.fieldsToString)(chain)}'`);
249
+ nvdebug(` TRY TO HANDLE DUPLICATES OF '${fieldsToString(chain)}'`);
342
250
  if (chain.length === 0) {
343
251
  return;
344
252
  }
345
- const fieldsWithSubfield6 = chain.filter(f => (0, _subfield6Utils.fieldHasValidSubfield6)(f));
346
- const fieldsWithSubfield8 = chain.filter(f => (0, _subfield8Utils.fieldHasValidSubfield8)(f));
347
-
348
- // Lone fields:
253
+ const fieldsWithSubfield6 = chain.filter((f) => fieldHasValidSubfield6(f));
254
+ const fieldsWithSubfield8 = chain.filter((f) => fieldHasValidSubfield8(f));
349
255
  if (chain.length === 1) {
350
256
  markIdenticalLoneFieldsAsDeletable(chain[0], record);
351
257
  return;
352
258
  }
353
259
  if (fieldsWithSubfield6.length === 0) {
354
260
  if (fieldsWithSubfield8.length === 0) {
355
- // chain.length === 1?
356
- (0, _utils.nvdebug)(` Trying to find duplicates of single field '${(0, _utils.fieldToString)(chain[0])}'`);
261
+ nvdebug(` Trying to find duplicates of single field '${fieldToString(chain[0])}'`);
357
262
  markIdenticalLoneFieldsAsDeletable(chain[0], record);
358
263
  return;
359
264
  }
360
- const linkingNumbers = (0, _subfield8Utils.fieldsGetAllSubfield8LinkingNumbers)(fieldsWithSubfield8);
265
+ const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fieldsWithSubfield8);
361
266
  if (linkingNumbers.length < 2) {
362
267
  markIdenticalSubfield6Chains(chain, record);
363
268
  return;
364
269
  }
365
270
  }
366
271
  if (fieldsWithSubfield6.length > 0 && acceptFieldsWithSubfield8(fieldsWithSubfield8, true)) {
367
- // Checks that non-880 tags are all same
368
- // Chain is removable
369
272
  markIdenticalSubfield6Chains(chain, record);
370
273
  return;
371
274
  }
372
- (0, _utils.nvdebug)(` NO HANDLER FOUND FOR '${(0, _utils.fieldsToString)(chain)}'`);
373
- (0, _utils.nvdebug)(` N8s: ${fieldsWithSubfield6.length}`);
275
+ nvdebug(` NO HANDLER FOUND FOR '${fieldsToString(chain)}'`);
276
+ nvdebug(` N8s: ${fieldsWithSubfield6.length}`);
374
277
  }
375
- function removeDuplicateDatafields(record, fix = true) {
376
- // Sometimes only $8 subfield (vs the whole field) is removed. Thus they are handled separately:
278
+ export function removeDuplicateDatafields(record, fix = true) {
377
279
  handleDuplicateSubfield8Chains(record, fix);
378
- const dataFields = record.fields.filter(f => f.subfields !== undefined);
379
- dataFields.forEach(f => fieldHandleDuplicateDatafields(f, record)); // eslint-disable-line array-callback-return
380
-
381
- const deletableFields = dataFields.filter(f => f.deleted);
382
- const modifiedFields = dataFields.filter(f => f.modified && !f.deleted);
383
- const result = deletableFields.map(f => `DEL: ${(0, _utils.fieldToString)(f)}`);
280
+ const dataFields = record.fields.filter((f) => f.subfields !== void 0);
281
+ dataFields.forEach((f) => fieldHandleDuplicateDatafields(f, record));
282
+ const deletableFields = dataFields.filter((f) => f.deleted);
283
+ const modifiedFields = dataFields.filter((f) => f.modified && !f.deleted);
284
+ const result = deletableFields.map((f) => `DEL: ${fieldToString(f)}`);
384
285
  if (modifiedFields.length) {
385
- modifiedFields.forEach(f => delete f.modified); // eslint-disable-line array-callback-return
386
- result.push(modifiedFields.map(f => `MOD: ${(0, _utils.fieldToString)(f)}`));
286
+ modifiedFields.forEach((f) => delete f.modified);
287
+ result.push(modifiedFields.map((f) => `MOD: ${fieldToString(f)}`));
387
288
  }
388
289
  if (fix) {
389
- deletableFields.forEach(f => record.removeField(f)); // eslint-disable-line array-callback-return
290
+ deletableFields.forEach((f) => record.removeField(f));
390
291
  return result;
391
292
  }
392
- deletableFields.forEach(f => delete f.deleted); // eslint-disable-line array-callback-return
393
- deletableFields.forEach(f => delete f.modified); // eslint-disable-line array-callback-return
394
-
293
+ deletableFields.forEach((f) => delete f.deleted);
294
+ deletableFields.forEach((f) => delete f.modified);
395
295
  return result;
396
296
  }
397
- //# sourceMappingURL=removeDuplicateDataFields.js.map
297
+ //# sourceMappingURL=removeDuplicateDataFields.js.map