@natlibfi/marc-record-merge 5.0.0 → 6.0.0-beta.4

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 (515) hide show
  1. package/.drone.yml +92 -0
  2. package/.github/CODEOWNERS +9 -0
  3. package/.github/dependabot.yml +41 -0
  4. package/.github/workflows/melinda-node-tests.yml +60 -0
  5. package/LICENSE +21 -0
  6. package/README.md +64 -246
  7. package/dist/index.js +25 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/reducers/copy.js +297 -0
  10. package/dist/reducers/copy.js.map +1 -0
  11. package/dist/reducers/copy.spec.js +68 -0
  12. package/dist/reducers/copy.spec.js.map +1 -0
  13. package/dist/reducers/index.js +25 -0
  14. package/dist/reducers/index.js.map +1 -0
  15. package/dist/reducers/select.js +130 -0
  16. package/dist/reducers/select.js.map +1 -0
  17. package/dist/reducers/select.spec.js +68 -0
  18. package/dist/reducers/select.spec.js.map +1 -0
  19. package/package.json +103 -57
  20. package/src/index.js +4 -0
  21. package/src/reducers/copy.js +274 -0
  22. package/src/reducers/copy.spec.js +48 -0
  23. package/src/reducers/index.js +4 -0
  24. package/src/reducers/select.js +107 -0
  25. package/src/reducers/select.spec.js +45 -0
  26. package/test-fixtures/reducers/copy/basic copy/01/base.json +9 -0
  27. package/test-fixtures/reducers/copy/basic copy/01/merged.json +20 -0
  28. package/test-fixtures/reducers/copy/basic copy/01/metadata.json +5 -0
  29. package/test-fixtures/reducers/copy/basic copy/01/source.json +20 -0
  30. package/test-fixtures/reducers/copy/basic copy/02/base.json +20 -0
  31. package/test-fixtures/reducers/copy/basic copy/02/merged.json +20 -0
  32. package/test-fixtures/reducers/copy/basic copy/02/metadata.json +5 -0
  33. package/test-fixtures/reducers/copy/basic copy/02/source.json +20 -0
  34. package/test-fixtures/reducers/copy/basic copy/03/base.json +20 -0
  35. package/test-fixtures/reducers/copy/basic copy/03/merged.json +28 -0
  36. package/test-fixtures/reducers/copy/basic copy/03/metadata.json +5 -0
  37. package/test-fixtures/reducers/copy/basic copy/03/source.json +24 -0
  38. package/test-fixtures/reducers/copy/basic copy/04/base.json +39 -0
  39. package/test-fixtures/reducers/copy/basic copy/04/merged.json +39 -0
  40. package/test-fixtures/reducers/copy/basic copy/04/metadata.json +5 -0
  41. package/test-fixtures/reducers/copy/basic copy/04/source.json +39 -0
  42. package/test-fixtures/reducers/copy/basic copy/05/base.json +39 -0
  43. package/test-fixtures/reducers/copy/basic copy/05/merged.json +77 -0
  44. package/test-fixtures/reducers/copy/basic copy/05/metadata.json +5 -0
  45. package/test-fixtures/reducers/copy/basic copy/05/source.json +62 -0
  46. package/test-fixtures/reducers/copy/basic copy/06/base.json +24 -0
  47. package/test-fixtures/reducers/copy/basic copy/06/merged.json +39 -0
  48. package/test-fixtures/reducers/copy/basic copy/06/metadata.json +5 -0
  49. package/test-fixtures/reducers/copy/basic copy/06/source.json +24 -0
  50. package/test-fixtures/reducers/copy/compareTagsOnly/01/base.json +24 -0
  51. package/test-fixtures/reducers/copy/compareTagsOnly/01/merged.json +24 -0
  52. package/test-fixtures/reducers/copy/compareTagsOnly/01/metadata.json +6 -0
  53. package/test-fixtures/reducers/copy/compareTagsOnly/01/source.json +24 -0
  54. package/test-fixtures/reducers/copy/compareTagsOnly/02/base.json +24 -0
  55. package/test-fixtures/reducers/copy/compareTagsOnly/02/merged.json +100 -0
  56. package/test-fixtures/reducers/copy/compareTagsOnly/02/metadata.json +6 -0
  57. package/test-fixtures/reducers/copy/compareTagsOnly/02/source.json +100 -0
  58. package/test-fixtures/reducers/copy/compareWithoutIndicators/01/base.json +24 -0
  59. package/test-fixtures/reducers/copy/compareWithoutIndicators/01/merged.json +24 -0
  60. package/test-fixtures/reducers/copy/compareWithoutIndicators/01/metadata.json +6 -0
  61. package/test-fixtures/reducers/copy/compareWithoutIndicators/01/source.json +24 -0
  62. package/test-fixtures/reducers/copy/compareWithoutIndicators/02/base.json +24 -0
  63. package/test-fixtures/reducers/copy/compareWithoutIndicators/02/merged.json +39 -0
  64. package/test-fixtures/reducers/copy/compareWithoutIndicators/02/metadata.json +6 -0
  65. package/test-fixtures/reducers/copy/compareWithoutIndicators/02/source.json +24 -0
  66. package/test-fixtures/reducers/copy/copyUnless/01/base.json +9 -0
  67. package/test-fixtures/reducers/copy/copyUnless/01/merged.json +24 -0
  68. package/test-fixtures/reducers/copy/copyUnless/01/metadata.json +6 -0
  69. package/test-fixtures/reducers/copy/copyUnless/01/source.json +47 -0
  70. package/test-fixtures/reducers/copy/dropSubfields/01/base.json +35 -0
  71. package/test-fixtures/reducers/copy/dropSubfields/01/merged.json +54 -0
  72. package/test-fixtures/reducers/copy/dropSubfields/01/metadata.json +6 -0
  73. package/test-fixtures/reducers/copy/dropSubfields/01/source.json +43 -0
  74. package/test-fixtures/reducers/copy/dropSubfields/02/base.json +43 -0
  75. package/test-fixtures/reducers/copy/dropSubfields/02/merged.json +58 -0
  76. package/test-fixtures/reducers/copy/dropSubfields/02/metadata.json +6 -0
  77. package/test-fixtures/reducers/copy/dropSubfields/02/source.json +32 -0
  78. package/test-fixtures/reducers/copy/dropSubfields/03/base.json +43 -0
  79. package/test-fixtures/reducers/copy/dropSubfields/03/merged.json +58 -0
  80. package/test-fixtures/reducers/copy/dropSubfields/03/metadata.json +6 -0
  81. package/test-fixtures/reducers/copy/dropSubfields/03/source.json +32 -0
  82. package/test-fixtures/reducers/copy/dropSubfields/04/base.json +43 -0
  83. package/test-fixtures/reducers/copy/dropSubfields/04/merged.json +43 -0
  84. package/test-fixtures/reducers/copy/dropSubfields/04/metadata.json +6 -0
  85. package/test-fixtures/reducers/copy/dropSubfields/04/source.json +32 -0
  86. package/test-fixtures/reducers/copy/excludeSubfields/01/base.json +39 -0
  87. package/test-fixtures/reducers/copy/excludeSubfields/01/merged.json +39 -0
  88. package/test-fixtures/reducers/copy/excludeSubfields/01/metadata.json +9 -0
  89. package/test-fixtures/reducers/copy/excludeSubfields/01/source.json +43 -0
  90. package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/01/base.json +24 -0
  91. package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/01/merged.json +39 -0
  92. package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/01/metadata.json +6 -0
  93. package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/01/source.json +24 -0
  94. package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/02/base.json +24 -0
  95. package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/02/merged.json +24 -0
  96. package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/02/metadata.json +6 -0
  97. package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/02/source.json +24 -0
  98. package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/03/base.json +28 -0
  99. package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/03/merged.json +43 -0
  100. package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/03/metadata.json +6 -0
  101. package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/03/source.json +24 -0
  102. package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/04/base.json +28 -0
  103. package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/04/merged.json +28 -0
  104. package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/04/metadata.json +6 -0
  105. package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/04/source.json +24 -0
  106. package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/05/base.json +20 -0
  107. package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/05/merged.json +35 -0
  108. package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/05/metadata.json +6 -0
  109. package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/05/source.json +24 -0
  110. package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/06/base.json +20 -0
  111. package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/06/merged.json +35 -0
  112. package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/06/metadata.json +6 -0
  113. package/test-fixtures/reducers/copy/subfieldsMustBeIdentical/06/source.json +24 -0
  114. package/test-fixtures/reducers/metadata.json +5 -0
  115. package/test-fixtures/reducers/select/01/base.json +21 -0
  116. package/test-fixtures/reducers/select/01/merged.json +20 -0
  117. package/test-fixtures/reducers/select/01/metadata.json +5 -0
  118. package/test-fixtures/reducers/select/01/source.json +20 -0
  119. package/test-fixtures/reducers/select/02/base.json +31 -0
  120. package/test-fixtures/reducers/select/02/merged.json +31 -0
  121. package/test-fixtures/reducers/select/02/metadata.json +4 -0
  122. package/test-fixtures/reducers/select/02/source.json +42 -0
  123. package/test-fixtures/reducers/select/03/base.json +20 -0
  124. package/test-fixtures/reducers/select/03/merged.json +20 -0
  125. package/test-fixtures/reducers/select/03/metadata.json +4 -0
  126. package/test-fixtures/reducers/select/03/source.json +20 -0
  127. package/test-fixtures/reducers/select/04/base.json +20 -0
  128. package/test-fixtures/reducers/select/04/merged.json +20 -0
  129. package/test-fixtures/reducers/select/04/metadata.json +5 -0
  130. package/test-fixtures/reducers/select/04/source.json +20 -0
  131. package/test-fixtures/reducers/select/05/base.json +24 -0
  132. package/test-fixtures/reducers/select/05/merged.json +24 -0
  133. package/test-fixtures/reducers/select/05/metadata.json +4 -0
  134. package/test-fixtures/reducers/select/05/source.json +24 -0
  135. package/test-fixtures/reducers/select/06/base.json +28 -0
  136. package/test-fixtures/reducers/select/06/merged.json +28 -0
  137. package/test-fixtures/reducers/select/06/metadata.json +4 -0
  138. package/test-fixtures/reducers/select/06/source.json +28 -0
  139. package/test-fixtures/reducers/select/07/base.json +24 -0
  140. package/test-fixtures/reducers/select/07/merged.json +24 -0
  141. package/test-fixtures/reducers/select/07/metadata.json +5 -0
  142. package/test-fixtures/reducers/select/07/source.json +24 -0
  143. package/test-fixtures/reducers/select/08/base.json +24 -0
  144. package/test-fixtures/reducers/select/08/merged.json +24 -0
  145. package/test-fixtures/reducers/select/08/metadata.json +4 -0
  146. package/test-fixtures/reducers/select/08/source.json +24 -0
  147. package/test-fixtures/reducers/select/09/base.json +24 -0
  148. package/test-fixtures/reducers/select/09/merged.json +24 -0
  149. package/test-fixtures/reducers/select/09/metadata.json +4 -0
  150. package/test-fixtures/reducers/select/09/source.json +24 -0
  151. package/test-fixtures/reducers/select/10/base.json +24 -0
  152. package/test-fixtures/reducers/select/10/merged.json +28 -0
  153. package/test-fixtures/reducers/select/10/metadata.json +5 -0
  154. package/test-fixtures/reducers/select/10/source.json +28 -0
  155. package/test-fixtures/reducers/select/11/base.json +24 -0
  156. package/test-fixtures/reducers/select/11/merged.json +24 -0
  157. package/test-fixtures/reducers/select/11/metadata.json +4 -0
  158. package/test-fixtures/reducers/select/11/source.json +28 -0
  159. package/test-fixtures/reducers/select/12/base.json +24 -0
  160. package/test-fixtures/reducers/select/12/merged.json +28 -0
  161. package/test-fixtures/reducers/select/12/metadata.json +5 -0
  162. package/test-fixtures/reducers/select/12/source.json +28 -0
  163. package/test-fixtures/reducers/select/13/base.json +28 -0
  164. package/test-fixtures/reducers/select/13/merged.json +28 -0
  165. package/test-fixtures/reducers/select/13/metadata.json +4 -0
  166. package/test-fixtures/reducers/select/13/source.json +24 -0
  167. package/test-fixtures/reducers/select/14/base.json +24 -0
  168. package/test-fixtures/reducers/select/14/merged.json +24 -0
  169. package/test-fixtures/reducers/select/14/metadata.json +4 -0
  170. package/test-fixtures/reducers/select/14/source.json +24 -0
  171. package/.editorconfig +0 -10
  172. package/.istanbul.yml +0 -6
  173. package/.jshintignore +0 -2
  174. package/.jshintrc +0 -3
  175. package/.travis.yml +0 -16
  176. package/LICENSE.txt +0 -661
  177. package/karma.conf.js +0 -39
  178. package/lib/main.js +0 -1215
  179. package/resources/action-copy-options-schema.json +0 -81
  180. package/resources/action-select-better-options-schema.json +0 -34
  181. package/resources/configuration-schema.json +0 -46
  182. package/test/browser/main.spec.js +0 -96
  183. package/test/nodejs/main.spec.js +0 -71
  184. package/test/suites/74.json +0 -10
  185. package/test/suites/config/1to3.json +0 -10
  186. package/test/suites/config/27to28.json +0 -10
  187. package/test/suites/config/29to31.json +0 -10
  188. package/test/suites/config/32to40.json +0 -16
  189. package/test/suites/config/41to43.json +0 -10
  190. package/test/suites/config/44to56.json +0 -15
  191. package/test/suites/config/4to26.json +0 -81
  192. package/test/suites/config/57to63.json +0 -63
  193. package/test/suites/config/64.json +0 -7
  194. package/test/suites/config/65.json +0 -19
  195. package/test/suites/config/66.json +0 -13
  196. package/test/suites/config/67.json +0 -14
  197. package/test/suites/config/68.json +0 -12
  198. package/test/suites/config/69.json +0 -12
  199. package/test/suites/config/70.json +0 -13
  200. package/test/suites/config/71.json +0 -10
  201. package/test/suites/config/72.json +0 -12
  202. package/test/suites/config/73.json +0 -10
  203. package/test/suites/config/76.json +0 -13
  204. package/test/suites/config/77.json +0 -11
  205. package/test/suites/config/78to79.json +0 -12
  206. package/test/suites/config/80to81.json +0 -12
  207. package/test/suites/config/82.json +0 -10
  208. package/test/suites/config/83to85.json +0 -15
  209. package/test/suites/config/86.json +0 -16
  210. package/test/suites/config/87.json +0 -15
  211. package/test/suites/config/88.json +0 -16
  212. package/test/suites/data/1/merged +0 -3
  213. package/test/suites/data/1/other +0 -3
  214. package/test/suites/data/1/preferred +0 -2
  215. package/test/suites/data/10/descr +0 -1
  216. package/test/suites/data/10/merged +0 -2
  217. package/test/suites/data/10/other +0 -2
  218. package/test/suites/data/10/preferred +0 -2
  219. package/test/suites/data/11/descr +0 -1
  220. package/test/suites/data/11/merged +0 -2
  221. package/test/suites/data/11/other +0 -2
  222. package/test/suites/data/11/preferred +0 -2
  223. package/test/suites/data/12/descr +0 -1
  224. package/test/suites/data/12/merged +0 -2
  225. package/test/suites/data/12/other +0 -2
  226. package/test/suites/data/12/preferred +0 -2
  227. package/test/suites/data/13/descr +0 -1
  228. package/test/suites/data/13/merged +0 -3
  229. package/test/suites/data/13/other +0 -2
  230. package/test/suites/data/13/preferred +0 -3
  231. package/test/suites/data/14/descr +0 -1
  232. package/test/suites/data/14/merged +0 -2
  233. package/test/suites/data/14/other +0 -2
  234. package/test/suites/data/14/preferred +0 -2
  235. package/test/suites/data/15/descr +0 -1
  236. package/test/suites/data/15/merged +0 -2
  237. package/test/suites/data/15/other +0 -2
  238. package/test/suites/data/15/preferred +0 -2
  239. package/test/suites/data/16/descr +0 -1
  240. package/test/suites/data/16/merged +0 -2
  241. package/test/suites/data/16/other +0 -2
  242. package/test/suites/data/16/preferred +0 -2
  243. package/test/suites/data/17/descr +0 -1
  244. package/test/suites/data/17/merged +0 -2
  245. package/test/suites/data/17/other +0 -2
  246. package/test/suites/data/17/preferred +0 -2
  247. package/test/suites/data/18/descr +0 -1
  248. package/test/suites/data/18/merged +0 -2
  249. package/test/suites/data/18/other +0 -2
  250. package/test/suites/data/18/preferred +0 -2
  251. package/test/suites/data/19/descr +0 -1
  252. package/test/suites/data/19/merged +0 -2
  253. package/test/suites/data/19/other +0 -2
  254. package/test/suites/data/19/preferred +0 -2
  255. package/test/suites/data/2/merged +0 -3
  256. package/test/suites/data/2/other +0 -2
  257. package/test/suites/data/2/preferred +0 -3
  258. package/test/suites/data/20/descr +0 -1
  259. package/test/suites/data/20/merged +0 -3
  260. package/test/suites/data/20/other +0 -2
  261. package/test/suites/data/20/preferred +0 -2
  262. package/test/suites/data/21/descr +0 -1
  263. package/test/suites/data/21/merged +0 -4
  264. package/test/suites/data/21/other +0 -4
  265. package/test/suites/data/21/preferred +0 -3
  266. package/test/suites/data/22/descr +0 -1
  267. package/test/suites/data/22/merged +0 -10
  268. package/test/suites/data/22/other +0 -7
  269. package/test/suites/data/22/preferred +0 -10
  270. package/test/suites/data/23/descr +0 -1
  271. package/test/suites/data/23/merged +0 -2
  272. package/test/suites/data/23/other +0 -2
  273. package/test/suites/data/23/preferred +0 -2
  274. package/test/suites/data/24/descr +0 -1
  275. package/test/suites/data/24/merged +0 -2
  276. package/test/suites/data/24/other +0 -2
  277. package/test/suites/data/24/preferred +0 -2
  278. package/test/suites/data/25/descr +0 -1
  279. package/test/suites/data/25/merged +0 -2
  280. package/test/suites/data/25/other +0 -2
  281. package/test/suites/data/25/preferred +0 -2
  282. package/test/suites/data/26/descr +0 -1
  283. package/test/suites/data/26/merged +0 -3
  284. package/test/suites/data/26/other +0 -3
  285. package/test/suites/data/26/preferred +0 -3
  286. package/test/suites/data/27/merged +0 -3
  287. package/test/suites/data/27/other +0 -2
  288. package/test/suites/data/27/preferred +0 -2
  289. package/test/suites/data/28/merged +0 -3
  290. package/test/suites/data/28/other +0 -2
  291. package/test/suites/data/28/preferred +0 -2
  292. package/test/suites/data/29/merged +0 -2
  293. package/test/suites/data/29/other +0 -2
  294. package/test/suites/data/29/preferred +0 -2
  295. package/test/suites/data/3/merged +0 -3
  296. package/test/suites/data/3/other +0 -3
  297. package/test/suites/data/3/preferred +0 -3
  298. package/test/suites/data/30/merged +0 -3
  299. package/test/suites/data/30/other +0 -2
  300. package/test/suites/data/30/preferred +0 -2
  301. package/test/suites/data/31/merged +0 -3
  302. package/test/suites/data/31/other +0 -2
  303. package/test/suites/data/31/preferred +0 -3
  304. package/test/suites/data/32/other +0 -2
  305. package/test/suites/data/32/preferred +0 -3
  306. package/test/suites/data/33/merged +0 -2
  307. package/test/suites/data/33/other +0 -2
  308. package/test/suites/data/33/preferred +0 -2
  309. package/test/suites/data/34/merged +0 -2
  310. package/test/suites/data/34/other +0 -2
  311. package/test/suites/data/34/preferred +0 -2
  312. package/test/suites/data/35/merged +0 -2
  313. package/test/suites/data/35/other +0 -2
  314. package/test/suites/data/35/preferred +0 -2
  315. package/test/suites/data/36/merged +0 -2
  316. package/test/suites/data/36/other +0 -2
  317. package/test/suites/data/36/preferred +0 -2
  318. package/test/suites/data/37/merged +0 -3
  319. package/test/suites/data/37/other +0 -2
  320. package/test/suites/data/37/preferred +0 -2
  321. package/test/suites/data/38/merged +0 -3
  322. package/test/suites/data/38/other +0 -2
  323. package/test/suites/data/38/preferred +0 -2
  324. package/test/suites/data/39/merged +0 -2
  325. package/test/suites/data/39/other +0 -2
  326. package/test/suites/data/39/preferred +0 -2
  327. package/test/suites/data/4/descr +0 -1
  328. package/test/suites/data/4/merged +0 -2
  329. package/test/suites/data/4/other +0 -2
  330. package/test/suites/data/4/preferred +0 -2
  331. package/test/suites/data/40/merged +0 -2
  332. package/test/suites/data/40/other +0 -2
  333. package/test/suites/data/40/preferred +0 -2
  334. package/test/suites/data/41/merged +0 -2
  335. package/test/suites/data/41/other +0 -2
  336. package/test/suites/data/41/preferred +0 -2
  337. package/test/suites/data/42/merged +0 -2
  338. package/test/suites/data/42/other +0 -2
  339. package/test/suites/data/42/preferred +0 -2
  340. package/test/suites/data/43/merged +0 -2
  341. package/test/suites/data/43/other +0 -2
  342. package/test/suites/data/43/preferred +0 -2
  343. package/test/suites/data/44/merged +0 -2
  344. package/test/suites/data/44/other +0 -2
  345. package/test/suites/data/44/preferred +0 -2
  346. package/test/suites/data/45/merged +0 -2
  347. package/test/suites/data/45/other +0 -2
  348. package/test/suites/data/45/preferred +0 -2
  349. package/test/suites/data/46/merged +0 -2
  350. package/test/suites/data/46/other +0 -2
  351. package/test/suites/data/46/preferred +0 -2
  352. package/test/suites/data/47/merged +0 -2
  353. package/test/suites/data/47/other +0 -2
  354. package/test/suites/data/47/preferred +0 -2
  355. package/test/suites/data/48/merged +0 -2
  356. package/test/suites/data/48/other +0 -2
  357. package/test/suites/data/48/preferred +0 -2
  358. package/test/suites/data/49/merged +0 -3
  359. package/test/suites/data/49/other +0 -2
  360. package/test/suites/data/49/preferred +0 -2
  361. package/test/suites/data/5/descr +0 -1
  362. package/test/suites/data/5/merged +0 -2
  363. package/test/suites/data/5/other +0 -2
  364. package/test/suites/data/5/preferred +0 -2
  365. package/test/suites/data/50/merged +0 -3
  366. package/test/suites/data/50/other +0 -2
  367. package/test/suites/data/50/preferred +0 -2
  368. package/test/suites/data/51/merged +0 -3
  369. package/test/suites/data/51/other +0 -2
  370. package/test/suites/data/51/preferred +0 -2
  371. package/test/suites/data/52/merged +0 -2
  372. package/test/suites/data/52/other +0 -2
  373. package/test/suites/data/52/preferred +0 -2
  374. package/test/suites/data/53/merged +0 -3
  375. package/test/suites/data/53/other +0 -2
  376. package/test/suites/data/53/preferred +0 -2
  377. package/test/suites/data/54/merged +0 -3
  378. package/test/suites/data/54/other +0 -2
  379. package/test/suites/data/54/preferred +0 -2
  380. package/test/suites/data/55/merged +0 -3
  381. package/test/suites/data/55/other +0 -2
  382. package/test/suites/data/55/preferred +0 -2
  383. package/test/suites/data/56/merged +0 -2
  384. package/test/suites/data/56/other +0 -2
  385. package/test/suites/data/56/preferred +0 -2
  386. package/test/suites/data/57/descr +0 -1
  387. package/test/suites/data/57/merged +0 -4
  388. package/test/suites/data/57/other +0 -4
  389. package/test/suites/data/57/preferred +0 -4
  390. package/test/suites/data/58/descr +0 -1
  391. package/test/suites/data/58/merged +0 -2
  392. package/test/suites/data/58/other +0 -2
  393. package/test/suites/data/58/preferred +0 -2
  394. package/test/suites/data/59/descr +0 -1
  395. package/test/suites/data/59/merged +0 -2
  396. package/test/suites/data/59/other +0 -2
  397. package/test/suites/data/59/preferred +0 -2
  398. package/test/suites/data/6/descr +0 -1
  399. package/test/suites/data/6/merged +0 -2
  400. package/test/suites/data/6/other +0 -3
  401. package/test/suites/data/6/preferred +0 -2
  402. package/test/suites/data/60/descr +0 -1
  403. package/test/suites/data/60/merged +0 -2
  404. package/test/suites/data/60/other +0 -2
  405. package/test/suites/data/60/preferred +0 -2
  406. package/test/suites/data/61/descr +0 -1
  407. package/test/suites/data/61/merged +0 -2
  408. package/test/suites/data/61/other +0 -2
  409. package/test/suites/data/61/preferred +0 -2
  410. package/test/suites/data/62/descr +0 -1
  411. package/test/suites/data/62/merged +0 -3
  412. package/test/suites/data/62/other +0 -2
  413. package/test/suites/data/62/preferred +0 -2
  414. package/test/suites/data/63/descr +0 -1
  415. package/test/suites/data/63/merged +0 -3
  416. package/test/suites/data/63/other +0 -2
  417. package/test/suites/data/63/preferred +0 -2
  418. package/test/suites/data/64/merged +0 -2
  419. package/test/suites/data/64/other +0 -2
  420. package/test/suites/data/64/preferred +0 -2
  421. package/test/suites/data/65/merged +0 -3
  422. package/test/suites/data/65/other +0 -2
  423. package/test/suites/data/65/preferred +0 -2
  424. package/test/suites/data/66/merged +0 -2
  425. package/test/suites/data/66/other +0 -2
  426. package/test/suites/data/66/preferred +0 -2
  427. package/test/suites/data/67/merged +0 -2
  428. package/test/suites/data/67/other +0 -2
  429. package/test/suites/data/67/preferred +0 -2
  430. package/test/suites/data/68/merged +0 -2
  431. package/test/suites/data/68/other +0 -2
  432. package/test/suites/data/68/preferred +0 -2
  433. package/test/suites/data/69/merged +0 -2
  434. package/test/suites/data/69/other +0 -2
  435. package/test/suites/data/69/preferred +0 -2
  436. package/test/suites/data/7/descr +0 -1
  437. package/test/suites/data/7/merged +0 -4
  438. package/test/suites/data/7/other +0 -3
  439. package/test/suites/data/7/preferred +0 -3
  440. package/test/suites/data/70/merged +0 -2
  441. package/test/suites/data/70/other +0 -2
  442. package/test/suites/data/70/preferred +0 -2
  443. package/test/suites/data/71/merged +0 -3
  444. package/test/suites/data/71/other +0 -2
  445. package/test/suites/data/71/preferred +0 -2
  446. package/test/suites/data/72/merged +0 -5
  447. package/test/suites/data/72/other +0 -2
  448. package/test/suites/data/72/preferred +0 -4
  449. package/test/suites/data/73/merged +0 -3
  450. package/test/suites/data/73/other +0 -3
  451. package/test/suites/data/73/preferred +0 -3
  452. package/test/suites/data/74/1/merged +0 -3
  453. package/test/suites/data/74/1/other +0 -3
  454. package/test/suites/data/74/1/preferred +0 -2
  455. package/test/suites/data/74/merged +0 -4
  456. package/test/suites/data/74/other +0 -4
  457. package/test/suites/data/74/preferred +0 -2
  458. package/test/suites/data/75/74/1/merged +0 -3
  459. package/test/suites/data/75/74/1/other +0 -3
  460. package/test/suites/data/75/74/1/preferred +0 -2
  461. package/test/suites/data/75/74/merged +0 -4
  462. package/test/suites/data/75/74/other +0 -4
  463. package/test/suites/data/75/74/preferred +0 -2
  464. package/test/suites/data/75/merged +0 -4
  465. package/test/suites/data/75/other +0 -3
  466. package/test/suites/data/75/preferred +0 -2
  467. package/test/suites/data/76/merged +0 -2
  468. package/test/suites/data/76/other +0 -2
  469. package/test/suites/data/76/preferred +0 -2
  470. package/test/suites/data/77/descr +0 -1
  471. package/test/suites/data/77/merged +0 -2
  472. package/test/suites/data/77/other +0 -2
  473. package/test/suites/data/77/preferred +0 -2
  474. package/test/suites/data/78/merged +0 -3
  475. package/test/suites/data/78/other +0 -2
  476. package/test/suites/data/78/preferred +0 -2
  477. package/test/suites/data/79/merged +0 -2
  478. package/test/suites/data/79/other +0 -2
  479. package/test/suites/data/79/preferred +0 -2
  480. package/test/suites/data/8/descr +0 -1
  481. package/test/suites/data/8/merged +0 -3
  482. package/test/suites/data/8/other +0 -3
  483. package/test/suites/data/8/preferred +0 -3
  484. package/test/suites/data/80/merged +0 -3
  485. package/test/suites/data/80/other +0 -2
  486. package/test/suites/data/80/preferred +0 -2
  487. package/test/suites/data/81/merged +0 -2
  488. package/test/suites/data/81/other +0 -2
  489. package/test/suites/data/81/preferred +0 -2
  490. package/test/suites/data/82/merged +0 -2
  491. package/test/suites/data/82/other +0 -2
  492. package/test/suites/data/82/preferred +0 -2
  493. package/test/suites/data/83/merged +0 -2
  494. package/test/suites/data/83/other +0 -2
  495. package/test/suites/data/83/preferred +0 -1
  496. package/test/suites/data/84/merged +0 -2
  497. package/test/suites/data/84/other +0 -2
  498. package/test/suites/data/84/preferred +0 -1
  499. package/test/suites/data/85/merged +0 -2
  500. package/test/suites/data/85/other +0 -2
  501. package/test/suites/data/85/preferred +0 -2
  502. package/test/suites/data/86/merged +0 -2
  503. package/test/suites/data/86/other +0 -2
  504. package/test/suites/data/86/preferred +0 -1
  505. package/test/suites/data/87/merged +0 -2
  506. package/test/suites/data/87/other +0 -2
  507. package/test/suites/data/87/preferred +0 -1
  508. package/test/suites/data/88/merged +0 -2
  509. package/test/suites/data/88/other +0 -2
  510. package/test/suites/data/88/preferred +0 -1
  511. package/test/suites/data/9/descr +0 -1
  512. package/test/suites/data/9/merged +0 -2
  513. package/test/suites/data/9/other +0 -2
  514. package/test/suites/data/9/preferred +0 -2
  515. package/test/test.js +0 -1001
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+
3
+ var _chai = require("chai");
4
+
5
+ var _marcRecord = require("@natlibfi/marc-record");
6
+
7
+ var _select = _interopRequireWildcard(require("./select"));
8
+
9
+ var _fixura = require("@natlibfi/fixura");
10
+
11
+ var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
12
+
13
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
+
15
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
16
+
17
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
18
+
19
+ _marcRecord.MarcRecord.setValidationOptions({
20
+ subfieldValues: false
21
+ });
22
+
23
+ (0, _fixugen.default)({
24
+ callback,
25
+ path: [__dirname, '..', '..', 'test-fixtures', 'reducers', 'select'],
26
+ useMetadataFile: true,
27
+ recurse: false,
28
+ fixura: {
29
+ reader: _fixura.READERS.JSON,
30
+ failWhenNotFound: false
31
+ }
32
+ });
33
+
34
+ function callback({
35
+ getFixture,
36
+ disabled = false,
37
+ tagPatternRegExp = false,
38
+ expectedError = false,
39
+ useSubsetEquality = false
40
+ }) {
41
+ if (disabled) {
42
+ console.log('TEST DISABLED!'); // eslint-disable-line no-console
43
+
44
+ return;
45
+ }
46
+
47
+ const base = new _marcRecord.MarcRecord(getFixture('base.json'), {
48
+ subfieldValues: false
49
+ });
50
+ const source = new _marcRecord.MarcRecord(getFixture('source.json'), {
51
+ subfieldValues: false
52
+ });
53
+ const tagPattern = new RegExp(tagPatternRegExp, 'u');
54
+ const expectedRecord = getFixture('merged.json');
55
+ const equalityFunction = useSubsetEquality ? _select.subsetEquality : undefined; // Bypass expected error in testing
56
+
57
+ if (expectedError) {
58
+ (0, _chai.expect)(() => _select.default.to.throw(Error, 'control field'));
59
+ return;
60
+ }
61
+
62
+ const mergedRecord = (0, _select.default)({
63
+ tagPattern,
64
+ equalityFunction
65
+ })(base, source);
66
+ (0, _chai.expect)(mergedRecord.toObject()).to.eql(expectedRecord);
67
+ }
68
+ //# sourceMappingURL=select.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.spec.js","names":["MarcRecord","setValidationOptions","subfieldValues","generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","failWhenNotFound","getFixture","disabled","tagPatternRegExp","expectedError","useSubsetEquality","console","log","base","source","tagPattern","RegExp","expectedRecord","equalityFunction","subsetEquality","undefined","expect","createReducer","to","throw","Error","mergedRecord","toObject","eql"],"sources":["../../src/reducers/select.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport createReducer, {subsetEquality} from './select';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\n\nMarcRecord.setValidationOptions({subfieldValues: false});\n\ngenerateTests({\n callback,\n path: [__dirname, '..', '..', 'test-fixtures', 'reducers', 'select'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON,\n failWhenNotFound: false\n }\n});\n\nfunction callback({\n getFixture,\n disabled = false,\n tagPatternRegExp = false,\n expectedError = false,\n useSubsetEquality = false\n}) {\n if (disabled) {\n console.log('TEST DISABLED!'); // eslint-disable-line no-console\n return;\n }\n const base = new MarcRecord(getFixture('base.json'), {subfieldValues: false});\n const source = new MarcRecord(getFixture('source.json'), {subfieldValues: false});\n const tagPattern = new RegExp(tagPatternRegExp, 'u');\n const expectedRecord = getFixture('merged.json');\n const equalityFunction = useSubsetEquality ? subsetEquality : undefined;\n\n // Bypass expected error in testing\n if (expectedError) {\n expect(() => createReducer.to.throw(Error, 'control field'));\n return;\n }\n\n const mergedRecord = createReducer({tagPattern, equalityFunction})(base, source);\n expect(mergedRecord.toObject()).to.eql(expectedRecord);\n}\n"],"mappings":";;AAAA;;AACA;;AACA;;AACA;;AACA;;;;;;;;AAEAA,sBAAA,CAAWC,oBAAX,CAAgC;EAACC,cAAc,EAAE;AAAjB,CAAhC;;AAEA,IAAAC,gBAAA,EAAc;EACZC,QADY;EAEZC,IAAI,EAAE,CAACC,SAAD,EAAY,IAAZ,EAAkB,IAAlB,EAAwB,eAAxB,EAAyC,UAAzC,EAAqD,QAArD,CAFM;EAGZC,eAAe,EAAE,IAHL;EAIZC,OAAO,EAAE,KAJG;EAKZC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAA,CAAQC,IADV;IAENC,gBAAgB,EAAE;EAFZ;AALI,CAAd;;AAWA,SAAST,QAAT,CAAkB;EAChBU,UADgB;EAEhBC,QAAQ,GAAG,KAFK;EAGhBC,gBAAgB,GAAG,KAHH;EAIhBC,aAAa,GAAG,KAJA;EAKhBC,iBAAiB,GAAG;AALJ,CAAlB,EAMG;EACD,IAAIH,QAAJ,EAAc;IACZI,OAAO,CAACC,GAAR,CAAY,gBAAZ,EADY,CACmB;;IAC/B;EACD;;EACD,MAAMC,IAAI,GAAG,IAAIrB,sBAAJ,CAAec,UAAU,CAAC,WAAD,CAAzB,EAAwC;IAACZ,cAAc,EAAE;EAAjB,CAAxC,CAAb;EACA,MAAMoB,MAAM,GAAG,IAAItB,sBAAJ,CAAec,UAAU,CAAC,aAAD,CAAzB,EAA0C;IAACZ,cAAc,EAAE;EAAjB,CAA1C,CAAf;EACA,MAAMqB,UAAU,GAAG,IAAIC,MAAJ,CAAWR,gBAAX,EAA6B,GAA7B,CAAnB;EACA,MAAMS,cAAc,GAAGX,UAAU,CAAC,aAAD,CAAjC;EACA,MAAMY,gBAAgB,GAAGR,iBAAiB,GAAGS,sBAAH,GAAoBC,SAA9D,CATC,CAWD;;EACA,IAAIX,aAAJ,EAAmB;IACjB,IAAAY,YAAA,EAAO,MAAMC,eAAA,CAAcC,EAAd,CAAiBC,KAAjB,CAAuBC,KAAvB,EAA8B,eAA9B,CAAb;IACA;EACD;;EAED,MAAMC,YAAY,GAAG,IAAAJ,eAAA,EAAc;IAACP,UAAD;IAAaG;EAAb,CAAd,EAA8CL,IAA9C,EAAoDC,MAApD,CAArB;EACA,IAAAO,YAAA,EAAOK,YAAY,CAACC,QAAb,EAAP,EAAgCJ,EAAhC,CAAmCK,GAAnC,CAAuCX,cAAvC;AACD"}
package/package.json CHANGED
@@ -1,59 +1,105 @@
1
1
  {
2
- "name": "@natlibfi/marc-record-merge",
3
- "description": "A configurable Javascript module for merging MARC records",
4
- "author": {
5
- "name": "The National Library of Finland"
6
- },
7
- "keywords": [
8
- "marc",
9
- "record",
10
- "merge",
11
- "merging",
12
- "combine",
13
- "combining",
14
- "bibliography",
15
- "bibliographic",
16
- "catalog",
17
- "library",
18
- "libraries"
19
- ],
20
- "homepage": "https://github.com/NatLibFi/marc-record-merge",
21
- "bugs": {
22
- "url": "https://github.com/NatLibFi/marc-record-merge/issues"
23
- },
24
- "repository": {
25
- "type": "git",
26
- "url": "git@github.com:NatLibFi/marc-record-merge.git"
27
- },
28
- "license": "AGPL-3.0",
29
- "version": "5.0.0",
30
- "main": "./lib/main.js",
31
- "scripts": {
32
- "lint": "jshint .",
33
- "test": "istanbul cover _mocha test/nodejs/*.spec.js",
34
- "test:watch": "mocha test/nodejs/*.spec.js -w",
35
- "test-browser": "npm run generate-requirejs-config && karma start",
36
- "cover": "npm run test && istanbul check-coverage",
37
- "check": "npm run lint && npm run cover",
38
- "generate-requirejs-config": "requirejs-configurator --npm --include-dev-dependencies --exclude-peer-dependencies > test/browser/main.js",
39
- "publish-to-npm": "npm install && npm run check && npm publish --access=public"
40
- },
41
- "dependencies": {
42
- "marc-record-js": "^0.1.1",
43
- "@natlibfi/es6-polyfills": "^2.0.0",
44
- "@natlibfi/es6-shims": "^2.0.0"
45
- },
46
- "devDependencies": {
47
- "chai": "^3.5.0",
48
- "jshint": "^2.9.3",
49
- "mocha": "^3.0.2",
50
- "istanbul": "^0.4.5",
51
- "karma": "^1.2.0",
52
- "karma-mocha": "^1.1.1",
53
- "karma-requirejs": "https://github.com/natlibfi-arlehiko/karma-requirejs#fix-npm3-dist",
54
- "karma-requirejs-preprocessor": "^0.0.2",
55
- "requirejs": "^2.3.2",
56
- "requirejs-configurator": "https://github.com/natlibfi-arlehiko/requirejs-configurator#peer-deps",
57
- "codeclimate-test-reporter": "^0.3.3"
58
- }
2
+ "name": "@natlibfi/marc-record-merge",
3
+ "description": "Merge MARC records",
4
+ "author": {
5
+ "name": "The National Library of Finland"
6
+ },
7
+ "keywords": [],
8
+ "homepage": "https://github.com/natlibfi/marc-record-merge-js",
9
+ "bugs": {
10
+ "url": "https://github.com/natlibfi/marc-record-merge-js/issues"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git@github.com:natlibfi/marc-record-merge-js.git"
15
+ },
16
+ "license": "MIT",
17
+ "version": "6.0.0-beta.4",
18
+ "main": "./dist/index.js",
19
+ "engines": {
20
+ "node": ">=14"
21
+ },
22
+ "type": "commonjs",
23
+ "scripts": {
24
+ "prepare": "npm run build",
25
+ "prepublishOnly": "npm run build:transpile",
26
+ "lint": "eslint ./src",
27
+ "lint:dev": "eslint ./src --fix",
28
+ "test:base": "cross-env NODE_ENV=test mocha --require @babel/register --reporter-option maxDiffSize=15000 src/reducers/*.spec.js",
29
+ "test": "npm run lint && npm run test:base",
30
+ "test:dev": "npm run lint:dev && npm run coverage",
31
+ "coverage": "npm run coverage:unit && npm run coverage:report",
32
+ "coverage:unit": "nyc --silent npm run test:base",
33
+ "coverage:report": "nyc report --reporter=text",
34
+ "build:transpile": "babel src --copy-files --source-maps --delete-dir-on-start --out-dir=dist",
35
+ "build": "npm run build:transpile",
36
+ "dev:test": "cross-env DEBUG=@natlibfi/* NODE_ENV=test nodemon -w src -w test-fixtures --exec 'clear && npm run test:dev'"
37
+ },
38
+ "dependencies": {
39
+ "@natlibfi/fixugen": "^1.0.2",
40
+ "@natlibfi/fixura": "^2.2.1",
41
+ "@natlibfi/marc-record": "^7.1.0-alpha.1",
42
+ "debug": "^4.3.4",
43
+ "normalize-diacritics": "^2.13.2"
44
+ },
45
+ "devDependencies": {
46
+ "@babel/cli": "^7.17.10",
47
+ "@babel/core": "^7.18.0",
48
+ "@babel/eslint-parser": "^7.17.0",
49
+ "@babel/preset-env": "^7.18.0",
50
+ "@babel/register": "^7.17.7",
51
+ "@natlibfi/eslint-config-melinda-backend": "^2.0.0",
52
+ "babel-plugin-istanbul": "^6.1.1",
53
+ "babel-plugin-rewire": "^1.2.0",
54
+ "chai": "^4.3.4",
55
+ "cross-env": "^7.0.3",
56
+ "eslint": "^8.16.0",
57
+ "mocha": "^10.0.0",
58
+ "nodemon": "^2.0.16",
59
+ "nyc": "^15.1.0"
60
+ },
61
+ "eslintConfig": {
62
+ "extends": [
63
+ "@natlibfi/melinda-backend"
64
+ ]
65
+ },
66
+ "babel": {
67
+ "presets": [
68
+ [
69
+ "@babel/preset-env",
70
+ {
71
+ "targets": {
72
+ "node": "14"
73
+ }
74
+ }
75
+ ]
76
+ ],
77
+ "env": {
78
+ "test": {
79
+ "plugins": [
80
+ "rewire",
81
+ "istanbul"
82
+ ]
83
+ }
84
+ }
85
+ },
86
+ "nyc": {
87
+ "exclude": [
88
+ "*/*.spec.js",
89
+ "*/**/*.spec.js"
90
+ ],
91
+ "reporter": [
92
+ "lcov",
93
+ "html"
94
+ ],
95
+ "require": [
96
+ "@babel/register"
97
+ ],
98
+ "sourceMap": false,
99
+ "instrument": false,
100
+ "lines": 80,
101
+ "statements": 80,
102
+ "functions": 80,
103
+ "branches": 80
104
+ }
59
105
  }
