@natlibfi/marc-record-validators-melinda 11.0.0-alpha.1 → 11.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (309) hide show
  1. package/dist/addMissingField336.js +272 -0
  2. package/dist/addMissingField336.js.map +1 -0
  3. package/dist/addMissingField336.spec.js +45 -0
  4. package/dist/addMissingField336.spec.js.map +1 -0
  5. package/dist/addMissingField337.js +177 -0
  6. package/dist/addMissingField337.js.map +1 -0
  7. package/dist/addMissingField337.spec.js +43 -0
  8. package/dist/addMissingField337.spec.js.map +1 -0
  9. package/dist/addMissingField338.js +424 -0
  10. package/dist/addMissingField338.js.map +1 -0
  11. package/dist/addMissingField338.spec.js +45 -0
  12. package/dist/addMissingField338.spec.js.map +1 -0
  13. package/dist/cyrillux-usemarcon-replacement.js +370 -0
  14. package/dist/cyrillux-usemarcon-replacement.js.map +1 -0
  15. package/dist/cyrillux-usemarcon-replacement.spec.js +45 -0
  16. package/dist/cyrillux-usemarcon-replacement.spec.js.map +1 -0
  17. package/dist/field33XUtils.js +529 -0
  18. package/dist/field33XUtils.js.map +1 -0
  19. package/dist/fix-33X.js +484 -0
  20. package/dist/fix-33X.js.map +1 -0
  21. package/dist/fix-33X.spec.js +45 -0
  22. package/dist/fix-33X.spec.js.map +1 -0
  23. package/dist/fix-language-codes.js +109 -0
  24. package/dist/fix-language-codes.js.map +1 -0
  25. package/dist/fix-language-codes.spec.js +44 -0
  26. package/dist/fix-language-codes.spec.js.map +1 -0
  27. package/dist/fixRelatorTerms.js +1 -1
  28. package/dist/fixRelatorTerms.js.map +1 -1
  29. package/dist/punctuation2.js +4 -3
  30. package/dist/punctuation2.js.map +1 -1
  31. package/dist/resolvable-ext-references-melinda.spec.js +1 -1
  32. package/dist/resolvable-ext-references-melinda.spec.js.map +1 -1
  33. package/dist/sanitize-vocabulary-source-codes.js +7 -10
  34. package/dist/sanitize-vocabulary-source-codes.js.map +1 -1
  35. package/dist/utils.js +13 -8
  36. package/dist/utils.js.map +1 -1
  37. package/package.json +7 -7
  38. package/src/addMissingField336.js +260 -0
  39. package/src/addMissingField336.spec.js +46 -0
  40. package/src/addMissingField337.js +132 -0
  41. package/src/addMissingField337.spec.js +45 -0
  42. package/src/addMissingField338.js +446 -0
  43. package/src/addMissingField338.spec.js +46 -0
  44. package/src/cyrillux-usemarcon-replacement.js +410 -0
  45. package/src/cyrillux-usemarcon-replacement.spec.js +47 -0
  46. package/src/field33XUtils.js +156 -0
  47. package/src/fix-33X.js +473 -0
  48. package/src/fix-33X.spec.js +46 -0
  49. package/src/fix-language-codes.js +121 -0
  50. package/src/fix-language-codes.spec.js +45 -0
  51. package/src/fixRelatorTerms.js +1 -1
  52. package/src/punctuation2.js +3 -3
  53. package/src/sanitize-vocabulary-source-codes.js +9 -11
  54. package/src/utils.js +13 -8
  55. package/test-fixtures/addMissingField336/01/expectedResult.json +6 -0
  56. package/test-fixtures/addMissingField336/01/metadata.json +7 -0
  57. package/test-fixtures/addMissingField336/01/record.json +8 -0
  58. package/test-fixtures/addMissingField336/02/expectedResult.json +4 -0
  59. package/test-fixtures/addMissingField336/02/metadata.json +7 -0
  60. package/test-fixtures/addMissingField336/02/record.json +13 -0
  61. package/test-fixtures/addMissingField336/cod/expectedResult.json +12 -0
  62. package/test-fixtures/addMissingField336/cod/metadata.json +6 -0
  63. package/test-fixtures/addMissingField336/cod/record.json +6 -0
  64. package/test-fixtures/addMissingField336/cop/expectedResult.json +12 -0
  65. package/test-fixtures/addMissingField336/cop/metadata.json +6 -0
  66. package/test-fixtures/addMissingField336/cop/record.json +6 -0
  67. package/test-fixtures/addMissingField336/cop2/expectedResult.json +13 -0
  68. package/test-fixtures/addMissingField336/cop2/metadata.json +6 -0
  69. package/test-fixtures/addMissingField336/cop2/record.json +7 -0
  70. package/test-fixtures/addMissingField336/crf/expectedResult.json +12 -0
  71. package/test-fixtures/addMissingField336/crf/metadata.json +6 -0
  72. package/test-fixtures/addMissingField336/crf/record.json +6 -0
  73. package/test-fixtures/addMissingField336/cri/expectedResult.json +12 -0
  74. package/test-fixtures/addMissingField336/cri/metadata.json +6 -0
  75. package/test-fixtures/addMissingField336/cri/record.json +6 -0
  76. package/test-fixtures/addMissingField336/crt/expectedResult.json +13 -0
  77. package/test-fixtures/addMissingField336/crt/metadata.json +6 -0
  78. package/test-fixtures/addMissingField336/crt/record.json +7 -0
  79. package/test-fixtures/addMissingField336/f01/expectedResult.json +17 -0
  80. package/test-fixtures/addMissingField336/f01/metadata.json +6 -0
  81. package/test-fixtures/addMissingField336/f01/record.json +11 -0
  82. package/test-fixtures/addMissingField336/f02/expectedResult.json +15 -0
  83. package/test-fixtures/addMissingField336/f02/metadata.json +6 -0
  84. package/test-fixtures/addMissingField336/f02/record.json +9 -0
  85. package/test-fixtures/addMissingField336/mixed2txt/expectedResult.json +12 -0
  86. package/test-fixtures/addMissingField336/mixed2txt/metadata.json +6 -0
  87. package/test-fixtures/addMissingField336/mixed2txt/record.json +6 -0
  88. package/test-fixtures/addMissingField336/mixed2xxx/expectedResult.json +12 -0
  89. package/test-fixtures/addMissingField336/mixed2xxx/metadata.json +6 -0
  90. package/test-fixtures/addMissingField336/mixed2xxx/record.json +6 -0
  91. package/test-fixtures/addMissingField336/ntm/expectedResult.json +12 -0
  92. package/test-fixtures/addMissingField336/ntm/metadata.json +6 -0
  93. package/test-fixtures/addMissingField336/ntm/record.json +6 -0
  94. package/test-fixtures/addMissingField336/snd/expectedResult.json +12 -0
  95. package/test-fixtures/addMissingField336/snd/metadata.json +6 -0
  96. package/test-fixtures/addMissingField336/snd/record.json +6 -0
  97. package/test-fixtures/addMissingField336/spw/expectedResult.json +12 -0
  98. package/test-fixtures/addMissingField336/spw/metadata.json +6 -0
  99. package/test-fixtures/addMissingField336/spw/record.json +6 -0
  100. package/test-fixtures/addMissingField336/spw2/expectedResult.json +13 -0
  101. package/test-fixtures/addMissingField336/spw2/metadata.json +6 -0
  102. package/test-fixtures/addMissingField336/spw2/record.json +7 -0
  103. package/test-fixtures/addMissingField336/spw_txt/expectedResult.json +18 -0
  104. package/test-fixtures/addMissingField336/spw_txt/metadata.json +6 -0
  105. package/test-fixtures/addMissingField336/spw_txt/record.json +7 -0
  106. package/test-fixtures/addMissingField336/sti/expectedResult.json +12 -0
  107. package/test-fixtures/addMissingField336/sti/metadata.json +6 -0
  108. package/test-fixtures/addMissingField336/sti/record.json +6 -0
  109. package/test-fixtures/addMissingField336/sti_projected/expectedResult.json +13 -0
  110. package/test-fixtures/addMissingField336/sti_projected/metadata.json +6 -0
  111. package/test-fixtures/addMissingField336/sti_projected/record.json +7 -0
  112. package/test-fixtures/addMissingField336/tci/expectedResult.json +12 -0
  113. package/test-fixtures/addMissingField336/tci/metadata.json +6 -0
  114. package/test-fixtures/addMissingField336/tci/record.json +6 -0
  115. package/test-fixtures/addMissingField336/tcm/expectedResult.json +12 -0
  116. package/test-fixtures/addMissingField336/tcm/metadata.json +6 -0
  117. package/test-fixtures/addMissingField336/tcm/record.json +6 -0
  118. package/test-fixtures/addMissingField336/tdf/expectedResult.json +12 -0
  119. package/test-fixtures/addMissingField336/tdf/metadata.json +6 -0
  120. package/test-fixtures/addMissingField336/tdf/record.json +6 -0
  121. package/test-fixtures/addMissingField336/tdi/expectedResult.json +13 -0
  122. package/test-fixtures/addMissingField336/tdi/metadata.json +6 -0
  123. package/test-fixtures/addMissingField336/tdi/record.json +7 -0
  124. package/test-fixtures/addMissingField336/txt/expectedResult.json +12 -0
  125. package/test-fixtures/addMissingField336/txt/metadata.json +6 -0
  126. package/test-fixtures/addMissingField336/txt/record.json +6 -0
  127. package/test-fixtures/addMissingField336/zzz/expectedResult.json +13 -0
  128. package/test-fixtures/addMissingField336/zzz/metadata.json +6 -0
  129. package/test-fixtures/addMissingField336/zzz/record.json +7 -0
  130. package/test-fixtures/addMissingField337/c1/expectedResult.json +12 -0
  131. package/test-fixtures/addMissingField337/c1/metadata.json +6 -0
  132. package/test-fixtures/addMissingField337/c1/record.json +7 -0
  133. package/test-fixtures/addMissingField337/g1/expectedResult.json +13 -0
  134. package/test-fixtures/addMissingField337/g1/metadata.json +6 -0
  135. package/test-fixtures/addMissingField337/g1/record.json +7 -0
  136. package/test-fixtures/addMissingField337/n1/expectedResult.json +12 -0
  137. package/test-fixtures/addMissingField337/n1/metadata.json +6 -0
  138. package/test-fixtures/addMissingField337/n1/record.json +6 -0
  139. package/test-fixtures/addMissingField337/no_action_required/expectedResult.json +12 -0
  140. package/test-fixtures/addMissingField337/no_action_required/metadata.json +7 -0
  141. package/test-fixtures/addMissingField337/no_action_required/record.json +11 -0
  142. package/test-fixtures/addMissingField337/p1/expectedResult.json +12 -0
  143. package/test-fixtures/addMissingField337/p1/metadata.json +6 -0
  144. package/test-fixtures/addMissingField337/p1/record.json +6 -0
  145. package/test-fixtures/addMissingField337/validate_x1/expectedResult.json +6 -0
  146. package/test-fixtures/addMissingField337/validate_x1/metadata.json +6 -0
  147. package/test-fixtures/addMissingField337/validate_x1/record.json +6 -0
  148. package/test-fixtures/addMissingField338/cb/expectedResult.json +14 -0
  149. package/test-fixtures/addMissingField338/cb/metadata.json +6 -0
  150. package/test-fixtures/addMissingField338/cb/record.json +8 -0
  151. package/test-fixtures/addMissingField338/cd/expectedResult.json +14 -0
  152. package/test-fixtures/addMissingField338/cd/metadata.json +6 -0
  153. package/test-fixtures/addMissingField338/cd/record.json +8 -0
  154. package/test-fixtures/addMissingField338/ck/expectedResult.json +14 -0
  155. package/test-fixtures/addMissingField338/ck/metadata.json +6 -0
  156. package/test-fixtures/addMissingField338/ck/record.json +8 -0
  157. package/test-fixtures/addMissingField338/cr/expectedResult.json +15 -0
  158. package/test-fixtures/addMissingField338/cr/metadata.json +6 -0
  159. package/test-fixtures/addMissingField338/cr/record.json +9 -0
  160. package/test-fixtures/addMissingField338/cr2/expectedResult.json +14 -0
  161. package/test-fixtures/addMissingField338/cr2/metadata.json +6 -0
  162. package/test-fixtures/addMissingField338/cr2/record.json +8 -0
  163. package/test-fixtures/addMissingField338/cr3/expectedResult.json +18 -0
  164. package/test-fixtures/addMissingField338/cr3/metadata.json +6 -0
  165. package/test-fixtures/addMissingField338/cr3/record.json +12 -0
  166. package/test-fixtures/addMissingField338/cr4/expectedResult.json +15 -0
  167. package/test-fixtures/addMissingField338/cr4/metadata.json +6 -0
  168. package/test-fixtures/addMissingField338/cr4/record.json +9 -0
  169. package/test-fixtures/addMissingField338/gc/expectedResult.json +12 -0
  170. package/test-fixtures/addMissingField338/gc/metadata.json +6 -0
  171. package/test-fixtures/addMissingField338/gc/record.json +7 -0
  172. package/test-fixtures/addMissingField338/gd/expectedResult.json +13 -0
  173. package/test-fixtures/addMissingField338/gd/metadata.json +6 -0
  174. package/test-fixtures/addMissingField338/gd/record.json +8 -0
  175. package/test-fixtures/addMissingField338/gf/expectedResult.json +13 -0
  176. package/test-fixtures/addMissingField338/gf/metadata.json +6 -0
  177. package/test-fixtures/addMissingField338/gf/record.json +8 -0
  178. package/test-fixtures/addMissingField338/gs/expectedResult.json +15 -0
  179. package/test-fixtures/addMissingField338/gs/metadata.json +6 -0
  180. package/test-fixtures/addMissingField338/gs/record.json +9 -0
  181. package/test-fixtures/addMissingField338/gt/expectedResult.json +15 -0
  182. package/test-fixtures/addMissingField338/gt/metadata.json +6 -0
  183. package/test-fixtures/addMissingField338/gt/record.json +9 -0
  184. package/test-fixtures/addMissingField338/hd/expectedResult.json +16 -0
  185. package/test-fixtures/addMissingField338/hd/metadata.json +6 -0
  186. package/test-fixtures/addMissingField338/hd/record.json +10 -0
  187. package/test-fixtures/addMissingField338/he/expectedResult.json +15 -0
  188. package/test-fixtures/addMissingField338/he/metadata.json +6 -0
  189. package/test-fixtures/addMissingField338/he/record.json +9 -0
  190. package/test-fixtures/addMissingField338/he2/expectedResult.json +12 -0
  191. package/test-fixtures/addMissingField338/he2/metadata.json +6 -0
  192. package/test-fixtures/addMissingField338/he2/record.json +6 -0
  193. package/test-fixtures/addMissingField338/hg/expectedResult.json +15 -0
  194. package/test-fixtures/addMissingField338/hg/metadata.json +7 -0
  195. package/test-fixtures/addMissingField338/hg/record.json +9 -0
  196. package/test-fixtures/addMissingField338/hg2/expectedResult.json +15 -0
  197. package/test-fixtures/addMissingField338/hg2/metadata.json +6 -0
  198. package/test-fixtures/addMissingField338/hg2/record.json +9 -0
  199. package/test-fixtures/addMissingField338/hj/expectedResult.json +15 -0
  200. package/test-fixtures/addMissingField338/hj/metadata.json +6 -0
  201. package/test-fixtures/addMissingField338/hj/record.json +9 -0
  202. package/test-fixtures/addMissingField338/hj2/expectedResult.json +15 -0
  203. package/test-fixtures/addMissingField338/hj2/metadata.json +6 -0
  204. package/test-fixtures/addMissingField338/hj2/record.json +9 -0
  205. package/test-fixtures/addMissingField338/mo/expectedResult.json +15 -0
  206. package/test-fixtures/addMissingField338/mo/metadata.json +6 -0
  207. package/test-fixtures/addMissingField338/mo/record.json +9 -0
  208. package/test-fixtures/addMissingField338/nc/expectedResult.json +19 -0
  209. package/test-fixtures/addMissingField338/nc/metadata.json +6 -0
  210. package/test-fixtures/addMissingField338/nc/record.json +13 -0
  211. package/test-fixtures/addMissingField338/nr/expectedResult.json +12 -0
  212. package/test-fixtures/addMissingField338/nr/metadata.json +7 -0
  213. package/test-fixtures/addMissingField338/nr/record.json +6 -0
  214. package/test-fixtures/addMissingField338/sd/expectedResult.json +14 -0
  215. package/test-fixtures/addMissingField338/sd/metadata.json +6 -0
  216. package/test-fixtures/addMissingField338/sd/record.json +8 -0
  217. package/test-fixtures/addMissingField338/sd2/expectedResult.json +14 -0
  218. package/test-fixtures/addMissingField338/sd2/metadata.json +6 -0
  219. package/test-fixtures/addMissingField338/sd2/record.json +8 -0
  220. package/test-fixtures/addMissingField338/sd3/expectedResult.json +14 -0
  221. package/test-fixtures/addMissingField338/sd3/metadata.json +6 -0
  222. package/test-fixtures/addMissingField338/sd3/record.json +8 -0
  223. package/test-fixtures/addMissingField338/ss/expectedResult.json +14 -0
  224. package/test-fixtures/addMissingField338/ss/metadata.json +6 -0
  225. package/test-fixtures/addMissingField338/ss/record.json +8 -0
  226. package/test-fixtures/addMissingField338/ss2/expectedResult.json +14 -0
  227. package/test-fixtures/addMissingField338/ss2/metadata.json +6 -0
  228. package/test-fixtures/addMissingField338/ss2/record.json +8 -0
  229. package/test-fixtures/addMissingField338/vd/expectedResult.json +15 -0
  230. package/test-fixtures/addMissingField338/vd/metadata.json +6 -0
  231. package/test-fixtures/addMissingField338/vd/record.json +9 -0
  232. package/test-fixtures/addMissingField338/vd2/expectedResult.json +13 -0
  233. package/test-fixtures/addMissingField338/vd2/metadata.json +6 -0
  234. package/test-fixtures/addMissingField338/vd2/record.json +8 -0
  235. package/test-fixtures/addMissingField338/vf/expectedResult.json +15 -0
  236. package/test-fixtures/addMissingField338/vf/metadata.json +6 -0
  237. package/test-fixtures/addMissingField338/vf/record.json +9 -0
  238. package/test-fixtures/addMissingField338/zu/expectedResult.json +14 -0
  239. package/test-fixtures/addMissingField338/zu/metadata.json +6 -0
  240. package/test-fixtures/addMissingField338/zu/record.json +8 -0
  241. package/test-fixtures/cyrillux-usemarcon-replacement/f01/expectedResult.json +32 -0
  242. package/test-fixtures/cyrillux-usemarcon-replacement/f01/metadata.json +7 -0
  243. package/test-fixtures/cyrillux-usemarcon-replacement/f01/record.json +20 -0
  244. package/test-fixtures/cyrillux-usemarcon-replacement/f02/expectedResult.json +29 -0
  245. package/test-fixtures/cyrillux-usemarcon-replacement/f02/metadata.json +7 -0
  246. package/test-fixtures/cyrillux-usemarcon-replacement/f02/record.json +9 -0
  247. package/test-fixtures/cyrillux-usemarcon-replacement/f03/expectedResult.json +34 -0
  248. package/test-fixtures/cyrillux-usemarcon-replacement/f03/metadata.json +7 -0
  249. package/test-fixtures/cyrillux-usemarcon-replacement/f03/record.json +12 -0
  250. package/test-fixtures/cyrillux-usemarcon-replacement/f04/expectedResult.json +26 -0
  251. package/test-fixtures/cyrillux-usemarcon-replacement/f04/metadata.json +8 -0
  252. package/test-fixtures/cyrillux-usemarcon-replacement/f04/record.json +6 -0
  253. package/test-fixtures/cyrillux-usemarcon-replacement/f05/expectedResult.json +27 -0
  254. package/test-fixtures/cyrillux-usemarcon-replacement/f05/metadata.json +7 -0
  255. package/test-fixtures/cyrillux-usemarcon-replacement/f05/record.json +8 -0
  256. package/test-fixtures/cyrillux-usemarcon-replacement/f06/expectedResult.json +27 -0
  257. package/test-fixtures/cyrillux-usemarcon-replacement/f06/metadata.json +7 -0
  258. package/test-fixtures/cyrillux-usemarcon-replacement/f06/record.json +8 -0
  259. package/test-fixtures/cyrillux-usemarcon-replacement/f07/expectedResult.json +25 -0
  260. package/test-fixtures/cyrillux-usemarcon-replacement/f07/metadata.json +7 -0
  261. package/test-fixtures/cyrillux-usemarcon-replacement/f07/record.json +8 -0
  262. package/test-fixtures/cyrillux-usemarcon-replacement/f08/expectedResult.json +34 -0
  263. package/test-fixtures/cyrillux-usemarcon-replacement/f08/metadata.json +6 -0
  264. package/test-fixtures/cyrillux-usemarcon-replacement/f08/record.json +33 -0
  265. package/test-fixtures/cyrillux-usemarcon-replacement/f09/expectedResult.json +35 -0
  266. package/test-fixtures/cyrillux-usemarcon-replacement/f09/metadata.json +6 -0
  267. package/test-fixtures/cyrillux-usemarcon-replacement/f09/record.json +35 -0
  268. package/test-fixtures/cyrillux-usemarcon-replacement/f10/expectedResult.json +41 -0
  269. package/test-fixtures/cyrillux-usemarcon-replacement/f10/metadata.json +7 -0
  270. package/test-fixtures/cyrillux-usemarcon-replacement/f10/record.json +33 -0
  271. package/test-fixtures/cyrillux-usemarcon-replacement/f11/expectedResult.json +32 -0
  272. package/test-fixtures/cyrillux-usemarcon-replacement/f11/metadata.json +6 -0
  273. package/test-fixtures/cyrillux-usemarcon-replacement/f11/record.json +22 -0
  274. package/test-fixtures/cyrillux-usemarcon-replacement/v01/expectedResult.json +7 -0
  275. package/test-fixtures/cyrillux-usemarcon-replacement/v01/metadata.json +6 -0
  276. package/test-fixtures/cyrillux-usemarcon-replacement/v01/record.json +20 -0
  277. package/test-fixtures/cyrillux-usemarcon-replacement/v02/expectedResult.json +5 -0
  278. package/test-fixtures/cyrillux-usemarcon-replacement/v02/metadata.json +6 -0
  279. package/test-fixtures/cyrillux-usemarcon-replacement/v02/record.json +29 -0
  280. package/test-fixtures/fix-33X/f11/expectedResult.json +29 -0
  281. package/test-fixtures/fix-33X/f11/metadata.json +6 -0
  282. package/test-fixtures/fix-33X/f11/record.json +22 -0
  283. package/test-fixtures/fix-33X/v11/expectedResult.json +9 -0
  284. package/test-fixtures/fix-33X/v11/metadata.json +6 -0
  285. package/test-fixtures/fix-33X/v11/record.json +22 -0
  286. package/test-fixtures/fix-language-codes/01/expectedResult.json +5 -0
  287. package/test-fixtures/fix-language-codes/01/metadata.json +6 -0
  288. package/test-fixtures/fix-language-codes/01/record.json +7 -0
  289. package/test-fixtures/fix-language-codes/02/expectedResult.json +7 -0
  290. package/test-fixtures/fix-language-codes/02/metadata.json +6 -0
  291. package/test-fixtures/fix-language-codes/02/record.json +10 -0
  292. package/test-fixtures/fix-language-codes/03/expectedResult.json +10 -0
  293. package/test-fixtures/fix-language-codes/03/metadata.json +6 -0
  294. package/test-fixtures/fix-language-codes/03/record.json +8 -0
  295. package/test-fixtures/fix-language-codes/04/expectedResult.json +9 -0
  296. package/test-fixtures/fix-language-codes/04/metadata.json +7 -0
  297. package/test-fixtures/fix-language-codes/04/record.json +7 -0
  298. package/test-fixtures/fix-language-codes/05/expectedResult.json +8 -0
  299. package/test-fixtures/fix-language-codes/05/metadata.json +6 -0
  300. package/test-fixtures/fix-language-codes/05/record.json +5 -0
  301. package/test-fixtures/punctuation2/95/expectedResult.json +22 -0
  302. package/test-fixtures/punctuation2/95/metadata.json +6 -0
  303. package/test-fixtures/punctuation2/95/record.json +20 -0
  304. package/test-fixtures/sanitize-vocabulary-source-codes/f03/expectedResult.json +143 -0
  305. package/test-fixtures/sanitize-vocabulary-source-codes/f03/metadata.json +9 -0
  306. package/test-fixtures/sanitize-vocabulary-source-codes/f03/record.json +145 -0
  307. package/test-fixtures/sanitize-vocabulary-source-codes/v03/expectedResult.json +5 -0
  308. package/test-fixtures/sanitize-vocabulary-source-codes/v03/metadata.json +6 -0
  309. package/test-fixtures/sanitize-vocabulary-source-codes/v03/record.json +145 -0
