@natlibfi/marc-record-validators-melinda 11.0.0 → 11.1.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 (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
@@ -1 +1 @@
1
- {"version":3,"file":"resolvable-ext-references-melinda.spec.js","names":["_chai","_interopRequireDefault","require","_chaiAsPromised","_marcRecord","_fetchMock","testContext","_interopRequireWildcard","_resolvableExtReferencesMelinda2","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","obj","expect","chai","use","chaiAsPromised","endpoint","queryParam","prefixPattern","fields","describe","afterEach","__ResetDependency__","it","validator","to","be","an","that","any","keys","description","validate","rejectedWith","Error","mock","fetchMock","sandbox","fixture5000","fixture9550","__Rewire__","record","MarcRecord","tag","value","subfields","code","result","eql","valid","messages","fixture1000"],"sources":["../src/resolvable-ext-references-melinda.spec.js"],"sourcesContent":["import chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport fetchMock from 'fetch-mock';\nimport * as testContext from '../src/resolvable-ext-references-melinda';\nimport {fixture5000, fixture9550, fixture1000} from '../test-fixtures/resolvable-ext-references-melinda';\n\nconst {expect} = chai;\nchai.use(chaiAsPromised);\n\nconst endpoint = 'http://melinda.kansalliskirjasto.fi:210/fin01';\nconst queryParam = '?operation=searchRetrieve&maximumRecords=2&version=1&query=rec.id=';\nconst prefixPattern = /^\\(FOOBAR\\)/u;\nconst fields = {\n 773: ['w'],\n 833: ['w', 'p']\n};\n\ndescribe('resolvable-ext-references-melinda', () => {\n afterEach(() => {\n testContext.default.__ResetDependency__('fetch');\n });\n\n it('Creates a validator', async () => {\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n it('Throws an error when prefixPattern not provided', async () => {\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n // Cannot read property 'fields' of undefined or Cannot read properties of undefined (reading 'fields')'\n await expect(validator.validate()).to.be.rejectedWith(Error, /^Cannot read propert/u);\n });\n\n describe('#validate', () => {\n it('Finds prefixPattern on record and removes it', async () => {\n const mock = fetchMock.sandbox();\n mock.get(`${endpoint}${queryParam}5000`, fixture5000);\n mock.get(`${endpoint}${queryParam}9550`, fixture9550);\n\n testContext.default.__Rewire__('fetch', mock);\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '123456'\n },\n {\n tag: '035',\n subfields: [\n {\n code: 'a',\n value: '(FI-MELINDA)123456'\n }\n ]\n },\n {\n tag: '773',\n subfields: [\n {\n code: 'w',\n value: '(FOOBAR)5000'\n }\n ]\n },\n {\n tag: '833',\n subfields: [\n {\n code: 'p',\n value: '(FOOBAR)9550'\n },\n {\n code: 'c',\n value: '(FI-MELINDA)8850'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: true, messages: []});\n });\n\n it('Finds no matching prefixPattern on record', async () => {\n const mock = fetchMock.sandbox();\n\n mock.get(`${endpoint}5000`, fixture5000);\n\n testContext.default.__Rewire__('fetch', mock);\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '123456'\n },\n {\n tag: '035',\n subfields: [\n {\n code: 'a',\n value: '(FI-MELINDA)123456'\n }\n ]\n },\n {\n tag: '773',\n subfields: [\n {\n code: 'w',\n value: '(FI-MELINDA)123456'\n }\n ]\n },\n {\n tag: '833',\n subfields: [\n {\n code: 'p',\n value: '(FI-MELINDA)2620'\n },\n {\n code: 'w',\n value: '(FI-MELINDA)8850'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: true, messages: []});\n });\n\n it('Finds prefixPattern on record but values not resolvable', async () => {\n const mock = fetchMock.sandbox();\n mock.get(`${endpoint}${queryParam}1000`, fixture1000);\n\n testContext.default.__Rewire__('fetch', mock);\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '123456'\n },\n {\n tag: '035',\n subfields: [\n {\n code: 'a',\n value: '(FI-MELINDA)123456'\n }\n ]\n },\n {\n tag: '773',\n subfields: [\n {\n code: 'w',\n value: '(FOOBAR)1000'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: false, messages: ['Field 773$w with value 1000 is not resolvable']});\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"resolvable-ext-references-melinda.spec.js","names":["_chai","_interopRequireDefault","require","_chaiAsPromised","_marcRecord","_fetchMock","testContext","_interopRequireWildcard","_resolvableExtReferencesMelinda2","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","obj","expect","chai","use","chaiAsPromised","endpoint","queryParam","prefixPattern","fields","describe","afterEach","__ResetDependency__","it","validator","to","be","an","that","any","keys","description","validate","rejectedWith","Error","mock","fetchMock","sandbox","fixture5000","fixture9550","__Rewire__","record","MarcRecord","tag","value","subfields","code","result","eql","valid","messages","fixture1000"],"sources":["../src/resolvable-ext-references-melinda.spec.js"],"sourcesContent":["import chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport fetchMock from 'fetch-mock';\nimport * as testContext from '../src/resolvable-ext-references-melinda';\nimport {fixture5000, fixture9550, fixture1000} from '../test-fixtures/resolvable-ext-references-melinda';\n\nconst {expect} = chai;\nchai.use(chaiAsPromised);\n\nconst endpoint = 'http://melinda.kansalliskirjasto.fi:210/fin01';\nconst queryParam = '?operation=searchRetrieve&maximumRecords=2&version=1&query=rec.id=';\nconst prefixPattern = /^\\(FOOBAR\\)/u;\nconst fields = {\n 773: ['w'],\n 833: ['w', 'p']\n};\n\ndescribe('resolvable-ext-references-melinda', () => {\n afterEach(() => {\n testContext.default.__ResetDependency__('fetch');\n });\n\n it('Creates a validator', async () => {\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n });\n\n it('Throws an error when prefixPattern not provided', async () => {\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n // Cannot read property 'fields' of undefined or Cannot read properties of undefined (reading 'fields')'\n await expect(validator.validate()).to.be.rejectedWith(Error, /^Cannot read propert/u);\n });\n\n describe('#validate', () => {\n it('Finds prefixPattern on record and removes it', async () => {\n const mock = fetchMock.sandbox();\n mock.get(`${endpoint}${queryParam}5000`, fixture5000);\n mock.get(`${endpoint}${queryParam}9550`, fixture9550);\n\n testContext.default.__Rewire__('fetch', mock);\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '123456'\n },\n {\n tag: '035',\n subfields: [\n {\n code: 'a',\n value: '(FI-MELINDA)123456'\n }\n ]\n },\n {\n tag: '773',\n subfields: [\n {\n code: 'w',\n value: '(FOOBAR)5000'\n }\n ]\n },\n {\n tag: '833',\n subfields: [\n {\n code: 'p',\n value: '(FOOBAR)9550'\n },\n {\n code: 'c',\n value: '(FI-MELINDA)8850'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: true, messages: []});\n });\n\n it('Finds no matching prefixPattern on record', async () => {\n const mock = fetchMock.sandbox();\n\n mock.get(`${endpoint}5000`, fixture5000);\n\n testContext.default.__Rewire__('fetch', mock);\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '123456'\n },\n {\n tag: '035',\n subfields: [\n {\n code: 'a',\n value: '(FI-MELINDA)123456'\n }\n ]\n },\n {\n tag: '773',\n subfields: [\n {\n code: 'w',\n value: '(FI-MELINDA)123456'\n }\n ]\n },\n {\n tag: '833',\n subfields: [\n {\n code: 'p',\n value: '(FI-MELINDA)2620'\n },\n {\n code: 'w',\n value: '(FI-MELINDA)8850'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: true, messages: []});\n });\n\n it('Finds prefixPattern on record but values not resolvable', async () => {\n const mock = fetchMock.sandbox();\n mock.get(`${endpoint}${queryParam}1000`, fixture1000);\n\n testContext.default.__Rewire__('fetch', mock);\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '123456'\n },\n {\n tag: '035',\n subfields: [\n {\n code: 'a',\n value: '(FI-MELINDA)123456'\n }\n ]\n },\n {\n tag: '773',\n subfields: [\n {\n code: 'w',\n value: '(FOOBAR)1000'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: false, messages: ['Field 773$w with value 1000 is not resolvable']});\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -24,23 +24,23 @@ function _default() {
24
24
  fix: [],
25
25
  valid: true
26
26
  };
27
- record.fields.forEach(f => fieldSanitizeVocabularySourceCode(f));
27
+ const relevantFields = getRelevantFields(record);
28
+ relevantFields.forEach(f => fieldSanitizeVocabularySourceCode(f));
28
29
  return res;
29
30
  }
30
31
  function validate(record) {
31
32
  const res = {
32
33
  message: []
33
34
  };
34
- record.fields.forEach(field => {
35
- validateField(field, res);
36
- });
35
+ const relevantFields = getRelevantFields(record);
36
+ relevantFields.forEach(field => validateField(field, res));
37
37
  res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data
38
38
  return res;
39
39
  }
40
+ function getRelevantFields(record) {
41
+ return record.fields.filter(f => f.subfields && f.tag.match(/^(?:6..|257|370|38.)$/u));
42
+ }
40
43
  function validateField(field, res) {
41
- if (!field.subfields) {
42
- return;
43
- }
44
44
  const orig = (0, _utils.fieldToString)(field);
45
45
  const normalizedField = fieldSanitizeVocabularySourceCode((0, _clone.default)(field));
46
46
  const mod = (0, _utils.fieldToString)(normalizedField);
@@ -57,9 +57,6 @@ function _default() {
57
57
  return;
58
58
  }
59
59
  function fieldSanitizeVocabularySourceCode(field) {
60
- if (!field.tag.match(/^(?:6..|257|370|38.)$/u)) {
61
- return field;
62
- }
63
60
  field.subfields.forEach(sf => subfieldSanitizeVocabularySourceCode(sf));
64
61
  return field;
65
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize-vocabulary-source-codes.js","names":["_utils","require","_clone","_interopRequireDefault","obj","__esModule","default","_default","description","validate","fix","record","res","message","valid","fields","forEach","f","fieldSanitizeVocabularySourceCode","field","validateField","length","subfields","orig","fieldToString","normalizedField","clone","mod","push","fieldHasUnfixableVocabularySourceCode","tag","match","sf","subfieldSanitizeVocabularySourceCode","subfield","code","value","stringFixVocabularySourceCode","legalSubfieldCode","tmp","replace","includes","some","subfieldHasUnfixableVocabularySourceCode","indexOf"],"sources":["../src/sanitize-vocabulary-source-codes.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils';\nimport clone from 'clone';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes);\n\n// Author(s): Nicholas Volk, Joni Ollila\nexport default function () {\n\n return {\n description: 'Validator for sanitizing vocabulary source codes in subfield $2 (MRA-532)',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n record.fields.forEach(f => fieldSanitizeVocabularySourceCode(f));\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n record.fields.forEach(field => {\n validateField(field, res);\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validateField(field, res) {\n if (!field.subfields) {\n return;\n }\n const orig = fieldToString(field);\n\n const normalizedField = fieldSanitizeVocabularySourceCode(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`FIXABLE: '${orig}' => '${mod}'`); // eslint-disable-line functional/immutable-data\n return;\n }\n // Handle illegal values here\n if (fieldHasUnfixableVocabularySourceCode(field)) {\n res.message.push(`CAN'T BE FIXED AUTOMATICALLY: '${orig}'`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n\n function fieldSanitizeVocabularySourceCode(field) {\n if (!field.tag.match(/^(?:6..|257|370|38.)$/u)) {\n return field;\n }\n\n field.subfields.forEach(sf => subfieldSanitizeVocabularySourceCode(sf));\n return field;\n }\n\n function subfieldSanitizeVocabularySourceCode(subfield) {\n if (subfield.code !== '2') {\n return;\n }\n subfield.value = stringFixVocabularySourceCode(subfield.value); // eslint-disable-line functional/immutable-data\n }\n\n}\n\n// Note that language suffix is optional\nconst legalSubfieldCode = ['allars', 'kauno', 'kauno/fin', 'kauno/swe', 'mts', 'mts/fin', 'mts/swe', 'slm', 'slm/fin', 'slm/swe', 'ysa', 'yso', 'yso/eng', 'yso/fin', 'yso/sme', 'yso/swe'];\n\nfunction stringFixVocabularySourceCode(value) {\n // Try to remove spaces, change '//' to '/' and remove final '.' and '/':\n const tmp = value.replace(/ /ug, '')\n .replace(/\\/+/ug, '/')\n .replace(/(.)[./]$/gu, '$1') // eslint-disable-line prefer-named-capture-group\n .replace(/^yso-(?:aika|paikat)\\//u, 'yso/'); // IMP-HELMET crap. Also, they still have a '.' at the end of $a...\n\n // NB! Use the modified value ONLY if the result (tmp variable) is a legal subfield code...\n if (legalSubfieldCode.includes(tmp)) {\n return tmp;\n }\n\n return value;\n}\n\nfunction fieldHasUnfixableVocabularySourceCode(field) {\n return field.subfields.some(sf => subfieldHasUnfixableVocabularySourceCode(sf));\n}\n\nfunction subfieldHasUnfixableVocabularySourceCode(subfield) {\n // As we can't fix this here, apply this yso-rule only when validating!\n if (subfield.value.indexOf('yso/') === 0) {\n return !['yso/eng', 'yso/fin', 'yso/sme', 'yso/swe'].includes(subfield.value);\n }\n\n if (subfield.value.indexOf('slm/') === 0) {\n return !['slm/fin', 'slm/swe'].includes(subfield.value);\n }\n\n if (subfield.value.indexOf('mts/') === 0) {\n return !['mts/fin', 'mts/swe'].includes(subfield.value);\n }\n\n if (subfield.value.indexOf('kauno/') === 0) {\n return !['kauno/fin', 'kauno/swe'].includes(subfield.value);\n }\n\n return false;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"sanitize-vocabulary-source-codes.js","names":["_utils","require","_clone","_interopRequireDefault","obj","__esModule","default","_default","description","validate","fix","record","res","message","valid","relevantFields","getRelevantFields","forEach","f","fieldSanitizeVocabularySourceCode","field","validateField","length","fields","filter","subfields","tag","match","orig","fieldToString","normalizedField","clone","mod","push","fieldHasUnfixableVocabularySourceCode","sf","subfieldSanitizeVocabularySourceCode","subfield","code","value","stringFixVocabularySourceCode","legalSubfieldCode","tmp","replace","includes","some","subfieldHasUnfixableVocabularySourceCode","indexOf"],"sources":["../src/sanitize-vocabulary-source-codes.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils';\nimport clone from 'clone';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes);\n\n// Author(s): Nicholas Volk, Joni Ollila\nexport default function () {\n\n return {\n description: 'Validator for sanitizing vocabulary source codes in subfield $2 (MRA-532)',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n const relevantFields = getRelevantFields(record);\n relevantFields.forEach(f => fieldSanitizeVocabularySourceCode(f));\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n const relevantFields = getRelevantFields(record);\n\n relevantFields.forEach(field => validateField(field, res));\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function getRelevantFields(record) {\n return record.fields.filter(f => f.subfields && f.tag.match(/^(?:6..|257|370|38.)$/u));\n }\n\n function validateField(field, res) {\n const orig = fieldToString(field);\n\n const normalizedField = fieldSanitizeVocabularySourceCode(clone(field));\n const mod = fieldToString(normalizedField);\n if (orig !== mod) { // Fail as the input is \"broken\"/\"crap\"/sumthing\n res.message.push(`FIXABLE: '${orig}' => '${mod}'`); // eslint-disable-line functional/immutable-data\n return;\n }\n // Handle illegal values here\n if (fieldHasUnfixableVocabularySourceCode(field)) {\n res.message.push(`CAN'T BE FIXED AUTOMATICALLY: '${orig}'`); // eslint-disable-line functional/immutable-data\n return;\n }\n return;\n }\n\n\n function fieldSanitizeVocabularySourceCode(field) {\n field.subfields.forEach(sf => subfieldSanitizeVocabularySourceCode(sf));\n return field;\n }\n\n function subfieldSanitizeVocabularySourceCode(subfield) {\n if (subfield.code !== '2') {\n return;\n }\n subfield.value = stringFixVocabularySourceCode(subfield.value); // eslint-disable-line functional/immutable-data\n }\n\n}\n\n// Note that language suffix is optional\nconst legalSubfieldCode = ['allars', 'kauno', 'kauno/fin', 'kauno/swe', 'mts', 'mts/fin', 'mts/swe', 'slm', 'slm/fin', 'slm/swe', 'ysa', 'yso', 'yso/eng', 'yso/fin', 'yso/sme', 'yso/swe'];\n\nfunction stringFixVocabularySourceCode(value) {\n // Try to remove spaces, change '//' to '/' and remove final '.' and '/':\n const tmp = value.replace(/ /ug, '')\n .replace(/\\/+/ug, '/')\n .replace(/(.)[./]$/gu, '$1') // eslint-disable-line prefer-named-capture-group\n .replace(/^yso-(?:aika|paikat)\\//u, 'yso/'); // IMP-HELMET crap. Also, they still have a '.' at the end of $a...\n\n // NB! Use the modified value ONLY if the result (tmp variable) is a legal subfield code...\n if (legalSubfieldCode.includes(tmp)) {\n return tmp;\n }\n\n return value;\n}\n\nfunction fieldHasUnfixableVocabularySourceCode(field) {\n return field.subfields.some(sf => subfieldHasUnfixableVocabularySourceCode(sf));\n}\n\nfunction subfieldHasUnfixableVocabularySourceCode(subfield) {\n // As we can't fix this here, apply this yso-rule only when validating!\n if (subfield.value.indexOf('yso/') === 0) {\n return !['yso/eng', 'yso/fin', 'yso/sme', 'yso/swe'].includes(subfield.value);\n }\n\n if (subfield.value.indexOf('slm/') === 0) {\n return !['slm/fin', 'slm/swe'].includes(subfield.value);\n }\n\n if (subfield.value.indexOf('mts/') === 0) {\n return !['mts/fin', 'mts/swe'].includes(subfield.value);\n }\n\n if (subfield.value.indexOf('kauno/') === 0) {\n return !['kauno/fin', 'kauno/swe'].includes(subfield.value);\n }\n\n return false;\n}\n"],"mappings":"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","ignoreList":[]}
package/dist/utils.js CHANGED
@@ -11,15 +11,12 @@ exports.isControlSubfieldCode = isControlSubfieldCode;
11
11
  exports.isElectronicMaterial = isElectronicMaterial;
12
12
  exports.nvdebug = nvdebug;
13
13
  exports.nvdebugFieldArray = nvdebugFieldArray;
14
+ exports.recordToString = recordToString;
14
15
  exports.subfieldToString = subfieldToString;
15
16
  exports.uniqArray = uniqArray;
16
17
  function isElectronicMaterial(record) {
17
18
  const f337s = record.get('337');
18
- return f337s.some(field => {
19
- const mediaTypeIsC = field.subfields.some(sub => sub.code === 'b' && sub.value === 'c');
20
- const sourceIsRdamedia = field.subfields.some(sub => sub.code === '2' && sub.value === 'rdamedia');
21
- return mediaTypeIsC && sourceIsRdamedia;
22
- });
19
+ return f337s.length > 0 && f337s.some(f => fieldHasSubfield(f, 'b', 'c') && fieldHasSubfield(f, '2', 'rdamedia'));
23
20
  }
24
21
  function nvdebug(message, func = undefined) {
25
22
  if (func) {
@@ -38,6 +35,9 @@ function fieldHasSubfield(field, subfieldCode, subfieldValue = null) {
38
35
  return field.subfields.some(sf => sf.code === subfieldCode && subfieldValue === sf.value);
39
36
  }
40
37
  function subfieldToString(sf) {
38
+ if (!sf.value) {
39
+ return `‡${sf.code}`;
40
+ }
41
41
  return `‡${sf.code} ${sf.value}`;
42
42
  }
43
43
  function normalizeIndicatorValue(val) {
@@ -46,6 +46,11 @@ function normalizeIndicatorValue(val) {
46
46
  }
47
47
  return val;
48
48
  }
49
+ function recordToString(record) {
50
+ const ldr = `LDR ${record.leader}`;
51
+ const fields = record.fields.map(f => fieldToString(f));
52
+ return `${ldr}\n${fields.join('\n')}`;
53
+ }
49
54
  function fieldToString(f) {
50
55
  if ('subfields' in f) {
51
56
  return `${f.tag} ${normalizeIndicatorValue(f.ind1)}${normalizeIndicatorValue(f.ind2)}${formatSubfields(f)}`;
@@ -67,14 +72,14 @@ function isControlSubfieldCode(subfieldCode) {
67
72
  }
68
73
  return false;
69
74
  }
70
- function getCatalogingLanguage(record) {
75
+ function getCatalogingLanguage(record, defaultCatalogingLanguage = undefined) {
71
76
  const [field040] = record.get(/^040$/u);
72
77
  if (!field040) {
73
- return null;
78
+ return defaultCatalogingLanguage;
74
79
  }
75
80
  const [b] = field040.subfields.filter(sf => sf.code === 'b');
76
81
  if (!b) {
77
- return null;
82
+ return defaultCatalogingLanguage;
78
83
  }
79
84
  return b.value;
80
85
  }
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["isElectronicMaterial","record","f337s","get","some","field","mediaTypeIsC","subfields","sub","code","value","sourceIsRdamedia","nvdebug","message","func","undefined","fieldHasSubfield","subfieldCode","subfieldValue","sf","subfieldToString","normalizeIndicatorValue","val","fieldToString","f","tag","ind1","ind2","formatSubfields","map","join","fieldsToString","fields","nvdebugFieldArray","prefix","forEach","isControlSubfieldCode","includes","getCatalogingLanguage","field040","b","filter","uniqArray","arr","i","indexOf"],"sources":["../src/utils.js"],"sourcesContent":["export function isElectronicMaterial(record) {\n const f337s = record.get('337');\n\n return f337s.some(field => {\n const mediaTypeIsC = field.subfields.some(sub => sub.code === 'b' && sub.value === 'c');\n const sourceIsRdamedia = field.subfields.some(sub => sub.code === '2' && sub.value === 'rdamedia');\n return mediaTypeIsC && sourceIsRdamedia;\n });\n}\n\nexport function nvdebug(message, func = undefined) {\n if (func) { // eslint-disable-line functional/no-conditional-statements\n func(message);\n }\n //console.info(message); // eslint-disable-line no-console\n}\n\nexport function fieldHasSubfield(field, subfieldCode, subfieldValue = null) {\n if (!field.subfields) {\n return false;\n }\n if (subfieldValue === null) {\n return field.subfields.some(sf => sf.code === subfieldCode);\n }\n return field.subfields.some(sf => sf.code === subfieldCode && subfieldValue === sf.value);\n}\n\nexport function subfieldToString(sf) {\n return `‡${sf.code} ${sf.value}`;\n}\n\nfunction normalizeIndicatorValue(val) {\n if (val === ' ') {\n return '#';\n }\n return val;\n}\n\nexport function fieldToString(f) {\n if ('subfields' in f) {\n return `${f.tag} ${normalizeIndicatorValue(f.ind1)}${normalizeIndicatorValue(f.ind2)}${formatSubfields(f)}`;\n }\n return `${f.tag} ${f.value}`;\n\n function formatSubfields(field) {\n return field.subfields.map(sf => ` ${subfieldToString(sf)}`).join('');\n }\n}\n\nexport function fieldsToString(fields) {\n return fields.map(f => fieldToString(f)).join('\\t__SEPARATOR__\\t');\n}\n\nexport function nvdebugFieldArray(fields, prefix = ' ', func = undefined) {\n fields.forEach(field => nvdebug(`${prefix}${fieldToString(field)}`, func));\n}\n\nexport function isControlSubfieldCode(subfieldCode) {\n if (['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'w'].includes(subfieldCode)) {\n return true;\n }\n return false;\n}\n\nexport function getCatalogingLanguage(record) {\n const [field040] = record.get(/^040$/u);\n if (!field040) {\n return null;\n }\n const [b] = field040.subfields.filter(sf => sf.code === 'b');\n if (!b) {\n return null;\n }\n return b.value;\n}\n\n\nexport function uniqArray(arr) {\n return arr.filter((val, i) => arr.indexOf(val) === i);\n}\n"],"mappings":";;;;;;;;;;;;;;;AAAO,SAASA,oBAAoBA,CAACC,MAAM,EAAE;EAC3C,MAAMC,KAAK,GAAGD,MAAM,CAACE,GAAG,CAAC,KAAK,CAAC;EAE/B,OAAOD,KAAK,CAACE,IAAI,CAACC,KAAK,IAAI;IACzB,MAAMC,YAAY,GAAGD,KAAK,CAACE,SAAS,CAACH,IAAI,CAACI,GAAG,IAAIA,GAAG,CAACC,IAAI,KAAK,GAAG,IAAID,GAAG,CAACE,KAAK,KAAK,GAAG,CAAC;IACvF,MAAMC,gBAAgB,GAAGN,KAAK,CAACE,SAAS,CAACH,IAAI,CAACI,GAAG,IAAIA,GAAG,CAACC,IAAI,KAAK,GAAG,IAAID,GAAG,CAACE,KAAK,KAAK,UAAU,CAAC;IAClG,OAAOJ,YAAY,IAAIK,gBAAgB;EACzC,CAAC,CAAC;AACJ;AAEO,SAASC,OAAOA,CAACC,OAAO,EAAEC,IAAI,GAAGC,SAAS,EAAE;EACjD,IAAID,IAAI,EAAE;IAAE;IACVA,IAAI,CAACD,OAAO,CAAC;EACf;EACA;AACF;AAEO,SAASG,gBAAgBA,CAACX,KAAK,EAAEY,YAAY,EAAEC,aAAa,GAAG,IAAI,EAAE;EAC1E,IAAI,CAACb,KAAK,CAACE,SAAS,EAAE;IACpB,OAAO,KAAK;EACd;EACA,IAAIW,aAAa,KAAK,IAAI,EAAE;IAC1B,OAAOb,KAAK,CAACE,SAAS,CAACH,IAAI,CAACe,EAAE,IAAIA,EAAE,CAACV,IAAI,KAAKQ,YAAY,CAAC;EAC7D;EACA,OAAOZ,KAAK,CAACE,SAAS,CAACH,IAAI,CAACe,EAAE,IAAIA,EAAE,CAACV,IAAI,KAAKQ,YAAY,IAAIC,aAAa,KAAKC,EAAE,CAACT,KAAK,CAAC;AAC3F;AAEO,SAASU,gBAAgBA,CAACD,EAAE,EAAE;EACnC,OAAQ,IAAGA,EAAE,CAACV,IAAK,IAAGU,EAAE,CAACT,KAAM,EAAC;AAClC;AAEA,SAASW,uBAAuBA,CAACC,GAAG,EAAE;EACpC,IAAIA,GAAG,KAAK,GAAG,EAAE;IACf,OAAO,GAAG;EACZ;EACA,OAAOA,GAAG;AACZ;AAEO,SAASC,aAAaA,CAACC,CAAC,EAAE;EAC/B,IAAI,WAAW,IAAIA,CAAC,EAAE;IACpB,OAAQ,GAAEA,CAAC,CAACC,GAAI,IAAGJ,uBAAuB,CAACG,CAAC,CAACE,IAAI,CAAE,GAAEL,uBAAuB,CAACG,CAAC,CAACG,IAAI,CAAE,GAAEC,eAAe,CAACJ,CAAC,CAAE,EAAC;EAC7G;EACA,OAAQ,GAAEA,CAAC,CAACC,GAAI,OAAMD,CAAC,CAACd,KAAM,EAAC;EAE/B,SAASkB,eAAeA,CAACvB,KAAK,EAAE;IAC9B,OAAOA,KAAK,CAACE,SAAS,CAACsB,GAAG,CAACV,EAAE,IAAK,IAAGC,gBAAgB,CAACD,EAAE,CAAE,EAAC,CAAC,CAACW,IAAI,CAAC,EAAE,CAAC;EACvE;AACF;AAEO,SAASC,cAAcA,CAACC,MAAM,EAAE;EACrC,OAAOA,MAAM,CAACH,GAAG,CAACL,CAAC,IAAID,aAAa,CAACC,CAAC,CAAC,CAAC,CAACM,IAAI,CAAC,mBAAmB,CAAC;AACpE;AAEO,SAASG,iBAAiBA,CAACD,MAAM,EAAEE,MAAM,GAAG,IAAI,EAAEpB,IAAI,GAAGC,SAAS,EAAE;EACzEiB,MAAM,CAACG,OAAO,CAAC9B,KAAK,IAAIO,OAAO,CAAE,GAAEsB,MAAO,GAAEX,aAAa,CAAClB,KAAK,CAAE,EAAC,EAAES,IAAI,CAAC,CAAC;AAC5E;AAEO,SAASsB,qBAAqBA,CAACnB,YAAY,EAAE;EAClD,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAACoB,QAAQ,CAACpB,YAAY,CAAC,EAAE;IAClF,OAAO,IAAI;EACb;EACA,OAAO,KAAK;AACd;AAEO,SAASqB,qBAAqBA,CAACrC,MAAM,EAAE;EAC5C,MAAM,CAACsC,QAAQ,CAAC,GAAGtC,MAAM,CAACE,GAAG,CAAC,QAAQ,CAAC;EACvC,IAAI,CAACoC,QAAQ,EAAE;IACb,OAAO,IAAI;EACb;EACA,MAAM,CAACC,CAAC,CAAC,GAAGD,QAAQ,CAAChC,SAAS,CAACkC,MAAM,CAACtB,EAAE,IAAIA,EAAE,CAACV,IAAI,KAAK,GAAG,CAAC;EAC5D,IAAI,CAAC+B,CAAC,EAAE;IACN,OAAO,IAAI;EACb;EACA,OAAOA,CAAC,CAAC9B,KAAK;AAChB;AAGO,SAASgC,SAASA,CAACC,GAAG,EAAE;EAC7B,OAAOA,GAAG,CAACF,MAAM,CAAC,CAACnB,GAAG,EAAEsB,CAAC,KAAKD,GAAG,CAACE,OAAO,CAACvB,GAAG,CAAC,KAAKsB,CAAC,CAAC;AACvD","ignoreList":[]}
1
+ {"version":3,"file":"utils.js","names":["isElectronicMaterial","record","f337s","get","length","some","f","fieldHasSubfield","nvdebug","message","func","undefined","field","subfieldCode","subfieldValue","subfields","sf","code","value","subfieldToString","normalizeIndicatorValue","val","recordToString","ldr","leader","fields","map","fieldToString","join","tag","ind1","ind2","formatSubfields","fieldsToString","nvdebugFieldArray","prefix","forEach","isControlSubfieldCode","includes","getCatalogingLanguage","defaultCatalogingLanguage","field040","b","filter","uniqArray","arr","i","indexOf"],"sources":["../src/utils.js"],"sourcesContent":["export function isElectronicMaterial(record) {\n const f337s = record.get('337');\n\n return f337s.length > 0 && f337s.some(f => fieldHasSubfield(f, 'b', 'c') && fieldHasSubfield(f, '2', 'rdamedia'));\n}\n\nexport function nvdebug(message, func = undefined) {\n if (func) { // eslint-disable-line functional/no-conditional-statements\n func(message);\n }\n //console.info(message); // eslint-disable-line no-console\n}\n\nexport function fieldHasSubfield(field, subfieldCode, subfieldValue = null) {\n if (!field.subfields) {\n return false;\n }\n if (subfieldValue === null) {\n return field.subfields.some(sf => sf.code === subfieldCode);\n }\n return field.subfields.some(sf => sf.code === subfieldCode && subfieldValue === sf.value);\n}\n\nexport function subfieldToString(sf) {\n if (!sf.value) {\n return `‡${sf.code}`;\n }\n return `‡${sf.code} ${sf.value}`;\n}\n\nfunction normalizeIndicatorValue(val) {\n if (val === ' ') {\n return '#';\n }\n return val;\n}\n\nexport function recordToString(record) {\n const ldr = `LDR ${record.leader}`;\n const fields = record.fields.map(f => fieldToString(f));\n return `${ldr}\\n${fields.join('\\n')}`;\n}\n\nexport function fieldToString(f) {\n if ('subfields' in f) {\n return `${f.tag} ${normalizeIndicatorValue(f.ind1)}${normalizeIndicatorValue(f.ind2)}${formatSubfields(f)}`;\n }\n return `${f.tag} ${f.value}`;\n\n function formatSubfields(field) {\n return field.subfields.map(sf => ` ${subfieldToString(sf)}`).join('');\n }\n}\n\nexport function fieldsToString(fields) {\n return fields.map(f => fieldToString(f)).join('\\t__SEPARATOR__\\t');\n}\n\nexport function nvdebugFieldArray(fields, prefix = ' ', func = undefined) {\n fields.forEach(field => nvdebug(`${prefix}${fieldToString(field)}`, func));\n}\n\nexport function isControlSubfieldCode(subfieldCode) {\n if (['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'w'].includes(subfieldCode)) {\n return true;\n }\n return false;\n}\n\nexport function getCatalogingLanguage(record, defaultCatalogingLanguage = undefined) {\n const [field040] = record.get(/^040$/u);\n if (!field040) {\n return defaultCatalogingLanguage;\n }\n const [b] = field040.subfields.filter(sf => sf.code === 'b');\n if (!b) {\n return defaultCatalogingLanguage;\n }\n return b.value;\n}\n\n\nexport function uniqArray(arr) {\n return arr.filter((val, i) => arr.indexOf(val) === i);\n}\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -14,7 +14,7 @@
14
14
  "url": "git@github.com:natlibfi/marc-record-validators-melinda.git"
15
15
  },
16
16
  "license": "MIT",
17
- "version": "11.0.0",
17
+ "version": "11.1.0",
18
18
  "main": "./dist/index.js",
19
19
  "publishConfig": {
20
20
  "access": "public"
@@ -39,12 +39,12 @@
39
39
  "dependencies": {
40
40
  "@babel/register": "^7.23.7",
41
41
  "@natlibfi/issn-verify": "^1.0.3",
42
- "@natlibfi/marc-record": "^8.1.0",
42
+ "@natlibfi/marc-record": "^8.1.1",
43
43
  "@natlibfi/marc-record-validate": "^8.0.6",
44
44
  "cld3-asm": "^3.1.1",
45
45
  "clone": "^2.1.2",
46
46
  "debug": "^4.3.4",
47
- "isbn3": "^1.1.46",
47
+ "isbn3": "^1.1.47",
48
48
  "langs": "^2.0.0",
49
49
  "node-fetch": "^2.7.0",
50
50
  "xml2js": "^0.6.2"
@@ -53,9 +53,9 @@
53
53
  "@natlibfi/marc-record-validate": "^8.0.6"
54
54
  },
55
55
  "devDependencies": {
56
- "@babel/cli": "^7.23.9",
57
- "@babel/core": "^7.24.0",
58
- "@babel/preset-env": "^7.24.0",
56
+ "@babel/cli": "^7.24.1",
57
+ "@babel/core": "^7.24.4",
58
+ "@babel/preset-env": "^7.24.4",
59
59
  "@natlibfi/eslint-config-melinda-backend": "^3.0.4",
60
60
  "@natlibfi/fixugen": "^2.0.4",
61
61
  "@natlibfi/fixura": "^3.0.4",
@@ -66,7 +66,7 @@
66
66
  "cross-env": "^7.0.3",
67
67
  "eslint": "^8.57.0",
68
68
  "fetch-mock": "^9.11.0",
69
- "mocha": "^10.3.0",
69
+ "mocha": "^10.4.0",
70
70
  "nyc": "^15.1.0"
71
71
  },
72
72
  "eslintConfig": {
@@ -0,0 +1,260 @@
1
+ //import createDebugLogger from 'debug';
2
+ import {fieldToString, getCatalogingLanguage, nvdebug} from './utils';
3
+ import {getFormOfItem, map336CodeToTerm} from './field33XUtils';
4
+
5
+ const description = 'Add missing 336 field(s)';
6
+
7
+ // const multimediaRegexp = /multimedia/ui;
8
+
9
+ export default function () {
10
+
11
+ return {
12
+ description, validate, fix
13
+ };
14
+
15
+ function fix(record) {
16
+ nvdebug(`FIX ${description}...`);
17
+ const newFields = getMissing336s(record);
18
+ nvdebug(` GOT ${newFields.length}...`);
19
+ // FFS: we actually need newFields array here! Videogame, for example, might be
20
+ // 336 ## ‡a kaksiulotteinen liikkuva kuva ‡b tdi ‡2 rdacontent
21
+ // 336 ## ‡a tietokoneohjelma ‡b cop ‡2 rdacontent
22
+ const res = {message: [], fix: [], valid: true};
23
+ if (newFields.length) {
24
+ newFields.forEach(f => record.insertField(f));
25
+ return res;
26
+ }
27
+ return res;
28
+ }
29
+
30
+ function validate(record) {
31
+ nvdebug(`VALIDATE ${description}...`);
32
+ const newFields = getMissing336s(record);
33
+ if (newFields.length === 0) {
34
+ return {message: [], valid: true};
35
+ }
36
+ const strings = newFields.map(f => fieldToString(f));
37
+ const tmp = strings.join('\', \'');
38
+ const msg = `${description}: '${tmp}'`;
39
+ return {message: [msg], valid: false};
40
+ }
41
+
42
+ function guessMissingBsForComputerFile(record) {
43
+ const [field008] = record.get('008');
44
+ const typeOfComputerFile = field008 && field008.value ? field008.value[26] : undefined;
45
+
46
+ if (typeOfComputerFile) {
47
+ if (['d', 'e'].includes(typeOfComputerFile)) { // d: N=400, e: N=50
48
+ return ['txt'];
49
+ }
50
+ if (typeOfComputerFile === 'g') { // Videogame (N=10000+)
51
+ // 2D moving image/tdi is an educated guess. Might be wrong for 3D games and Infocom-style text-based games.
52
+ // Ref.: https://www.kiwi.fi/pages/viewpage.action?pageId=115966063#PelienRDAohje-Pelienjaottelu:videopelitjafyysisetpelit
53
+ return ['tdi', 'cop'];
54
+ }
55
+ if (['b', 'f'].includes(typeOfComputerFile)) { // b: N=176, f: N=2
56
+ return ['cop'];
57
+ }
58
+ if (['a', 'c'].includes(typeOfComputerFile)) { // c: N=152, a: N=36
59
+ return ['cod'];
60
+ }
61
+ if (typeOfComputerFile === 'h') { // h: N=44
62
+ return ['snd'];
63
+ }
64
+ }
65
+
66
+ // ADD 256/300/516/XXX-based educated guesses here
67
+ const guess = guessUsingFileFields();
68
+ if (guess) {
69
+ return guess;
70
+ }
71
+ function guessUsingFileFields() {
72
+ const characteristics = record.get('(256|516)').map(f => fieldToString(f));
73
+ if (characteristics.some(str => str.match(/(?:ohjelma)/gui))) {
74
+ return ['cop'];
75
+ }
76
+ if (characteristics.some(str => str.match(/(?:daisy)/gui))) {
77
+ return ['spw', 'txt']; // The convention is to put just 'spw' but this is technically correct
78
+ }
79
+ if (characteristics.some(str => str.match(/(?:äänikirja)/gui))) {
80
+ return ['spw']; // This should be ['spw', 'txt'] but who am I to change conventions...
81
+ }
82
+ if (characteristics.some(str => str.match(/(?:book|e-bok|e-diss|e-avhand|kirja|e-thesis|tekstitiedosto|tidskrift|verkkoartikkeli|verkkokirja|verkkolehti)/gui))) {
83
+ return ['txt'];
84
+ }
85
+ if (characteristics.some(str => str.match(/(?:peli)/gui))) {
86
+ return ['tdi', 'cop'];
87
+ }
88
+ if (characteristics.some(str => str.match(/(?:data|tietokanta)/gui))) {
89
+ return ['cod'];
90
+ }
91
+ if (characteristics.some(str => str.match(/(?:verkkoaineisto.*[0-9]\] s|PDF)/gui)) || characteristics.some(str => str.match(/\b(?:text|tekstiä?)\b/gui))) {
92
+ return ['txt'];
93
+ }
94
+ if (characteristics.some(str => str.match(/(?:elokuva|liikkuva kuva)/gui))) {
95
+ return ['tdi'];
96
+ }
97
+ if (characteristics.some(str => str.match(/(?:kartta)/gui))) {
98
+ return ['cri']; // cri or crd, close enough anyhow, I guess
99
+ }
100
+ if (characteristics.some(str => str.match(/\b(?:kuvi?a)\b/gui))) {
101
+ return ['tdi'];
102
+ }
103
+
104
+ return undefined;
105
+ }
106
+
107
+
108
+ if (['i', 'j', 'm'].includes(typeOfComputerFile)) { // (i: N=4800, m: N=566, j: N=111 )
109
+ // Can we use field 300/516/256 to improve guess?
110
+ return ['xxx'];
111
+ }
112
+ return ['zzz']; // unspecified
113
+ }
114
+
115
+ /*
116
+ function deriveLanguageMaterials336sFrom007(record) {
117
+ const categoryOfMaterial = [ // 007/00
118
+ {category: 'a', rdacontent: 'cri'}, // cartographic image <- looks like a MP that has been classified as BK... One more reason to comment these..
119
+ {category: 'c', rdacontent: 'txt'},
120
+ {category: 'g', rdacontent: 'sti'},
121
+ {vategory: 'h', rdacontent: 'txt'},
122
+ {category: 'k', rdacontent: 'sti'},
123
+ {category: 'v', rdacontent: 'tdi'}
124
+ ];
125
+
126
+ // What if there are multiple 007 fields?
127
+ const [f007] = record.fields.get('007');
128
+ if (f007) {
129
+ const row = categoryOfMaterial.filter(row => row.category === f007[0]);
130
+ if (row) {
131
+ return [row.rdacontent];
132
+ }
133
+ }
134
+ return [];
135
+ }
136
+ */
137
+
138
+ function guessMissingBsForBookAndContinuingResource(record, formOfItem) {
139
+
140
+
141
+ // This is from very old crap from usemarcon-cyrillux, but me not like it at all!
142
+ /*
143
+ const f245h = getTitleMedium(record);
144
+ if (f245h && !multimediaRegexp.test(f245h)) {
145
+ const result = deriveLanguageMaterials336sFrom007(record); // Base result on 007/00...
146
+ if (result) {
147
+ return result;
148
+ }
149
+ }
150
+ */
151
+
152
+ //const bibliographicalLevel = record.getBibliograpicLevel(); // Bloody h-drop typo...
153
+ //const isBis = ['b', 'i', 's'].includes(bibliographicalLevel);
154
+ //if (!isBis) {
155
+ if (formOfItem === 'f') {
156
+ return ['tct']; // tactile text
157
+ }
158
+ return ['txt']; // Default BK format is text
159
+ }
160
+
161
+ function guessMissingBsForMap(record) {
162
+ const formOfItem = getFormOfItem(record);
163
+ // Is braille and is not a model (we have 0). Changed the original usemarcon rule 007/01!=q to 007/01=q
164
+ if (formOfItem === 'f' && record.fields.some(f => f.tag === '007' && f.value[0] === 'a' && f.value[1] === 'q')) {
165
+ return ['crt']; // Cartographic tactile image
166
+ }
167
+ const [field008] = record.get('008');
168
+ if (field008 && field008.value[25] === 'd') { // globe (cool, but we really don't have these)
169
+ return ['crf']; // map 3D form
170
+ }
171
+ return ['cri']; // default cartographic image
172
+ }
173
+
174
+ function guessMissing336Bs(record) {
175
+ const typeOfRecord = record.getTypeOfRecord();
176
+
177
+ if (typeOfRecord === 'i') {
178
+ return ['spw'];
179
+ }
180
+ if (typeOfRecord === 'j') {
181
+ return ['prm']; // performed music
182
+ }
183
+
184
+ if (typeOfRecord === 'e' || typeOfRecord === 'f') {
185
+ return guessMissingBsForMap(record);
186
+ }
187
+
188
+ const formOfItem = getFormOfItem(record);
189
+
190
+ if (typeOfRecord === 'k') {
191
+ if (formOfItem === 'f') {
192
+ return ['tci']; // tactile image
193
+ }
194
+ return ['sti'];
195
+ }
196
+
197
+ if (typeOfRecord === 'c' || typeOfRecord === 'd') {
198
+ if (formOfItem === 'f') {
199
+ return ['tcm']; // tactile notated music
200
+ }
201
+ return ['ntm']; // notated music
202
+ }
203
+
204
+ if (typeOfRecord === 'g') {
205
+ if (record.fields.some(f => f.tag === '007' && f.value[0] === 'g')) {
206
+ return ['sti']; // still image
207
+ }
208
+ if (record.fields.some(f => f.tag === '007' && ['m', 'v', 'c'].includes(f.value[0]))) { // 'c' is a bit iffy, but I'll tune it only if it makes an error...
209
+ return ['tdi']; // 2d moving pic
210
+ }
211
+ }
212
+
213
+ if (typeOfRecord === 'm') { // electronic
214
+ return guessMissingBsForComputerFile(record);
215
+ }
216
+
217
+ if (typeOfRecord === 'a' || typeOfRecord === 't') {
218
+ return guessMissingBsForBookAndContinuingResource(record, formOfItem);
219
+ }
220
+
221
+ // Note that 245$h should trigger LDR/06:a or t =>o change at some earlier point (outside the scope of this module)
222
+ if (typeOfRecord === 'o' || typeOfRecord === 'p') { // o: Kit p: Mixed
223
+ if (['d', 'r'].includes(formOfItem)) { // d=isoteksti, r=eye-readable print
224
+ return ['txt'];
225
+ }
226
+ // Not much I can guess from 300 etc
227
+ return ['xxx']; // other
228
+ }
229
+ if (typeOfRecord === 'r') { // three-dimensional form
230
+ return ['tdf'];
231
+ }
232
+ return ['zzz']; // unspecified
233
+ }
234
+
235
+
236
+ function codeToField(b, catLang) {
237
+ const a = map336CodeToTerm(b, catLang);
238
+ const data = {tag: '336', ind1: ' ', ind2: ' ', subfields: [
239
+ {code: 'a', value: a},
240
+ {code: 'b', value: b},
241
+ {code: '2', value: 'rdacontent'}
242
+ ]};
243
+
244
+ return data;
245
+ }
246
+
247
+ function getMissing336s(record) {
248
+ const f336 = record.get('336');
249
+ if (f336.length > 0) {
250
+ return [];
251
+ }
252
+
253
+ const bees = guessMissing336Bs(record); // bees = b-subfields
254
+ nvdebug(` WE HAVE ${bees.length} BEES: ${bees.join(', ')}`);
255
+
256
+
257
+ return bees.map(b => codeToField(b, getCatalogingLanguage(record, 'fin')));
258
+ }
259
+ }
260
+
@@ -0,0 +1,46 @@
1
+ import {expect} from 'chai';
2
+ import {MarcRecord} from '@natlibfi/marc-record';
3
+ import validatorFactory from './addMissingField336';
4
+ import {READERS} from '@natlibfi/fixura';
5
+ import generateTests from '@natlibfi/fixugen';
6
+
7
+ generateTests({
8
+ callback,
9
+ path: [__dirname, '..', 'test-fixtures', 'addMissingField336'],
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
+ }