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

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 (563) hide show
  1. package/.github/workflows/{melinda-node-tests.yml → melinda-node-tests-and-publish.yml} +37 -12
  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 +43 -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 +873 -769
  47. package/dist/ending-punctuation-conf.js.map +7 -1
  48. package/dist/ending-punctuation.js +156 -169
  49. package/dist/ending-punctuation.js.map +7 -1
  50. package/dist/ending-punctuation.test.js +2385 -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 +182 -413
  107. package/dist/index.js.map +7 -1
  108. package/dist/indicator-fixes.js +66 -94
  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 +71 -128
  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 +187 -379
  125. package/dist/merge-fields/counterpartField.js.map +7 -1
  126. package/dist/merge-fields/dataProvenance.js +29 -0
  127. package/dist/merge-fields/dataProvenance.js.map +7 -0
  128. package/dist/merge-fields/index.js +25 -50
  129. package/dist/merge-fields/index.js.map +7 -1
  130. package/dist/merge-fields/mergableIndicator.js +18 -51
  131. package/dist/merge-fields/mergableIndicator.js.map +7 -1
  132. package/dist/merge-fields/mergableTag.js +78 -30
  133. package/dist/merge-fields/mergableTag.js.map +7 -1
  134. package/dist/merge-fields/mergeConfig.js +66 -171
  135. package/dist/merge-fields/mergeConfig.js.map +7 -1
  136. package/dist/merge-fields/mergeConstraints.js +323 -1214
  137. package/dist/merge-fields/mergeConstraints.js.map +7 -1
  138. package/dist/merge-fields/mergeField.js +47 -111
  139. package/dist/merge-fields/mergeField.js.map +7 -1
  140. package/dist/merge-fields/mergeIndicator.js +64 -118
  141. package/dist/merge-fields/mergeIndicator.js.map +7 -1
  142. package/dist/merge-fields/mergeOrAddPostprocess.js +14 -38
  143. package/dist/merge-fields/mergeOrAddPostprocess.js.map +7 -1
  144. package/dist/merge-fields/mergeOrAddSubfield.js +62 -104
  145. package/dist/merge-fields/mergeOrAddSubfield.js.map +7 -1
  146. package/dist/merge-fields/mergeSubfield.js +47 -95
  147. package/dist/merge-fields/mergeSubfield.js.map +7 -1
  148. package/dist/merge-fields/removeDuplicateSubfields.js +18 -31
  149. package/dist/merge-fields/removeDuplicateSubfields.js.map +7 -1
  150. package/dist/merge-fields/worldKnowledge.js +15 -40
  151. package/dist/merge-fields/worldKnowledge.js.map +7 -1
  152. package/dist/merge-fields.test.js +46 -0
  153. package/dist/merge-fields.test.js.map +7 -0
  154. package/dist/mergeField500Lisapainokset.js +27 -56
  155. package/dist/mergeField500Lisapainokset.js.map +7 -1
  156. package/dist/mergeField500Lisapainokset.test.js +44 -0
  157. package/dist/mergeField500Lisapainokset.test.js.map +7 -0
  158. package/dist/mergeRelatorTermFields.js +33 -69
  159. package/dist/mergeRelatorTermFields.js.map +7 -1
  160. package/dist/mergeRelatorTermFields.test.js +44 -0
  161. package/dist/mergeRelatorTermFields.test.js.map +7 -0
  162. package/dist/modernize-502.js +23 -55
  163. package/dist/modernize-502.js.map +7 -1
  164. package/dist/modernize-502.test.js +38 -0
  165. package/dist/modernize-502.test.js.map +7 -0
  166. package/dist/multiple-subfield-0.js +23 -48
  167. package/dist/multiple-subfield-0.js.map +7 -1
  168. package/dist/multiple-subfield-0.test.js +44 -0
  169. package/dist/multiple-subfield-0.test.js.map +7 -0
  170. package/dist/non-breaking-space.js +11 -32
  171. package/dist/non-breaking-space.js.map +7 -1
  172. package/dist/non-breaking-space.test.js +38 -0
  173. package/dist/non-breaking-space.test.js.map +7 -0
  174. package/dist/normalize-dashes.js +18 -37
  175. package/dist/normalize-dashes.js.map +7 -1
  176. package/dist/normalize-dashes.test.js +44 -0
  177. package/dist/normalize-dashes.test.js.map +7 -0
  178. package/dist/normalize-identifiers.js +54 -140
  179. package/dist/normalize-identifiers.js.map +7 -1
  180. package/dist/normalize-identifiers.test.js +44 -0
  181. package/dist/normalize-identifiers.test.js.map +7 -0
  182. package/dist/normalize-qualifying-information.js +23 -48
  183. package/dist/normalize-qualifying-information.js.map +7 -1
  184. package/dist/normalize-qualifying-information.test.js +44 -0
  185. package/dist/normalize-qualifying-information.test.js.map +7 -0
  186. package/dist/normalize-utf8-diacritics.js +19 -105
  187. package/dist/normalize-utf8-diacritics.js.map +7 -1
  188. package/dist/normalize-utf8-diacritics.test.js +44 -0
  189. package/dist/normalize-utf8-diacritics.test.js.map +7 -0
  190. package/dist/normalizeFieldForComparison.js +91 -158
  191. package/dist/normalizeFieldForComparison.js.map +7 -1
  192. package/dist/normalizeSubfieldValueForComparison.js +37 -77
  193. package/dist/normalizeSubfieldValueForComparison.js.map +7 -1
  194. package/dist/prepublicationUtils.js +58 -111
  195. package/dist/prepublicationUtils.js.map +7 -1
  196. package/dist/punctuation/index.js +56 -72
  197. package/dist/punctuation/index.js.map +7 -1
  198. package/dist/punctuation/rules/aut.js +372 -331
  199. package/dist/punctuation/rules/aut.js.map +7 -1
  200. package/dist/punctuation/rules/bib.js +420 -373
  201. package/dist/punctuation/rules/bib.js.map +7 -1
  202. package/dist/punctuation/rules/index.js +7 -21
  203. package/dist/punctuation/rules/index.js.map +7 -1
  204. package/dist/punctuation.test.js +44 -0
  205. package/dist/punctuation.test.js.map +7 -0
  206. package/dist/punctuation2.js +259 -802
  207. package/dist/punctuation2.js.map +7 -1
  208. package/dist/punctuation2.test.js +44 -0
  209. package/dist/punctuation2.test.js.map +7 -0
  210. package/dist/reindexSubfield6OccurenceNumbers.js +61 -96
  211. package/dist/reindexSubfield6OccurenceNumbers.js.map +7 -1
  212. package/dist/reindexSubfield6OccurenceNumbers.test.js +44 -0
  213. package/dist/reindexSubfield6OccurenceNumbers.test.js.map +7 -0
  214. package/dist/removeDuplicateDataFields.js +102 -202
  215. package/dist/removeDuplicateDataFields.js.map +7 -1
  216. package/dist/removeDuplicateDataFields.test.js +44 -0
  217. package/dist/removeDuplicateDataFields.test.js.map +7 -0
  218. package/dist/removeInferiorDataFields.js +104 -227
  219. package/dist/removeInferiorDataFields.js.map +7 -1
  220. package/dist/removeInferiorDataFields.test.js +44 -0
  221. package/dist/removeInferiorDataFields.test.js.map +7 -0
  222. package/dist/resolvable-ext-references-melinda.js +25 -60
  223. package/dist/resolvable-ext-references-melinda.js.map +7 -1
  224. package/dist/resolvable-ext-references-melinda.test.js +160 -0
  225. package/dist/resolvable-ext-references-melinda.test.js.map +7 -0
  226. package/dist/resolveOrphanedSubfield6s.js +32 -63
  227. package/dist/resolveOrphanedSubfield6s.js.map +7 -1
  228. package/dist/resolveOrphanedSubfield6s.test.js +44 -0
  229. package/dist/resolveOrphanedSubfield6s.test.js.map +7 -0
  230. package/dist/sanitize-vocabulary-source-codes.js +27 -55
  231. package/dist/sanitize-vocabulary-source-codes.js.map +7 -1
  232. package/dist/sanitize-vocabulary-source-codes.test.js +45 -0
  233. package/dist/sanitize-vocabulary-source-codes.test.js.map +7 -0
  234. package/dist/sort-tags.js +13 -25
  235. package/dist/sort-tags.js.map +7 -1
  236. package/dist/sort-tags.test.js +261 -0
  237. package/dist/sort-tags.test.js.map +7 -0
  238. package/dist/sortFields.js +152 -222
  239. package/dist/sortFields.js.map +7 -1
  240. package/dist/sortFields.test.js +44 -0
  241. package/dist/sortFields.test.js.map +7 -0
  242. package/dist/sortRelatorTerms.js +30 -68
  243. package/dist/sortRelatorTerms.js.map +7 -1
  244. package/dist/sortRelatorTerms.test.js +44 -0
  245. package/dist/sortRelatorTerms.test.js.map +7 -0
  246. package/dist/sortSubfields.js +102 -255
  247. package/dist/sortSubfields.js.map +7 -1
  248. package/dist/sortSubfields.test.js +44 -0
  249. package/dist/sortSubfields.test.js.map +7 -0
  250. package/dist/stripPunctuation.js +13 -36
  251. package/dist/stripPunctuation.js.map +7 -1
  252. package/dist/stripPunctuation.test.js +44 -0
  253. package/dist/stripPunctuation.test.js.map +7 -0
  254. package/dist/subfield-exclusion.js +28 -75
  255. package/dist/subfield-exclusion.js.map +7 -1
  256. package/dist/subfield-exclusion.test.js +471 -0
  257. package/dist/subfield-exclusion.test.js.map +7 -0
  258. package/dist/subfield6Utils.js +107 -269
  259. package/dist/subfield6Utils.js.map +7 -1
  260. package/dist/subfield8Utils.js +26 -50
  261. package/dist/subfield8Utils.js.map +7 -1
  262. package/dist/subfieldValueNormalizations.js +40 -74
  263. package/dist/subfieldValueNormalizations.js.map +7 -1
  264. package/dist/subfieldValueNormalizations.test.js +45 -0
  265. package/dist/subfieldValueNormalizations.test.js.map +7 -0
  266. package/dist/sync-007-and-300.js +22 -53
  267. package/dist/sync-007-and-300.js.map +7 -1
  268. package/dist/sync-007-and-300.test.js +44 -0
  269. package/dist/sync-007-and-300.test.js.map +7 -0
  270. package/dist/translate-terms.js +67 -155
  271. package/dist/translate-terms.js.map +7 -1
  272. package/dist/translate-terms.test.js +54 -0
  273. package/dist/translate-terms.test.js.map +7 -0
  274. package/dist/typeOfDate-008.js +10 -25
  275. package/dist/typeOfDate-008.js.map +7 -1
  276. package/dist/typeOfDate-008.test.js +40 -0
  277. package/dist/typeOfDate-008.test.js.map +7 -0
  278. package/dist/unicode-decomposition.js +94 -107
  279. package/dist/unicode-decomposition.js.map +7 -1
  280. package/dist/unicode-decomposition.test.js +94 -0
  281. package/dist/unicode-decomposition.test.js.map +7 -0
  282. package/dist/update-field-540.js +30 -75
  283. package/dist/update-field-540.js.map +7 -1
  284. package/dist/update-field-540.test.js +44 -0
  285. package/dist/update-field-540.test.js.map +7 -0
  286. package/dist/urn.js +55 -128
  287. package/dist/urn.js.map +7 -1
  288. package/dist/urn.test.js +44 -0
  289. package/dist/urn.test.js.map +7 -0
  290. package/dist/utils.js +78 -126
  291. package/dist/utils.js.map +7 -1
  292. package/eslint.config.mjs +1 -2
  293. package/package.json +28 -101
  294. package/src/access-rights.js +1 -1
  295. package/src/{access-rights.spec.js → access-rights.test.js} +9 -10
  296. package/src/addMissingField041.js +1 -1
  297. package/src/{addMissingField336.spec.js → addMissingField041.test.js} +13 -14
  298. package/src/addMissingField336.js +3 -3
  299. package/src/{addMissingField041.spec.js → addMissingField336.test.js} +13 -14
  300. package/src/addMissingField337.js +2 -2
  301. package/src/{addMissingField337.spec.js → addMissingField337.test.js} +13 -14
  302. package/src/addMissingField338.js +2 -2
  303. package/src/{addMissingField338.spec.js → addMissingField338.test.js} +13 -14
  304. package/src/cyrillux-usemarcon-replacement.js +18 -18
  305. package/src/{cyrillux-usemarcon-replacement.spec.js → cyrillux-usemarcon-replacement.test.js} +17 -14
  306. package/src/cyrillux.js +19 -12
  307. package/src/{cyrillux.spec.js → cyrillux.test.js} +13 -14
  308. package/src/disambiguateSeriesStatements.js +2 -2
  309. package/src/{disambiguateSeriesStatements.spec.js → disambiguateSeriesStatements.test.js} +12 -13
  310. package/src/double-commas.js +1 -1
  311. package/src/{double-commas.spec.js → double-commas.test.js} +9 -11
  312. package/src/duplicates-ind1.js +1 -1
  313. package/src/{duplicates-ind1.spec.js → duplicates-ind1.test.js} +12 -13
  314. package/src/{empty-fields.spec.js → empty-fields.test.js} +11 -13
  315. package/src/ending-punctuation-conf.js +6 -5
  316. package/src/ending-punctuation.js +115 -24
  317. package/src/{ending-punctuation.spec.js → ending-punctuation.test.js} +357 -275
  318. package/src/{ending-whitespace.spec.js → ending-whitespace.test.js} +12 -13
  319. package/src/field-008-18-34-character-groups.js +2 -2
  320. package/src/{field-008-18-34-character-groups.spec.js → field-008-18-34-character-groups.test.js} +13 -13
  321. package/src/field-505-separators.js +3 -3
  322. package/src/{field-505-separators.spec.js → field-505-separators.test.js} +16 -14
  323. package/src/field-521-fix.js +2 -2
  324. package/src/{field-521-fix.spec.js → field-521-fix.test.js} +12 -13
  325. package/src/field-exclusion.js +1 -1
  326. package/src/{field-exclusion.spec.js → field-exclusion.test.js} +60 -57
  327. package/src/{field-structure.spec.js → field-structure.test.js} +29 -29
  328. package/src/{fields-present.spec.js → fields-present.test.js} +12 -15
  329. package/src/fix-33X.js +4 -4
  330. package/src/{fix-33X.spec.js → fix-33X.test.js} +13 -14
  331. package/src/fix-country-codes.js +1 -1
  332. package/src/{fix-country-codes.spec.js → fix-country-codes.test.js} +12 -13
  333. package/src/fix-language-codes.js +5 -5
  334. package/src/{fix-language-codes.spec.js → fix-language-codes.test.js} +12 -13
  335. package/src/fixRelatorTerms.js +5 -5
  336. package/src/{fixRelatorTerms.spec.js → fixRelatorTerms.test.js} +13 -13
  337. package/src/{fixed-fields.spec.js → fixed-fields.test.js} +11 -14
  338. package/src/identical-fields.js +1 -1
  339. package/src/{identical-fields.spec.js → identical-fields.test.js} +9 -11
  340. package/src/index.js +132 -59
  341. package/src/indicator-fixes.js +17 -4
  342. package/src/{indicator-fixes.spec.js → indicator-fixes.test.js} +9 -12
  343. package/src/isbn-issn.js +12 -7
  344. package/src/{isbn-issn.spec.js → isbn-issn.test.js} +20 -22
  345. package/src/{item-language.spec.js → item-language.test.js} +21 -22
  346. package/src/melindaCustomMergeFields.js +1 -1
  347. package/src/merge-fields/controlSubfields.js +1 -1
  348. package/src/merge-fields/counterpartField.js +14 -9
  349. package/src/merge-fields/dataProvenance.js +41 -0
  350. package/src/merge-fields/index.js +12 -3
  351. package/src/merge-fields/mergableIndicator.js +1 -1
  352. package/src/merge-fields/mergeField.js +8 -8
  353. package/src/merge-fields/mergeIndicator.js +1 -1
  354. package/src/merge-fields/mergeOrAddPostprocess.js +4 -4
  355. package/src/merge-fields/mergeOrAddSubfield.js +2 -2
  356. package/src/merge-fields/mergeSubfield.js +4 -4
  357. package/src/merge-fields/removeDuplicateSubfields.js +2 -2
  358. package/src/{merge-fields.spec.js → merge-fields.test.js} +18 -15
  359. package/src/mergeField500Lisapainokset.js +1 -1
  360. package/src/{mergeField500Lisapainokset.spec.js → mergeField500Lisapainokset.test.js} +12 -13
  361. package/src/mergeRelatorTermFields.js +5 -7
  362. package/src/{mergeRelatorTermFields.spec.js → mergeRelatorTermFields.test.js} +12 -13
  363. package/src/modernize-502.js +1 -1
  364. package/src/{modernize-502.spec.js → modernize-502.test.js} +12 -13
  365. package/src/multiple-subfield-0.js +3 -3
  366. package/src/{multiple-subfield-0.spec.js → multiple-subfield-0.test.js} +13 -13
  367. package/src/{non-breaking-space.spec.js → non-breaking-space.test.js} +12 -13
  368. package/src/normalize-dashes.js +2 -2
  369. package/src/{normalize-dashes.spec.js → normalize-dashes.test.js} +12 -13
  370. package/src/normalize-identifiers.js +1 -1
  371. package/src/{normalize-identifiers.spec.js → normalize-identifiers.test.js} +12 -13
  372. package/src/normalize-qualifying-information.js +2 -2
  373. package/src/{normalize-qualifying-information.spec.js → normalize-qualifying-information.test.js} +12 -13
  374. package/src/normalize-utf8-diacritics.js +2 -2
  375. package/src/{normalize-utf8-diacritics.spec.js → normalize-utf8-diacritics.test.js} +13 -13
  376. package/src/normalizeFieldForComparison.js +32 -6
  377. package/src/normalizeSubfieldValueForComparison.js +1 -1
  378. package/src/prepublicationUtils.js +4 -4
  379. package/src/punctuation/index.js +1 -1
  380. package/src/punctuation/rules/index.js +2 -2
  381. package/src/{punctuation.spec.js → punctuation.test.js} +12 -13
  382. package/src/punctuation2.js +17 -8
  383. package/src/{punctuation2.spec.js → punctuation2.test.js} +12 -13
  384. package/src/reindexSubfield6OccurenceNumbers.js +5 -7
  385. package/src/{reindexSubfield6OccurenceNumbers.spec.js → reindexSubfield6OccurenceNumbers.test.js} +12 -13
  386. package/src/removeDuplicateDataFields.js +11 -19
  387. package/src/{removeDuplicateDataFields.spec.js → removeDuplicateDataFields.test.js} +12 -13
  388. package/src/removeInferiorDataFields.js +15 -12
  389. package/src/{removeInferiorDataFields.spec.js → removeInferiorDataFields.test.js} +13 -13
  390. package/src/resolvable-ext-references-melinda.js +1 -1
  391. package/src/{resolvable-ext-references-melinda.spec.js → resolvable-ext-references-melinda.test.js} +42 -27
  392. package/src/resolveOrphanedSubfield6s.js +6 -6
  393. package/src/{resolveOrphanedSubfield6s.spec.js → resolveOrphanedSubfield6s.test.js} +13 -13
  394. package/src/sanitize-vocabulary-source-codes.js +4 -4
  395. package/src/{sanitize-vocabulary-source-codes.spec.js → sanitize-vocabulary-source-codes.test.js} +16 -14
  396. package/src/{sort-tags.spec.js → sort-tags.test.js} +9 -11
  397. package/src/sortFields.js +4 -4
  398. package/src/{sortFields.spec.js → sortFields.test.js} +12 -13
  399. package/src/sortRelatorTerms.js +3 -3
  400. package/src/{sortRelatorTerms.spec.js → sortRelatorTerms.test.js} +13 -13
  401. package/src/sortSubfields.js +8 -6
  402. package/src/{sortSubfields.spec.js → sortSubfields.test.js} +13 -13
  403. package/src/stripPunctuation.js +3 -3
  404. package/src/{stripPunctuation.spec.js → stripPunctuation.test.js} +13 -13
  405. package/src/subfield-exclusion.js +1 -1
  406. package/src/{subfield-exclusion.spec.js → subfield-exclusion.test.js} +45 -36
  407. package/src/subfield6Utils.js +6 -10
  408. package/src/subfield8Utils.js +4 -4
  409. package/src/subfieldValueNormalizations.js +3 -3
  410. package/src/{subfieldValueNormalizations.spec.js → subfieldValueNormalizations.test.js} +18 -14
  411. package/src/sync-007-and-300.js +2 -2
  412. package/src/{sync-007-and-300.spec.js → sync-007-and-300.test.js} +13 -13
  413. package/src/translate-terms.js +3 -3
  414. package/src/translate-terms.test.js +75 -0
  415. package/src/{typeOfDate-008.spec.js → typeOfDate-008.test.js} +12 -13
  416. package/src/{unicode-decomposition.spec.js → unicode-decomposition.test.js} +10 -16
  417. package/src/update-field-540.js +2 -2
  418. package/src/{update-field-540.spec.js → update-field-540.test.js} +13 -10
  419. package/src/urn.js +2 -2
  420. package/src/{urn.spec.js → urn.test.js} +12 -13
  421. package/src/utils.js +21 -5
  422. package/test-fixtures/field-505-separators/03/expectedResult.json +3 -1
  423. package/test-fixtures/field-505-separators/03/record.json +3 -0
  424. package/test-fixtures/indicator-fixes/10/expectedResult.json +11 -0
  425. package/test-fixtures/indicator-fixes/10/metadata.json +4 -0
  426. package/test-fixtures/indicator-fixes/10/record.json +11 -0
  427. package/test-fixtures/merge-fields/f05/expectedResult.json +24 -0
  428. package/test-fixtures/merge-fields/f05/metadata.json +6 -0
  429. package/test-fixtures/merge-fields/f05/record.json +30 -0
  430. package/test-fixtures/normalize-subfield-value/01/metadata.json +4 -1
  431. package/test-fixtures/normalize-subfield-value/01/record.json +3 -0
  432. package/test-fixtures/normalize-subfield-value/02/expectedResult.json +3 -1
  433. package/test-fixtures/normalize-subfield-value/02/metadata.json +2 -1
  434. package/test-fixtures/normalize-subfield-value/02/record.json +3 -0
  435. package/test-fixtures/remove-inferior-datafields/f16/expectedResult.json +12 -0
  436. package/test-fixtures/remove-inferior-datafields/f16/metadata.json +5 -0
  437. package/test-fixtures/remove-inferior-datafields/f16/record.json +14 -0
  438. package/test-fixtures/sanitize-vocabulary-source-codes/f03/expectedResult.json +3 -1
  439. package/test-fixtures/sanitize-vocabulary-source-codes/f04/expectedResult.json +3 -1
  440. package/test-fixtures/sanitize-vocabulary-source-codes/v04/metadata.json +1 -4
  441. package/test-fixtures/sanitize-vocabulary-source-codes/v04/record.json +1 -1
  442. package/test-fixtures/translate-terms-data.js +42 -0
  443. package/dist/access-rights.spec.js +0 -195
  444. package/dist/access-rights.spec.js.map +0 -1
  445. package/dist/addMissingField041.spec.js +0 -45
  446. package/dist/addMissingField041.spec.js.map +0 -1
  447. package/dist/addMissingField336.spec.js +0 -45
  448. package/dist/addMissingField336.spec.js.map +0 -1
  449. package/dist/addMissingField337.spec.js +0 -43
  450. package/dist/addMissingField337.spec.js.map +0 -1
  451. package/dist/addMissingField338.spec.js +0 -45
  452. package/dist/addMissingField338.spec.js.map +0 -1
  453. package/dist/cyrillux-usemarcon-replacement.spec.js +0 -45
  454. package/dist/cyrillux-usemarcon-replacement.spec.js.map +0 -1
  455. package/dist/cyrillux.spec.js +0 -46
  456. package/dist/cyrillux.spec.js.map +0 -1
  457. package/dist/disambiguateSeriesStatements.spec.js +0 -51
  458. package/dist/disambiguateSeriesStatements.spec.js.map +0 -1
  459. package/dist/double-commas.spec.js +0 -73
  460. package/dist/double-commas.spec.js.map +0 -1
  461. package/dist/duplicates-ind1.spec.js +0 -45
  462. package/dist/duplicates-ind1.spec.js.map +0 -1
  463. package/dist/empty-fields.spec.js +0 -118
  464. package/dist/empty-fields.spec.js.map +0 -1
  465. package/dist/ending-punctuation.spec.js +0 -2654
  466. package/dist/ending-punctuation.spec.js.map +0 -1
  467. package/dist/ending-whitespace.spec.js +0 -42
  468. package/dist/ending-whitespace.spec.js.map +0 -1
  469. package/dist/field-008-18-34-character-groups.spec.js +0 -51
  470. package/dist/field-008-18-34-character-groups.spec.js.map +0 -1
  471. package/dist/field-505-separators.spec.js +0 -51
  472. package/dist/field-505-separators.spec.js.map +0 -1
  473. package/dist/field-521-fix.spec.js +0 -51
  474. package/dist/field-521-fix.spec.js.map +0 -1
  475. package/dist/field-exclusion.spec.js +0 -1054
  476. package/dist/field-exclusion.spec.js.map +0 -1
  477. package/dist/field-structure.spec.js +0 -535
  478. package/dist/field-structure.spec.js.map +0 -1
  479. package/dist/fields-present.spec.js +0 -121
  480. package/dist/fields-present.spec.js.map +0 -1
  481. package/dist/fix-33X.spec.js +0 -45
  482. package/dist/fix-33X.spec.js.map +0 -1
  483. package/dist/fix-country-codes.spec.js +0 -51
  484. package/dist/fix-country-codes.spec.js.map +0 -1
  485. package/dist/fix-language-codes.spec.js +0 -44
  486. package/dist/fix-language-codes.spec.js.map +0 -1
  487. package/dist/fixRelatorTerms.spec.js +0 -51
  488. package/dist/fixRelatorTerms.spec.js.map +0 -1
  489. package/dist/fixed-fields.spec.js +0 -140
  490. package/dist/fixed-fields.spec.js.map +0 -1
  491. package/dist/identical-fields.spec.js +0 -99
  492. package/dist/identical-fields.spec.js.map +0 -1
  493. package/dist/indicator-fixes.spec.js +0 -51
  494. package/dist/indicator-fixes.spec.js.map +0 -1
  495. package/dist/isbn-issn.spec.js +0 -595
  496. package/dist/isbn-issn.spec.js.map +0 -1
  497. package/dist/item-language.spec.js +0 -306
  498. package/dist/item-language.spec.js.map +0 -1
  499. package/dist/melindaCustomMergeFields.json +0 -5120
  500. package/dist/merge-fields.spec.js +0 -51
  501. package/dist/merge-fields.spec.js.map +0 -1
  502. package/dist/mergeField500Lisapainokset.spec.js +0 -51
  503. package/dist/mergeField500Lisapainokset.spec.js.map +0 -1
  504. package/dist/mergeRelatorTermFields.spec.js +0 -51
  505. package/dist/mergeRelatorTermFields.spec.js.map +0 -1
  506. package/dist/modernize-502.spec.js +0 -49
  507. package/dist/modernize-502.spec.js.map +0 -1
  508. package/dist/multiple-subfield-0.spec.js +0 -51
  509. package/dist/multiple-subfield-0.spec.js.map +0 -1
  510. package/dist/non-breaking-space.spec.js +0 -42
  511. package/dist/non-breaking-space.spec.js.map +0 -1
  512. package/dist/normalize-dashes.spec.js +0 -51
  513. package/dist/normalize-dashes.spec.js.map +0 -1
  514. package/dist/normalize-identifiers.spec.js +0 -51
  515. package/dist/normalize-identifiers.spec.js.map +0 -1
  516. package/dist/normalize-qualifying-information.spec.js +0 -51
  517. package/dist/normalize-qualifying-information.spec.js.map +0 -1
  518. package/dist/normalize-utf8-diacritics.spec.js +0 -51
  519. package/dist/normalize-utf8-diacritics.spec.js.map +0 -1
  520. package/dist/punctuation.spec.js +0 -51
  521. package/dist/punctuation.spec.js.map +0 -1
  522. package/dist/punctuation2.spec.js +0 -51
  523. package/dist/punctuation2.spec.js.map +0 -1
  524. package/dist/reindexSubfield6OccurenceNumbers.spec.js +0 -51
  525. package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +0 -1
  526. package/dist/removeDuplicateDataFields.spec.js +0 -51
  527. package/dist/removeDuplicateDataFields.spec.js.map +0 -1
  528. package/dist/removeInferiorDataFields.spec.js +0 -51
  529. package/dist/removeInferiorDataFields.spec.js.map +0 -1
  530. package/dist/resolvable-ext-references-melinda.spec.js +0 -166
  531. package/dist/resolvable-ext-references-melinda.spec.js.map +0 -1
  532. package/dist/resolveOrphanedSubfield6s.spec.js +0 -51
  533. package/dist/resolveOrphanedSubfield6s.spec.js.map +0 -1
  534. package/dist/sanitize-vocabulary-source-codes.spec.js +0 -51
  535. package/dist/sanitize-vocabulary-source-codes.spec.js.map +0 -1
  536. package/dist/sort-tags.spec.js +0 -207
  537. package/dist/sort-tags.spec.js.map +0 -1
  538. package/dist/sortFields.spec.js +0 -51
  539. package/dist/sortFields.spec.js.map +0 -1
  540. package/dist/sortRelatorTerms.spec.js +0 -51
  541. package/dist/sortRelatorTerms.spec.js.map +0 -1
  542. package/dist/sortSubfields.spec.js +0 -52
  543. package/dist/sortSubfields.spec.js.map +0 -1
  544. package/dist/stripPunctuation.spec.js +0 -51
  545. package/dist/stripPunctuation.spec.js.map +0 -1
  546. package/dist/subfield-exclusion.spec.js +0 -523
  547. package/dist/subfield-exclusion.spec.js.map +0 -1
  548. package/dist/subfieldValueNormalizations.spec.js +0 -51
  549. package/dist/subfieldValueNormalizations.spec.js.map +0 -1
  550. package/dist/sync-007-and-300.spec.js +0 -51
  551. package/dist/sync-007-and-300.spec.js.map +0 -1
  552. package/dist/translate-terms.spec.js +0 -51
  553. package/dist/translate-terms.spec.js.map +0 -1
  554. package/dist/typeOfDate-008.spec.js +0 -47
  555. package/dist/typeOfDate-008.spec.js.map +0 -1
  556. package/dist/unicode-decomposition.spec.js +0 -91
  557. package/dist/unicode-decomposition.spec.js.map +0 -1
  558. package/dist/update-field-540.spec.js +0 -51
  559. package/dist/update-field-540.spec.js.map +0 -1
  560. package/dist/urn.spec.js +0 -52
  561. package/dist/urn.spec.js.map +0 -1
  562. package/src/melindaCustomMergeFields.json +0 -5120
  563. package/src/translate-terms.spec.js +0 -52
