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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. package/.github/workflows/melinda-node-tests.yml +1 -1
  2. package/dist/access-rights.js +63 -91
  3. package/dist/access-rights.js.map +7 -1
  4. package/dist/access-rights.test.js +137 -0
  5. package/dist/access-rights.test.js.map +7 -0
  6. package/dist/addMissingField041.js +21 -53
  7. package/dist/addMissingField041.js.map +7 -1
  8. package/dist/addMissingField041.test.js +39 -0
  9. package/dist/addMissingField041.test.js.map +7 -0
  10. package/dist/addMissingField336.js +99 -191
  11. package/dist/addMissingField336.js.map +7 -1
  12. package/dist/addMissingField336.test.js +39 -0
  13. package/dist/addMissingField336.test.js.map +7 -0
  14. package/dist/addMissingField337.js +63 -132
  15. package/dist/addMissingField337.js.map +7 -1
  16. package/dist/addMissingField337.test.js +39 -0
  17. package/dist/addMissingField337.test.js.map +7 -0
  18. package/dist/addMissingField338.js +147 -253
  19. package/dist/addMissingField338.js.map +7 -1
  20. package/dist/addMissingField338.test.js +39 -0
  21. package/dist/addMissingField338.test.js.map +7 -0
  22. package/dist/cyrillux-usemarcon-replacement.js +119 -272
  23. package/dist/cyrillux-usemarcon-replacement.js.map +7 -1
  24. package/dist/cyrillux-usemarcon-replacement.test.js +46 -0
  25. package/dist/cyrillux-usemarcon-replacement.test.js.map +7 -0
  26. package/dist/cyrillux.js +119 -223
  27. package/dist/cyrillux.js.map +7 -1
  28. package/dist/cyrillux.test.js +39 -0
  29. package/dist/cyrillux.test.js.map +7 -0
  30. package/dist/disambiguateSeriesStatements.js +40 -81
  31. package/dist/disambiguateSeriesStatements.js.map +7 -1
  32. package/dist/disambiguateSeriesStatements.test.js +44 -0
  33. package/dist/disambiguateSeriesStatements.test.js.map +7 -0
  34. package/dist/double-commas.js +7 -14
  35. package/dist/double-commas.js.map +7 -1
  36. package/dist/double-commas.test.js +48 -0
  37. package/dist/double-commas.test.js.map +7 -0
  38. package/dist/duplicates-ind1.js +10 -31
  39. package/dist/duplicates-ind1.js.map +7 -1
  40. package/dist/duplicates-ind1.test.js +40 -0
  41. package/dist/duplicates-ind1.test.js.map +7 -0
  42. package/dist/empty-fields.js +10 -22
  43. package/dist/empty-fields.js.map +7 -1
  44. package/dist/empty-fields.test.js +129 -0
  45. package/dist/empty-fields.test.js.map +7 -0
  46. package/dist/ending-punctuation-conf.js +871 -769
  47. package/dist/ending-punctuation-conf.js.map +7 -1
  48. package/dist/ending-punctuation.js +84 -167
  49. package/dist/ending-punctuation.js.map +7 -1
  50. package/dist/ending-punctuation.test.js +2290 -0
  51. package/dist/ending-punctuation.test.js.map +7 -0
  52. package/dist/ending-whitespace.js +10 -35
  53. package/dist/ending-whitespace.js.map +7 -1
  54. package/dist/ending-whitespace.test.js +38 -0
  55. package/dist/ending-whitespace.test.js.map +7 -0
  56. package/dist/field-008-18-34-character-groups.js +40 -125
  57. package/dist/field-008-18-34-character-groups.js.map +7 -1
  58. package/dist/field-008-18-34-character-groups.test.js +45 -0
  59. package/dist/field-008-18-34-character-groups.test.js.map +7 -0
  60. package/dist/field-505-separators.js +19 -39
  61. package/dist/field-505-separators.js.map +7 -1
  62. package/dist/field-505-separators.test.js +45 -0
  63. package/dist/field-505-separators.test.js.map +7 -0
  64. package/dist/field-521-fix.js +19 -47
  65. package/dist/field-521-fix.js.map +7 -1
  66. package/dist/field-521-fix.test.js +44 -0
  67. package/dist/field-521-fix.test.js.map +7 -0
  68. package/dist/field-exclusion.js +37 -91
  69. package/dist/field-exclusion.js.map +7 -1
  70. package/dist/field-exclusion.test.js +821 -0
  71. package/dist/field-exclusion.test.js.map +7 -0
  72. package/dist/field-structure.js +52 -104
  73. package/dist/field-structure.js.map +7 -1
  74. package/dist/field-structure.test.js +587 -0
  75. package/dist/field-structure.test.js.map +7 -0
  76. package/dist/field33XUtils.js +119 -503
  77. package/dist/field33XUtils.js.map +7 -1
  78. package/dist/fields-present.js +11 -23
  79. package/dist/fields-present.js.map +7 -1
  80. package/dist/fields-present.test.js +95 -0
  81. package/dist/fields-present.test.js.map +7 -0
  82. package/dist/fix-33X.js +393 -431
  83. package/dist/fix-33X.js.map +7 -1
  84. package/dist/fix-33X.test.js +39 -0
  85. package/dist/fix-33X.test.js.map +7 -0
  86. package/dist/fix-country-codes.js +20 -50
  87. package/dist/fix-country-codes.js.map +7 -1
  88. package/dist/fix-country-codes.test.js +44 -0
  89. package/dist/fix-country-codes.test.js.map +7 -0
  90. package/dist/fix-language-codes.js +23 -53
  91. package/dist/fix-language-codes.js.map +7 -1
  92. package/dist/fix-language-codes.test.js +38 -0
  93. package/dist/fix-language-codes.test.js.map +7 -0
  94. package/dist/fixRelatorTerms.js +82 -209
  95. package/dist/fixRelatorTerms.js.map +7 -1
  96. package/dist/fixRelatorTerms.test.js +44 -0
  97. package/dist/fixRelatorTerms.test.js.map +7 -0
  98. package/dist/fixed-fields.js +21 -30
  99. package/dist/fixed-fields.js.map +7 -1
  100. package/dist/fixed-fields.test.js +87 -0
  101. package/dist/fixed-fields.test.js.map +7 -0
  102. package/dist/identical-fields.js +8 -24
  103. package/dist/identical-fields.js.map +7 -1
  104. package/dist/identical-fields.test.js +119 -0
  105. package/dist/identical-fields.test.js.map +7 -0
  106. package/dist/index.js +119 -413
  107. package/dist/index.js.map +7 -1
  108. package/dist/indicator-fixes.js +57 -95
  109. package/dist/indicator-fixes.js.map +7 -1
  110. package/dist/indicator-fixes.test.js +42 -0
  111. package/dist/indicator-fixes.test.js.map +7 -0
  112. package/dist/isbn-issn.js +66 -126
  113. package/dist/isbn-issn.js.map +7 -1
  114. package/dist/isbn-issn.test.js +398 -0
  115. package/dist/isbn-issn.test.js.map +7 -0
  116. package/dist/item-language.js +32 -65
  117. package/dist/item-language.js.map +7 -1
  118. package/dist/item-language.test.js +322 -0
  119. package/dist/item-language.test.js.map +7 -0
  120. package/dist/melindaCustomMergeFields.js +5182 -11233
  121. package/dist/melindaCustomMergeFields.js.map +7 -1
  122. package/dist/merge-fields/controlSubfields.js +75 -142
  123. package/dist/merge-fields/controlSubfields.js.map +7 -1
  124. package/dist/merge-fields/counterpartField.js +182 -379
  125. package/dist/merge-fields/counterpartField.js.map +7 -1
  126. package/dist/merge-fields/index.js +15 -49
  127. package/dist/merge-fields/index.js.map +7 -1
  128. package/dist/merge-fields/mergableIndicator.js +18 -51
  129. package/dist/merge-fields/mergableIndicator.js.map +7 -1
  130. package/dist/merge-fields/mergableTag.js +78 -30
  131. package/dist/merge-fields/mergableTag.js.map +7 -1
  132. package/dist/merge-fields/mergeConfig.js +66 -171
  133. package/dist/merge-fields/mergeConfig.js.map +7 -1
  134. package/dist/merge-fields/mergeConstraints.js +323 -1214
  135. package/dist/merge-fields/mergeConstraints.js.map +7 -1
  136. package/dist/merge-fields/mergeField.js +47 -111
  137. package/dist/merge-fields/mergeField.js.map +7 -1
  138. package/dist/merge-fields/mergeIndicator.js +64 -118
  139. package/dist/merge-fields/mergeIndicator.js.map +7 -1
  140. package/dist/merge-fields/mergeOrAddPostprocess.js +14 -38
  141. package/dist/merge-fields/mergeOrAddPostprocess.js.map +7 -1
  142. package/dist/merge-fields/mergeOrAddSubfield.js +62 -104
  143. package/dist/merge-fields/mergeOrAddSubfield.js.map +7 -1
  144. package/dist/merge-fields/mergeSubfield.js +47 -95
  145. package/dist/merge-fields/mergeSubfield.js.map +7 -1
  146. package/dist/merge-fields/removeDuplicateSubfields.js +18 -31
  147. package/dist/merge-fields/removeDuplicateSubfields.js.map +7 -1
  148. package/dist/merge-fields/worldKnowledge.js +15 -40
  149. package/dist/merge-fields/worldKnowledge.js.map +7 -1
  150. package/dist/merge-fields.test.js +44 -0
  151. package/dist/merge-fields.test.js.map +7 -0
  152. package/dist/mergeField500Lisapainokset.js +28 -57
  153. package/dist/mergeField500Lisapainokset.js.map +7 -1
  154. package/dist/mergeField500Lisapainokset.test.js +44 -0
  155. package/dist/mergeField500Lisapainokset.test.js.map +7 -0
  156. package/dist/mergeRelatorTermFields.js +33 -69
  157. package/dist/mergeRelatorTermFields.js.map +7 -1
  158. package/dist/mergeRelatorTermFields.test.js +44 -0
  159. package/dist/mergeRelatorTermFields.test.js.map +7 -0
  160. package/dist/modernize-502.js +23 -55
  161. package/dist/modernize-502.js.map +7 -1
  162. package/dist/modernize-502.test.js +38 -0
  163. package/dist/modernize-502.test.js.map +7 -0
  164. package/dist/multiple-subfield-0.js +23 -48
  165. package/dist/multiple-subfield-0.js.map +7 -1
  166. package/dist/multiple-subfield-0.test.js +44 -0
  167. package/dist/multiple-subfield-0.test.js.map +7 -0
  168. package/dist/non-breaking-space.js +11 -32
  169. package/dist/non-breaking-space.js.map +7 -1
  170. package/dist/non-breaking-space.test.js +38 -0
  171. package/dist/non-breaking-space.test.js.map +7 -0
  172. package/dist/normalize-dashes.js +18 -37
  173. package/dist/normalize-dashes.js.map +7 -1
  174. package/dist/normalize-dashes.test.js +44 -0
  175. package/dist/normalize-dashes.test.js.map +7 -0
  176. package/dist/normalize-identifiers.js +54 -140
  177. package/dist/normalize-identifiers.js.map +7 -1
  178. package/dist/normalize-identifiers.test.js +44 -0
  179. package/dist/normalize-identifiers.test.js.map +7 -0
  180. package/dist/normalize-qualifying-information.js +23 -48
  181. package/dist/normalize-qualifying-information.js.map +7 -1
  182. package/dist/normalize-qualifying-information.test.js +44 -0
  183. package/dist/normalize-qualifying-information.test.js.map +7 -0
  184. package/dist/normalize-utf8-diacritics.js +19 -105
  185. package/dist/normalize-utf8-diacritics.js.map +7 -1
  186. package/dist/normalize-utf8-diacritics.test.js +44 -0
  187. package/dist/normalize-utf8-diacritics.test.js.map +7 -0
  188. package/dist/normalizeFieldForComparison.js +67 -158
  189. package/dist/normalizeFieldForComparison.js.map +7 -1
  190. package/dist/normalizeSubfieldValueForComparison.js +37 -77
  191. package/dist/normalizeSubfieldValueForComparison.js.map +7 -1
  192. package/dist/prepublicationUtils.js +58 -111
  193. package/dist/prepublicationUtils.js.map +7 -1
  194. package/dist/punctuation/index.js +56 -72
  195. package/dist/punctuation/index.js.map +7 -1
  196. package/dist/punctuation/rules/aut.js +372 -331
  197. package/dist/punctuation/rules/aut.js.map +7 -1
  198. package/dist/punctuation/rules/bib.js +420 -373
  199. package/dist/punctuation/rules/bib.js.map +7 -1
  200. package/dist/punctuation/rules/index.js +7 -21
  201. package/dist/punctuation/rules/index.js.map +7 -1
  202. package/dist/punctuation.test.js +44 -0
  203. package/dist/punctuation.test.js.map +7 -0
  204. package/dist/punctuation2.js +251 -800
  205. package/dist/punctuation2.js.map +7 -1
  206. package/dist/punctuation2.test.js +44 -0
  207. package/dist/punctuation2.test.js.map +7 -0
  208. package/dist/reindexSubfield6OccurenceNumbers.js +61 -96
  209. package/dist/reindexSubfield6OccurenceNumbers.js.map +7 -1
  210. package/dist/reindexSubfield6OccurenceNumbers.test.js +44 -0
  211. package/dist/reindexSubfield6OccurenceNumbers.test.js.map +7 -0
  212. package/dist/removeDuplicateDataFields.js +102 -202
  213. package/dist/removeDuplicateDataFields.js.map +7 -1
  214. package/dist/removeDuplicateDataFields.test.js +44 -0
  215. package/dist/removeDuplicateDataFields.test.js.map +7 -0
  216. package/dist/removeInferiorDataFields.js +103 -227
  217. package/dist/removeInferiorDataFields.js.map +7 -1
  218. package/dist/removeInferiorDataFields.test.js +44 -0
  219. package/dist/removeInferiorDataFields.test.js.map +7 -0
  220. package/dist/resolvable-ext-references-melinda.js +25 -60
  221. package/dist/resolvable-ext-references-melinda.js.map +7 -1
  222. package/dist/resolvable-ext-references-melinda.test.js +160 -0
  223. package/dist/resolvable-ext-references-melinda.test.js.map +7 -0
  224. package/dist/resolveOrphanedSubfield6s.js +33 -64
  225. package/dist/resolveOrphanedSubfield6s.js.map +7 -1
  226. package/dist/resolveOrphanedSubfield6s.test.js +44 -0
  227. package/dist/resolveOrphanedSubfield6s.test.js.map +7 -0
  228. package/dist/sanitize-vocabulary-source-codes.js +27 -55
  229. package/dist/sanitize-vocabulary-source-codes.js.map +7 -1
  230. package/dist/sanitize-vocabulary-source-codes.test.js +45 -0
  231. package/dist/sanitize-vocabulary-source-codes.test.js.map +7 -0
  232. package/dist/sort-tags.js +13 -25
  233. package/dist/sort-tags.js.map +7 -1
  234. package/dist/sort-tags.test.js +261 -0
  235. package/dist/sort-tags.test.js.map +7 -0
  236. package/dist/sortFields.js +152 -222
  237. package/dist/sortFields.js.map +7 -1
  238. package/dist/sortFields.test.js +44 -0
  239. package/dist/sortFields.test.js.map +7 -0
  240. package/dist/sortRelatorTerms.js +30 -68
  241. package/dist/sortRelatorTerms.js.map +7 -1
  242. package/dist/sortRelatorTerms.test.js +44 -0
  243. package/dist/sortRelatorTerms.test.js.map +7 -0
  244. package/dist/sortSubfields.js +102 -255
  245. package/dist/sortSubfields.js.map +7 -1
  246. package/dist/sortSubfields.test.js +44 -0
  247. package/dist/sortSubfields.test.js.map +7 -0
  248. package/dist/stripPunctuation.js +13 -36
  249. package/dist/stripPunctuation.js.map +7 -1
  250. package/dist/stripPunctuation.test.js +44 -0
  251. package/dist/stripPunctuation.test.js.map +7 -0
  252. package/dist/subfield-exclusion.js +28 -75
  253. package/dist/subfield-exclusion.js.map +7 -1
  254. package/dist/subfield-exclusion.test.js +471 -0
  255. package/dist/subfield-exclusion.test.js.map +7 -0
  256. package/dist/subfield6Utils.js +107 -269
  257. package/dist/subfield6Utils.js.map +7 -1
  258. package/dist/subfield8Utils.js +26 -50
  259. package/dist/subfield8Utils.js.map +7 -1
  260. package/dist/subfieldValueNormalizations.js +40 -74
  261. package/dist/subfieldValueNormalizations.js.map +7 -1
  262. package/dist/subfieldValueNormalizations.test.js +45 -0
  263. package/dist/subfieldValueNormalizations.test.js.map +7 -0
  264. package/dist/sync-007-and-300.js +22 -53
  265. package/dist/sync-007-and-300.js.map +7 -1
  266. package/dist/sync-007-and-300.test.js +44 -0
  267. package/dist/sync-007-and-300.test.js.map +7 -0
  268. package/dist/translate-terms.js +67 -155
  269. package/dist/translate-terms.js.map +7 -1
  270. package/dist/translate-terms.test.js +44 -0
  271. package/dist/translate-terms.test.js.map +7 -0
  272. package/dist/typeOfDate-008.js +10 -25
  273. package/dist/typeOfDate-008.js.map +7 -1
  274. package/dist/typeOfDate-008.test.js +40 -0
  275. package/dist/typeOfDate-008.test.js.map +7 -0
  276. package/dist/unicode-decomposition.js +94 -107
  277. package/dist/unicode-decomposition.js.map +7 -1
  278. package/dist/unicode-decomposition.test.js +94 -0
  279. package/dist/unicode-decomposition.test.js.map +7 -0
  280. package/dist/update-field-540.js +30 -75
  281. package/dist/update-field-540.js.map +7 -1
  282. package/dist/update-field-540.test.js +44 -0
  283. package/dist/update-field-540.test.js.map +7 -0
  284. package/dist/urn.js +55 -128
  285. package/dist/urn.js.map +7 -1
  286. package/dist/urn.test.js +44 -0
  287. package/dist/urn.test.js.map +7 -0
  288. package/dist/utils.js +72 -126
  289. package/dist/utils.js.map +7 -1
  290. package/eslint.config.mjs +1 -2
  291. package/package.json +21 -93
  292. package/src/access-rights.js +1 -1
  293. package/src/{access-rights.spec.js → access-rights.test.js} +9 -10
  294. package/src/addMissingField041.js +1 -1
  295. package/src/{addMissingField336.spec.js → addMissingField041.test.js} +13 -14
  296. package/src/addMissingField336.js +3 -3
  297. package/src/{addMissingField041.spec.js → addMissingField336.test.js} +13 -14
  298. package/src/addMissingField337.js +2 -2
  299. package/src/{addMissingField337.spec.js → addMissingField337.test.js} +13 -14
  300. package/src/addMissingField338.js +2 -2
  301. package/src/{addMissingField338.spec.js → addMissingField338.test.js} +13 -14
  302. package/src/cyrillux-usemarcon-replacement.js +18 -18
  303. package/src/cyrillux-usemarcon-replacement.test.js +55 -0
  304. package/src/cyrillux.js +19 -12
  305. package/src/{cyrillux.spec.js → cyrillux.test.js} +13 -14
  306. package/src/disambiguateSeriesStatements.js +2 -2
  307. package/src/{disambiguateSeriesStatements.spec.js → disambiguateSeriesStatements.test.js} +12 -13
  308. package/src/double-commas.js +1 -1
  309. package/src/{double-commas.spec.js → double-commas.test.js} +9 -11
  310. package/src/duplicates-ind1.js +1 -1
  311. package/src/{duplicates-ind1.spec.js → duplicates-ind1.test.js} +12 -13
  312. package/src/{empty-fields.spec.js → empty-fields.test.js} +11 -13
  313. package/src/ending-punctuation.js +1 -1
  314. package/src/{ending-punctuation.spec.js → ending-punctuation.test.js} +172 -173
  315. package/src/{ending-whitespace.spec.js → ending-whitespace.test.js} +12 -13
  316. package/src/field-008-18-34-character-groups.js +2 -2
  317. package/src/{field-008-18-34-character-groups.spec.js → field-008-18-34-character-groups.test.js} +13 -13
  318. package/src/field-505-separators.js +3 -3
  319. package/src/{field-505-separators.spec.js → field-505-separators.test.js} +16 -14
  320. package/src/field-521-fix.js +2 -2
  321. package/src/{field-521-fix.spec.js → field-521-fix.test.js} +12 -13
  322. package/src/field-exclusion.js +1 -1
  323. package/src/{field-exclusion.spec.js → field-exclusion.test.js} +60 -57
  324. package/src/{field-structure.spec.js → field-structure.test.js} +29 -29
  325. package/src/{fields-present.spec.js → fields-present.test.js} +12 -15
  326. package/src/fix-33X.js +4 -4
  327. package/src/{fix-33X.spec.js → fix-33X.test.js} +13 -14
  328. package/src/fix-country-codes.js +1 -1
  329. package/src/{fix-country-codes.spec.js → fix-country-codes.test.js} +12 -13
  330. package/src/fix-language-codes.js +5 -5
  331. package/src/{fix-language-codes.spec.js → fix-language-codes.test.js} +12 -13
  332. package/src/fixRelatorTerms.js +5 -5
  333. package/src/{fixRelatorTerms.spec.js → fixRelatorTerms.test.js} +13 -13
  334. package/src/{fixed-fields.spec.js → fixed-fields.test.js} +11 -14
  335. package/src/identical-fields.js +1 -1
  336. package/src/{identical-fields.spec.js → identical-fields.test.js} +9 -11
  337. package/src/index.js +58 -58
  338. package/src/indicator-fixes.js +3 -3
  339. package/src/{indicator-fixes.spec.js → indicator-fixes.test.js} +9 -12
  340. package/src/isbn-issn.js +1 -1
  341. package/src/{isbn-issn.spec.js → isbn-issn.test.js} +20 -22
  342. package/src/{item-language.spec.js → item-language.test.js} +21 -22
  343. package/src/merge-fields/controlSubfields.js +1 -1
  344. package/src/merge-fields/counterpartField.js +8 -9
  345. package/src/merge-fields/index.js +1 -1
  346. package/src/merge-fields/mergableIndicator.js +1 -1
  347. package/src/merge-fields/mergeField.js +6 -6
  348. package/src/merge-fields/mergeIndicator.js +1 -1
  349. package/src/merge-fields/mergeOrAddPostprocess.js +4 -4
  350. package/src/merge-fields/mergeOrAddSubfield.js +2 -2
  351. package/src/merge-fields/mergeSubfield.js +4 -4
  352. package/src/merge-fields/removeDuplicateSubfields.js +2 -2
  353. package/src/{merge-fields.spec.js → merge-fields.test.js} +12 -13
  354. package/src/{mergeField500Lisapainokset.spec.js → mergeField500Lisapainokset.test.js} +12 -13
  355. package/src/mergeRelatorTermFields.js +5 -7
  356. package/src/{mergeRelatorTermFields.spec.js → mergeRelatorTermFields.test.js} +12 -13
  357. package/src/modernize-502.js +1 -1
  358. package/src/{modernize-502.spec.js → modernize-502.test.js} +12 -13
  359. package/src/multiple-subfield-0.js +3 -3
  360. package/src/{multiple-subfield-0.spec.js → multiple-subfield-0.test.js} +13 -13
  361. package/src/{non-breaking-space.spec.js → non-breaking-space.test.js} +12 -13
  362. package/src/normalize-dashes.js +2 -2
  363. package/src/{normalize-dashes.spec.js → normalize-dashes.test.js} +12 -13
  364. package/src/normalize-identifiers.js +1 -1
  365. package/src/{normalize-identifiers.spec.js → normalize-identifiers.test.js} +12 -13
  366. package/src/normalize-qualifying-information.js +2 -2
  367. package/src/{normalize-qualifying-information.spec.js → normalize-qualifying-information.test.js} +12 -13
  368. package/src/normalize-utf8-diacritics.js +2 -2
  369. package/src/{normalize-utf8-diacritics.spec.js → normalize-utf8-diacritics.test.js} +13 -13
  370. package/src/normalizeFieldForComparison.js +6 -6
  371. package/src/normalizeSubfieldValueForComparison.js +1 -1
  372. package/src/prepublicationUtils.js +4 -4
  373. package/src/punctuation/index.js +1 -1
  374. package/src/punctuation/rules/index.js +2 -2
  375. package/src/{punctuation.spec.js → punctuation.test.js} +12 -13
  376. package/src/punctuation2.js +4 -4
  377. package/src/{punctuation2.spec.js → punctuation2.test.js} +12 -13
  378. package/src/reindexSubfield6OccurenceNumbers.js +5 -7
  379. package/src/{reindexSubfield6OccurenceNumbers.spec.js → reindexSubfield6OccurenceNumbers.test.js} +12 -13
  380. package/src/removeDuplicateDataFields.js +11 -19
  381. package/src/{removeDuplicateDataFields.spec.js → removeDuplicateDataFields.test.js} +12 -13
  382. package/src/removeInferiorDataFields.js +11 -11
  383. package/src/{removeInferiorDataFields.spec.js → removeInferiorDataFields.test.js} +13 -13
  384. package/src/resolvable-ext-references-melinda.js +1 -1
  385. package/src/{resolvable-ext-references-melinda.spec.js → resolvable-ext-references-melinda.test.js} +42 -27
  386. package/src/resolveOrphanedSubfield6s.js +5 -5
  387. package/src/{resolveOrphanedSubfield6s.spec.js → resolveOrphanedSubfield6s.test.js} +13 -13
  388. package/src/sanitize-vocabulary-source-codes.js +4 -4
  389. package/src/{sanitize-vocabulary-source-codes.spec.js → sanitize-vocabulary-source-codes.test.js} +16 -14
  390. package/src/{sort-tags.spec.js → sort-tags.test.js} +9 -11
  391. package/src/sortFields.js +4 -4
  392. package/src/{sortFields.spec.js → sortFields.test.js} +12 -13
  393. package/src/sortRelatorTerms.js +3 -3
  394. package/src/{sortRelatorTerms.spec.js → sortRelatorTerms.test.js} +13 -13
  395. package/src/sortSubfields.js +1 -1
  396. package/src/{sortSubfields.spec.js → sortSubfields.test.js} +13 -13
  397. package/src/stripPunctuation.js +3 -3
  398. package/src/{stripPunctuation.spec.js → stripPunctuation.test.js} +13 -13
  399. package/src/subfield-exclusion.js +1 -1
  400. package/src/{subfield-exclusion.spec.js → subfield-exclusion.test.js} +45 -36
  401. package/src/subfield6Utils.js +6 -10
  402. package/src/subfield8Utils.js +4 -4
  403. package/src/subfieldValueNormalizations.js +3 -3
  404. package/src/{subfieldValueNormalizations.spec.js → subfieldValueNormalizations.test.js} +18 -14
  405. package/src/sync-007-and-300.js +2 -2
  406. package/src/{sync-007-and-300.spec.js → sync-007-and-300.test.js} +13 -13
  407. package/src/translate-terms.js +3 -3
  408. package/src/{translate-terms.spec.js → translate-terms.test.js} +13 -13
  409. package/src/{typeOfDate-008.spec.js → typeOfDate-008.test.js} +12 -13
  410. package/src/{unicode-decomposition.spec.js → unicode-decomposition.test.js} +10 -16
  411. package/src/update-field-540.js +2 -2
  412. package/src/{update-field-540.spec.js → update-field-540.test.js} +13 -10
  413. package/src/urn.js +2 -2
  414. package/src/{urn.spec.js → urn.test.js} +12 -13
  415. package/src/utils.js +3 -3
  416. package/test-fixtures/field-505-separators/03/expectedResult.json +3 -1
  417. package/test-fixtures/field-505-separators/03/record.json +3 -0
  418. package/test-fixtures/normalize-subfield-value/01/metadata.json +4 -1
  419. package/test-fixtures/normalize-subfield-value/01/record.json +3 -0
  420. package/test-fixtures/normalize-subfield-value/02/expectedResult.json +3 -1
  421. package/test-fixtures/normalize-subfield-value/02/metadata.json +2 -1
  422. package/test-fixtures/normalize-subfield-value/02/record.json +3 -0
  423. package/test-fixtures/sanitize-vocabulary-source-codes/f03/expectedResult.json +3 -1
  424. package/test-fixtures/sanitize-vocabulary-source-codes/f04/expectedResult.json +3 -1
  425. package/test-fixtures/sanitize-vocabulary-source-codes/v04/metadata.json +1 -4
  426. package/test-fixtures/sanitize-vocabulary-source-codes/v04/record.json +1 -1
  427. package/dist/access-rights.spec.js +0 -195
  428. package/dist/access-rights.spec.js.map +0 -1
  429. package/dist/addMissingField041.spec.js +0 -45
  430. package/dist/addMissingField041.spec.js.map +0 -1
  431. package/dist/addMissingField336.spec.js +0 -45
  432. package/dist/addMissingField336.spec.js.map +0 -1
  433. package/dist/addMissingField337.spec.js +0 -43
  434. package/dist/addMissingField337.spec.js.map +0 -1
  435. package/dist/addMissingField338.spec.js +0 -45
  436. package/dist/addMissingField338.spec.js.map +0 -1
  437. package/dist/cyrillux-usemarcon-replacement.spec.js +0 -45
  438. package/dist/cyrillux-usemarcon-replacement.spec.js.map +0 -1
  439. package/dist/cyrillux.spec.js +0 -46
  440. package/dist/cyrillux.spec.js.map +0 -1
  441. package/dist/disambiguateSeriesStatements.spec.js +0 -51
  442. package/dist/disambiguateSeriesStatements.spec.js.map +0 -1
  443. package/dist/double-commas.spec.js +0 -73
  444. package/dist/double-commas.spec.js.map +0 -1
  445. package/dist/duplicates-ind1.spec.js +0 -45
  446. package/dist/duplicates-ind1.spec.js.map +0 -1
  447. package/dist/empty-fields.spec.js +0 -118
  448. package/dist/empty-fields.spec.js.map +0 -1
  449. package/dist/ending-punctuation.spec.js +0 -2654
  450. package/dist/ending-punctuation.spec.js.map +0 -1
  451. package/dist/ending-whitespace.spec.js +0 -42
  452. package/dist/ending-whitespace.spec.js.map +0 -1
  453. package/dist/field-008-18-34-character-groups.spec.js +0 -51
  454. package/dist/field-008-18-34-character-groups.spec.js.map +0 -1
  455. package/dist/field-505-separators.spec.js +0 -51
  456. package/dist/field-505-separators.spec.js.map +0 -1
  457. package/dist/field-521-fix.spec.js +0 -51
  458. package/dist/field-521-fix.spec.js.map +0 -1
  459. package/dist/field-exclusion.spec.js +0 -1054
  460. package/dist/field-exclusion.spec.js.map +0 -1
  461. package/dist/field-structure.spec.js +0 -535
  462. package/dist/field-structure.spec.js.map +0 -1
  463. package/dist/fields-present.spec.js +0 -121
  464. package/dist/fields-present.spec.js.map +0 -1
  465. package/dist/fix-33X.spec.js +0 -45
  466. package/dist/fix-33X.spec.js.map +0 -1
  467. package/dist/fix-country-codes.spec.js +0 -51
  468. package/dist/fix-country-codes.spec.js.map +0 -1
  469. package/dist/fix-language-codes.spec.js +0 -44
  470. package/dist/fix-language-codes.spec.js.map +0 -1
  471. package/dist/fixRelatorTerms.spec.js +0 -51
  472. package/dist/fixRelatorTerms.spec.js.map +0 -1
  473. package/dist/fixed-fields.spec.js +0 -140
  474. package/dist/fixed-fields.spec.js.map +0 -1
  475. package/dist/identical-fields.spec.js +0 -99
  476. package/dist/identical-fields.spec.js.map +0 -1
  477. package/dist/indicator-fixes.spec.js +0 -51
  478. package/dist/indicator-fixes.spec.js.map +0 -1
  479. package/dist/isbn-issn.spec.js +0 -595
  480. package/dist/isbn-issn.spec.js.map +0 -1
  481. package/dist/item-language.spec.js +0 -306
  482. package/dist/item-language.spec.js.map +0 -1
  483. package/dist/melindaCustomMergeFields.json +0 -5120
  484. package/dist/merge-fields.spec.js +0 -51
  485. package/dist/merge-fields.spec.js.map +0 -1
  486. package/dist/mergeField500Lisapainokset.spec.js +0 -51
  487. package/dist/mergeField500Lisapainokset.spec.js.map +0 -1
  488. package/dist/mergeRelatorTermFields.spec.js +0 -51
  489. package/dist/mergeRelatorTermFields.spec.js.map +0 -1
  490. package/dist/modernize-502.spec.js +0 -49
  491. package/dist/modernize-502.spec.js.map +0 -1
  492. package/dist/multiple-subfield-0.spec.js +0 -51
  493. package/dist/multiple-subfield-0.spec.js.map +0 -1
  494. package/dist/non-breaking-space.spec.js +0 -42
  495. package/dist/non-breaking-space.spec.js.map +0 -1
  496. package/dist/normalize-dashes.spec.js +0 -51
  497. package/dist/normalize-dashes.spec.js.map +0 -1
  498. package/dist/normalize-identifiers.spec.js +0 -51
  499. package/dist/normalize-identifiers.spec.js.map +0 -1
  500. package/dist/normalize-qualifying-information.spec.js +0 -51
  501. package/dist/normalize-qualifying-information.spec.js.map +0 -1
  502. package/dist/normalize-utf8-diacritics.spec.js +0 -51
  503. package/dist/normalize-utf8-diacritics.spec.js.map +0 -1
  504. package/dist/punctuation.spec.js +0 -51
  505. package/dist/punctuation.spec.js.map +0 -1
  506. package/dist/punctuation2.spec.js +0 -51
  507. package/dist/punctuation2.spec.js.map +0 -1
  508. package/dist/reindexSubfield6OccurenceNumbers.spec.js +0 -51
  509. package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +0 -1
  510. package/dist/removeDuplicateDataFields.spec.js +0 -51
  511. package/dist/removeDuplicateDataFields.spec.js.map +0 -1
  512. package/dist/removeInferiorDataFields.spec.js +0 -51
  513. package/dist/removeInferiorDataFields.spec.js.map +0 -1
  514. package/dist/resolvable-ext-references-melinda.spec.js +0 -166
  515. package/dist/resolvable-ext-references-melinda.spec.js.map +0 -1
  516. package/dist/resolveOrphanedSubfield6s.spec.js +0 -51
  517. package/dist/resolveOrphanedSubfield6s.spec.js.map +0 -1
  518. package/dist/sanitize-vocabulary-source-codes.spec.js +0 -51
  519. package/dist/sanitize-vocabulary-source-codes.spec.js.map +0 -1
  520. package/dist/sort-tags.spec.js +0 -207
  521. package/dist/sort-tags.spec.js.map +0 -1
  522. package/dist/sortFields.spec.js +0 -51
  523. package/dist/sortFields.spec.js.map +0 -1
  524. package/dist/sortRelatorTerms.spec.js +0 -51
  525. package/dist/sortRelatorTerms.spec.js.map +0 -1
  526. package/dist/sortSubfields.spec.js +0 -52
  527. package/dist/sortSubfields.spec.js.map +0 -1
  528. package/dist/stripPunctuation.spec.js +0 -51
  529. package/dist/stripPunctuation.spec.js.map +0 -1
  530. package/dist/subfield-exclusion.spec.js +0 -523
  531. package/dist/subfield-exclusion.spec.js.map +0 -1
  532. package/dist/subfieldValueNormalizations.spec.js +0 -51
  533. package/dist/subfieldValueNormalizations.spec.js.map +0 -1
  534. package/dist/sync-007-and-300.spec.js +0 -51
  535. package/dist/sync-007-and-300.spec.js.map +0 -1
  536. package/dist/translate-terms.spec.js +0 -51
  537. package/dist/translate-terms.spec.js.map +0 -1
  538. package/dist/typeOfDate-008.spec.js +0 -47
  539. package/dist/typeOfDate-008.spec.js.map +0 -1
  540. package/dist/unicode-decomposition.spec.js +0 -91
  541. package/dist/unicode-decomposition.spec.js.map +0 -1
  542. package/dist/update-field-540.spec.js +0 -51
  543. package/dist/update-field-540.spec.js.map +0 -1
  544. package/dist/urn.spec.js +0 -52
  545. package/dist/urn.spec.js.map +0 -1
  546. package/src/cyrillux-usemarcon-replacement.spec.js +0 -47
