@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
package/.drone.yml ADDED
@@ -0,0 +1,92 @@
1
+ ---
2
+ kind: pipeline
3
+ type: docker
4
+ name: Default
5
+
6
+ trigger:
7
+ event:
8
+ - push
9
+ - tag
10
+
11
+ steps:
12
+
13
+ - name: audit
14
+ image: node:12
15
+ commands:
16
+ - npm audit --package-lock-only --production --audit-level=moderate
17
+
18
+ - name: install
19
+ image: node:12
20
+ environment:
21
+ NPM_CONFIG_IGNORE_SCRIPTS: true
22
+ commands:
23
+ - npm install --no-optional
24
+
25
+ - name: test
26
+ image: node:12
27
+ commands:
28
+ - npm test
29
+
30
+ - name: check-coverage
31
+ image: node:12
32
+ commands:
33
+ - npm run coverage
34
+
35
+ - name: build
36
+ image: node:12
37
+ commands:
38
+ - npm run build
39
+ - NPM_CONFIG_IGNORE_SCRIPTS=false npm ci --production
40
+
41
+ - name: static-security-scan
42
+ image: quay.io/natlibfi/njsscan
43
+ commands:
44
+ - njsscan dist
45
+
46
+ - name: npm
47
+ image: plugins/npm
48
+ settings:
49
+ registry: 'https://registry.npmjs.org/'
50
+ token:
51
+ from_secret: npm_token
52
+ when:
53
+ event: tag
54
+ ---
55
+ kind: pipeline
56
+ type: docker
57
+ name: Update dependencies
58
+
59
+ trigger:
60
+ event:
61
+ - custom
62
+ branch:
63
+ - master
64
+
65
+ steps:
66
+
67
+ - name: publish
68
+ image: quay.io/natlibfi/drone-npm-git-publish
69
+ settings:
70
+ git_user_name: natlibfi-melinda-automation
71
+ git_user_email: 65649125+natlibfi-melinda-automation@users.noreply.github.com
72
+ git_ssh_key:
73
+ from_secret: ssh_key
74
+ git_gpg_key:
75
+ from_secret: gpg_key
76
+ ---
77
+ kind: secret
78
+ name: npm_token
79
+ data: IB5vm9V6fNh9O1FFF9rv2eBMNy+WiZpxjfNhlq9DIX5wDYXXY1Xk64llB1YwDXiBqJDW2kIjAIc8vXG+xU3jmw==
80
+ ---
81
+ kind: secret
82
+ name: ssh_key
83
+ data: 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
84
+ ---
85
+ kind: secret
86
+ name: gpg_key
87
+ data: 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
88
+ ---
89
+ kind: signature
90
+ hmac: 4815f1484dffe80b54c0a0132b742f0976a7689354e933ba220c5b30835708c0
91
+
92
+ ...
@@ -0,0 +1,9 @@
1
+ # With this line @NatLibFi/melinda-js-lead owns any files in the /.github/
2
+ # directory at the root of the repository and any of its
3
+ # subdirectories.
4
+ /.github/ @NatLibFi/melinda-js-lead
5
+
6
+ # With this line @NatLibFi/melinda-js-lead owns any files in the /src/
7
+ # directory at the root of the repository and any of its
8
+ # subdirectories.
9
+ /src/ @NatLibFi/melinda-js-lead
@@ -0,0 +1,41 @@
1
+ # NatLibFi/Melinda maintenance strategy
2
+ # https://docs.github.com/en/code-security/supply-chain-security/keeping-your-dependencies-updated-automatically/configuration-options-for-dependency-updates
3
+
4
+ version: 2
5
+ updates:
6
+ # Maintain dependencies for GitHub Actions
7
+ - package-ecosystem: "github-actions"
8
+ directory: "/"
9
+ schedule:
10
+ interval: "daily"
11
+ time: "06:30"
12
+ timezone: "Europe/Helsinki"
13
+
14
+
15
+ # Minor updates to npm production dependencies daily
16
+ - package-ecosystem: "npm"
17
+ directory: "/"
18
+ schedule:
19
+ interval: "daily"
20
+ time: "06:45"
21
+ timezone: "Europe/Helsinki"
22
+ versioning-strategy: lockfile-only
23
+ labels:
24
+ - "npm minor dependencies"
25
+ allow:
26
+ - dependency-type: "production"
27
+
28
+ # Major updates to npm dependencies weekly @tuesday
29
+ # Not possible yet https://github.com/dependabot/dependabot-core/issues/1778
30
+ # - package-ecosystem: "npm"
31
+ # directory: "/"
32
+ # schedule:
33
+ # interval: "weekly"
34
+ # day: "tuesday"
35
+ # time: "07:00"
36
+ # timezone: "Europe/Helsinki"
37
+ # versioning-strategy: increase-if-necessary
38
+ # labels:
39
+ # - "npm major dependencies"
40
+ # reviewers:
41
+ # - "natlibfi/melinda-js-lead"
@@ -0,0 +1,60 @@
1
+ # Melinda node tests
2
+
3
+ name: Melinda node tests
4
+
5
+ on: push
6
+
7
+ jobs:
8
+ build-node-versions:
9
+ name: Node version matrix
10
+ runs-on: ubuntu-latest
11
+
12
+ strategy:
13
+ matrix:
14
+ node-version: [14.x, 16.x, 18.x]
15
+ # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
16
+
17
+ steps:
18
+ - name: Checkout the code
19
+ uses: actions/checkout@v3
20
+ - name: Use Node.js ${{ matrix.node-version }}
21
+ uses: actions/setup-node@v2
22
+ with:
23
+ node-version: ${{ matrix.node-version }}
24
+ cache: 'npm'
25
+ env:
26
+ NPM_CONFIG_IGNORE_SCRIPTS: true
27
+ - run: npm audit --package-lock-only --production --audit-level=moderate
28
+ - run: npm ci
29
+ - run: npm test
30
+ - run: npm run build --if-present
31
+
32
+ njsscan:
33
+ name: Njsscan check
34
+ runs-on: ubuntu-latest
35
+
36
+ steps:
37
+ - name: Checkout the code
38
+ uses: actions/checkout@v3
39
+ - name: nodejsscan scan
40
+ id: njsscan
41
+ uses: ajinabraham/njsscan-action@master
42
+ with:
43
+ args: '.'
44
+
45
+ publish:
46
+ runs-on: ubuntu-latest
47
+ needs: [build-node-versions, njsscan]
48
+ if: contains(github.ref, 'refs/tags/')
49
+
50
+ steps:
51
+ - uses: actions/checkout@v3
52
+ # Setup .npmrc file to publish to npm
53
+ - uses: actions/setup-node@v3
54
+ with:
55
+ node-version: '14.x'
56
+ registry-url: 'https://registry.npmjs.org'
57
+ - run: npm ci
58
+ - run: npm publish
59
+ env:
60
+ NODE_AUTH_TOKEN: ${{ secrets.MARC_RECORD_MERGE_JS_NPM_TOKEN }}
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022-current University of Helsinki (National Library of Finland)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,283 +1,101 @@
1
- # MARC record merge [![NPM Version](https://img.shields.io/npm/v/@natlibfi/marc-record-merge.svg)](https://npmjs.org/package/marc-record-merge) [![Build Status](https://travis-ci.org/NatLibFi/marc-record-merge.svg)](https://travis-ci.org/NatLibFi/marc-record-merge) [![Test Coverage](https://codeclimate.com/github/NatLibFi/marc-record-merge/badges/coverage.svg)](https://codeclimate.com/github/NatLibFi/marc-record-merge/coverage)
1
+ # Merge MARC records [![NPM Version](https://img.shields.io/npm/v/@natlibfi/marc-record-merge.svg)](https://npmjs.org/package/@natlibfi/marc-record-merge)
2
2
 
