@natlibfi/marc-record-validators-melinda 12.1.0-alpha.1 → 13.0.0

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 (425) hide show
  1. package/.github/workflows/melinda-node-tests-and-publish.yml +17 -17
  2. package/README.md +1 -1
  3. package/dist/addMissingField041.js +6 -3
  4. package/dist/addMissingField041.js.map +2 -2
  5. package/dist/addMissingField336.js +7 -4
  6. package/dist/addMissingField336.js.map +2 -2
  7. package/dist/addMissingField337.js +6 -3
  8. package/dist/addMissingField337.js.map +2 -2
  9. package/dist/addMissingField338.js +8 -5
  10. package/dist/addMissingField338.js.map +2 -2
  11. package/dist/cyrillux-usemarcon-replacement.js +5 -2
  12. package/dist/cyrillux-usemarcon-replacement.js.map +2 -2
  13. package/dist/cyrillux.js +24 -18
  14. package/dist/cyrillux.js.map +2 -2
  15. package/dist/dataProvenanceUtils.js +19 -0
  16. package/dist/dataProvenanceUtils.js.map +7 -0
  17. package/dist/disambiguateSeriesStatements.js +2 -1
  18. package/dist/disambiguateSeriesStatements.js.map +2 -2
  19. package/dist/disambiguateSeriesStatements.test.js +1 -7
  20. package/dist/disambiguateSeriesStatements.test.js.map +2 -2
  21. package/dist/drop-terms.js +123 -0
  22. package/dist/drop-terms.js.map +7 -0
  23. package/dist/drop-terms.test.js +56 -0
  24. package/dist/drop-terms.test.js.map +7 -0
  25. package/dist/field-008-18-34-character-groups.test.js +1 -7
  26. package/dist/field-008-18-34-character-groups.test.js.map +2 -2
  27. package/dist/field-505-separators.test.js +1 -7
  28. package/dist/field-505-separators.test.js.map +2 -2
  29. package/dist/field-521-fix.test.js +1 -7
  30. package/dist/field-521-fix.test.js.map +2 -2
  31. package/dist/fix-33X.js +7 -4
  32. package/dist/fix-33X.js.map +2 -2
  33. package/dist/fix-33X.test.js +1 -1
  34. package/dist/fix-33X.test.js.map +1 -1
  35. package/dist/fix-country-codes.js +5 -0
  36. package/dist/fix-country-codes.js.map +2 -2
  37. package/dist/fix-country-codes.test.js +1 -7
  38. package/dist/fix-country-codes.test.js.map +2 -2
  39. package/dist/fix-language-codes.js +5 -1
  40. package/dist/fix-language-codes.js.map +2 -2
  41. package/dist/fix-sami-041.js +109 -0
  42. package/dist/fix-sami-041.js.map +7 -0
  43. package/dist/fix-sami-041.test.js +40 -0
  44. package/dist/fix-sami-041.test.js.map +7 -0
  45. package/dist/fixRelatorTerms.js +2 -0
  46. package/dist/fixRelatorTerms.js.map +2 -2
  47. package/dist/fixRelatorTerms.test.js +1 -7
  48. package/dist/fixRelatorTerms.test.js.map +2 -2
  49. package/dist/index.js +18 -4
  50. package/dist/index.js.map +2 -2
  51. package/dist/indicator-fixes.js +15 -1
  52. package/dist/indicator-fixes.js.map +2 -2
  53. package/dist/indicator-fixes.test.js +1 -7
  54. package/dist/indicator-fixes.test.js.map +2 -2
  55. package/dist/item-language.js +41 -39
  56. package/dist/item-language.js.map +2 -2
  57. package/dist/item-language.test.js +3 -3
  58. package/dist/item-language.test.js.map +2 -2
  59. package/dist/melindaCustomMergeFields.js +31 -0
  60. package/dist/melindaCustomMergeFields.js.map +2 -2
  61. package/dist/merge-fields/controlSubfields.js.map +2 -2
  62. package/dist/merge-fields/counterpartField.js +149 -152
  63. package/dist/merge-fields/counterpartField.js.map +3 -3
  64. package/dist/merge-fields/dataProvenance.js +6 -20
  65. package/dist/merge-fields/dataProvenance.js.map +2 -2
  66. package/dist/merge-fields/index.js +1 -1
  67. package/dist/merge-fields/index.js.map +2 -2
  68. package/dist/merge-fields/mergableIndicator.js +1 -5
  69. package/dist/merge-fields/mergableIndicator.js.map +2 -2
  70. package/dist/merge-fields/mergableTag.js +2 -0
  71. package/dist/merge-fields/mergableTag.js.map +2 -2
  72. package/dist/merge-fields/mergeConfig.js +2 -0
  73. package/dist/merge-fields/mergeConfig.js.map +2 -2
  74. package/dist/merge-fields/mergeConstraints.js +38 -35
  75. package/dist/merge-fields/mergeConstraints.js.map +3 -3
  76. package/dist/merge-fields/mergeField.js +4 -3
  77. package/dist/merge-fields/mergeField.js.map +2 -2
  78. package/dist/merge-fields/mergeOrAddSubfield.js +8 -7
  79. package/dist/merge-fields/mergeOrAddSubfield.js.map +2 -2
  80. package/dist/merge-fields/mergeSubfield.js +5 -1
  81. package/dist/merge-fields/mergeSubfield.js.map +2 -2
  82. package/dist/merge-fields/worldKnowledge.js +52 -0
  83. package/dist/merge-fields/worldKnowledge.js.map +2 -2
  84. package/dist/merge-fields.test.js +4 -9
  85. package/dist/merge-fields.test.js.map +2 -2
  86. package/dist/mergeField500Lisapainokset.test.js +1 -7
  87. package/dist/mergeField500Lisapainokset.test.js.map +2 -2
  88. package/dist/mergeRelatorTermFields.js +9 -6
  89. package/dist/mergeRelatorTermFields.js.map +2 -2
  90. package/dist/mergeRelatorTermFields.test.js +1 -7
  91. package/dist/mergeRelatorTermFields.test.js.map +2 -2
  92. package/dist/multiple-subfield-0.test.js +1 -7
  93. package/dist/multiple-subfield-0.test.js.map +2 -2
  94. package/dist/normalize-dashes.js +9 -6
  95. package/dist/normalize-dashes.js.map +2 -2
  96. package/dist/normalize-dashes.test.js +1 -7
  97. package/dist/normalize-dashes.test.js.map +2 -2
  98. package/dist/normalize-identifiers.js.map +2 -2
  99. package/dist/normalize-identifiers.test.js +1 -7
  100. package/dist/normalize-identifiers.test.js.map +2 -2
  101. package/dist/normalize-qualifying-information.test.js +1 -7
  102. package/dist/normalize-qualifying-information.test.js.map +2 -2
  103. package/dist/normalize-utf8-diacritics.js.map +2 -2
  104. package/dist/normalize-utf8-diacritics.test.js +1 -7
  105. package/dist/normalize-utf8-diacritics.test.js.map +2 -2
  106. package/dist/normalizeFieldForComparison.js +24 -14
  107. package/dist/normalizeFieldForComparison.js.map +2 -2
  108. package/dist/normalizeSubfieldValueForComparison.js.map +1 -1
  109. package/dist/prepublicationUtils.js +1 -1
  110. package/dist/prepublicationUtils.js.map +2 -2
  111. package/dist/punctuation.test.js +1 -7
  112. package/dist/punctuation.test.js.map +2 -2
  113. package/dist/punctuation2.js +15 -12
  114. package/dist/punctuation2.js.map +2 -2
  115. package/dist/punctuation2.test.js +1 -7
  116. package/dist/punctuation2.test.js.map +2 -2
  117. package/dist/reindexSubfield6OccurenceNumbers.js +11 -10
  118. package/dist/reindexSubfield6OccurenceNumbers.js.map +2 -2
  119. package/dist/reindexSubfield6OccurenceNumbers.test.js +1 -7
  120. package/dist/reindexSubfield6OccurenceNumbers.test.js.map +2 -2
  121. package/dist/remove-041-zxx.js +56 -0
  122. package/dist/remove-041-zxx.js.map +7 -0
  123. package/dist/remove-041-zxx.test.js +40 -0
  124. package/dist/remove-041-zxx.test.js.map +7 -0
  125. package/dist/removeDuplicateDataFields.js +4 -26
  126. package/dist/removeDuplicateDataFields.js.map +2 -2
  127. package/dist/removeDuplicateDataFields.test.js +1 -7
  128. package/dist/removeDuplicateDataFields.test.js.map +2 -2
  129. package/dist/removeInferiorDataFields.js +82 -45
  130. package/dist/removeInferiorDataFields.js.map +3 -3
  131. package/dist/removeInferiorDataFields.test.js +5 -9
  132. package/dist/removeInferiorDataFields.test.js.map +2 -2
  133. package/dist/resolveOrphanedSubfield6s.js +4 -5
  134. package/dist/resolveOrphanedSubfield6s.js.map +2 -2
  135. package/dist/resolveOrphanedSubfield6s.test.js +1 -7
  136. package/dist/resolveOrphanedSubfield6s.test.js.map +2 -2
  137. package/dist/sanitize-vocabulary-source-codes.test.js +1 -7
  138. package/dist/sanitize-vocabulary-source-codes.test.js.map +2 -2
  139. package/dist/sortFields.js +16 -1
  140. package/dist/sortFields.js.map +2 -2
  141. package/dist/sortFields.test.js +1 -7
  142. package/dist/sortFields.test.js.map +2 -2
  143. package/dist/sortRelatorTerms.test.js +1 -7
  144. package/dist/sortRelatorTerms.test.js.map +2 -2
  145. package/dist/sortSubfields.js +27 -21
  146. package/dist/sortSubfields.js.map +2 -2
  147. package/dist/sortSubfields.test.js +1 -7
  148. package/dist/sortSubfields.test.js.map +2 -2
  149. package/dist/stripPunctuation.js +7 -3
  150. package/dist/stripPunctuation.js.map +2 -2
  151. package/dist/stripPunctuation.test.js +1 -7
  152. package/dist/stripPunctuation.test.js.map +2 -2
  153. package/dist/subfield6Utils.js +2 -12
  154. package/dist/subfield6Utils.js.map +2 -2
  155. package/dist/subfield8Utils.js +0 -5
  156. package/dist/subfield8Utils.js.map +2 -2
  157. package/dist/subfieldValueNormalizations.test.js +1 -7
  158. package/dist/subfieldValueNormalizations.test.js.map +2 -2
  159. package/dist/sync-007-and-300.test.js +1 -7
  160. package/dist/sync-007-and-300.test.js.map +2 -2
  161. package/dist/sync-language.js +103 -0
  162. package/dist/sync-language.js.map +7 -0
  163. package/dist/sync-language.test.js +40 -0
  164. package/dist/sync-language.test.js.map +7 -0
  165. package/dist/translate-terms.js +124 -87
  166. package/dist/translate-terms.js.map +3 -3
  167. package/dist/translate-terms.test.js +5 -8
  168. package/dist/translate-terms.test.js.map +2 -2
  169. package/dist/typeOfDate-008.js +3 -1
  170. package/dist/typeOfDate-008.js.map +2 -2
  171. package/dist/update-field-540.js.map +2 -2
  172. package/dist/update-field-540.test.js +1 -7
  173. package/dist/update-field-540.test.js.map +2 -2
  174. package/dist/urn.js +13 -12
  175. package/dist/urn.js.map +2 -2
  176. package/dist/urn.test.js +1 -7
  177. package/dist/urn.test.js.map +2 -2
  178. package/dist/utils.js +29 -3
  179. package/dist/utils.js.map +2 -2
  180. package/package.json +20 -27
  181. package/src/addMissingField041.js +8 -4
  182. package/src/addMissingField336.js +10 -5
  183. package/src/addMissingField337.js +9 -5
  184. package/src/addMissingField338.js +11 -6
  185. package/src/cyrillux-usemarcon-replacement.js +9 -5
  186. package/src/cyrillux.js +34 -23
  187. package/src/dataProvenanceUtils.js +21 -0
  188. package/src/disambiguateSeriesStatements.js +4 -1
  189. package/src/disambiguateSeriesStatements.test.js +3 -8
  190. package/src/drop-terms.js +164 -0
  191. package/src/drop-terms.test.js +81 -0
  192. package/src/field-008-18-34-character-groups.test.js +3 -8
  193. package/src/field-505-separators.test.js +3 -8
  194. package/src/field-521-fix.test.js +3 -8
  195. package/src/fix-33X.js +10 -6
  196. package/src/fix-33X.test.js +1 -1
  197. package/src/fix-country-codes.js +7 -3
  198. package/src/fix-country-codes.test.js +3 -8
  199. package/src/fix-language-codes.js +8 -4
  200. package/src/fix-sami-041.js +147 -0
  201. package/src/fix-sami-041.test.js +52 -0
  202. package/src/fixRelatorTerms.js +5 -0
  203. package/src/fixRelatorTerms.test.js +3 -8
  204. package/src/index.js +20 -7
  205. package/src/indicator-fixes.js +22 -7
  206. package/src/indicator-fixes.test.js +3 -8
  207. package/src/item-language.js +49 -42
  208. package/src/item-language.test.js +3 -3
  209. package/src/melindaCustomMergeFields.js +31 -0
  210. package/src/merge-fields/controlSubfields.js +0 -1
  211. package/src/merge-fields/counterpartField.js +191 -290
  212. package/src/merge-fields/dataProvenance.js +8 -25
  213. package/src/merge-fields/index.js +1 -1
  214. package/src/merge-fields/mergableIndicator.js +4 -5
  215. package/src/merge-fields/mergableTag.js +2 -0
  216. package/src/merge-fields/mergeConfig.js +2 -1
  217. package/src/merge-fields/mergeConstraints.js +41 -36
  218. package/src/merge-fields/mergeField.js +4 -7
  219. package/src/merge-fields/mergeOrAddSubfield.js +8 -7
  220. package/src/merge-fields/mergeSubfield.js +11 -2
  221. package/src/merge-fields/worldKnowledge.js +77 -3
  222. package/src/merge-fields.test.js +5 -10
  223. package/src/mergeField500Lisapainokset.test.js +3 -8
  224. package/src/mergeRelatorTermFields.js +12 -11
  225. package/src/mergeRelatorTermFields.test.js +3 -8
  226. package/src/multiple-subfield-0.test.js +3 -8
  227. package/src/normalize-dashes.js +13 -7
  228. package/src/normalize-dashes.test.js +3 -8
  229. package/src/normalize-identifiers.js +12 -19
  230. package/src/normalize-identifiers.test.js +3 -8
  231. package/src/normalize-qualifying-information.test.js +3 -8
  232. package/src/normalize-utf8-diacritics.js +6 -3
  233. package/src/normalize-utf8-diacritics.test.js +3 -8
  234. package/src/normalizeFieldForComparison.js +39 -22
  235. package/src/normalizeSubfieldValueForComparison.js +2 -2
  236. package/src/prepublicationUtils.js +1 -1
  237. package/src/punctuation.test.js +3 -8
  238. package/src/punctuation2.js +44 -40
  239. package/src/punctuation2.test.js +3 -8
  240. package/src/reindexSubfield6OccurenceNumbers.js +13 -11
  241. package/src/reindexSubfield6OccurenceNumbers.test.js +3 -8
  242. package/src/remove-041-zxx.js +85 -0
  243. package/src/remove-041-zxx.test.js +52 -0
  244. package/src/removeDuplicateDataFields.js +30 -28
  245. package/src/removeDuplicateDataFields.test.js +3 -8
  246. package/src/removeInferiorDataFields.js +126 -71
  247. package/src/removeInferiorDataFields.test.js +7 -10
  248. package/src/resolveOrphanedSubfield6s.js +7 -5
  249. package/src/resolveOrphanedSubfield6s.test.js +3 -8
  250. package/src/sanitize-vocabulary-source-codes.test.js +3 -8
  251. package/src/sortFields.js +20 -1
  252. package/src/sortFields.test.js +3 -8
  253. package/src/sortRelatorTerms.test.js +3 -8
  254. package/src/sortSubfields.js +31 -25
  255. package/src/sortSubfields.test.js +3 -8
  256. package/src/stripPunctuation.js +10 -5
  257. package/src/stripPunctuation.test.js +3 -8
  258. package/src/subfield6Utils.js +31 -33
  259. package/src/subfield8Utils.js +10 -7
  260. package/src/subfieldValueNormalizations.test.js +3 -8
  261. package/src/sync-007-and-300.test.js +3 -8
  262. package/src/sync-language.js +148 -0
  263. package/src/sync-language.test.js +52 -0
  264. package/src/translate-terms.js +168 -109
  265. package/src/translate-terms.test.js +12 -16
  266. package/src/typeOfDate-008.js +4 -1
  267. package/src/update-field-540.js +7 -5
  268. package/src/update-field-540.test.js +3 -8
  269. package/src/urn.js +17 -13
  270. package/src/urn.test.js +3 -8
  271. package/src/utils.js +39 -12
  272. package/test-fixtures/cyrillux/f02b/expectedResult.json +23 -0
  273. package/test-fixtures/cyrillux/f02b/metadata.json +11 -0
  274. package/test-fixtures/cyrillux/f02b/record.json +14 -0
  275. package/test-fixtures/cyrillux/f14/expectedResult.json +32 -0
  276. package/test-fixtures/cyrillux/f14/metadata.json +10 -0
  277. package/test-fixtures/cyrillux/f14/record.json +14 -0
  278. package/test-fixtures/drop-terms/01/expectedResult.json +31 -0
  279. package/test-fixtures/drop-terms/01/metadata.json +6 -0
  280. package/test-fixtures/drop-terms/01/record.json +35 -0
  281. package/test-fixtures/drop-terms/02/expectedResult.json +7 -0
  282. package/test-fixtures/drop-terms/02/metadata.json +6 -0
  283. package/test-fixtures/drop-terms/02/record.json +40 -0
  284. package/test-fixtures/drop-terms/03/expectedResult.json +6 -0
  285. package/test-fixtures/drop-terms/03/metadata.json +18 -0
  286. package/test-fixtures/drop-terms/03/record.json +39 -0
  287. package/test-fixtures/drop-terms/04/expectedResult.json +6 -0
  288. package/test-fixtures/drop-terms/04/metadata.json +19 -0
  289. package/test-fixtures/drop-terms/04/record.json +24 -0
  290. package/test-fixtures/fix-language-codes/02/metadata.json +1 -1
  291. package/test-fixtures/fix-relator-terms/f02/metadata.json +1 -1
  292. package/test-fixtures/fix-relator-terms/f04/expectedResult.json +18 -0
  293. package/test-fixtures/fix-relator-terms/f04/metadata.json +5 -0
  294. package/test-fixtures/fix-relator-terms/f04/record.json +20 -0
  295. package/test-fixtures/fix-sami-041/01/expectedResult.json +6 -0
  296. package/test-fixtures/fix-sami-041/01/metadata.json +4 -0
  297. package/test-fixtures/fix-sami-041/01/record.json +14 -0
  298. package/test-fixtures/fix-sami-041/02/expectedResult.json +10 -0
  299. package/test-fixtures/fix-sami-041/02/metadata.json +4 -0
  300. package/test-fixtures/fix-sami-041/02/record.json +8 -0
  301. package/test-fixtures/fix-sami-041/03/expectedResult.json +5 -0
  302. package/test-fixtures/fix-sami-041/03/metadata.json +5 -0
  303. package/test-fixtures/fix-sami-041/03/record.json +8 -0
  304. package/test-fixtures/fix-sami-041/04/expectedResult.json +7 -0
  305. package/test-fixtures/fix-sami-041/04/metadata.json +4 -0
  306. package/test-fixtures/fix-sami-041/04/record.json +10 -0
  307. package/test-fixtures/fix-sami-041/05/expectedResult.json +10 -0
  308. package/test-fixtures/fix-sami-041/05/metadata.json +6 -0
  309. package/test-fixtures/fix-sami-041/05/record.json +8 -0
  310. package/test-fixtures/fix-sami-041/06/expectedResult.json +10 -0
  311. package/test-fixtures/fix-sami-041/06/metadata.json +4 -0
  312. package/test-fixtures/fix-sami-041/06/record.json +9 -0
  313. package/test-fixtures/indicator-fixes/11/expectedResult.json +10 -0
  314. package/test-fixtures/indicator-fixes/11/metadata.json +4 -0
  315. package/test-fixtures/indicator-fixes/11/record.json +10 -0
  316. package/test-fixtures/merge-fields/f042_01/expectedResult.json +12 -0
  317. package/test-fixtures/merge-fields/f042_01/metadata.json +6 -0
  318. package/test-fixtures/merge-fields/f042_01/record.json +13 -0
  319. package/test-fixtures/merge-fields/f05/metadata.json +1 -1
  320. package/test-fixtures/merge-fields/f06/expectedResult.json +42 -0
  321. package/test-fixtures/merge-fields/f06/metadata.json +6 -0
  322. package/test-fixtures/merge-fields/f06/record.json +41 -0
  323. package/test-fixtures/merge-fields/f07/expectedResult.json +18 -0
  324. package/test-fixtures/merge-fields/f07/metadata.json +6 -0
  325. package/test-fixtures/merge-fields/f07/record.json +18 -0
  326. package/test-fixtures/merge-fields/f08/expectedResult.json +12 -0
  327. package/test-fixtures/merge-fields/f08/metadata.json +7 -0
  328. package/test-fixtures/merge-fields/f08/record.json +10 -0
  329. package/test-fixtures/merge-fields/f09/expectedResult.json +14 -0
  330. package/test-fixtures/merge-fields/f09/metadata.json +6 -0
  331. package/test-fixtures/merge-fields/f09/record.json +14 -0
  332. package/test-fixtures/merge-fields/f10/expectedResult.json +25 -0
  333. package/test-fixtures/merge-fields/f10/metadata.json +6 -0
  334. package/test-fixtures/merge-fields/f10/record.json +25 -0
  335. package/test-fixtures/merge-fields/f11/expectedResult.json +40 -0
  336. package/test-fixtures/merge-fields/f11/metadata.json +7 -0
  337. package/test-fixtures/merge-fields/f11/record.json +50 -0
  338. package/test-fixtures/merge-fields/f12/expectedResult.json +17 -0
  339. package/test-fixtures/merge-fields/f12/metadata.json +6 -0
  340. package/test-fixtures/merge-fields/f12/record.json +25 -0
  341. package/test-fixtures/merge-fields/f13/expectedResult.json +18 -0
  342. package/test-fixtures/merge-fields/f13/metadata.json +6 -0
  343. package/test-fixtures/merge-fields/f13/record.json +28 -0
  344. package/test-fixtures/merge-fields/f14/expectedResult.json +25 -0
  345. package/test-fixtures/merge-fields/f14/metadata.json +6 -0
  346. package/test-fixtures/merge-fields/f14/record.json +25 -0
  347. package/test-fixtures/merge-fields/f15/expectedResult.json +8 -0
  348. package/test-fixtures/merge-fields/f15/metadata.json +6 -0
  349. package/test-fixtures/merge-fields/f15/record.json +9 -0
  350. package/test-fixtures/merge-fields/f16/expectedResult.json +12 -0
  351. package/test-fixtures/merge-fields/f16/metadata.json +7 -0
  352. package/test-fixtures/merge-fields/f16/record.json +13 -0
  353. package/test-fixtures/merge-fields/f300_01/expectedResult.json +9 -0
  354. package/test-fixtures/merge-fields/f300_01/metadata.json +6 -0
  355. package/test-fixtures/merge-fields/f300_01/record.json +8 -0
  356. package/test-fixtures/merge-fields/f300_02/expectedResult.json +13 -0
  357. package/test-fixtures/merge-fields/f300_02/metadata.json +6 -0
  358. package/test-fixtures/merge-fields/f300_02/record.json +16 -0
  359. package/test-fixtures/merge-fields/f300_03/expectedResult.json +13 -0
  360. package/test-fixtures/merge-fields/f300_03/metadata.json +6 -0
  361. package/test-fixtures/merge-fields/f300_03/record.json +16 -0
  362. package/test-fixtures/merge-fields/f490_01/expectedResult.json +13 -0
  363. package/test-fixtures/merge-fields/f490_01/metadata.json +6 -0
  364. package/test-fixtures/merge-fields/f490_01/record.json +16 -0
  365. package/test-fixtures/remove-041-zxx/01/expectedResult.json +5 -0
  366. package/test-fixtures/remove-041-zxx/01/metadata.json +5 -0
  367. package/test-fixtures/remove-041-zxx/01/record.json +10 -0
  368. package/test-fixtures/remove-041-zxx/02/expectedResult.json +7 -0
  369. package/test-fixtures/remove-041-zxx/02/metadata.json +5 -0
  370. package/test-fixtures/remove-041-zxx/02/record.json +9 -0
  371. package/test-fixtures/remove-041-zxx/11/expectedResult.json +10 -0
  372. package/test-fixtures/remove-041-zxx/11/metadata.json +5 -0
  373. package/test-fixtures/remove-041-zxx/11/record.json +9 -0
  374. package/test-fixtures/remove-041-zxx/12/expectedResult.json +10 -0
  375. package/test-fixtures/remove-041-zxx/12/metadata.json +5 -0
  376. package/test-fixtures/remove-041-zxx/12/record.json +9 -0
  377. package/test-fixtures/remove-inferior-datafields/f17/expectedResult.json +11 -0
  378. package/test-fixtures/remove-inferior-datafields/f17/metadata.json +5 -0
  379. package/test-fixtures/remove-inferior-datafields/f17/record.json +15 -0
  380. package/test-fixtures/remove-inferior-datafields/f18/expectedResult.json +13 -0
  381. package/test-fixtures/remove-inferior-datafields/f18/metadata.json +5 -0
  382. package/test-fixtures/remove-inferior-datafields/f18/record.json +18 -0
  383. package/test-fixtures/remove-inferior-datafields/f19/expectedResult.json +17 -0
  384. package/test-fixtures/remove-inferior-datafields/f19/metadata.json +5 -0
  385. package/test-fixtures/remove-inferior-datafields/f19/record.json +18 -0
  386. package/test-fixtures/remove-inferior-datafields/f20/expectedResult.json +15 -0
  387. package/test-fixtures/remove-inferior-datafields/f20/metadata.json +5 -0
  388. package/test-fixtures/remove-inferior-datafields/f20/record.json +29 -0
  389. package/test-fixtures/sort-fields/15/input.json +9 -0
  390. package/test-fixtures/sort-fields/15/metadata.json +5 -0
  391. package/test-fixtures/sort-fields/15/result.json +10 -0
  392. package/test-fixtures/sync-language/01/expectedResult.json +5 -0
  393. package/test-fixtures/sync-language/01/metadata.json +5 -0
  394. package/test-fixtures/sync-language/01/record.json +7 -0
  395. package/test-fixtures/sync-language/02/expectedResult.json +6 -0
  396. package/test-fixtures/sync-language/02/metadata.json +5 -0
  397. package/test-fixtures/sync-language/02/record.json +10 -0
  398. package/test-fixtures/sync-language/03/expectedResult.json +6 -0
  399. package/test-fixtures/sync-language/03/metadata.json +5 -0
  400. package/test-fixtures/sync-language/03/record.json +6 -0
  401. package/test-fixtures/sync-language/10/expectedResult.json +10 -0
  402. package/test-fixtures/sync-language/10/metadata.json +5 -0
  403. package/test-fixtures/sync-language/10/record.json +8 -0
  404. package/test-fixtures/sync-language/11/expectedResult.json +10 -0
  405. package/test-fixtures/sync-language/11/metadata.json +5 -0
  406. package/test-fixtures/sync-language/11/record.json +7 -0
  407. package/test-fixtures/sync-language/12/expectedResult.json +9 -0
  408. package/test-fixtures/sync-language/12/metadata.json +6 -0
  409. package/test-fixtures/sync-language/12/record.json +6 -0
  410. package/test-fixtures/sync-language/13/expectedResult.json +10 -0
  411. package/test-fixtures/sync-language/13/metadata.json +5 -0
  412. package/test-fixtures/sync-language/13/record.json +8 -0
  413. package/test-fixtures/sync-language/14/expectedResult.json +9 -0
  414. package/test-fixtures/sync-language/14/metadata.json +5 -0
  415. package/test-fixtures/sync-language/14/record.json +7 -0
  416. package/test-fixtures/sync-language/15/expectedResult.json +9 -0
  417. package/test-fixtures/sync-language/15/metadata.json +5 -0
  418. package/test-fixtures/sync-language/15/record.json +7 -0
  419. package/test-fixtures/translate-terms/05/expectedResult.json +12 -0
  420. package/test-fixtures/translate-terms/05/metadata.json +7 -0
  421. package/test-fixtures/translate-terms/05/record.json +11 -0
  422. package/test-fixtures/translate-terms/06/expectedResult.json +12 -0
  423. package/test-fixtures/translate-terms/06/metadata.json +7 -0
  424. package/test-fixtures/translate-terms/06/record.json +11 -0
  425. package/test-fixtures/translate-terms-data.js +23 -0
