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

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 (579) hide show
  1. package/.github/CODEOWNERS +9 -0
  2. package/.github/dependabot.yml +41 -0
  3. package/.github/workflows/melinda-node-tests.yml +60 -0
  4. package/LICENSE +21 -0
  5. package/README.md +90 -242
  6. package/dist/index.js +55 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/reducers/copy.js +249 -0
  9. package/dist/reducers/copy.js.map +1 -0
  10. package/dist/reducers/copy.spec.js +64 -0
  11. package/dist/reducers/copy.spec.js.map +1 -0
  12. package/dist/reducers/index.js +19 -0
  13. package/dist/reducers/index.js.map +1 -0
  14. package/dist/reducers/select.js +118 -0
  15. package/dist/reducers/select.js.map +1 -0
  16. package/dist/reducers/select.spec.js +55 -0
  17. package/dist/reducers/select.spec.js.map +1 -0
  18. package/package.json +101 -57
  19. package/src/index.js +34 -0
  20. package/src/reducers/copy.js +251 -0
  21. package/src/reducers/copy.spec.js +54 -0
  22. package/src/reducers/index.js +4 -0
  23. package/src/reducers/select.js +110 -0
  24. package/src/reducers/select.spec.js +49 -0
  25. package/test-fixtures/reducers/copy/01 - copy/01/base.json +9 -0
  26. package/test-fixtures/reducers/copy/01 - copy/01/merged.json +20 -0
  27. package/test-fixtures/reducers/copy/01 - copy/01/metadata.json +4 -0
  28. package/test-fixtures/reducers/copy/01 - copy/01/source.json +20 -0
  29. package/test-fixtures/reducers/copy/01 - copy/02/base.json +20 -0
  30. package/test-fixtures/reducers/copy/01 - copy/02/merged.json +20 -0
  31. package/test-fixtures/reducers/copy/01 - copy/02/metadata.json +4 -0
  32. package/test-fixtures/reducers/copy/01 - copy/02/source.json +20 -0
  33. package/test-fixtures/reducers/copy/01 - copy/03/base.json +20 -0
  34. package/test-fixtures/reducers/copy/01 - copy/03/merged.json +28 -0
  35. package/test-fixtures/reducers/copy/01 - copy/03/metadata.json +4 -0
  36. package/test-fixtures/reducers/copy/01 - copy/03/source.json +24 -0
  37. package/test-fixtures/reducers/copy/01 - copy/04/base.json +39 -0
  38. package/test-fixtures/reducers/copy/01 - copy/04/merged.json +39 -0
  39. package/test-fixtures/reducers/copy/01 - copy/04/metadata.json +4 -0
  40. package/test-fixtures/reducers/copy/01 - copy/04/source.json +39 -0
  41. package/test-fixtures/reducers/copy/01 - copy/05/base.json +39 -0
  42. package/test-fixtures/reducers/copy/01 - copy/05/merged.json +77 -0
  43. package/test-fixtures/reducers/copy/01 - copy/05/metadata.json +4 -0
  44. package/test-fixtures/reducers/copy/01 - copy/05/source.json +62 -0
  45. package/test-fixtures/reducers/copy/01 - copy/06/base.json +24 -0
  46. package/test-fixtures/reducers/copy/01 - copy/06/merged.json +39 -0
  47. package/test-fixtures/reducers/copy/01 - copy/06/metadata.json +4 -0
  48. package/test-fixtures/reducers/copy/01 - copy/06/source.json +24 -0
  49. package/test-fixtures/reducers/copy/01 - copy/07/base.json +39 -0
  50. package/test-fixtures/reducers/copy/01 - copy/07/merged.json +39 -0
  51. package/test-fixtures/reducers/copy/01 - copy/07/metadata.json +5 -0
  52. package/test-fixtures/reducers/copy/01 - copy/07/source.json +24 -0
  53. package/test-fixtures/reducers/copy/01 - copy/08/base.json +28 -0
  54. package/test-fixtures/reducers/copy/01 - copy/08/merged.json +28 -0
  55. package/test-fixtures/reducers/copy/01 - copy/08/metadata.json +4 -0
  56. package/test-fixtures/reducers/copy/01 - copy/08/source.json +24 -0
  57. package/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/01/base.json +17 -0
  58. package/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/01/merged.json +20 -0
  59. package/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/01/metadata.json +6 -0
  60. package/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/01/source.json +20 -0
  61. package/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/02/base.json +9 -0
  62. package/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/02/merged.json +20 -0
  63. package/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/02/metadata.json +6 -0
  64. package/test-fixtures/reducers/copy/02 - doNotCopyIfFieldPresent/02/source.json +20 -0
  65. package/test-fixtures/reducers/copy/03 - compareTagsOnly/01/base.json +24 -0
  66. package/test-fixtures/reducers/copy/03 - compareTagsOnly/01/merged.json +24 -0
  67. package/test-fixtures/reducers/copy/03 - compareTagsOnly/01/metadata.json +5 -0
  68. package/test-fixtures/reducers/copy/03 - compareTagsOnly/01/source.json +24 -0
  69. package/test-fixtures/reducers/copy/03 - compareTagsOnly/02/base.json +24 -0
  70. package/test-fixtures/reducers/copy/03 - compareTagsOnly/02/merged.json +100 -0
  71. package/test-fixtures/reducers/copy/03 - compareTagsOnly/02/metadata.json +5 -0
  72. package/test-fixtures/reducers/copy/03 - compareTagsOnly/02/source.json +100 -0
  73. package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/01/base.json +24 -0
  74. package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/01/merged.json +24 -0
  75. package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/01/metadata.json +5 -0
  76. package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/01/source.json +24 -0
  77. package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/02/base.json +24 -0
  78. package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/02/merged.json +39 -0
  79. package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/02/metadata.json +5 -0
  80. package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/02/source.json +24 -0
  81. package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/03/metadata.json +6 -0
  82. package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/04/base.json +20 -0
  83. package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/04/merged.json +31 -0
  84. package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/04/metadata.json +5 -0
  85. package/test-fixtures/reducers/copy/04 - compareWithoutIndicators/04/source.json +20 -0
  86. package/test-fixtures/reducers/copy/05 - copyUnless/01/base.json +9 -0
  87. package/test-fixtures/reducers/copy/05 - copyUnless/01/merged.json +24 -0
  88. package/test-fixtures/reducers/copy/05 - copyUnless/01/metadata.json +5 -0
  89. package/test-fixtures/reducers/copy/05 - copyUnless/01/source.json +47 -0
  90. package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/01/base.json +24 -0
  91. package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/01/merged.json +39 -0
  92. package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/01/metadata.json +5 -0
  93. package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/01/source.json +24 -0
  94. package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/02/base.json +24 -0
  95. package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/02/merged.json +24 -0
  96. package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/02/metadata.json +5 -0
  97. package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/02/source.json +24 -0
  98. package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/03/base.json +28 -0
  99. package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/03/merged.json +43 -0
  100. package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/03/metadata.json +5 -0
  101. package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/03/source.json +24 -0
  102. package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/04/base.json +28 -0
  103. package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/04/merged.json +28 -0
  104. package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/04/metadata.json +5 -0
  105. package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/04/source.json +24 -0
  106. package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/05/base.json +20 -0
  107. package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/05/merged.json +35 -0
  108. package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/05/metadata.json +5 -0
  109. package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/05/source.json +24 -0
  110. package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/06/base.json +20 -0
  111. package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/06/merged.json +35 -0
  112. package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/06/metadata.json +5 -0
  113. package/test-fixtures/reducers/copy/06 - subfieldsMustBeIdentical/06/source.json +24 -0
  114. package/test-fixtures/reducers/copy/07 - excludeSubfields/01/base.json +39 -0
  115. package/test-fixtures/reducers/copy/07 - excludeSubfields/01/merged.json +39 -0
  116. package/test-fixtures/reducers/copy/07 - excludeSubfields/01/metadata.json +8 -0
  117. package/test-fixtures/reducers/copy/07 - excludeSubfields/01/source.json +43 -0
  118. package/test-fixtures/reducers/copy/07 - excludeSubfields/02/base.json +39 -0
  119. package/test-fixtures/reducers/copy/07 - excludeSubfields/02/merged.json +58 -0
  120. package/test-fixtures/reducers/copy/07 - excludeSubfields/02/metadata.json +5 -0
  121. package/test-fixtures/reducers/copy/07 - excludeSubfields/02/source.json +43 -0
  122. package/test-fixtures/reducers/copy/08 - dropSubfields/01/base.json +35 -0
  123. package/test-fixtures/reducers/copy/08 - dropSubfields/01/merged.json +54 -0
  124. package/test-fixtures/reducers/copy/08 - dropSubfields/01/metadata.json +5 -0
  125. package/test-fixtures/reducers/copy/08 - dropSubfields/01/source.json +43 -0
  126. package/test-fixtures/reducers/copy/08 - dropSubfields/02/base.json +43 -0
  127. package/test-fixtures/reducers/copy/08 - dropSubfields/02/merged.json +58 -0
  128. package/test-fixtures/reducers/copy/08 - dropSubfields/02/metadata.json +5 -0
  129. package/test-fixtures/reducers/copy/08 - dropSubfields/02/source.json +32 -0
  130. package/test-fixtures/reducers/copy/08 - dropSubfields/03/base.json +43 -0
  131. package/test-fixtures/reducers/copy/08 - dropSubfields/03/merged.json +58 -0
  132. package/test-fixtures/reducers/copy/08 - dropSubfields/03/metadata.json +5 -0
  133. package/test-fixtures/reducers/copy/08 - dropSubfields/03/source.json +32 -0
  134. package/test-fixtures/reducers/copy/08 - dropSubfields/04/base.json +43 -0
  135. package/test-fixtures/reducers/copy/08 - dropSubfields/04/merged.json +43 -0
  136. package/test-fixtures/reducers/copy/08 - dropSubfields/04/metadata.json +5 -0
  137. package/test-fixtures/reducers/copy/08 - dropSubfields/04/source.json +32 -0
  138. package/test-fixtures/reducers/copy/09 - swapSubfieldCode/01/base.json +9 -0
  139. package/test-fixtures/reducers/copy/09 - swapSubfieldCode/01/merged.json +20 -0
  140. package/test-fixtures/reducers/copy/09 - swapSubfieldCode/01/metadata.json +6 -0
  141. package/test-fixtures/reducers/copy/09 - swapSubfieldCode/01/source.json +20 -0
  142. package/test-fixtures/reducers/copy/09 - swapSubfieldCode/02/base.json +9 -0
  143. package/test-fixtures/reducers/copy/09 - swapSubfieldCode/02/merged.json +20 -0
  144. package/test-fixtures/reducers/copy/09 - swapSubfieldCode/02/metadata.json +6 -0
  145. package/test-fixtures/reducers/copy/09 - swapSubfieldCode/02/source.json +20 -0
  146. package/test-fixtures/reducers/copy/09 - swapSubfieldCode/03/base.json +9 -0
  147. package/test-fixtures/reducers/copy/09 - swapSubfieldCode/03/merged.json +31 -0
  148. package/test-fixtures/reducers/copy/09 - swapSubfieldCode/03/metadata.json +6 -0
  149. package/test-fixtures/reducers/copy/09 - swapSubfieldCode/03/source.json +31 -0
  150. package/test-fixtures/reducers/copy/09 - swapSubfieldCode/04/base.json +9 -0
  151. package/test-fixtures/reducers/copy/09 - swapSubfieldCode/04/merged.json +42 -0
  152. package/test-fixtures/reducers/copy/09 - swapSubfieldCode/04/metadata.json +6 -0
  153. package/test-fixtures/reducers/copy/09 - swapSubfieldCode/04/source.json +42 -0
  154. package/test-fixtures/reducers/copy/10 - swapTag/01/base.json +17 -0
  155. package/test-fixtures/reducers/copy/10 - swapTag/01/merged.json +28 -0
  156. package/test-fixtures/reducers/copy/10 - swapTag/01/metadata.json +6 -0
  157. package/test-fixtures/reducers/copy/10 - swapTag/01/source.json +20 -0
  158. package/test-fixtures/reducers/copy/11 - compareWithoutTag/01/base.json +28 -0
  159. package/test-fixtures/reducers/copy/11 - compareWithoutTag/01/merged.json +28 -0
  160. package/test-fixtures/reducers/copy/11 - compareWithoutTag/01/metadata.json +6 -0
  161. package/test-fixtures/reducers/copy/11 - compareWithoutTag/01/source.json +20 -0
  162. package/test-fixtures/reducers/copy/11 - compareWithoutTag/02/base.json +28 -0
  163. package/test-fixtures/reducers/copy/11 - compareWithoutTag/02/merged.json +39 -0
  164. package/test-fixtures/reducers/copy/11 - compareWithoutTag/02/metadata.json +6 -0
  165. package/test-fixtures/reducers/copy/11 - compareWithoutTag/02/source.json +31 -0
  166. package/test-fixtures/reducers/copy/11 - compareWithoutTag/03/base.json +28 -0
  167. package/test-fixtures/reducers/copy/11 - compareWithoutTag/03/merged.json +28 -0
  168. package/test-fixtures/reducers/copy/11 - compareWithoutTag/03/metadata.json +7 -0
  169. package/test-fixtures/reducers/copy/11 - compareWithoutTag/03/source.json +20 -0
  170. package/test-fixtures/reducers/copy/11 - compareWithoutTag/04/base.json +17 -0
  171. package/test-fixtures/reducers/copy/11 - compareWithoutTag/04/merged.json +28 -0
  172. package/test-fixtures/reducers/copy/11 - compareWithoutTag/04/metadata.json +7 -0
  173. package/test-fixtures/reducers/copy/11 - compareWithoutTag/04/source.json +31 -0
  174. package/test-fixtures/reducers/copy/11 - compareWithoutTag/05/base.json +28 -0
  175. package/test-fixtures/reducers/copy/11 - compareWithoutTag/05/merged.json +28 -0
  176. package/test-fixtures/reducers/copy/11 - compareWithoutTag/05/metadata.json +7 -0
  177. package/test-fixtures/reducers/copy/11 - compareWithoutTag/05/source.json +28 -0
  178. package/test-fixtures/reducers/metadata.json +4 -0
  179. package/test-fixtures/reducers/select/01/base.json +21 -0
  180. package/test-fixtures/reducers/select/01/merged.json +20 -0
  181. package/test-fixtures/reducers/select/01/metadata.json +5 -0
  182. package/test-fixtures/reducers/select/01/source.json +20 -0
  183. package/test-fixtures/reducers/select/02/base.json +31 -0
  184. package/test-fixtures/reducers/select/02/merged.json +31 -0
  185. package/test-fixtures/reducers/select/02/metadata.json +4 -0
  186. package/test-fixtures/reducers/select/02/source.json +42 -0
  187. package/test-fixtures/reducers/select/03/base.json +20 -0
  188. package/test-fixtures/reducers/select/03/merged.json +20 -0
  189. package/test-fixtures/reducers/select/03/metadata.json +4 -0
  190. package/test-fixtures/reducers/select/03/source.json +20 -0
  191. package/test-fixtures/reducers/select/04/base.json +20 -0
  192. package/test-fixtures/reducers/select/04/merged.json +20 -0
  193. package/test-fixtures/reducers/select/04/metadata.json +5 -0
  194. package/test-fixtures/reducers/select/04/source.json +20 -0
  195. package/test-fixtures/reducers/select/05/base.json +24 -0
  196. package/test-fixtures/reducers/select/05/merged.json +24 -0
  197. package/test-fixtures/reducers/select/05/metadata.json +4 -0
  198. package/test-fixtures/reducers/select/05/source.json +24 -0
  199. package/test-fixtures/reducers/select/06/base.json +28 -0
  200. package/test-fixtures/reducers/select/06/merged.json +28 -0
  201. package/test-fixtures/reducers/select/06/metadata.json +4 -0
  202. package/test-fixtures/reducers/select/06/source.json +28 -0
  203. package/test-fixtures/reducers/select/07/base.json +24 -0
  204. package/test-fixtures/reducers/select/07/merged.json +24 -0
  205. package/test-fixtures/reducers/select/07/metadata.json +5 -0
  206. package/test-fixtures/reducers/select/07/source.json +24 -0
  207. package/test-fixtures/reducers/select/08/base.json +24 -0
  208. package/test-fixtures/reducers/select/08/merged.json +24 -0
  209. package/test-fixtures/reducers/select/08/metadata.json +4 -0
  210. package/test-fixtures/reducers/select/08/source.json +24 -0
  211. package/test-fixtures/reducers/select/09/base.json +24 -0
  212. package/test-fixtures/reducers/select/09/merged.json +24 -0
  213. package/test-fixtures/reducers/select/09/metadata.json +4 -0
  214. package/test-fixtures/reducers/select/09/source.json +24 -0
  215. package/test-fixtures/reducers/select/10/base.json +24 -0
  216. package/test-fixtures/reducers/select/10/merged.json +28 -0
  217. package/test-fixtures/reducers/select/10/metadata.json +5 -0
  218. package/test-fixtures/reducers/select/10/source.json +28 -0
  219. package/test-fixtures/reducers/select/11/base.json +24 -0
  220. package/test-fixtures/reducers/select/11/merged.json +24 -0
  221. package/test-fixtures/reducers/select/11/metadata.json +4 -0
  222. package/test-fixtures/reducers/select/11/source.json +28 -0
  223. package/test-fixtures/reducers/select/12/base.json +24 -0
  224. package/test-fixtures/reducers/select/12/merged.json +28 -0
  225. package/test-fixtures/reducers/select/12/metadata.json +5 -0
  226. package/test-fixtures/reducers/select/12/source.json +28 -0
  227. package/test-fixtures/reducers/select/13/base.json +28 -0
  228. package/test-fixtures/reducers/select/13/merged.json +28 -0
  229. package/test-fixtures/reducers/select/13/metadata.json +4 -0
  230. package/test-fixtures/reducers/select/13/source.json +24 -0
  231. package/test-fixtures/reducers/select/14/base.json +24 -0
  232. package/test-fixtures/reducers/select/14/merged.json +24 -0
  233. package/test-fixtures/reducers/select/14/metadata.json +4 -0
  234. package/test-fixtures/reducers/select/14/source.json +24 -0
  235. package/.editorconfig +0 -10
  236. package/.istanbul.yml +0 -6
  237. package/.jshintignore +0 -2
  238. package/.jshintrc +0 -3
  239. package/.travis.yml +0 -16
  240. package/LICENSE.txt +0 -661
  241. package/karma.conf.js +0 -39
  242. package/lib/main.js +0 -1215
  243. package/resources/action-copy-options-schema.json +0 -81
  244. package/resources/action-select-better-options-schema.json +0 -34
  245. package/resources/configuration-schema.json +0 -46
  246. package/test/browser/main.spec.js +0 -96
  247. package/test/nodejs/main.spec.js +0 -71
  248. package/test/suites/74.json +0 -10
  249. package/test/suites/config/1to3.json +0 -10
  250. package/test/suites/config/27to28.json +0 -10
  251. package/test/suites/config/29to31.json +0 -10
  252. package/test/suites/config/32to40.json +0 -16
  253. package/test/suites/config/41to43.json +0 -10
  254. package/test/suites/config/44to56.json +0 -15
  255. package/test/suites/config/4to26.json +0 -81
  256. package/test/suites/config/57to63.json +0 -63
  257. package/test/suites/config/64.json +0 -7
  258. package/test/suites/config/65.json +0 -19
  259. package/test/suites/config/66.json +0 -13
  260. package/test/suites/config/67.json +0 -14
  261. package/test/suites/config/68.json +0 -12
  262. package/test/suites/config/69.json +0 -12
  263. package/test/suites/config/70.json +0 -13
  264. package/test/suites/config/71.json +0 -10
  265. package/test/suites/config/72.json +0 -12
  266. package/test/suites/config/73.json +0 -10
  267. package/test/suites/config/76.json +0 -13
  268. package/test/suites/config/77.json +0 -11
  269. package/test/suites/config/78to79.json +0 -12
  270. package/test/suites/config/80to81.json +0 -12
  271. package/test/suites/config/82.json +0 -10
  272. package/test/suites/config/83to85.json +0 -15
  273. package/test/suites/config/86.json +0 -16
  274. package/test/suites/config/87.json +0 -15
  275. package/test/suites/config/88.json +0 -16
  276. package/test/suites/data/1/merged +0 -3
  277. package/test/suites/data/1/other +0 -3
  278. package/test/suites/data/1/preferred +0 -2
  279. package/test/suites/data/10/descr +0 -1
  280. package/test/suites/data/10/merged +0 -2
  281. package/test/suites/data/10/other +0 -2
  282. package/test/suites/data/10/preferred +0 -2
  283. package/test/suites/data/11/descr +0 -1
  284. package/test/suites/data/11/merged +0 -2
  285. package/test/suites/data/11/other +0 -2
  286. package/test/suites/data/11/preferred +0 -2
  287. package/test/suites/data/12/descr +0 -1
  288. package/test/suites/data/12/merged +0 -2
  289. package/test/suites/data/12/other +0 -2
  290. package/test/suites/data/12/preferred +0 -2
  291. package/test/suites/data/13/descr +0 -1
  292. package/test/suites/data/13/merged +0 -3
  293. package/test/suites/data/13/other +0 -2
  294. package/test/suites/data/13/preferred +0 -3
  295. package/test/suites/data/14/descr +0 -1
  296. package/test/suites/data/14/merged +0 -2
  297. package/test/suites/data/14/other +0 -2
  298. package/test/suites/data/14/preferred +0 -2
  299. package/test/suites/data/15/descr +0 -1
  300. package/test/suites/data/15/merged +0 -2
  301. package/test/suites/data/15/other +0 -2
  302. package/test/suites/data/15/preferred +0 -2
  303. package/test/suites/data/16/descr +0 -1
  304. package/test/suites/data/16/merged +0 -2
  305. package/test/suites/data/16/other +0 -2
  306. package/test/suites/data/16/preferred +0 -2
  307. package/test/suites/data/17/descr +0 -1
  308. package/test/suites/data/17/merged +0 -2
  309. package/test/suites/data/17/other +0 -2
  310. package/test/suites/data/17/preferred +0 -2
  311. package/test/suites/data/18/descr +0 -1
  312. package/test/suites/data/18/merged +0 -2
  313. package/test/suites/data/18/other +0 -2
  314. package/test/suites/data/18/preferred +0 -2
  315. package/test/suites/data/19/descr +0 -1
  316. package/test/suites/data/19/merged +0 -2
  317. package/test/suites/data/19/other +0 -2
  318. package/test/suites/data/19/preferred +0 -2
  319. package/test/suites/data/2/merged +0 -3
  320. package/test/suites/data/2/other +0 -2
  321. package/test/suites/data/2/preferred +0 -3
  322. package/test/suites/data/20/descr +0 -1
  323. package/test/suites/data/20/merged +0 -3
  324. package/test/suites/data/20/other +0 -2
  325. package/test/suites/data/20/preferred +0 -2
  326. package/test/suites/data/21/descr +0 -1
  327. package/test/suites/data/21/merged +0 -4
  328. package/test/suites/data/21/other +0 -4
  329. package/test/suites/data/21/preferred +0 -3
  330. package/test/suites/data/22/descr +0 -1
  331. package/test/suites/data/22/merged +0 -10
  332. package/test/suites/data/22/other +0 -7
  333. package/test/suites/data/22/preferred +0 -10
  334. package/test/suites/data/23/descr +0 -1
  335. package/test/suites/data/23/merged +0 -2
  336. package/test/suites/data/23/other +0 -2
  337. package/test/suites/data/23/preferred +0 -2
  338. package/test/suites/data/24/descr +0 -1
  339. package/test/suites/data/24/merged +0 -2
  340. package/test/suites/data/24/other +0 -2
  341. package/test/suites/data/24/preferred +0 -2
  342. package/test/suites/data/25/descr +0 -1
  343. package/test/suites/data/25/merged +0 -2
  344. package/test/suites/data/25/other +0 -2
  345. package/test/suites/data/25/preferred +0 -2
  346. package/test/suites/data/26/descr +0 -1
  347. package/test/suites/data/26/merged +0 -3
  348. package/test/suites/data/26/other +0 -3
  349. package/test/suites/data/26/preferred +0 -3
  350. package/test/suites/data/27/merged +0 -3
  351. package/test/suites/data/27/other +0 -2
  352. package/test/suites/data/27/preferred +0 -2
  353. package/test/suites/data/28/merged +0 -3
  354. package/test/suites/data/28/other +0 -2
  355. package/test/suites/data/28/preferred +0 -2
  356. package/test/suites/data/29/merged +0 -2
  357. package/test/suites/data/29/other +0 -2
  358. package/test/suites/data/29/preferred +0 -2
  359. package/test/suites/data/3/merged +0 -3
  360. package/test/suites/data/3/other +0 -3
  361. package/test/suites/data/3/preferred +0 -3
  362. package/test/suites/data/30/merged +0 -3
  363. package/test/suites/data/30/other +0 -2
  364. package/test/suites/data/30/preferred +0 -2
  365. package/test/suites/data/31/merged +0 -3
  366. package/test/suites/data/31/other +0 -2
  367. package/test/suites/data/31/preferred +0 -3
  368. package/test/suites/data/32/other +0 -2
  369. package/test/suites/data/32/preferred +0 -3
  370. package/test/suites/data/33/merged +0 -2
  371. package/test/suites/data/33/other +0 -2
  372. package/test/suites/data/33/preferred +0 -2
  373. package/test/suites/data/34/merged +0 -2
  374. package/test/suites/data/34/other +0 -2
  375. package/test/suites/data/34/preferred +0 -2
  376. package/test/suites/data/35/merged +0 -2
  377. package/test/suites/data/35/other +0 -2
  378. package/test/suites/data/35/preferred +0 -2
  379. package/test/suites/data/36/merged +0 -2
  380. package/test/suites/data/36/other +0 -2
  381. package/test/suites/data/36/preferred +0 -2
  382. package/test/suites/data/37/merged +0 -3
  383. package/test/suites/data/37/other +0 -2
  384. package/test/suites/data/37/preferred +0 -2
  385. package/test/suites/data/38/merged +0 -3
  386. package/test/suites/data/38/other +0 -2
  387. package/test/suites/data/38/preferred +0 -2
  388. package/test/suites/data/39/merged +0 -2
  389. package/test/suites/data/39/other +0 -2
  390. package/test/suites/data/39/preferred +0 -2
  391. package/test/suites/data/4/descr +0 -1
  392. package/test/suites/data/4/merged +0 -2
  393. package/test/suites/data/4/other +0 -2
  394. package/test/suites/data/4/preferred +0 -2
  395. package/test/suites/data/40/merged +0 -2
  396. package/test/suites/data/40/other +0 -2
  397. package/test/suites/data/40/preferred +0 -2
  398. package/test/suites/data/41/merged +0 -2
  399. package/test/suites/data/41/other +0 -2
  400. package/test/suites/data/41/preferred +0 -2
  401. package/test/suites/data/42/merged +0 -2
  402. package/test/suites/data/42/other +0 -2
  403. package/test/suites/data/42/preferred +0 -2
  404. package/test/suites/data/43/merged +0 -2
  405. package/test/suites/data/43/other +0 -2
  406. package/test/suites/data/43/preferred +0 -2
  407. package/test/suites/data/44/merged +0 -2
  408. package/test/suites/data/44/other +0 -2
  409. package/test/suites/data/44/preferred +0 -2
  410. package/test/suites/data/45/merged +0 -2
  411. package/test/suites/data/45/other +0 -2
  412. package/test/suites/data/45/preferred +0 -2
  413. package/test/suites/data/46/merged +0 -2
  414. package/test/suites/data/46/other +0 -2
  415. package/test/suites/data/46/preferred +0 -2
  416. package/test/suites/data/47/merged +0 -2
  417. package/test/suites/data/47/other +0 -2
  418. package/test/suites/data/47/preferred +0 -2
  419. package/test/suites/data/48/merged +0 -2
  420. package/test/suites/data/48/other +0 -2
  421. package/test/suites/data/48/preferred +0 -2
  422. package/test/suites/data/49/merged +0 -3
  423. package/test/suites/data/49/other +0 -2
  424. package/test/suites/data/49/preferred +0 -2
  425. package/test/suites/data/5/descr +0 -1
  426. package/test/suites/data/5/merged +0 -2
  427. package/test/suites/data/5/other +0 -2
  428. package/test/suites/data/5/preferred +0 -2
  429. package/test/suites/data/50/merged +0 -3
  430. package/test/suites/data/50/other +0 -2
  431. package/test/suites/data/50/preferred +0 -2
  432. package/test/suites/data/51/merged +0 -3
  433. package/test/suites/data/51/other +0 -2
  434. package/test/suites/data/51/preferred +0 -2
  435. package/test/suites/data/52/merged +0 -2
  436. package/test/suites/data/52/other +0 -2
  437. package/test/suites/data/52/preferred +0 -2
  438. package/test/suites/data/53/merged +0 -3
  439. package/test/suites/data/53/other +0 -2
  440. package/test/suites/data/53/preferred +0 -2
  441. package/test/suites/data/54/merged +0 -3
  442. package/test/suites/data/54/other +0 -2
  443. package/test/suites/data/54/preferred +0 -2
  444. package/test/suites/data/55/merged +0 -3
  445. package/test/suites/data/55/other +0 -2
  446. package/test/suites/data/55/preferred +0 -2
  447. package/test/suites/data/56/merged +0 -2
  448. package/test/suites/data/56/other +0 -2
  449. package/test/suites/data/56/preferred +0 -2
  450. package/test/suites/data/57/descr +0 -1
  451. package/test/suites/data/57/merged +0 -4
  452. package/test/suites/data/57/other +0 -4
  453. package/test/suites/data/57/preferred +0 -4
  454. package/test/suites/data/58/descr +0 -1
  455. package/test/suites/data/58/merged +0 -2
  456. package/test/suites/data/58/other +0 -2
  457. package/test/suites/data/58/preferred +0 -2
  458. package/test/suites/data/59/descr +0 -1
  459. package/test/suites/data/59/merged +0 -2
  460. package/test/suites/data/59/other +0 -2
  461. package/test/suites/data/59/preferred +0 -2
  462. package/test/suites/data/6/descr +0 -1
  463. package/test/suites/data/6/merged +0 -2
  464. package/test/suites/data/6/other +0 -3
  465. package/test/suites/data/6/preferred +0 -2
  466. package/test/suites/data/60/descr +0 -1
  467. package/test/suites/data/60/merged +0 -2
  468. package/test/suites/data/60/other +0 -2
  469. package/test/suites/data/60/preferred +0 -2
  470. package/test/suites/data/61/descr +0 -1
  471. package/test/suites/data/61/merged +0 -2
  472. package/test/suites/data/61/other +0 -2
  473. package/test/suites/data/61/preferred +0 -2
  474. package/test/suites/data/62/descr +0 -1
  475. package/test/suites/data/62/merged +0 -3
  476. package/test/suites/data/62/other +0 -2
  477. package/test/suites/data/62/preferred +0 -2
  478. package/test/suites/data/63/descr +0 -1
  479. package/test/suites/data/63/merged +0 -3
  480. package/test/suites/data/63/other +0 -2
  481. package/test/suites/data/63/preferred +0 -2
  482. package/test/suites/data/64/merged +0 -2
  483. package/test/suites/data/64/other +0 -2
  484. package/test/suites/data/64/preferred +0 -2
  485. package/test/suites/data/65/merged +0 -3
  486. package/test/suites/data/65/other +0 -2
  487. package/test/suites/data/65/preferred +0 -2
  488. package/test/suites/data/66/merged +0 -2
  489. package/test/suites/data/66/other +0 -2
  490. package/test/suites/data/66/preferred +0 -2
  491. package/test/suites/data/67/merged +0 -2
  492. package/test/suites/data/67/other +0 -2
  493. package/test/suites/data/67/preferred +0 -2
  494. package/test/suites/data/68/merged +0 -2
  495. package/test/suites/data/68/other +0 -2
  496. package/test/suites/data/68/preferred +0 -2
  497. package/test/suites/data/69/merged +0 -2
  498. package/test/suites/data/69/other +0 -2
  499. package/test/suites/data/69/preferred +0 -2
  500. package/test/suites/data/7/descr +0 -1
  501. package/test/suites/data/7/merged +0 -4
  502. package/test/suites/data/7/other +0 -3
  503. package/test/suites/data/7/preferred +0 -3
  504. package/test/suites/data/70/merged +0 -2
  505. package/test/suites/data/70/other +0 -2
  506. package/test/suites/data/70/preferred +0 -2
  507. package/test/suites/data/71/merged +0 -3
  508. package/test/suites/data/71/other +0 -2
  509. package/test/suites/data/71/preferred +0 -2
  510. package/test/suites/data/72/merged +0 -5
  511. package/test/suites/data/72/other +0 -2
  512. package/test/suites/data/72/preferred +0 -4
  513. package/test/suites/data/73/merged +0 -3
  514. package/test/suites/data/73/other +0 -3
  515. package/test/suites/data/73/preferred +0 -3
  516. package/test/suites/data/74/1/merged +0 -3
  517. package/test/suites/data/74/1/other +0 -3
  518. package/test/suites/data/74/1/preferred +0 -2
  519. package/test/suites/data/74/merged +0 -4
  520. package/test/suites/data/74/other +0 -4
  521. package/test/suites/data/74/preferred +0 -2
  522. package/test/suites/data/75/74/1/merged +0 -3
  523. package/test/suites/data/75/74/1/other +0 -3
  524. package/test/suites/data/75/74/1/preferred +0 -2
  525. package/test/suites/data/75/74/merged +0 -4
  526. package/test/suites/data/75/74/other +0 -4
  527. package/test/suites/data/75/74/preferred +0 -2
  528. package/test/suites/data/75/merged +0 -4
  529. package/test/suites/data/75/other +0 -3
  530. package/test/suites/data/75/preferred +0 -2
  531. package/test/suites/data/76/merged +0 -2
  532. package/test/suites/data/76/other +0 -2
  533. package/test/suites/data/76/preferred +0 -2
  534. package/test/suites/data/77/descr +0 -1
  535. package/test/suites/data/77/merged +0 -2
  536. package/test/suites/data/77/other +0 -2
  537. package/test/suites/data/77/preferred +0 -2
  538. package/test/suites/data/78/merged +0 -3
  539. package/test/suites/data/78/other +0 -2
  540. package/test/suites/data/78/preferred +0 -2
  541. package/test/suites/data/79/merged +0 -2
  542. package/test/suites/data/79/other +0 -2
  543. package/test/suites/data/79/preferred +0 -2
  544. package/test/suites/data/8/descr +0 -1
  545. package/test/suites/data/8/merged +0 -3
  546. package/test/suites/data/8/other +0 -3
  547. package/test/suites/data/8/preferred +0 -3
  548. package/test/suites/data/80/merged +0 -3
  549. package/test/suites/data/80/other +0 -2
  550. package/test/suites/data/80/preferred +0 -2
  551. package/test/suites/data/81/merged +0 -2
  552. package/test/suites/data/81/other +0 -2
  553. package/test/suites/data/81/preferred +0 -2
  554. package/test/suites/data/82/merged +0 -2
  555. package/test/suites/data/82/other +0 -2
  556. package/test/suites/data/82/preferred +0 -2
  557. package/test/suites/data/83/merged +0 -2
  558. package/test/suites/data/83/other +0 -2
  559. package/test/suites/data/83/preferred +0 -1
  560. package/test/suites/data/84/merged +0 -2
  561. package/test/suites/data/84/other +0 -2
  562. package/test/suites/data/84/preferred +0 -1
  563. package/test/suites/data/85/merged +0 -2
  564. package/test/suites/data/85/other +0 -2
  565. package/test/suites/data/85/preferred +0 -2
  566. package/test/suites/data/86/merged +0 -2
  567. package/test/suites/data/86/other +0 -2
  568. package/test/suites/data/86/preferred +0 -1
  569. package/test/suites/data/87/merged +0 -2
  570. package/test/suites/data/87/other +0 -2
  571. package/test/suites/data/87/preferred +0 -1
  572. package/test/suites/data/88/merged +0 -2
  573. package/test/suites/data/88/other +0 -2
  574. package/test/suites/data/88/preferred +0 -1
  575. package/test/suites/data/9/descr +0 -1
  576. package/test/suites/data/9/merged +0 -2
  577. package/test/suites/data/9/other +0 -2
  578. package/test/suites/data/9/preferred +0 -2
  579. package/test/test.js +0 -1001