@@ -0,0 +1,132 @@
1
+ //import createDebugLogger from 'debug';
2
+ import {fieldToString, getCatalogingLanguage, nvdebug} from './utils';
3
+ import {getFormOfItem, map337CodeToTerm} from './field33XUtils';
4
+
5
+ const description = 'Add missing 337 field(s)';
6
+
7
+ // Based on https://github.com/NatLibFi/USEMARCON-Cyrillux/blob/master/008-23-337a.tbl . Extended!
8
+ const mappings337B = [
9
+ {formOfItem: ' ', rdacontent: 'n'}, // unmediated - käytettävissä ilman laitetta
10
+ {formOfItem: '|', rdacontent: 'n'},
11
+ {formOfItem: 'a', rdacontent: 'h'}, // microform
12
+ {formOfItem: 'b', rdacontent: 'h'},
13
+ {formOfItem: 'c', rdacontent: 'h'},
14
+ {formOfItem: 'd', rdacontent: 'n'},
15
+ {formOfItem: 'e', rdacontent: 'n'},
16
+ {formOfItem: 'f', rdacontent: 'n'},
17
+ {formOfItem: 'o', rdacontent: 'c'}, // computer
18
+ {formOfItem: 'q', rdacontent: 'c'},
19
+ {formOfItem: 'r', rdacontent: 'n'},
20
+ {formOfItem: 's', rdacontent: 'c'}
21
+ ];
22
+
23
+ export default function () {
24
+
25
+ return {
26
+ description, validate, fix
27
+ };
28
+
29
+ function fix(record) {
30
+ nvdebug(`FIX ${description}...`);
31
+ const newField = getMissing337(record);
32
+ const res = {message: [], fix: [], valid: true};
33
+ if (newField) {
34
+ record.insertField(newField);
35
+ return res;
36
+ }
37
+
38
+ return res;
39
+ }
40
+
41
+ function validate(record) {
42
+ nvdebug(`VALIDATE ${description}....`);
43
+ const newField = getMissing337(record);
44
+ if (!newField) {
45
+ return {message: [], valid: true};
46
+ }
47
+ const msg = `${description}: '${fieldToString(newField)}'`;
48
+ return {message: [msg], valid: false};
49
+ }
50
+
51
+ function guessObjectsMissing337B(record) {
52
+ const [field008] = record.get('008');
53
+ if (field008 && field008.value[33] === 'p') {
54
+ return 'p'; // microscopic
55
+ }
56
+ return 'n'; // unmediated
57
+ }
58
+
59
+ function guessMissing337B(record) {
60
+ const typeOfRecord = record.getTypeOfRecord();
61
+
62
+ if (typeOfRecord === 'm') { // LDR/06=m/computer file
63
+ return 'c'; // computer
64
+ }
65
+ if (typeOfRecord === 'o' || typeOfRecord === 'p') {
66
+ return 'x'; // other
67
+ }
68
+ if (typeOfRecord === 'r') { // object
69
+ return guessObjectsMissing337B(record);
70
+ }
71
+ const fields007 = record.get('007');
72
+
73
+ // TO DO: type a/t + 245$h (not multimedia): use 007/00 based expection
74
+
75
+ // 007/00 implies that 337$b=c (computer)
76
+ if (typeOfRecord === 'g' || typeOfRecord === 'i' || typeOfRecord === 'j') {
77
+ if (fields007.some(f => f.value[0] === 'c')) { // c=computer
78
+ // i and j: should we check 007/05 (audio)=a as well?
79
+ return 'c';
80
+ }
81
+ }
82
+
83
+ if (typeOfRecord === 'g') {
84
+ if (fields007.some(f => f.value[0] === 'g')) { // g=projected
85
+ return 'g';
86
+ }
87
+ if (fields007.some(f => f.value[0] === 'm' || f.value[0] === 'v')) { // m=movie, v=videorecording (cyrillux maps videorecording to 'c'/computer, fix it there?)
88
+ return 'v';
89
+ }
90
+ }
91
+
92
+ if (typeOfRecord === 'i' || typeOfRecord === 'j') {
93
+ // Ye olde stuff: 245$h might contain value 'Äänite', which returns 'a'.
94
+ // NB! Cyrillux returns 'c'/com a bit more aggressively for j (music)
95
+ return 's'; // audio
96
+ }
97
+
98
+ return mapFormOfItemToField337B(getFormOfItem(record));
99
+ }
100
+
101
+ function getMissing337(record) {
102
+ const [f337] = record.get('337');
103
+ if (f337) {
104
+ // nvdebug(fieldToString(f337));
105
+ return undefined;
106
+ }
107
+
108
+ const b = guessMissing337B(record) || 'z';
109
+
110
+ const catLang = getCatalogingLanguage(record);
111
+ const catLang2 = catLang ? catLang : 'fin';
112
+ const a = map337CodeToTerm(b, catLang2);
113
+
114
+ const data = {tag: '337', ind1: ' ', ind2: ' ', subfields: [
115
+ {code: 'a', value: a},
116
+ {code: 'b', value: b},
117
+ {code: '2', value: 'rdamedia'}
118
+ ]};
119
+
120
+ return data;
121
+ }
122
+ }
123
+
124
+ function mapFormOfItemToField337B(formOfItem) {
125
+ nvdebug(`mapping ${formOfItem} to 337$b`);
126
+
127
+ const [result] = mappings337B.filter(row => row.formOfItem === formOfItem);
128
+ if (result) {
129
+ return result.rdacontent;
130
+ }
131
+ return 'z'; // undefined; // How about 'z'/unspecified. Currently done
132
+ }
@@ -0,0 +1,45 @@
1
+ import {expect} from 'chai';
2
+ import {MarcRecord} from '@natlibfi/marc-record';
3
+ import validatorFactory from './addMissingField337';
4
+ import {READERS} from '@natlibfi/fixura';
5
+ import generateTests from '@natlibfi/fixugen';
6
+
7
+ generateTests({
8
+ callback,
9
+ path: [__dirname, '..', 'test-fixtures', 'addMissingField337'],
10
+ useMetadataFile: true,
11
+ recurse: false,
12
+ fixura: {
13
+ reader: READERS.JSON
14
+ },
15
+ mocha: {
16
+ before: () => testValidatorFactory()
17
+ }
18
+ });
19
+
20
+ async function testValidatorFactory() {
21
+ const validator = await validatorFactory();
22
+
23
+ expect(validator)
24
+ .to.be.an('object')
25
+ .that.has.any.keys('description', 'validate');
26
+
27
+ expect(validator.description).to.be.a('string');
28
+ expect(validator.validate).to.be.a('function');
29
+ expect(validator.fix).to.be.a('function');
30
+ }
31
+
32
+ async function callback({getFixture, fix = false}) {
33
+ const validator = await validatorFactory();
34
+ const record = new MarcRecord(getFixture('record.json'));
35
+ const expectedResult = getFixture('expectedResult.json');
36
+
37
+ if (!fix) {
38
+ const result = await validator.validate(record);
39
+ expect(result).to.eql(expectedResult);
40
+ return;
41
+ }
42
+
43
+ await validator.fix(record);
44
+ expect(record).to.eql(expectedResult);
45
+ }
@@ -0,0 +1,446 @@
1
+ //import createDebugLogger from 'debug';
2
+ import {fieldHasSubfield, fieldToString, getCatalogingLanguage, nvdebug} from './utils';
3
+ import {getFormOfItem, map338CodeToTerm} from './field33XUtils';
4
+
5
+ // Based mostly on USEMARCON-RDA. However, many things have been rethought, modernized etc.
6
+ const description = 'Add missing 338 field(s)';
7
+
8
+ export default function () {
9
+
10
+ return {
11
+ description, validate, fix
12
+ };
13
+
14
+ function fix(record) {
15
+ nvdebug(`FIX ${description}...`);
16
+ const newField = getMissing338(record);
17
+ const res = {message: [], fix: [], valid: true};
18
+
19
+ if (newField) {
20
+ record.insertField(newField);
21
+ return res;
22
+ }
23
+
24
+ return res;
25
+ }
26
+
27
+ function validate(record) {
28
+ nvdebug(`VALIDATE ${description}...`);
29
+ const newField = getMissing338(record);
30
+ if (newField) {
31
+ return {message: [], valid: true};
32
+ }
33
+ const msg = `${description}: '${fieldToString(newField)}'`;
34
+ return {message: [msg], valid: false};
35
+ }
36
+
37
+
38
+ function trimExtent(value) {
39
+ return value.replace(/\([^)]*\)/gu, '').replace(/\[[^\]*]\]/gu, '').replace(/[0-9]/gu, '').replace(/^ +/gu, '').replace(/[ :;+]+$/gu, '').replace(/ +/gu, ' ');
40
+ }
41
+
42
+ function extractExtent(record) {
43
+ const [f300] = record.get('300');
44
+ if (!f300) {
45
+ return undefined;
46
+ }
47
+ const [a] = f300.subfields.filter(sf => sf.code === 'a');
48
+ if (!a) {
49
+ return undefined;
50
+ }
51
+ return trimExtent(a.value);
52
+ }
53
+
54
+
55
+ function extentToAudioCarrierType(record) {
56
+ const extent = extractExtent(record); // trimmed 300$a
57
+ if (!extent) {
58
+ return undefined;
59
+ }
60
+ nvdebug(`AUDIO EXTENT: '${extent}`);
61
+ if (extent.match(/^(?:audio discs?|[^ ]*ljudskiva|[^ ]*ljudskivor|LP-levy|LP-levyä|LP-skiva|LP-skivor|[^ ]*äänilevy)$/iu)) {
62
+ return 'sd';
63
+ }
64
+ // Boldly assuming here that any cassette is audio
65
+ if (extent.match(/^(?:audiocasettes?|C-kas[^ ]*|DAT-as[^ ]*|kasettia?|kassett|kassetter|ljudkassett|ljudkassetter|äänikasettia?)$/ui)) {
66
+ return 'ss';
67
+ }
68
+
69
+ const typeOfRecord = record.getTypeOfRecord();
70
+ if (['i', 'j'].includes(typeOfRecord) || record.fields.some(f => f.tag === '007' && f.value[0] === 's')) {
71
+ if (extent.match(/^[^ ]*(?:levyä?|skiva|skivor)$/ui)) {
72
+ return 'sd';
73
+ }
74
+ if (extent.match(/^[^ ]*(?:cassettes?|kasettia?|kassett|kassetter)$/ui)) {
75
+ return 'ss';
76
+ }
77
+ }
78
+
79
+ return undefined;
80
+ }
81
+
82
+ function extentToComputerCarrierType(record, formOfItem = '?') {
83
+ const extent = extractExtent(record); // trimmed 300$a
84
+ if (extent) {
85
+ // What about USB etc?!?
86
+ if (extent.match(/^(?:computer chip cartridge|datorminnesmodul|piirikotelo)$/ui)) {
87
+ return 'cb'; // eg. Nintendo Switch games?
88
+ }
89
+ if (extent.match(/^(?:CD-ROM[^ ]*|levyke|levykettä)$/ui)) {
90
+ return 'cd';
91
+ }
92
+ // Might be a video as well, thus the formOfItem check:
93
+ if (['q', 's'].includes(formOfItem) && extent.match(/^(?:CD-levy|optinen levy|optisk skiva|optiska skivor|optista levyä)$/ui)) {
94
+ return 'cd';
95
+ }
96
+ if (extent.match(/^(?:computer card|datorkort|minneskort|muistikortti)[^ ]*$/u)) { // Melinda only muistikortti
97
+ return 'ck';
98
+ }
99
+ if (extent.match(/^(?:online resource|onlineresurs|verkkoaineisto)$/ui)) {
100
+ return 'cr';
101
+ }
102
+ }
103
+
104
+ return undefined;
105
+ }
106
+
107
+ function extentToMicroformCarrierType(record) {
108
+ const extent = extractExtent(record); // trimmed 300$a
109
+ if (!extent) {
110
+ return undefined;
111
+ }
112
+ // No instances in Melinda map to 'ha', 'hb', 'hc'
113
+
114
+ if (extent.match(/^(?:filmikorttia?|microfiches?|mikrokorttia?)$/ui)) {
115
+ // May be 'hg' as well? ("mikrokortti" vs "mikrokortti (läpinäkymätön)")
116
+ if (getFormOfItem(record) === 'c') {
117
+ return 'hg'; // Mikrokortti (läpinäkymätön)
118
+ }
119
+ return 'he';
120
+ }
121
+
122
+ if (extent.match(/^(?:microfilm rolls?|mikrofilmirullaa?(?: kelalla)?|mikrofilmsrullar|mikrofilmsrulle)$/ui)) {
123
+ return 'hj';
124
+ }
125
+
126
+
127
+ return undefined;
128
+ }
129
+
130
+ // extentToMicroscopicCarrierType not really needed
131
+
132
+ function extentToProjectedImageCarrierType(record) {
133
+ const extent = extractExtent(record); // trimmed 300$a
134
+ if (!extent) {
135
+ return undefined;
136
+ }
137
+ if (extent.match(/^(?:diaa?|diabild|diabilder|slides?)$/ui)) {
138
+ return 'gs';
139
+ }
140
+ if (extent.match(/^(?:overhead transparencies|overhead transparency|piirtoheitinkalvoa?|transparang|transparanger)$/ui)) {
141
+ return 'gt';
142
+ }
143
+ if (extent.match(/^(?:film rolls?|filmirullaa?|filmrullar|filmrulle)$/ui)) {
144
+ return 'mo';
145
+ }
146
+ return undefined;
147
+ }
148
+
149
+ // StereographicCarrierType not needed
150
+
151
+ function extentToUnmediatedCarrierType(record) {
152
+ const extent = extractExtent(record); // trimmed 300$a
153
+ if (!extent) {
154
+ return undefined;
155
+ }
156
+
157
+ return undefined;
158
+ }
159
+
160
+ function extentToVideoCarrierType(record) {
161
+ const extent = extractExtent(record); // trimmed 300$a
162
+ if (!extent) {
163
+ return undefined;
164
+ }
165
+ // DVD-videoskivor etc
166
+ if (extent.match(/^[^ ]*(?:videodiscs?|videolevyä?|videoskiva|videoskivor)$/ui)) {
167
+ return 'vd';
168
+ }
169
+ if (extent.match(/^(?:videocassettes?|videokassett|videokassetter|videokasettia?)$/ui) || extent.match(/^(?:VHS)/ui)) {
170
+ return 'vf';
171
+ }
172
+ return undefined;
173
+ }
174
+
175
+ function extentToCarrierType(record) {
176
+ nvdebug(`EXTENT2CARRIERTYPE`);
177
+ return extentToAudioCarrierType(record) ||
178
+ extentToComputerCarrierType(record) ||
179
+ extentToMicroformCarrierType(record) ||
180
+ // Microscopic carriers don't really exist in our data
181
+ extentToProjectedImageCarrierType(record) ||
182
+ // Stereographic carriers don't really exist in our data
183
+ extentToUnmediatedCarrierType(record) ||
184
+ extentToVideoCarrierType(record);
185
+ }
186
+
187
+ function getComputerCarrierType(record) {
188
+ const formOfItem = getFormOfItem(record);
189
+
190
+ if (formOfItem === 'o') { // Online resource
191
+ return 'cr';
192
+ }
193
+
194
+ const typeOfRecord = record.getTypeOfRecord();
195
+
196
+ if (typeOfRecord !== 'm') {
197
+ if (!['o', 'q', 's'].includes(formOfItem)) { // (Actually 'o' was already handled.) Probably not a computer carrier type
198
+ return undefined;
199
+ }
200
+ }
201
+
202
+ /* After re-reading, this seems illegal
203
+ if (typeOfRecord === 'm') {
204
+ const f007 = record.get('007');
205
+ if (f007.length === 1) {
206
+ // ca: none, cb: 10 or so, probably errors (typically USB)
207
+ if (f007[0].value[0] === 'c' && f007[0].value[1] === 'o') {
208
+ return 'cd';
209
+ }
210
+ }
211
+ }
212
+ */
213
+
214
+ // Check fields 300$a (extent), 256$a (computer file characteristics), 516$a (type of computer file or data note), and possible 245$h (medium)
215
+ const formOfItem2 = typeOfRecord === 'm' && formOfItem === '|' ? 's' : formOfItem; // handle '|'
216
+ const cand = extentToComputerCarrierType(record, formOfItem2);
217
+ if (cand) {
218
+ return cand;
219
+ }
220
+
221
+ return undefined;
222
+ }
223
+
224
+ function getMicroformCarrierType(record) {
225
+ const f007 = record.get('007');
226
+ if (f007.length === 1 && f007[0].value[0] === 'h') {
227
+ const materialDesignation = f007[0].value.charAt(1);
228
+ // 007/00-01 does not seem exactly trustworthy, but can't blame us for crappy metadata...
229
+ if (['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j'].includes(materialDesignation)) {
230
+ return `h${materialDesignation}`;
231
+ }
232
+ }
233
+
234
+ const formOfItem = getFormOfItem(record);
235
+ const cand = extentToMicroformCarrierType(record, formOfItem);
236
+ if (cand) {
237
+ return cand;
238
+ }
239
+
240
+ return undefined;
241
+ }
242
+
243
+ function isUnmediatedVolume(record) { // Volume/Nide
244
+ const typeOfRecord = record.getTypeOfRecord();
245
+ if (!['a', 'c', 'e', 't'].includes(typeOfRecord)) {
246
+ return false;
247
+ }
248
+ const fields337 = record.get('337');
249
+ if (!fields337 || !fields337.some(f => fieldHasSubfield(f, 'b', 'n'))) {
250
+ return false;
251
+ }
252
+
253
+ const fields336 = record.get('336');
254
+
255
+ if (fields336 && fields336.some(f => f.subfields.some(sf => sf.code === 'b' && ['txt', 'cri'].includes(sf.value)))) {
256
+ return 'nc'; // HANDLE ARKKI! ETC...
257
+ }
258
+ // Add 300$a value-based guesses?
259
+ return false;
260
+ }
261
+
262
+ function formOfItemToField338(record) {
263
+ const formOfItem = getFormOfItem(record);
264
+ if (formOfItem === 'a') {
265
+ // The only notable exception found in Melinda's tag=300 fields:
266
+ if (record.get('300').some(f => f.subfields.some(sf => sf.code === 'a' && sf.value.match(/mikrofilmikela/iu)))) {
267
+ return 'hd';
268
+ }
269
+ // Empically observed default in Melinda:
270
+ return 'hj'; // mikrofilmirulla
271
+ }
272
+ if (formOfItem === 'b') { // mikrokortti
273
+ return 'he';
274
+ }
275
+ if (formOfItem === 'c') { // Deviates from usemarcon-bookwhere-rda. Fix it? Check data?
276
+ return 'hg'; // Mikrokortti (läpinäkymätön). We have none in Melinda it seems... Add test?
277
+ }
278
+ // 'd' isoteksti
279
+ // 'e' sanomalehti (for CR only)
280
+ // 'f' pistekirjoitus
281
+ if (formOfItem === 'o') { // online resource
282
+ return 'cr'; // already handled elsewhere, but keep this here as well
283
+ }
284
+ // 'q' local electronic stuff, use 300 et al to guess. Implemented elsewhere.
285
+ // 'r' painojäljenne, arkki vs nide?
286
+ // 's' electronic (might be local or online). Implemented elsewhere.
287
+ return undefined;
288
+ }
289
+
290
+ function audioToField338(record) {
291
+ nvdebug('AUDIO-TO-338');
292
+ const typeOfRecord = record.getTypeOfRecord(record);
293
+ if (typeOfRecord !== 'i' && typeOfRecord !== 'j') {
294
+ return undefined;
295
+ }
296
+ const f007 = record.get('007');
297
+ if (f007.length === 1 && f007[0].value[0] === 's') {
298
+ const materialDesignation = f007[0].value.charAt(1);
299
+ if (['d', 'e', 's', 't'].includes(materialDesignation)) {
300
+ return `s${materialDesignation}`;
301
+ }
302
+ // 007/00-01 sr implies online resource, but we'll probably figure it out anyways
303
+ }
304
+
305
+ const extentToCode = extentToAudioCarrierType(record); // field 300
306
+ if (extentToCode) {
307
+ return extentToCode;
308
+ }
309
+
310
+ return undefined;
311
+ }
312
+
313
+ function projectedToField338(record) {
314
+ const typeOfRecord = record.getTypeOfRecord(record);
315
+ if (typeOfRecord !== 'g') { // must be "projected"
316
+ return undefined;
317
+ }
318
+
319
+ const f007 = record.get('007');
320
+ if (f007.length === 1) {
321
+ if (f007[0].value[0] === 'g') {
322
+ const materialDesignation = f007[0].value.charAt(1);
323
+ if (['c', 'd', 'f', 's', 't'].includes(materialDesignation)) {
324
+ return `g${materialDesignation}`;
325
+ }
326
+ if (materialDesignation === 'o') {
327
+ return 'gf';
328
+ }
329
+ }
330
+ if (f007[0].value[0] === 'v') {
331
+ const materialDesignation = f007[0].value.charAt(1);
332
+ if (['c', 'd', 'f', 'r'].includes(materialDesignation)) {
333
+ return `v${materialDesignation}`;
334
+ }
335
+ }
336
+ }
337
+
338
+ const extentToCode = extentToVideoCarrierType(record) || extentToProjectedImageCarrierType(record); // field 300
339
+ if (extentToCode) {
340
+ return extentToCode;
341
+ }
342
+
343
+ return undefined;
344
+ }
345
+
346
+ function objectToField338(record) {
347
+ const typeOfRecord = record.getTypeOfRecord(record);
348
+ if (typeOfRecord === 'r') {
349
+ // The only subdivision might be card/no. Marginal, so I'm not checking that now.
350
+ return 'nr';
351
+ }
352
+
353
+ return undefined;
354
+ }
355
+
356
+ function educatedGuessIsOnlineResource(record) {
357
+ const fields856 = record.get('856');
358
+
359
+ if (fields856.some(f => f.ind1 === '4' && f.ind2 === '0')) {
360
+ return 'cr';
361
+ }
362
+
363
+ return undefined;
364
+ }
365
+
366
+ function checkQualifyingInformation(record) {
367
+ const identifierFields = record.get('(?:015|020|024|028)').filter(f => f.subfields.some(sf => sf.code === 'q'));
368
+ if (identifierFields.some(f => f.subfields.some(sf => sf.code === 'q' && sf.value.match(/\b(?:hard-?cover|kierre|nid|sid|kovakant|pehmeäkant|pärmar)/iu)))) {
369
+ return 'nc';
370
+ }
371
+ return undefined;
372
+ }
373
+
374
+ function educatedGuessToCarrierType(record) {
375
+
376
+
377
+ return checkQualifyingInformation(record) || educatedGuessIsOnlineResource(record) || finalFallback();
378
+
379
+
380
+ function finalFallback() {
381
+ const [f337] = record.get('337');
382
+ if (f337) {
383
+ if (f337.subfields.some(sf => sf.code === 'b' && sf.value === 'n')) { // unmediated
384
+ // As we are a library, most of the stuff are books
385
+ return 'nc';
386
+ }
387
+ }
388
+ return undefined;
389
+ }
390
+
391
+
392
+ }
393
+
394
+ function guessMissing338B(record) {
395
+ // Data sources (which should be trusted most?)
396
+ // LDR/06
397
+ // 007
398
+ // 008/form of item
399
+ // 300
400
+ // 256
401
+ // 516
402
+ // 245$h...
403
+ // First use form of item?
404
+ return getComputerCarrierType(record) || // LDR/06=m (and 007 and 300)
405
+ objectToField338(record) || // LDR/06=r
406
+ audioToField338(record) || // LDR/06=i/j (and 007 and 300)
407
+ projectedToField338(record) || // ...
408
+ formOfItemToField338(record) || // 'a' 'b', 'c', 'o'
409
+ getMicroformCarrierType(record) ||
410
+ isUnmediatedVolume(record) ||
411
+ extentToCarrierType(record) || // fallback: field 300-based guess
412
+ educatedGuessToCarrierType(record); // 337$b='n' (käytettävissä ilman laitetta) -> nc
413
+
414
+ /*
415
+ const firstFunction = guessFunctions.find(f => f(record));
416
+ if (firstFunction) {
417
+ return firstFunction(record);
418
+ }
419
+
420
+ return undefined;
421
+ */
422
+ }
423
+
424
+ function getMissing338(record) {
425
+ // Field 773 and 973 means that the record is a component record, and doesn't need field 338.
426
+ // This will return only a single value. Multivalues must be handled before this...
427
+ if (record.fields.some(f => ['338', '773', '973'].includes(f.tag))) {
428
+ return undefined;
429
+ }
430
+
431
+ const b = guessMissing338B(record) || 'zu';
432
+
433
+ const catLang = getCatalogingLanguage(record) || 'fin';
434
+ const a = map338CodeToTerm(b, catLang);
435
+ const a2 = a ? a : 'z'; // unspecified
436
+
437
+ const data = {tag: '338', ind1: ' ', ind2: ' ', subfields: [
438
+ {code: 'a', value: a2},
439
+ {code: 'b', value: b},
440
+ {code: '2', value: 'rdacarrier'}
441
+ ]};
442
+
443
+ return data;
444
+ }
445
+ }
446
+
@@ -0,0 +1,46 @@
1
+ import {expect} from 'chai';
2
+ import {MarcRecord} from '@natlibfi/marc-record';
3
+ import validatorFactory from './addMissingField338';
4
+ import {READERS} from '@natlibfi/fixura';
5
+ import generateTests from '@natlibfi/fixugen';
6
+
7
+ generateTests({
8
+ callback,
9
+ path: [__dirname, '..', 'test-fixtures', 'addMissingField338'],
10
+ useMetadataFile: true,
11
+ recurse: false,
12
+ fixura: {
13
+ reader: READERS.JSON
14
+ },
15
+ mocha: {
16
+ before: () => testValidatorFactory()
17
+ }
18
+ });
19
+
20
+ async function testValidatorFactory() {
21
+ const validator = await validatorFactory();
22
+
23
+ expect(validator)
24
+ .to.be.an('object')
25
+ .that.has.any.keys('description', 'validate');
26
+
27
+ expect(validator.description).to.be.a('string');
28
+ expect(validator.validate).to.be.a('function');
29
+ expect(validator.fix).to.be.a('function');
30
+ }
31
+
32
+ async function callback({getFixture, fix = false}) {
33
+ const validator = await validatorFactory();
34
+ const record = new MarcRecord(getFixture('record.json'));
35
+ const expectedResult = getFixture('expectedResult.json');
36
+ // console.log(expectedResult); // eslint-disable-line
37
+
38
+ if (!fix) {
39
+ const result = await validator.validate(record);
40
+ expect(result).to.eql(expectedResult);
41
+ return;
42
+ }
43
+
44
+ await validator.fix(record);
45
+ expect(record).to.eql(expectedResult);
46
+ }