@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,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/fix-country-codes.js"],
4
- "sourcesContent": ["// Fix country codes in 008/15-17\n//\n// This is proto. Extend later...\n//\n// Author(s): Nicholas Volk\n\n//import createDebugLogger from 'debug';\n//import {fieldToString, nvdebug} from './utils.js';\n\n\nexport default function () {\n\n return {\n description: 'Fix deprecated country codes',\n validate, fix\n };\n\n function fix(record) {\n //nvdebug(`FIX ME`);\n const res = {message: [], fix: [], valid: true};\n\n const [field008] = record.get('008');\n if (!field008) {\n return res;\n }\n\n fixCountryCode(field008);\n\n return res;\n }\n\n function validate(record) {\n const res = {message: [], valid: true};\n\n const [field008] = record.get('008');\n\n if (!field008) {\n return res;\n }\n\n const originalCountryCode = getCountryCodeFromField008(field008);\n const modifiedCountryCode = deprecatedCountryCodeToCurrentCountryCode(originalCountryCode);\n if (originalCountryCode === modifiedCountryCode) {\n return res;\n }\n\n res.message.push(`Modify 008/15-17: '${originalCountryCode}' => '${modifiedCountryCode}'`);\n\n res.valid = false;\n return res;\n }\n\n function fixCountryCode(field008) {\n const originalCountryCode = getCountryCodeFromField008(field008);\n const modifiedCountryCode = deprecatedCountryCodeToCurrentCountryCode(originalCountryCode);\n if (originalCountryCode !== modifiedCountryCode && modifiedCountryCode.length === 3) {\n field008.value = `${field008.value.substring(0, 15)}${modifiedCountryCode}${field008.value.substring(18)}`;\n return;\n }\n }\n\n function getCountryCodeFromField008(field) {\n return field.value.substring(15, 18); // return 008/15-17\n }\n\n function deprecatedCountryCodeToCurrentCountryCode(countryCode) {\n if (countryCode === 'air') { // Armenia\n return 'ai ';\n }\n if (countryCode === 'ajr') { // Azerbaidzan\n return 'aj ';\n }\n // Australia\n if (['aca', 'qua', 'tma', 'vra', 'wea', 'xga', 'xna', 'xoa', 'xra'].includes(countryCode)) {\n return 'at ';\n }\n\n // Canada\n if (['abc', 'bcc', 'cn ', 'mbc', 'nfc', 'nkc', 'nsc', 'ntc', 'nuc', 'onc', 'pic', 'quc', 'snc', 'ykc'].includes(countryCode)) {\n return 'xxc';\n }\n // Great Britain:\n if (['enk', 'nik', 'stk', 'uik', 'uk ', 'wlk'].includes(countryCode)) {\n return 'xxk';\n }\n // United States:\n if (['aku', 'alu', 'aru', 'azu', 'cau', 'cou', 'ctu', 'dcu', 'deu', 'flu', 'gau', 'hiu', 'iau', 'idu', 'ilu', 'inu', 'kgr', 'ksu', 'kyu', 'lau', 'mau', 'mdu', 'meu', 'miu', 'mnu', 'mou', 'msu', 'mtu', 'nbu', 'ncu', 'nhu', 'nju', 'nmu', 'nvu', 'nyu', 'ohu', 'oku', 'oru', 'pau', 'riu', 'scu', 'sdu', 'tnu', 'txu', 'us ', 'utu', 'vau', 'vtu', 'wau', 'wiu', 'wvu', 'wyu'].includes(countryCode)) {\n return 'xxu';\n }\n return countryCode;\n }\n\n}\n"],
5
- "mappings": "AAUA,0BAA2B;AAEzB,SAAO;AAAA,IACL,aAAa;AAAA,IACb;AAAA,IAAU;AAAA,EACZ;AAEA,WAAS,IAAI,QAAQ;AAEnB,UAAM,MAAM,EAAC,SAAS,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,KAAI;AAE9C,UAAM,CAAC,QAAQ,IAAI,OAAO,IAAI,KAAK;AACnC,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAEA,mBAAe,QAAQ;AAEvB,WAAO;AAAA,EACT;AAEA,WAAS,SAAS,QAAQ;AACxB,UAAM,MAAM,EAAC,SAAS,CAAC,GAAG,OAAO,KAAI;AAErC,UAAM,CAAC,QAAQ,IAAI,OAAO,IAAI,KAAK;AAEnC,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAEA,UAAM,sBAAsB,2BAA2B,QAAQ;AAC/D,UAAM,sBAAsB,0CAA0C,mBAAmB;AACzF,QAAI,wBAAwB,qBAAqB;AAC/C,aAAO;AAAA,IACT;AAEA,QAAI,QAAQ,KAAK,sBAAsB,mBAAmB,SAAS,mBAAmB,GAAG;AAEzF,QAAI,QAAQ;AACZ,WAAO;AAAA,EACT;AAEA,WAAS,eAAe,UAAU;AAChC,UAAM,sBAAsB,2BAA2B,QAAQ;AAC/D,UAAM,sBAAsB,0CAA0C,mBAAmB;AACzF,QAAI,wBAAwB,uBAAuB,oBAAoB,WAAW,GAAG;AACnF,eAAS,QAAQ,GAAG,SAAS,MAAM,UAAU,GAAG,EAAE,CAAC,GAAG,mBAAmB,GAAG,SAAS,MAAM,UAAU,EAAE,CAAC;AACxG;AAAA,IACF;AAAA,EACF;AAEA,WAAS,2BAA2B,OAAO;AACzC,WAAO,MAAM,MAAM,UAAU,IAAI,EAAE;AAAA,EACrC;AAEA,WAAS,0CAA0C,aAAa;AAC9D,QAAI,gBAAgB,OAAO;AACzB,aAAO;AAAA,IACT;AACA,QAAI,gBAAgB,OAAO;AACzB,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,EAAE,SAAS,WAAW,GAAG;AACzF,aAAO;AAAA,IACT;AAGA,QAAI,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,EAAE,SAAS,WAAW,GAAG;AAC5H,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,EAAE,SAAS,WAAW,GAAG;AACpE,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,EAAE,SAAS,WAAW,GAAG;AACtY,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEF;",
4
+ "sourcesContent": ["// Fix country codes in 008/15-17\n//\n// This is proto. Extend later...\n//\n// Author(s): Nicholas Volk\n\nimport createDebugLogger from 'debug';\nimport {nvdebug} from './utils.js';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:fix-country-codes');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n\nexport default function () {\n\n return {\n description: 'Fix deprecated country codes',\n validate, fix\n };\n\n function fix(record) {\n nvdebug(`FIX ME:`, debugDev);\n const res = {message: [], fix: [], valid: true};\n\n const [field008] = record.get('008');\n if (!field008) {\n return res;\n }\n\n fixCountryCode(field008);\n\n return res;\n }\n\n function validate(record) {\n const res = {message: [], valid: true};\n\n const [field008] = record.get('008');\n\n if (!field008) {\n return res;\n }\n\n const originalCountryCode = getCountryCodeFromField008(field008);\n const modifiedCountryCode = deprecatedCountryCodeToCurrentCountryCode(originalCountryCode);\n if (originalCountryCode === modifiedCountryCode) {\n return res;\n }\n\n res.message.push(`Modify 008/15-17: '${originalCountryCode}' => '${modifiedCountryCode}'`);\n\n res.valid = false;\n return res;\n }\n\n function fixCountryCode(field008) {\n const originalCountryCode = getCountryCodeFromField008(field008);\n const modifiedCountryCode = deprecatedCountryCodeToCurrentCountryCode(originalCountryCode);\n if (originalCountryCode !== modifiedCountryCode && modifiedCountryCode.length === 3) {\n field008.value = `${field008.value.substring(0, 15)}${modifiedCountryCode}${field008.value.substring(18)}`;\n return;\n }\n }\n\n function getCountryCodeFromField008(field) {\n return field.value.substring(15, 18); // return 008/15-17\n }\n\n function deprecatedCountryCodeToCurrentCountryCode(countryCode) {\n if (countryCode === 'air') { // Armenia\n return 'ai ';\n }\n if (countryCode === 'ajr') { // Azerbaidzan\n return 'aj ';\n }\n // Australia\n if (['aca', 'qua', 'tma', 'vra', 'wea', 'xga', 'xna', 'xoa', 'xra'].includes(countryCode)) {\n return 'at ';\n }\n\n // Canada\n if (['abc', 'bcc', 'cn ', 'mbc', 'nfc', 'nkc', 'nsc', 'ntc', 'nuc', 'onc', 'pic', 'quc', 'snc', 'ykc'].includes(countryCode)) {\n return 'xxc';\n }\n // Great Britain:\n if (['enk', 'nik', 'stk', 'uik', 'uk ', 'wlk'].includes(countryCode)) {\n return 'xxk';\n }\n // United States:\n if (['aku', 'alu', 'aru', 'azu', 'cau', 'cou', 'ctu', 'dcu', 'deu', 'flu', 'gau', 'hiu', 'iau', 'idu', 'ilu', 'inu', 'kgr', 'ksu', 'kyu', 'lau', 'mau', 'mdu', 'meu', 'miu', 'mnu', 'mou', 'msu', 'mtu', 'nbu', 'ncu', 'nhu', 'nju', 'nmu', 'nvu', 'nyu', 'ohu', 'oku', 'oru', 'pau', 'riu', 'scu', 'sdu', 'tnu', 'txu', 'us ', 'utu', 'vau', 'vtu', 'wau', 'wiu', 'wvu', 'wyu'].includes(countryCode)) {\n return 'xxu';\n }\n return countryCode;\n }\n\n}\n"],
5
+ "mappings": "AAMA,OAAO,uBAAuB;AAC9B,SAAQ,eAAc;AAEtB,MAAM,QAAQ,kBAAkB,4DAA4D;AAE5F,MAAM,WAAW,MAAM,OAAO,KAAK;AAGnC,0BAA2B;AAEzB,SAAO;AAAA,IACL,aAAa;AAAA,IACb;AAAA,IAAU;AAAA,EACZ;AAEA,WAAS,IAAI,QAAQ;AACnB,YAAQ,WAAW,QAAQ;AAC3B,UAAM,MAAM,EAAC,SAAS,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,KAAI;AAE9C,UAAM,CAAC,QAAQ,IAAI,OAAO,IAAI,KAAK;AACnC,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAEA,mBAAe,QAAQ;AAEvB,WAAO;AAAA,EACT;AAEA,WAAS,SAAS,QAAQ;AACxB,UAAM,MAAM,EAAC,SAAS,CAAC,GAAG,OAAO,KAAI;AAErC,UAAM,CAAC,QAAQ,IAAI,OAAO,IAAI,KAAK;AAEnC,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAEA,UAAM,sBAAsB,2BAA2B,QAAQ;AAC/D,UAAM,sBAAsB,0CAA0C,mBAAmB;AACzF,QAAI,wBAAwB,qBAAqB;AAC/C,aAAO;AAAA,IACT;AAEA,QAAI,QAAQ,KAAK,sBAAsB,mBAAmB,SAAS,mBAAmB,GAAG;AAEzF,QAAI,QAAQ;AACZ,WAAO;AAAA,EACT;AAEA,WAAS,eAAe,UAAU;AAChC,UAAM,sBAAsB,2BAA2B,QAAQ;AAC/D,UAAM,sBAAsB,0CAA0C,mBAAmB;AACzF,QAAI,wBAAwB,uBAAuB,oBAAoB,WAAW,GAAG;AACnF,eAAS,QAAQ,GAAG,SAAS,MAAM,UAAU,GAAG,EAAE,CAAC,GAAG,mBAAmB,GAAG,SAAS,MAAM,UAAU,EAAE,CAAC;AACxG;AAAA,IACF;AAAA,EACF;AAEA,WAAS,2BAA2B,OAAO;AACzC,WAAO,MAAM,MAAM,UAAU,IAAI,EAAE;AAAA,EACrC;AAEA,WAAS,0CAA0C,aAAa;AAC9D,QAAI,gBAAgB,OAAO;AACzB,aAAO;AAAA,IACT;AACA,QAAI,gBAAgB,OAAO;AACzB,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,EAAE,SAAS,WAAW,GAAG;AACzF,aAAO;AAAA,IACT;AAGA,QAAI,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,EAAE,SAAS,WAAW,GAAG;AAC5H,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,EAAE,SAAS,WAAW,GAAG;AACpE,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,EAAE,SAAS,WAAW,GAAG;AACtY,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEF;",
6
6
  "names": []