package/dist/urn.js.map CHANGED
@@ -1 +1,7 @@
1
- {"version":3,"file":"urn.js","names":["_nodeFetch","_interopRequireDefault","require","_utils","_debug","e","__esModule","default","URN_GENERATOR_URL","_default","isLegalDeposit","useMelindaTemp","debug","createDebugLogger","debugData","extend","hasLegalDepositURN","field","tag","includes","ind2","subfields","some","sf","code","value","test","description","validate","fix","record","f856sUrn","fields","filter","JSON","stringify","ldSubfields","createLDSubfields","length","generated","createURNSubfield","tempSubField","insertField","ind1","forEach","f","hasOld856LdPhrase","find","ldsf","push","rec","isbn","reduce","acc","a","undefined","createURN","response","fetch","body","text","fieldHasLDSubfields","every","validateLD","f856sUrnWithLdSubfields","isElectronicMaterial","valid"],"sources":["../src/urn.js"],"sourcesContent":["import fetch from 'node-fetch';\nimport {isElectronicMaterial} from './utils';\nimport createDebugLogger from 'debug';\n\nconst URN_GENERATOR_URL = 'https://generator.urn.fi/cgi-bin/urn_generator.cgi?type=nbn';\n\nexport default function (isLegalDeposit = false, useMelindaTemp = true) {\n const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:urn');\n const debugData = debug.extend('data');\n\n //console.log(`IS LEGAL DEPOSIT? ${isLegalDeposit ? 'YES' : 'NO'}`); // eslint-disable-line no-console\n\n // We should check that the f856 with URN has second indicator '0' (Resource), ' ' (No information provided) or '8' (No display constant generated)\n // - if second indicator is '1' (Version of resource) or '2' (Related resource) the URN in f856 is not correct for the resource described in the record\n\n // This checks only the existence of URNs from the Finnish urn.fi -resolver\n\n function hasLegalDepositURN(field) {\n if (field.tag !== '856' || ['1', '2', '3', '4'].includes(field.ind2)) {\n return false;\n }\n\n // First attempt to fix MET-573. However, does useMelindaTemp come into play as well?\n if (isLegalDeposit && !field.subfields.some(sf => sf.code === '5' && sf.value === 'FI-Vapaa')) {\n return false;\n }\n\n return field.subfields.some(sf => sf.code === 'u' && (/^https?:\\/\\/urn\\.fi/u).test(sf.value));\n }\n\n\n return {\n description: 'Adds URN for record, to 856-field (if not existing). If isLegalDeposit is active, adds legal deposit subfields to the f856s with URN.',\n validate,\n fix\n };\n\n async function fix(record) {\n const f856sUrn = record.fields.filter(hasLegalDepositURN);\n debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);\n\n const ldSubfields = isLegalDeposit ? createLDSubfields() : [];\n debugData(`IsLegalDeposit: ${isLegalDeposit}, LegalDepositSubfields: ${JSON.stringify(ldSubfields)}`);\n\n // We add the URN even if we're not getting the legalDeposit - where does this URN resolve?\n // We probably should not do these additions\n\n if (f856sUrn.length === 0) {\n const {code, value, generated} = await createURNSubfield(record);\n\n if (generated && useMelindaTemp) {\n const tempSubField = {code: '9', value: 'MELINDA<TEMP>'};\n\n record.insertField({\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code, value}, ...ldSubfields, tempSubField]\n });\n\n return true;\n }\n\n record.insertField({\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code, value}, ...ldSubfields]\n });\n\n return true;\n }\n\n if (isLegalDeposit) {\n\n // We add here legal deposit information to all URN-f856s - we probably should not do this\n // We should add extra f856 URN / URNs for legal deposits that already have a open (non-legal-deposit) URN\n // How do we decide which URN to use as a template if there are several URNs\n // We should check for existence of a legal deposit URN anyways\n\n f856sUrn.forEach(f => {\n // Change phrase from old to new if field with old phrase is found\n if (f.subfields.some(sf => hasOld856LdPhrase(sf))) {\n f.subfields\n .find(sf => hasOld856LdPhrase(sf))\n .value = 'Käytettävissä vapaakappaletyöasemilla';\n }\n\n // Create subfields if necessary\n ldSubfields.forEach(ldsf => {\n if (!f.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value && !hasOld856LdPhrase(sf))) {\n f.subfields.push(ldsf);\n }\n });\n });\n }\n\n return true;\n\n // We should check existence of URN in f024 i1: '7' $2 urn/URN for this too\n\n async function createURNSubfield(rec) {\n // isbn is picked from the last 020 $a in the record\n // what should we do in case of several 020 $a:s\n const isbn = rec.fields.reduce((acc, f) => {\n if (f.tag === '020') {\n const a = f.subfields.find(sf => sf.code === 'a');\n return a ? a.value : undefined;\n }\n\n return acc;\n }, undefined);\n\n debugData(`isbns: ${isbn}`);\n\n const {generated, value} = await createURN(isbn);\n return {code: 'u', value, generated};\n\n async function createURN(isbn = false) {\n if (isbn) {\n return {generated: false, value: `https://urn.fi/URN:ISBN:${isbn}`};\n }\n\n const response = await fetch(URN_GENERATOR_URL);\n const body = await response.text();\n\n // If we generated URN we could also add it to the 024\n // generated 024 should also have $9 MELINDA<TEMP>\n return {generated: true, value: `https://urn.fi/${body}`};\n }\n }\n\n function hasOld856LdPhrase({code, value}) {\n if (code === 'z' && value === 'Käytettävissä vapaakappalekirjastoissa') {\n return true;\n }\n\n return false;\n }\n\n }\n\n // Later when the new subfields that have f506/f540 -type contents, we should add also them here\n function createLDSubfields() {\n return [\n {\n code: 'z',\n value: 'Käytettävissä vapaakappaletyöasemilla'\n },\n {\n code: '5',\n value: 'FI-Vapaa'\n }\n ];\n }\n\n function fieldHasLDSubfields(field, ldSubfields) {\n if (ldSubfields.every(ldsf => field.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value))) {\n return true;\n }\n }\n\n function validateLD(f856sUrn) {\n debug(`Validating the existence of legal deposit subfields`);\n const ldSubfields = createLDSubfields();\n const f856sUrnWithLdSubfields = f856sUrn.filter(field => fieldHasLDSubfields(field, ldSubfields));\n if (f856sUrnWithLdSubfields.length > 0) {\n debug(`Record has ${f856sUrnWithLdSubfields.length} URN fields with all necessary legal deposit subfields`);\n debugData(`f856sUrnWithLdSubfields: ${JSON.stringify(f856sUrnWithLdSubfields)}`);\n return true;\n }\n return false;\n }\n\n function validate(record) {\n // if not electronic skip this validator\n if (!isElectronicMaterial(record)) {\n debug(`Record is not electronic - no need to validate legal deposit URNs`);\n return {valid: true};\n }\n\n const f856sUrn = record.fields.filter(hasLegalDepositURN);\n\n if (f856sUrn.length > 0) {\n debug(`Record has ${f856sUrn.length} URN fields`);\n debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);\n\n if (!isLegalDeposit || validateLD(f856sUrn)) {\n debug(`Record is valid`);\n return {valid: true};\n }\n }\n debug(`No (valid) URN fields - Record is not valid`);\n return {valid: false};\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/urn.js"],
4
+ "sourcesContent": ["//import fetch from 'node-fetch';\nimport {isElectronicMaterial} from './utils.js';\nimport createDebugLogger from 'debug';\n\nconst URN_GENERATOR_URL = 'https://generator.urn.fi/cgi-bin/urn_generator.cgi?type=nbn';\n\nexport default function (isLegalDeposit = false, useMelindaTemp = true) {\n const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:urn');\n const debugData = debug.extend('data');\n\n //console.log(`IS LEGAL DEPOSIT? ${isLegalDeposit ? 'YES' : 'NO'}`); // eslint-disable-line no-console\n\n // We should check that the f856 with URN has second indicator '0' (Resource), ' ' (No information provided) or '8' (No display constant generated)\n // - if second indicator is '1' (Version of resource) or '2' (Related resource) the URN in f856 is not correct for the resource described in the record\n\n // This checks only the existence of URNs from the Finnish urn.fi -resolver\n\n function hasLegalDepositURN(field) {\n if (field.tag !== '856' || ['1', '2', '3', '4'].includes(field.ind2)) {\n return false;\n }\n\n // First attempt to fix MET-573. However, does useMelindaTemp come into play as well?\n if (isLegalDeposit && !field.subfields.some(sf => sf.code === '5' && sf.value === 'FI-Vapaa')) {\n return false;\n }\n\n return field.subfields.some(sf => sf.code === 'u' && (/^https?:\\/\\/urn\\.fi/u).test(sf.value));\n }\n\n\n return {\n description: 'Adds URN for record, to 856-field (if not existing). If isLegalDeposit is active, adds legal deposit subfields to the f856s with URN.',\n validate,\n fix\n };\n\n async function fix(record) {\n const f856sUrn = record.fields.filter(hasLegalDepositURN);\n debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);\n\n const ldSubfields = isLegalDeposit ? createLDSubfields() : [];\n debugData(`IsLegalDeposit: ${isLegalDeposit}, LegalDepositSubfields: ${JSON.stringify(ldSubfields)}`);\n\n // We add the URN even if we're not getting the legalDeposit - where does this URN resolve?\n // We probably should not do these additions\n\n if (f856sUrn.length === 0) {\n const {code, value, generated} = await createURNSubfield(record);\n\n if (generated && useMelindaTemp) {\n const tempSubField = {code: '9', value: 'MELINDA<TEMP>'};\n\n record.insertField({\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code, value}, ...ldSubfields, tempSubField]\n });\n\n return true;\n }\n\n record.insertField({\n tag: '856',\n ind1: '4',\n ind2: '0',\n subfields: [{code, value}, ...ldSubfields]\n });\n\n return true;\n }\n\n if (isLegalDeposit) {\n\n // We add here legal deposit information to all URN-f856s - we probably should not do this\n // We should add extra f856 URN / URNs for legal deposits that already have a open (non-legal-deposit) URN\n // How do we decide which URN to use as a template if there are several URNs\n // We should check for existence of a legal deposit URN anyways\n\n f856sUrn.forEach(f => {\n // Change phrase from old to new if field with old phrase is found\n if (f.subfields.some(sf => hasOld856LdPhrase(sf))) {\n f.subfields\n .find(sf => hasOld856LdPhrase(sf))\n .value = 'K\u00E4ytett\u00E4viss\u00E4 vapaakappalety\u00F6asemilla';\n }\n\n // Create subfields if necessary\n ldSubfields.forEach(ldsf => {\n if (!f.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value && !hasOld856LdPhrase(sf))) {\n f.subfields.push(ldsf);\n }\n });\n });\n }\n\n return true;\n\n // We should check existence of URN in f024 i1: '7' $2 urn/URN for this too\n\n async function createURNSubfield(rec) {\n // isbn is picked from the last 020 $a in the record\n // what should we do in case of several 020 $a:s\n const isbn = rec.fields.reduce((acc, f) => {\n if (f.tag === '020') {\n const a = f.subfields.find(sf => sf.code === 'a');\n return a ? a.value : undefined;\n }\n\n return acc;\n }, undefined);\n\n debugData(`isbns: ${isbn}`);\n\n const {generated, value} = await createURN(isbn);\n return {code: 'u', value, generated};\n\n async function createURN(isbn = false) {\n if (isbn) {\n return {generated: false, value: `https://urn.fi/URN:ISBN:${isbn}`};\n }\n\n const response = await fetch(URN_GENERATOR_URL);\n const body = await response.text();\n\n // If we generated URN we could also add it to the 024\n // generated 024 should also have $9 MELINDA<TEMP>\n return {generated: true, value: `https://urn.fi/${body}`};\n }\n }\n\n function hasOld856LdPhrase({code, value}) {\n if (code === 'z' && value === 'K\u00E4ytett\u00E4viss\u00E4 vapaakappalekirjastoissa') {\n return true;\n }\n\n return false;\n }\n\n }\n\n // Later when the new subfields that have f506/f540 -type contents, we should add also them here\n function createLDSubfields() {\n return [\n {\n code: 'z',\n value: 'K\u00E4ytett\u00E4viss\u00E4 vapaakappalety\u00F6asemilla'\n },\n {\n code: '5',\n value: 'FI-Vapaa'\n }\n ];\n }\n\n function fieldHasLDSubfields(field, ldSubfields) {\n if (ldSubfields.every(ldsf => field.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value))) {\n return true;\n }\n }\n\n function validateLD(f856sUrn) {\n debug(`Validating the existence of legal deposit subfields`);\n const ldSubfields = createLDSubfields();\n const f856sUrnWithLdSubfields = f856sUrn.filter(field => fieldHasLDSubfields(field, ldSubfields));\n if (f856sUrnWithLdSubfields.length > 0) {\n debug(`Record has ${f856sUrnWithLdSubfields.length} URN fields with all necessary legal deposit subfields`);\n debugData(`f856sUrnWithLdSubfields: ${JSON.stringify(f856sUrnWithLdSubfields)}`);\n return true;\n }\n return false;\n }\n\n function validate(record) {\n // if not electronic skip this validator\n if (!isElectronicMaterial(record)) {\n debug(`Record is not electronic - no need to validate legal deposit URNs`);\n return {valid: true};\n }\n\n const f856sUrn = record.fields.filter(hasLegalDepositURN);\n\n if (f856sUrn.length > 0) {\n debug(`Record has ${f856sUrn.length} URN fields`);\n debugData(`f856sUrn: ${JSON.stringify(f856sUrn)}`);\n\n if (!isLegalDeposit || validateLD(f856sUrn)) {\n debug(`Record is valid`);\n return {valid: true};\n }\n }\n debug(`No (valid) URN fields - Record is not valid`);\n return {valid: false};\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["isbn"]
7
+ }
@@ -0,0 +1,44 @@
1
+ import assert from "node:assert";
2
+ import { MarcRecord } from "@natlibfi/marc-record";
3
+ import validatorFactory from "../src/urn.js";
4
+ import { READERS } from "@natlibfi/fixura";
5
+ import generateTests from "@natlibfi/fixugen";
6
+ import createDebugLogger from "debug";
7
+ generateTests({
8
+ callback,
9
+ path: [import.meta.dirname, "..", "test-fixtures", "urn"],
10
+ useMetadataFile: true,
11
+ recurse: false,
12
+ fixura: {
13
+ reader: READERS.JSON
14
+ },
15
+ hooks: {
16
+ before: async () => {
17
+ testValidatorFactory();
18
+ }
19
+ }
20
+ });
21
+ const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda/urn:test");
22
+ async function testValidatorFactory() {
23
+ const validator = await validatorFactory();
24
+ assert.equal(typeof validator, "object");
25
+ assert.equal(typeof validator.description, "string");
26
+ assert.equal(typeof validator.validate, "function");
27
+ }
28
+ async function callback({ getFixture, enabled = true, fix = true, isLegalDeposit = false }) {
29
+ if (enabled === false) {
30
+ debug("TEST SKIPPED!");
31
+ return;
32
+ }
33
+ const validator = await validatorFactory(isLegalDeposit);
34
+ const record = new MarcRecord(getFixture("input.json"));
35
+ const expectedResult = getFixture("result.json");
36
+ if (!fix) {
37
+ const result = await validator.validate(record);
38
+ assert.deepEqual(result, expectedResult);
39
+ return;
40
+ }
41
+ await validator.fix(record);
42
+ assert.deepEqual(record, expectedResult);
43
+ }
44
+ //# sourceMappingURL=urn.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/urn.test.js"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/urn.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'urn'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/urn:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n}\n\nasync function callback({getFixture, enabled = true, fix = true, isLegalDeposit = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory(isLegalDeposit);\n const record = new MarcRecord(getFixture('input.json'));\n const expectedResult = getFixture('result.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
5
+ "mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAC1B,OAAO,uBAAuB;AAE9B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,KAAK;AAAA,EACxD,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,YAAY;AAClB,2BAAqB;AAAA,IACvB;AAAA,EACF;AACF,CAAC;AACD,MAAM,QAAQ,kBAAkB,mDAAmD;AAEnF,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,SAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AACpD;AAEA,eAAe,SAAS,EAAC,YAAY,UAAU,MAAM,MAAM,MAAM,iBAAiB,MAAK,GAAG;AACxF,MAAI,YAAY,OAAO;AACrB,UAAM,eAAe;AACrB;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,iBAAiB,cAAc;AACvD,QAAM,SAAS,IAAI,WAAW,WAAW,YAAY,CAAC;AACtD,QAAM,iBAAiB,WAAW,aAAa;AAG/C,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,cAAc;AACzC;",
6
+ "names": []
7
+ }
package/dist/utils.js CHANGED
@@ -1,228 +1,174 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.fieldHasMultipleSubfields = fieldHasMultipleSubfields;
7
- exports.fieldHasNSubfields = fieldHasNSubfields;
8
- exports.fieldHasSubfield = fieldHasSubfield;
9
- exports.fieldToString = fieldToString;
10
- exports.fieldsAreIdentical = fieldsAreIdentical;
11
- exports.fieldsToString = fieldsToString;
12
- exports.getCatalogingLanguage = getCatalogingLanguage;
13
- exports.hasCopyright = hasCopyright;
14
- exports.isControlSubfieldCode = isControlSubfieldCode;
15
- exports.isElectronicMaterial = isElectronicMaterial;
16
- exports.marc21GetTagsLegalInd1Value = marc21GetTagsLegalInd1Value;
17
- exports.marc21GetTagsLegalInd2Value = marc21GetTagsLegalInd2Value;
18
- exports.nvdebug = nvdebug;
19
- exports.nvdebugFieldArray = nvdebugFieldArray;
20
- exports.nvdebugSubfieldArray = nvdebugSubfieldArray;
21
- exports.recordRemoveValuelessSubfields = recordRemoveValuelessSubfields;
22
- exports.recordToString = recordToString;
23
- exports.removeCopyright = removeCopyright;
24
- exports.removeSubfield = removeSubfield;
25
- exports.subfieldIsRepeatable = subfieldIsRepeatable;
26
- exports.subfieldToString = subfieldToString;
27
- exports.subfieldsAreIdentical = subfieldsAreIdentical;
28
- exports.uniqArray = uniqArray;
29
- var _debug = _interopRequireDefault(require("debug"));
30
- var _melindaCustomMergeFields = require("./melindaCustomMergeFields");
31
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
32
- //import fs from 'fs';
33
- //import path from 'path';
34
-
35
- const debug = (0, _debug.default)('@natlibfi/melinda-marc-record-merge-reducers:utils');
36
- //const debugData = debug.extend('data');
37
- const debugDev = debug.extend('dev');
38
- //JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'src', 'melindaCustomMergeFields.json'), 'utf8'));
39
-
40
- function isElectronicMaterial(record) {
41
- const f337s = record.get('337');
42
- return f337s.length > 0 && f337s.some(f => fieldHasSubfield(f, 'b', 'c') && fieldHasSubfield(f, '2', 'rdamedia'));
43
- }
44
- function nvdebug(message, func = undefined) {
1
+ import createDebugLogger from "debug";
2
+ const debug = createDebugLogger("@natlibfi/melinda-marc-record-merge-reducers:utils");
3
+ const debugDev = debug.extend("dev");
4
+ import { melindaCustomMergeFields as melindaFields } from "./melindaCustomMergeFields.js";
5
+ export function isElectronicMaterial(record) {
6
+ const f337s = record.get("337");
7
+ return f337s.length > 0 && f337s.some((f) => fieldHasSubfield(f, "b", "c") && fieldHasSubfield(f, "2", "rdamedia"));
8
+ }
9
+ export function nvdebug(message, func = void 0) {
45
10
  if (func) {
46
11
  func(message);
47
12
  }
48
- //console.info(message); // eslint-disable-line no-console
49
13
  }
50
- function fieldHasSubfield(field, subfieldCode, subfieldValue = null) {
14
+ export function fieldHasSubfield(field, subfieldCode, subfieldValue = null) {
51
15
  if (!field.subfields) {
52
16
  return false;
53
17
  }
54
18
  if (subfieldValue === null) {
55
- return field.subfields.some(sf => sf.code === subfieldCode);
19
+ return field.subfields.some((sf) => sf.code === subfieldCode);
56
20
  }
57
- return field.subfields.some(sf => sf.code === subfieldCode && subfieldValue === sf.value);
21
+ return field.subfields.some((sf) => sf.code === subfieldCode && subfieldValue === sf.value);
58
22
  }
59
- function subfieldToString(sf) {
23
+ export function subfieldToString(sf) {
60
24
  if (!sf.value) {
61
- return `‡${sf.code}`;
25
+ return `\u2021${sf.code}`;
62
26
  }
63
- return `‡${sf.code} ${sf.value}`;
27
+ return `\u2021${sf.code} ${sf.value}`;
64
28
  }
65
29
  function normalizeIndicatorValue(val) {
66
- if (val === ' ') {
67
- return '#';
30
+ if (val === " ") {
31
+ return "#";
68
32
  }
69
33
  return val;
70
34
  }
71
- function recordToString(record) {
35
+ export function recordToString(record) {
72
36
  const ldr = `LDR ${record.leader}`;
73
- const fields = record.fields.map(f => fieldToString(f));
74
- return `${ldr}\n${fields.join('\n')}`;
37
+ const fields = record.fields.map((f) => fieldToString(f));
38
+ return `${ldr}
39
+ ${fields.join("\n")}`;
75
40
  }
76
- function removeSubfield(record, tag, subfieldCode) {
77
- record.fields = record.fields.map(field => {
41
+ export function removeSubfield(record, tag, subfieldCode) {
42
+ record.fields = record.fields.map((field) => {
78
43
  if (field.tag !== tag || !field.subfields) {
79
- // Don't procss irrelevant fields
80
44
  return field;
81
45
  }
82
- field.subfields = field.subfields.filter(sf => sf.code !== subfieldCode);
46
+ field.subfields = field.subfields.filter((sf) => sf.code !== subfieldCode);
83
47
  if (field.subfields.length === 0) {
84
48
  return false;
85
49
  }
86
50
  return field;
87
- }).filter(field => field);
51
+ }).filter((field) => field);
88
52
  }
89
- function recordRemoveValuelessSubfields(record) {
90
- record.fields = record.fields.map(field => {
53
+ export function recordRemoveValuelessSubfields(record) {
54
+ record.fields = record.fields.map((field) => {
91
55
  if (!field.subfields) {
92
- // Keep control fields
93
56
  return field;
94
57
  }
95
- // Remove empty subfields from datafields:
96
- field.subfields = field.subfields.filter(sf => sf.value);
58
+ field.subfields = field.subfields.filter((sf) => sf.value);
97
59
  if (field.subfields && field.subfields.length === 0) {
98
- return false; // Return false instead of a field if field has no subfields left. These will soon be filtered out.
60
+ return false;
99
61
  }
100
- return field; //if field has subfields return it
101
- }).filter(field => field); // Filter those falses out
62
+ return field;
63
+ }).filter((field) => field);
102
64
  }
103
- function fieldToString(f) {
104
- if ('subfields' in f) {
65
+ export function fieldToString(f) {
66
+ if ("subfields" in f) {
105
67
  return `${f.tag} ${normalizeIndicatorValue(f.ind1)}${normalizeIndicatorValue(f.ind2)}${formatSubfields(f)}`;
106
68
  }
107
69
  return `${f.tag} ${f.value}`;
108
70
  function formatSubfields(field) {
109
- return field.subfields.map(sf => ` ${subfieldToString(sf)}`).join('');
71
+ return field.subfields.map((sf) => ` ${subfieldToString(sf)}`).join("");
110
72
  }
111
73
  }
112
- function fieldsToString(fields) {
113
- return fields.map(f => fieldToString(f)).join('\t__SEPARATOR__\t');
74
+ export function fieldsToString(fields) {
75
+ return fields.map((f) => fieldToString(f)).join(" __SEPARATOR__ ");
114
76
  }
115
- function nvdebugFieldArray(fields, prefix = ' ', func = undefined) {
116
- fields.forEach(field => nvdebug(`${prefix}${fieldToString(field)}`, func)); // eslint-disable-line array-callback-return
77
+ export function nvdebugFieldArray(fields, prefix = " ", func = void 0) {
78
+ fields.forEach((field) => nvdebug(`${prefix}${fieldToString(field)}`, func));
117
79
  }
118
- function isControlSubfieldCode(subfieldCode) {
119
- if (['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'w'].includes(subfieldCode)) {
80
+ export function isControlSubfieldCode(subfieldCode) {
81
+ if (["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "w"].includes(subfieldCode)) {
120
82
  return true;
121
83
  }
122
84
  return false;
123
85
  }
124
- function getCatalogingLanguage(record, defaultCatalogingLanguage = undefined) {
86
+ export function getCatalogingLanguage(record, defaultCatalogingLanguage = void 0) {
125
87
  const [field040] = record.get(/^040$/u);
126
88
  if (!field040) {
127
89
  return defaultCatalogingLanguage;
128
90
  }
129
- const [b] = field040.subfields.filter(sf => sf.code === 'b');
91
+ const [b] = field040.subfields.filter((sf) => sf.code === "b");
130
92
  if (!b) {
131
93
  return defaultCatalogingLanguage;
132
94
  }
133
95
  return b.value;
134
96
  }
135
- function uniqArray(arr) {
97
+ export function uniqArray(arr) {
136
98
  return arr.filter((val, i) => arr.indexOf(val) === i);
137
99
  }
138
- function fieldsAreIdentical(field1, field2) {
100
+ export function fieldsAreIdentical(field1, field2) {
139
101
  if (field1.tag !== field2.tag) {
140
- // NB! We are skipping normalizations here on purpose! They should be done beforehand...
141
102
  return false;
142
103
  }
143
104
  return fieldToString(field1) === fieldToString(field2);
144
-
145
- // The order of subfields is relevant! Bloody JS idiotisms make people use conditions such as:
146
- // return field1.subfields.every(sf => field2.subfields.some(sf2 => sf.code === sf2.code && sf.value === sf2.value));
147
105
  }
148
- function fieldHasNSubfields(field, subfieldCode /*, subfieldValue = null*/) {
149
- const relevantSubfields = field.subfields.filter(sf => sf.code === subfieldCode);
150
- //if (subfieldValue === null) {
106
+ export function fieldHasNSubfields(field, subfieldCode) {
107
+ const relevantSubfields = field.subfields.filter((sf) => sf.code === subfieldCode);
151
108
  return relevantSubfields.length;
152
- //}
153
- //const subset = relevantSubfields.filter(value => value === subfieldValue);
154
- //return subset.length;
155
109
  }
156
- function removeCopyright(value) {
157
- return value.replace(/^(?:c|p|©|℗|Cop\. ?) ?((?:1[0-9][0-9][0-9]|20[012][0-9])\.?)$/ui, '$1');
110
+ export function removeCopyright(value) {
111
+ return value.replace(/^(?:c|p|©|℗|Cop\. ?) ?((?:1[0-9][0-9][0-9]|20[012][0-9])\.?)$/ui, "$1");
158
112
  }
159
113
  function isNonStandardNonrepeatableSubfield(tag, subfieldCode) {
160
- // Put these into config or so...
161
- if (tag === '264') {
162
- return ['a', 'b', 'c'].includes(subfieldCode);
114
+ if (tag === "264") {
115
+ return ["a", "b", "c"].includes(subfieldCode);
163
116
  }
164
- if (['336', '337', '338'].includes(tag)) {
165
- return ['a', 'b', '2'].includes(subfieldCode);
117
+ if (["336", "337", "338"].includes(tag)) {
118
+ return ["a", "b", "2"].includes(subfieldCode);
166
119
  }
167
120
  return false;
168
121
  }
169
- function subfieldIsRepeatable(tag, subfieldCode) {
122
+ export function subfieldIsRepeatable(tag, subfieldCode) {
170
123
  if (isNonStandardNonrepeatableSubfield(tag, subfieldCode)) {
171
124
  return false;
172
125
  }
173
-
174
- // These we know or "know":
175
- // NB! $5 is (according to MARC21 format) non-repeatable, and not usable in all fields, but Melinda has a local exception to this, see MET-300
176
- if ('0159'.indexOf(subfieldCode) > -1) {
177
- // Uh, can $0 appear on any field?
126
+ if ("0159".indexOf(subfieldCode) > -1) {
178
127
  return true;
179
128
  }
180
- const fieldSpecs = _melindaCustomMergeFields.melindaCustomMergeFields.fields.filter(field => field.tag === tag);
129
+ const fieldSpecs = melindaFields.fields.filter((field) => field.tag === tag);
181
130
  if (fieldSpecs.length !== 1) {
182
131
  nvdebug(` WARNING! Getting field ${tag} data failed! ${fieldSpecs.length} hits. Default value true is used for'${subfieldCode}' .`, debugDev);
183
132
  return true;
184
133
  }
185
- const subfieldSpecs = fieldSpecs[0].subfields.filter(subfield => subfield.code === subfieldCode);
186
- // Currently we don't support multiple $6 fields due to re-indexing limitations...
187
- // Well, $6 is non-repeatable, isn't it?!?
188
- // (This might actually already be fixed... Marginal issue, but check eventually.)
189
- if (subfieldSpecs.length !== 1 || subfieldCode === '6') {
190
- return false; // repeatable if not specified, I guess. Maybe add log or warn?
134
+ const subfieldSpecs = fieldSpecs[0].subfields.filter((subfield) => subfield.code === subfieldCode);
135
+ if (subfieldSpecs.length !== 1 || subfieldCode === "6") {
136
+ return false;
191
137
  }
192
138
  return subfieldSpecs[0].repeatable;
193
139
  }
194
140
  function marc21GetTagsLegalIndicators(tag) {
195
- const fieldSpecs = _melindaCustomMergeFields.melindaCustomMergeFields.fields.filter(field => field.tag === tag);
141
+ const fieldSpecs = melindaFields.fields.filter((field) => field.tag === tag);
196
142
  if (fieldSpecs.length === 0) {
197
- return undefined;
143
+ return void 0;
198
144
  }
199
145
  return fieldSpecs[0].indicators;
200
146
  }
201
- function marc21GetTagsLegalInd1Value(tag) {
147
+ export function marc21GetTagsLegalInd1Value(tag) {
202
148
  const indicator = marc21GetTagsLegalIndicators(tag);
203
- if (indicator === undefined) {
204
- return undefined;
149
+ if (indicator === void 0) {
150
+ return void 0;
205
151
  }
206
152
  return indicator.ind1;
207
153
  }
208
- function marc21GetTagsLegalInd2Value(tag) {
154
+ export function marc21GetTagsLegalInd2Value(tag) {
209
155
  const indicator = marc21GetTagsLegalIndicators(tag);
210
- if (indicator === undefined) {
211
- return undefined;
156
+ if (indicator === void 0) {
157
+ return void 0;
212
158
  }
213
159
  return indicator.ind2;
214
160
  }
215
- function nvdebugSubfieldArray(subfields, prefix = ' ', func = undefined) {
216
- subfields.forEach(subfield => nvdebug(`${prefix}${subfieldToString(subfield)}`, func)); // eslint-disable-line array-callback-return
161
+ export function nvdebugSubfieldArray(subfields, prefix = " ", func = void 0) {
162
+ subfields.forEach((subfield) => nvdebug(`${prefix}${subfieldToString(subfield)}`, func));
217
163
  }
218
- function subfieldsAreIdentical(subfieldA, subfieldB) {
164
+ export function subfieldsAreIdentical(subfieldA, subfieldB) {
219
165
  return subfieldA.code === subfieldB.code && subfieldA.value === subfieldB.value;
220
166
  }
221
- function fieldHasMultipleSubfields(field, subfieldCode /*, subfieldValue = null*/) {
167
+ export function fieldHasMultipleSubfields(field, subfieldCode) {
222
168
  return fieldHasNSubfields(field, subfieldCode) > 1;
223
169
  }
224
- function hasCopyright(value) {
170
+ export function hasCopyright(value) {
225
171
  const modValue = removeCopyright(value);
226
172
  return value !== modValue;
227
173
  }
228
- //# sourceMappingURL=utils.js.map
174
+ //# sourceMappingURL=utils.js.map
package/dist/utils.js.map CHANGED
@@ -1 +1,7 @@
1
- {"version":3,"file":"utils.js","names":["_debug","_interopRequireDefault","require","_melindaCustomMergeFields","e","__esModule","default","debug","createDebugLogger","debugDev","extend","isElectronicMaterial","record","f337s","get","length","some","f","fieldHasSubfield","nvdebug","message","func","undefined","field","subfieldCode","subfieldValue","subfields","sf","code","value","subfieldToString","normalizeIndicatorValue","val","recordToString","ldr","leader","fields","map","fieldToString","join","removeSubfield","tag","filter","recordRemoveValuelessSubfields","ind1","ind2","formatSubfields","fieldsToString","nvdebugFieldArray","prefix","forEach","isControlSubfieldCode","includes","getCatalogingLanguage","defaultCatalogingLanguage","field040","b","uniqArray","arr","i","indexOf","fieldsAreIdentical","field1","field2","fieldHasNSubfields","relevantSubfields","removeCopyright","replace","isNonStandardNonrepeatableSubfield","subfieldIsRepeatable","fieldSpecs","melindaFields","subfieldSpecs","subfield","repeatable","marc21GetTagsLegalIndicators","indicators","marc21GetTagsLegalInd1Value","indicator","marc21GetTagsLegalInd2Value","nvdebugSubfieldArray","subfieldsAreIdentical","subfieldA","subfieldB","fieldHasMultipleSubfields","hasCopyright","modValue"],"sources":["../src/utils.js"],"sourcesContent":["import createDebugLogger from 'debug';\n\n//import fs from 'fs';\n//import path from 'path';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:utils');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nimport {melindaCustomMergeFields as melindaFields} from './melindaCustomMergeFields';\n\n//JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'src', 'melindaCustomMergeFields.json'), 'utf8'));\n\nexport function isElectronicMaterial(record) {\n const f337s = record.get('337');\n\n return f337s.length > 0 && f337s.some(f => fieldHasSubfield(f, 'b', 'c') && fieldHasSubfield(f, '2', 'rdamedia'));\n}\n\nexport function nvdebug(message, func = undefined) {\n if (func) {\n func(message);\n }\n //console.info(message); // eslint-disable-line no-console\n}\n\nexport function fieldHasSubfield(field, subfieldCode, subfieldValue = null) {\n if (!field.subfields) {\n return false;\n }\n if (subfieldValue === null) {\n return field.subfields.some(sf => sf.code === subfieldCode);\n }\n return field.subfields.some(sf => sf.code === subfieldCode && subfieldValue === sf.value);\n}\n\nexport function subfieldToString(sf) {\n if (!sf.value) {\n return `‡${sf.code}`;\n }\n return `‡${sf.code} ${sf.value}`;\n}\n\nfunction normalizeIndicatorValue(val) {\n if (val === ' ') {\n return '#';\n }\n return val;\n}\n\nexport function recordToString(record) {\n const ldr = `LDR ${record.leader}`;\n const fields = record.fields.map(f => fieldToString(f));\n return `${ldr}\\n${fields.join('\\n')}`;\n}\n\nexport function removeSubfield(record, tag, subfieldCode) {\n record.fields = record.fields.map(field => {\n if (field.tag !== tag || !field.subfields) { // Don't procss irrelevant fields\n return field;\n }\n field.subfields = field.subfields.filter(sf => sf.code !== subfieldCode);\n if (field.subfields.length === 0) {\n return false;\n }\n return field;\n }).filter(field => field);\n}\n\nexport function recordRemoveValuelessSubfields(record) {\n record.fields = record.fields.map(field => {\n if (!field.subfields) { // Keep control fields\n return field;\n }\n // Remove empty subfields from datafields:\n field.subfields = field.subfields.filter(sf => sf.value);\n\n if (field.subfields && field.subfields.length === 0) {\n return false; // Return false instead of a field if field has no subfields left. These will soon be filtered out.\n }\n\n return field; //if field has subfields return it\n }).filter(field => field); // Filter those falses out\n}\n\nexport function fieldToString(f) {\n if ('subfields' in f) {\n return `${f.tag} ${normalizeIndicatorValue(f.ind1)}${normalizeIndicatorValue(f.ind2)}${formatSubfields(f)}`;\n }\n return `${f.tag} ${f.value}`;\n\n function formatSubfields(field) {\n return field.subfields.map(sf => ` ${subfieldToString(sf)}`).join('');\n }\n}\n\nexport function fieldsToString(fields) {\n return fields.map(f => fieldToString(f)).join('\\t__SEPARATOR__\\t');\n}\n\nexport function nvdebugFieldArray(fields, prefix = ' ', func = undefined) {\n fields.forEach(field => nvdebug(`${prefix}${fieldToString(field)}`, func)); // eslint-disable-line array-callback-return\n}\n\nexport function isControlSubfieldCode(subfieldCode) {\n if (['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'w'].includes(subfieldCode)) {\n return true;\n }\n return false;\n}\n\nexport function getCatalogingLanguage(record, defaultCatalogingLanguage = undefined) {\n const [field040] = record.get(/^040$/u);\n if (!field040) {\n return defaultCatalogingLanguage;\n }\n const [b] = field040.subfields.filter(sf => sf.code === 'b');\n if (!b) {\n return defaultCatalogingLanguage;\n }\n return b.value;\n}\n\n\nexport function uniqArray(arr) {\n return arr.filter((val, i) => arr.indexOf(val) === i);\n}\n\nexport function fieldsAreIdentical(field1, field2) {\n if (field1.tag !== field2.tag) { // NB! We are skipping normalizations here on purpose! They should be done beforehand...\n return false;\n }\n return fieldToString(field1) === fieldToString(field2);\n\n // The order of subfields is relevant! Bloody JS idiotisms make people use conditions such as:\n // return field1.subfields.every(sf => field2.subfields.some(sf2 => sf.code === sf2.code && sf.value === sf2.value));\n}\n\nexport function fieldHasNSubfields(field, subfieldCode/*, subfieldValue = null*/) {\n const relevantSubfields = field.subfields.filter(sf => sf.code === subfieldCode);\n //if (subfieldValue === null) {\n return relevantSubfields.length;\n //}\n //const subset = relevantSubfields.filter(value => value === subfieldValue);\n //return subset.length;\n}\n\nexport function removeCopyright(value) {\n return value.replace(/^(?:c|p|©|℗|Cop\\. ?) ?((?:1[0-9][0-9][0-9]|20[012][0-9])\\.?)$/ui, '$1');\n}\n\nfunction isNonStandardNonrepeatableSubfield(tag, subfieldCode) {\n // Put these into config or so...\n if (tag === '264') {\n return ['a', 'b', 'c'].includes(subfieldCode);\n }\n\n if (['336', '337', '338'].includes(tag)) {\n return ['a', 'b', '2'].includes(subfieldCode);\n }\n\n return false;\n}\n\n\nexport function subfieldIsRepeatable(tag, subfieldCode) {\n\n if (isNonStandardNonrepeatableSubfield(tag, subfieldCode)) {\n return false;\n }\n\n // These we know or \"know\":\n // NB! $5 is (according to MARC21 format) non-repeatable, and not usable in all fields, but Melinda has a local exception to this, see MET-300\n if ('0159'.indexOf(subfieldCode) > -1) {\n // Uh, can $0 appear on any field?\n return true;\n }\n\n const fieldSpecs = melindaFields.fields.filter(field => field.tag === tag);\n if (fieldSpecs.length !== 1) {\n nvdebug(` WARNING! Getting field ${tag} data failed! ${fieldSpecs.length} hits. Default value true is used for'${subfieldCode}' .`, debugDev);\n return true;\n }\n\n const subfieldSpecs = fieldSpecs[0].subfields.filter(subfield => subfield.code === subfieldCode);\n // Currently we don't support multiple $6 fields due to re-indexing limitations...\n // Well, $6 is non-repeatable, isn't it?!?\n // (This might actually already be fixed... Marginal issue, but check eventually.)\n if (subfieldSpecs.length !== 1 || subfieldCode === '6') {\n return false; // repeatable if not specified, I guess. Maybe add log or warn?\n }\n return subfieldSpecs[0].repeatable;\n}\n\nfunction marc21GetTagsLegalIndicators(tag) {\n const fieldSpecs = melindaFields.fields.filter(field => field.tag === tag);\n if (fieldSpecs.length === 0) {\n return undefined;\n }\n return fieldSpecs[0].indicators;\n}\n\nexport function marc21GetTagsLegalInd1Value(tag) {\n const indicator = marc21GetTagsLegalIndicators(tag);\n if (indicator === undefined) {\n return undefined;\n }\n return indicator.ind1;\n}\n\nexport function marc21GetTagsLegalInd2Value(tag) {\n const indicator = marc21GetTagsLegalIndicators(tag);\n if (indicator === undefined) {\n return undefined;\n }\n return indicator.ind2;\n}\n\nexport function nvdebugSubfieldArray(subfields, prefix = ' ', func = undefined) {\n subfields.forEach(subfield => nvdebug(`${prefix}${subfieldToString(subfield)}`, func)); // eslint-disable-line array-callback-return\n}\n\nexport function subfieldsAreIdentical(subfieldA, subfieldB) {\n return subfieldA.code === subfieldB.code && subfieldA.value === subfieldB.value;\n}\n\nexport function fieldHasMultipleSubfields(field, subfieldCode/*, subfieldValue = null*/) {\n return fieldHasNSubfields(field, subfieldCode) > 1;\n}\n\nexport function hasCopyright(value) {\n const modValue = removeCopyright(value);\n return value !== modValue;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AASA,IAAAC,yBAAA,GAAAD,OAAA;AAAqF,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAPrF;AACA;;AAEA,MAAMG,KAAK,GAAG,IAAAC,cAAiB,EAAC,oDAAoD,CAAC;AACrF;AACA,MAAMC,QAAQ,GAAGF,KAAK,CAACG,MAAM,CAAC,KAAK,CAAC;AAIpC;;AAEO,SAASC,oBAAoBA,CAACC,MAAM,EAAE;EAC3C,MAAMC,KAAK,GAAGD,MAAM,CAACE,GAAG,CAAC,KAAK,CAAC;EAE/B,OAAOD,KAAK,CAACE,MAAM,GAAG,CAAC,IAAIF,KAAK,CAACG,IAAI,CAACC,CAAC,IAAIC,gBAAgB,CAACD,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,IAAIC,gBAAgB,CAACD,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;AACnH;AAEO,SAASE,OAAOA,CAACC,OAAO,EAAEC,IAAI,GAAGC,SAAS,EAAE;EACjD,IAAID,IAAI,EAAE;IACRA,IAAI,CAACD,OAAO,CAAC;EACf;EACA;AACF;AAEO,SAASF,gBAAgBA,CAACK,KAAK,EAAEC,YAAY,EAAEC,aAAa,GAAG,IAAI,EAAE;EAC1E,IAAI,CAACF,KAAK,CAACG,SAAS,EAAE;IACpB,OAAO,KAAK;EACd;EACA,IAAID,aAAa,KAAK,IAAI,EAAE;IAC1B,OAAOF,KAAK,CAACG,SAAS,CAACV,IAAI,CAACW,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAKJ,YAAY,CAAC;EAC7D;EACA,OAAOD,KAAK,CAACG,SAAS,CAACV,IAAI,CAACW,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAKJ,YAAY,IAAIC,aAAa,KAAKE,EAAE,CAACE,KAAK,CAAC;AAC3F;AAEO,SAASC,gBAAgBA,CAACH,EAAE,EAAE;EACnC,IAAI,CAACA,EAAE,CAACE,KAAK,EAAE;IACb,OAAO,IAAIF,EAAE,CAACC,IAAI,EAAE;EACtB;EACA,OAAO,IAAID,EAAE,CAACC,IAAI,IAAID,EAAE,CAACE,KAAK,EAAE;AAClC;AAEA,SAASE,uBAAuBA,CAACC,GAAG,EAAE;EACpC,IAAIA,GAAG,KAAK,GAAG,EAAE;IACf,OAAO,GAAG;EACZ;EACA,OAAOA,GAAG;AACZ;AAEO,SAASC,cAAcA,CAACrB,MAAM,EAAE;EACrC,MAAMsB,GAAG,GAAG,SAAStB,MAAM,CAACuB,MAAM,EAAE;EACpC,MAAMC,MAAM,GAAGxB,MAAM,CAACwB,MAAM,CAACC,GAAG,CAACpB,CAAC,IAAIqB,aAAa,CAACrB,CAAC,CAAC,CAAC;EACvD,OAAO,GAAGiB,GAAG,KAAKE,MAAM,CAACG,IAAI,CAAC,IAAI,CAAC,EAAE;AACvC;AAEO,SAASC,cAAcA,CAAC5B,MAAM,EAAE6B,GAAG,EAAEjB,YAAY,EAAE;EACxDZ,MAAM,CAACwB,MAAM,GAAGxB,MAAM,CAACwB,MAAM,CAACC,GAAG,CAACd,KAAK,IAAI;IACzC,IAAIA,KAAK,CAACkB,GAAG,KAAKA,GAAG,IAAI,CAAClB,KAAK,CAACG,SAAS,EAAE;MAAE;MAC3C,OAAOH,KAAK;IACd;IACAA,KAAK,CAACG,SAAS,GAAGH,KAAK,CAACG,SAAS,CAACgB,MAAM,CAACf,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAKJ,YAAY,CAAC;IACxE,IAAID,KAAK,CAACG,SAAS,CAACX,MAAM,KAAK,CAAC,EAAE;MAChC,OAAO,KAAK;IACd;IACA,OAAOQ,KAAK;EACd,CAAC,CAAC,CAACmB,MAAM,CAACnB,KAAK,IAAIA,KAAK,CAAC;AAC3B;AAEO,SAASoB,8BAA8BA,CAAC/B,MAAM,EAAE;EACrDA,MAAM,CAACwB,MAAM,GAAGxB,MAAM,CAACwB,MAAM,CAACC,GAAG,CAACd,KAAK,IAAI;IACzC,IAAI,CAACA,KAAK,CAACG,SAAS,EAAE;MAAE;MACtB,OAAOH,KAAK;IACd;IACA;IACAA,KAAK,CAACG,SAAS,GAAGH,KAAK,CAACG,SAAS,CAACgB,MAAM,CAACf,EAAE,IAAIA,EAAE,CAACE,KAAK,CAAC;IAExD,IAAIN,KAAK,CAACG,SAAS,IAAIH,KAAK,CAACG,SAAS,CAACX,MAAM,KAAK,CAAC,EAAE;MACnD,OAAO,KAAK,CAAC,CAAC;IAChB;IAEA,OAAOQ,KAAK,CAAC,CAAC;EAChB,CAAC,CAAC,CAACmB,MAAM,CAACnB,KAAK,IAAIA,KAAK,CAAC,CAAC,CAAC;AAC7B;AAEO,SAASe,aAAaA,CAACrB,CAAC,EAAE;EAC/B,IAAI,WAAW,IAAIA,CAAC,EAAE;IACpB,OAAO,GAAGA,CAAC,CAACwB,GAAG,IAAIV,uBAAuB,CAACd,CAAC,CAAC2B,IAAI,CAAC,GAAGb,uBAAuB,CAACd,CAAC,CAAC4B,IAAI,CAAC,GAAGC,eAAe,CAAC7B,CAAC,CAAC,EAAE;EAC7G;EACA,OAAO,GAAGA,CAAC,CAACwB,GAAG,OAAOxB,CAAC,CAACY,KAAK,EAAE;EAE/B,SAASiB,eAAeA,CAACvB,KAAK,EAAE;IAC9B,OAAOA,KAAK,CAACG,SAAS,CAACW,GAAG,CAACV,EAAE,IAAI,IAAIG,gBAAgB,CAACH,EAAE,CAAC,EAAE,CAAC,CAACY,IAAI,CAAC,EAAE,CAAC;EACvE;AACF;AAEO,SAASQ,cAAcA,CAACX,MAAM,EAAE;EACrC,OAAOA,MAAM,CAACC,GAAG,CAACpB,CAAC,IAAIqB,aAAa,CAACrB,CAAC,CAAC,CAAC,CAACsB,IAAI,CAAC,mBAAmB,CAAC;AACpE;AAEO,SAASS,iBAAiBA,CAACZ,MAAM,EAAEa,MAAM,GAAG,IAAI,EAAE5B,IAAI,GAAGC,SAAS,EAAE;EACzEc,MAAM,CAACc,OAAO,CAAC3B,KAAK,IAAIJ,OAAO,CAAC,GAAG8B,MAAM,GAAGX,aAAa,CAACf,KAAK,CAAC,EAAE,EAAEF,IAAI,CAAC,CAAC,CAAC,CAAC;AAC9E;AAEO,SAAS8B,qBAAqBA,CAAC3B,YAAY,EAAE;EAClD,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC4B,QAAQ,CAAC5B,YAAY,CAAC,EAAE;IAClF,OAAO,IAAI;EACb;EACA,OAAO,KAAK;AACd;AAEO,SAAS6B,qBAAqBA,CAACzC,MAAM,EAAE0C,yBAAyB,GAAGhC,SAAS,EAAE;EACnF,MAAM,CAACiC,QAAQ,CAAC,GAAG3C,MAAM,CAACE,GAAG,CAAC,QAAQ,CAAC;EACvC,IAAI,CAACyC,QAAQ,EAAE;IACb,OAAOD,yBAAyB;EAClC;EACA,MAAM,CAACE,CAAC,CAAC,GAAGD,QAAQ,CAAC7B,SAAS,CAACgB,MAAM,CAACf,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAK,GAAG,CAAC;EAC5D,IAAI,CAAC4B,CAAC,EAAE;IACN,OAAOF,yBAAyB;EAClC;EACA,OAAOE,CAAC,CAAC3B,KAAK;AAChB;AAGO,SAAS4B,SAASA,CAACC,GAAG,EAAE;EAC7B,OAAOA,GAAG,CAAChB,MAAM,CAAC,CAACV,GAAG,EAAE2B,CAAC,KAAKD,GAAG,CAACE,OAAO,CAAC5B,GAAG,CAAC,KAAK2B,CAAC,CAAC;AACvD;AAEO,SAASE,kBAAkBA,CAACC,MAAM,EAAEC,MAAM,EAAE;EACjD,IAAID,MAAM,CAACrB,GAAG,KAAKsB,MAAM,CAACtB,GAAG,EAAE;IAAE;IAC/B,OAAO,KAAK;EACd;EACA,OAAOH,aAAa,CAACwB,MAAM,CAAC,KAAKxB,aAAa,CAACyB,MAAM,CAAC;;EAEtD;EACA;AACF;AAEO,SAASC,kBAAkBA,CAACzC,KAAK,EAAEC,YAAY,6BAA4B;EAChF,MAAMyC,iBAAiB,GAAG1C,KAAK,CAACG,SAAS,CAACgB,MAAM,CAACf,EAAE,IAAIA,EAAE,CAACC,IAAI,KAAKJ,YAAY,CAAC;EAChF;EACA,OAAOyC,iBAAiB,CAAClD,MAAM;EAC/B;EACA;EACA;AACF;AAEO,SAASmD,eAAeA,CAACrC,KAAK,EAAE;EACrC,OAAOA,KAAK,CAACsC,OAAO,CAAC,iEAAiE,EAAE,IAAI,CAAC;AAC/F;AAEA,SAASC,kCAAkCA,CAAC3B,GAAG,EAAEjB,YAAY,EAAE;EAC7D;EACA,IAAIiB,GAAG,KAAK,KAAK,EAAE;IACjB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAACW,QAAQ,CAAC5B,YAAY,CAAC;EAC/C;EAEA,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC4B,QAAQ,CAACX,GAAG,CAAC,EAAE;IACvC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAACW,QAAQ,CAAC5B,YAAY,CAAC;EAC/C;EAEA,OAAO,KAAK;AACd;AAGO,SAAS6C,oBAAoBA,CAAC5B,GAAG,EAAEjB,YAAY,EAAE;EAEtD,IAAI4C,kCAAkC,CAAC3B,GAAG,EAAEjB,YAAY,CAAC,EAAE;IACzD,OAAO,KAAK;EACd;;EAEA;EACA;EACA,IAAI,MAAM,CAACoC,OAAO,CAACpC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE;IACrC;IACA,OAAO,IAAI;EACb;EAEA,MAAM8C,UAAU,GAAGC,kDAAa,CAACnC,MAAM,CAACM,MAAM,CAACnB,KAAK,IAAIA,KAAK,CAACkB,GAAG,KAAKA,GAAG,CAAC;EAC1E,IAAI6B,UAAU,CAACvD,MAAM,KAAK,CAAC,EAAE;IAC3BI,OAAO,CAAC,2BAA2BsB,GAAG,iBAAiB6B,UAAU,CAACvD,MAAM,yCAAyCS,YAAY,KAAK,EAAEf,QAAQ,CAAC;IAC7I,OAAO,IAAI;EACb;EAEA,MAAM+D,aAAa,GAAGF,UAAU,CAAC,CAAC,CAAC,CAAC5C,SAAS,CAACgB,MAAM,CAAC+B,QAAQ,IAAIA,QAAQ,CAAC7C,IAAI,KAAKJ,YAAY,CAAC;EAChG;EACA;EACA;EACA,IAAIgD,aAAa,CAACzD,MAAM,KAAK,CAAC,IAAIS,YAAY,KAAK,GAAG,EAAE;IACtD,OAAO,KAAK,CAAC,CAAC;EAChB;EACA,OAAOgD,aAAa,CAAC,CAAC,CAAC,CAACE,UAAU;AACpC;AAEA,SAASC,4BAA4BA,CAAClC,GAAG,EAAE;EACzC,MAAM6B,UAAU,GAAGC,kDAAa,CAACnC,MAAM,CAACM,MAAM,CAACnB,KAAK,IAAIA,KAAK,CAACkB,GAAG,KAAKA,GAAG,CAAC;EAC1E,IAAI6B,UAAU,CAACvD,MAAM,KAAK,CAAC,EAAE;IAC3B,OAAOO,SAAS;EAClB;EACA,OAAOgD,UAAU,CAAC,CAAC,CAAC,CAACM,UAAU;AACjC;AAEO,SAASC,2BAA2BA,CAACpC,GAAG,EAAE;EAC/C,MAAMqC,SAAS,GAAGH,4BAA4B,CAAClC,GAAG,CAAC;EACnD,IAAIqC,SAAS,KAAKxD,SAAS,EAAE;IAC3B,OAAOA,SAAS;EAClB;EACA,OAAOwD,SAAS,CAAClC,IAAI;AACvB;AAEO,SAASmC,2BAA2BA,CAACtC,GAAG,EAAE;EAC/C,MAAMqC,SAAS,GAAGH,4BAA4B,CAAClC,GAAG,CAAC;EACnD,IAAIqC,SAAS,KAAKxD,SAAS,EAAE;IAC3B,OAAOA,SAAS;EAClB;EACA,OAAOwD,SAAS,CAACjC,IAAI;AACvB;AAEO,SAASmC,oBAAoBA,CAACtD,SAAS,EAAEuB,MAAM,GAAG,IAAI,EAAE5B,IAAI,GAAGC,SAAS,EAAE;EAC/EI,SAAS,CAACwB,OAAO,CAACuB,QAAQ,IAAItD,OAAO,CAAC,GAAG8B,MAAM,GAAGnB,gBAAgB,CAAC2C,QAAQ,CAAC,EAAE,EAAEpD,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1F;AAEO,SAAS4D,qBAAqBA,CAACC,SAAS,EAAEC,SAAS,EAAE;EAC1D,OAAOD,SAAS,CAACtD,IAAI,KAAKuD,SAAS,CAACvD,IAAI,IAAIsD,SAAS,CAACrD,KAAK,KAAKsD,SAAS,CAACtD,KAAK;AACjF;AAEO,SAASuD,yBAAyBA,CAAC7D,KAAK,EAAEC,YAAY,6BAA4B;EACvF,OAAOwC,kBAAkB,CAACzC,KAAK,EAAEC,YAAY,CAAC,GAAG,CAAC;AACpD;AAEO,SAAS6D,YAAYA,CAACxD,KAAK,EAAE;EAClC,MAAMyD,QAAQ,GAAGpB,eAAe,CAACrC,KAAK,CAAC;EACvC,OAAOA,KAAK,KAAKyD,QAAQ;AAC3B","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils.js"],
4
+ "sourcesContent": ["import createDebugLogger from 'debug';\n\n//import fs from 'fs';\n//import path from 'path';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:utils');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nimport {melindaCustomMergeFields as melindaFields} from './melindaCustomMergeFields.js';\n\n//JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'src', 'melindaCustomMergeFields.json'), 'utf8'));\n\nexport function isElectronicMaterial(record) {\n const f337s = record.get('337');\n\n return f337s.length > 0 && f337s.some(f => fieldHasSubfield(f, 'b', 'c') && fieldHasSubfield(f, '2', 'rdamedia'));\n}\n\nexport function nvdebug(message, func = undefined) {\n if (func) {\n func(message);\n }\n //console.info(message); // eslint-disable-line no-console\n}\n\nexport function fieldHasSubfield(field, subfieldCode, subfieldValue = null) {\n if (!field.subfields) {\n return false;\n }\n if (subfieldValue === null) {\n return field.subfields.some(sf => sf.code === subfieldCode);\n }\n return field.subfields.some(sf => sf.code === subfieldCode && subfieldValue === sf.value);\n}\n\nexport function subfieldToString(sf) {\n if (!sf.value) {\n return `\u2021${sf.code}`;\n }\n return `\u2021${sf.code} ${sf.value}`;\n}\n\nfunction normalizeIndicatorValue(val) {\n if (val === ' ') {\n return '#';\n }\n return val;\n}\n\nexport function recordToString(record) {\n const ldr = `LDR ${record.leader}`;\n const fields = record.fields.map(f => fieldToString(f));\n return `${ldr}\\n${fields.join('\\n')}`;\n}\n\nexport function removeSubfield(record, tag, subfieldCode) {\n record.fields = record.fields.map(field => {\n if (field.tag !== tag || !field.subfields) { // Don't procss irrelevant fields\n return field;\n }\n field.subfields = field.subfields.filter(sf => sf.code !== subfieldCode);\n if (field.subfields.length === 0) {\n return false;\n }\n return field;\n }).filter(field => field);\n}\n\nexport function recordRemoveValuelessSubfields(record) {\n record.fields = record.fields.map(field => {\n if (!field.subfields) { // Keep control fields\n return field;\n }\n // Remove empty subfields from datafields:\n field.subfields = field.subfields.filter(sf => sf.value);\n\n if (field.subfields && field.subfields.length === 0) {\n return false; // Return false instead of a field if field has no subfields left. These will soon be filtered out.\n }\n\n return field; //if field has subfields return it\n }).filter(field => field); // Filter those falses out\n}\n\nexport function fieldToString(f) {\n if ('subfields' in f) {\n return `${f.tag} ${normalizeIndicatorValue(f.ind1)}${normalizeIndicatorValue(f.ind2)}${formatSubfields(f)}`;\n }\n return `${f.tag} ${f.value}`;\n\n function formatSubfields(field) {\n return field.subfields.map(sf => ` ${subfieldToString(sf)}`).join('');\n }\n}\n\nexport function fieldsToString(fields) {\n return fields.map(f => fieldToString(f)).join('\\t__SEPARATOR__\\t');\n}\n\nexport function nvdebugFieldArray(fields, prefix = ' ', func = undefined) {\n fields.forEach(field => nvdebug(`${prefix}${fieldToString(field)}`, func));\n}\n\nexport function isControlSubfieldCode(subfieldCode) {\n if (['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'w'].includes(subfieldCode)) {\n return true;\n }\n return false;\n}\n\nexport function getCatalogingLanguage(record, defaultCatalogingLanguage = undefined) {\n const [field040] = record.get(/^040$/u);\n if (!field040) {\n return defaultCatalogingLanguage;\n }\n const [b] = field040.subfields.filter(sf => sf.code === 'b');\n if (!b) {\n return defaultCatalogingLanguage;\n }\n return b.value;\n}\n\n\nexport function uniqArray(arr) {\n return arr.filter((val, i) => arr.indexOf(val) === i);\n}\n\nexport function fieldsAreIdentical(field1, field2) {\n if (field1.tag !== field2.tag) { // NB! We are skipping normalizations here on purpose! They should be done beforehand...\n return false;\n }\n return fieldToString(field1) === fieldToString(field2);\n\n // The order of subfields is relevant! Bloody JS idiotisms make people use conditions such as:\n // return field1.subfields.every(sf => field2.subfields.some(sf2 => sf.code === sf2.code && sf.value === sf2.value));\n}\n\nexport function fieldHasNSubfields(field, subfieldCode/*, subfieldValue = null*/) {\n const relevantSubfields = field.subfields.filter(sf => sf.code === subfieldCode);\n //if (subfieldValue === null) {\n return relevantSubfields.length;\n //}\n //const subset = relevantSubfields.filter(value => value === subfieldValue);\n //return subset.length;\n}\n\nexport function removeCopyright(value) {\n return value.replace(/^(?:c|p|\u00A9|\u2117|Cop\\. ?) ?((?:1[0-9][0-9][0-9]|20[012][0-9])\\.?)$/ui, '$1');\n}\n\nfunction isNonStandardNonrepeatableSubfield(tag, subfieldCode) {\n // Put these into config or so...\n if (tag === '264') {\n return ['a', 'b', 'c'].includes(subfieldCode);\n }\n\n if (['336', '337', '338'].includes(tag)) {\n return ['a', 'b', '2'].includes(subfieldCode);\n }\n\n return false;\n}\n\n\nexport function subfieldIsRepeatable(tag, subfieldCode) {\n\n if (isNonStandardNonrepeatableSubfield(tag, subfieldCode)) {\n return false;\n }\n\n // These we know or \"know\":\n // NB! $5 is (according to MARC21 format) non-repeatable, and not usable in all fields, but Melinda has a local exception to this, see MET-300\n if ('0159'.indexOf(subfieldCode) > -1) {\n // Uh, can $0 appear on any field?\n return true;\n }\n\n const fieldSpecs = melindaFields.fields.filter(field => field.tag === tag);\n if (fieldSpecs.length !== 1) {\n nvdebug(` WARNING! Getting field ${tag} data failed! ${fieldSpecs.length} hits. Default value true is used for'${subfieldCode}' .`, debugDev);\n return true;\n }\n\n const subfieldSpecs = fieldSpecs[0].subfields.filter(subfield => subfield.code === subfieldCode);\n // Currently we don't support multiple $6 fields due to re-indexing limitations...\n // Well, $6 is non-repeatable, isn't it?!?\n // (This might actually already be fixed... Marginal issue, but check eventually.)\n if (subfieldSpecs.length !== 1 || subfieldCode === '6') {\n return false; // repeatable if not specified, I guess. Maybe add log or warn?\n }\n return subfieldSpecs[0].repeatable;\n}\n\nfunction marc21GetTagsLegalIndicators(tag) {\n const fieldSpecs = melindaFields.fields.filter(field => field.tag === tag);\n if (fieldSpecs.length === 0) {\n return undefined;\n }\n return fieldSpecs[0].indicators;\n}\n\nexport function marc21GetTagsLegalInd1Value(tag) {\n const indicator = marc21GetTagsLegalIndicators(tag);\n if (indicator === undefined) {\n return undefined;\n }\n return indicator.ind1;\n}\n\nexport function marc21GetTagsLegalInd2Value(tag) {\n const indicator = marc21GetTagsLegalIndicators(tag);\n if (indicator === undefined) {\n return undefined;\n }\n return indicator.ind2;\n}\n\nexport function nvdebugSubfieldArray(subfields, prefix = ' ', func = undefined) {\n subfields.forEach(subfield => nvdebug(`${prefix}${subfieldToString(subfield)}`, func));\n}\n\nexport function subfieldsAreIdentical(subfieldA, subfieldB) {\n return subfieldA.code === subfieldB.code && subfieldA.value === subfieldB.value;\n}\n\nexport function fieldHasMultipleSubfields(field, subfieldCode/*, subfieldValue = null*/) {\n return fieldHasNSubfields(field, subfieldCode) > 1;\n}\n\nexport function hasCopyright(value) {\n const modValue = removeCopyright(value);\n return value !== modValue;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/eslint.config.mjs CHANGED
@@ -23,7 +23,7 @@ const configSrc = {
23
23
  "array-callback-return": [
24
24
  "error",
25
25
  {
26
- "checkForEach": true
26
+ "checkForEach": false
27
27
  }
28
28
  ],
29
29
  "no-unused-vars": [
@@ -41,7 +41,6 @@ const configSrc = {
41
41
  // - ignore all files inside directories named 'dist'
42
42
  const configIgnores = {
43
43
  ignores: [
44
- "coverage",
45
44
  "**/.*",
46
45
  "**/dist/"
47
46
  ]