package/package.json CHANGED
@@ -1,59 +1,103 @@
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.10",
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",
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 NODE_ENV=test nodemon -w src -w test-fixtures --exec 'clear && npm run test:dev'",
37
+ "dev:test:debug": "cross-env DEBUG=@natlibfi/* NODE_ENV=test nodemon -w src -w test-fixtures --exec 'clear && npm run test:dev'"
38
+ },
39
+ "dependencies": {
40
+ "@natlibfi/fixugen": "1.1.0",
41
+ "@natlibfi/fixura": "^2.2.1",
42
+ "@natlibfi/marc-record": "^7.1.0-alpha.2",
43
+ "debug": "^4.3.4",
44
+ "normalize-diacritics": "2.14.0"
45
+ },
46
+ "devDependencies": {
47
+ "@babel/cli": "^7.17.10",
48
+ "@babel/core": "^7.18.5",
49
+ "@babel/eslint-parser": "^7.18.2",
50
+ "@babel/preset-env": "^7.18.2",
51
+ "@babel/register": "^7.17.7",
52
+ "@natlibfi/eslint-config-melinda-backend": "^2.0.0",
53
+ "babel-plugin-istanbul": "^6.1.1",
54
+ "babel-plugin-rewire": "^1.2.0",
55
+ "chai": "^4.3.6",
56
+ "cross-env": "^7.0.3",
57
+ "eslint": "^8.17.0",
58
+ "mocha": "^10.0.0",
59
+ "nodemon": "^2.0.16",
60
+ "nyc": "^15.1.0"
61
+ },
62
+ "eslintConfig": {
63
+ "extends": [
64
+ "@natlibfi/melinda-backend"
65
+ ]
66
+ },
67
+ "babel": {
68
+ "presets": [
69
+ [
70
+ "@babel/preset-env",
71
+ {
72
+ "targets": "maintained node versions"
73
+ }
74
+ ]
75
+ ],
76
+ "env": {
77
+ "test": {
78
+ "plugins": [
79
+ "rewire",
80
+ "istanbul"
81
+ ]
82
+ }
83
+ }
84
+ },
85
+ "nyc": {
86
+ "exclude": [
87
+ "*/*.spec.js",
88
+ "*/**/*.spec.js"
89
+ ],
90
+ "reporter": [
91
+ "text"
92
+ ],
93
+ "require": [
94
+ "@babel/register"
95
+ ],
96
+ "sourceMap": false,
97
+ "instrument": false,
98
+ "lines": 80,
99
+ "statements": 80,
100
+ "functions": 80,
101
+ "branches": 80
102
+ }
59
103
  }