7
7
  }
@@ -3,7 +3,6 @@ import { MarcRecord } from "@natlibfi/marc-record";
3
3
  import validatorFactory from "./fix-country-codes.js";
4
4
  import { READERS } from "@natlibfi/fixura";
5
5
  import generateTests from "@natlibfi/fixugen";
6
- import createDebugLogger from "debug";
7
6
  generateTests({
8
7
  callback,
9
8
  path: [import.meta.dirname, "..", "test-fixtures", "fix-country-codes"],
@@ -18,18 +17,13 @@ generateTests({
18
17
  }
19
18
  }
20
19
  });
21
- const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda/fix-country-codes:test");
22
20
  async function testValidatorFactory() {
23
21
  const validator = await validatorFactory();
24
22
  assert.equal(typeof validator, "object");
25
23
  assert.equal(typeof validator.description, "string");
26
24
  assert.equal(typeof validator.validate, "function");
27
25
  }
28
- async function callback({ getFixture, enabled = true, fix = false }) {
29
- if (enabled === false) {
30
- debug("TEST SKIPPED!");
31
- return;
32
- }
26
+ async function callback({ getFixture, fix = false }) {
33
27
  const validator = await validatorFactory();
34
28
  const record = new MarcRecord(getFixture("record.json"));
35
29
  const expectedResult = getFixture("expectedResult.json");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/fix-country-codes.test.js"],
4
- "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './fix-country-codes.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', 'fix-country-codes'],\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/fix-country-codes:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n}\n\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
5
- "mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAC1B,OAAO,uBAAuB;AAE9B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,mBAAmB;AAAA,EACtE,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,iEAAiE;AAEjG,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,SAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AACpD;AAEA,eAAe,SAAS,EAAC,YAAY,UAAU,MAAM,MAAM,MAAK,GAAG;AACjE,MAAI,YAAY,OAAO;AACrB,UAAM,eAAe;AACrB;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,iBAAiB;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,QAAM,iBAAiB,WAAW,qBAAqB;AAGvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,cAAc;AACzC;",
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './fix-country-codes.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n//import createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'fix-country-codes'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/fix-country-codes: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, fix = false}) {\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
5
+ "mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAG1B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,mBAAmB;AAAA,EACtE,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;AAGD,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,MAAM,MAAK,GAAG;AACjD,QAAM,YAAY,MAAM,iBAAiB;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,QAAM,iBAAiB,WAAW,qBAAqB;AAGvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,cAAc;AACzC;",
6
6
  "names": []
7
7
  }
@@ -1,9 +1,13 @@
1
1
  import clone from "clone";
2
- import { fieldToString } from "./utils.js";
2
+ import { fieldToString, nvdebug } from "./utils.js";
3
+ import createDebugLogger from "debug";
4
+ const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda:fix-language-codes");
5
+ const debugDev = debug.extend("dev");
3
6
  const description = "Fix language codes";
4
7
  export default function() {
5
8
  return { description, validate, fix };
6
9
  function fix(record) {
10
+ nvdebug(`FIX ME`, debugDev);
7
11
  const res = { message: [], fix: [], valid: true };
8
12
  const [field008] = record.get("008");
9
13
  if (!field008) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/fix-language-codes.js"],
4
- "sourcesContent": ["import clone from 'clone';\nimport {fieldToString} from './utils.js';\n// Fix language codes in 008/35-37 and 041 (does not sync them)\n//\n// Author(s): Nicholas Volk\n\n//import createDebugLogger from 'debug';\n//import {fieldToString, nvdebug} from './utils.js';\n\nconst description = 'Fix language codes';\n\nexport default function () {\n\n return {description, validate, fix};\n\n function fix(record) {\n //nvdebug(`FIX ME`);\n const res = {message: [], fix: [], valid: true};\n\n const [field008] = record.get('008');\n if (!field008) {\n return res;\n }\n\n fixLanguageField008(field008);\n\n const f041 = record.get('041');\n f041.forEach(f => fixField041(f));\n\n return res;\n }\n\n\n function validate(record) {\n const res = {message: [], valid: true};\n\n validateField008(record, res);\n\n const f041 = record.get('041');\n\n f041.forEach(f => validateField041(f, res));\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function validateField008(record, res) {\n const [field008] = record.get('008');\n\n if (!field008) {\n return;\n }\n\n const originalLanguage = getLanguageFromField008(field008);\n const modifiedLanguage = deprecatedLanguageToCurrentLanguage(originalLanguage);\n if (originalLanguage === modifiedLanguage) {\n return;\n }\n\n res.message.push(`Modify 008/35-37: '${originalLanguage}' => '${modifiedLanguage}'`);\n res.valid = false;\n }\n\n\n function isRelevantField041SubfieldCode(subfield) {\n return 'abdefghijkmnpqrt'.includes(subfield.code);\n }\n\n\n function validateField041(field, res) {\n\n const clonedField = clone(field);\n fixField041(clonedField);\n\n const originalString = fieldToString(field);\n const modifiedString = fieldToString(clonedField);\n\n if (originalString === modifiedString) {\n return;\n }\n const msg = `${originalString} => ${modifiedString}`;\n res.message.push(msg);\n\n }\n\n\n function fixLanguageField008(field008) {\n const originalLanguage = getLanguageFromField008(field008);\n const modifiedLanguage = deprecatedLanguageToCurrentLanguage(originalLanguage);\n if (originalLanguage !== modifiedLanguage && modifiedLanguage.length === 3) {\n field008.value = `${field008.value.substring(0, 35)}${modifiedLanguage}${field008.value.substring(38)}`;\n return;\n }\n }\n\n function fixField041(field) {\n if (field.subfields.some(sf => sf.code === '2')) {\n return;\n }\n\n field.subfields.forEach(sf => fixField041Subfield(sf));\n\n function fixField041Subfield(subfield) {\n if (!isRelevantField041SubfieldCode(subfield)) {\n return;\n }\n subfield.value = deprecatedLanguageToCurrentLanguage(subfield.value);\n }\n }\n\n function getLanguageFromField008(field) {\n return field.value.substring(35, 38); // return 008/35-37\n }\n\n function deprecatedLanguageToCurrentLanguage(language) {\n if (language === 'nno' || language === 'nob') { // Nynorsk ja bokm\u00E5l\n return 'nor'; // Norwegian\n }\n return language;\n }\n\n}\n"],
5
- "mappings": "AAAA,OAAO,WAAW;AAClB,SAAQ,qBAAoB;AAQ5B,MAAM,cAAc;AAEpB,0BAA2B;AAEzB,SAAO,EAAC,aAAa,UAAU,IAAG;AAElC,WAAS,IAAI,QAAQ;AAEnB,UAAM,MAAM,EAAC,SAAS,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,KAAI;AAE9C,UAAM,CAAC,QAAQ,IAAI,OAAO,IAAI,KAAK;AACnC,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAEA,wBAAoB,QAAQ;AAE5B,UAAM,OAAO,OAAO,IAAI,KAAK;AAC7B,SAAK,QAAQ,OAAK,YAAY,CAAC,CAAC;AAEhC,WAAO;AAAA,EACT;AAGA,WAAS,SAAS,QAAQ;AACxB,UAAM,MAAM,EAAC,SAAS,CAAC,GAAG,OAAO,KAAI;AAErC,qBAAiB,QAAQ,GAAG;AAE5B,UAAM,OAAO,OAAO,IAAI,KAAK;AAE7B,SAAK,QAAQ,OAAK,iBAAiB,GAAG,GAAG,CAAC;AAE1C,QAAI,QAAQ,EAAE,IAAI,QAAQ,UAAU;AACpC,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB,QAAQ,KAAK;AACrC,UAAM,CAAC,QAAQ,IAAI,OAAO,IAAI,KAAK;AAEnC,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AAEA,UAAM,mBAAmB,wBAAwB,QAAQ;AACzD,UAAM,mBAAmB,oCAAoC,gBAAgB;AAC7E,QAAI,qBAAqB,kBAAkB;AACzC;AAAA,IACF;AAEA,QAAI,QAAQ,KAAK,sBAAsB,gBAAgB,SAAS,gBAAgB,GAAG;AACnF,QAAI,QAAQ;AAAA,EACd;AAGA,WAAS,+BAA+B,UAAU;AAChD,WAAO,mBAAmB,SAAS,SAAS,IAAI;AAAA,EAClD;AAGA,WAAS,iBAAiB,OAAO,KAAK;AAEpC,UAAM,cAAc,MAAM,KAAK;AAC/B,gBAAY,WAAW;AAEvB,UAAM,iBAAiB,cAAc,KAAK;AAC1C,UAAM,iBAAiB,cAAc,WAAW;AAEhD,QAAI,mBAAmB,gBAAgB;AACrC;AAAA,IACF;AACA,UAAM,MAAM,GAAG,cAAc,OAAO,cAAc;AAClD,QAAI,QAAQ,KAAK,GAAG;AAAA,EAEtB;AAGA,WAAS,oBAAoB,UAAU;AACrC,UAAM,mBAAmB,wBAAwB,QAAQ;AACzD,UAAM,mBAAmB,oCAAoC,gBAAgB;AAC7E,QAAI,qBAAqB,oBAAoB,iBAAiB,WAAW,GAAG;AAC1E,eAAS,QAAQ,GAAG,SAAS,MAAM,UAAU,GAAG,EAAE,CAAC,GAAG,gBAAgB,GAAG,SAAS,MAAM,UAAU,EAAE,CAAC;AACrG;AAAA,IACF;AAAA,EACF;AAEA,WAAS,YAAY,OAAO;AAC1B,QAAI,MAAM,UAAU,KAAK,QAAM,GAAG,SAAS,GAAG,GAAG;AAC/C;AAAA,IACF;AAEA,UAAM,UAAU,QAAQ,QAAM,oBAAoB,EAAE,CAAC;AAErD,aAAS,oBAAoB,UAAU;AACrC,UAAI,CAAC,+BAA+B,QAAQ,GAAG;AAC7C;AAAA,MACF;AACA,eAAS,QAAQ,oCAAoC,SAAS,KAAK;AAAA,IACrE;AAAA,EACF;AAEA,WAAS,wBAAwB,OAAO;AACtC,WAAO,MAAM,MAAM,UAAU,IAAI,EAAE;AAAA,EACrC;AAEA,WAAS,oCAAoC,UAAU;AACrD,QAAI,aAAa,SAAS,aAAa,OAAO;AAC5C,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEF;",
4
+ "sourcesContent": ["import clone from 'clone';\nimport {fieldToString, nvdebug} from './utils.js';\nimport createDebugLogger from 'debug';\n\n// Fix language codes in 008/35-37 and 041 (does not sync them)\n//\n// Author(s): Nicholas Volk\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:fix-language-codes');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst description = 'Fix language codes';\n\n// eslint-disable-next-line max-lines-per-function\nexport default function () {\n\n return {description, validate, fix};\n\n function fix(record) {\n nvdebug(`FIX ME`, debugDev);\n const res = {message: [], fix: [], valid: true};\n\n const [field008] = record.get('008');\n if (!field008) {\n return res;\n }\n\n fixLanguageField008(field008);\n\n const f041 = record.get('041');\n f041.forEach(f => fixField041(f));\n\n return res;\n }\n\n\n function validate(record) {\n const res = {message: [], valid: true};\n\n validateField008(record, res);\n\n const f041 = record.get('041');\n\n f041.forEach(f => validateField041(f, res));\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n\n function validateField008(record, res) {\n const [field008] = record.get('008');\n\n if (!field008) {\n return;\n }\n\n const originalLanguage = getLanguageFromField008(field008);\n const modifiedLanguage = deprecatedLanguageToCurrentLanguage(originalLanguage);\n if (originalLanguage === modifiedLanguage) {\n return;\n }\n\n res.message.push(`Modify 008/35-37: '${originalLanguage}' => '${modifiedLanguage}'`);\n res.valid = false;\n }\n\n\n function isRelevantField041SubfieldCode(subfield) {\n return 'abdefghijkmnpqrt'.includes(subfield.code);\n }\n\n\n function validateField041(field, res) {\n\n const clonedField = clone(field);\n fixField041(clonedField);\n\n const originalString = fieldToString(field);\n const modifiedString = fieldToString(clonedField);\n\n if (originalString === modifiedString) {\n return;\n }\n const msg = `${originalString} => ${modifiedString}`;\n res.message.push(msg);\n\n }\n\n\n function fixLanguageField008(field008) {\n const originalLanguage = getLanguageFromField008(field008);\n const modifiedLanguage = deprecatedLanguageToCurrentLanguage(originalLanguage);\n if (originalLanguage !== modifiedLanguage && modifiedLanguage.length === 3) {\n field008.value = `${field008.value.substring(0, 35)}${modifiedLanguage}${field008.value.substring(38)}`;\n return;\n }\n }\n\n function fixField041(field) {\n if (field.subfields.some(sf => sf.code === '2')) {\n return;\n }\n\n field.subfields.forEach(sf => fixField041Subfield(sf));\n\n function fixField041Subfield(subfield) {\n if (!isRelevantField041SubfieldCode(subfield)) {\n return;\n }\n subfield.value = deprecatedLanguageToCurrentLanguage(subfield.value);\n }\n }\n\n function getLanguageFromField008(field) {\n return field.value.substring(35, 38); // return 008/35-37\n }\n\n function deprecatedLanguageToCurrentLanguage(language) {\n if (language === 'nno' || language === 'nob') { // Nynorsk ja bokm\u00E5l\n return 'nor'; // Norwegian\n }\n return language;\n }\n\n}\n"],
5
+ "mappings": "AAAA,OAAO,WAAW;AAClB,SAAQ,eAAe,eAAc;AACrC,OAAO,uBAAuB;AAM9B,MAAM,QAAQ,kBAAkB,6DAA6D;AAE7F,MAAM,WAAW,MAAM,OAAO,KAAK;AAEnC,MAAM,cAAc;AAGpB,0BAA2B;AAEzB,SAAO,EAAC,aAAa,UAAU,IAAG;AAElC,WAAS,IAAI,QAAQ;AACnB,YAAQ,UAAU,QAAQ;AAC1B,UAAM,MAAM,EAAC,SAAS,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,KAAI;AAE9C,UAAM,CAAC,QAAQ,IAAI,OAAO,IAAI,KAAK;AACnC,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAEA,wBAAoB,QAAQ;AAE5B,UAAM,OAAO,OAAO,IAAI,KAAK;AAC7B,SAAK,QAAQ,OAAK,YAAY,CAAC,CAAC;AAEhC,WAAO;AAAA,EACT;AAGA,WAAS,SAAS,QAAQ;AACxB,UAAM,MAAM,EAAC,SAAS,CAAC,GAAG,OAAO,KAAI;AAErC,qBAAiB,QAAQ,GAAG;AAE5B,UAAM,OAAO,OAAO,IAAI,KAAK;AAE7B,SAAK,QAAQ,OAAK,iBAAiB,GAAG,GAAG,CAAC;AAE1C,QAAI,QAAQ,EAAE,IAAI,QAAQ,UAAU;AACpC,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB,QAAQ,KAAK;AACrC,UAAM,CAAC,QAAQ,IAAI,OAAO,IAAI,KAAK;AAEnC,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AAEA,UAAM,mBAAmB,wBAAwB,QAAQ;AACzD,UAAM,mBAAmB,oCAAoC,gBAAgB;AAC7E,QAAI,qBAAqB,kBAAkB;AACzC;AAAA,IACF;AAEA,QAAI,QAAQ,KAAK,sBAAsB,gBAAgB,SAAS,gBAAgB,GAAG;AACnF,QAAI,QAAQ;AAAA,EACd;AAGA,WAAS,+BAA+B,UAAU;AAChD,WAAO,mBAAmB,SAAS,SAAS,IAAI;AAAA,EAClD;AAGA,WAAS,iBAAiB,OAAO,KAAK;AAEpC,UAAM,cAAc,MAAM,KAAK;AAC/B,gBAAY,WAAW;AAEvB,UAAM,iBAAiB,cAAc,KAAK;AAC1C,UAAM,iBAAiB,cAAc,WAAW;AAEhD,QAAI,mBAAmB,gBAAgB;AACrC;AAAA,IACF;AACA,UAAM,MAAM,GAAG,cAAc,OAAO,cAAc;AAClD,QAAI,QAAQ,KAAK,GAAG;AAAA,EAEtB;AAGA,WAAS,oBAAoB,UAAU;AACrC,UAAM,mBAAmB,wBAAwB,QAAQ;AACzD,UAAM,mBAAmB,oCAAoC,gBAAgB;AAC7E,QAAI,qBAAqB,oBAAoB,iBAAiB,WAAW,GAAG;AAC1E,eAAS,QAAQ,GAAG,SAAS,MAAM,UAAU,GAAG,EAAE,CAAC,GAAG,gBAAgB,GAAG,SAAS,MAAM,UAAU,EAAE,CAAC;AACrG;AAAA,IACF;AAAA,EACF;AAEA,WAAS,YAAY,OAAO;AAC1B,QAAI,MAAM,UAAU,KAAK,QAAM,GAAG,SAAS,GAAG,GAAG;AAC/C;AAAA,IACF;AAEA,UAAM,UAAU,QAAQ,QAAM,oBAAoB,EAAE,CAAC;AAErD,aAAS,oBAAoB,UAAU;AACrC,UAAI,CAAC,+BAA+B,QAAQ,GAAG;AAC7C;AAAA,MACF;AACA,eAAS,QAAQ,oCAAoC,SAAS,KAAK;AAAA,IACrE;AAAA,EACF;AAEA,WAAS,wBAAwB,OAAO;AACtC,WAAO,MAAM,MAAM,UAAU,IAAI,EAAE;AAAA,EACrC;AAEA,WAAS,oCAAoC,UAAU;AACrD,QAAI,aAAa,SAAS,aAAa,OAAO;AAC5C,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEF;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,109 @@
1
+ import createDebugLogger from "debug";
2
+ import clone from "clone";
3
+ import { fieldToString, nvdebug } from "./utils.js";
4
+ const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda:fix-sami-041");
5
+ const debugDev = debug.extend("dev");
6
+ export default function() {
7
+ const samiLanguages = ["sma", "sme", "smj", "smn", "sms"];
8
+ const subfieldCodesUsingSmi = ["a", "d"];
9
+ return {
10
+ description: "Add corresponding 'smi' subfield before a specific sami language subfields and update 008/35-37, if needed",
11
+ validate,
12
+ fix
13
+ };
14
+ function getRelevantSubfieldCodes(record) {
15
+ if (record && record.leader && record.leader[6]) {
16
+ nvdebug(` LDR/06 is '${record.leader[6]}'`, debugDev);
17
+ if (["i", "j"].includes(record.leader[6])) {
18
+ return ["d"];
19
+ }
20
+ return ["a"];
21
+ }
22
+ return ["a", "d"];
23
+ }
24
+ function fix(record, validateMode = false) {
25
+ nvdebug(`Start ${validateMode ? "validator" : "fixer"}`, debugDev);
26
+ const relevantSubfieldCodes = getRelevantSubfieldCodes(record);
27
+ nvdebug(` Relevant subfield codes are '${relevantSubfieldCodes.join("', '")}'`, debugDev);
28
+ const relevantFields = record.fields.filter((f) => isRelevantField(f, relevantSubfieldCodes)).map((f) => validateMode ? clone(f) : f);
29
+ if (relevantFields.length === 0) {
30
+ nvdebug(` No relevant f041 fields found`, debugDev);
31
+ if (validateMode) {
32
+ return { message: [], valid: true };
33
+ }
34
+ return { message: [], fix: [], valid: true };
35
+ }
36
+ const relevantFieldsAsStrings = relevantFields.map((f) => fieldToString(f));
37
+ relevantFields.forEach((f) => processField(f, relevantSubfieldCodes));
38
+ const modFieldsAsStrings = relevantFields.map((f) => fieldToString(f));
39
+ const report = [...updateAndReport008(), ...createReport(relevantFieldsAsStrings, modFieldsAsStrings)];
40
+ if (validateMode) {
41
+ return { "message": report, "valid": false };
42
+ }
43
+ return { message: [], fix: report, valid: true };
44
+ function updateAndReport008() {
45
+ const [f008] = record.get("008").map((f) => validateMode ? clone(f) : f);
46
+ if (!f008) {
47
+ nvdebug(" WARNING: no f008 found"), debugDev;
48
+ return [];
49
+ }
50
+ const currLang = f008.value.substr(35, 3);
51
+ if (!samiLanguages.includes(currLang)) {
52
+ nvdebug(` Existing 008/35-37 '${currLang}' is not a sami language. No need to update 008/35-37`, debugDev);
53
+ return [];
54
+ }
55
+ const origValue = f008.value;
56
+ const firstRelevantSubfield = relevantFields[0].subfields.find((sf) => relevantSubfieldCodes.includes(sf.code));
57
+ if (firstRelevantSubfield.value !== "smi") {
58
+ nvdebug(` First relevant subfield is '$${firstRelevantSubfield.code} ${firstRelevantSubfield.value}'. No need to update 008/35-37`, debugDev);
59
+ return [];
60
+ }
61
+ f008.value = `${f008.value.substr(0, 35)}smi${f008.value.substr(38)}`;
62
+ nvdebug(` Update 008/35-37: '${currLang}' => 'smi'`, debugDev);
63
+ return createReport([origValue], [f008.value]);
64
+ }
65
+ function processField(f) {
66
+ f.subfields = processSubfields(f.subfields, []);
67
+ }
68
+ function processSubfields(incomingSubfields, outgoingSubfields = []) {
69
+ const [currSubfield, ...otherSubfields] = incomingSubfields;
70
+ if (!currSubfield) {
71
+ return outgoingSubfields;
72
+ }
73
+ if (!isRelevantSamiSubfield(currSubfield, [...outgoingSubfields, ...otherSubfields])) {
74
+ return processSubfields(otherSubfields, [...outgoingSubfields, currSubfield]);
75
+ }
76
+ const smiSubfield = {
77
+ code: currSubfield.code,
78
+ value: "smi"
79
+ };
80
+ nvdebug(` f041: Add '$${currSubfield.code} smi' before '${currSubfield.value}'`, debugDev);
81
+ return processSubfields(otherSubfields, [...outgoingSubfields, smiSubfield, currSubfield]);
82
+ }
83
+ function isRelevantField(f) {
84
+ if (f.tag !== "041" || !f.subfields || f.subfields.some((sf) => sf.code === "2")) {
85
+ return false;
86
+ }
87
+ return f.subfields.some((sf) => isRelevantSamiSubfield(sf, f.subfields));
88
+ }
89
+ function isRelevantSamiSubfield(sf, otherSubfields) {
90
+ if (!subfieldCodesUsingSmi.includes(sf.code) || !samiLanguages.includes(sf.value)) {
91
+ return false;
92
+ }
93
+ if (otherSubfields.some((sf2) => sf2.code === sf.code && sf2.value === "smi")) {
94
+ return false;
95
+ }
96
+ return true;
97
+ }
98
+ }
99
+ function createReport(origArray, modArray) {
100
+ return origArray.map((entry, index) => createEntry(entry, index));
101
+ function createEntry(item, index) {
102
+ return `'${item}' => '${modArray[index]}'`;
103
+ }
104
+ }
105
+ function validate(record) {
106
+ return fix(record, true);
107
+ }
108
+ }
109
+ //# sourceMappingURL=fix-sami-041.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/fix-sami-041.js"],
4
+ "sourcesContent": ["// Author(s): Nicholas Volk\n\nimport createDebugLogger from 'debug';\nimport clone from 'clone';\n\nimport {fieldToString, nvdebug} from './utils.js';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:fix-sami-041');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\n\n// eslint-disable-next-line max-lines-per-function\nexport default function () {\n /* 'sma': etel\u00E4saame, 'sme': pohjoissaame, 'smj': luulajansaame, 'smn': inarinsaame, 'sms': koltansaame */\n const samiLanguages = ['sma', 'sme', 'smj', 'smn', 'sms'];\n const subfieldCodesUsingSmi = ['a', 'd'];\n\n return {\n description: 'Add corresponding \\'smi\\' subfield before a specific sami language subfields and update 008/35-37, if needed',\n validate, fix\n };\n\n function getRelevantSubfieldCodes(record) { // Maybe this should be an exportable utility function...\n if (record && record.leader && record.leader[6]) {\n nvdebug(` LDR/06 is '${record.leader[6]}'`, debugDev);\n // We should test this properly...\n if (['i', 'j'].includes(record.leader[6])) { // Check type of record: sound recordings use 'd'\n return ['d'];\n }\n return ['a'];\n }\n\n return ['a', 'd']; // B\u00E5de-och\n }\n\n\n function fix(record, validateMode = false) {\n nvdebug(`Start ${validateMode ? 'validator' : 'fixer'}`, debugDev);\n const relevantSubfieldCodes = getRelevantSubfieldCodes(record);\n nvdebug(` Relevant subfield codes are '${relevantSubfieldCodes.join(\"', '\")}'`, debugDev);\n const relevantFields = record.fields.filter(f => isRelevantField(f, relevantSubfieldCodes)).map(f => validateMode ? clone(f) : f); // NV! relevant fields are cloned in validation mode!\n // Nothing to do:\n if (relevantFields.length === 0) {\n nvdebug(` No relevant f041 fields found`, debugDev);\n if (validateMode) {\n return {message: [], valid: true};\n }\n return {message: [], fix: [], valid: true};\n }\n\n const relevantFieldsAsStrings = relevantFields.map(f => fieldToString(f)); // get original values\n\n relevantFields.forEach(f => processField(f, relevantSubfieldCodes));\n const modFieldsAsStrings = relevantFields.map(f => fieldToString(f));\n const report = [...updateAndReport008(), ...createReport(relevantFieldsAsStrings, modFieldsAsStrings)];\n\n if (validateMode) {\n return {'message': report, 'valid': false};\n }\n\n return {message: [], fix: report, valid: true};\n\n function updateAndReport008() { // Update 008/35-37 if necessary + report it\n const [f008] = record.get('008').map(f => validateMode ? clone(f) : f);\n\n if (!f008) {\n nvdebug(' WARNING: no f008 found'), debugDev;\n return [];\n }\n const currLang = f008.value.substr(35, 3);\n if (!samiLanguages.includes(currLang)) { // NB! If original 008/35-37 was not a sami language, we don't change anything!\n nvdebug(` Existing 008/35-37 '${currLang}' is not a sami language. No need to update 008/35-37`, debugDev);\n return [];\n }\n const origValue = f008.value;\n const firstRelevantSubfield = relevantFields[0].subfields.find(sf => relevantSubfieldCodes.includes(sf.code));\n if (firstRelevantSubfield.value !== 'smi') {\n nvdebug(` First relevant subfield is '\\$${firstRelevantSubfield.code} ${firstRelevantSubfield.value}'. No need to update 008/35-37`, debugDev);\n return [];\n }\n f008.value = `${f008.value.substr(0, 35)}smi${f008.value.substr(38)}`;\n nvdebug(` Update 008/35-37: '${currLang}' => 'smi'`, debugDev);\n return createReport([origValue], [f008.value]);\n }\n\n function processField(f) {\n f.subfields = processSubfields(f.subfields, []);\n }\n\n function processSubfields(incomingSubfields, outgoingSubfields = []) {\n const [currSubfield, ...otherSubfields] = incomingSubfields;\n if (!currSubfield) {\n return outgoingSubfields;\n }\n if (!isRelevantSamiSubfield(currSubfield, [...outgoingSubfields, ...otherSubfields])) {\n return processSubfields(otherSubfields, [...outgoingSubfields, currSubfield]);\n }\n\n const smiSubfield = {\n code: currSubfield.code,\n value: 'smi'\n };\n nvdebug(` f041: Add '\\$${currSubfield.code} smi' before '${currSubfield.value}'`, debugDev);\n\n return processSubfields(otherSubfields, [...outgoingSubfields, smiSubfield, currSubfield]);\n }\n\n function isRelevantField(f) {\n if (f.tag !== '041' || !f.subfields || f.subfields.some(sf => sf.code === '2')) {\n return false;\n }\n return f.subfields.some(sf => isRelevantSamiSubfield(sf, f.subfields)); // it's ok to pass sf in f.subfields also\n }\n\n function isRelevantSamiSubfield(sf, otherSubfields) {\n // NB! preceding 'smi' is added to all $a and $d fields, regardless of the LDR/06 value! (However, copying 041$a/d -> 008/35-37 depends on LDR/06)\n if (!subfieldCodesUsingSmi.includes(sf.code) || !samiLanguages.includes(sf.value)) {\n return false;\n }\n if (otherSubfields.some(sf2 => sf2.code === sf.code && sf2.value === 'smi')) { // fail if 'smi' already exists\n return false;\n }\n //debug(` '\\${sf.code} ${sf.value}' requires preceding 'smi'`);\n return true;\n }\n }\n\n function createReport(origArray, modArray) {\n return origArray.map((entry, index) => createEntry(entry, index));\n\n function createEntry(item, index) {\n return `'${item}' => '${modArray[index]}'`;\n }\n }\n\n function validate(record) {\n return fix(record, true);\n }\n\n\n\n\n\n\n}\n\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,40 @@
1
+ import assert from "node:assert/strict";
2
+ import validatorFactory from "./fix-sami-041.js";
3
+ import { MarcRecord } from "@natlibfi/marc-record";
4
+ import { READERS } from "@natlibfi/fixura";
5
+ import generateTests from "@natlibfi/fixugen";
6
+ generateTests({
7
+ callback,
8
+ path: [import.meta.dirname, "..", "test-fixtures", "fix-sami-041"],
9
+ useMetadataFile: true,
10
+ recurse: false,
11
+ fixura: {
12
+ reader: READERS.JSON
13
+ },
14
+ hooks: {
15
+ before: async () => {
16
+ testValidatorFactory();
17
+ }
18
+ }
19
+ });
20
+ async function testValidatorFactory() {
21
+ const validator = await validatorFactory();
22
+ assert.equal(typeof validator, "object");
23
+ assert.equal(typeof validator.description, "string");
24
+ assert.equal(typeof validator.validate, "function");
25
+ }
26
+ async function callback({ getFixture, fix = false }) {
27
+ const validator = await validatorFactory();
28
+ const record = new MarcRecord(getFixture("record.json"));
29
+ const expectedResult = getFixture("expectedResult.json");
30
+ if (!fix) {
31
+ const result = await validator.validate(record);
32
+ assert.deepEqual(result, expectedResult);
33
+ const originalRecord = new MarcRecord(getFixture("record.json"));
34
+ assert.deepEqual(record, originalRecord);
35
+ return;
36
+ }
37
+ await validator.fix(record);
38
+ assert.deepEqual(record, new MarcRecord(expectedResult));
39
+ }
40
+ //# sourceMappingURL=fix-sami-041.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/fix-sami-041.test.js"],
4
+ "sourcesContent": ["import assert from 'node:assert/strict';\n//import createDebugLogger from 'debug';\n\nimport validatorFactory from './fix-sami-041.js';\n\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'fix-sami-041'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/drop-terms: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, fix = false}) {\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n //const expectedResult = new MarcRecord(getFixture('expectedResult.json'));\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n assert.deepEqual(result, expectedResult);\n const originalRecord = new MarcRecord(getFixture('record.json'));\n assert.deepEqual(record, originalRecord); // The record should now change in validation-only\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, new MarcRecord(expectedResult));\n}\n"],
5
+ "mappings": "AAAA,OAAO,YAAY;AAGnB,OAAO,sBAAsB;AAE7B,SAAQ,kBAAiB;AACzB,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAE1B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,cAAc;AAAA,EACjE,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;AAID,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,MAAM,MAAK,GAAG;AACjD,QAAM,YAAY,MAAM,iBAAiB;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,QAAM,iBAAiB,WAAW,qBAAqB;AAIvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC,UAAM,iBAAiB,IAAI,WAAW,WAAW,aAAa,CAAC;AAC/D,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,IAAI,WAAW,cAAc,CAAC;AACzD;",
6
+ "names": []
7
+ }
@@ -43,6 +43,8 @@ const relatorTerms = [
43
43
  { "code": "drt", "eng": "director", "fin": "ohjaaja", "swe": "regiss\xF6r" },
44
44
  { "code": "edt", "eng": "editor", "fin": "toimittaja", "swe": "redakt\xF6r" },
45
45
  { "code": "ill", "eng": "illustrator", "fin": "kuvittaja", "swe": "illustrat\xF6r" },
46
+ { "code": "ive", "eng": "interviewee", "fin": "haastateltava", "swe": "intervjuobjekt" },
47
+ { "code": "ivr", "eng": "interviewer", "fin": "haastattelija", "swe": "intervjuare" },
46
48
  { "code": "lyr", "eng": "lyricist", "fin": "sanoittaja", "swe": "s\xE5ngtext" },
47
49
  { "code": "nrt", "eng": "narrator", "fin": "kertoja", "swe": "ber\xE4ttare" },
48
50
  // berättare/inläsare
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/fixRelatorTerms.js"],
4
- "sourcesContent": ["import clone from 'clone';\nimport {fieldFixPunctuation} from './punctuation2.js';\nimport {fieldToString, getCatalogingLanguage, nvdebug, subfieldToString} from './utils.js';\nimport createDebugLogger from 'debug';\n\n// Currently mainly translates X00$e values, so that we don't have \"$a Name, $e kirjoittaja, $e f\u00F6rfattare.\".\n// Later on we could try and handle $4 stuff here as well.\n\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:fixRelatorterms');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nexport default function () {\n return {\n description: 'Fix $e subfields in field [1678][01]0 and 720',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n const language = getCatalogingLanguage(record);\n\n record.fields.forEach(field => {\n fieldFixRelatorTerms(field, language, language);\n });\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const language = getCatalogingLanguage(record);\n\n record.fields.forEach(field => {\n const clonedField = clone(field);\n // Rather hackily/abnormally use language as both fromLanguage and toLanguage.\n // fromLanguage is used to expand \"esitt.\" => \"esitt\u00E4j\u00E4\".\n // toLanguage is used by translations (fixes \"f\u00F6rfattere\" to \"kirjoittaja\", if 040$b is \"fin\")\n fieldFixRelatorTerms(field, language, language);\n const clonedFieldAsString = fieldToString(clonedField);\n const fieldAsString = fieldToString(field);\n if (fieldAsString !== clonedFieldAsString) {\n res.message.push(`${fieldAsString} => ${clonedFieldAsString}`);\n }\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n}\n\n\n/*\nexport default () => (base, source) => {\n recordTranslateRelatorTerms(base);\n recordTranslateRelatorTerms(source);\n recordHandleRelatorTermAbbreviations(base);\n recordHandleRelatorTermAbbreviations(source);\n const result = {base, source};\n return result;\n};\n*/\n\n\n// Partial source: https://marc21.kansalliskirjasto.fi/funktiot_koodit.htm\n// https://wiki.helsinki.fi/display/MARC21svenska/Funktions-+och+relationskoder+-+alfabetiskt+efter+funktion\n// New, better source: https://id.kb.se/find?q=relator&_sort=_sortKeyByLang.en\n\n\n// NB! How to handle German sex-based Verfasser/Verfasserin pairs?\nconst relatorTerms = [\n {'code': 'arr', 'eng': 'arranger', 'fin': 'sovittaja', 'swe': 'arrang\u00F6r av musikalisk komposition'},\n {'code': 'art', 'eng': 'artist', 'fin': 'taiteilija', 'swe': 'konstn\u00E4r'},\n {'code': 'aui', 'eng': 'author of introduction', 'fin': 'esipuheen tekij\u00E4'},\n {'code': 'aut', 'eng': 'author', 'fin': 'kirjoittaja', 'swe': 'f\u00F6rfattare'},\n {'code': 'cmp', 'eng': 'composer', 'fin': 's\u00E4velt\u00E4j\u00E4', 'swe': 'komposit\u00F6r'},\n {'code': 'drt', 'eng': 'director', 'fin': 'ohjaaja', 'swe': 'regiss\u00F6r'},\n {'code': 'edt', 'eng': 'editor', 'fin': 'toimittaja', 'swe': 'redakt\u00F6r'},\n {'code': 'ill', 'eng': 'illustrator', 'fin': 'kuvittaja', 'swe': 'illustrat\u00F6r'},\n {'code': 'lyr', 'eng': 'lyricist', 'fin': 'sanoittaja', 'swe': 's\u00E5ngtext'},\n {'code': 'nrt', 'eng': 'narrator', 'fin': 'kertoja', 'swe': 'ber\u00E4ttare'}, // ber\u00E4ttare/inl\u00E4sare\n {'code': 'pbl', 'eng': 'publisher', 'fin': 'julkaisija', 'swe': 'utgivare'},\n {'code': 'pht', 'eng': 'photographer', 'fin': 'valokuvaaja', 'swe': 'fotograf'},\n {'code': 'prf', 'eng': 'performer', 'fin': 'esitt\u00E4j\u00E4', 'swe': 'framf\u00F6rande'},\n {'code': 'pro', 'eng': 'producer', 'fin': 'tuottaja', 'swe': 'producent'},\n {'code': 'trl', 'eng': 'translator', 'fin': 'k\u00E4\u00E4nt\u00E4j\u00E4', 'swe': '\u00F6vers\u00E4ttare'},\n {'code': '__FAKE_VALUE1__', 'fin': 'sarjakuvantekij\u00E4', 'swe': 'serieskapare'}\n];\n\n/*\nfunction recordNormalizeRelatorTerms(record, defaultLanguageCode = undef) {\n const languageCode = defaultLanguageCode ? defaultLanguageCode : getCatalogingLanguage(record);\n if (!languageCode || ['eng', 'fin', 'swe'].includes(languageCode)) {\n return;\n }\n\n}\n*/\n\n\nconst finnishAbbreviations = {\n 'esitt.': 'esitt\u00E4j\u00E4',\n 'k\u00E4\u00E4nt.': 'k\u00E4\u00E4nt\u00E4j\u00E4',\n 'n\u00E4ytt.': 'n\u00E4yttelij\u00E4',\n 'san.': 'sanoittaja',\n 'sov.': 'sovittaja',\n 's\u00E4v.': 's\u00E4velt\u00E4j\u00E4',\n 'toim.': 'toimittaja',\n // Quick and dirty implementation of https://github.com/NatLibFi/USEMARCON-BOOKWHERE-RDA/blob/master/bw_rda_kyril.rul#L651\n // As per M.I./Slavica\n '\u0445\u0443\u0434\u043E\u0436.': 'kuvittaja',\n '\u043F\u0435\u0440.': 'k\u00E4\u00E4nt\u00E4j\u00E4',\n '\u0441\u043E\u0441\u0442.': 'toimittaja', // might also be 'kokoaja'\n '\u0440\u0435\u0434.': 'toimittaja'\n};\n\nfunction subfieldHandleRelatorTermAbbreviation(subfield, language) {\n if (subfield.code !== 'e') {\n return;\n }\n nvdebug(`Relator cand subfield: '${subfieldToString(subfield)}', lang: ${language ? language : 'NULL'}`, debugDev);\n if (!language || language === 'mul') {\n subfieldHandleRelatorTermAbbreviation(subfield, 'fin');\n // Maybe later add Swedish here...\n return;\n }\n const value = subfield.value.replace(/,$/u, '');\n const punc = value === subfield.value ? '' : ',';\n\n const lcValue = value.toLowerCase(); // Check \u00C5, \u00C4, \u00D6...\n\n // NB: Policy: if no language or multi-language: apply all rules! (Not much overlap I hope...)\n if (!language || language === 'fin' || language === 'mul') {\n nvdebug(`Relator try Finnish for '${lcValue}}'...`, debugDev);\n if (lcValue in finnishAbbreviations) {\n const hit = `${finnishAbbreviations[lcValue]}${punc}`;\n nvdebug(`Relator hit: ${hit}`, debugDev);\n // NB! 'esitt.' => 'esitt\u00E4j\u00E4'\n subfield.value = hit;\n return;\n }\n }\n}\n\n\nfunction isRelatorField(field) {\n // Tag list might be incomplete!\n return field.tag.match(/^(?:100|110|600|610|700|710|720|800|810)$/u);\n}\n\nfunction fieldHandleRelatorTermAbbreviations(field, language) {\n if (!isRelatorField(field)) {\n return;\n }\n\n const originalValue = fieldToString(field);\n field.subfields.forEach(sf => subfieldHandleRelatorTermAbbreviation(sf, language));\n const modifiedValue = fieldToString(field);\n if (modifiedValue === originalValue) {\n return;\n }\n // Changes have happened... Try to punctuate.\n // (NB! We need punctuation as a module, if we are to make abbr expansion a marc-record-validators-melinda validator/fixer)\n fieldFixPunctuation(field);\n}\n\nfunction termIsInGivenLanguage(term, language) {\n return relatorTerms.some(row => language in row && row[language] === term);\n}\n\nfunction anyToLanguage(originalTerm) {\n // Sometimes there's no 040$b or 040$b and, say, 040$b and 700$e value don't correlate\n if (termIsInGivenLanguage(originalTerm, 'fin')) {\n return 'fin';\n }\n if (termIsInGivenLanguage(originalTerm, 'swe')) {\n return 'swe';\n }\n if (termIsInGivenLanguage(originalTerm, 'eng')) {\n return 'eng';\n }\n return null;\n}\n\nfunction translateRelatorTerm(originalTerm, defaultFromLanguage, toLanguage) {\n\n // originalTerm is supposed to be normal version (abbrs have been expanded), possibly with punctuation\n const term = originalTerm.replace(/[,.]$/u, '');\n nvdebug(`Try to translate '${term}' from ${defaultFromLanguage} to ${toLanguage}`, debugDev);\n\n // Kind of hacky... If term is in toLanguage, do nothing. defaultFromLanguage (040$b) isn't that reliable.\n if (termIsInGivenLanguage(term, toLanguage)) {\n return originalTerm;\n }\n // defaultFomLanguage (typically 040$b) isn't that reliable:\n const fromLanguage = defaultFromLanguage === null || !termIsInGivenLanguage(term, defaultFromLanguage) ? anyToLanguage(term) : defaultFromLanguage;\n\n const [candRow] = relatorTerms.filter(row => fromLanguage in row && toLanguage in row && row[fromLanguage] === term);\n if (candRow) {\n const punc = term === originalTerm ? '' : originalTerm.slice(-1);\n const translation = `${candRow[toLanguage]}${punc}`;\n nvdebug(`Translate relator term: ${originalTerm} => ${translation}`, debugDev);\n return translation;\n }\n return originalTerm;\n}\n\nfunction subfieldTranslateRelatorTerm(subfield, fromLanguage, toLanguage) {\n if (subfield.code !== 'e') {\n return;\n }\n subfield.value = translateRelatorTerm(subfield.value, fromLanguage, toLanguage);\n}\n\nexport function fieldFixRelatorTerms(field, fromLanguage, toLanguage) {\n // fromLanguage can not be relied upon.\n if (!isRelatorField(field)/* || fromLanguage === toLanguage*/) {\n return;\n }\n fieldHandleRelatorTermAbbreviations(field, fromLanguage);\n\n field.subfields.forEach(sf => subfieldTranslateRelatorTerm(sf, fromLanguage, toLanguage));\n}\n\n\nexport function recordFixRelatorTerms(record, defaultToLanguage = null, defaultFromLanguage = null) { // WAS: translateRecord()\n const fromLanguage = defaultFromLanguage ? defaultFromLanguage : getCatalogingLanguage(record);\n const toLanguage = defaultToLanguage ? defaultToLanguage : getCatalogingLanguage(record);\n\n record.fields.forEach(field => translateField(field, fromLanguage, toLanguage));\n\n function translateField(field, from, to) {\n fieldFixRelatorTerms(field, from, to);\n }\n}\n\n\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import clone from 'clone';\nimport {fieldFixPunctuation} from './punctuation2.js';\nimport {fieldToString, getCatalogingLanguage, nvdebug, subfieldToString} from './utils.js';\nimport createDebugLogger from 'debug';\n\n// Currently mainly translates X00$e values, so that we don't have \"$a Name, $e kirjoittaja, $e f\u00F6rfattare.\".\n// Later on we could try and handle $4 stuff here as well.\n\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:fixRelatorterms');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nexport default function () {\n return {\n description: 'Fix $e subfields in field [1678][01]0 and 720',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n const language = getCatalogingLanguage(record);\n\n record.fields.forEach(field => {\n fieldFixRelatorTerms(field, language, language);\n });\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const language = getCatalogingLanguage(record);\n\n record.fields.forEach(field => {\n const clonedField = clone(field);\n // Rather hackily/abnormally use language as both fromLanguage and toLanguage.\n // fromLanguage is used to expand \"esitt.\" => \"esitt\u00E4j\u00E4\".\n // toLanguage is used by translations (fixes \"f\u00F6rfattere\" to \"kirjoittaja\", if 040$b is \"fin\")\n fieldFixRelatorTerms(field, language, language);\n const clonedFieldAsString = fieldToString(clonedField);\n const fieldAsString = fieldToString(field);\n if (fieldAsString !== clonedFieldAsString) {\n res.message.push(`${fieldAsString} => ${clonedFieldAsString}`);\n }\n });\n\n res.valid = !(res.message.length >= 1);\n return res;\n }\n}\n\n\n/*\nexport default () => (base, source) => {\n recordTranslateRelatorTerms(base);\n recordTranslateRelatorTerms(source);\n recordHandleRelatorTermAbbreviations(base);\n recordHandleRelatorTermAbbreviations(source);\n const result = {base, source};\n return result;\n};\n*/\n\n\n// Partial source: https://marc21.kansalliskirjasto.fi/funktiot_koodit.htm\n// https://wiki.helsinki.fi/display/MARC21svenska/Funktions-+och+relationskoder+-+alfabetiskt+efter+funktion\n// New, better source: https://id.kb.se/find?q=relator&_sort=_sortKeyByLang.en\n\n// NOTE: There are problematic relatorterms that do not diffrentiate between agent+work vs agent+ekspression relation\n// ie. teoksen haastattelija vs haastattelija (ekspressio)\n// current solution ignores them and handles just \"plain\" relator terms\n\n// NB! How to handle German sex-based Verfasser/Verfasserin pairs?\nconst relatorTerms = [\n {'code': 'arr', 'eng': 'arranger', 'fin': 'sovittaja', 'swe': 'arrang\u00F6r av musikalisk komposition'},\n {'code': 'art', 'eng': 'artist', 'fin': 'taiteilija', 'swe': 'konstn\u00E4r'},\n {'code': 'aui', 'eng': 'author of introduction', 'fin': 'esipuheen tekij\u00E4'},\n {'code': 'aut', 'eng': 'author', 'fin': 'kirjoittaja', 'swe': 'f\u00F6rfattare'},\n {'code': 'cmp', 'eng': 'composer', 'fin': 's\u00E4velt\u00E4j\u00E4', 'swe': 'komposit\u00F6r'},\n {'code': 'drt', 'eng': 'director', 'fin': 'ohjaaja', 'swe': 'regiss\u00F6r'},\n {'code': 'edt', 'eng': 'editor', 'fin': 'toimittaja', 'swe': 'redakt\u00F6r'},\n {'code': 'ill', 'eng': 'illustrator', 'fin': 'kuvittaja', 'swe': 'illustrat\u00F6r'},\n {'code': 'ive', 'eng': 'interviewee', 'fin': 'haastateltava', 'swe': 'intervjuobjekt'},\n {'code': 'ivr', 'eng': 'interviewer', 'fin': 'haastattelija', 'swe': 'intervjuare'},\n {'code': 'lyr', 'eng': 'lyricist', 'fin': 'sanoittaja', 'swe': 's\u00E5ngtext'},\n {'code': 'nrt', 'eng': 'narrator', 'fin': 'kertoja', 'swe': 'ber\u00E4ttare'}, // ber\u00E4ttare/inl\u00E4sare\n {'code': 'pbl', 'eng': 'publisher', 'fin': 'julkaisija', 'swe': 'utgivare'},\n {'code': 'pht', 'eng': 'photographer', 'fin': 'valokuvaaja', 'swe': 'fotograf'},\n {'code': 'prf', 'eng': 'performer', 'fin': 'esitt\u00E4j\u00E4', 'swe': 'framf\u00F6rande'},\n {'code': 'pro', 'eng': 'producer', 'fin': 'tuottaja', 'swe': 'producent'},\n {'code': 'trl', 'eng': 'translator', 'fin': 'k\u00E4\u00E4nt\u00E4j\u00E4', 'swe': '\u00F6vers\u00E4ttare'},\n {'code': '__FAKE_VALUE1__', 'fin': 'sarjakuvantekij\u00E4', 'swe': 'serieskapare'}\n];\n\n/*\nfunction recordNormalizeRelatorTerms(record, defaultLanguageCode = undef) {\n const languageCode = defaultLanguageCode ? defaultLanguageCode : getCatalogingLanguage(record);\n if (!languageCode || ['eng', 'fin', 'swe'].includes(languageCode)) {\n return;\n }\n\n}\n*/\n\n\nconst finnishAbbreviations = {\n 'esitt.': 'esitt\u00E4j\u00E4',\n 'k\u00E4\u00E4nt.': 'k\u00E4\u00E4nt\u00E4j\u00E4',\n 'n\u00E4ytt.': 'n\u00E4yttelij\u00E4',\n 'san.': 'sanoittaja',\n 'sov.': 'sovittaja',\n 's\u00E4v.': 's\u00E4velt\u00E4j\u00E4',\n 'toim.': 'toimittaja',\n // Quick and dirty implementation of https://github.com/NatLibFi/USEMARCON-BOOKWHERE-RDA/blob/master/bw_rda_kyril.rul#L651\n // As per M.I./Slavica\n '\u0445\u0443\u0434\u043E\u0436.': 'kuvittaja',\n '\u043F\u0435\u0440.': 'k\u00E4\u00E4nt\u00E4j\u00E4',\n '\u0441\u043E\u0441\u0442.': 'toimittaja', // might also be 'kokoaja'\n '\u0440\u0435\u0434.': 'toimittaja'\n};\n\nfunction subfieldHandleRelatorTermAbbreviation(subfield, language) {\n if (subfield.code !== 'e') {\n return;\n }\n nvdebug(`Relator cand subfield: '${subfieldToString(subfield)}', lang: ${language ? language : 'NULL'}`, debugDev);\n if (!language || language === 'mul') {\n subfieldHandleRelatorTermAbbreviation(subfield, 'fin');\n // Maybe later add Swedish here...\n return;\n }\n const value = subfield.value.replace(/,$/u, '');\n const punc = value === subfield.value ? '' : ',';\n\n const lcValue = value.toLowerCase(); // Check \u00C5, \u00C4, \u00D6...\n\n // NB: Policy: if no language or multi-language: apply all rules! (Not much overlap I hope...)\n if (!language || language === 'fin' || language === 'mul') {\n nvdebug(`Relator try Finnish for '${lcValue}}'...`, debugDev);\n if (lcValue in finnishAbbreviations) {\n const hit = `${finnishAbbreviations[lcValue]}${punc}`;\n nvdebug(`Relator hit: ${hit}`, debugDev);\n // NB! 'esitt.' => 'esitt\u00E4j\u00E4'\n subfield.value = hit;\n return;\n }\n }\n}\n\n\nfunction isRelatorField(field) {\n // Tag list might be incomplete!\n return field.tag.match(/^(?:100|110|600|610|700|710|720|800|810)$/u);\n}\n\nfunction fieldHandleRelatorTermAbbreviations(field, language) {\n if (!isRelatorField(field)) {\n return;\n }\n\n const originalValue = fieldToString(field);\n field.subfields.forEach(sf => subfieldHandleRelatorTermAbbreviation(sf, language));\n const modifiedValue = fieldToString(field);\n if (modifiedValue === originalValue) {\n return;\n }\n // Changes have happened... Try to punctuate.\n // (NB! We need punctuation as a module, if we are to make abbr expansion a marc-record-validators-melinda validator/fixer)\n fieldFixPunctuation(field);\n}\n\nfunction termIsInGivenLanguage(term, language) {\n return relatorTerms.some(row => language in row && row[language] === term);\n}\n\nfunction anyToLanguage(originalTerm) {\n // Sometimes there's no 040$b or 040$b and, say, 040$b and 700$e value don't correlate\n if (termIsInGivenLanguage(originalTerm, 'fin')) {\n return 'fin';\n }\n if (termIsInGivenLanguage(originalTerm, 'swe')) {\n return 'swe';\n }\n if (termIsInGivenLanguage(originalTerm, 'eng')) {\n return 'eng';\n }\n return null;\n}\n\nfunction translateRelatorTerm(originalTerm, defaultFromLanguage, toLanguage) {\n\n // originalTerm is supposed to be normal version (abbrs have been expanded), possibly with punctuation\n const term = originalTerm.replace(/[,.]$/u, '');\n nvdebug(`Try to translate '${term}' from ${defaultFromLanguage} to ${toLanguage}`, debugDev);\n\n // Kind of hacky... If term is in toLanguage, do nothing. defaultFromLanguage (040$b) isn't that reliable.\n if (termIsInGivenLanguage(term, toLanguage)) {\n return originalTerm;\n }\n // defaultFomLanguage (typically 040$b) isn't that reliable:\n const fromLanguage = defaultFromLanguage === null || !termIsInGivenLanguage(term, defaultFromLanguage) ? anyToLanguage(term) : defaultFromLanguage;\n\n const [candRow] = relatorTerms.filter(row => fromLanguage in row && toLanguage in row && row[fromLanguage] === term);\n if (candRow) {\n const punc = term === originalTerm ? '' : originalTerm.slice(-1);\n const translation = `${candRow[toLanguage]}${punc}`;\n nvdebug(`Translate relator term: ${originalTerm} => ${translation}`, debugDev);\n return translation;\n }\n return originalTerm;\n}\n\nfunction subfieldTranslateRelatorTerm(subfield, fromLanguage, toLanguage) {\n if (subfield.code !== 'e') {\n return;\n }\n subfield.value = translateRelatorTerm(subfield.value, fromLanguage, toLanguage);\n}\n\nexport function fieldFixRelatorTerms(field, fromLanguage, toLanguage) {\n // fromLanguage can not be relied upon.\n if (!isRelatorField(field)/* || fromLanguage === toLanguage*/) {\n return;\n }\n fieldHandleRelatorTermAbbreviations(field, fromLanguage);\n\n field.subfields.forEach(sf => subfieldTranslateRelatorTerm(sf, fromLanguage, toLanguage));\n}\n\n\nexport function recordFixRelatorTerms(record, defaultToLanguage = null, defaultFromLanguage = null) { // WAS: translateRecord()\n const fromLanguage = defaultFromLanguage ? defaultFromLanguage : getCatalogingLanguage(record);\n const toLanguage = defaultToLanguage ? defaultToLanguage : getCatalogingLanguage(record);\n\n record.fields.forEach(field => translateField(field, fromLanguage, toLanguage));\n\n function translateField(field, from, to) {\n fieldFixRelatorTerms(field, from, to);\n }\n}\n\n\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -3,7 +3,6 @@ import { MarcRecord } from "@natlibfi/marc-record";
3
3
  import validatorFactory from "./fixRelatorTerms.js";
4
4
  import { READERS } from "@natlibfi/fixura";
5
5
  import generateTests from "@natlibfi/fixugen";
6
- import createDebugLogger from "debug";
7
6
  generateTests({
8
7
  callback,
9
8
  path: [import.meta.dirname, "..", "test-fixtures", "fix-relator-terms"],
@@ -18,18 +17,13 @@ generateTests({
18
17
  }
19
18
  }
20
19
  });
21
- const debug = createDebugLogger("@natlibfi/marc-record-validators-melinda/fixRelatorTerms:test");
22
20
  async function testValidatorFactory() {
23
21
  const validator = await validatorFactory();
24
22
  assert.equal(typeof validator, "object");
25
23
  assert.equal(typeof validator.description, "string");
26
24
  assert.equal(typeof validator.validate, "function");
27
25
  }
28
- async function callback({ getFixture, enabled = true, fix = false }) {
29
- if (enabled === false) {
30
- debug("TEST SKIPPED!");
31
- return;
32
- }
26
+ async function callback({ getFixture, fix = false }) {
33
27
  const validator = await validatorFactory();
34
28
  const record = new MarcRecord(getFixture("record.json"));
35
29
  const expectedResult = getFixture("expectedResult.json");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/fixRelatorTerms.test.js"],
4
- "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './fixRelatorTerms.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', 'fix-relator-terms'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/fixRelatorTerms:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n assert.equal(typeof validator, 'object');\n assert.equal(typeof validator.description, 'string');\n assert.equal(typeof validator.validate, 'function');\n}\n\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
5
- "mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAC1B,OAAO,uBAAuB;AAE9B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,mBAAmB;AAAA,EACtE,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;AAED,MAAM,QAAQ,kBAAkB,+DAA+D;AAE/F,eAAe,uBAAuB;AACpC,QAAM,YAAY,MAAM,iBAAiB;AAEzC,SAAO,MAAM,OAAO,WAAW,QAAQ;AACvC,SAAO,MAAM,OAAO,UAAU,aAAa,QAAQ;AACnD,SAAO,MAAM,OAAO,UAAU,UAAU,UAAU;AACpD;AAEA,eAAe,SAAS,EAAC,YAAY,UAAU,MAAM,MAAM,MAAK,GAAG;AACjE,MAAI,YAAY,OAAO;AACrB,UAAM,eAAe;AACrB;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,iBAAiB;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,QAAM,iBAAiB,WAAW,qBAAqB;AAGvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,cAAc;AACzC;",
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './fixRelatorTerms.js';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n//import createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [import.meta.dirname, '..', 'test-fixtures', 'fix-relator-terms'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n hooks: {\n before: async () => {\n testValidatorFactory();\n }\n }\n});\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/fixRelatorTerms: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, fix = false}) {\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n assert.deepEqual(result, expectedResult);\n return;\n }\n\n await validator.fix(record);\n assert.deepEqual(record, expectedResult);\n}\n"],
5
+ "mappings": "AAAA,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB,OAAO,sBAAsB;AAC7B,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAG1B,cAAc;AAAA,EACZ;AAAA,EACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,mBAAmB;AAAA,EACtE,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;AAID,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,MAAM,MAAK,GAAG;AACjD,QAAM,YAAY,MAAM,iBAAiB;AACzC,QAAM,SAAS,IAAI,WAAW,WAAW,aAAa,CAAC;AACvD,QAAM,iBAAiB,WAAW,qBAAqB;AAGvD,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,WAAO,UAAU,QAAQ,cAAc;AACvC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,MAAM;AAC1B,SAAO,UAAU,QAAQ,cAAc;AACzC;",
6
6
  "names": []
7
7
  }
package/dist/index.js CHANGED
@@ -21,6 +21,7 @@ import Fix33X from "./fix-33X.js";
21
21
  import FixCountryCodes from "./fix-country-codes.js";
22
22
  import FixLanguageCodes from "./fix-language-codes.js";
23
23
  import FixRelatorTerms from "./fixRelatorTerms.js";
24
+ import FixSami041 from "./fix-sami-041.js";
24
25
  import FixedFields from "./fixed-fields.js";
25
26
  import IdenticalFields from "./identical-fields.js";
26
27
  import IndicatorFixes from "./indicator-fixes.js";
@@ -39,6 +40,7 @@ import NormalizeUTF8Diacritics from "./normalize-utf8-diacritics.js";
39
40
  import Punctuation from "./punctuation/index.js";
40
41
  import Punctuation2 from "./punctuation2.js";
41
42
  import ReindexSubfield6OccurenceNumbers from "./reindexSubfield6OccurenceNumbers.js";
43
+ import Remove041zxx from "./remove-041-zxx.js";
42
44
  import RemoveDuplicateDataFields from "./removeDuplicateDataFields.js";
43
45
  import RemoveInferiorDataFields from "./removeInferiorDataFields.js";
44
46
  import ResolvableExtReferences from "./resolvable-ext-references-melinda.js";
@@ -51,6 +53,7 @@ import SortTags from "./sort-tags.js";
51
53
  import SubfieldValueNormalizations from "./subfieldValueNormalizations.js";
52
54
  import SubfieldExclusion from "./subfield-exclusion.js";
53
55
  import Sync007And300 from "./sync-007-and-300.js";
56
+ import SyncLanguage from "./sync-language.js";
54
57
  import TranslateTerms from "./translate-terms.js";
55
58
  import TypeOfDateF008 from "./typeOfDate-008.js";
56
59
  import UnicodeDecomposition from "./unicode-decomposition.js";
@@ -62,12 +65,14 @@ import { mergeField } from "./merge-fields/mergeField.js";
62
65
  import {
63
66
  fieldGetOccurrenceNumberPairs,
64
67
  fieldGetUnambiguousOccurrenceNumber,
68
+ fieldHasValidSubfield6,
65
69
  fieldToNormalizedString,
66
70
  fieldsToNormalizedString,
67
71
  get6s,
72
+ isSubfield6Pair,
68
73
  isValidSubfield6,
69
- recordGetMaxSubfield6OccurrenceNumberAsInteger,
70
74
  intToOccurrenceNumberString,
75
+ recordGetMaxSubfield6OccurrenceNumberAsInteger,
71
76
  resetSubfield6Tag,
72
77
  subfield6ResetOccurrenceNumber,
73
78
  subfield6GetOccurrenceNumber,
@@ -77,13 +82,13 @@ import { getSubfield8LinkingNumber, isValidSubfield8, recordGetAllSubfield8Linki
77
82
  import { recordFixRelatorTerms } from "./fixRelatorTerms.js";
78
83
  import { fieldTrimSubfieldValues } from "./normalizeFieldForComparison.js";
79
84
  import { baseHasEqualOrHigherEncodingLevel, deleteAllPrepublicationNotesFromField500InNonPubRecord, encodingLevelIsBetterThanPrepublication, getEncodingLevel, isEnnakkotietoField, isEnnakkotietoSubfield } from "./prepublicationUtils.js";
80
- import { melindaFieldSpecs } from "@natlibfi/marc-record-validators-melinda/dist/melindaCustomMergeFields.js";
85
+ import { melindaFieldSpecs } from "./melindaCustomMergeFields.js";
81
86
  import { cloneAndRemovePunctuation } from "./normalizeFieldForComparison.js";
82
87
  import { removeWorsePrepubField500s, removeWorsePrepubField594s } from "./prepublicationUtils.js";
83
88
  import { fieldFixPunctuation } from "./punctuation2.js";
84
89
  import { recordResetSubfield6OccurrenceNumbers } from "./reindexSubfield6OccurenceNumbers.js";
85
90
  import { sortAdjacentSubfields } from "./sortSubfields.js";
86
- import { fieldsToString } from "./utils.js";
91
+ import { fieldHasSubfield, fieldToString, fieldsToString, isContentSubfieldCode, tagIsRepeatable } from "./utils.js";
87
92
  export {
88
93
  AccessRights,
89
94
  AddMissingField041,
@@ -108,6 +113,7 @@ export {
108
113
  FixCountryCodes,
109
114
  FixLanguageCodes,
110
115
  FixRelatorTerms,
116
+ FixSami041,
111
117
  FixedFields,
112
118
  IdenticalFields,
113
119
  IndicatorFixes,
@@ -126,6 +132,7 @@ export {
126
132
  Punctuation2,
127
133
  ResolveOrphanedSubfield6s,
128
134
  ReindexSubfield6OccurenceNumbers,
135
+ Remove041zxx,
129
136
  RemoveDuplicateDataFields,
130
137
  RemoveInferiorDataFields,
131
138
  ResolvableExtReferences,
@@ -136,8 +143,9 @@ export {
136
143
  SubfieldExclusion,
137
144
  SubfieldValueNormalizations,
138
145
  Sync007And300,
139
- TypeOfDateF008,
146
+ SyncLanguage,
140
147
  TranslateTerms,
148
+ TypeOfDateF008,
141
149
  UnicodeDecomposition,
142
150
  UpdateField540,
143
151
  Urn,
@@ -146,12 +154,16 @@ export {
146
154
  getEncodingLevel,
147
155
  cloneAndRemovePunctuation,
148
156
  fieldFixPunctuation,
157
+ fieldHasSubfield,
149
158
  fieldToNormalizedString,
159
+ fieldToString,
150
160
  fieldTrimSubfieldValues,
151
161
  fieldsToNormalizedString,
152
162
  fieldsToString,
163
+ isContentSubfieldCode,
153
164
  recordFixRelatorTerms,
154
165
  sortAdjacentSubfields,
166
+ tagIsRepeatable,
155
167
  baseHasEqualOrHigherEncodingLevel,
156
168
  deleteAllPrepublicationNotesFromField500InNonPubRecord,
157
169
  encodingLevelIsBetterThanPrepublication,
@@ -162,7 +174,9 @@ export {
162
174
  fieldGetOccurrenceNumberPairs,
163
175
  get6s,
164
176
  fieldGetUnambiguousOccurrenceNumber,
177
+ fieldHasValidSubfield6,
165
178
  intToOccurrenceNumberString,
179
+ isSubfield6Pair,
166
180
  isValidSubfield6,
167
181
  recordGetMaxSubfield6OccurrenceNumberAsInteger,
168
182
  recordResetSubfield6OccurrenceNumbers,