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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (545) 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/indicator-fixes.js +3 -3
  338. package/src/{indicator-fixes.spec.js → indicator-fixes.test.js} +9 -12
  339. package/src/isbn-issn.js +1 -1
  340. package/src/{isbn-issn.spec.js → isbn-issn.test.js} +20 -22
  341. package/src/{item-language.spec.js → item-language.test.js} +21 -22
  342. package/src/merge-fields/controlSubfields.js +1 -1
  343. package/src/merge-fields/counterpartField.js +8 -9
  344. package/src/merge-fields/index.js +1 -1
  345. package/src/merge-fields/mergableIndicator.js +1 -1
  346. package/src/merge-fields/mergeField.js +6 -6
  347. package/src/merge-fields/mergeIndicator.js +1 -1
  348. package/src/merge-fields/mergeOrAddPostprocess.js +4 -4
  349. package/src/merge-fields/mergeOrAddSubfield.js +2 -2
  350. package/src/merge-fields/mergeSubfield.js +4 -4
  351. package/src/merge-fields/removeDuplicateSubfields.js +2 -2
  352. package/src/{merge-fields.spec.js → merge-fields.test.js} +12 -13
  353. package/src/{mergeField500Lisapainokset.spec.js → mergeField500Lisapainokset.test.js} +12 -13
  354. package/src/mergeRelatorTermFields.js +5 -7
  355. package/src/{mergeRelatorTermFields.spec.js → mergeRelatorTermFields.test.js} +12 -13
  356. package/src/modernize-502.js +1 -1
  357. package/src/{modernize-502.spec.js → modernize-502.test.js} +12 -13
  358. package/src/multiple-subfield-0.js +3 -3
  359. package/src/{multiple-subfield-0.spec.js → multiple-subfield-0.test.js} +13 -13
  360. package/src/{non-breaking-space.spec.js → non-breaking-space.test.js} +12 -13
  361. package/src/normalize-dashes.js +2 -2
  362. package/src/{normalize-dashes.spec.js → normalize-dashes.test.js} +12 -13
  363. package/src/normalize-identifiers.js +1 -1
  364. package/src/{normalize-identifiers.spec.js → normalize-identifiers.test.js} +12 -13
  365. package/src/normalize-qualifying-information.js +2 -2
  366. package/src/{normalize-qualifying-information.spec.js → normalize-qualifying-information.test.js} +12 -13
  367. package/src/normalize-utf8-diacritics.js +2 -2
  368. package/src/{normalize-utf8-diacritics.spec.js → normalize-utf8-diacritics.test.js} +13 -13
  369. package/src/normalizeFieldForComparison.js +6 -6
  370. package/src/normalizeSubfieldValueForComparison.js +1 -1
  371. package/src/prepublicationUtils.js +4 -4
  372. package/src/punctuation/index.js +1 -1
  373. package/src/punctuation/rules/index.js +2 -2
  374. package/src/{punctuation.spec.js → punctuation.test.js} +12 -13
  375. package/src/punctuation2.js +4 -4
  376. package/src/{punctuation2.spec.js → punctuation2.test.js} +12 -13
  377. package/src/reindexSubfield6OccurenceNumbers.js +5 -7
  378. package/src/{reindexSubfield6OccurenceNumbers.spec.js → reindexSubfield6OccurenceNumbers.test.js} +12 -13
  379. package/src/removeDuplicateDataFields.js +11 -19
  380. package/src/{removeDuplicateDataFields.spec.js → removeDuplicateDataFields.test.js} +12 -13
  381. package/src/removeInferiorDataFields.js +11 -11
  382. package/src/{removeInferiorDataFields.spec.js → removeInferiorDataFields.test.js} +13 -13
  383. package/src/resolvable-ext-references-melinda.js +1 -1
  384. package/src/{resolvable-ext-references-melinda.spec.js → resolvable-ext-references-melinda.test.js} +42 -27
  385. package/src/resolveOrphanedSubfield6s.js +5 -5
  386. package/src/{resolveOrphanedSubfield6s.spec.js → resolveOrphanedSubfield6s.test.js} +13 -13
  387. package/src/sanitize-vocabulary-source-codes.js +4 -4
  388. package/src/{sanitize-vocabulary-source-codes.spec.js → sanitize-vocabulary-source-codes.test.js} +16 -14
  389. package/src/{sort-tags.spec.js → sort-tags.test.js} +9 -11
  390. package/src/sortFields.js +4 -4
  391. package/src/{sortFields.spec.js → sortFields.test.js} +12 -13
  392. package/src/sortRelatorTerms.js +3 -3
  393. package/src/{sortRelatorTerms.spec.js → sortRelatorTerms.test.js} +13 -13
  394. package/src/sortSubfields.js +1 -1
  395. package/src/{sortSubfields.spec.js → sortSubfields.test.js} +13 -13
  396. package/src/stripPunctuation.js +3 -3
  397. package/src/{stripPunctuation.spec.js → stripPunctuation.test.js} +13 -13
  398. package/src/subfield-exclusion.js +1 -1
  399. package/src/{subfield-exclusion.spec.js → subfield-exclusion.test.js} +45 -36
  400. package/src/subfield6Utils.js +6 -10
  401. package/src/subfield8Utils.js +4 -4
  402. package/src/subfieldValueNormalizations.js +3 -3
  403. package/src/{subfieldValueNormalizations.spec.js → subfieldValueNormalizations.test.js} +18 -14
  404. package/src/sync-007-and-300.js +2 -2
  405. package/src/{sync-007-and-300.spec.js → sync-007-and-300.test.js} +13 -13
  406. package/src/translate-terms.js +3 -3
  407. package/src/{translate-terms.spec.js → translate-terms.test.js} +13 -13
  408. package/src/{typeOfDate-008.spec.js → typeOfDate-008.test.js} +12 -13
  409. package/src/{unicode-decomposition.spec.js → unicode-decomposition.test.js} +10 -16
  410. package/src/update-field-540.js +2 -2
  411. package/src/{update-field-540.spec.js → update-field-540.test.js} +13 -10
  412. package/src/urn.js +2 -2
  413. package/src/{urn.spec.js → urn.test.js} +12 -13
  414. package/src/utils.js +3 -3
  415. package/test-fixtures/field-505-separators/03/expectedResult.json +3 -1
  416. package/test-fixtures/field-505-separators/03/record.json +3 -0
  417. package/test-fixtures/normalize-subfield-value/01/metadata.json +4 -1
  418. package/test-fixtures/normalize-subfield-value/01/record.json +3 -0
  419. package/test-fixtures/normalize-subfield-value/02/expectedResult.json +3 -1
  420. package/test-fixtures/normalize-subfield-value/02/metadata.json +2 -1
  421. package/test-fixtures/normalize-subfield-value/02/record.json +3 -0
  422. package/test-fixtures/sanitize-vocabulary-source-codes/f03/expectedResult.json +3 -1
  423. package/test-fixtures/sanitize-vocabulary-source-codes/f04/expectedResult.json +3 -1
  424. package/test-fixtures/sanitize-vocabulary-source-codes/v04/metadata.json +1 -4
  425. package/test-fixtures/sanitize-vocabulary-source-codes/v04/record.json +1 -1
  426. package/dist/access-rights.spec.js +0 -195
  427. package/dist/access-rights.spec.js.map +0 -1
  428. package/dist/addMissingField041.spec.js +0 -45
  429. package/dist/addMissingField041.spec.js.map +0 -1
  430. package/dist/addMissingField336.spec.js +0 -45
  431. package/dist/addMissingField336.spec.js.map +0 -1
  432. package/dist/addMissingField337.spec.js +0 -43
  433. package/dist/addMissingField337.spec.js.map +0 -1
  434. package/dist/addMissingField338.spec.js +0 -45
  435. package/dist/addMissingField338.spec.js.map +0 -1
  436. package/dist/cyrillux-usemarcon-replacement.spec.js +0 -45
  437. package/dist/cyrillux-usemarcon-replacement.spec.js.map +0 -1
  438. package/dist/cyrillux.spec.js +0 -46
  439. package/dist/cyrillux.spec.js.map +0 -1
  440. package/dist/disambiguateSeriesStatements.spec.js +0 -51
  441. package/dist/disambiguateSeriesStatements.spec.js.map +0 -1
  442. package/dist/double-commas.spec.js +0 -73
  443. package/dist/double-commas.spec.js.map +0 -1
  444. package/dist/duplicates-ind1.spec.js +0 -45
  445. package/dist/duplicates-ind1.spec.js.map +0 -1
  446. package/dist/empty-fields.spec.js +0 -118
  447. package/dist/empty-fields.spec.js.map +0 -1
  448. package/dist/ending-punctuation.spec.js +0 -2654
  449. package/dist/ending-punctuation.spec.js.map +0 -1
  450. package/dist/ending-whitespace.spec.js +0 -42
  451. package/dist/ending-whitespace.spec.js.map +0 -1
  452. package/dist/field-008-18-34-character-groups.spec.js +0 -51
  453. package/dist/field-008-18-34-character-groups.spec.js.map +0 -1
  454. package/dist/field-505-separators.spec.js +0 -51
  455. package/dist/field-505-separators.spec.js.map +0 -1
  456. package/dist/field-521-fix.spec.js +0 -51
  457. package/dist/field-521-fix.spec.js.map +0 -1
  458. package/dist/field-exclusion.spec.js +0 -1054
  459. package/dist/field-exclusion.spec.js.map +0 -1
  460. package/dist/field-structure.spec.js +0 -535
  461. package/dist/field-structure.spec.js.map +0 -1
  462. package/dist/fields-present.spec.js +0 -121
  463. package/dist/fields-present.spec.js.map +0 -1
  464. package/dist/fix-33X.spec.js +0 -45
  465. package/dist/fix-33X.spec.js.map +0 -1
  466. package/dist/fix-country-codes.spec.js +0 -51
  467. package/dist/fix-country-codes.spec.js.map +0 -1
  468. package/dist/fix-language-codes.spec.js +0 -44
  469. package/dist/fix-language-codes.spec.js.map +0 -1
  470. package/dist/fixRelatorTerms.spec.js +0 -51
  471. package/dist/fixRelatorTerms.spec.js.map +0 -1
  472. package/dist/fixed-fields.spec.js +0 -140
  473. package/dist/fixed-fields.spec.js.map +0 -1
  474. package/dist/identical-fields.spec.js +0 -99
  475. package/dist/identical-fields.spec.js.map +0 -1
  476. package/dist/indicator-fixes.spec.js +0 -51
  477. package/dist/indicator-fixes.spec.js.map +0 -1
  478. package/dist/isbn-issn.spec.js +0 -595
  479. package/dist/isbn-issn.spec.js.map +0 -1
  480. package/dist/item-language.spec.js +0 -306
  481. package/dist/item-language.spec.js.map +0 -1
  482. package/dist/melindaCustomMergeFields.json +0 -5120
  483. package/dist/merge-fields.spec.js +0 -51
  484. package/dist/merge-fields.spec.js.map +0 -1
  485. package/dist/mergeField500Lisapainokset.spec.js +0 -51
  486. package/dist/mergeField500Lisapainokset.spec.js.map +0 -1
  487. package/dist/mergeRelatorTermFields.spec.js +0 -51
  488. package/dist/mergeRelatorTermFields.spec.js.map +0 -1
  489. package/dist/modernize-502.spec.js +0 -49
  490. package/dist/modernize-502.spec.js.map +0 -1
  491. package/dist/multiple-subfield-0.spec.js +0 -51
  492. package/dist/multiple-subfield-0.spec.js.map +0 -1
  493. package/dist/non-breaking-space.spec.js +0 -42
  494. package/dist/non-breaking-space.spec.js.map +0 -1
  495. package/dist/normalize-dashes.spec.js +0 -51
  496. package/dist/normalize-dashes.spec.js.map +0 -1
  497. package/dist/normalize-identifiers.spec.js +0 -51
  498. package/dist/normalize-identifiers.spec.js.map +0 -1
  499. package/dist/normalize-qualifying-information.spec.js +0 -51
  500. package/dist/normalize-qualifying-information.spec.js.map +0 -1
  501. package/dist/normalize-utf8-diacritics.spec.js +0 -51
  502. package/dist/normalize-utf8-diacritics.spec.js.map +0 -1
  503. package/dist/punctuation.spec.js +0 -51
  504. package/dist/punctuation.spec.js.map +0 -1
  505. package/dist/punctuation2.spec.js +0 -51
  506. package/dist/punctuation2.spec.js.map +0 -1
  507. package/dist/reindexSubfield6OccurenceNumbers.spec.js +0 -51
  508. package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +0 -1
  509. package/dist/removeDuplicateDataFields.spec.js +0 -51
  510. package/dist/removeDuplicateDataFields.spec.js.map +0 -1
  511. package/dist/removeInferiorDataFields.spec.js +0 -51
  512. package/dist/removeInferiorDataFields.spec.js.map +0 -1
  513. package/dist/resolvable-ext-references-melinda.spec.js +0 -166
  514. package/dist/resolvable-ext-references-melinda.spec.js.map +0 -1
  515. package/dist/resolveOrphanedSubfield6s.spec.js +0 -51
  516. package/dist/resolveOrphanedSubfield6s.spec.js.map +0 -1
  517. package/dist/sanitize-vocabulary-source-codes.spec.js +0 -51
  518. package/dist/sanitize-vocabulary-source-codes.spec.js.map +0 -1
  519. package/dist/sort-tags.spec.js +0 -207
  520. package/dist/sort-tags.spec.js.map +0 -1
  521. package/dist/sortFields.spec.js +0 -51
  522. package/dist/sortFields.spec.js.map +0 -1
  523. package/dist/sortRelatorTerms.spec.js +0 -51
  524. package/dist/sortRelatorTerms.spec.js.map +0 -1
  525. package/dist/sortSubfields.spec.js +0 -52
  526. package/dist/sortSubfields.spec.js.map +0 -1
  527. package/dist/stripPunctuation.spec.js +0 -51
  528. package/dist/stripPunctuation.spec.js.map +0 -1
  529. package/dist/subfield-exclusion.spec.js +0 -523
  530. package/dist/subfield-exclusion.spec.js.map +0 -1
  531. package/dist/subfieldValueNormalizations.spec.js +0 -51
  532. package/dist/subfieldValueNormalizations.spec.js.map +0 -1
  533. package/dist/sync-007-and-300.spec.js +0 -51
  534. package/dist/sync-007-and-300.spec.js.map +0 -1
  535. package/dist/translate-terms.spec.js +0 -51
  536. package/dist/translate-terms.spec.js.map +0 -1
  537. package/dist/typeOfDate-008.spec.js +0 -47
  538. package/dist/typeOfDate-008.spec.js.map +0 -1
  539. package/dist/unicode-decomposition.spec.js +0 -91
  540. package/dist/unicode-decomposition.spec.js.map +0 -1
  541. package/dist/update-field-540.spec.js +0 -51
  542. package/dist/update-field-540.spec.js.map +0 -1
  543. package/dist/urn.spec.js +0 -52
  544. package/dist/urn.spec.js.map +0 -1
  545. package/src/cyrillux-usemarcon-replacement.spec.js +0 -47