@@ -1,140 +1,100 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.normalizePartData = normalizePartData;
7
- exports.partsAgree = partsAgree;
8
- exports.subfieldContainsPartData = subfieldContainsPartData;
9
- var _utils = require("./utils");
10
- var _debug = _interopRequireDefault(require("debug"));
11
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
- // Normalizes at least 490$v and 773$g which contain information such as "Raita 5" vs "5", and "Osa 3" vs "Osa III".
13
-
14
- const debug = (0, _debug.default)('@natlibfi/melinda-marc-record-merge-reducers:normalizeSubfieldValueForComparison');
15
- //const debugData = debug.extend('data');
16
- const debugDev = debug.extend('dev');
17
- function subfieldContainsPartData(tag, subfieldCode) {
18
- // NB! Used by reducers' mergeSubield.js
19
- if (subfieldCode === 'v' && ['490', '800', '810', '811', '830'].includes(tag)) {
1
+ import { nvdebug } from "./utils.js";
2
+ import createDebugLogger from "debug";
3
+ const debug = createDebugLogger("@natlibfi/melinda-marc-record-merge-reducers:normalizeSubfieldValueForComparison");
4
+ const debugDev = debug.extend("dev");
5
+ export function subfieldContainsPartData(tag, subfieldCode) {
6
+ if (subfieldCode === "v" && ["490", "800", "810", "811", "830"].includes(tag)) {
20
7
  return true;
21
8
  }
22
- if (tag === '773' && subfieldCode === 'g') {
9
+ if (tag === "773" && subfieldCode === "g") {
23
10
  return true;
24
11
  }
25
12
  return false;
26
13
  }
27
14
  function splitPartData(originalValue) {
28
- // This a very hacky function, but cand really help it, as the the data is very iffy as well...
29
- // Remove punctuation and brackets:
30
- const value = originalValue.replace(/[-.,:; ]+$/ui, '').replace(/^\[([0-9]+)\]$/ui, '$1');
15
+ const value = originalValue.replace(/[-.,:; ]+$/ui, "").replace(/^\[([0-9]+)\]$/ui, "$1");
31
16
  const [year, rest] = extractYear(value);
32
- const splitPoint = rest.lastIndexOf(' '); // MRA-627: "5, 2017" should be split here. Think of this later on...
17
+ const splitPoint = rest.lastIndexOf(" ");
33
18
  if (splitPoint === -1) {
34
- return [undefined, year, rest];
19
+ return [void 0, year, rest];
35
20
  }
36
21
  const lhs = rest.substr(0, splitPoint);
37
22
  const rhs = rest.substr(splitPoint + 1);
38
23
  return [lhs, year, rhs];
39
- function extractYear(value) {
40
- // NB! Note that this is far for perfect. It cover just some very common cases...
41
-
42
- // "2023, 3" => ["2023", "3"]
43
- if (value.match(/^(?:1[89][0-9][0-9]|20[012][0-9]), (?:nro |n:o)?[1-9][0-9]{0,2}$/ui)) {
44
- return [value.substr(0, 4), value.substr(6)];
24
+ function extractYear(value2) {
25
+ if (value2.match(/^(?:1[89][0-9][0-9]|20[012][0-9]), (?:nro |n:o)?[1-9][0-9]{0,2}$/ui)) {
26
+ return [value2.substr(0, 4), value2.substr(6)];
45
27
  }
46
- // "2023/12" => ["2023", "12"]
47
- if (value.match(/^(?:1[89][0-9][0-9]|20[012][0-9])[/:][1-9][0-9]{0,2}$/u)) {
48
- return [value.substr(0, 4), value.substr(5)];
28
+ if (value2.match(/^(?:1[89][0-9][0-9]|20[012][0-9])[/:][1-9][0-9]{0,2}$/u)) {
29
+ return [value2.substr(0, 4), value2.substr(5)];
49
30
  }
50
- // "Vol. 3/2023" => ["2023", "Vol. 3"]
51
- if (value.match(/^[^0-9]*[1-9][0-9]{0,2}\/(?:1[89][0-9][0-9]|20[012][0-9])$/u)) {
52
- const len = value.length;
53
- return [value.substr(len - 4), value.substr(0, len - 5)];
31
+ if (value2.match(/^[^0-9]*[1-9][0-9]{0,2}\/(?:1[89][0-9][0-9]|20[012][0-9])$/u)) {
32
+ const len = value2.length;
33
+ return [value2.substr(len - 4), value2.substr(0, len - 5)];
54
34
  }
55
- return [undefined, value];
35
+ return [void 0, value2];
56
36
  }
57
37
  }
58
38
  function normalizePartType(originalValue) {
59
- if (originalValue === undefined) {
60
- return undefined;
39
+ if (originalValue === void 0) {
40
+ return void 0;
61
41
  }
62
42
  const value = originalValue.toLowerCase();
63
-
64
- // Return Finnish singular nominative. Choise of language is arbitrary. This is best-ish for debug purposes...
65
- if (['n:o', 'no', 'nr', 'nro', 'number', 'numero', 'nummer'].includes(value)) {
66
- return 'numero';
43
+ if (["n:o", "no", "nr", "nro", "number", "numero", "nummer"].includes(value)) {
44
+ return "numero";
67
45
  }
68
- if (['band', 'bd', 'häfte', 'nide', 'osa', 'part', 'teil', 'vol', 'vol.', 'volume'].includes(value)) {
69
- return 'osa';
46
+ if (["band", "bd", "h\xE4fte", "nide", "osa", "part", "teil", "vol", "vol.", "volume"].includes(value)) {
47
+ return "osa";
70
48
  }
71
- if (['p.', 'page', 'pages', 'pp.', 's.', 'sidor', 'sivu', 'sivut'].includes(value)) {
72
- return 'sivu';
49
+ if (["p.", "page", "pages", "pp.", "s.", "sidor", "sivu", "sivut"].includes(value)) {
50
+ return "sivu";
73
51
  }
74
52
  return value;
75
53
  }
76
- const romanNumbers = {
77
- 'I': '1',
78
- 'II': '2',
79
- 'III': '3',
80
- 'IV': '4',
81
- 'V': '5',
82
- 'VI': '6',
83
- 'X': '10'
84
- };
54
+ const romanNumbers = { "I": "1", "II": "2", "III": "3", "IV": "4", "V": "5", "VI": "6", "X": "10" };
85
55
  function normalizePartNumber(value) {
86
- // Should we handle all Roman numbers or some range of them?
87
- // There's probably a library for our purposes..
88
56
  if (value in romanNumbers) {
89
57
  const arabicValue = romanNumbers[value];
90
- (0, _utils.nvdebug)(` MAP ${value} to ${arabicValue}`, debugDev);
58
+ nvdebug(` MAP ${value} to ${arabicValue}`, debugDev);
91
59
  return arabicValue;
92
60
  }
93
61
  return value.toLowerCase();
94
62
  }
95
63
  function splitAndNormalizePartData(value) {
96
- // This is just a stub. Does not handle eg. "Levy 2, raita 15"
97
64
  const [partType, partYear, partNumber] = splitPartData(value);
98
- //nvdebug(` LHS: '${lhs}'`, debugDev);
99
- //nvdebug(` RHS: '${rhs}'`, debugDev);
100
65
  return [normalizePartType(partType), partYear, normalizePartNumber(partNumber)];
101
66
  }
102
- function partsAgree(value1, value2, tag, subfieldCode) {
103
- // Note, that parts can not be normalized away, as "2" can agree with "Part 2" and "Raita 2" and "Volume 2"...
104
- // NB! Used by reducers' mergeSubield.js
67
+ export function partsAgree(value1, value2, tag, subfieldCode) {
105
68
  if (!subfieldContainsPartData(tag, subfieldCode)) {
106
69
  return false;
107
70
  }
108
71
  const [partType1, partYear1, partNumber1] = splitAndNormalizePartData(value1);
109
72
  const [partType2, partYear2, partNumber2] = splitAndNormalizePartData(value2);
110
- //nvdebug(`P1: ${partType1} | ${partYear1} | ${partNumber1}`);
111
- //nvdebug(`P2: ${partType2} | ${partYear2} | ${partNumber2}`);
112
73
  if (partNumber1 !== partNumber2) {
113
74
  return false;
114
75
  }
115
- if (partType1 !== undefined && partType2 !== undefined && partType1 !== partType2) {
76
+ if (partType1 !== void 0 && partType2 !== void 0 && partType1 !== partType2) {
116
77
  return false;
117
78
  }
118
- if (partYear1 !== undefined && partYear2 !== undefined && partYear1 !== partYear2) {
79
+ if (partYear1 !== void 0 && partYear2 !== void 0 && partYear1 !== partYear2) {
119
80
  return false;
120
81
  }
121
82
  return true;
122
83
  }
123
- function normalizePartData(value, subfieldCode, tag) {
124
- // This is for normalizing values for equality comparison only!
84
+ export function normalizePartData(value, subfieldCode, tag) {
125
85
  if (!subfieldContainsPartData(tag, subfieldCode)) {
126
86
  return value;
127
87
  }
128
88
  const [partType, partYear, partNumber] = splitAndNormalizePartData(value);
129
- if (partType === undefined) {
130
- if (partYear === undefined) {
89
+ if (partType === void 0) {
90
+ if (partYear === void 0) {
131
91
  return partNumber;
132
92
  }
133
93
  return `${partNumber}/${partYear}`;
134
94
  }
135
- if (partYear === undefined) {
95
+ if (partYear === void 0) {
136
96
  return `${partType} ${partNumber}`;
137
97
  }
138
98
  return `${partType} ${partNumber}/${partYear}`;
139
99
  }
140
- //# sourceMappingURL=normalizeSubfieldValueForComparison.js.map
100
+ //# sourceMappingURL=normalizeSubfieldValueForComparison.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"normalizeSubfieldValueForComparison.js","names":["_utils","require","_debug","_interopRequireDefault","e","__esModule","default","debug","createDebugLogger","debugDev","extend","subfieldContainsPartData","tag","subfieldCode","includes","splitPartData","originalValue","value","replace","year","rest","extractYear","splitPoint","lastIndexOf","undefined","lhs","substr","rhs","match","len","length","normalizePartType","toLowerCase","romanNumbers","normalizePartNumber","arabicValue","nvdebug","splitAndNormalizePartData","partType","partYear","partNumber","partsAgree","value1","value2","partType1","partYear1","partNumber1","partType2","partYear2","partNumber2","normalizePartData"],"sources":["../src/normalizeSubfieldValueForComparison.js"],"sourcesContent":["import {nvdebug} from './utils';\nimport createDebugLogger from 'debug';\n\n// Normalizes at least 490$v and 773$g which contain information such as \"Raita 5\" vs \"5\", and \"Osa 3\" vs \"Osa III\".\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:normalizeSubfieldValueForComparison');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nexport function subfieldContainsPartData(tag, subfieldCode) {\n // NB! Used by reducers' mergeSubield.js\n if (subfieldCode === 'v' && ['490', '800', '810', '811', '830'].includes(tag)) {\n return true;\n }\n if (tag === '773' && subfieldCode === 'g') {\n return true;\n }\n return false;\n}\n\nfunction splitPartData(originalValue) {\n // This a very hacky function, but cand really help it, as the the data is very iffy as well...\n // Remove punctuation and brackets:\n const value = originalValue.replace(/[-.,:; ]+$/ui, '').replace(/^\\[([0-9]+)\\]$/ui, '$1');\n\n const [year, rest] = extractYear(value);\n\n const splitPoint = rest.lastIndexOf(' '); // MRA-627: \"5, 2017\" should be split here. Think of this later on...\n if (splitPoint === -1) {\n return [undefined, year, rest];\n }\n const lhs = rest.substr(0, splitPoint);\n const rhs = rest.substr(splitPoint + 1);\n return [lhs, year, rhs];\n\n function extractYear(value) {\n // NB! Note that this is far for perfect. It cover just some very common cases...\n\n // \"2023, 3\" => [\"2023\", \"3\"]\n if (value.match(/^(?:1[89][0-9][0-9]|20[012][0-9]), (?:nro |n:o)?[1-9][0-9]{0,2}$/ui)) {\n return [value.substr(0, 4), value.substr(6)];\n }\n // \"2023/12\" => [\"2023\", \"12\"]\n if (value.match(/^(?:1[89][0-9][0-9]|20[012][0-9])[/:][1-9][0-9]{0,2}$/u)) {\n return [value.substr(0, 4), value.substr(5)];\n }\n // \"Vol. 3/2023\" => [\"2023\", \"Vol. 3\"]\n if (value.match(/^[^0-9]*[1-9][0-9]{0,2}\\/(?:1[89][0-9][0-9]|20[012][0-9])$/u)) {\n const len = value.length;\n return [value.substr(len - 4), value.substr(0, len - 5)];\n }\n\n\n return [undefined, value];\n }\n}\n\nfunction normalizePartType(originalValue) {\n if (originalValue === undefined) {\n return undefined;\n }\n const value = originalValue.toLowerCase();\n\n // Return Finnish singular nominative. Choise of language is arbitrary. This is best-ish for debug purposes...\n if (['n:o', 'no', 'nr', 'nro', 'number', 'numero', 'nummer'].includes(value)) {\n return 'numero';\n }\n if (['band', 'bd', 'häfte', 'nide', 'osa', 'part', 'teil', 'vol', 'vol.', 'volume'].includes(value)) {\n return 'osa';\n }\n\n if (['p.', 'page', 'pages', 'pp.', 's.', 'sidor', 'sivu', 'sivut'].includes(value)) {\n return 'sivu';\n }\n\n return value;\n}\n\nconst romanNumbers = {'I': '1', 'II': '2', 'III': '3', 'IV': '4', 'V': '5', 'VI': '6', 'X': '10'};\n\nfunction normalizePartNumber(value) {\n // Should we handle all Roman numbers or some range of them?\n // There's probably a library for our purposes..\n if (value in romanNumbers) {\n const arabicValue = romanNumbers[value];\n nvdebug(` MAP ${value} to ${arabicValue}`, debugDev);\n return arabicValue;\n }\n return value.toLowerCase();\n}\n\nfunction splitAndNormalizePartData(value) {\n // This is just a stub. Does not handle eg. \"Levy 2, raita 15\"\n const [partType, partYear, partNumber] = splitPartData(value);\n //nvdebug(` LHS: '${lhs}'`, debugDev);\n //nvdebug(` RHS: '${rhs}'`, debugDev);\n return [normalizePartType(partType), partYear, normalizePartNumber(partNumber)];\n}\n\nexport function partsAgree(value1, value2, tag, subfieldCode) {\n // Note, that parts can not be normalized away, as \"2\" can agree with \"Part 2\" and \"Raita 2\" and \"Volume 2\"...\n // NB! Used by reducers' mergeSubield.js\n if (!subfieldContainsPartData(tag, subfieldCode)) {\n return false;\n }\n const [partType1, partYear1, partNumber1] = splitAndNormalizePartData(value1);\n const [partType2, partYear2, partNumber2] = splitAndNormalizePartData(value2);\n //nvdebug(`P1: ${partType1} | ${partYear1} | ${partNumber1}`);\n //nvdebug(`P2: ${partType2} | ${partYear2} | ${partNumber2}`);\n if (partNumber1 !== partNumber2) {\n return false;\n }\n if (partType1 !== undefined && partType2 !== undefined && partType1 !== partType2) {\n return false;\n }\n if (partYear1 !== undefined && partYear2 !== undefined && partYear1 !== partYear2) {\n return false;\n }\n\n\n return true;\n}\n\nexport function normalizePartData(value, subfieldCode, tag) {\n // This is for normalizing values for equality comparison only!\n if (!subfieldContainsPartData(tag, subfieldCode)) {\n return value;\n }\n\n const [partType, partYear, partNumber] = splitAndNormalizePartData(value);\n if (partType === undefined) {\n if (partYear === undefined) {\n return partNumber;\n }\n return `${partNumber}/${partYear}`;\n }\n if (partYear === undefined) {\n return `${partType} ${partNumber}`;\n }\n return `${partType} ${partNumber}/${partYear}`;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/normalizeSubfieldValueForComparison.js"],
4
+ "sourcesContent": ["import {nvdebug} from './utils.js';\nimport createDebugLogger from 'debug';\n\n// Normalizes at least 490$v and 773$g which contain information such as \"Raita 5\" vs \"5\", and \"Osa 3\" vs \"Osa III\".\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:normalizeSubfieldValueForComparison');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nexport function subfieldContainsPartData(tag, subfieldCode) {\n // NB! Used by reducers' mergeSubield.js\n if (subfieldCode === 'v' && ['490', '800', '810', '811', '830'].includes(tag)) {\n return true;\n }\n if (tag === '773' && subfieldCode === 'g') {\n return true;\n }\n return false;\n}\n\nfunction splitPartData(originalValue) {\n // This a very hacky function, but cand really help it, as the the data is very iffy as well...\n // Remove punctuation and brackets:\n const value = originalValue.replace(/[-.,:; ]+$/ui, '').replace(/^\\[([0-9]+)\\]$/ui, '$1');\n\n const [year, rest] = extractYear(value);\n\n const splitPoint = rest.lastIndexOf(' '); // MRA-627: \"5, 2017\" should be split here. Think of this later on...\n if (splitPoint === -1) {\n return [undefined, year, rest];\n }\n const lhs = rest.substr(0, splitPoint);\n const rhs = rest.substr(splitPoint + 1);\n return [lhs, year, rhs];\n\n function extractYear(value) {\n // NB! Note that this is far for perfect. It cover just some very common cases...\n\n // \"2023, 3\" => [\"2023\", \"3\"]\n if (value.match(/^(?:1[89][0-9][0-9]|20[012][0-9]), (?:nro |n:o)?[1-9][0-9]{0,2}$/ui)) {\n return [value.substr(0, 4), value.substr(6)];\n }\n // \"2023/12\" => [\"2023\", \"12\"]\n if (value.match(/^(?:1[89][0-9][0-9]|20[012][0-9])[/:][1-9][0-9]{0,2}$/u)) {\n return [value.substr(0, 4), value.substr(5)];\n }\n // \"Vol. 3/2023\" => [\"2023\", \"Vol. 3\"]\n if (value.match(/^[^0-9]*[1-9][0-9]{0,2}\\/(?:1[89][0-9][0-9]|20[012][0-9])$/u)) {\n const len = value.length;\n return [value.substr(len - 4), value.substr(0, len - 5)];\n }\n\n\n return [undefined, value];\n }\n}\n\nfunction normalizePartType(originalValue) {\n if (originalValue === undefined) {\n return undefined;\n }\n const value = originalValue.toLowerCase();\n\n // Return Finnish singular nominative. Choise of language is arbitrary. This is best-ish for debug purposes...\n if (['n:o', 'no', 'nr', 'nro', 'number', 'numero', 'nummer'].includes(value)) {\n return 'numero';\n }\n if (['band', 'bd', 'h\u00E4fte', 'nide', 'osa', 'part', 'teil', 'vol', 'vol.', 'volume'].includes(value)) {\n return 'osa';\n }\n\n if (['p.', 'page', 'pages', 'pp.', 's.', 'sidor', 'sivu', 'sivut'].includes(value)) {\n return 'sivu';\n }\n\n return value;\n}\n\nconst romanNumbers = {'I': '1', 'II': '2', 'III': '3', 'IV': '4', 'V': '5', 'VI': '6', 'X': '10'};\n\nfunction normalizePartNumber(value) {\n // Should we handle all Roman numbers or some range of them?\n // There's probably a library for our purposes..\n if (value in romanNumbers) {\n const arabicValue = romanNumbers[value];\n nvdebug(` MAP ${value} to ${arabicValue}`, debugDev);\n return arabicValue;\n }\n return value.toLowerCase();\n}\n\nfunction splitAndNormalizePartData(value) {\n // This is just a stub. Does not handle eg. \"Levy 2, raita 15\"\n const [partType, partYear, partNumber] = splitPartData(value);\n //nvdebug(` LHS: '${lhs}'`, debugDev);\n //nvdebug(` RHS: '${rhs}'`, debugDev);\n return [normalizePartType(partType), partYear, normalizePartNumber(partNumber)];\n}\n\nexport function partsAgree(value1, value2, tag, subfieldCode) {\n // Note, that parts can not be normalized away, as \"2\" can agree with \"Part 2\" and \"Raita 2\" and \"Volume 2\"...\n // NB! Used by reducers' mergeSubield.js\n if (!subfieldContainsPartData(tag, subfieldCode)) {\n return false;\n }\n const [partType1, partYear1, partNumber1] = splitAndNormalizePartData(value1);\n const [partType2, partYear2, partNumber2] = splitAndNormalizePartData(value2);\n //nvdebug(`P1: ${partType1} | ${partYear1} | ${partNumber1}`);\n //nvdebug(`P2: ${partType2} | ${partYear2} | ${partNumber2}`);\n if (partNumber1 !== partNumber2) {\n return false;\n }\n if (partType1 !== undefined && partType2 !== undefined && partType1 !== partType2) {\n return false;\n }\n if (partYear1 !== undefined && partYear2 !== undefined && partYear1 !== partYear2) {\n return false;\n }\n\n\n return true;\n}\n\nexport function normalizePartData(value, subfieldCode, tag) {\n // This is for normalizing values for equality comparison only!\n if (!subfieldContainsPartData(tag, subfieldCode)) {\n return value;\n }\n\n const [partType, partYear, partNumber] = splitAndNormalizePartData(value);\n if (partType === undefined) {\n if (partYear === undefined) {\n return partNumber;\n }\n return `${partNumber}/${partYear}`;\n }\n if (partYear === undefined) {\n return `${partType} ${partNumber}`;\n }\n return `${partType} ${partNumber}/${partYear}`;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["value"]
7
+ }
@@ -1,63 +1,32 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.baseHasEqualOrHigherEncodingLevel = baseHasEqualOrHigherEncodingLevel;
7
- exports.deleteAllPrepublicationNotesFromField500InNonPubRecord = deleteAllPrepublicationNotesFromField500InNonPubRecord;
8
- exports.encodingLevelIsBetterThanPrepublication = encodingLevelIsBetterThanPrepublication;
9
- exports.fieldRefersToEnnakkotieto = fieldRefersToEnnakkotieto;
10
- exports.fieldRefersToKoneellisestiTuotettuTietue = fieldRefersToKoneellisestiTuotettuTietue;
11
- exports.fieldRefersToTarkistettuEnnakkotieto = fieldRefersToTarkistettuEnnakkotieto;
12
- exports.firstFieldHasBetterPrepubEncodingLevel = firstFieldHasBetterPrepubEncodingLevel;
13
- exports.getEncodingLevel = getEncodingLevel;
14
- exports.getPrepublicationLevel = getPrepublicationLevel;
15
- exports.getRelevant5XXFields = getRelevant5XXFields;
16
- exports.isEnnakkotietoField = isEnnakkotietoField;
17
- exports.isEnnakkotietoSubfield = isEnnakkotietoSubfield;
18
- exports.isFikkaRecord = isFikkaRecord;
19
- exports.isKingOfTheHill = isKingOfTheHill;
20
- exports.prepublicationLevelIsKoneellisestiTuotettuTietueOrTarkistettuEnnakkotieto = prepublicationLevelIsKoneellisestiTuotettuTietueOrTarkistettuEnnakkotieto;
21
- exports.removeWorsePrepubField500s = removeWorsePrepubField500s;
22
- exports.removeWorsePrepubField594s = removeWorsePrepubField594s;
23
- var _utils = require("./utils");
24
- var _debug = _interopRequireDefault(require("debug"));
25
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
26
- const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda:prepublicationUtils');
27
- //const debugData = debug.extend('data');
28
- const debugDev = debug.extend('dev');
29
- const KONEELLISESTI_TUOTETTU_TIETUE = 1; // Best
1
+ import { fieldHasSubfield, nvdebug, nvdebugFieldArray } from "./utils.js";
2
+ import createDebugLogger from "debug";
3
+ const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda:prepublicationUtils");
4
+ const debugDev = debug.extend("dev");
5
+ const KONEELLISESTI_TUOTETTU_TIETUE = 1;
30
6
  const TARKISTETTU_ENNAKKOTIETO = 2;
31
7
  const ENNAKKOTIETO = 3;
32
- //const EI_TASOA = 4;
33
-
34
- const encodingLevelPreferenceArray = [' ', '1', '3', '4', '5', '2', '7', 'u', 'z', '8']; // MET-145
35
- const prepublicationLevelIndex = encodingLevelPreferenceArray.indexOf('8');
36
- function prepublicationLevelIsKoneellisestiTuotettuTietueOrTarkistettuEnnakkotieto(prepublicationLevel) {
8
+ const encodingLevelPreferenceArray = [" ", "1", "3", "4", "5", "2", "7", "u", "z", "8"];
9
+ const prepublicationLevelIndex = encodingLevelPreferenceArray.indexOf("8");
10
+ export function prepublicationLevelIsKoneellisestiTuotettuTietueOrTarkistettuEnnakkotieto(prepublicationLevel) {
37
11
  return prepublicationLevel === KONEELLISESTI_TUOTETTU_TIETUE || prepublicationLevel === TARKISTETTU_ENNAKKOTIETO;
38
12
  }
39
- function encodingLevelIsBetterThanPrepublication(encodingLevel) {
13
+ export function encodingLevelIsBetterThanPrepublication(encodingLevel) {
40
14
  const index = encodingLevelPreferenceArray.indexOf(encodingLevel);
41
15
  return index > -1 && index < prepublicationLevelIndex;
42
16
  }
43
-
44
- // These three functions below all refer to field 500:
45
- function fieldRefersToKoneellisestiTuotettuTietue(field) {
46
- return field.subfields?.some(sf => sf.code === 'a' && sf.value.match(/^Koneellisesti tuotettu tietue/u));
17
+ export function fieldRefersToKoneellisestiTuotettuTietue(field) {
18
+ return field.subfields?.some((sf) => sf.code === "a" && sf.value.match(/^Koneellisesti tuotettu tietue/u));
47
19
  }
48
- function fieldRefersToTarkistettuEnnakkotieto(field) {
49
- return field.subfields?.some(sf => sf.code === 'a' && sf.value.match(/^tarkistettu ennakkotieto/ui));
20
+ export function fieldRefersToTarkistettuEnnakkotieto(field) {
21
+ return field.subfields?.some((sf) => sf.code === "a" && sf.value.match(/^tarkistettu ennakkotieto/ui));
50
22
  }
51
- function fieldRefersToEnnakkotieto(field) {
52
- // NB! This no longer matches 'TARKISTETTU ENNAKKOTIETO' case! Bug or Feature?
53
- if (field.subfields?.some(sf => sf.code === 'a' && sf.value.match(/^ennakkotieto(?:$|[. ])/ui))) {
23
+ export function fieldRefersToEnnakkotieto(field) {
24
+ if (field.subfields?.some((sf) => sf.code === "a" && sf.value.match(/^ennakkotieto(?:$|[. ])/ui))) {
54
25
  return true;
55
26
  }
56
-
57
- // MRA-420: "EI VIELÄ ILMESTYNYT" is a Helmet note, that is semantically similar to ENNAKKOTIETO:
58
- return field.subfields?.some(sf => sf.code === 'a' && sf.value.match(/^EI VIELÄ ILMESTYNYT/u));
27
+ return field.subfields?.some((sf) => sf.code === "a" && sf.value.match(/^EI VIELÄ ILMESTYNYT/u));
59
28
  }
60
- function firstFieldHasBetterPrepubEncodingLevel(field1, field2) {
29
+ export function firstFieldHasBetterPrepubEncodingLevel(field1, field2) {
61
30
  if (fieldRefersToKoneellisestiTuotettuTietue(field2)) {
62
31
  return false;
63
32
  }
@@ -78,25 +47,18 @@ function firstFieldHasBetterPrepubEncodingLevel(field1, field2) {
78
47
  }
79
48
  return false;
80
49
  }
81
- function getRelevant5XXFields(record, f500 = false, f594 = false) {
50
+ export function getRelevant5XXFields(record, f500 = false, f594 = false) {
82
51
  const cands = actualGetFields();
83
- //nvdebugFieldArray(cands, 'gR5XXa: ', debugDev);
84
- const filtered = cands.filter(field => hasRelevantPrepubData(field));
85
- //nvdebugFieldArray(filtered, 'gR5XXb: ', debugDev);
52
+ const filtered = cands.filter((field) => hasRelevantPrepubData(field));
86
53
  return filtered;
87
-
88
- //return actualGetFields().filter(field => hasRelevantPrepubData(field));
89
-
90
54
  function hasRelevantPrepubData(field) {
91
- // Check prepub ($a):
92
55
  if (!fieldRefersToKoneellisestiTuotettuTietue(field) && !fieldRefersToTarkistettuEnnakkotieto(field) && !fieldRefersToEnnakkotieto(field)) {
93
56
  return false;
94
57
  }
95
- // Check relevance (594$5):
96
- if (field.tag === '500') {
97
- return field.subfields.every(sf => sf.code !== '5'); //true;
58
+ if (field.tag === "500") {
59
+ return field.subfields.every((sf) => sf.code !== "5");
98
60
  }
99
- return field.subfields.some(sf => sf.code === '5' && ['FENNI', 'FIKKA', 'VIOLA'].includes(sf.value));
61
+ return field.subfields.some((sf) => sf.code === "5" && ["FENNI", "FIKKA", "VIOLA"].includes(sf.value));
100
62
  }
101
63
  function actualGetFields() {
102
64
  if (f500 && f594) {
@@ -111,99 +73,84 @@ function getRelevant5XXFields(record, f500 = false, f594 = false) {
111
73
  return [];
112
74
  }
113
75
  }
114
-
115
- // Very similar to getPrepublicationLevel() in melinda-record-match-validator's getPrepublicationLevel()...
116
- // We should use that and not have a copy here...
117
- function getPrepublicationLevel(record, f500 = false, f594 = false) {
118
- // Smaller return value is better
76
+ export function getPrepublicationLevel(record, f500 = false, f594 = false) {
119
77
  const fields = getRelevant5XXFields(record, f500, f594);
120
78
  if (!fields) {
121
79
  return null;
122
80
  }
123
- if (fields.some(f => fieldRefersToKoneellisestiTuotettuTietue(f))) {
81
+ if (fields.some((f) => fieldRefersToKoneellisestiTuotettuTietue(f))) {
124
82
  return KONEELLISESTI_TUOTETTU_TIETUE;
125
83
  }
126
- if (fields.some(f => fieldRefersToTarkistettuEnnakkotieto(f))) {
84
+ if (fields.some((f) => fieldRefersToTarkistettuEnnakkotieto(f))) {
127
85
  return TARKISTETTU_ENNAKKOTIETO;
128
86
  }
129
- if (fields.some(f => fieldRefersToEnnakkotieto(f))) {
87
+ if (fields.some((f) => fieldRefersToEnnakkotieto(f))) {
130
88
  return ENNAKKOTIETO;
131
89
  }
132
90
  return null;
133
91
  }
134
- function baseHasEqualOrHigherEncodingLevel(baseEncodingLevel, sourceEncodingLevel) {
92
+ export function baseHasEqualOrHigherEncodingLevel(baseEncodingLevel, sourceEncodingLevel) {
135
93
  const baseIndex = encodingLevelPreferenceArray.indexOf(baseEncodingLevel);
136
94
  const sourceIndex = encodingLevelPreferenceArray.indexOf(sourceEncodingLevel);
137
95
  if (baseIndex === -1) {
138
- // Base wins if both are bad:
139
96
  return sourceIndex === -1;
140
97
  }
141
98
  return baseIndex <= sourceIndex;
142
99
  }
143
100
  function hasFikkaLOW(record) {
144
- return record.fields.some(field => field.tag === 'LOW' && (0, _utils.fieldHasSubfield)(field, 'a', 'FIKKA'));
101
+ return record.fields.some((field) => field.tag === "LOW" && fieldHasSubfield(field, "a", "FIKKA"));
145
102
  }
146
103
  function hasNatLibFi042(record) {
147
- return record.fields.some(field => field.tag === '042' && ((0, _utils.fieldHasSubfield)(field, 'a', 'finb') || (0, _utils.fieldHasSubfield)(field, 'a', 'finbd')));
104
+ return record.fields.some((field) => field.tag === "042" && (fieldHasSubfield(field, "a", "finb") || fieldHasSubfield(field, "a", "finbd")));
148
105
  }
149
- function isFikkaRecord(record) {
150
- // NB! Does not include Humaniora. Pienpainatteet (not that they'd have duplicates)?
106
+ export function isFikkaRecord(record) {
151
107
  return hasFikkaLOW(record) && hasNatLibFi042(record);
152
108
  }
153
- function getEncodingLevel(record) {
109
+ export function getEncodingLevel(record) {
154
110
  return record.leader.substring(17, 18);
155
111
  }
156
- function deleteAllPrepublicationNotesFromField500InNonPubRecord(record) {
112
+ export function deleteAllPrepublicationNotesFromField500InNonPubRecord(record) {
157
113
  const encodingLevel = getEncodingLevel(record);
158
- // Skip prepublication (or theoretically even worse) records:
159
114
  if (!encodingLevelIsBetterThanPrepublication(encodingLevel)) {
160
- //if (['2', '8'].includes(encodingLevel)) { // MET-306: added '2' here
161
115
  return;
162
116
  }
163
-
164
- // MET-306: keep "koneellisesti tuotettu tietue" if encoding level is '2':
165
- const f500 = getRelevant5XXFields(record, true, false).filter(field => encodingLevel === '2' ? !fieldRefersToKoneellisestiTuotettuTietue(field) : true);
117
+ const f500 = getRelevant5XXFields(record, true, false).filter((field) => encodingLevel === "2" ? !fieldRefersToKoneellisestiTuotettuTietue(field) : true);
166
118
  if (f500.length === 0) {
167
119
  return;
168
120
  }
169
- (0, _utils.nvdebug)(`Delete all ${f500.length} instance(s) of field 500`, debugDev);
170
- f500.forEach(field => record.removeField(field)); // eslint-disable-line array-callback-return
171
- }
172
- function removeWorsePrepubField500s(record) {
173
- // Remove lower-level entries:
174
- const fields = getRelevant5XXFields(record, true, false); // 500=false, 594=true
175
- (0, _utils.nvdebugFieldArray)(fields, ' Candidates for non-best 500 b4 filtering: ', debugDev);
176
- const nonBest = fields.filter(field => fields.some(field2 => firstFieldHasBetterPrepubEncodingLevel(field2, field)));
177
- (0, _utils.nvdebugFieldArray)(nonBest, ' Remove non-best 500: ', debugDev);
178
- nonBest.forEach(field => record.removeField(field)); // eslint-disable-line array-callback-return
179
- }
180
- function removeWorsePrepubField594s(record) {
181
- // Remove lower-level entries:
182
- const fields594 = getRelevant5XXFields(record, false, true); // 500=false, 594=true
183
- (0, _utils.nvdebugFieldArray)(fields594, ' Candidates for non-best 594 b4 filtering: ', debugDev);
184
- const nonBest = fields594.filter(field => fields594.some(field2 => firstFieldHasBetterPrepubEncodingLevel(field2, field)));
185
- (0, _utils.nvdebugFieldArray)(nonBest, ' Remove non-best 594: ', debugDev);
186
- nonBest.forEach(field => record.removeField(field)); // eslint-disable-line array-callback-return
187
- }
188
- function isEnnakkotietoSubfield(subfield) {
189
- if (subfield.code !== '9' && subfield.code !== 'g') {
121
+ nvdebug(`Delete all ${f500.length} instance(s) of field 500`, debugDev);
122
+ f500.forEach((field) => record.removeField(field));
123
+ }
124
+ export function removeWorsePrepubField500s(record) {
125
+ const fields = getRelevant5XXFields(record, true, false);
126
+ nvdebugFieldArray(fields, " Candidates for non-best 500 b4 filtering: ", debugDev);
127
+ const nonBest = fields.filter((field) => fields.some((field2) => firstFieldHasBetterPrepubEncodingLevel(field2, field)));
128
+ nvdebugFieldArray(nonBest, " Remove non-best 500: ", debugDev);
129
+ nonBest.forEach((field) => record.removeField(field));
130
+ }
131
+ export function removeWorsePrepubField594s(record) {
132
+ const fields594 = getRelevant5XXFields(record, false, true);
133
+ nvdebugFieldArray(fields594, " Candidates for non-best 594 b4 filtering: ", debugDev);
134
+ const nonBest = fields594.filter((field) => fields594.some((field2) => firstFieldHasBetterPrepubEncodingLevel(field2, field)));
135
+ nvdebugFieldArray(nonBest, " Remove non-best 594: ", debugDev);
136
+ nonBest.forEach((field) => record.removeField(field));
137
+ }
138
+ export function isEnnakkotietoSubfield(subfield) {
139
+ if (subfield.code !== "9" && subfield.code !== "g") {
190
140
  return false;
191
141
  }
192
- // Length <= 13 allows punctuation, but does not require it:
193
142
  if (subfield.value.length <= 13) {
194
143
  const coreString = subfield.value.substr(0, 12);
195
- if (coreString.toLowerCase() === 'ennakkotieto') {
196
- // Lowercase term first seen in MET-575
144
+ if (coreString.toLowerCase() === "ennakkotieto") {
197
145
  return true;
198
146
  }
199
147
  }
200
148
  return false;
201
149
  }
202
- function isEnnakkotietoField(field) {
203
- return field.subfields.some(sf => isEnnakkotietoSubfield(sf));
150
+ export function isEnnakkotietoField(field) {
151
+ return field.subfields.some((sf) => isEnnakkotietoSubfield(sf));
204
152
  }
205
- function isKingOfTheHill(field, opposingFields) {
206
- // Field is no better than at least one of the opposing fields
207
- return opposingFields.every(opposingField => firstFieldHasBetterPrepubEncodingLevel(field, opposingField));
153
+ export function isKingOfTheHill(field, opposingFields) {
154
+ return opposingFields.every((opposingField) => firstFieldHasBetterPrepubEncodingLevel(field, opposingField));
208
155
  }
209
- //# sourceMappingURL=prepublicationUtils.js.map
156
+ //# sourceMappingURL=prepublicationUtils.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"prepublicationUtils.js","names":["_utils","require","_debug","_interopRequireDefault","e","__esModule","default","debug","createDebugLogger","debugDev","extend","KONEELLISESTI_TUOTETTU_TIETUE","TARKISTETTU_ENNAKKOTIETO","ENNAKKOTIETO","encodingLevelPreferenceArray","prepublicationLevelIndex","indexOf","prepublicationLevelIsKoneellisestiTuotettuTietueOrTarkistettuEnnakkotieto","prepublicationLevel","encodingLevelIsBetterThanPrepublication","encodingLevel","index","fieldRefersToKoneellisestiTuotettuTietue","field","subfields","some","sf","code","value","match","fieldRefersToTarkistettuEnnakkotieto","fieldRefersToEnnakkotieto","firstFieldHasBetterPrepubEncodingLevel","field1","field2","getRelevant5XXFields","record","f500","f594","cands","actualGetFields","filtered","filter","hasRelevantPrepubData","tag","every","includes","get","getPrepublicationLevel","fields","f","baseHasEqualOrHigherEncodingLevel","baseEncodingLevel","sourceEncodingLevel","baseIndex","sourceIndex","hasFikkaLOW","fieldHasSubfield","hasNatLibFi042","isFikkaRecord","getEncodingLevel","leader","substring","deleteAllPrepublicationNotesFromField500InNonPubRecord","length","nvdebug","forEach","removeField","removeWorsePrepubField500s","nvdebugFieldArray","nonBest","removeWorsePrepubField594s","fields594","isEnnakkotietoSubfield","subfield","coreString","substr","toLowerCase","isEnnakkotietoField","isKingOfTheHill","opposingFields","opposingField"],"sources":["../src/prepublicationUtils.js"],"sourcesContent":["import {fieldHasSubfield, nvdebug, nvdebugFieldArray} from './utils';\nimport createDebugLogger from 'debug';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:prepublicationUtils');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst KONEELLISESTI_TUOTETTU_TIETUE = 1; // Best\nconst TARKISTETTU_ENNAKKOTIETO = 2;\nconst ENNAKKOTIETO = 3;\n//const EI_TASOA = 4;\n\nconst encodingLevelPreferenceArray = [' ', '1', '3', '4', '5', '2', '7', 'u', 'z', '8']; // MET-145\nconst prepublicationLevelIndex = encodingLevelPreferenceArray.indexOf('8');\n\nexport function prepublicationLevelIsKoneellisestiTuotettuTietueOrTarkistettuEnnakkotieto(prepublicationLevel) {\n return prepublicationLevel === KONEELLISESTI_TUOTETTU_TIETUE || prepublicationLevel === TARKISTETTU_ENNAKKOTIETO;\n}\n\n\nexport function encodingLevelIsBetterThanPrepublication(encodingLevel) {\n const index = encodingLevelPreferenceArray.indexOf(encodingLevel);\n return index > -1 && index < prepublicationLevelIndex;\n}\n\n// These three functions below all refer to field 500:\nexport function fieldRefersToKoneellisestiTuotettuTietue(field) {\n return field.subfields?.some(sf => sf.code === 'a' && sf.value.match(/^Koneellisesti tuotettu tietue/u));\n}\n\n\nexport function fieldRefersToTarkistettuEnnakkotieto(field) {\n return field.subfields?.some(sf => sf.code === 'a' && sf.value.match(/^tarkistettu ennakkotieto/ui));\n}\n\n\nexport function fieldRefersToEnnakkotieto(field) {\n // NB! This no longer matches 'TARKISTETTU ENNAKKOTIETO' case! Bug or Feature?\n if (field.subfields?.some(sf => sf.code === 'a' && sf.value.match(/^ennakkotieto(?:$|[. ])/ui))) {\n return true;\n }\n\n // MRA-420: \"EI VIELÄ ILMESTYNYT\" is a Helmet note, that is semantically similar to ENNAKKOTIETO:\n return field.subfields?.some(sf => sf.code === 'a' && sf.value.match(/^EI VIELÄ ILMESTYNYT/u));\n}\n\n\nexport function firstFieldHasBetterPrepubEncodingLevel(field1, field2) {\n if (fieldRefersToKoneellisestiTuotettuTietue(field2)) {\n return false;\n }\n if (fieldRefersToKoneellisestiTuotettuTietue(field1)) {\n return true;\n }\n if (fieldRefersToTarkistettuEnnakkotieto(field2)) {\n return false;\n }\n if (fieldRefersToTarkistettuEnnakkotieto(field1)) {\n return true;\n }\n if (fieldRefersToEnnakkotieto(field2)) {\n return false;\n }\n if (fieldRefersToEnnakkotieto(field1)) {\n return true;\n }\n return false;\n}\n\nexport function getRelevant5XXFields(record, f500 = false, f594 = false) {\n const cands = actualGetFields();\n //nvdebugFieldArray(cands, 'gR5XXa: ', debugDev);\n const filtered = cands.filter(field => hasRelevantPrepubData(field));\n //nvdebugFieldArray(filtered, 'gR5XXb: ', debugDev);\n return filtered;\n\n //return actualGetFields().filter(field => hasRelevantPrepubData(field));\n\n function hasRelevantPrepubData(field) {\n // Check prepub ($a):\n if (!fieldRefersToKoneellisestiTuotettuTietue(field) && !fieldRefersToTarkistettuEnnakkotieto(field) && !fieldRefersToEnnakkotieto(field)) {\n return false;\n }\n // Check relevance (594$5):\n if (field.tag === '500') {\n return field.subfields.every(sf => sf.code !== '5'); //true;\n }\n return field.subfields.some(sf => sf.code === '5' && ['FENNI', 'FIKKA', 'VIOLA'].includes(sf.value));\n }\n\n function actualGetFields() {\n if (f500 && f594) {\n return record.get(/^(?:500|594)$/u);\n }\n if (f500) {\n return record.get(/^500$/u);\n }\n if (f594) {\n return record.get(/^594$/u);\n }\n return [];\n }\n\n}\n\n\n// Very similar to getPrepublicationLevel() in melinda-record-match-validator's getPrepublicationLevel()...\n// We should use that and not have a copy here...\nexport function getPrepublicationLevel(record, f500 = false, f594 = false) {\n // Smaller return value is better\n const fields = getRelevant5XXFields(record, f500, f594);\n\n if (!fields) {\n return null;\n }\n if (fields.some(f => fieldRefersToKoneellisestiTuotettuTietue(f))) {\n return KONEELLISESTI_TUOTETTU_TIETUE;\n }\n\n if (fields.some(f => fieldRefersToTarkistettuEnnakkotieto(f))) {\n return TARKISTETTU_ENNAKKOTIETO;\n }\n\n if (fields.some(f => fieldRefersToEnnakkotieto(f))) {\n return ENNAKKOTIETO;\n }\n\n return null;\n}\n\n\nexport function baseHasEqualOrHigherEncodingLevel(baseEncodingLevel, sourceEncodingLevel) {\n const baseIndex = encodingLevelPreferenceArray.indexOf(baseEncodingLevel);\n const sourceIndex = encodingLevelPreferenceArray.indexOf(sourceEncodingLevel);\n\n if (baseIndex === -1) {\n // Base wins if both are bad:\n return sourceIndex === -1;\n }\n return baseIndex <= sourceIndex;\n}\n\n\nfunction hasFikkaLOW(record) {\n return record.fields.some(field => field.tag === 'LOW' && fieldHasSubfield(field, 'a', 'FIKKA'));\n}\n\n\nfunction hasNatLibFi042(record) {\n return record.fields.some(field => field.tag === '042' && (fieldHasSubfield(field, 'a', 'finb') || fieldHasSubfield(field, 'a', 'finbd')));\n}\n\n\nexport function isFikkaRecord(record) {\n // NB! Does not include Humaniora. Pienpainatteet (not that they'd have duplicates)?\n return hasFikkaLOW(record) && hasNatLibFi042(record);\n}\n\n\nexport function getEncodingLevel(record) {\n return record.leader.substring(17, 18);\n}\n\n\nexport function deleteAllPrepublicationNotesFromField500InNonPubRecord(record) {\n const encodingLevel = getEncodingLevel(record);\n // Skip prepublication (or theoretically even worse) records:\n if (!encodingLevelIsBetterThanPrepublication(encodingLevel)) {\n //if (['2', '8'].includes(encodingLevel)) { // MET-306: added '2' here\n return;\n }\n\n // MET-306: keep \"koneellisesti tuotettu tietue\" if encoding level is '2':\n const f500 = getRelevant5XXFields(record, true, false).filter(field => encodingLevel === '2' ? !fieldRefersToKoneellisestiTuotettuTietue(field) : true);\n if (f500.length === 0) {\n return;\n }\n\n\n nvdebug(`Delete all ${f500.length} instance(s) of field 500`, debugDev);\n f500.forEach(field => record.removeField(field)); // eslint-disable-line array-callback-return\n}\n\n\nexport function removeWorsePrepubField500s(record) {\n // Remove lower-level entries:\n const fields = getRelevant5XXFields(record, true, false); // 500=false, 594=true\n nvdebugFieldArray(fields, ' Candidates for non-best 500 b4 filtering: ', debugDev);\n const nonBest = fields.filter(field => fields.some(field2 => firstFieldHasBetterPrepubEncodingLevel(field2, field)));\n nvdebugFieldArray(nonBest, ' Remove non-best 500: ', debugDev);\n nonBest.forEach(field => record.removeField(field)); // eslint-disable-line array-callback-return\n}\n\n\nexport function removeWorsePrepubField594s(record) {\n // Remove lower-level entries:\n const fields594 = getRelevant5XXFields(record, false, true); // 500=false, 594=true\n nvdebugFieldArray(fields594, ' Candidates for non-best 594 b4 filtering: ', debugDev);\n const nonBest = fields594.filter(field => fields594.some(field2 => firstFieldHasBetterPrepubEncodingLevel(field2, field)));\n nvdebugFieldArray(nonBest, ' Remove non-best 594: ', debugDev);\n nonBest.forEach(field => record.removeField(field)); // eslint-disable-line array-callback-return\n}\n\n\nexport function isEnnakkotietoSubfield(subfield) {\n if (subfield.code !== '9' && subfield.code !== 'g') {\n return false;\n }\n // Length <= 13 allows punctuation, but does not require it:\n if (subfield.value.length <= 13) {\n const coreString = subfield.value.substr(0, 12);\n if (coreString.toLowerCase() === 'ennakkotieto') { // Lowercase term first seen in MET-575\n return true;\n }\n }\n return false;\n}\n\nexport function isEnnakkotietoField(field) {\n return field.subfields.some(sf => isEnnakkotietoSubfield(sf));\n}\n\nexport function isKingOfTheHill(field, opposingFields) {\n // Field is no better than at least one of the opposing fields\n return opposingFields.every(opposingField => firstFieldHasBetterPrepubEncodingLevel(field, opposingField));\n}\n\n"],"mappings":"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","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/prepublicationUtils.js"],
4
+ "sourcesContent": ["import {fieldHasSubfield, nvdebug, nvdebugFieldArray} from './utils.js';\nimport createDebugLogger from 'debug';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:prepublicationUtils');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst KONEELLISESTI_TUOTETTU_TIETUE = 1; // Best\nconst TARKISTETTU_ENNAKKOTIETO = 2;\nconst ENNAKKOTIETO = 3;\n//const EI_TASOA = 4;\n\nconst encodingLevelPreferenceArray = [' ', '1', '3', '4', '5', '2', '7', 'u', 'z', '8']; // MET-145\nconst prepublicationLevelIndex = encodingLevelPreferenceArray.indexOf('8');\n\nexport function prepublicationLevelIsKoneellisestiTuotettuTietueOrTarkistettuEnnakkotieto(prepublicationLevel) {\n return prepublicationLevel === KONEELLISESTI_TUOTETTU_TIETUE || prepublicationLevel === TARKISTETTU_ENNAKKOTIETO;\n}\n\n\nexport function encodingLevelIsBetterThanPrepublication(encodingLevel) {\n const index = encodingLevelPreferenceArray.indexOf(encodingLevel);\n return index > -1 && index < prepublicationLevelIndex;\n}\n\n// These three functions below all refer to field 500:\nexport function fieldRefersToKoneellisestiTuotettuTietue(field) {\n return field.subfields?.some(sf => sf.code === 'a' && sf.value.match(/^Koneellisesti tuotettu tietue/u));\n}\n\n\nexport function fieldRefersToTarkistettuEnnakkotieto(field) {\n return field.subfields?.some(sf => sf.code === 'a' && sf.value.match(/^tarkistettu ennakkotieto/ui));\n}\n\n\nexport function fieldRefersToEnnakkotieto(field) {\n // NB! This no longer matches 'TARKISTETTU ENNAKKOTIETO' case! Bug or Feature?\n if (field.subfields?.some(sf => sf.code === 'a' && sf.value.match(/^ennakkotieto(?:$|[. ])/ui))) {\n return true;\n }\n\n // MRA-420: \"EI VIEL\u00C4 ILMESTYNYT\" is a Helmet note, that is semantically similar to ENNAKKOTIETO:\n return field.subfields?.some(sf => sf.code === 'a' && sf.value.match(/^EI VIEL\u00C4 ILMESTYNYT/u));\n}\n\n\nexport function firstFieldHasBetterPrepubEncodingLevel(field1, field2) {\n if (fieldRefersToKoneellisestiTuotettuTietue(field2)) {\n return false;\n }\n if (fieldRefersToKoneellisestiTuotettuTietue(field1)) {\n return true;\n }\n if (fieldRefersToTarkistettuEnnakkotieto(field2)) {\n return false;\n }\n if (fieldRefersToTarkistettuEnnakkotieto(field1)) {\n return true;\n }\n if (fieldRefersToEnnakkotieto(field2)) {\n return false;\n }\n if (fieldRefersToEnnakkotieto(field1)) {\n return true;\n }\n return false;\n}\n\nexport function getRelevant5XXFields(record, f500 = false, f594 = false) {\n const cands = actualGetFields();\n //nvdebugFieldArray(cands, 'gR5XXa: ', debugDev);\n const filtered = cands.filter(field => hasRelevantPrepubData(field));\n //nvdebugFieldArray(filtered, 'gR5XXb: ', debugDev);\n return filtered;\n\n //return actualGetFields().filter(field => hasRelevantPrepubData(field));\n\n function hasRelevantPrepubData(field) {\n // Check prepub ($a):\n if (!fieldRefersToKoneellisestiTuotettuTietue(field) && !fieldRefersToTarkistettuEnnakkotieto(field) && !fieldRefersToEnnakkotieto(field)) {\n return false;\n }\n // Check relevance (594$5):\n if (field.tag === '500') {\n return field.subfields.every(sf => sf.code !== '5'); //true;\n }\n return field.subfields.some(sf => sf.code === '5' && ['FENNI', 'FIKKA', 'VIOLA'].includes(sf.value));\n }\n\n function actualGetFields() {\n if (f500 && f594) {\n return record.get(/^(?:500|594)$/u);\n }\n if (f500) {\n return record.get(/^500$/u);\n }\n if (f594) {\n return record.get(/^594$/u);\n }\n return [];\n }\n\n}\n\n\n// Very similar to getPrepublicationLevel() in melinda-record-match-validator's getPrepublicationLevel()...\n// We should use that and not have a copy here...\nexport function getPrepublicationLevel(record, f500 = false, f594 = false) {\n // Smaller return value is better\n const fields = getRelevant5XXFields(record, f500, f594);\n\n if (!fields) {\n return null;\n }\n if (fields.some(f => fieldRefersToKoneellisestiTuotettuTietue(f))) {\n return KONEELLISESTI_TUOTETTU_TIETUE;\n }\n\n if (fields.some(f => fieldRefersToTarkistettuEnnakkotieto(f))) {\n return TARKISTETTU_ENNAKKOTIETO;\n }\n\n if (fields.some(f => fieldRefersToEnnakkotieto(f))) {\n return ENNAKKOTIETO;\n }\n\n return null;\n}\n\n\nexport function baseHasEqualOrHigherEncodingLevel(baseEncodingLevel, sourceEncodingLevel) {\n const baseIndex = encodingLevelPreferenceArray.indexOf(baseEncodingLevel);\n const sourceIndex = encodingLevelPreferenceArray.indexOf(sourceEncodingLevel);\n\n if (baseIndex === -1) {\n // Base wins if both are bad:\n return sourceIndex === -1;\n }\n return baseIndex <= sourceIndex;\n}\n\n\nfunction hasFikkaLOW(record) {\n return record.fields.some(field => field.tag === 'LOW' && fieldHasSubfield(field, 'a', 'FIKKA'));\n}\n\n\nfunction hasNatLibFi042(record) {\n return record.fields.some(field => field.tag === '042' && (fieldHasSubfield(field, 'a', 'finb') || fieldHasSubfield(field, 'a', 'finbd')));\n}\n\n\nexport function isFikkaRecord(record) {\n // NB! Does not include Humaniora. Pienpainatteet (not that they'd have duplicates)?\n return hasFikkaLOW(record) && hasNatLibFi042(record);\n}\n\n\nexport function getEncodingLevel(record) {\n return record.leader.substring(17, 18);\n}\n\n\nexport function deleteAllPrepublicationNotesFromField500InNonPubRecord(record) {\n const encodingLevel = getEncodingLevel(record);\n // Skip prepublication (or theoretically even worse) records:\n if (!encodingLevelIsBetterThanPrepublication(encodingLevel)) {\n //if (['2', '8'].includes(encodingLevel)) { // MET-306: added '2' here\n return;\n }\n\n // MET-306: keep \"koneellisesti tuotettu tietue\" if encoding level is '2':\n const f500 = getRelevant5XXFields(record, true, false).filter(field => encodingLevel === '2' ? !fieldRefersToKoneellisestiTuotettuTietue(field) : true);\n if (f500.length === 0) {\n return;\n }\n\n\n nvdebug(`Delete all ${f500.length} instance(s) of field 500`, debugDev);\n f500.forEach(field => record.removeField(field));\n}\n\n\nexport function removeWorsePrepubField500s(record) {\n // Remove lower-level entries:\n const fields = getRelevant5XXFields(record, true, false); // 500=false, 594=true\n nvdebugFieldArray(fields, ' Candidates for non-best 500 b4 filtering: ', debugDev);\n const nonBest = fields.filter(field => fields.some(field2 => firstFieldHasBetterPrepubEncodingLevel(field2, field)));\n nvdebugFieldArray(nonBest, ' Remove non-best 500: ', debugDev);\n nonBest.forEach(field => record.removeField(field));\n}\n\n\nexport function removeWorsePrepubField594s(record) {\n // Remove lower-level entries:\n const fields594 = getRelevant5XXFields(record, false, true); // 500=false, 594=true\n nvdebugFieldArray(fields594, ' Candidates for non-best 594 b4 filtering: ', debugDev);\n const nonBest = fields594.filter(field => fields594.some(field2 => firstFieldHasBetterPrepubEncodingLevel(field2, field)));\n nvdebugFieldArray(nonBest, ' Remove non-best 594: ', debugDev);\n nonBest.forEach(field => record.removeField(field));\n}\n\n\nexport function isEnnakkotietoSubfield(subfield) {\n if (subfield.code !== '9' && subfield.code !== 'g') {\n return false;\n }\n // Length <= 13 allows punctuation, but does not require it:\n if (subfield.value.length <= 13) {\n const coreString = subfield.value.substr(0, 12);\n if (coreString.toLowerCase() === 'ennakkotieto') { // Lowercase term first seen in MET-575\n return true;\n }\n }\n return false;\n}\n\nexport function isEnnakkotietoField(field) {\n return field.subfields.some(sf => isEnnakkotietoSubfield(sf));\n}\n\nexport function isKingOfTheHill(field, opposingFields) {\n // Field is no better than at least one of the opposing fields\n return opposingFields.every(opposingField => firstFieldHasBetterPrepubEncodingLevel(field, opposingField));\n}\n\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }