@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/lib/main.js DELETED
@@ -1,1215 +0,0 @@
1
- /**
2
- *
3
- * @licstart The following is the entire license notice for the JavaScript code in this file.
4
- *
5
- * A configurable Javascript module for merging MARC records
6
- *
7
- * Copyright (c) 2015-2017 University Of Helsinki (The National Library Of Finland)
8
- *
9
- * This file is part of marc-record-merge
10
- *
11
- * marc-record-merge is free software: you can redistribute it and/or modify
12
- * it under the terms of the GNU Affero General Public License as
13
- * published by the Free Software Foundation, either version 3 of the
14
- * License, or (at your option) any later version.
15
- *
16
- * This program is distributed in the hope that it will be useful,
17
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- * GNU Affero General Public License for more details.
20
- *
21
- * You should have received a copy of the GNU Affero General Public License
22
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
23
- *
24
- * @licend The above is the entire license notice
25
- * for the JavaScript code in this file.
26
- *
27
- **/
28
-
29
- /* istanbul ignore next: umd wrapper */
30
- (function (root, factory) {
31
-
32
- 'use strict';
33
-
34
- if (typeof define === 'function' && define.amd) {
35
- define([
36
- '@natlibfi/es6-polyfills/lib/polyfills/object',
37
- '@natlibfi/es6-shims/lib/shims/array',
38
- 'marc-record-js'
39
- ], factory);
40
- } else if (typeof module === 'object' && module.exports) {
41
- module.exports = factory(
42
- require('@natlibfi/es6-polyfills/lib/polyfills/object'),
43
- require('@natlibfi/es6-shims/lib/shims/array'),
44
- require('marc-record-js')
45
- );
46
- } else {
47
- root.mergeMarcRecordsFactory = factory(
48
- root.Object,
49
- root.es6_array_shim,
50
- root.MarcRecord
51
- );
52
- }
53
-
54
- }(this, factory));
55
-
56
- function factory(Object, shim_array, MarcRecord)
57
- {
58
-
59
- "use strict";
60
-
61
- var DEFAULT_OPTIONS = {
62
- sort: {
63
- insert: 'after'
64
- }
65
- },
66
- DIACRITICS_REMOVAL_MAP = [
67
- {'base':'A', 'letters':'\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F'},
68
- {'base':'AA','letters':'\uA732'},
69
- {'base':'AE','letters':'\u00C6\u01FC\u01E2'},
70
- {'base':'AO','letters':'\uA734'},
71
- {'base':'AU','letters':'\uA736'},
72
- {'base':'AV','letters':'\uA738\uA73A'},
73
- {'base':'AY','letters':'\uA73C'},
74
- {'base':'B', 'letters':'\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181'},
75
- {'base':'C', 'letters':'\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E'},
76
- {'base':'D', 'letters':'\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779'},
77
- {'base':'DZ','letters':'\u01F1\u01C4'},
78
- {'base':'Dz','letters':'\u01F2\u01C5'},
79
- {'base':'E', 'letters':'\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E'},
80
- {'base':'F', 'letters':'\u0046\u24BB\uFF26\u1E1E\u0191\uA77B'},
81
- {'base':'G', 'letters':'\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E'},
82
- {'base':'H', 'letters':'\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D'},
83
- {'base':'I', 'letters':'\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197'},
84
- {'base':'J', 'letters':'\u004A\u24BF\uFF2A\u0134\u0248'},
85
- {'base':'K', 'letters':'\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2'},
86
- {'base':'L', 'letters':'\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780'},
87
- {'base':'LJ','letters':'\u01C7'},
88
- {'base':'Lj','letters':'\u01C8'},
89
- {'base':'M', 'letters':'\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C'},
90
- {'base':'N', 'letters':'\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4'},
91
- {'base':'NJ','letters':'\u01CA'},
92
- {'base':'Nj','letters':'\u01CB'},
93
- {'base':'O', 'letters':'\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C'},
94
- {'base':'OI','letters':'\u01A2'},
95
- {'base':'OO','letters':'\uA74E'},
96
- {'base':'OU','letters':'\u0222'},
97
- {'base':'OE','letters':'\u008C\u0152'},
98
- {'base':'oe','letters':'\u009C\u0153'},
99
- {'base':'P', 'letters':'\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754'},
100
- {'base':'Q', 'letters':'\u0051\u24C6\uFF31\uA756\uA758\u024A'},
101
- {'base':'R', 'letters':'\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782'},
102
- {'base':'S', 'letters':'\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784'},
103
- {'base':'T', 'letters':'\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786'},
104
- {'base':'TZ','letters':'\uA728'},
105
- {'base':'U', 'letters':'\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244'},
106
- {'base':'V', 'letters':'\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245'},
107
- {'base':'VY','letters':'\uA760'},
108
- {'base':'W', 'letters':'\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72'},
109
- {'base':'X', 'letters':'\u0058\u24CD\uFF38\u1E8A\u1E8C'},
110
- {'base':'Y', 'letters':'\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE'},
111
- {'base':'Z', 'letters':'\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762'},
112
- {'base':'a', 'letters':'\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250'},
113
- {'base':'aa','letters':'\uA733'},
114
- {'base':'ae','letters':'\u00E6\u01FD\u01E3'},
115
- {'base':'ao','letters':'\uA735'},
116
- {'base':'au','letters':'\uA737'},
117
- {'base':'av','letters':'\uA739\uA73B'},
118
- {'base':'ay','letters':'\uA73D'},
119
- {'base':'b', 'letters':'\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253'},
120
- {'base':'c', 'letters':'\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184'},
121
- {'base':'d', 'letters':'\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A'},
122
- {'base':'dz','letters':'\u01F3\u01C6'},
123
- {'base':'e', 'letters':'\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD'},
124
- {'base':'f', 'letters':'\u0066\u24D5\uFF46\u1E1F\u0192\uA77C'},
125
- {'base':'g', 'letters':'\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F'},
126
- {'base':'h', 'letters':'\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265'},
127
- {'base':'hv','letters':'\u0195'},
128
- {'base':'i', 'letters':'\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131'},
129
- {'base':'j', 'letters':'\u006A\u24D9\uFF4A\u0135\u01F0\u0249'},
130
- {'base':'k', 'letters':'\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3'},
131
- {'base':'l', 'letters':'\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747'},
132
- {'base':'lj','letters':'\u01C9'},
133
- {'base':'m', 'letters':'\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F'},
134
- {'base':'n', 'letters':'\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5'},
135
- {'base':'nj','letters':'\u01CC'},
136
- {'base':'o', 'letters':'\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275'},
137
- {'base':'oi','letters':'\u01A3'},
138
- {'base':'ou','letters':'\u0223'},
139
- {'base':'oo','letters':'\uA74F'},
140
- {'base':'p','letters':'\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755'},
141
- {'base':'q','letters':'\u0071\u24E0\uFF51\u024B\uA757\uA759'},
142
- {'base':'r','letters':'\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783'},
143
- {'base':'s','letters':'\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B'},
144
- {'base':'t','letters':'\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787'},
145
- {'base':'tz','letters':'\uA729'},
146
- {'base':'u','letters': '\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289'},
147
- {'base':'v','letters':'\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C'},
148
- {'base':'vy','letters':'\uA761'},
149
- {'base':'w','letters':'\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73'},
150
- {'base':'x','letters':'\u0078\u24E7\uFF58\u1E8B\u1E8D'},
151
- {'base':'y','letters':'\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF'},
152
- {'base':'z','letters':'\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763'}
153
- ];
154
-
155
- var diacritics_removal_map = DIACRITICS_REMOVAL_MAP.reduce(function(result, element) {
156
-
157
- element.letters.split('').forEach(function(letter) {
158
- result[letter] = element.base;
159
- });
160
-
161
- return result;
162
-
163
- }, {});
164
-
165
- return function(configuration, plugins)
166
- {
167
-
168
- var actions = {
169
- controlfield: actionControlfield,
170
- copy: actionCopy,
171
- selectBetter: actionSelectBetter,
172
- mergeControlfield: actionMergeControlfield,
173
- createFrom: actionCreateFrom
174
- },
175
- comparators = {
176
- substring: subfieldSubstringComparator,
177
- equality: subfieldEquality
178
- },
179
- stringOperations = {
180
- copy: stringOperationCopy,
181
- replace: stringOperationReplace,
182
- wrap: stringOperationWrap,
183
- prepend: stringOperationPrepend,
184
- append: stringOperationAppend
185
- };
186
-
187
- function applyPlugins(obj, name)
188
- {
189
- if (typeof plugins === 'object') {
190
-
191
- if (typeof plugins.actions === 'object') {
192
- Object.keys(plugins.actions).filter(function(key) {
193
- return typeof plugins.actions[key] === 'function';
194
- }).forEach(function(key) {
195
- actions[key] = plugins.actions[key];
196
- });
197
- }
198
-
199
- if (typeof plugins.comparators === 'object') {
200
- Object.keys(plugins.comparators).filter(function(key) {
201
- return typeof plugins.comparators[key] === 'function';
202
- }).forEach(function(key) {
203
- comparators[key] = plugins.comparators[key];
204
- });
205
- }
206
-
207
- if (typeof plugins.comparators === 'object') {
208
- Object.keys(plugins.comparators).filter(function(key) {
209
- return typeof plugins.comparators[key] === 'function';
210
- }).forEach(function(key) {
211
- comparators[key] = plugins.comparators[key];
212
- });
213
- }
214
- }
215
- }
216
-
217
- function stringOperationCopy(value) {
218
- return value;
219
- }
220
-
221
- function stringOperationReplace(value, args) {
222
- return value.replace(args[0], args[1]);
223
- }
224
-
225
- function stringOperationWrap(value, args) {
226
- return args[0] + value + args[1];
227
- }
228
-
229
- function stringOperationPrepend(value, args) {
230
- return args[0] + value;
231
- }
232
-
233
- function stringOperationAppend(value, args) {
234
- return value + args[0];
235
- }
236
-
237
- function subfieldSubstringComparator(subfield1, subfield2) {
238
- return subfield1.code == subfield2.code && (subfield1.value.indexOf(subfield2.value) >= 0 || subfield2.value.indexOf(subfield1.value) >= 0);
239
- }
240
-
241
- function subfieldEquality(subfield1, subfield2) {
242
- return subfield1.code == subfield2.code && subfield1.value == subfield2.value;
243
- }
244
-
245
- function arrayDifference(a1, a2, equalityFunction)
246
- {
247
-
248
- equalityFunction = typeof equalityFunction === 'function' ? equalityFunction : function(a, b) {
249
- return a === b;
250
- };
251
-
252
- return a1.filter(function(element) {
253
- return shim_array.find(a2, function(element2) {
254
- return equalityFunction(element, element2);
255
- }) === undefined;
256
- });
257
-
258
- }
259
-
260
- function arraysIdentical(a1, a2, equalityFunction)
261
- {
262
- return arrayDifference(a1, a2, equalityFunction).length === 0 && arrayDifference(a2, a1, equalityFunction).length === 0;
263
- }
264
-
265
- function clone(obj)
266
- {
267
- return JSON.parse(JSON.stringify(obj));
268
- }
269
-
270
- function getCompareWithoutSubfields(field, options) {
271
-
272
- var subfields = [];
273
-
274
- if (options.compareWithout) {
275
-
276
- subfields = field.subfields.filter(function(subfield) {
277
- return options.compareWithout.indexOf(subfield.code) !== -1;
278
- });
279
-
280
- }
281
-
282
- return subfields;
283
- }
284
-
285
- /**
286
- * Try to make a list of equal pairs from both subfield arrays using a comparator function
287
- **/
288
- function makeSubfieldPairs(subfields1, subfields2, fn_comparator) {
289
-
290
- var pairs = [];
291
-
292
- if (subfields1.length === subfields2.length) {
293
-
294
- subfields2.forEach(function(subfield2) {
295
- return subfields1.some(function(subfield1) {
296
- if (fn_comparator(subfield1, subfield2)) {
297
-
298
- pairs.push([subfield1, subfield2]);
299
- return true;
300
-
301
- }
302
- });
303
- });
304
-
305
- } else {
306
- throw new Error('Number of subfields are not equal');
307
- }
308
-
309
- return pairs;
310
-
311
- }
312
-
313
- function combineSubfields(code, field) {
314
-
315
- var subfields, value_combined,
316
- first_subfield_index = shim_array.findIndex(field.subfields, function(subfield) {
317
- return subfield.code === code;
318
- });
319
-
320
- if (first_subfield_index >= 0) {
321
-
322
- subfields = field.subfields.filter(function(subfield) {
323
- return subfield.code === code;
324
- });
325
-
326
- if (subfields.length > 1) {
327
-
328
- value_combined = subfields.reduce(function(result, subfield) {
329
- return result.length > 0 ? result + ', ' + subfield.value : result + subfield.value;
330
- }, '');
331
-
332
- /**
333
- * @internal Remove subfields with the code that is to be combined
334
- */
335
- field.subfields = field.subfields.filter(function(subfield) {
336
- return subfield.code !== code;
337
- });
338
-
339
- field.subfields.splice(first_subfield_index, 0, {
340
- code: code,
341
- value: '[' + value_combined + ']'
342
- });
343
-
344
- }
345
-
346
- }
347
-
348
- }
349
-
350
- function normalizeSubfield(subfield, no_clone) {
351
- var ctx = no_clone ? subfield : clone(subfield);
352
- ctx.value = normalizeString(ctx.value);
353
- return ctx;
354
- }
355
-
356
- function normalizeField(field) {
357
- var normalized = clone(field);
358
- normalized.subfields = normalized.subfields.map(function(subfield) {
359
- return normalizeSubfield(subfield, 1);
360
- });
361
- return normalized;
362
- }
363
-
364
- function fieldsSimilar(field1, field2, options) {
365
-
366
- var field1_normalized = normalizeField(field1);
367
- var field2_normalized = normalizeField(field2);
368
-
369
- if (options.compareWithout !== undefined) {
370
-
371
- options.compareWithout.forEach(function(code_filter) {
372
-
373
- [field1_normalized, field2_normalized].forEach(function(field) {
374
- field.subfields = arrayDifference(field.subfields, field.subfields.filter(function(subfield) {
375
- return subfield.code == code_filter;
376
- }));
377
- });
378
-
379
- });
380
-
381
- }
382
-
383
- if (options.compareWithoutIndicators !== true) {
384
-
385
- if (field1_normalized.ind1 !== field2_normalized.ind1) {
386
- return false;
387
- }
388
-
389
- if (field1_normalized.ind2 !== field2_normalized.ind2) {
390
- return false;
391
- }
392
-
393
- }
394
-
395
- /**
396
- * @internal If fields have 0 subfields (f.ex. because of comparewithout), then fields are not deemed identical.
397
- **/
398
- if (field1_normalized.subfields.length === 0 ||
399
- field2_normalized.subfields.length === 0) {
400
- return false;
401
- }
402
-
403
- if (options.mustBeIdentical === true) {
404
-
405
- if (!arraysIdentical(field1_normalized.subfields, field2_normalized.subfields, subfieldEquality)) {
406
- return false;
407
- }
408
- }
409
-
410
- /**
411
- * @internal Neither is subset
412
- **/
413
- if (arrayDifference(field1_normalized.subfields, field2_normalized.subfields, subfieldEquality).length !== 0 &&
414
- arrayDifference(field2_normalized.subfields, field1_normalized.subfields, subfieldEquality).length !== 0) {
415
-
416
- return false;
417
-
418
- }
419
-
420
- return true;
421
-
422
- }
423
-
424
- function normalizeString(str)
425
- {
426
-
427
- function removeCase(str)
428
- {
429
- return str.toLowerCase();
430
- }
431
-
432
- function removePunctuation(str)
433
- {
434
- return str.replace(/[\.,-\/#!$%\^&\*;:{}=\-_`~()]/g," ")
435
- .replace(/\s{2,}/g, " ")
436
- .trim();
437
- }
438
-
439
- function removeDiacritics(str)
440
- {
441
- return str.split('').reduce(function(result, letter) {
442
- return diacritics_removal_map.hasOwnProperty(letter) ? result + diacritics_removal_map[letter] : result + letter;
443
- }, '');
444
- }
445
-
446
- return removePunctuation(removeCase(removeDiacritics(str)));
447
-
448
- }
449
-
450
- function pickSubfields(field_to, field_from, subfield_codes, missing_only)
451
- {
452
- field_from.subfields
453
- .filter(function(subfield) {
454
- return subfield_codes.indexOf(subfield.code) >= 0;
455
- })
456
- .forEach(function(subfield) {
457
-
458
- if (missing_only === true) {
459
- if (!field_to.subfields.some(function(subfield_to) {
460
- return subfield_to.code === subfield.code;
461
- })) {
462
- field_to.subfields.push(clone(subfield));
463
- }
464
- } else {
465
- field_to.subfields.push(clone(subfield));
466
- }
467
-
468
- });
469
- }
470
-
471
- function insertField(record, field)
472
- {
473
-
474
- function getSortIndex(tag)
475
- {
476
-
477
- var index;
478
-
479
- if (configuration.sort.indexes) {
480
-
481
- Object.keys(configuration.sort.indexes).some(function(pattern_index) {
482
- if (new RegExp('^' + pattern_index + '$').test(tag)) {
483
-
484
- index = configuration.sort.indexes[pattern_index];
485
- return 1;
486
-
487
- }
488
- });
489
-
490
- }
491
-
492
- return index === undefined ? parseInt(tag, 10) : index;
493
-
494
- }
495
-
496
- function beforeCallback(field_record, index)
497
- {
498
- if (field.tag == field_record.tag) {
499
- index_insert = index;
500
- return 1;
501
- }
502
- }
503
-
504
- function afterCallback(field_record, index)
505
- {
506
- if (field.tag == field_record.tag) {
507
- index_insert = index;
508
- } else if (index_insert !== undefined) {
509
- index_insert = index;
510
- return 1;
511
- }
512
- }
513
-
514
- var index_insert, index_sort;
515
-
516
- if (!record.fields.some(configuration.sort.insert === 'before' ? beforeCallback : afterCallback) && index_insert !== undefined && configuration.sort.insert === 'after') {
517
- index_insert++;
518
- }
519
-
520
- if (index_insert === undefined) {
521
-
522
- index_sort = getSortIndex(field.tag);
523
-
524
- record.fields.some(function(field_record, index) {
525
-
526
- if ((index_sort - getSortIndex(field_record.tag)) < 0) {
527
- index_insert = index;
528
- return 1;
529
- }
530
-
531
- });
532
-
533
- }
534
-
535
- record.fields.splice(index_insert === undefined ? record.fields.length : index_insert, 0, field);
536
-
537
- }
538
-
539
- function actionControlfield(record_merged, field_other, options, comparators, return_details) {
540
-
541
- if (!record_merged.fields.some(function(field_merged) {
542
- return field_merged.tag == field_other.tag;
543
- })) {
544
-
545
- field_other.wasUsed = true;
546
- field_other.fromOther = true;
547
- record_merged.fields.push(clone(field_other));
548
-
549
- return !return_details ? undefined : {
550
- index: record_merged.fields.length - 1
551
- };
552
-
553
- }
554
-
555
- }
556
-
557
- function extractFormat(record) {
558
-
559
- var l6 = record.leader.substr(6,1);
560
- var l7 = record.leader.substr(7,1);
561
-
562
- var isBK = function(l6, l7) { return ['a', 't'].indexOf(l6) !== -1 && ['b', 'i', 's'].indexOf(l7) === -1; };
563
- var isCR = function(l6, l7) { return ['a', 't'].indexOf(l6) !== -1 && ['b', 'i', 's'].indexOf(l7) !== -1; };
564
- var isMP = function(l6) { return ['e', 'f'].indexOf(l6) !== -1; };
565
- var isMU = function(l6) { return ['c', 'd', 'i', 'j'].indexOf(l6) !== -1; };
566
- var isCF = function(l6) { return 'm' === l6; };
567
- var isMX = function(l6) { return 'p' === l6; };
568
- var isVM = function(l6) { return ['g', 'k', 'o', 'r'].indexOf(l6) !== -1; };
569
-
570
- switch(true) {
571
- case isBK(l6, l7): return 'BK';
572
- case isCR(l6, l7): return 'CR';
573
- case isMP(l6): return 'MP';
574
- case isMU(l6): return 'MU';
575
- case isCF(l6): return 'CF';
576
- case isMX(l6): return 'MX';
577
- case isVM(l6): return 'VM';
578
- }
579
- }
580
-
581
-
582
- function getRange(action) {
583
- if (typeof action.range === 'object') {
584
- return {
585
- index: action.range[0],
586
- length: action.range[1] - action.range[0] + 1
587
- };
588
- } else {
589
- return {
590
- index: action.range,
591
- length: 1
592
- };
593
- }
594
- }
595
-
596
- function actionMergeControlfield(record_merged, field_other, options, comparators, return_details, record_other) {
597
- // get formats of record_merged, record_other
598
- var formatMerged = extractFormat(record_merged);
599
- var formatOther = extractFormat(record_other);
600
-
601
- var field_merged = shim_array.find(record_merged.fields, function(field) { return field.tag === field_other.tag; });
602
-
603
- // merged record does not contain the given field
604
- if (field_merged === undefined) {
605
- return;
606
- }
607
-
608
- // if formats are not the same, then do nothing
609
- if (formatMerged !== formatOther) {
610
- return;
611
- }
612
-
613
- options.actions
614
- .filter(function(action) { return action.formats.indexOf(formatMerged) !== -1; })
615
- .forEach(function(action) {
616
-
617
- var range = getRange(action);
618
- var index = range.index;
619
- var length = range.length;
620
-
621
- var extractFragment = function(index, length) {
622
- return function(field) {
623
- return field.value.substr(index, length);
624
- };
625
- };
626
-
627
- var insertText = function(index, length) {
628
- return function(str, text) {
629
- return str.substr(0,index) + text.substr(0, length) + str.substr(index+length);
630
- };
631
- };
632
-
633
- var extractor = extractFragment(index, length);
634
- var updateFragment = insertText(index, length);
635
-
636
- var mergedValue = extractor(field_merged);
637
- var otherValue = extractor(field_other);
638
-
639
- var uncodedRE = /^\|+$/;
640
- var uncodedOrEmpty = /^[\|^]+$/;
641
- var isEmptyFragment = function(significantCaret) {
642
- return function(value) {
643
- return significantCaret ? uncodedRE.test(value) : uncodedOrEmpty.test(value);
644
- };
645
- };
646
-
647
- var isEmpty = isEmptyFragment(action.significantCaret);
648
-
649
- if (action.type === 'selectNonEmpty') {
650
-
651
- if (isEmpty(mergedValue) && !isEmpty(otherValue)) {
652
- field_merged.value = updateFragment(field_merged.value, otherValue);
653
- }
654
- }
655
-
656
- if (action.type === 'combine') {
657
- if (!isEmpty(mergedValue) || !isEmpty(otherValue)) {
658
-
659
- var selectParts = function(value) { return value.replace(/[\|^]/g, '').split(''); };
660
- var uniq = function(array) {
661
- return array.reduce(function(acc, item) {
662
- if (!shim_array.find(acc, function(val) { return val === item; })) {
663
- acc.push(item);
664
- }
665
- return acc;
666
- }, []);
667
- };
668
-
669
- var padEnd = function(str, length, char) {
670
- while (str.length < length) {
671
- str = str + char;
672
- }
673
- return str;
674
- };
675
-
676
- var mergedParts = selectParts(mergedValue);
677
- var otherParts = selectParts(otherValue);
678
-
679
- var combinedValue = padEnd(uniq(mergedParts.concat(otherParts).sort()).slice(0,4).join(''), 4, '^');
680
-
681
- field_merged.value = updateFragment(field_merged.value, combinedValue);
682
- }
683
-
684
- }
685
-
686
- });
687
-
688
- }
689
-
690
- function actionCopy(record_merged, field_other, options, comparators, return_details) {
691
- var subfields_compare_without, removed_subfields_preferred, removed_subfields_other, fields_preferred, field_preferred, field_preferred_normalized, field_other_copy_normalized, field_other_copy, field_preferred_copy, field_transformed,
692
- details = return_details ? {} : undefined,
693
- shouldMerge = true;
694
-
695
- options = typeof options === 'object' ? options : {};
696
-
697
- fields_preferred = record_merged.fields.filter(function(field) {
698
- return field.tag == field_other.tag;
699
- });
700
-
701
- field_preferred = shim_array.find(fields_preferred, function(field) {
702
-
703
- return fieldsSimilar(field, field_other, Object.assign(clone(options), {
704
- mustBeIdentical: true
705
- }));
706
-
707
- });
708
-
709
- if (field_preferred === undefined) {
710
- field_preferred = shim_array.find(fields_preferred, function(field) {
711
- return fieldsSimilar(field, field_other, options);
712
- });
713
- }
714
-
715
- if (options.hasOwnProperty('copyIf') && typeof options.copyIf == 'object') {
716
- shouldMerge = false;
717
-
718
- Object.keys(options.copyIf).forEach(function(code) {
719
- var properties = options.copyIf[code];
720
-
721
- var fn_comparator = comparators.hasOwnProperty(properties.comparator) ? comparators[properties.comparator] : comparators.equality;
722
-
723
- var field_other_subfields = field_other.subfields.filter(function (subfield) {
724
- return subfield.code == code;
725
- });
726
-
727
- var compared_subfield = {
728
- code: code,
729
- value: properties.value
730
- };
731
-
732
- field_other_subfields.forEach(function (subfield) {
733
- if (fn_comparator(subfield, compared_subfield)) shouldMerge = true;
734
- });
735
- });
736
- }
737
-
738
- if (options.hasOwnProperty('copyUnless') && typeof options.copyUnless == 'object') {
739
- Object.keys(options.copyUnless).forEach(function(code) {
740
- var properties = options.copyUnless[code];
741
-
742
- var fn_comparator = comparators.hasOwnProperty(properties.comparator) ? comparators[properties.comparator] : comparators.equality;
743
-
744
- var field_other_subfields = field_other.subfields.filter(function (subfield) {
745
- return subfield.code == code;
746
- });
747
-
748
- var compared_subfield = {
749
- code: code,
750
- value: properties.value
751
- };
752
-
753
- field_other_subfields.forEach(function (subfield) {
754
- if (fn_comparator(subfield, compared_subfield)) shouldMerge = false;
755
- });
756
- });
757
- }
758
-
759
- if (!shouldMerge) return details;
760
-
761
- field_other_copy = clone(field_other);
762
-
763
- if (options.reduce) {
764
- var properties = options.reduce;
765
-
766
- field_other_copy.subfields = field_other_copy.subfields.filter(function(subfield) {
767
- if (properties.subfields.indexOf(subfield.code) === -1) return true;
768
-
769
- if (properties.condition) {
770
- if (properties.exact) {
771
- if (properties.condition == 'unless' && subfield.value !== properties.value) return false;
772
- else if (properties.condition == 'if' && subfield.value === properties.value) return false;
773
- else return true;
774
- }
775
- else {
776
- if (properties.condition == 'unless' && !subfield.value.match(properties.value)) return false;
777
- else if (properties.condition == 'if' && subfield.value.match(properties.value)) return false;
778
- else return true;
779
- }
780
- }
781
- else return false;
782
- });
783
- }
784
-
785
- if (options.dropOriginal || field_preferred === undefined) {
786
- if (options.dropOriginal) {
787
- fields_preferred.forEach(function(dropped_field) {
788
- record_merged.fields.splice(record_merged.fields.indexOf(dropped_field), 1);
789
- });
790
- }
791
-
792
- if (fields_preferred.length > 0 && typeof options.transformOnInequality === 'object') {
793
-
794
- field_other_copy.tag = options.transformOnInequality.tag;
795
-
796
- if (options.transformOnInequality.drop) {
797
- field_other_copy.subfields = field_other_copy.subfields.filter(function(subfield) {
798
- return options.transformOnInequality.drop.indexOf(subfield.code) < 0;
799
- });
800
- }
801
-
802
- if (options.transformOnInequality.map) {
803
-
804
- field_other_copy.subfields = field_other_copy.subfields.map(function(subfield) {
805
-
806
- Object.keys(options.transformOnInequality.map).some(function(key) {
807
- if (options.transformOnInequality.map[key] === subfield.code) {
808
- subfield.code = key;
809
- return true;
810
- }
811
- });
812
-
813
- return subfield;
814
-
815
- });
816
-
817
- }
818
-
819
- if (options.transformOnInequality.add) {
820
- Object.keys(options.transformOnInequality.add).forEach(function(key) {
821
- field_other_copy.subfields.push({
822
- code: key,
823
- value: options.transformOnInequality.add[key]
824
- });
825
- });
826
- }
827
-
828
- insertField(record_merged, field_other_copy);
829
-
830
- } else {
831
-
832
- field_other.wasUsed = true;
833
- field_other.fromOther = true;
834
-
835
- field_other_copy.wasUsed = true;
836
- field_other_copy.fromOther = true;
837
- insertField(record_merged, field_other_copy);
838
-
839
- }
840
-
841
- } else {
842
-
843
- removed_subfields_preferred = getCompareWithoutSubfields(field_preferred, options);
844
- removed_subfields_other = getCompareWithoutSubfields(field_other_copy, options);
845
-
846
- field_preferred.subfields = arrayDifference(field_preferred.subfields, removed_subfields_preferred);
847
- field_other_copy.subfields = arrayDifference(field_other_copy.subfields, removed_subfields_other);
848
-
849
- subfields_compare_without = removed_subfields_preferred.concat(removed_subfields_other).reduce(function(result, subfield) {
850
- return result.some(function(element) {
851
- if (options.compareSubfieldsNormalized) {
852
- return subfieldEquality(normalizeSubfield(element), normalizeSubfield(subfield));
853
- } else {
854
- return subfieldEquality(element, subfield);
855
- }
856
- }) ? result : result.concat(subfield);
857
- }, []);
858
-
859
- /**
860
- * @internal Determine which record's field to use, the preferred or the other one
861
- */
862
- field_preferred_normalized = normalizeField(field_preferred);
863
- field_other_copy_normalized = normalizeField(field_other_copy);
864
-
865
- /**
866
- * @internal Preferred record's subfields are a "proper" subset of other record's fields.
867
- **/
868
- if (arrayDifference(field_preferred_normalized.subfields, field_other_copy_normalized.subfields, subfieldEquality).length === 0 &&
869
- arrayDifference(field_other_copy_normalized.subfields, field_preferred_normalized.subfields, subfieldEquality).length > 0) {
870
-
871
- if (options.compareWithoutIndicators === true) {
872
- field_other_copy.ind1 = field_other_copy.ind1 === ' ' ? field_preferred.ind1 : field_other_copy.ind1;
873
- field_other_copy.ind2 = field_other_copy.ind2 === ' ' ? field_preferred.ind2 : field_other_copy.ind2;
874
- }
875
-
876
- /**
877
- * @internal The field that will be copied will contain subfields that are not using in comparison from both records
878
- */
879
- field_other_copy.subfields = field_other_copy.subfields.concat(subfields_compare_without);
880
-
881
- field_other.wasUsed = true;
882
- field_other_copy.fromOther = true;
883
-
884
- /**
885
- * @internal Combine any subfields
886
- **/
887
- if (options.combine) {
888
- options.combine.forEach(function(code) {
889
- combineSubfields(code, field_other_copy);
890
- });
891
- }
892
-
893
- if (options.pick) {
894
- pickSubfields(field_other_copy, field_preferred, options.pick.subfields, options.pick.missingOnly);
895
- }
896
-
897
- record_merged.fields.splice(record_merged.fields.indexOf(field_preferred), 1, field_other_copy);
898
-
899
- /**
900
- * @internal Add back the subfields that are not used in comparisons
901
- **/
902
- } else {
903
- /**
904
- * @internal Note: field_preferred is actually the the field in merged record (which is a copy of preferred)
905
- **/
906
- field_preferred.subfields = field_preferred.subfields.concat(subfields_compare_without);
907
-
908
- if (options.compareWithoutIndicators === true) {
909
- field_preferred.ind1 = field_preferred.ind1 === ' ' ? field_other.ind1 : field_preferred.ind1;
910
- field_preferred.ind2 = field_preferred.ind2 === ' ' ? field_other.ind2 : field_preferred.ind2;
911
- }
912
-
913
- /**
914
- * @internal Combine any subfields
915
- **/
916
- if (options.combine) {
917
- options.combine.forEach(function(code) {
918
- combineSubfields(code, field_preferred);
919
- });
920
- }
921
-
922
- if (options.pick) {
923
- pickSubfields(field_preferred, field_other_copy, options.pick.subfields, options.pick.missingOnly);
924
- }
925
-
926
- }
927
-
928
- }
929
-
930
- return details;
931
-
932
- }
933
-
934
- function actionSelectBetter(record_merged, field_other, options, comparators, return_details) {
935
-
936
-
937
- var error_invalid_record, field_merged, field_merged_normalized, field_other_normalized, field_other_copy, subfield_pairs_sizes, subfield_pairs_scores, fn_comparator, index_better, subfields_picked,
938
- details = return_details ? {} : undefined,
939
- fields_merged = record_merged.fields.filter(function(field) {
940
- return field.tag == field_other.tag;
941
- });
942
-
943
- options = typeof options === 'object' ? options : {};
944
- fn_comparator = comparators.hasOwnProperty(options.comparator) ? comparators[options.comparator] : comparators.equality;
945
-
946
- if (fields_merged.length > 1 && !options.skipOnMultiple) {
947
-
948
- error_invalid_record = new Error('selectBetter cannot be used if there are multiple fields of same tag.');
949
- error_invalid_record.name = 'InvalidRecordError';
950
-
951
- throw error_invalid_record;
952
-
953
- } else if (fields_merged.length === 0) {
954
-
955
- if (!options.requireFieldInBoth) {
956
-
957
- field_other.wasUsed = true;
958
- field_other.fromOther = true;
959
- insertField(record_merged, clone(field_other));
960
-
961
- }
962
-
963
- } else if (!options.onlyIfMissing) {
964
-
965
- field_merged = fields_merged[0];
966
- field_merged_normalized = normalizeField(field_merged);
967
- field_other_normalized = normalizeField(field_other);
968
-
969
- if (arraysIdentical(field_merged_normalized.subfields, field_other_normalized.subfields, fn_comparator)) {
970
-
971
- subfield_pairs_sizes = makeSubfieldPairs(field_merged_normalized.subfields, field_other_normalized.subfields, fn_comparator).map(function(pair) {
972
-
973
- var len1 = pair[0].value.length;
974
- var len2 = pair[1].value.length;
975
-
976
- return [len1 > len2, len2 > len1];
977
-
978
- });
979
- subfield_pairs_scores = subfield_pairs_sizes.reduce(function(result, size) {
980
-
981
- return [
982
- size[0] === true ? result[0] + 1 : result[0],
983
- size[1] === true ? result[1] + 1 : result[1]
984
- ];
985
-
986
- }, [0, 0]);
987
-
988
- /**
989
- * @internal Field in other record is considered better
990
- **/
991
- if (subfield_pairs_scores[0] < subfield_pairs_scores[1]) {
992
-
993
- field_other_copy = clone(field_other);
994
- field_other.wasUsed = true;
995
- field_other_copy.fromOther = true;
996
-
997
- record_merged.fields.splice(record_merged.fields.indexOf(field_merged), 1, field_other_copy);
998
-
999
- if (options.pickMissing) {
1000
- pickMissingSubfields(field_other_copy, fields_merged[0], options.pickMissing);
1001
- subfields_picked = 1;
1002
- }
1003
-
1004
- }
1005
-
1006
- }
1007
-
1008
- if (arrayDifference(field_merged_normalized.subfields, field_other_normalized.subfields, fn_comparator).length === 0 && arrayDifference(field_other_normalized.subfields, field_merged_normalized.subfields, fn_comparator).length > 0) {
1009
-
1010
- /**
1011
- * @internal Use field from other record
1012
- **/
1013
- field_other_copy = clone(field_other);
1014
- field_other.wasUsed = true;
1015
- field_other_copy.fromOther = true;
1016
-
1017
- record_merged.fields.splice(record_merged.fields.indexOf(field_merged), 1, field_other_copy);
1018
-
1019
- if (options.pick) {
1020
- pickSubfields(field_other_copy, fields_merged[0], options.pick.subfields, options.pick.missingOnly);
1021
- subfields_picked = 1;
1022
- }
1023
-
1024
- }
1025
-
1026
- }
1027
-
1028
- if (subfields_picked === undefined && options.pick) {
1029
- pickSubfields(fields_merged[0], field_other, options.pick.subfields, options.pick.missingOnly);
1030
- }
1031
-
1032
- return details;
1033
-
1034
- }
1035
-
1036
- function actionCreateFrom(record_merged, field_other, options, comparators, return_details) {
1037
- var error_invalid_record, error_invalid_transform_type,
1038
- target_tag = options.convertTag || field_other.tag,
1039
- details = return_details ? {} : undefined,
1040
- fields_merged;
1041
-
1042
- fields_merged = record_merged.fields.filter(function(field) {
1043
- return field.tag == target_tag;
1044
- });
1045
-
1046
- if (options.skipIfExists && fields_merged.length > 0) return details;
1047
-
1048
- var field_other_copy;
1049
-
1050
- if (options.useExisting && fields_merged.length > 0) {
1051
- field_other_copy = clone(fields_merged[0]);
1052
- }
1053
- else {
1054
- field_other_copy = clone(field_other);
1055
-
1056
- field_other_copy.subfields = [];
1057
- }
1058
-
1059
- if (options.ind1) field_other_copy.ind1 = options.ind1;
1060
- if (options.ind2) field_other_copy.ind2 = options.ind2;
1061
-
1062
- if (field_other.subfields && options.subfields) {
1063
- Object.keys(options.subfields).forEach(function(code) {
1064
- var subfield_options = options.subfields[code], new_subfield = false;
1065
-
1066
- var field_other_copy_subfields = field_other.subfields.map(function(subfield, index) {
1067
- return {
1068
- index: index,
1069
- subfield: clone(subfield)
1070
- };
1071
- }).filter(function(obj) {
1072
- return obj.subfield.code == code;
1073
- });
1074
-
1075
- if (field_other_copy_subfields.length == 0 && subfield_options.replaceValue) {
1076
- field_other_copy_subfields = [ { subfield: { code: code, value: '' } } ];
1077
- }
1078
-
1079
- field_other_copy_subfields.forEach(function(field_other_copy_subfield_obj) {
1080
- var subfield_modifications = subfield_options.modifications || [];
1081
-
1082
- if (subfield_options.convertCode) field_other_copy_subfield_obj.subfield.code = subfield_options.convertCode;
1083
- if (subfield_options.replaceValue) field_other_copy_subfield_obj.subfield.value = subfield_options.replaceValue;
1084
-
1085
- subfield_modifications.forEach(function(subfield_modifications_step) {
1086
- if (typeof subfield_modifications_step === 'function') {
1087
- field_other_copy_subfield_obj.subfield.value = subfield_modifications_step(field_other_copy_subfield_obj.subfield.value);
1088
- } else if (stringOperations.hasOwnProperty(subfield_modifications_step.type)) {
1089
- var args = subfield_modifications_step.args;
1090
-
1091
- field_other_copy_subfield_obj.subfield.value = stringOperations[subfield_modifications_step.type](field_other_copy_subfield_obj.subfield.value, subfield_modifications_step.args);
1092
- } else {
1093
- throw new Error("Undefined string operation '" + subfield_modifications_step.type + "'");
1094
- }
1095
- });
1096
- });
1097
-
1098
- if (subfield_options.append) {
1099
- var field_other_copy_target_subfields = field_other_copy.subfields.filter(function(subfield) {
1100
- return subfield.code === subfield_options.convertCode;
1101
- });
1102
-
1103
- if (field_other_copy_target_subfields.length > 1) {
1104
- error_invalid_record = new Error('append option cannot be used if there are multiple subfields of same code.');
1105
- error_invalid_record.name = 'InvalidRecordError';
1106
-
1107
- throw error_invalid_record;
1108
- }
1109
- else if (field_other_copy_target_subfields.length === 1) {
1110
- var field_other_copy_target_subfield = field_other_copy_target_subfields[0];
1111
-
1112
- field_other_copy_target_subfield.value = field_other_copy_target_subfield.value + field_other_copy_subfields.reduce(function(str, obj) {
1113
- return str + obj.subfield.value;
1114
- }, '');
1115
- }
1116
- else field_other_copy_subfields.forEach(function(obj) {
1117
- field_other_copy.subfields.push(obj.subfield);
1118
- });
1119
- }
1120
- else {
1121
- if (subfield_options.replace) {
1122
- field_other_copy.subfields = field_other_copy.subfields.filter(function(subfield) {
1123
- return subfield.code !== (subfield_options.convertCode || code);
1124
- });
1125
- }
1126
-
1127
- field_other_copy_subfields.forEach(function(obj) {
1128
- var subfield = obj.subfield;
1129
- var index = obj.index;
1130
-
1131
- if (options.useExisting && fields_merged.length > 0) {
1132
- index += fields_merged[0].subfields.length;
1133
- }
1134
-
1135
- field_other_copy.subfields.splice(index === undefined ? field_other_copy.subfields.length : index, 0, subfield);
1136
- });
1137
- }
1138
- });
1139
- }
1140
-
1141
- field_other.wasUsed = true;
1142
- field_other_copy.fromOther = true;
1143
-
1144
- if (options.convertTag) {
1145
- field_other_copy.tag = options.convertTag;
1146
- }
1147
-
1148
- if (options.useExisting || !options.keepExisting) {
1149
- fields_merged.forEach(function(field) {
1150
- record_merged.fields.splice(record_merged.fields.indexOf(field), 1);
1151
- });
1152
- }
1153
-
1154
- insertField(record_merged, field_other_copy);
1155
-
1156
- return details;
1157
- }
1158
-
1159
- configuration = Object.assign(JSON.parse(JSON.stringify(DEFAULT_OPTIONS)), typeof configuration === 'object' ? configuration : {});
1160
-
1161
- applyPlugins();
1162
-
1163
- return function(record_preferred, record_other, return_details)
1164
- {
1165
-
1166
- var details = return_details ? {} : undefined,
1167
- record_merged = new MarcRecord(record_preferred);
1168
-
1169
- record_merged.fields.forEach(function(field) {
1170
- field.wasUsed = true;
1171
- field.fromPreferred = true;
1172
- });
1173
-
1174
- record_other.fields.forEach(function(field) {
1175
-
1176
-
1177
- var result,
1178
- config = configuration.fields[shim_array.find(Object.keys(configuration.fields), function(key) {
1179
- return new RegExp('^' + key +'$').test(field.tag);
1180
- })];
1181
-
1182
- if (config !== undefined) {
1183
- if (actions.hasOwnProperty(config.action)) {
1184
-
1185
- result = actions[config.action](record_merged, field, config.options, comparators, return_details, record_other);
1186
-
1187
- if (return_details && typeof result === 'object') {
1188
-
1189
- if (!details.hasOwnProperty(field.tag)) {
1190
- details[field.tag] = [];
1191
- }
1192
-
1193
- details[field.tag].push(Object.assign({
1194
- action: config.action
1195
- }, result));
1196
-
1197
- }
1198
-
1199
- } else {
1200
- throw new Error("Undefined action '" + config.action + "'");
1201
- }
1202
- }
1203
-
1204
- });
1205
-
1206
- return !return_details ? record_merged : {
1207
- record: record_merged,
1208
- details: details
1209
- };
1210
-
1211
- };
1212
-
1213
- };
1214
-
1215
- }