package/src/index.js ADDED
@@ -0,0 +1,4 @@
1
+ import Reducers from './reducers';
2
+
3
+ export {Reducers};
4
+ export default ({base, source, reducers}) => reducers.reduce((base, reducer) => reducer(base, source), base);
@@ -0,0 +1,274 @@
1
+ /* eslint-disable no-unused-vars */
2
+
3
+ import {MarcRecord} from '@natlibfi/marc-record';
4
+ import createDebugLogger from 'debug';
5
+
6
+ export default ({
7
+ tagPattern,
8
+ compareTagsOnly = false,
9
+ compareWithoutIndicators = false,
10
+ subfieldsMustBeIdentical = true,
11
+ excludeSubfields = [],
12
+ dropSubfields = [],
13
+ copyUnless = [],
14
+ baseValidators = {subfieldValues: false},
15
+ sourceValidators = {subfieldValues: false}
16
+ }) => (base, source) => {
17
+ const baseRecord = new MarcRecord(base, baseValidators);
18
+ const sourceRecord = new MarcRecord(source, sourceValidators);
19
+
20
+ const debug = createDebugLogger('@natlibfi/marc-record-merge');
21
+ const debugOptions = createDebugLogger('@natlibfi/marc-record-merge:compare-options');
22
+ const debugCompare = createDebugLogger('@natlibfi/marc-record-merge:compare');
23
+ debugOptions(`Tag Pattern: ${tagPattern}`);
24
+ debugOptions(`Compare tags only: ${compareTagsOnly}`);
25
+ debugOptions(`Compare without indicators ${compareWithoutIndicators}`);
26
+ debugOptions(`Copy if identical: ${subfieldsMustBeIdentical}`);
27
+ debugOptions(`Exclude subfields: [${excludeSubfields}]`);
28
+ debugOptions(`Drop subfields [${dropSubfields}]`);
29
+ debugOptions(`Copy unless contains subfields: ${JSON.stringify(copyUnless)}`);
30
+
31
+ const baseFields = baseRecord.get(tagPattern);
32
+ const sourceFields = sourceRecord.get(tagPattern);
33
+
34
+ debug(`Base fields: `, baseFields);
35
+ debug(`Source fields: `, sourceFields);
36
+
37
+ const compareResultFields = compareFields(sourceFields, baseFields);
38
+ const droppedUnwantedSubfield = checkDropSubfields(compareResultFields);
39
+ const droppedUnwantedFields = checkCopyUnlessFields(droppedUnwantedSubfield);
40
+ debug('Fields to be copied');
41
+ debug(JSON.stringify(droppedUnwantedFields));
42
+
43
+ // Add fields to base;
44
+ droppedUnwantedFields.forEach(field => baseRecord.insertField(field));
45
+ return baseRecord.toObject();
46
+ //return copyFields(baseFields, sourceFields);
47
+
48
+ function compareFields(sourceFields, baseFields, uniqFields = []) {
49
+ const [sourceField, ...rest] = sourceFields;
50
+ if (sourceField === undefined) {
51
+ return uniqFields;
52
+ }
53
+
54
+ if (baseFields.length === 0) {
55
+ return compareFields(rest, baseFields, [...uniqFields, sourceField]);
56
+ }
57
+
58
+ // Source and base are also compared for identicalness
59
+ // Non-identical fields are copied from source to base as duplicates
60
+ const sourceComapareField = createCompareField(sourceField);
61
+ const baseCompareFields = baseFields.map(baseField => createCompareField(baseField));
62
+
63
+ const unique = checkCompareFields(baseCompareFields, sourceComapareField);
64
+
65
+ debugCompare(`${JSON.stringify(sourceField)} ${unique ? 'is UNIQUE' : 'not UNIQUE'}`);
66
+
67
+ if (unique) {
68
+ return compareFields(rest, baseFields, [...uniqFields, sourceField]);
69
+ }
70
+
71
+ return compareFields(rest, baseFields, uniqFields);
72
+
73
+ function checkCompareFields(baseCompareFields, sourceComapareField) {
74
+ const [baseCompareField, ...rest] = baseCompareFields;
75
+ if (baseCompareField === undefined) {
76
+ return true;
77
+ }
78
+
79
+ if (sourceComapareField.value !== baseCompareField.value) {
80
+ debugCompare(`Value is different ${sourceComapareField.value} !== ${baseCompareField.value}`);
81
+ return true;
82
+ }
83
+
84
+ if (sourceComapareField.ind1 !== baseCompareField.ind1) {
85
+ debugCompare(`Ind1 is different ${sourceComapareField.ind1} !== ${baseCompareField.ind1}`);
86
+ return true;
87
+ }
88
+
89
+ if (sourceComapareField.ind2 !== baseCompareField.ind2) {
90
+ debugCompare(`Ind2 is different ${sourceComapareField.ind2} !== ${baseCompareField.ind2}`);
91
+ return true;
92
+ }
93
+
94
+ if ('subfields' in sourceComapareField) {
95
+ const allFound = checkSubfields(sourceComapareField.subfields, baseCompareField.subfields);
96
+ debugCompare(`Subfields are different ${!allFound}`);
97
+ return allFound ? false : checkCompareFields(rest, sourceComapareField);
98
+ }
99
+
100
+ return false;
101
+ }
102
+
103
+ function checkSubfields(sourceSubfields, baseSubfields) {
104
+ const foundSubs = sourceSubfields.filter(sSub => baseSubfields.some(bSub => sSub.code === bSub.code && sSub.value === bSub.value));
105
+
106
+ if (subfieldsMustBeIdentical) {
107
+ return foundSubs.length === sourceSubfields.length && foundSubs.length === baseSubfields.length;
108
+ }
109
+
110
+ return foundSubs.length === sourceSubfields.length;
111
+ }
112
+ }
113
+
114
+ function createCompareField(field) {
115
+ if (compareTagsOnly) {
116
+ return {tag: field.tag};
117
+ }
118
+
119
+ if ('value' in field) {
120
+ return {tag: field.tag, value: field.value};
121
+ }
122
+
123
+ const [filteredField] = checkDropSubfields([field]);
124
+
125
+ const params = [
126
+ {name: 'tag', value: field.tag},
127
+ {name: 'ind1', value: compareWithoutIndicators ? undefined : field.ind1},
128
+ {name: 'ind2', value: compareWithoutIndicators ? undefined : field.ind2},
129
+ {name: 'subfields', value: createCompareSubfields(filteredField.subfields)}
130
+ ].map(param => [param.name, param.value]);
131
+
132
+ return Object.fromEntries(params);
133
+
134
+ function createCompareSubfields(subfields) {
135
+ const nonExcludedSubfields = subfields.filter(sub => !excludeSubfields.some(code => code === sub.code));
136
+ const normalizedSubfields = nonExcludedSubfields.map(sub => ({code: sub.code, value: normalizeSubfieldValue(sub.value)}));
137
+
138
+ return normalizedSubfields;
139
+
140
+ function normalizeSubfieldValue(value) {
141
+ return value.toLowerCase().replace(/\s+/ug, '');
142
+ }
143
+ }
144
+ }
145
+
146
+ function checkDropSubfields(fields) {
147
+ if (dropSubfields.length > 0) {
148
+ return fields.map(field => ({...field, subfields: dropSubfieldsFunc(field.subfields)}))
149
+ .filter(field => field.subfields.length > 0);
150
+ }
151
+
152
+ return fields;
153
+
154
+ function dropSubfieldsFunc(subfields) {
155
+ return subfields.filter(sub => { // eslint-disable-line
156
+ return !dropSubfields.some(({code, value = false, condition = false}) => {
157
+ if (code !== sub.code) {
158
+ return false;
159
+ }
160
+
161
+ if (!condition && value) {
162
+ return value === sub.value;
163
+ }
164
+
165
+ if (condition === 'unless' && value) {
166
+ return !new RegExp(value, 'u').test(sub.value);
167
+ }
168
+
169
+ return true;
170
+ });
171
+ });
172
+ }
173
+ }
174
+
175
+ function checkCopyUnlessFields(fields) {
176
+ if (copyUnless.length > 0) {
177
+ return fields.filter(({subfields}) => copyUnless.some(filter => !subfields.some(sub => sub.code === filter.code && new RegExp(filter.value, 'u').test(sub.value))));
178
+ }
179
+
180
+ return fields;
181
+ }
182
+ };
183
+
184
+ // function copyFields() { //eslint-disable-line no-unused-vars
185
+ // const sourceTags = sourceFields.map(field => field.tag);
186
+ // sourceTags.forEach(tag => debug(`Comparing field ${tag}`));
187
+
188
+ // /*
189
+ // if (combine.length > 0) {
190
+ // debug(`*** NOW Copy options: ${tagPattern}, ${compareTagsOnly}, ${compareWithoutIndicators}, ${subfieldsMustBeIdentical}, [${combine}], [${excludeSubfields}], [${dropSubfields}]`);
191
+ // combine.forEach(row => debug(` ### combine ${row} <- `));
192
+ // return [];
193
+ // }
194
+ // */
195
+
196
+ // // If compareTagsOnly = true, only this part is run
197
+ // // The field is copied from source only if it is missing completely from base
198
+ // if (compareTagsOnly && baseFields.length === 0) {
199
+ // sourceTags.forEach(tag => debug(`Missing field ${tag} copied from source to base`));
200
+ // sourceFields.forEach(f => base.insertField(f));
201
+ // return true;
202
+ // }
203
+
204
+ // // If compareTagsOnly = false (default)
205
+ // // Source and base are also compared for identicalness
206
+ // // Non-identical fields are copied from source to base as duplicates
207
+ // if (!compareTagsOnly) {
208
+ // const filterMissing = function (sourceField) {
209
+ // if ('value' in sourceField) {
210
+ // debug(`Checking control field ${sourceField.tag} for identicalness`);
211
+ // return baseFields.some(isIdenticalControlField) === false;
212
+ // }
213
+ // if ('subfields' in sourceField) {
214
+ // debug(`Checking data field ${sourceField.tag} for identicalness`);
215
+ // return baseFields.some(isIdenticalDataField) === false;
216
+ // }
217
+
218
+ // function normalizeControlField(field) {
219
+ // return field.value.toLowerCase().replace(/\s+/u, '');
220
+ // }
221
+
222
+ // function isIdenticalControlField(baseField) {
223
+ // const normalizedBaseField = normalizeControlField(baseField);
224
+ // const normalizedSourceField = normalizeControlField(sourceField);
225
+ // return normalizedSourceField === normalizedBaseField;
226
+ // }
227
+
228
+ // function isIdenticalDataField(baseField) {
229
+ // // If excluded subfields have been defined for this field, they must be ignored first
230
+ // // (i.e. source and base fields are considered identical if all non-excluded subfields are identical)
231
+ // if (excludeSubfields.length > 0 &&
232
+ // sourceField.tag === baseField.tag &&
233
+ // sourceField.ind1 === baseField.ind1 &&
234
+ // sourceField.ind2 === baseField.ind2) {
235
+ // excludeSubfields.forEach(sub => debug(`Subfield ${sub} excluded from identicalness comparison`));
236
+ // // Compare only those subfields that are not excluded
237
+ // const baseSubsToCompare = baseField.subfields.filter(subfield => excludeSubfields.indexOf(subfield.code) === -1);
238
+ // return baseSubsToCompare.every(isIdenticalSubfield);
239
+ // }
240
+ // // If there are no excluded subfields (default case)
241
+ // if (sourceField.tag === baseField.tag &&
242
+ // sourceField.ind1 === baseField.ind1 &&
243
+ // sourceField.ind2 === baseField.ind2 &&
244
+ // sourceField.subfields.length === baseField.subfields.length) {
245
+ // return baseField.subfields.every(isIdenticalSubfield);
246
+ // }
247
+ // function normalizeSubfield(subfield) {
248
+ // return subfield.value.toLowerCase().replace(/\s+/u, '');
249
+ // }
250
+ // function isIdenticalSubfield(baseSub) {
251
+ // const normBaseSub = normalizeSubfield(baseSub);
252
+ // return sourceField.subfields.some(sourceSub => {
253
+ // const normSourceSub = normalizeSubfield(sourceSub);
254
+ // return normSourceSub === normBaseSub;
255
+ // });
256
+ // }
257
+ // }
258
+ // };
259
+ // // Search for fields missing from base
260
+ // const missingFields = sourceFields.filter(filterMissing);
261
+ // missingFields.forEach(f => base.insertField(f));
262
+ // if (missingFields.length > 0) {
263
+ // const missingTags = missingFields.map(field => field.tag);
264
+ // missingTags.forEach(tag => debug(`Field ${tag} copied from source to base`));
265
+ // return base;
266
+ // }
267
+ // if (missingFields.length === 0) {
268
+ // debug(`No missing fields found`);
269
+ // return base;
270
+ // }
271
+ // }
272
+ // debug(`No missing fields found`);
273
+ // return base;
274
+ // }
@@ -0,0 +1,48 @@
1
+ import {expect} from 'chai';
2
+ import {READERS} from '@natlibfi/fixura';
3
+ import {MarcRecord} from '@natlibfi/marc-record';
4
+ import createReducer from './copy';
5
+ import generateTests from '@natlibfi/fixugen';
6
+
7
+ // import createDebugLogger from 'debug'; // <---
8
+ // const debug = createDebugLogger('@natlibfi/marc-record-merge/copy.spec.js'); // <---
9
+
10
+ generateTests({
11
+ callback,
12
+ path: [__dirname, '..', '..', 'test-fixtures', 'reducers', 'copy'],
13
+ useMetadataFile: true,
14
+ recurse: true,
15
+ fixura: {
16
+ reader: READERS.JSON,
17
+ failWhenNotFound: false
18
+ }
19
+ });
20
+
21
+ function callback({
22
+ getFixture,
23
+ tagPatternRegExp,
24
+ compareTagsOnly = false,
25
+ compareWithoutIndicators = false,
26
+ subfieldsMustBeIdentical = false,
27
+ copyUnless = undefined,
28
+ excludeSubfields = undefined,
29
+ dropSubfields = undefined,
30
+ disabled = false
31
+ }) {
32
+ if (disabled) {
33
+ console.log('TEST DISABLED!'); // eslint-disable-line no-console
34
+ return;
35
+ }
36
+
37
+ const base = new MarcRecord(getFixture('base.json'), {subfieldValues: false});
38
+ const source = new MarcRecord(getFixture('source.json'), {subfieldValues: false});
39
+ const tagPattern = new RegExp(tagPatternRegExp, 'u');
40
+ const expectedRecord = getFixture('merged.json');
41
+
42
+ const mergedRecord = createReducer({tagPattern, compareTagsOnly, compareWithoutIndicators, copyUnless, subfieldsMustBeIdentical, excludeSubfields, dropSubfields})(base, source);
43
+ //debug(`*** mergedRecord: `, mergedRecord); //<--
44
+ //debug(`*** mergedRecord,Strfy: `, JSON.stringify(mergedRecord.toObject())); //<--
45
+ //debug(`*** expectedRecord: `, expectedRecord); //<--
46
+ //debug(`*** expectedRecord,Strfy: `, JSON.stringify(expectedRecord)); //<--
47
+ expect(mergedRecord).to.eql(expectedRecord);
48
+ }
@@ -0,0 +1,4 @@
1
+ import copy from './copy';
2
+ import select, {strictEquality, subsetEquality} from './select';
3
+
4
+ export default {copy, select, strictEquality, subsetEquality};