@@ -1,72 +1,43 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.mergeIndicators = mergeIndicators;
7
- var _debug = _interopRequireDefault(require("debug"));
8
- var _utils = require("../utils");
9
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
- // Specs: https://workgroups.helsinki.fi/x/K1ohCw (though we occasionally differ from them)...
11
-
12
- const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda:merge-fields:mergeIndicator');
13
- //const debugData = debug.extend('data');
14
- const debugDev = debug.extend('dev');
15
- const ind1NonFilingChars = ['130', '630', '730', '740'];
16
- const ind2NonFilingChars = ['222', '240', '242', '243', '245', '830'];
17
- function mergeIndicators(toField, fromField, config) {
18
- // NB! For non-filing indicators we deem that bigger is better. This is a bit quick'n'dirty, as usual.
19
- // We could and should checks the relevant article length (using language information whilst doing it).
20
- // However, this is a task for record internal fixer, not merge.
21
- //
22
- // For other indicators the situation is trickier, as we don't know which one is the good value.
23
- //
24
- // NB! We could add fixes for various other indicator types as well. However, it gets quickly pretty ad hoc.
25
- // nvdebug(fieldToString(toField), debugDev);
26
- // nvdebug(fieldToString(fromField), debugDev);
27
-
1
+ import createDebugLogger from "debug";
2
+ import { fieldToString, marc21GetTagsLegalInd1Value, marc21GetTagsLegalInd2Value, nvdebug } from "../utils.js";
3
+ const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda:merge-fields:mergeIndicator");
4
+ const debugDev = debug.extend("dev");
5
+ const ind1NonFilingChars = ["130", "630", "730", "740"];
6
+ const ind2NonFilingChars = ["222", "240", "242", "243", "245", "830"];
7
+ export function mergeIndicators(toField, fromField, config) {
28
8
  mergeIndicator1(toField, fromField, config);
29
9
  mergeIndicator2(toField, fromField, config);
30
- function getIndicatorPreferredValues(tag, indicatorNumber, config) {
31
- const cands = getIndicatorPreferredValuesForGivenTag(tag, indicatorNumber, config);
32
- // More complex systems where multiple indicators have same priority are objects.
33
- // Example: field 506 might return {"0": 1, "1": 1, " ": 2}
34
- // Here indicator values '0' and '1' share top priority 1, and '#' is of lesser importance, namely 2.
35
- if (Array.isArray(cands) || typeof cands === 'object') {
10
+ function getIndicatorPreferredValues(tag, indicatorNumber, config2) {
11
+ const cands = getIndicatorPreferredValuesForGivenTag(tag, indicatorNumber, config2);
12
+ if (Array.isArray(cands) || typeof cands === "object") {
36
13
  return cands;
37
14
  }
38
- if (typeof cands === 'string') {
39
- // single cand as string (seen in json in the past), though now they should all be arrays
40
- return cands.split('');
15
+ if (typeof cands === "string") {
16
+ return cands.split("");
41
17
  }
42
18
  return [];
43
- function getIndicatorPreferredValuesForGivenTag(tag, indicatorNumber, config) {
44
- const preferredValues = indicatorNumber === 1 ? config.indicator1PreferredValues : config.indicator2PreferredValues;
45
- (0, _utils.nvdebug)(`${tag} IND${indicatorNumber}: get preferred values...\nCONFIG: ${JSON.stringify(config)}`, debugDev);
19
+ function getIndicatorPreferredValuesForGivenTag(tag2, indicatorNumber2, config3) {
20
+ const preferredValues = indicatorNumber2 === 1 ? config3.indicator1PreferredValues : config3.indicator2PreferredValues;
21
+ nvdebug(`${tag2} IND${indicatorNumber2}: get preferred values...
22
+ CONFIG: ${JSON.stringify(config3)}`, debugDev);
46
23
  if (preferredValues) {
47
- //nvdebug(`${tag} PREF VALS: ${JSON.stringify(preferredValues)}`, debugDev);
48
- if (tag in preferredValues) {
49
- return preferredValues[tag];
24
+ if (tag2 in preferredValues) {
25
+ return preferredValues[tag2];
50
26
  }
51
27
  }
52
-
53
- // Easter Egg #1: Use good-ish hard-coded defaults as not defined by user:
54
- if (indicatorNumber === 1 && ind1NonFilingChars.includes(tag)) {
55
- return '9876543210 ';
28
+ if (indicatorNumber2 === 1 && ind1NonFilingChars.includes(tag2)) {
29
+ return "9876543210 ";
56
30
  }
57
- if (indicatorNumber === 2 && ind2NonFilingChars.includes(tag)) {
58
- return '9876543210 ';
31
+ if (indicatorNumber2 === 2 && ind2NonFilingChars.includes(tag2)) {
32
+ return "9876543210 ";
59
33
  }
60
-
61
- // Easter Egg #2: Marc21 standard has just one value for given indicator, so prefer it:
62
- const cands = indicatorNumber === 1 ? (0, _utils.marc21GetTagsLegalInd1Value)(tag) : (0, _utils.marc21GetTagsLegalInd2Value)(tag);
63
- if (cands) {
64
- if (typeof cands === 'string' && cands.length === 1) {
65
- // single cand
66
- return [cands];
34
+ const cands2 = indicatorNumber2 === 1 ? marc21GetTagsLegalInd1Value(tag2) : marc21GetTagsLegalInd2Value(tag2);
35
+ if (cands2) {
36
+ if (typeof cands2 === "string" && cands2.length === 1) {
37
+ return [cands2];
67
38
  }
68
- if (Array.isArray(cands) && cands.length === 1) {
69
- return cands;
39
+ if (Array.isArray(cands2) && cands2.length === 1) {
40
+ return cands2;
70
41
  }
71
42
  }
72
43
  return [];
@@ -76,96 +47,71 @@ function mergeIndicators(toField, fromField, config) {
76
47
  const i1 = scoreValue(preferences, val1);
77
48
  const i2 = scoreValue(preferences, val2);
78
49
  if (i1 === -1) {
79
- return i2 === -1 ? undefined : val2;
50
+ return i2 === -1 ? void 0 : val2;
80
51
  }
81
52
  if (i2 === -1) {
82
53
  return val1;
83
54
  }
84
- // The sooner, the better:
85
55
  return i1 < i2 ? val1 : val2;
86
- function scoreValue(preferences, val) {
87
- if (Array.isArray(preferences)) {
88
- return preferences.indexOf(val);
56
+ function scoreValue(preferences2, val) {
57
+ if (Array.isArray(preferences2)) {
58
+ return preferences2.indexOf(val);
89
59
  }
90
- // preferences may be an object, since diffent values can return same score
91
- // (eg. 506 ind1 values '0' and '1' are equal but better than '#')
92
- if (!(val in preferences)) {
60
+ if (!(val in preferences2)) {
93
61
  return -1;
94
62
  }
95
- return preferences[val];
63
+ return preferences2[val];
96
64
  }
97
65
  }
98
66
  function fieldIsFenniKept(field) {
99
- return field.subfields && field.subfields.some(sf => sf.code === '9' && sf.value === 'FENNI<KEEP>');
67
+ return field.subfields && field.subfields.some((sf) => sf.code === "9" && sf.value === "FENNI<KEEP>");
100
68
  }
101
- function mergeIndicator1(toField, fromField, config) {
102
- if (toField.ind1 === fromField.ind1) {
103
- return; // Do nothing
69
+ function mergeIndicator1(toField2, fromField2, config2) {
70
+ if (toField2.ind1 === fromField2.ind1) {
71
+ return;
104
72
  }
105
-
106
- // MRA-300: If source contains the (un)holy $9 FENNI<KEEP>, we prefer that value regardless of whatever...
107
- if (!fieldIsFenniKept(toField) && fieldIsFenniKept(fromField)) {
108
- toField.ind1 = fromField.ind1;
73
+ if (!fieldIsFenniKept(toField2) && fieldIsFenniKept(fromField2)) {
74
+ toField2.ind1 = fromField2.ind1;
109
75
  return;
110
76
  }
111
- const preferredValues = getIndicatorPreferredValues(toField.tag, 1, config);
77
+ const preferredValues = getIndicatorPreferredValues(toField2.tag, 1, config2);
112
78
  if (preferredValues) {
113
- //nvdebug(`Try to merge indicator 1: '${toField.ind1}' vs '${fromField.ind1}'`, debugDev);
114
- //nvdebug(`PREF VALS: ${preferredValues}`, debugDev);
115
- const preferredValue = getPreferredValue(preferredValues, fromField.ind1, toField.ind1);
116
- if (typeof preferredValue !== 'undefined') {
117
- //nvdebug(`${preferredValue} WINS!`, debugDev);
118
- toField.ind1 = preferredValue;
79
+ const preferredValue = getPreferredValue(preferredValues, fromField2.ind1, toField2.ind1);
80
+ if (typeof preferredValue !== "undefined") {
81
+ toField2.ind1 = preferredValue;
119
82
  return;
120
83
  }
121
- //nvdebug(`No winner found indicator 1: '${toField.ind1}' vs '${fromField.ind1}', keep '${toField.ind1}'`, debugDev);
122
- //return;
123
84
  }
124
- //nvdebug(`TAG '${toField.tag}': No rule to merge indicator 1: '${toField.ind1}' vs '${fromField.ind1}', keep '${toField.ind1}'`, debugDev);
125
85
  }
126
- function publisherTagSwapHack(toField, fromField) {
127
- // NB! Note that field 264.ind2==3 maps to $efg in field 260, so it is not relevant *here*:
128
- // (Not sure whether our ind2 sanity check list should contain '4' (copyright year) as well:)
129
- if (toField.tag !== '260' || fromField.tag !== '264' || !['0', '1', '2'].includes(fromField.ind2)) {
86
+ function publisherTagSwapHack(toField2, fromField2) {
87
+ if (toField2.tag !== "260" || fromField2.tag !== "264" || !["0", "1", "2"].includes(fromField2.ind2)) {
130
88
  return;
131
89
  }
132
- // Field 264 IND2 contains information that can not be coded into field 260.
133
-
134
- // However, 260 contains data that cannot be converted to 264 as well
135
- if (toField.subfields.some(sf => ['e', 'f', 'g'].includes(sf.code))) {
136
- (0, _utils.nvdebug)(`WARNING: can not change base 260 to 264 as it contains $e, $f and/or $g. Source IND2 info lost.`, debugDev);
137
- (0, _utils.nvdebug)(` ${(0, _utils.fieldToString)(toField)}\n ${(0, _utils.fieldToString)(fromField)}`, debugDev);
90
+ if (toField2.subfields.some((sf) => ["e", "f", "g"].includes(sf.code))) {
91
+ nvdebug(`WARNING: can not change base 260 to 264 as it contains $e, $f and/or $g. Source IND2 info lost.`, debugDev);
92
+ nvdebug(` ${fieldToString(toField2)}
93
+ ${fieldToString(fromField2)}`, debugDev);
138
94
  return;
139
95
  }
140
-
141
- // Convert 260 to 264 so that no information is lost:
142
- (0, _utils.nvdebug)(`Apply base 260->264 tag swap hack`, debugDev);
143
- (0, _utils.nvdebug)(` ${(0, _utils.fieldToString)(toField)}\n ${(0, _utils.fieldToString)(fromField)}`, debugDev);
144
- toField.tag = '264';
145
- toField.ind2 = fromField.ind2;
96
+ nvdebug(`Apply base 260->264 tag swap hack`, debugDev);
97
+ nvdebug(` ${fieldToString(toField2)}
98
+ ${fieldToString(fromField2)}`, debugDev);
99
+ toField2.tag = "264";
100
+ toField2.ind2 = fromField2.ind2;
146
101
  }
147
- function mergeIndicator2(toField, fromField, config) {
148
- if (toField.ind2 === fromField.ind2) {
149
- return; // Do nothing
102
+ function mergeIndicator2(toField2, fromField2, config2) {
103
+ if (toField2.ind2 === fromField2.ind2) {
104
+ return;
150
105
  }
151
-
152
- //nvdebug(`Merge IND2`, debugDev);
153
- //nvdebug(` ${fieldToString(toField)}\n ${fieldToString(fromField)}`, debugDev);
154
-
155
- publisherTagSwapHack(toField, fromField); // Easter egg/hack for base-260 vs source-264
156
-
157
- // If source contains $9 FENNI<KEEP>, we might prefer it?
158
-
159
- //nvdebug(`Try to merge indicator 2: '${toField.ind2}' vs '${fromField.ind2}'`, debugDev);
160
- const preferredValues = getIndicatorPreferredValues(toField.tag, 2, config);
106
+ publisherTagSwapHack(toField2, fromField2);
107
+ const preferredValues = getIndicatorPreferredValues(toField2.tag, 2, config2);
161
108
  if (preferredValues) {
162
- //nvdebug(` Try to merge indicator 2. Got preferred values '${preferredValues}'`, debugDev);
163
- const preferredValue = getPreferredValue(preferredValues, fromField.ind2, toField.ind2);
164
- if (typeof preferredValue !== 'undefined') {
165
- toField.ind2 = preferredValue;
109
+ const preferredValue = getPreferredValue(preferredValues, fromField2.ind2, toField2.ind2);
110
+ if (typeof preferredValue !== "undefined") {
111
+ toField2.ind2 = preferredValue;
166
112
  return;
167
113
  }
168
114
  }
169
115
  }
170
116
  }
171
- //# sourceMappingURL=mergeIndicator.js.map
117
+ //# sourceMappingURL=mergeIndicator.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"mergeIndicator.js","names":["_debug","_interopRequireDefault","require","_utils","e","__esModule","default","debug","createDebugLogger","debugDev","extend","ind1NonFilingChars","ind2NonFilingChars","mergeIndicators","toField","fromField","config","mergeIndicator1","mergeIndicator2","getIndicatorPreferredValues","tag","indicatorNumber","cands","getIndicatorPreferredValuesForGivenTag","Array","isArray","split","preferredValues","indicator1PreferredValues","indicator2PreferredValues","nvdebug","JSON","stringify","includes","marc21GetTagsLegalInd1Value","marc21GetTagsLegalInd2Value","length","getPreferredValue","preferences","val1","val2","i1","scoreValue","i2","undefined","val","indexOf","fieldIsFenniKept","field","subfields","some","sf","code","value","ind1","preferredValue","publisherTagSwapHack","ind2","fieldToString"],"sources":["../../src/merge-fields/mergeIndicator.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldToString, marc21GetTagsLegalInd1Value, marc21GetTagsLegalInd2Value, nvdebug} from '../utils';\n\n// Specs: https://workgroups.helsinki.fi/x/K1ohCw (though we occasionally differ from them)...\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:merge-fields:mergeIndicator');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst ind1NonFilingChars = ['130', '630', '730', '740'];\nconst ind2NonFilingChars = ['222', '240', '242', '243', '245', '830'];\n\n\nexport function mergeIndicators(toField, fromField, config) {\n // NB! For non-filing indicators we deem that bigger is better. This is a bit quick'n'dirty, as usual.\n // We could and should checks the relevant article length (using language information whilst doing it).\n // However, this is a task for record internal fixer, not merge.\n //\n // For other indicators the situation is trickier, as we don't know which one is the good value.\n //\n // NB! We could add fixes for various other indicator types as well. However, it gets quickly pretty ad hoc.\n // nvdebug(fieldToString(toField), debugDev);\n // nvdebug(fieldToString(fromField), debugDev);\n\n mergeIndicator1(toField, fromField, config);\n mergeIndicator2(toField, fromField, config);\n\n function getIndicatorPreferredValues(tag, indicatorNumber, config) {\n const cands = getIndicatorPreferredValuesForGivenTag(tag, indicatorNumber, config);\n // More complex systems where multiple indicators have same priority are objects.\n // Example: field 506 might return {\"0\": 1, \"1\": 1, \" \": 2}\n // Here indicator values '0' and '1' share top priority 1, and '#' is of lesser importance, namely 2.\n if (Array.isArray(cands) || typeof cands === 'object') {\n return cands;\n }\n if (typeof cands === 'string') { // single cand as string (seen in json in the past), though now they should all be arrays\n return cands.split('');\n }\n\n return [];\n\n function getIndicatorPreferredValuesForGivenTag(tag, indicatorNumber, config) {\n const preferredValues = indicatorNumber === 1 ? config.indicator1PreferredValues : config.indicator2PreferredValues;\n nvdebug(`${tag} IND${indicatorNumber}: get preferred values...\\nCONFIG: ${JSON.stringify(config)}`, debugDev);\n if (preferredValues) {\n //nvdebug(`${tag} PREF VALS: ${JSON.stringify(preferredValues)}`, debugDev);\n if (tag in preferredValues) {\n return preferredValues[tag];\n }\n }\n\n // Easter Egg #1: Use good-ish hard-coded defaults as not defined by user:\n if (indicatorNumber === 1 && ind1NonFilingChars.includes(tag)) {\n return '9876543210 ';\n }\n if (indicatorNumber === 2 && ind2NonFilingChars.includes(tag)) {\n return '9876543210 ';\n }\n\n // Easter Egg #2: Marc21 standard has just one value for given indicator, so prefer it:\n const cands = indicatorNumber === 1 ? marc21GetTagsLegalInd1Value(tag) : marc21GetTagsLegalInd2Value(tag);\n if (cands) {\n if (typeof cands === 'string' && cands.length === 1) { // single cand\n return [cands];\n }\n if (Array.isArray(cands) && cands.length === 1) {\n return cands;\n }\n }\n\n return [];\n }\n }\n\n function getPreferredValue(preferences, val1, val2) {\n const i1 = scoreValue(preferences, val1);\n const i2 = scoreValue(preferences, val2);\n if (i1 === -1) {\n return i2 === -1 ? undefined : val2;\n }\n if (i2 === -1) {\n return val1;\n }\n // The sooner, the better:\n return i1 < i2 ? val1 : val2;\n\n function scoreValue(preferences, val) {\n if (Array.isArray(preferences)) {\n return preferences.indexOf(val);\n }\n // preferences may be an object, since diffent values can return same score\n // (eg. 506 ind1 values '0' and '1' are equal but better than '#')\n if (!(val in preferences)) {\n return -1;\n }\n return preferences[val];\n }\n }\n\n\n function fieldIsFenniKept(field) {\n return field.subfields && field.subfields.some(sf => sf.code === '9' && sf.value === 'FENNI<KEEP>');\n }\n\n function mergeIndicator1(toField, fromField, config) {\n if (toField.ind1 === fromField.ind1) {\n return; // Do nothing\n }\n\n // MRA-300: If source contains the (un)holy $9 FENNI<KEEP>, we prefer that value regardless of whatever...\n if (!fieldIsFenniKept(toField) && fieldIsFenniKept(fromField)) {\n toField.ind1 = fromField.ind1;\n return;\n }\n\n\n const preferredValues = getIndicatorPreferredValues(toField.tag, 1, config);\n\n if (preferredValues) {\n //nvdebug(`Try to merge indicator 1: '${toField.ind1}' vs '${fromField.ind1}'`, debugDev);\n //nvdebug(`PREF VALS: ${preferredValues}`, debugDev);\n const preferredValue = getPreferredValue(preferredValues, fromField.ind1, toField.ind1);\n if (typeof preferredValue !== 'undefined') {\n //nvdebug(`${preferredValue} WINS!`, debugDev);\n toField.ind1 = preferredValue;\n return;\n }\n //nvdebug(`No winner found indicator 1: '${toField.ind1}' vs '${fromField.ind1}', keep '${toField.ind1}'`, debugDev);\n //return;\n }\n //nvdebug(`TAG '${toField.tag}': No rule to merge indicator 1: '${toField.ind1}' vs '${fromField.ind1}', keep '${toField.ind1}'`, debugDev);\n }\n\n\n function publisherTagSwapHack(toField, fromField) {\n // NB! Note that field 264.ind2==3 maps to $efg in field 260, so it is not relevant *here*:\n // (Not sure whether our ind2 sanity check list should contain '4' (copyright year) as well:)\n if (toField.tag !== '260' || fromField.tag !== '264' || !['0', '1', '2'].includes(fromField.ind2)) {\n return;\n }\n // Field 264 IND2 contains information that can not be coded into field 260.\n\n // However, 260 contains data that cannot be converted to 264 as well\n if (toField.subfields.some(sf => ['e', 'f', 'g'].includes(sf.code))) {\n nvdebug(`WARNING: can not change base 260 to 264 as it contains $e, $f and/or $g. Source IND2 info lost.`, debugDev);\n nvdebug(` ${fieldToString(toField)}\\n ${fieldToString(fromField)}`, debugDev);\n return;\n }\n\n // Convert 260 to 264 so that no information is lost:\n nvdebug(`Apply base 260->264 tag swap hack`, debugDev);\n nvdebug(` ${fieldToString(toField)}\\n ${fieldToString(fromField)}`, debugDev);\n\n toField.tag = '264';\n toField.ind2 = fromField.ind2;\n }\n\n function mergeIndicator2(toField, fromField, config) {\n if (toField.ind2 === fromField.ind2) {\n return; // Do nothing\n }\n\n //nvdebug(`Merge IND2`, debugDev);\n //nvdebug(` ${fieldToString(toField)}\\n ${fieldToString(fromField)}`, debugDev);\n\n\n publisherTagSwapHack(toField, fromField); // Easter egg/hack for base-260 vs source-264\n\n // If source contains $9 FENNI<KEEP>, we might prefer it?\n\n //nvdebug(`Try to merge indicator 2: '${toField.ind2}' vs '${fromField.ind2}'`, debugDev);\n const preferredValues = getIndicatorPreferredValues(toField.tag, 2, config);\n\n if (preferredValues) {\n //nvdebug(` Try to merge indicator 2. Got preferred values '${preferredValues}'`, debugDev);\n const preferredValue = getPreferredValue(preferredValues, fromField.ind2, toField.ind2);\n if (typeof preferredValue !== 'undefined') {\n toField.ind2 = preferredValue;\n return;\n }\n }\n\n }\n\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/merge-fields/mergeIndicator.js"],
4
+ "sourcesContent": ["import createDebugLogger from 'debug';\nimport {fieldToString, marc21GetTagsLegalInd1Value, marc21GetTagsLegalInd2Value, nvdebug} from '../utils.js';\n\n// Specs: https://workgroups.helsinki.fi/x/K1ohCw (though we occasionally differ from them)...\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:merge-fields:mergeIndicator');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst ind1NonFilingChars = ['130', '630', '730', '740'];\nconst ind2NonFilingChars = ['222', '240', '242', '243', '245', '830'];\n\n\nexport function mergeIndicators(toField, fromField, config) {\n // NB! For non-filing indicators we deem that bigger is better. This is a bit quick'n'dirty, as usual.\n // We could and should checks the relevant article length (using language information whilst doing it).\n // However, this is a task for record internal fixer, not merge.\n //\n // For other indicators the situation is trickier, as we don't know which one is the good value.\n //\n // NB! We could add fixes for various other indicator types as well. However, it gets quickly pretty ad hoc.\n // nvdebug(fieldToString(toField), debugDev);\n // nvdebug(fieldToString(fromField), debugDev);\n\n mergeIndicator1(toField, fromField, config);\n mergeIndicator2(toField, fromField, config);\n\n function getIndicatorPreferredValues(tag, indicatorNumber, config) {\n const cands = getIndicatorPreferredValuesForGivenTag(tag, indicatorNumber, config);\n // More complex systems where multiple indicators have same priority are objects.\n // Example: field 506 might return {\"0\": 1, \"1\": 1, \" \": 2}\n // Here indicator values '0' and '1' share top priority 1, and '#' is of lesser importance, namely 2.\n if (Array.isArray(cands) || typeof cands === 'object') {\n return cands;\n }\n if (typeof cands === 'string') { // single cand as string (seen in json in the past), though now they should all be arrays\n return cands.split('');\n }\n\n return [];\n\n function getIndicatorPreferredValuesForGivenTag(tag, indicatorNumber, config) {\n const preferredValues = indicatorNumber === 1 ? config.indicator1PreferredValues : config.indicator2PreferredValues;\n nvdebug(`${tag} IND${indicatorNumber}: get preferred values...\\nCONFIG: ${JSON.stringify(config)}`, debugDev);\n if (preferredValues) {\n //nvdebug(`${tag} PREF VALS: ${JSON.stringify(preferredValues)}`, debugDev);\n if (tag in preferredValues) {\n return preferredValues[tag];\n }\n }\n\n // Easter Egg #1: Use good-ish hard-coded defaults as not defined by user:\n if (indicatorNumber === 1 && ind1NonFilingChars.includes(tag)) {\n return '9876543210 ';\n }\n if (indicatorNumber === 2 && ind2NonFilingChars.includes(tag)) {\n return '9876543210 ';\n }\n\n // Easter Egg #2: Marc21 standard has just one value for given indicator, so prefer it:\n const cands = indicatorNumber === 1 ? marc21GetTagsLegalInd1Value(tag) : marc21GetTagsLegalInd2Value(tag);\n if (cands) {\n if (typeof cands === 'string' && cands.length === 1) { // single cand\n return [cands];\n }\n if (Array.isArray(cands) && cands.length === 1) {\n return cands;\n }\n }\n\n return [];\n }\n }\n\n function getPreferredValue(preferences, val1, val2) {\n const i1 = scoreValue(preferences, val1);\n const i2 = scoreValue(preferences, val2);\n if (i1 === -1) {\n return i2 === -1 ? undefined : val2;\n }\n if (i2 === -1) {\n return val1;\n }\n // The sooner, the better:\n return i1 < i2 ? val1 : val2;\n\n function scoreValue(preferences, val) {\n if (Array.isArray(preferences)) {\n return preferences.indexOf(val);\n }\n // preferences may be an object, since diffent values can return same score\n // (eg. 506 ind1 values '0' and '1' are equal but better than '#')\n if (!(val in preferences)) {\n return -1;\n }\n return preferences[val];\n }\n }\n\n\n function fieldIsFenniKept(field) {\n return field.subfields && field.subfields.some(sf => sf.code === '9' && sf.value === 'FENNI<KEEP>');\n }\n\n function mergeIndicator1(toField, fromField, config) {\n if (toField.ind1 === fromField.ind1) {\n return; // Do nothing\n }\n\n // MRA-300: If source contains the (un)holy $9 FENNI<KEEP>, we prefer that value regardless of whatever...\n if (!fieldIsFenniKept(toField) && fieldIsFenniKept(fromField)) {\n toField.ind1 = fromField.ind1;\n return;\n }\n\n\n const preferredValues = getIndicatorPreferredValues(toField.tag, 1, config);\n\n if (preferredValues) {\n //nvdebug(`Try to merge indicator 1: '${toField.ind1}' vs '${fromField.ind1}'`, debugDev);\n //nvdebug(`PREF VALS: ${preferredValues}`, debugDev);\n const preferredValue = getPreferredValue(preferredValues, fromField.ind1, toField.ind1);\n if (typeof preferredValue !== 'undefined') {\n //nvdebug(`${preferredValue} WINS!`, debugDev);\n toField.ind1 = preferredValue;\n return;\n }\n //nvdebug(`No winner found indicator 1: '${toField.ind1}' vs '${fromField.ind1}', keep '${toField.ind1}'`, debugDev);\n //return;\n }\n //nvdebug(`TAG '${toField.tag}': No rule to merge indicator 1: '${toField.ind1}' vs '${fromField.ind1}', keep '${toField.ind1}'`, debugDev);\n }\n\n\n function publisherTagSwapHack(toField, fromField) {\n // NB! Note that field 264.ind2==3 maps to $efg in field 260, so it is not relevant *here*:\n // (Not sure whether our ind2 sanity check list should contain '4' (copyright year) as well:)\n if (toField.tag !== '260' || fromField.tag !== '264' || !['0', '1', '2'].includes(fromField.ind2)) {\n return;\n }\n // Field 264 IND2 contains information that can not be coded into field 260.\n\n // However, 260 contains data that cannot be converted to 264 as well\n if (toField.subfields.some(sf => ['e', 'f', 'g'].includes(sf.code))) {\n nvdebug(`WARNING: can not change base 260 to 264 as it contains $e, $f and/or $g. Source IND2 info lost.`, debugDev);\n nvdebug(` ${fieldToString(toField)}\\n ${fieldToString(fromField)}`, debugDev);\n return;\n }\n\n // Convert 260 to 264 so that no information is lost:\n nvdebug(`Apply base 260->264 tag swap hack`, debugDev);\n nvdebug(` ${fieldToString(toField)}\\n ${fieldToString(fromField)}`, debugDev);\n\n toField.tag = '264';\n toField.ind2 = fromField.ind2;\n }\n\n function mergeIndicator2(toField, fromField, config) {\n if (toField.ind2 === fromField.ind2) {\n return; // Do nothing\n }\n\n //nvdebug(`Merge IND2`, debugDev);\n //nvdebug(` ${fieldToString(toField)}\\n ${fieldToString(fromField)}`, debugDev);\n\n\n publisherTagSwapHack(toField, fromField); // Easter egg/hack for base-260 vs source-264\n\n // If source contains $9 FENNI<KEEP>, we might prefer it?\n\n //nvdebug(`Try to merge indicator 2: '${toField.ind2}' vs '${fromField.ind2}'`, debugDev);\n const preferredValues = getIndicatorPreferredValues(toField.tag, 2, config);\n\n if (preferredValues) {\n //nvdebug(` Try to merge indicator 2. Got preferred values '${preferredValues}'`, debugDev);\n const preferredValue = getPreferredValue(preferredValues, fromField.ind2, toField.ind2);\n if (typeof preferredValue !== 'undefined') {\n toField.ind2 = preferredValue;\n return;\n }\n }\n\n }\n\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["config", "tag", "indicatorNumber", "cands", "preferences", "toField", "fromField"]
7
+ }
@@ -1,32 +1,15 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.postprocessRecords = postprocessRecords;
7
- var _punctuation = require("../punctuation2");
8
- var _removeDuplicateSubfields = require("./removeDuplicateSubfields");
9
- var _sortSubfields = require("../sortSubfields");
10
- var _sortRelatorTerms = require("../sortRelatorTerms");
11
- // This field should be renamed, as it is called also from outside megre.
12
-
13
- //import {MarcRecord} from '@natlibfi/marc-record';
14
-
1
+ import { fieldFixPunctuation } from "../punctuation2.js";
2
+ import { fieldRemoveDuplicateSubfields } from "./removeDuplicateSubfields.js";
3
+ import { sortAdjacentSubfields } from "../sortSubfields.js";
4
+ import { sortAdjacentRelatorTerms } from "../sortRelatorTerms.js";
15
5
  function postprocessBaseRecord(base) {
16
- base.fields.forEach(field => {
17
- // NB! Relator terms are now expanded and translated already at preprocess stage!
18
-
19
- // remove merge-specific information:
6
+ base.fields.forEach((field) => {
20
7
  if (field.merged) {
21
- // Field level ideas about things that could be done here:
22
- // - Fix indicators?
23
- // Record level fixes should be implemented as validators/fixers
24
- // in marc-record-validators-melinda and ust called from here.
25
- (0, _removeDuplicateSubfields.fieldRemoveDuplicateSubfields)(field);
26
- (0, _punctuation.fieldFixPunctuation)(field); // NB! This will fix only fields with merged content
27
- (0, _sortSubfields.sortAdjacentSubfields)(field); // Put the added $e subfield to proper places.
28
- (0, _sortRelatorTerms.sortAdjacentRelatorTerms)(field); // Sort $e subfields with each other
29
- (0, _punctuation.fieldFixPunctuation)(field);
8
+ fieldRemoveDuplicateSubfields(field);
9
+ fieldFixPunctuation(field);
10
+ sortAdjacentSubfields(field);
11
+ sortAdjacentRelatorTerms(field);
12
+ fieldFixPunctuation(field);
30
13
  delete field.merged;
31
14
  }
32
15
  if (field.useExternalEndPunctuation) {
@@ -35,20 +18,13 @@ function postprocessBaseRecord(base) {
35
18
  if (field.added) {
36
19
  delete field.added;
37
20
  }
38
-
39
- /*
40
- if (field.deleted) {
41
- delete field.deleted;
42
- }
43
- */
44
21
  });
45
22
  }
46
23
  function removeDeletedFields(record) {
47
- // remove fields that are marked as deleted:
48
- record.fields = record.fields.filter(f => !f.deleted);
24
+ record.fields = record.fields.filter((f) => !f.deleted);
49
25
  }
50
- function postprocessRecords(base, source) {
26
+ export function postprocessRecords(base, source) {
51
27
  postprocessBaseRecord(base);
52
- removeDeletedFields(source); // So that we may know what was used, and what not.
28
+ removeDeletedFields(source);
53
29
  }
54
- //# sourceMappingURL=mergeOrAddPostprocess.js.map
30
+ //# sourceMappingURL=mergeOrAddPostprocess.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"mergeOrAddPostprocess.js","names":["_punctuation","require","_removeDuplicateSubfields","_sortSubfields","_sortRelatorTerms","postprocessBaseRecord","base","fields","forEach","field","merged","fieldRemoveDuplicateSubfields","fieldFixPunctuation","sortAdjacentSubfields","sortAdjacentRelatorTerms","useExternalEndPunctuation","added","removeDeletedFields","record","filter","f","deleted","postprocessRecords","source"],"sources":["../../src/merge-fields/mergeOrAddPostprocess.js"],"sourcesContent":["// This field should be renamed, as it is called also from outside megre.\n\n//import {MarcRecord} from '@natlibfi/marc-record';\nimport {fieldFixPunctuation} from '../punctuation2';\nimport {fieldRemoveDuplicateSubfields} from './removeDuplicateSubfields';\nimport {sortAdjacentSubfields} from '../sortSubfields';\nimport {sortAdjacentRelatorTerms} from '../sortRelatorTerms';\n\nfunction postprocessBaseRecord(base) {\n\n base.fields.forEach(field => {\n // NB! Relator terms are now expanded and translated already at preprocess stage!\n\n // remove merge-specific information:\n if (field.merged) {\n // Field level ideas about things that could be done here:\n // - Fix indicators?\n // Record level fixes should be implemented as validators/fixers\n // in marc-record-validators-melinda and ust called from here.\n fieldRemoveDuplicateSubfields(field);\n fieldFixPunctuation(field); // NB! This will fix only fields with merged content\n sortAdjacentSubfields(field); // Put the added $e subfield to proper places.\n sortAdjacentRelatorTerms(field); // Sort $e subfields with each other\n fieldFixPunctuation(field);\n\n delete field.merged;\n }\n\n if (field.useExternalEndPunctuation) {\n delete field.useExternalEndPunctuation;\n }\n\n if (field.added) {\n delete field.added;\n }\n\n /*\n if (field.deleted) {\n delete field.deleted;\n }\n*/\n\n });\n}\n\n\nfunction removeDeletedFields(record) {\n // remove fields that are marked as deleted:\n record.fields = record.fields.filter(f => !f.deleted);\n}\n\n\nexport function postprocessRecords(base, source) {\n postprocessBaseRecord(base);\n removeDeletedFields(source); // So that we may know what was used, and what not.\n}\n"],"mappings":";;;;;;AAGA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,yBAAA,GAAAD,OAAA;AACA,IAAAE,cAAA,GAAAF,OAAA;AACA,IAAAG,iBAAA,GAAAH,OAAA;AANA;;AAEA;;AAMA,SAASI,qBAAqBA,CAACC,IAAI,EAAE;EAEnCA,IAAI,CAACC,MAAM,CAACC,OAAO,CAACC,KAAK,IAAI;IAC3B;;IAEA;IACA,IAAIA,KAAK,CAACC,MAAM,EAAE;MAChB;MACA;MACA;MACA;MACA,IAAAC,uDAA6B,EAACF,KAAK,CAAC;MACpC,IAAAG,gCAAmB,EAACH,KAAK,CAAC,CAAC,CAAC;MAC5B,IAAAI,oCAAqB,EAACJ,KAAK,CAAC,CAAC,CAAC;MAC9B,IAAAK,0CAAwB,EAACL,KAAK,CAAC,CAAC,CAAC;MACjC,IAAAG,gCAAmB,EAACH,KAAK,CAAC;MAE1B,OAAOA,KAAK,CAACC,MAAM;IACrB;IAEA,IAAID,KAAK,CAACM,yBAAyB,EAAE;MACnC,OAAON,KAAK,CAACM,yBAAyB;IACxC;IAEA,IAAIN,KAAK,CAACO,KAAK,EAAE;MACf,OAAOP,KAAK,CAACO,KAAK;IACpB;;IAEA;AACJ;AACA;AACA;AACA;EAEE,CAAC,CAAC;AACJ;AAGA,SAASC,mBAAmBA,CAACC,MAAM,EAAE;EACnC;EACAA,MAAM,CAACX,MAAM,GAAGW,MAAM,CAACX,MAAM,CAACY,MAAM,CAACC,CAAC,IAAI,CAACA,CAAC,CAACC,OAAO,CAAC;AACvD;AAGO,SAASC,kBAAkBA,CAAChB,IAAI,EAAEiB,MAAM,EAAE;EAC/ClB,qBAAqB,CAACC,IAAI,CAAC;EAC3BW,mBAAmB,CAACM,MAAM,CAAC,CAAC,CAAC;AAC/B","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/merge-fields/mergeOrAddPostprocess.js"],
4
+ "sourcesContent": ["// This field should be renamed, as it is called also from outside megre.\n\n//import {MarcRecord} from '@natlibfi/marc-record';\nimport {fieldFixPunctuation} from '../punctuation2.js';\nimport {fieldRemoveDuplicateSubfields} from './removeDuplicateSubfields.js';\nimport {sortAdjacentSubfields} from '../sortSubfields.js';\nimport {sortAdjacentRelatorTerms} from '../sortRelatorTerms.js';\n\nfunction postprocessBaseRecord(base) {\n\n base.fields.forEach(field => {\n // NB! Relator terms are now expanded and translated already at preprocess stage!\n\n // remove merge-specific information:\n if (field.merged) {\n // Field level ideas about things that could be done here:\n // - Fix indicators?\n // Record level fixes should be implemented as validators/fixers\n // in marc-record-validators-melinda and ust called from here.\n fieldRemoveDuplicateSubfields(field);\n fieldFixPunctuation(field); // NB! This will fix only fields with merged content\n sortAdjacentSubfields(field); // Put the added $e subfield to proper places.\n sortAdjacentRelatorTerms(field); // Sort $e subfields with each other\n fieldFixPunctuation(field);\n\n delete field.merged;\n }\n\n if (field.useExternalEndPunctuation) {\n delete field.useExternalEndPunctuation;\n }\n\n if (field.added) {\n delete field.added;\n }\n\n /*\n if (field.deleted) {\n delete field.deleted;\n }\n*/\n\n });\n}\n\n\nfunction removeDeletedFields(record) {\n // remove fields that are marked as deleted:\n record.fields = record.fields.filter(f => !f.deleted);\n}\n\n\nexport function postprocessRecords(base, source) {\n postprocessBaseRecord(base);\n removeDeletedFields(source); // So that we may know what was used, and what not.\n}\n"],
5
+ "mappings": "AAGA,SAAQ,2BAA0B;AAClC,SAAQ,qCAAoC;AAC5C,SAAQ,6BAA4B;AACpC,SAAQ,gCAA+B;AAEvC,SAAS,sBAAsB,MAAM;AAEnC,OAAK,OAAO,QAAQ,WAAS;AAI3B,QAAI,MAAM,QAAQ;AAKhB,oCAA8B,KAAK;AACnC,0BAAoB,KAAK;AACzB,4BAAsB,KAAK;AAC3B,+BAAyB,KAAK;AAC9B,0BAAoB,KAAK;AAEzB,aAAO,MAAM;AAAA,IACf;AAEA,QAAI,MAAM,2BAA2B;AACnC,aAAO,MAAM;AAAA,IACf;AAEA,QAAI,MAAM,OAAO;AACf,aAAO,MAAM;AAAA,IACf;AAAA,EAQF,CAAC;AACH;AAGA,SAAS,oBAAoB,QAAQ;AAEnC,SAAO,SAAS,OAAO,OAAO,OAAO,OAAK,CAAC,EAAE,OAAO;AACtD;AAGO,gBAAS,mBAAmB,MAAM,QAAQ;AAC/C,wBAAsB,IAAI;AAC1B,sBAAoB,MAAM;AAC5B;",
6
+ "names": []
7
+ }