package/src/index.js ADDED
@@ -0,0 +1,34 @@
1
+ import Reducers from './reducers';
2
+
3
+ export {Reducers};
4
+ // export default ({base, source, reducers}) => reducers.reduce((base, reducer) => reducer(base, source), base);
5
+
6
+ // NV: Modified the reducer loop so, that not only base, but also is carried back.
7
+ // However, we try to be backward-compatible: normally after the reducers, only base is returned.
8
+ export default ({base, source, reducers}) => {
9
+ const combo = {base, source}; // eslint-disable-line functional/no-let
10
+
11
+ reducers.reduce((combo, reducer) => {
12
+ combo = singleRound(reducer, combo.base, combo.source); // eslint-disable-line no-param-reassign
13
+
14
+ return combo;
15
+ }, combo);
16
+
17
+ // Hack to make my melinda-marc-record-merge-reducers single tests that expect both
18
+ // base and source to return them both:
19
+ if (reducers.length === 1 && combo.base && combo.source) {
20
+ return combo;
21
+ }
22
+ // All other tests return just base... Backward (compability) it is!
23
+ return combo.base;
24
+
25
+ function singleRound(reducer, base, source) {
26
+ const combo = reducer(base, source);
27
+ if (combo.base !== undefined && combo.source !== undefined) {
28
+ //console.info('NEW STYLE REDUCER RESULT v2'); // eslint-disable-line no-console
29
+ return combo;
30
+ }
31
+ //console.info('OLD SCHOOL REDUCER RESULT v2'); // eslint-disable-line no-console
32
+ return {base: combo.base, source};
33
+ }
34
+ };
@@ -0,0 +1,251 @@
1
+ /* eslint-disable max-statements */
2
+ /* eslint-disable no-unused-vars */
3
+
4
+ import {MarcRecord} from '@natlibfi/marc-record';
5
+ import createDebugLogger from 'debug';
6
+
7
+ export default ({
8
+ tagPattern,
9
+ compareTagsOnly = false,
10
+ compareWithoutTag = false,
11
+ compareWithoutIndicators = false,
12
+ compareWithoutIndicator1 = false,
13
+ compareWithoutIndicator2 = false,
14
+ subfieldsMustBeIdentical = true,
15
+ excludeSubfields = [],
16
+ dropSubfields = [],
17
+ copyUnless = [],
18
+ baseValidators = {subfieldValues: false},
19
+ sourceValidators = {subfieldValues: false},
20
+ swapTag = [],
21
+ swapSubfieldCode = [],
22
+ doNotCopyIfFieldPresent = false
23
+ }) => (base, source) => {
24
+ const baseRecord = new MarcRecord(base, baseValidators);
25
+ const sourceRecord = new MarcRecord(source, sourceValidators);
26
+
27
+ const debug = createDebugLogger('@natlibfi/marc-record-merge');
28
+ const debugOptions = createDebugLogger('@natlibfi/marc-record-merge:compare-options');
29
+ const debugCompare = createDebugLogger('@natlibfi/marc-record-merge:compare');
30
+
31
+ const ignoreInd1 = compareWithoutIndicators || compareWithoutIndicator1;
32
+ const ignoreInd2 = compareWithoutIndicators || compareWithoutIndicator2;
33
+
34
+ debugOptions(`Tag Pattern: ${tagPattern}`);
35
+ debugOptions(`Compare tags only: ${compareTagsOnly}`);
36
+ debugOptions(`Omit indicator 1 from comparison: ${ignoreInd1}`);
37
+ debugOptions(`Omit indicator 2 from comparison: ${ignoreInd2}`);
38
+ debugOptions(`Copy if identical: ${subfieldsMustBeIdentical}`);
39
+ debugOptions(`Exclude subfields: [${excludeSubfields}]`);
40
+ debugOptions(`Drop subfields [${dropSubfields}]`);
41
+ debugOptions(`Copy unless contains subfields: ${JSON.stringify(copyUnless)}`);
42
+
43
+ const baseFields = baseRecord.get(tagPattern);
44
+ const sourceFields = sourceRecord.get(tagPattern);
45
+ const doNotCopy = doNotCopyIfFieldPresent ? baseRecord.get(doNotCopyIfFieldPresent).length > 0 : false;
46
+
47
+ if (doNotCopy) {
48
+ return baseRecord.toObject();
49
+ }
50
+ debug(`FFS: ${compareWithoutIndicator1}, ${compareWithoutIndicators}, ${ignoreInd1}`);
51
+ debug(`Base fields: `, baseFields);
52
+ debug(`Source fields: `, sourceFields);
53
+
54
+ // Logic steps
55
+ const baseCompareFields = baseFields.map(baseField => createCompareField(baseField));
56
+ const compareResultFields = compareFields(sourceFields, baseCompareFields);
57
+ const droppedUnwantedSubfield = checkDropSubfields(compareResultFields);
58
+ const droppedUnwantedFields = checkCopyUnlessFields(droppedUnwantedSubfield);
59
+ const swappedSubfields = checkSwapSubfieldCodes(droppedUnwantedFields);
60
+ const swappedTags = checkSwapTag(swappedSubfields);
61
+ const uniqueFields = [...new Set(swappedTags.map(field => JSON.stringify(field)))].map(field => JSON.parse(field));
62
+ debug('Fields to be copied');
63
+ debug(JSON.stringify(uniqueFields));
64
+
65
+ // Add fields to base;
66
+ uniqueFields.forEach(field => baseRecord.insertField(field));
67
+ return baseRecord.toObject();
68
+
69
+ function compareFields(sourceFields, baseCompareFields, uniqFields = []) {
70
+ const [sourceField, ...rest] = sourceFields;
71
+ if (sourceField === undefined) {
72
+ return uniqFields;
73
+ }
74
+
75
+ if (baseCompareFields.length === 0) {
76
+ return compareFields(rest, baseCompareFields, [...uniqFields, sourceField]);
77
+ }
78
+
79
+ // Source and base are also compared for identicalness
80
+ // Non-identical fields are copied from source to base as duplicates
81
+ const sourceCompareField = createCompareField(sourceField);
82
+ const unique = checkCompareFields(baseCompareFields, sourceCompareField);
83
+
84
+ debugCompare(`${JSON.stringify(sourceField)} ${unique ? 'is UNIQUE' : 'not UNIQUE'}`);
85
+
86
+ if (unique) {
87
+ return compareFields(rest, baseCompareFields, [...uniqFields, sourceField]);
88
+ }
89
+
90
+ return compareFields(rest, baseCompareFields, uniqFields);
91
+
92
+ function checkCompareFields(baseCompareFields, sourceCompareField) {
93
+ let unique = true; // eslint-disable-line functional/no-let
94
+
95
+ baseCompareFields.forEach(baseCompareField => {
96
+ debugCompare(`Comparing ${JSON.stringify(sourceCompareField)} to ${JSON.stringify(baseCompareField)}}`);
97
+
98
+ if (sourceCompareField.value !== baseCompareField.value) {
99
+ debugCompare(`Value is different ${sourceCompareField.value} !== ${baseCompareField.value}`);
100
+ return;
101
+ }
102
+
103
+ if (sourceCompareField.ind1 !== baseCompareField.ind1) {
104
+ debugCompare(`Ind1 is different ${sourceCompareField.ind1} !== ${baseCompareField.ind1}`);
105
+ return;
106
+ }
107
+
108
+ if (sourceCompareField.ind2 !== baseCompareField.ind2) {
109
+ debugCompare(`Ind2 is different ${sourceCompareField.ind2} !== ${baseCompareField.ind2}`);
110
+ return;
111
+ }
112
+
113
+ if ('subfields' in sourceCompareField) {
114
+ const allFound = checkSubfields(sourceCompareField.subfields, baseCompareField.subfields);
115
+ debugCompare(`Subfields are different ${!allFound}`);
116
+ if (!allFound) {
117
+ return;
118
+ }
119
+
120
+ unique = false;
121
+ return;
122
+ }
123
+
124
+ unique = false;
125
+ return;
126
+ });
127
+
128
+ return unique;
129
+ }
130
+
131
+ function checkSubfields(sourceSubfields, baseSubfields) {
132
+ const foundSubs = sourceSubfields.filter(sSub => baseSubfields.some(bSub => sSub.code === bSub.code && sSub.value === bSub.value));
133
+
134
+ if (subfieldsMustBeIdentical) {
135
+ return foundSubs.length === sourceSubfields.length && foundSubs.length === baseSubfields.length;
136
+ }
137
+
138
+ return foundSubs.length === sourceSubfields.length;
139
+ }
140
+ }
141
+
142
+ // compare objects have only fields that matter in comparison
143
+ function createCompareField(field) {
144
+ if (compareTagsOnly) {
145
+ return {tag: field.tag};
146
+ }
147
+
148
+ if ('value' in field) {
149
+ return {tag: field.tag, value: field.value};
150
+ }
151
+
152
+ const [filteredField] = checkDropSubfields([field]);
153
+ const [foundRule] = swapTag.filter(rule => new RegExp(rule.from, 'u').test(field.tag));
154
+ const replacementTag = foundRule ? foundRule.to : undefined;
155
+
156
+ const params = [
157
+ {name: 'tag', value: compareWithoutTag ? replacementTag : field.tag},
158
+ {name: 'ind1', value: ignoreInd1 ? undefined : field.ind1},
159
+ {name: 'ind2', value: ignoreInd2 ? undefined : field.ind2},
160
+ {name: 'subfields', value: createCompareSubfields(filteredField.subfields)}
161
+ ].map(param => [param.name, param.value]);
162
+
163
+ return Object.fromEntries(params);
164
+
165
+ function createCompareSubfields(subfields) {
166
+ const nonExcludedSubfields = subfields.filter(sub => !excludeSubfields.some(code => code === sub.code));
167
+ const normalizedSubfields = nonExcludedSubfields.map(sub => ({code: sub.code, value: normalizeSubfieldValue(sub.value)}));
168
+
169
+ return normalizedSubfields;
170
+
171
+ function normalizeSubfieldValue(value) {
172
+ return value.toLowerCase().replace(/\s+/ug, '');
173
+ }
174
+ }
175
+ }
176
+
177
+ function checkSwapTag(fields) {
178
+ if (swapTag.length > 0) {
179
+ return fields.map(field => ({...field, tag: swapTagsFunc(field.tag)}));
180
+ }
181
+
182
+ return fields;
183
+
184
+ function swapTagsFunc(tag) {
185
+ const [foundRule] = swapTag.filter(rule => new RegExp(rule.from, 'u').test(tag));
186
+
187
+ if (foundRule === undefined) {
188
+ return tag;
189
+ }
190
+
191
+ return foundRule.to;
192
+ }
193
+ }
194
+
195
+ function checkSwapSubfieldCodes(fields) {
196
+ if (swapSubfieldCode.length > 0) {
197
+ return fields.map(field => ({...field, subfields: swapSubfieldCodesFunc(field.subfields)}));
198
+ }
199
+
200
+ return fields;
201
+
202
+ function swapSubfieldCodesFunc(subfields) {
203
+ return subfields.map(sub => {
204
+ const [foundRule] = swapSubfieldCode.filter(rule => rule.from === sub.code);
205
+
206
+ if (foundRule === undefined) {
207
+ return sub;
208
+ }
209
+
210
+ return {code: foundRule.to, value: sub.value};
211
+ });
212
+ }
213
+ }
214
+
215
+ function checkDropSubfields(fields) {
216
+ if (dropSubfields.length > 0) {
217
+ return fields.map(field => ({...field, subfields: dropSubfieldsFunc(field.subfields)}))
218
+ .filter(field => field.subfields.length > 0);
219
+ }
220
+
221
+ return fields;
222
+
223
+ function dropSubfieldsFunc(subfields) {
224
+ return subfields.filter(sub => { // eslint-disable-line
225
+ return !dropSubfields.some(({code, value = false, condition = false}) => {
226
+ if (code !== sub.code) {
227
+ return false;
228
+ }
229
+
230
+ if (!condition && value) {
231
+ return value === sub.value;
232
+ }
233
+
234
+ if (condition === 'unless' && value) {
235
+ return !new RegExp(value, 'u').test(sub.value);
236
+ }
237
+
238
+ return true;
239
+ });
240
+ });
241
+ }
242
+ }
243
+
244
+ function checkCopyUnlessFields(fields) {
245
+ if (copyUnless.length > 0) {
246
+ return fields.filter(({subfields}) => copyUnless.some(filter => !subfields.some(sub => sub.code === filter.code && new RegExp(filter.value, 'u').test(sub.value))));
247
+ }
248
+
249
+ return fields;
250
+ }
251
+ };
@@ -0,0 +1,54 @@
1
+ import {expect} from 'chai';
2
+ import {READERS} from '@natlibfi/fixura';
3
+ import createReducer from './copy';
4
+ import generateTests from '@natlibfi/fixugen';
5
+
6
+ //import createDebugLogger from 'debug'; // <---
7
+ //const debug = createDebugLogger('@natlibfi/marc-record-merge/copy.spec.js'); // <---
8
+
9
+ generateTests({
10
+ callback,
11
+ path: [__dirname, '..', '..', 'test-fixtures', 'reducers', 'copy'],
12
+ useMetadataFile: true,
13
+ recurse: true,
14
+ fixura: {
15
+ reader: READERS.JSON,
16
+ failWhenNotFound: false
17
+ }
18
+ });
19
+
20
+ function callback({
21
+ getFixture,
22
+ tagPatternRegExp,
23
+ compareTagsOnly = false,
24
+ compareWithoutTag = false,
25
+ compareWithoutIndicators = false,
26
+ compareWithoutIndicator1 = false,
27
+ compareWithoutIndicator2 = false,
28
+ subfieldsMustBeIdentical = false,
29
+ copyUnless = undefined,
30
+ excludeSubfields = undefined,
31
+ dropSubfields = undefined,
32
+ swapSubfieldCode = [],
33
+ swapTag = [],
34
+ doNotCopyIfFieldPresent = false
35
+ }) {
36
+ const base = getFixture('base.json');
37
+ const source = getFixture('source.json');
38
+ const tagPattern = new RegExp(tagPatternRegExp, 'u');
39
+ const expectedRecord = getFixture('merged.json');
40
+
41
+ const merged = createReducer({
42
+ tagPattern, compareTagsOnly, compareWithoutTag, compareWithoutIndicators, compareWithoutIndicator1, compareWithoutIndicator2,
43
+ copyUnless, subfieldsMustBeIdentical, excludeSubfields,
44
+ dropSubfields, swapSubfieldCode, swapTag,
45
+ doNotCopyIfFieldPresent
46
+ })(base, source);
47
+ //debug(`*** mergedRecord: `, mergedRecord); //<--
48
+ //debug(`*** mergedRecord,Strfy: `, JSON.stringify(mergedRecord)); //<--
49
+ //debug(`*** expectedRecord: `, expectedRecord); //<--
50
+ //debug(`*** expectedRecord,Strfy: `, JSON.stringify(expectedRecord)); //<--
51
+ expect(merged.constructor.name).not.to.eql('MarcRecord');
52
+ expect(merged.constructor.name).to.eql('Object');
53
+ expect(merged).to.eql(expectedRecord);
54
+ }
@@ -0,0 +1,4 @@
1
+ import copy from './copy';
2
+ import select, {strictEquality, subsetEquality} from './select';
3
+
4
+ export default {copy, select, strictEquality, subsetEquality};
@@ -0,0 +1,110 @@
1
+ import {normalizeSync} from 'normalize-diacritics';
2
+ import createDebugLogger from 'debug';
3
+ import {MarcRecord} from '@natlibfi/marc-record';
4
+
5
+ export function strictEquality(subfieldA, subfieldB) {
6
+ return subfieldA.code === subfieldB.code &&
7
+ subfieldA.value === subfieldB.value;
8
+ }
9
+
10
+ export function subsetEquality(subfieldA, subfieldB) {
11
+ return subfieldA.code === subfieldB.code &&
12
+ (subfieldA.value.indexOf(subfieldB.value) !== -1 || subfieldB.value.indexOf(subfieldA.value) !== -1);
13
+ }
14
+ // EqualityFunction can be either strictEquality or subsetEquality
15
+ export default ({tagPattern, equalityFunction = strictEquality}) => (base, source) => {
16
+ const debug = createDebugLogger('@natlibfi/marc-record-merge:select');
17
+ const baseRecord = new MarcRecord(base, {subfieldValues: false});
18
+ const sourceRecord = new MarcRecord(source, {subfieldValues: false});
19
+ const baseFields = baseRecord.get(tagPattern);
20
+ const sourceFields = sourceRecord.get(tagPattern);
21
+ const fieldTag = sourceFields.map(field => field.tag);
22
+ debug(`Comparing field ${fieldTag}`);
23
+
24
+ checkFieldType(baseFields);
25
+ checkFieldType(sourceFields);
26
+
27
+ if (baseFields.length > 1 || sourceFields.length > 1) {
28
+ debug(`Multiple fields in base or source`);
29
+ debug(`No changes to base`);
30
+ return base;
31
+ }
32
+ const [baseField] = baseFields;
33
+ const [sourceField] = sourceFields;
34
+
35
+ if (baseField.tag === sourceField.tag === false) {
36
+ debug(`Base tag ${baseField.tag} is not equal to source tag ${sourceField.tag}`);
37
+ debug(`No changes to base`);
38
+ return base;
39
+ }
40
+ const baseSubs = baseField.subfields;
41
+ const sourceSubs = sourceField.subfields;
42
+
43
+ const baseSubsNormalized = baseSubs
44
+ .map(({code, value}) => ({code, value: normalizeSubfieldValue(value)}));
45
+
46
+ const sourceSubsNormalized = sourceSubs
47
+ .map(({code, value}) => ({code, value: normalizeSubfieldValue(value)}));
48
+
49
+ // Returns the base subfields for which a matching source subfield is found
50
+ const equalSubfieldsBase = baseSubsNormalized
51
+ .filter(baseSubfield => sourceSubsNormalized
52
+ .some(sourceSubfield => equalityFunction(baseSubfield, sourceSubfield)));
53
+ debug(`equalSubfieldsBase: ${JSON.stringify(equalSubfieldsBase, undefined, 2)}`);
54
+
55
+ // Returns the source subfields for which a matching base subfield is found
56
+ const equalSubfieldsSource = sourceSubsNormalized
57
+ .filter(sourceSubfield => baseSubsNormalized
58
+ .some(baseSubfield => equalityFunction(sourceSubfield, baseSubfield)));
59
+ debug(`equalSubfieldsSource: ${JSON.stringify(equalSubfieldsSource, undefined, 2)}`);
60
+
61
+ if (baseSubs.length === sourceSubs.length && equalSubfieldsBase.length < baseSubs.length) {
62
+ debug(`Base and source subfields are not equal`);
63
+ debug(`No changes to base`);
64
+ return base;
65
+ }
66
+
67
+ if (baseSubs.length === sourceSubs.length && equalSubfieldsBase.length === equalSubfieldsSource.length) {
68
+ debug(`Checking subfield equality`);
69
+ const totalSubfieldLengthBase = baseSubsNormalized
70
+ .map(({value}) => value.length)
71
+ .reduce((acc, value) => acc + value);
72
+ const totalSubfieldLengthSource = sourceSubsNormalized
73
+ .map(({value}) => value.length)
74
+ .reduce((acc, value) => acc + value);
75
+
76
+ if (totalSubfieldLengthSource > totalSubfieldLengthBase) {
77
+ return replaceBasefieldWithSourcefield(base);
78
+ }
79
+ }
80
+
81
+ if (sourceSubs.length > baseSubs.length && equalSubfieldsBase.length === baseSubs.length) {
82
+ return replaceBasefieldWithSourcefield(base);
83
+ }
84
+
85
+ debug(`No changes to base`);
86
+ return base;
87
+
88
+ function replaceBasefieldWithSourcefield(base) {
89
+ const index = base.fields.findIndex(field => field === baseField);
90
+ base.fields.splice(index, 1, sourceField); // eslint-disable-line functional/immutable-data
91
+ debug(`Source field is longer, replacing base with source`);
92
+ return base;
93
+ }
94
+
95
+ function checkFieldType(fields) {
96
+ const checkedFields = fields.map(field => {
97
+ if ('value' in field) { // eslint-disable-line functional/no-conditional-statement
98
+ throw new Error('Invalid control field, expected data field');
99
+ }
100
+ return field;
101
+ });
102
+ return checkedFields;
103
+ }
104
+
105
+ function normalizeSubfieldValue(value) {
106
+ // Regexp options: g: global search, u: unicode
107
+ const punctuation = /[.,\-/#!?$%^&*;:{}=_`~()[\]]/gu;
108
+ return normalizeSync(value).toLowerCase().replace(punctuation, '', 'u').replace(/\s+/gu, ' ').trim();
109
+ }
110
+ };
@@ -0,0 +1,49 @@
1
+ import {expect} from 'chai';
2
+ import {MarcRecord} from '@natlibfi/marc-record';
3
+ import createReducer, {subsetEquality} from './select';
4
+ import {READERS} from '@natlibfi/fixura';
5
+ import generateTests from '@natlibfi/fixugen';
6
+
7
+ MarcRecord.setValidationOptions({subfieldValues: false});
8
+
9
+ generateTests({
10
+ callback,
11
+ path: [__dirname, '..', '..', 'test-fixtures', 'reducers', 'select'],
12
+ useMetadataFile: true,
13
+ recurse: false,
14
+ fixura: {
15
+ reader: READERS.JSON,
16
+ failWhenNotFound: false
17
+ }
18
+ });
19
+
20
+ function callback({
21
+ getFixture,
22
+ disabled = false,
23
+ tagPatternRegExp = false,
24
+ expectedError = false,
25
+ useSubsetEquality = false
26
+ }) {
27
+ if (disabled) {
28
+ console.log('TEST DISABLED!'); // eslint-disable-line no-console
29
+ return;
30
+ }
31
+ // const base = new MarcRecord(getFixture('base.json'), {subfieldValues: false});
32
+ // const source = new MarcRecord(getFixture('source.json'), {subfieldValues: false});
33
+
34
+ const base = getFixture('base.json');
35
+ const source = getFixture('source.json');
36
+
37
+ const tagPattern = new RegExp(tagPatternRegExp, 'u');
38
+ const expectedRecord = getFixture('merged.json');
39
+ const equalityFunction = useSubsetEquality ? subsetEquality : undefined;
40
+
41
+ // Bypass expected error in testing
42
+ if (expectedError) {
43
+ expect(() => createReducer.to.throw(Error, 'control field'));
44
+ return;
45
+ }
46
+
47
+ const mergedRecord = createReducer({tagPattern, equalityFunction})(base, source);
48
+ expect(mergedRecord).to.eql(expectedRecord);
49
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "leader": "01331cam a22003494i 4500",
3
+ "fields": [
4
+ {
5
+ "tag": "001",
6
+ "value": "007346734"
7
+ }
8
+ ]
9
+ }