@@ -1,10 +1,12 @@
1
1
  import createDebugLogger from 'debug';
2
- import {fieldHasSubfield, fieldToString, nvdebug, subfieldToString} from './utils.js';
2
+ import {fieldHasSubfield, fieldToString, nvdebug /*, subfieldToString*/ } from './utils.js';
3
3
  import {fieldHasWantedTagAndOccurrenceNumber, isValidSubfield6, subfield6GetOccurrenceNumber, subfield6ResetOccurrenceNumber} from './subfield6Utils.js';
4
4
 
5
5
  // Relocated from melinda-marc-record-merge-reducers (and renamed)
6
6
 
7
7
  const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:resolveOrphanedSubfield6s');
8
+ //const debugData = debug.extend('data');
9
+ const debugDev = debug.extend('dev');
8
10
 
9
11
  export default function () {
10
12
  return {
@@ -13,7 +15,7 @@ export default function () {
13
15
  };
14
16
 
15
17
  function fix(record) {
16
- nvdebug('Fix SF6 orphaned occurrence numbers');
18
+ nvdebug('Fix SF6 orphaned occurrence numbers', debugDev);
17
19
  const res = {message: [], fix: [], valid: true};
18
20
  //message.fix = [];
19
21
 
@@ -26,7 +28,7 @@ export default function () {
26
28
 
27
29
  function validate(record) {
28
30
  // Check max, and check number of different indexes
29
- nvdebug('Validate SF6 orphaned occurrence numbers', debug);
31
+ nvdebug('Validate SF6 orphaned occurrence numbers', debugDev);
30
32
  const fieldsContainingSubfield6 = record.fields.filter(field => fieldHasSubfield(field, '6'));
31
33
 
32
34
  const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);
@@ -77,7 +79,7 @@ function findPairForSubfield6OccurrenceNumber(subfield6, myTag, candPairFields)
77
79
  if (!isValidSubfield6(subfield6)) {
78
80
  return undefined;
79
81
  }
80
- nvdebug(`LOOKING FOR PAIR: ${myTag} ${subfieldToString(subfield6)}`);
82
+ //nvdebug(`LOOKING FOR PAIR: ${myTag} ${subfieldToString(subfield6)}`, debugDev);
81
83
  candPairFields.forEach(field => fieldToString(field));
82
84
 
83
85
  // Only valid $6 value that fails to map to another field is iffy...
@@ -88,7 +90,7 @@ function findPairForSubfield6OccurrenceNumber(subfield6, myTag, candPairFields)
88
90
  return undefined;
89
91
  }
90
92
  const tagAndOccurrenceNumber = `${myTag}-${occurrenceNumber}`;
91
- nvdebug(`Try to find occurrence number ${tagAndOccurrenceNumber} in field ${referredTag}...`);
93
+ //nvdebug(`Try to find occurrence number ${tagAndOccurrenceNumber} in field ${referredTag}...`, debugDev);
92
94
  //const relevantFields = fields.filter(field => field.tag === referredTag && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber));
93
95
  const relevantFields = candPairFields.filter(field => field.tag === referredTag && fieldHasWantedTagAndOccurrenceNumber(field, tagAndOccurrenceNumber));
94
96
  if (relevantFields.length === 0) {
@@ -3,7 +3,7 @@ import {MarcRecord} from '@natlibfi/marc-record';
3
3
  import validatorFactory from './resolveOrphanedSubfield6s.js';
4
4
  import {READERS} from '@natlibfi/fixura';
5
5
  import generateTests from '@natlibfi/fixugen';
6
- import createDebugLogger from 'debug';
6
+ //import createDebugLogger from 'debug';
7
7
 
8
8
  generateTests({
9
9
  callback,
@@ -20,7 +20,7 @@ generateTests({
20
20
  }
21
21
  });
22
22
 
23
- const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/resolveOrphanedSubfield6s:test');
23
+ //const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/resolveOrphanedSubfield6s:test');
24
24
 
25
25
  async function testValidatorFactory() {
26
26
  const validator = await validatorFactory();
@@ -30,12 +30,7 @@ async function testValidatorFactory() {
30
30
  assert.equal(typeof validator.validate, 'function');
31
31
  }
32
32
 
33
- async function callback({getFixture, enabled = true, fix = false}) {
34
- if (enabled === false) {
35
- debug('TEST SKIPPED!');
36
- return;
37
- }
38
-
33
+ async function callback({getFixture, fix = false}) {
39
34
  const validator = await validatorFactory();
40
35
  const record = new MarcRecord(getFixture('record.json'));
41
36
  const expectedResult = getFixture('expectedResult.json');
@@ -3,7 +3,7 @@ import {MarcRecord} from '@natlibfi/marc-record';
3
3
  import validatorFactory from './sanitize-vocabulary-source-codes.js';
4
4
  import {READERS} from '@natlibfi/fixura';
5
5
  import generateTests from '@natlibfi/fixugen';
6
- import createDebugLogger from 'debug';
6
+ //import createDebugLogger from 'debug';
7
7
 
8
8
  generateTests({
9
9
  callback,
@@ -19,7 +19,7 @@ generateTests({
19
19
  }
20
20
  }
21
21
  });
22
- const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes:test');
22
+ //const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes:test');
23
23
 
24
24
  async function testValidatorFactory() {
25
25
  const validator = await validatorFactory();
@@ -29,12 +29,7 @@ async function testValidatorFactory() {
29
29
  assert.equal(typeof validator.validate, 'function');
30
30
  }
31
31
 
32
- async function callback({getFixture, enabled = true, fix = false}) {
33
- if (enabled === false) {
34
- debug('TEST SKIPPED!');
35
- return;
36
- }
37
-
32
+ async function callback({getFixture, fix = false}) {
38
33
  const validator = await validatorFactory();
39
34
 
40
35
  const recordFixture = getFixture('record.json');
package/src/sortFields.js CHANGED
@@ -211,7 +211,7 @@ export function fieldOrderComparator(fieldA, fieldB) {
211
211
 
212
212
  //const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];
213
213
 
214
- const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortBySubfield6, preferFenniKeep, sortByFieldLinkAndSequenceNumber];
214
+ const sorterFunctions = [sortByTag, sortByIndexTerms, sortAlphabetically, sortByRelatorTerm, sortBySubfield6, preferFenniKeep, sortByFieldLinkAndSequenceNumber, sortByHacks];
215
215
  //const sorterFunctions = [sortByIndexTerms, sortByRelatorTerm, sortByOccurrenceNumber, preferFenniKeep, sortByFieldLinkAndSequenceNumber];
216
216
 
217
217
  return globalFieldOrderComparator(fieldA, fieldB, sorterFunctions);
@@ -390,6 +390,25 @@ function sortByFieldLinkAndSequenceNumber(fieldA, fieldB) { // Sort by subfield
390
390
  return -1;
391
391
  }
392
392
 
393
+ function sortByHacks(fieldA, fieldB) {
394
+ // Place for various hackier rules
395
+
396
+ if (fieldA.tag === fieldB.tag) {
397
+ if (fieldA.tag === '041') {
398
+ // If we have multiple f041, we want to put the $2-less first; Values from $2 whatever can not be copied to 008/35-37. (See sync-language.js.)
399
+ const a2 = fieldA.subfields.some(sf => sf.code === '2');
400
+ const b2 = fieldB.subfields.some(sf => sf.code === '2');
401
+ if (a2 && !b2) {
402
+ return 1;
403
+ }
404
+ if (b2 && !a2) {
405
+ return -1;
406
+ }
407
+ }
408
+
409
+ }
410
+ return 0;
411
+ }
393
412
 
394
413
  function sortBySubfield6(fieldA, fieldB) { // Sort by subfield $6, ex-sortByOccurrenceNumber...
395
414
  if (fieldA.tag !== '880' || fieldB.tag !== '880') {
@@ -3,7 +3,7 @@ import {MarcRecord} from '@natlibfi/marc-record';
3
3
  import validatorFactory from './sortFields.js';
4
4
  import {READERS} from '@natlibfi/fixura';
5
5
  import generateTests from '@natlibfi/fixugen';
6
- import createDebugLogger from 'debug';
6
+ //import createDebugLogger from 'debug';
7
7
 
8
8
  generateTests({
9
9
  callback,
@@ -19,7 +19,7 @@ generateTests({
19
19
  }
20
20
  }
21
21
  });
22
- const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sortFields:test');
22
+ //const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sortFields:test');
23
23
 
24
24
  async function testValidatorFactory() {
25
25
  const validator = await validatorFactory();
@@ -29,12 +29,7 @@ async function testValidatorFactory() {
29
29
  assert.equal(typeof validator.validate, 'function');
30
30
  }
31
31
 
32
- async function callback({getFixture, enabled = true, fix = true}) {
33
- if (enabled === false) {
34
- debug('TEST SKIPPED!');
35
- return;
36
- }
37
-
32
+ async function callback({getFixture, fix = true}) {
38
33
  const validator = await validatorFactory();
39
34
  const record = new MarcRecord(getFixture('input.json'));
40
35
  const expectedResult = getFixture('result.json');
@@ -3,7 +3,7 @@ import {MarcRecord} from '@natlibfi/marc-record';
3
3
  import validatorFactory from './sortRelatorTerms.js';
4
4
  import {READERS} from '@natlibfi/fixura';
5
5
  import generateTests from '@natlibfi/fixugen';
6
- import createDebugLogger from 'debug';
6
+ //import createDebugLogger from 'debug';
7
7
 
8
8
  generateTests({
9
9
  callback,
@@ -20,7 +20,7 @@ generateTests({
20
20
  }
21
21
  });
22
22
 
23
- const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sortRelatorTerms:test');
23
+ //const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sortRelatorTerms:test');
24
24
 
25
25
  async function testValidatorFactory() {
26
26
  const validator = await validatorFactory();
@@ -30,12 +30,7 @@ async function testValidatorFactory() {
30
30
  assert.equal(typeof validator.validate, 'function');
31
31
  }
32
32
 
33
- async function callback({getFixture, enabled = true, fix = false}) {
34
- if (enabled === false) {
35
- debug('TEST SKIPPED!');
36
- return;
37
- }
38
-
33
+ async function callback({getFixture, fix = false}) {
39
34
  const validator = await validatorFactory();
40
35
  const record = new MarcRecord(getFixture('record.json'));
41
36
  const expectedResult = getFixture('expectedResult.json');
@@ -8,8 +8,8 @@ const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortSu
8
8
  //const debugData = debug.extend('data');
9
9
  const debugDev = debug.extend('dev');
10
10
 
11
- const defaultSortOrderStringFinns = '8673abcdefghijklmnopqrstuvwxyz420159'; // NB! We Finns like $2 before $0 in 6XX...
12
- const defaultSortOrderStringOthers = '8673abcdefghijklmnopqrstuvwxyz402159';
11
+ const defaultSortOrderStringFinns = '863abcdefghijklmnopqrstuvwxyz4201759'; // NB! We Finns like $2 before $0 in 6XX...
12
+ const defaultSortOrderStringOthers = '863abcdefghijklmnopqrstuvwxyz4021759'; // NB 760-788 have '7' in different position...
13
13
 
14
14
  const defaultSortOrderFinns = defaultSortOrderStringFinns.split('');
15
15
  const defaultSortOrderOthers = defaultSortOrderStringOthers.split('');
@@ -70,7 +70,7 @@ export default function (defaultTagPattern) {
70
70
  const sortOrderForX00 = ['i', 'a', 'b', 'q', 'c', 'd', 'e', 't', 'u', 'l', 'f', 'x', 'y', 'z', '0', '1', '5', '9']; // skip $g. Can't remember why, though...
71
71
  const sortOrderForX10 = ['i', 'a', 'b', 't', 'n', 'c', 'e', 'v', 'w', 'x', 'y', 'z', '0', '1', '5', '9']; // somewhat iffy
72
72
  const sortOrderForX11 = ['a', 'n', 'd', 'c', 'e', 'g', 'j', '0', '1', '5', '9'];
73
- const sortOrderFor7XX = ['8', '7', 'i', 'a', 's', 't', 'b', 'c', 'd', 'm', 'h', 'k', 'o', 'x', 'z', 'g', 'q', 'w'];
73
+ const sortOrderFor7XXLinkingEntries = ['8', '7', 'i', 'a', 's', 't', 'b', 'c', 'd', 'm', 'h', 'k', 'o', 'x', 'z', 'g', 'q', 'w', '0', '1', 'l', '9', '5'];
74
74
  const sortOrderFor246 = ['i', 'a', 'b', 'n', 'p', 'f', '5', '9']; // Used by field 946 as well
75
75
 
76
76
  // List *only* exceptional order here. Otherwise default order is used.
@@ -79,7 +79,11 @@ const subfieldSortOrder = [
79
79
  {'tag': '028', 'sortOrder': ['b', 'a', 'q']}, // National convention
80
80
  //{'tag': '031', 'sortOrder': ['a', 'b', 'c', 'm', 'e', 'd']}, // utter guesswork
81
81
  {'tag': '040', 'sortOrder': ['8', 'a', 'b', 'e', 'c', 'd', 'x']},
82
- {'tag': '041', 'sortOrder': ['8', 'a', 'd', 'j', 'p', 'h', 'e', 'g', 'm']}, // guesswork
82
+ // rda mus: 041: k < h < e < n < g < m < j (I think h<e is bad)
83
+ // rda: g < h, j < p < h, i < j, k < h
84
+ // loc: b < j, $m follows $b or $g
85
+ // NV: $a
86
+ {'tag': '041', 'sortOrder': ['8', 'a', 'd', 'e', 'b', 'f', 'i', 'j', 'p', 'k', 'h', 'n', 'g', 'm']}, // guesswork
83
87
  {'tag': '048', 'sortOrder': ['8', 'b', 'a']},
84
88
  {'tag': '100', 'sortOrder': sortOrderForX00},
85
89
  {'tag': '110', 'sortOrder': sortOrderForX10},
@@ -103,22 +107,22 @@ const subfieldSortOrder = [
103
107
  {'tag': '700', 'sortOrder': sortOrderForX00},
104
108
  {'tag': '710', 'sortOrder': sortOrderForX10},
105
109
  {'tag': '711', 'sortOrder': sortOrderForX11},
106
- {'tag': '760', 'sortOrder': sortOrderFor7XX},
107
- {'tag': '762', 'sortOrder': sortOrderFor7XX},
108
- {'tag': '765', 'sortOrder': sortOrderFor7XX},
109
- {'tag': '767', 'sortOrder': sortOrderFor7XX},
110
- {'tag': '770', 'sortOrder': sortOrderFor7XX},
111
- {'tag': '772', 'sortOrder': sortOrderFor7XX},
112
- {'tag': '773', 'sortOrder': sortOrderFor7XX},
113
- {'tag': '774', 'sortOrder': sortOrderFor7XX},
114
- {'tag': '775', 'sortOrder': sortOrderFor7XX},
115
- {'tag': '776', 'sortOrder': sortOrderFor7XX},
116
- {'tag': '777', 'sortOrder': sortOrderFor7XX},
117
- {'tag': '780', 'sortOrder': sortOrderFor7XX},
118
- {'tag': '785', 'sortOrder': sortOrderFor7XX},
119
- {'tag': '786', 'sortOrder': sortOrderFor7XX},
120
- {'tag': '787', 'sortOrder': sortOrderFor7XX},
121
- {'tag': '788', 'sortOrder': sortOrderFor7XX},
110
+ {'tag': '760', 'sortOrder': sortOrderFor7XXLinkingEntries},
111
+ {'tag': '762', 'sortOrder': sortOrderFor7XXLinkingEntries},
112
+ {'tag': '765', 'sortOrder': sortOrderFor7XXLinkingEntries},
113
+ {'tag': '767', 'sortOrder': sortOrderFor7XXLinkingEntries},
114
+ {'tag': '770', 'sortOrder': sortOrderFor7XXLinkingEntries},
115
+ {'tag': '772', 'sortOrder': sortOrderFor7XXLinkingEntries},
116
+ {'tag': '773', 'sortOrder': sortOrderFor7XXLinkingEntries},
117
+ {'tag': '774', 'sortOrder': sortOrderFor7XXLinkingEntries},
118
+ {'tag': '775', 'sortOrder': sortOrderFor7XXLinkingEntries},
119
+ {'tag': '776', 'sortOrder': sortOrderFor7XXLinkingEntries},
120
+ {'tag': '777', 'sortOrder': sortOrderFor7XXLinkingEntries},
121
+ {'tag': '780', 'sortOrder': sortOrderFor7XXLinkingEntries},
122
+ {'tag': '785', 'sortOrder': sortOrderFor7XXLinkingEntries},
123
+ {'tag': '786', 'sortOrder': sortOrderFor7XXLinkingEntries},
124
+ {'tag': '787', 'sortOrder': sortOrderFor7XXLinkingEntries},
125
+ {'tag': '788', 'sortOrder': sortOrderFor7XXLinkingEntries},
122
126
  {'tag': '800', 'sortOrder': sortOrderForX00},
123
127
  {'tag': '810', 'sortOrder': sortOrderForX10},
124
128
  {'tag': '811', 'sortOrder': sortOrderForX11},
@@ -136,7 +140,9 @@ function getSubfieldSortOrder(field) {
136
140
  debugDev(`sort order for ${field.tag}: ${entry[0].sortOrder}`);
137
141
  return entry[0].sortOrder;
138
142
  }
139
- nvdebug(`WARNING!\tNo subfield order found for ${field.tag}.`);
143
+ if (!['300'].includes(field.tag)) { // Lis tags which use normal $a...$z order here!
144
+ nvdebug(`WARNING!\tNo subfield order found for ${field.tag}.`, debugDev);
145
+ }
140
146
  return [];
141
147
  }
142
148
 
@@ -224,15 +230,15 @@ export function sortAdjacentSubfields(field, externalSortOrder = []) {
224
230
  swapSubfields(field, controlSubfieldOrder);
225
231
 
226
232
  const sortOrderForField = externalSortOrder.length > 0 ? externalSortOrder : getSubfieldSortOrder(field);
227
- //nvdebug(`INTERMEDIATE SUBFIELD ORDER FOR ${field.tag}: ${sortOrderForField.join(', ')}`);
233
+ //nvdebug(`INTERMEDIATE SUBFIELD ORDER FOR ${field.tag}: ${sortOrderForField.join(', ')}`, debugDev);
228
234
 
229
235
  const defaultSortOrder = finnishWay ? defaultSortOrderFinns : defaultSortOrderOthers; // $2 vs $0
230
236
  const subfieldOrder = sortOrderForField.length > 0 ? sortOrderForField : defaultSortOrder;
231
- //nvdebug(`FINAL SUBFIELD ORDER (FINNISH=${finnishWay}) FOR ${field.tag}: ${subfieldOrder.join(', ')}`);
237
+ //nvdebug(`FINAL SUBFIELD ORDER (FINNISH=${finnishWay}) FOR ${field.tag}: ${subfieldOrder.join(', ')}`, debugDev);
232
238
  //if (sortOrder === null) { return field; } //// Currently always sort..
233
- //nvdebug(`IN: ${fieldToString(field)}`);
239
+ //nvdebug(`IN: ${fieldToString(field)}`, debugDev);
234
240
  swapSubfields(field, subfieldOrder);
235
- //nvdebug(`OUT: ${fieldToString(field)}`);
241
+ //nvdebug(`OUT: ${fieldToString(field)}`, debugDev);
236
242
 
237
243
  return field;
238
244
  }
@@ -3,7 +3,7 @@ import {MarcRecord} from '@natlibfi/marc-record';
3
3
  import validatorFactory from './sortSubfields.js';
4
4
  import {READERS} from '@natlibfi/fixura';
5
5
  import generateTests from '@natlibfi/fixugen';
6
- import createDebugLogger from 'debug';
6
+ //import createDebugLogger from 'debug';
7
7
 
8
8
  generateTests({
9
9
  callback,
@@ -20,7 +20,7 @@ generateTests({
20
20
  }
21
21
  });
22
22
 
23
- const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sortSubfields:test');
23
+ //const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sortSubfields:test');
24
24
 
25
25
  async function testValidatorFactory() {
26
26
  const validator = await validatorFactory();
@@ -30,12 +30,7 @@ async function testValidatorFactory() {
30
30
  assert.equal(typeof validator.validate, 'function');
31
31
  }
32
32
 
33
- async function callback({getFixture, enabled = true, fix = false, tagPattern = false}) {
34
- if (enabled === false) {
35
- debug('TEST SKIPPED!');
36
- return;
37
- }
38
-
33
+ async function callback({getFixture, fix = false, tagPattern = false}) {
39
34
  const validator = await validatorFactory(tagPattern);
40
35
  const record = new MarcRecord(getFixture('record.json'));
41
36
  const expectedResult = getFixture('expectedResult.json');
@@ -6,26 +6,31 @@
6
6
  */
7
7
 
8
8
  import {fieldGetFixedString, fieldNeedsModification, fieldStripPunctuation} from './punctuation2.js';
9
- // import createDebugLogger from 'debug';
9
+ import createDebugLogger from 'debug';
10
+
10
11
  import {fieldToString, nvdebug} from './utils.js';
11
12
 
12
- // const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation2');
13
+ const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/punctuation2');
14
+ //const debugData = debug.extend('data');
15
+ const debugDev = debug.extend('dev');
16
+
17
+ const description = 'Strip punctuation in data fields';
13
18
 
14
19
  export default function () {
15
20
  return {
16
- description: 'Strip punctuation to data fields',
21
+ description: description,
17
22
  validate, fix
18
23
  };
19
24
 
20
25
  function fix(record) {
21
- nvdebug('Strip punctuation to data fields: fixer');
26
+ nvdebug(`${description}: fixer`, debugDev);
22
27
  const res = {message: [], fix: [], valid: true};
23
28
  record.fields.forEach(f => fieldStripPunctuation(f));
24
29
  return res;
25
30
  }
26
31
 
27
32
  function validate(record) {
28
- nvdebug('Strip punctuation to data fields: validate');
33
+ nvdebug(`${description}: validate`, debugDev);
29
34
 
30
35
  const fieldsNeedingModification = record.fields.filter(f => fieldNeedsModification(f, false));
31
36
 
@@ -3,7 +3,7 @@ import {MarcRecord} from '@natlibfi/marc-record';
3
3
  import validatorFactory from './stripPunctuation.js';
4
4
  import {READERS} from '@natlibfi/fixura';
5
5
  import generateTests from '@natlibfi/fixugen';
6
- import createDebugLogger from 'debug';
6
+ //import createDebugLogger from 'debug';
7
7
 
8
8
  generateTests({
9
9
  callback,
@@ -20,7 +20,7 @@ generateTests({
20
20
  }
21
21
  });
22
22
 
23
- const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/stripPunctuation:test');
23
+ //const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/stripPunctuation:test');
24
24
 
25
25
  async function testValidatorFactory() {
26
26
  const validator = await validatorFactory();
@@ -30,12 +30,7 @@ async function testValidatorFactory() {
30
30
  assert.equal(typeof validator.validate, 'function');
31
31
  }
32
32
 
33
- async function callback({getFixture, enabled = true, fix = false}) {
34
- if (enabled === false) {
35
- debug('TEST SKIPPED!');
36
- return;
37
- }
38
-
33
+ async function callback({getFixture, fix = false}) {
39
34
  const validator = await validatorFactory();
40
35
  const record = new MarcRecord(getFixture('record.json'));
41
36
  const expectedResult = getFixture('expectedResult.json');
@@ -1,8 +1,6 @@
1
1
  import createDebugLogger from 'debug';
2
- // const debug = createDebugLogger('@natlibfi/marc-record-validator-melinda/subfield6Utils');
3
-
4
2
  import {add8s, fieldsGetAllSubfield8LinkingNumbers, getSubfield8LinkingNumber, isValidSubfield8} from './subfield8Utils.js';
5
- import {fieldHasSubfield, fieldToString, fieldsToString, nvdebug, subfieldToString} from './utils.js';
3
+ import {fieldHasSubfield, fieldToString, /* fieldsToString, */ nvdebug, subfieldToString} from './utils.js';
6
4
 
7
5
  const debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:subfield6Utils');
8
6
  //const debugData = debug.extend('data');
@@ -41,7 +39,7 @@ export function subfield6GetOccurrenceNumberAsInteger(subfield) {
41
39
  return 0;
42
40
  }
43
41
  const result = parseInt(index, 10);
44
- //nvdebug(`SF6: ${subfield.value} => ${index} => ${result}`, debug);
42
+ //nvdebug(`SF6: ${subfield.value} => ${index} => ${result}`, debugDev, debugDev);
45
43
  return result;
46
44
  }
47
45
 
@@ -52,7 +50,7 @@ export function subfield6ResetOccurrenceNumber(subfield, occurrenceNumber) {
52
50
  const occurrenceNumberAsString = typeof occurrenceNumber === 'number' ? intToOccurrenceNumberString(occurrenceNumber) : occurrenceNumber;
53
51
 
54
52
  const newValue = subfield.value.substring(0, 4) + occurrenceNumberAsString + subfield6GetTail(subfield);
55
- //nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`);
53
+ //nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`, debugDev);
56
54
  subfield.value = newValue;
57
55
  }
58
56
 
@@ -71,7 +69,7 @@ export function subfield6HasWantedTagAndOccurrenceNumber(subfield, tagAndOccurre
71
69
  }
72
70
  // We could also use generic code and go getTag()+'-'+getIndex() instead of regexp...
73
71
  const key = subfield.value.replace(/^([0-9][0-9][0-9]-[0-9][0-9]+).*$/u, '$1');
74
- nvdebug(` Compare '${key}' vs '${tagAndOccurrenceNumber}'`);
72
+ //nvdebug(` Compare '${key}' vs '${tagAndOccurrenceNumber}'`, debugDev);
75
73
  return key === tagAndOccurrenceNumber;
76
74
  }
77
75
 
@@ -94,7 +92,7 @@ export function fieldGetUnambiguousOccurrenceNumber(field) {
94
92
  }
95
93
 
96
94
  export function fieldHasOccurrenceNumber(field, occurrenceNumber) {
97
- //nvdebug(`${occurrenceNumber} vs ${fieldToString(field)}`);
95
+ //nvdebug(`${occurrenceNumber} vs ${fieldToString(field)}`, debugDev);
98
96
  return field.subfields && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber);
99
97
  }
100
98
 
@@ -119,13 +117,13 @@ export function intToOccurrenceNumberString(i) {
119
117
 
120
118
  export function fieldGetMaxSubfield6OccurrenceNumberAsInteger(field) {
121
119
  // used by reducer!
122
- //nvdebug(`Checking subfields $6 from ${JSON.stringify(field)}`);
120
+ //nvdebug(`Checking subfields $6 from ${JSON.stringify(field)}`, debugDev);
123
121
  const sf6s = field.subfields ? field.subfields.filter(subfield => isValidSubfield6(subfield)) : [];
124
122
  if (sf6s.length === 0) {
125
123
  return 0;
126
124
  }
127
125
  // There should always be one, but here we check every subfield.
128
- //nvdebug(`Got ${field.subfields} $6-subfield(s) from ${JSON.stringify(field)}`, debug);
126
+ //nvdebug(`Got ${field.subfields} $6-subfield(s) from ${JSON.stringify(field)}`, debugDev);
129
127
  const vals = sf6s.map(sf => subfield6GetOccurrenceNumberAsInteger(sf));
130
128
  return Math.max(...vals);
131
129
  }
@@ -155,20 +153,20 @@ export function fieldHasValidSubfield6(field) {
155
153
 
156
154
  export function isSubfield6Pair(field, otherField) {
157
155
  // No need to log this:
158
- //nvdebug(`LOOK for $6-pair:\n ${fieldToString(field)}\n ${fieldToString(otherField)}`);
156
+ //nvdebug(`LOOK for $6-pair:\n ${fieldToString(field)}\n ${fieldToString(otherField)}`, debugDev);
159
157
  if (!fieldHasValidSubfield6(field) || !fieldHasValidSubfield6(otherField)) {
160
158
  return false;
161
159
  }
162
160
 
163
161
  if (!tagsArePairable6(field.tag, otherField.tag)) {
164
- //nvdebug(` FAILED. REASON: TAGS NOT PAIRABLE!`);
162
+ //nvdebug(` FAILED. REASON: TAGS NOT PAIRABLE!`, debugDev);
165
163
  return false;
166
164
  }
167
165
 
168
166
 
169
167
  const fieldIndex = fieldGetUnambiguousOccurrenceNumber(field);
170
168
  if (fieldIndex === undefined || fieldIndex === '00') {
171
- //nvdebug(` FAILED. REASON: NO INDEX FOUND`);
169
+ //nvdebug(` FAILED. REASON: NO INDEX FOUND`, debugDev);
172
170
  return false;
173
171
  }
174
172
 
@@ -176,12 +174,12 @@ export function isSubfield6Pair(field, otherField) {
176
174
 
177
175
 
178
176
  if (fieldIndex !== otherFieldIndex) {
179
- //nvdebug(` FAILURE: INDEXES: ${fieldIndex} vs ${otherFieldIndex}`);
177
+ //nvdebug(` FAILURE: INDEXES: ${fieldIndex} vs ${otherFieldIndex}`, debugDev);
180
178
  return false;
181
179
  }
182
180
 
183
181
  if (fieldGetUnambiguousTag(field) !== otherField.tag || field.tag !== fieldGetUnambiguousTag(otherField)) {
184
- //nvdebug(` FAILURE: TAG vs $6 TAG`);
182
+ //nvdebug(` FAILURE: TAG vs $6 TAG`, debugDev);
185
183
  return false;
186
184
  }
187
185
  return true;
@@ -219,11 +217,11 @@ export function fieldGetOccurrenceNumberPairs(field, candFields) {
219
217
  //nvdebug(` Trying to finds pair for ${fieldToString(field)} in ${candFields.length} fields`);
220
218
  const pairs = candFields.filter(otherField => isSubfield6Pair(field, otherField));
221
219
  if (pairs.length === 0) {
222
- nvdebug(`NO PAIRS FOUND FOR '${fieldToString(field)}'`);
220
+ //nvdebug(`NO PAIRS FOUND FOR '${fieldToString(field)}'`, debugDev);
223
221
  return pairs;
224
222
  }
225
- nvdebug(`${pairs.length} PAIR(S) FOUND FOR '${fieldToString(field)}'`);
226
- pairs.forEach(pairedField => nvdebug(` '${fieldToString(pairedField)}'`));
223
+ //nvdebug(`${pairs.length} PAIR(S) FOUND FOR '${fieldToString(field)}'`, debugDev);
224
+ pairs.forEach(pairedField => nvdebug(` '${fieldToString(pairedField)}'`, debugDev));
227
225
  return pairs;
228
226
  }
229
227
 
@@ -268,7 +266,7 @@ export function fieldGetSubfield6Pair(field, record) {
268
266
  return undefined;
269
267
  }
270
268
  // NB! It is theoretically possible to have multiple pairable 880 fields (one for each encoding)
271
- nvdebug(`fieldGetSubfield6Pair(): ${fieldToString(field)} => ${fieldToString(pairedFields[0])}`);
269
+ nvdebug(`fieldGetSubfield6Pair(): ${fieldToString(field)} => ${fieldToString(pairedFields[0])}`, debugDev);
272
270
  return pairedFields[0];
273
271
  }
274
272
  */
@@ -357,7 +355,7 @@ function guessTargetLinkingNumber(fields, defaultTargetLinkingNumber) {
357
355
  export function fieldsToNormalizedString(fields, defaultTargetLinkingNumber = 0, normalizeOccurrenceNumber = false, normalizeEntryTag = false) {
358
356
  const targetLinkingNumber = guessTargetLinkingNumber(fields, defaultTargetLinkingNumber);
359
357
 
360
- nvdebug(`fieldsToNormalizedString: OCC: ${normalizeOccurrenceNumber}`);
358
+ //nvdebug(`fieldsToNormalizedString: OCC: ${normalizeOccurrenceNumber}`, debugDev);
361
359
  const strings = fields.map(field => fieldToNormalizedString(field, targetLinkingNumber, normalizeOccurrenceNumber, normalizeEntryTag));
362
360
  strings.sort();
363
361
  return strings.join('\t__SEPARATOR__\t');
@@ -369,32 +367,32 @@ export function fieldsToNormalizedString(fields, defaultTargetLinkingNumber = 0,
369
367
  export function removeField6IfNeeded(field, record, fieldsAsString) {
370
368
  const pairField = fieldGetSubfield6Pair(field, record);
371
369
  const asString = pairField ? fieldsToNormalizedString([field, pairField]) : fieldToNormalizedString(field);
372
- nvdebug(`SOURCE: ${asString} -- REALITY: ${fieldToString(field)}`);
370
+ nvdebug(`SOURCE: ${asString} -- REALITY: ${fieldToString(field)}`, debugDev);
373
371
  const tmp = pairField ? fieldToString(pairField) : 'HUTI';
374
- nvdebug(`PAIR: ${tmp}`);
375
- nvdebug(`BASE:\n ${fieldsAsString.join('\n ')}`);
372
+ nvdebug(`PAIR: ${tmp}`, debugDev);
373
+ nvdebug(`BASE:\n ${fieldsAsString.join('\n ')}`, debugDev);
376
374
  if (!fieldsAsString.includes(asString)) {
377
375
  return;
378
376
  }
379
- nvdebug(`Duplicate $6 removal: ${fieldToString(field)}`);
377
+ nvdebug(`Duplicate $6 removal: ${fieldToString(field)}`, debugDev);
380
378
  record.removeField(field);
381
379
 
382
380
  if (pairField === undefined) {
383
381
  return;
384
382
  }
385
- nvdebug(`Duplicate $6 removal (pair): ${fieldToString(pairField)}`);
383
+ nvdebug(`Duplicate $6 removal (pair): ${fieldToString(pairField)}`, debugDev);
386
384
  record.removeField(pairField);
387
385
  }
388
386
  */
389
387
 
390
388
  function getFirstField(record, fields) {
391
389
  const fieldsAsStrings = fields.map(field => fieldToString(field));
392
- //record.fields.forEach((field, i) => nvdebug(`${i}:\t${fieldToString(field)}`));
393
- //nvdebug(`getFirstField: ${fieldsAsStrings.join('\t')}`);
390
+ //record.fields.forEach((field, i) => nvdebug(`${i}:\t${fieldToString(field)}`, debugDev));
391
+ //nvdebug(`getFirstField: ${fieldsAsStrings.join('\t')}`, debugDev);
394
392
  const i = record.fields.findIndex(field => fieldsAsStrings.includes(fieldToString(field)));
395
393
  if (i > -1) {
396
394
  const field = record.fields[i];
397
- //nvdebug(`1st F: ${i + 1}/${record.fields.length} ${fieldToString(field)}`);
395
+ //nvdebug(`1st F: ${i + 1}/${record.fields.length} ${fieldToString(field)}`, debugDev);
398
396
  return field;
399
397
  }
400
398
  return undefined;
@@ -445,7 +443,7 @@ export function isFirstLinkedSubfield6Field(field, record) {
445
443
  }
446
444
  const chain = getAllLinkedSubfield6Fields(field, record);
447
445
  if (!isRelevantSubfield6Chain(chain)) {
448
- nvdebug(`Rejected 6: ${fieldsToString(chain)}`);
446
+ //nvdebug(`Rejected 6: ${fieldsToString(chain)}`, debugDev);
449
447
  return false;
450
448
  }
451
449
 
@@ -472,13 +470,13 @@ export function get6s(field, candidateFields) { // NB! Convert field to fields!!
472
470
  if (sixes.length === 0) {
473
471
  return [field];
474
472
  }
475
- nvdebug(`SIXES: ${sixes.length}`);
473
+ //nvdebug(`SIXES: ${sixes.length}`, debugDev);
476
474
  const occurrenceNumbers = sixes.map(sf => subfield6GetOccurrenceNumber(sf)).filter(value => value !== undefined && value !== '00');
477
- nvdebug(occurrenceNumbers.join(' -- '));
475
+ //nvdebug(occurrenceNumbers.join(' -- '), debugDev);
478
476
 
479
477
  const relevantFields = candidateFields.filter(f => occurrenceNumbers.some(o => fieldHasOccurrenceNumber(f, o)));
480
- nvdebug(`${fieldToString(field)}: $6-RELFIELDS FOUND: ${relevantFields.length}...`);
481
- relevantFields.forEach(f => nvdebug(fieldToString(f)));
478
+ //nvdebug(`${fieldToString(field)}: $6-RELFIELDS FOUND: ${relevantFields.length}...`, debugDev);
479
+ //relevantFields.forEach(f => nvdebug(fieldToString(f), debugDev));
482
480
  return relevantFields;
483
481
  }
484
482
 
@@ -488,6 +486,6 @@ export function resetSubfield6Tag(subfield, tag) {
488
486
  }
489
487
  // NB! mainly for 1XX<->7XX transfers
490
488
  const newValue = `${tag}-${subfield.value.substring(4)}`;
491
- nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`, debugDev);
489
+ //nvdebug(`Set subfield $6 value from ${subfieldToString(subfield)} to ${newValue}`, debugDevDev);
492
490
  subfield.value = newValue;
493
491
  }