3
- A configurable Javascript module for merging [MARC](https://en.wikipedia.org/wiki/MARC_standards) records.
3
+ Merge MARC records
4
4
 
5
- ## Installation
6
-
7
- Clone the sources and install the package (In the source directory) on command line using `npm`:
5
+ ## Usage
6
+ ### COPY
8
7
 
9
- ```sh
10
- npm install
8
+ Chosing fields for reducer:
11
9
  ```
12
-
13
- ## Testing
14
-
15
- Run the following NPM script to lint, test and check coverage of the code:
16
-
17
- ```javascript
18
-
19
- npm run check
20
-
10
+ const copyReducerConfigs = [
11
+ {tagPattern: /010/u},
12
+ {tagPattern: /010|020/u},
13
+ {tagPattern: new RegExp('010', 'u')},
14
+ {tagPattern: new RegExp(String((/^(?<tags1>010|020$)/u').source))},
15
+ ]
21
16
  ```
22
17
 
23
- To run browser test run following npm commands:
24
-
18
+ ### compareTagsOnly (Defaults false)
25
19
  ```
26
- npm install karma-phantomjs-launcher
27
- npm run test-browser
20
+ {tagPattern: /010/u, compareTagsOnly: false}
28
21
  ```
29
22
 
30
- ## Usage
31
-
32
- The module returns a factory function that takes configuration object as the first (mandatory) argument. The second argument (optional) is an object specifying plugin functions. The factory returns a function that takes two MARC records (Instances of [marc-record-js](https://github.com/petuomin/marc-record-js)) as arguments. The first one is the preferred record which will be used as a base records (All fields are taken from this record unless otherwise specified).
23
+ If base has field with that tag source field is ignored
33
24
 
34
- ### Node.js
35
- ```js
36
- var mergeRecords = require('marc-record-merge')(config),
37
- record_merged = mergeRecords(record_preferred, record_other);
25
+ ### compareWithoutIndicators (Defaults false)
26
+ ```
27
+ {tagPattern: /010/u, compareWithoutIndicators: false}
38
28
  ```
39
29
 
40
- ### AMD
41
- ```js
42
- define(['marc-record-merge'], function(mergeFactory) {
43
-
44
- var mergeRecords = mergeFactory(config),
45
- record_merged = mergeRecords(record_preferred, record_other);
30
+ When base and source fields are compared, indicator differences are ignored
46
31
 
47
- });
32
+ ### subfieldsMustBeIdentical (Defaults true)
48
33
  ```
49
-
50
- ### Browser globals
51
- ```js
52
- var mergeRecords = mergeMarcRecordsFactory(config),
53
- record_merged = mergeRecords(record_preferred, record_other);
34
+ {tagPattern: /010/u, subfieldsMustBeIdentical: true}
54
35
  ```
55
36
 
56
- ## Configuration
57
-
58
- The configuration object is a document conforming to the [schema](https://github.com/natlibfi/marc-record-merge/blob/master/resources/configuration-schema.json). The document looks like this:
59
-
60
- ```js
61
- {
62
- "fields": {
63
- "005": {
64
- "action": "controlfield"
65
- },
66
- "008": {
67
- "action": "mergeControlfield",
68
- "options": {
69
- "actions": [
70
- {
71
- "formats": ["BK", "CF", "CR", "MU", "MX", "VM", "MP"],
72
- "range": [15, 17],
73
- "significantCaret": false,
74
- "type": "selectNonEmpty"
75
- },
76
- {
77
- "formats": ["BK", "CF", "CR", "MU", "MX", "VM", "MP"],
78
- "range": [35, 37],
79
- "significantCaret": false,
80
- "type": "selectNonEmpty"
81
- },
82
- {
83
- "formats": ["BK"],
84
- "range": [18, 21],
85
- "significantCaret": true,
86
- "type": "combine"
87
- },
88
- {
89
- "formats": ["BK"],
90
- "range": [29, 29],
91
- "significantCaret": false,
92
- "type": "selectNonEmpty"
93
- }
94
- ]
95
- }
96
- },
97
- "7..": {
98
- "action": "copy",
99
- "options": {
100
- "compareWithoutIndicators": true
101
- }
102
- },
103
-
104
-
105
- }
106
- }
107
-
37
+ If source subfields are subset of base subfields this option says if it is copied
38
+ | subfieldsMustBeIdentical | base | source | copy |
39
+ |--------------------------|-------------|-------------|-------|
40
+ | true or false | a$foo | a$foo | false |
41
+ | true or false | a$foo | b$bar | true |
42
+ | true | a$foo | a$foo,b$bar | true |
43
+ | false | a$foo | a$foo,b$bar | true |
44
+ | true | a$foo,b$bar | a$foo | true |
45
+ | false | a$foo,b$bar | a$foo | false |
46
+
47
+ ### excludeSubfields (Defaults [ ])
48
+ ```
49
+ {tagPattern: /010/u, excludeSubfields: ['a']}
108
50
  ```
109
51
 
110
- Each property of **fields** is a MARC field name or pattern (*..5*, *700*). The value of the **field** property is an object which must contain a **action** property. Action-specific options are defined in **options** property.
111
-
112
- The specified action is executed for each field in the other record that matches the field tag pattern.
113
-
114
- ### Predefined actions
115
-
116
- **controlfield**: Copy missing control fields from the other record.
117
-
118
- **mergeControlfield**: Merge controlfields. The rules are set using options:
119
- - _**formats**_: Array of formats to apply the rule. Available formats: `["BK", "CF", "CR", "MU", "MX", "VM", "MP"]`
120
- - _**range**_: character range of the controlfield fragment (start, end). One character range requires same number in both.
121
- - _**significantCaret**_: whether the ^ is significant or not.
122
- - _**type**_: either `combine` or `selectNonEmpty`. `selectNonEmpty` selects value from preferred, or if it's missing the from other. `combine` merges and sorts values from both fragments.
123
-
124
- **copy**: Copy fields from other record. The following options are supported:
125
-
126
- - _**mustBeIdentical**_: A boolean determing whether all subfields must be identical
127
- - _**compareWithoutIndicators**_: A boolean determing whether field indicators must be identical
128
- - _**compareWithout**_: An array of subfield codes. These subfields are filtered out from the comparison
129
- - _**compareSubfieldsNormalized**_: A boolean determing whether the subfields included in _compareWithout_ should be compared as normalized
130
- - _**combine**_: An array of subfields codes. These subfields will be combined into a single subfield
131
- - _**dropOriginal**_: Drop matching original field taken from preferred record.
132
- - _**copyIf/copyUnless**_: Object with subfields as keys containing conditions for copying. Each condition are defined as follows:
133
- - _**value**_: Required value for subfield
134
- - _**comparator**_: A subfield comparator function name
135
- - _**pick**_: Include subfields from the field that is not preserved.
136
- - _**subfields**_: An array of subfield codes (*Mandatory*)
137
- - _**missingOnly**_: A boolean determing whether only subfields missing from the target field should be picked
138
- - _**reduce**_: Drop defined subfield from other record
139
- - _**subfields**_: An array of subfield codes (*Mandatory*)
140
- - _**condition**_: Condition used to determine if field should be dropped. If undefined drops all subfields of type. Possible values _if_ and _unless_.
141
- - _**value**_: Value for comparison. Can be regular expression if exact is option is not set.
142
- - _**exact**_: If set requires subfield value match exactly. Defaults to false.
143
- - _**transformOnInequality**_: An object describing how to transform an inequal field. For this option to take effect the preferred record must have at least one field with the same tag name as the other record. The following properties are supported:
144
- - _**tag**_: Tag name of the new field (*Mandatory*)
145
- - _**drop**_: An array of subfields codes. These subfields are not included in the new field.
146
- - _**add**_: An object with subfield codes as keys and subfield values as values.
147
- - _**map**_: An object with new subfield codes as keys and the old subfield codes as values.
148
-
149
- The action copies only fields that have no match in the preferred record:
150
-
151
- 1. Attempt to find a corresponding field from preferred record
152
- 1. Attempt to find an identical field (All options are applied to comparison)
153
- - [Normalize fields](#field-normalization)
154
- - Tag names must be identical
155
- - Indicators must be identical
156
- - Values must be identical
157
- 1. Variable fields: Each subfield must have a matching subfield in the opposite record (Code and value identical).
158
- 1. Control fields: The values must be identical
159
- 1. Attempt to find a similar field if an identical field was not found (All options are applied to comparison)
160
- - [Normalize fields](#field-normalization)
161
- - Tag names must be identical
162
- - Indicators must be identical
163
- - Values comparison
164
- 1. Variable fields: Either field's subfields must be a subset of the opposite subfields (There is a match for all of the opposite field's subfields)
165
- 1. Control fields: The values must be identical
166
- 1. Copy or do nothing
167
- 1. No corresponding field was found
168
- 1. If no fields in the preferred record with the same tag name were found, copy the field
169
- 1. If fields with the same tag were found and option *transformOnInequality* is enabled, copy the other field using the specified transformations. Otherwise do nothing.
170
-
171
- 1. Corresponding field was found. Check if the other field is deemed different and should be copied to the merged record (All options are applied to comparison)
172
- 1. [Normalize fields](#field-normalization)
173
- 1. Check if the other field is a "proper" subset of the preferred field (Preferred field contains all of the other field's subfields and more)
174
- 1. If it is, copy the field
175
- 1. If it's not, keep the preferred field
176
- 1. In both cases, merge the subfields that were not included in comparison by removing identical subfields
177
-
178
- **selectBetter**: Selects the **"better"** of the two fields of each record. Cannot be used if the tag has multiple fields. The following options are supported:
179
-
180
- - _**requireFieldInBoth**_: A boolean determing whether the field must exist in both records to make changes
181
- - _**onlyIfMissing**_: A boolean determing whether the field will be selected from the other record only if it missing from preferred record
182
- - _**skipOnMultiple**_: A boolean determing whether to skip the action (And keep the preferred fields) if the are multiple fields of the same tag. Default behavior is to fail the processing
183
- - _**pick**_: Include subfields from the field that is not preserved.
184
- - _**subfields**_: An array of subfield codes (*Mandatory*)
185
- - _**missingOnly**_: A boolean determing whether only subfields missing from the target field should be picked
186
- - _**comparator**_: A subfield comparator function name
187
-
188
- The better field is selected as follows:
189
-
190
- 1. [Normalize fields](#field-normalization)
191
- 1. Check if both fields' subfields are considered equal (Using the comparator function)
192
- 1. If equal, select the field that gets the most points (Fields get points for each subfield that has more characters than the corresponding subfield in the opposite field)
193
- 1. If not equal, check if the other field is a "proper" subset of the preferred field (Preferred field contains all of the other field's subfields and more)
194
- 1. If the other field is a subset of the preferred field, select the other field
195
- 1. Otherwise select the preferred field
196
-
197
- **createFrom**: Creates new field based on field other record. The following options are supported:
198
- - _**convertTag**_: Converts field tag to another.
199
- - _**ind[1-2]**_: Converts indicator in created field.
200
- - _**skipIfExists**_: Skip creating new field if target field is found in preferred.
201
- - _**useExisting**_: Use existing field from preferred as base copying all subrecords.
202
- - _**keepExisting**_: Keep existing field from preferred and create new field.
203
- - _**subfields**_: Object of subfields as keys to be included in created field. Each subfield object can have following properties:
204
- - _**convertCode**_: Converts subfield code to another.
205
- - _**convertValue**_: Converts value to another.
206
- - _**append**_: Append value to existing subfield. If subfield does not exists create as new.
207
- - _**replace**_: Replace existing subfield.
208
- - _**modifications**_: Array of modifications for value. Can be either function or following object:
209
- - _**type**_: Type of operation. Possible values are: _copy_, _replace_, _wrap_, _prepend_, _append_
210
- - _**args**_: Array of arguments for operation
211
-
212
- If subfield object is empty subfield is copied as is.
213
-
214
- ## Field normalization
215
-
216
- Field values (Variable field subfields or control field value) are normalized as follows:
217
-
218
- 1. String is converted to lower case
219
- 1. Punctuation (See the function _**removePunctuation**_ in [lib/main.js](https://github.com/NatLibFi/marc-record-merge/blob/master/lib/main.js) for the characters replaced) is replaced with whitespace. The resulting string is trimmed (Whitespace removed from both ends) and subsequent whitespace is reduced to single whitespace.
220
- 1. Diacritics are replaced with their corresponding ASCII characters (See the variable __*DIACRITICS_REMOVAL_MAP*__ in [lib/main.js](https://github.com/NatLibFi/marc-record-merge/blob/master/lib/main.js) for mapping)
52
+ When base and source fields are compared, excluded subfields are ignored
221
53
 
222
- ## Predefined comparators
54
+ ### dropSubfields (Defaults [ ])
55
+ ```
56
+ {tagPattern: /010/u, dropSubfields: [{"code": "9"}]}
57
+ ```
58
+ Drops subfields 9's from all fields tagged 010
223
59
 
224
- - **substring**: Require both subfields to have equal codes and that at least one value is a substring of the other subfield's value
225
- - **equality**: Require both subfields to have stricly equal codes and values
60
+ ```
61
+ {tagPattern: /010/u, dropSubfields: [{"code": "9", "value": "FENNI<KEEP>"}]}
62
+ ```
63
+ Drops subfields 9's that have "FENNI<KEEP>" from all fields tagged 010
226
64
 
227
- ### Plugins
228
65
 
229
- The second argument to the factory function is a optional object specifying plugin functions. The object can have one or both of the following properties:
66
+ ```
67
+ {tagPattern: /010/u, dropSubfields: [{"code": "9", "condition": "unless", "value": "^FENNI<(?<option>KEEP|PASS)>$"}]}
68
+ ```
69
+ Drops all subfield 9's unless they have "FENNI<KEEP>" or "FENNI<PASS>" from all fields tagged 010
230
70
 
231
- #### actions
232
71
 
233
- An object with action names as keys and functions as values. The action is a function which alters the merged record. It has the following signature:
72
+ When comparing or copying field dropped fields are ignored
234
73
 
235
- ```js
236
- function (record_merge, field_other, options, return_details) {}
74
+ ### copyUnless (Defaults [ ])
75
+ ```
76
+ {tagPattern: /010/u, copyUnless: [{"code": "9", "value": "FENNI<KEEP>"}]}
237
77
  ```
238
- **Parameters:**
239
- - *record_merge*: The merged record which is to be modified (Based on the preferred record)
240
- - *field_other*: The field from the other record which is the subject of the action
241
- - *options*: Action specific options
242
- - *return_details*: If this is defined, return action specific details about processing
243
-
244
- The function's return value is not used unless *return_detail* is defined.
245
-
246
- #### comparators
247
78
 
248
- An object with comparator names as keys and functions as values. The comparator is a function which returns a boolean denoting whether two subfields are deemed equal. It has the following signature:
79
+ When field is otherwise ok to be copied, if it contains given subfield whole field is ignored
249
80
 
250
- ```js
251
- function (subfield1, subfield2) {}
81
+ ### baseValidators (Defaults {subfieldValues: false})
82
+ ```
83
+ {tagPattern: /010/u, baseValidators: {fields: true, subfields: true, subfieldValues: true}}
252
84
  ```
253
85
 
254
- ### Sorting
255
-
256
- By default, new fields are added after the similar fields. This can be changed with the **sort** property:
86
+ Marc record validators for base record while reducer is working.
87
+ More info can be read here: https://github.com/NatLibFi/marc-record-js
257
88
 
258
- ```js
259
- {
260
- "fields": {
261
- "020": {
262
- "action": "copy"
263
- }
264
- },
265
- "sort": {
266
- "insert": "before",
267
- "indexes": {
268
- "CAT": 995
269
- }
270
- }
271
- }
89
+ ### sourceValidators (Defaults {subfieldValues: false})
90
+ ```
91
+ {tagPattern: /010/u, sourceValidators: {fields: true, subfields: true, subfieldValues: true}}
272
92
  ```
273
93
 
274
- ### Properties
275
- - **insert**: Defines whether new fields are inserted before or after similar fields. Defaults to *after*.
276
- - **indexes**: An object with field tag patterns as keys and static sort indexes as values. By default, new fields are inserted by the tag's numeric index (If similar fields don't exist)
94
+ Marc record validators for source record while reducer is working.
95
+ More info can be read here: https://github.com/NatLibFi/marc-record-js
277
96
 
278
97
  ## License and copyright
279
98
 
280
- Copyright (c) 2015-2017 **University Of Helsinki (The National Library Of Finland)**
281
-
99
+ Copyright (c) 2020-2022 **University Of Helsinki (The National Library Of Finland)**
282
100
 
283
- This project's source code is licensed under the terms of **GNU Affero General Public License Version 3**.
101
+ This project's source code is licensed under the terms of **MIT** or any later version.
package/dist/index.js ADDED
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "Reducers", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _reducers.default;
10
+ }
11
+ });
12
+ exports.default = void 0;
13
+
14
+ var _reducers = _interopRequireDefault(require("./reducers"));
15
+
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
+
18
+ var _default = ({
19
+ base,
20
+ source,
21
+ reducers
22
+ }) => reducers.reduce((base, reducer) => reducer(base, source), base);
23
+
24
+ exports.default = _default;
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["base","source","reducers","reduce","reducer"],"sources":["../src/index.js"],"sourcesContent":["import Reducers from './reducers';\n\nexport {Reducers};\nexport default ({base, source, reducers}) => reducers.reduce((base, reducer) => reducer(base, source), base);\n"],"mappings":";;;;;;;;;;;;;AAAA;;;;eAGe,CAAC;EAACA,IAAD;EAAOC,MAAP;EAAeC;AAAf,CAAD,KAA8BA,QAAQ,CAACC,MAAT,CAAgB,CAACH,IAAD,EAAOI,OAAP,KAAmBA,OAAO,CAACJ,IAAD,EAAOC,MAAP,CAA1C,EAA0DD,IAA1D,C"}