@natlibfi/marc-record-validators-melinda 3.2.0 → 3.3.14-alpha.3

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 (593) hide show
  1. package/.github/CODEOWNERS +2 -0
  2. package/.github/dependabot.yml +40 -0
  3. package/.github/workflows/melinda-node-tests.yml +61 -0
  4. package/LICENSE.txt +21 -661
  5. package/README.md +4 -5
  6. package/dist/access-rights.js +94 -0
  7. package/dist/access-rights.js.map +1 -0
  8. package/dist/access-rights.spec.js +150 -0
  9. package/dist/access-rights.spec.js.map +1 -0
  10. package/dist/double-commas.js +17 -27
  11. package/dist/double-commas.js.map +1 -1
  12. package/dist/double-commas.spec.js +72 -27
  13. package/dist/double-commas.spec.js.map +1 -1
  14. package/dist/duplicates-ind1.js +47 -27
  15. package/dist/duplicates-ind1.js.map +1 -1
  16. package/dist/duplicates-ind1.spec.js +44 -27
  17. package/dist/duplicates-ind1.spec.js.map +1 -1
  18. package/dist/empty-fields.js +79 -29
  19. package/dist/empty-fields.js.map +1 -1
  20. package/dist/empty-fields.spec.js +113 -27
  21. package/dist/empty-fields.spec.js.map +1 -1
  22. package/dist/ending-punctuation-conf.js +772 -129
  23. package/dist/ending-punctuation-conf.js.map +1 -1
  24. package/dist/ending-punctuation.js +291 -72
  25. package/dist/ending-punctuation.js.map +1 -1
  26. package/dist/ending-punctuation.spec.js +2638 -118
  27. package/dist/ending-punctuation.spec.js.map +1 -1
  28. package/dist/ending-whitespace.js +58 -0
  29. package/dist/ending-whitespace.js.map +1 -0
  30. package/dist/ending-whitespace.spec.js +42 -0
  31. package/dist/ending-whitespace.spec.js.map +1 -0
  32. package/dist/field-521-fix.js +96 -0
  33. package/dist/field-521-fix.js.map +1 -0
  34. package/dist/field-521-fix.spec.js +51 -0
  35. package/dist/field-521-fix.spec.js.map +1 -0
  36. package/dist/field-exclusion.js +214 -63
  37. package/dist/field-exclusion.js.map +1 -1
  38. package/dist/field-exclusion.spec.js +1057 -31
  39. package/dist/field-exclusion.spec.js.map +1 -1
  40. package/dist/field-structure.js +249 -78
  41. package/dist/field-structure.js.map +1 -1
  42. package/dist/field-structure.spec.js +534 -31
  43. package/dist/field-structure.spec.js.map +1 -1
  44. package/dist/fields-present.js +31 -27
  45. package/dist/fields-present.js.map +1 -1
  46. package/dist/fields-present.spec.js +120 -27
  47. package/dist/fields-present.spec.js.map +1 -1
  48. package/dist/fixed-fields.js +72 -27
  49. package/dist/fixed-fields.js.map +1 -1
  50. package/dist/fixed-fields.spec.js +139 -27
  51. package/dist/fixed-fields.spec.js.map +1 -1
  52. package/dist/identical-fields.js +42 -28
  53. package/dist/identical-fields.js.map +1 -1
  54. package/dist/identical-fields.spec.js +98 -27
  55. package/dist/identical-fields.spec.js.map +1 -1
  56. package/dist/index.js +202 -27
  57. package/dist/index.js.map +1 -1
  58. package/dist/indicator-fixes.js +191 -0
  59. package/dist/indicator-fixes.js.map +1 -0
  60. package/dist/indicator-fixes.spec.js +51 -0
  61. package/dist/indicator-fixes.spec.js.map +1 -0
  62. package/dist/isbn-issn.js +266 -27
  63. package/dist/isbn-issn.js.map +1 -1
  64. package/dist/isbn-issn.spec.js +594 -27
  65. package/dist/isbn-issn.spec.js.map +1 -1
  66. package/dist/item-language.js +171 -27
  67. package/dist/item-language.js.map +1 -1
  68. package/dist/item-language.spec.js +305 -27
  69. package/dist/item-language.spec.js.map +1 -1
  70. package/dist/mergeField500Lisapainokset.js +155 -0
  71. package/dist/mergeField500Lisapainokset.js.map +1 -0
  72. package/dist/mergeField500Lisapainokset.spec.js +51 -0
  73. package/dist/mergeField500Lisapainokset.spec.js.map +1 -0
  74. package/dist/mergeRelatorTermFields.js +140 -0
  75. package/dist/mergeRelatorTermFields.js.map +1 -0
  76. package/dist/mergeRelatorTermFields.spec.js +51 -0
  77. package/dist/mergeRelatorTermFields.spec.js.map +1 -0
  78. package/dist/multiple-subfield-0.js +120 -0
  79. package/dist/multiple-subfield-0.js.map +1 -0
  80. package/dist/multiple-subfield-0.spec.js +51 -0
  81. package/dist/multiple-subfield-0.spec.js.map +1 -0
  82. package/dist/non-breaking-space.js +61 -0
  83. package/dist/non-breaking-space.js.map +1 -0
  84. package/dist/non-breaking-space.spec.js +42 -0
  85. package/dist/non-breaking-space.spec.js.map +1 -0
  86. package/dist/normalize-identifiers.js +210 -0
  87. package/dist/normalize-identifiers.js.map +1 -0
  88. package/dist/normalize-identifiers.spec.js +51 -0
  89. package/dist/normalize-identifiers.spec.js.map +1 -0
  90. package/dist/normalize-utf8-diacritics.js +140 -0
  91. package/dist/normalize-utf8-diacritics.js.map +1 -0
  92. package/dist/normalize-utf8-diacritics.spec.js +51 -0
  93. package/dist/normalize-utf8-diacritics.spec.js.map +1 -0
  94. package/dist/punctuation/index.js +281 -0
  95. package/dist/punctuation/index.js.map +1 -0
  96. package/dist/punctuation/rules/aut.js +332 -0
  97. package/dist/punctuation/rules/aut.js.map +1 -0
  98. package/dist/punctuation/rules/bib.js +374 -0
  99. package/dist/punctuation/rules/bib.js.map +1 -0
  100. package/dist/punctuation/rules/index.js +21 -0
  101. package/dist/punctuation/rules/index.js.map +1 -0
  102. package/dist/punctuation.spec.js +51 -0
  103. package/dist/punctuation.spec.js.map +1 -0
  104. package/dist/punctuation2.js +726 -0
  105. package/dist/punctuation2.js.map +1 -0
  106. package/dist/punctuation2.spec.js +51 -0
  107. package/dist/punctuation2.spec.js.map +1 -0
  108. package/dist/reindexSubfield6OccurenceNumbers.js +199 -0
  109. package/dist/reindexSubfield6OccurenceNumbers.js.map +1 -0
  110. package/dist/reindexSubfield6OccurenceNumbers.spec.js +51 -0
  111. package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +1 -0
  112. package/dist/removeDuplicateDataFields.js +405 -0
  113. package/dist/removeDuplicateDataFields.js.map +1 -0
  114. package/dist/removeDuplicateDataFields.spec.js +51 -0
  115. package/dist/removeDuplicateDataFields.spec.js.map +1 -0
  116. package/dist/removeInferiorDataFields.js +245 -0
  117. package/dist/removeInferiorDataFields.js.map +1 -0
  118. package/dist/removeInferiorDataFields.spec.js +51 -0
  119. package/dist/removeInferiorDataFields.spec.js.map +1 -0
  120. package/dist/resolvable-ext-references-melinda.js +112 -31
  121. package/dist/resolvable-ext-references-melinda.js.map +1 -1
  122. package/dist/resolvable-ext-references-melinda.spec.js +166 -27
  123. package/dist/resolvable-ext-references-melinda.spec.js.map +1 -1
  124. package/dist/resolveOrphanedSubfield6s.js +116 -0
  125. package/dist/resolveOrphanedSubfield6s.js.map +1 -0
  126. package/dist/resolveOrphanedSubfield6s.spec.js +51 -0
  127. package/dist/resolveOrphanedSubfield6s.spec.js.map +1 -0
  128. package/dist/sanitize-vocabulary-source-codes.js +93 -0
  129. package/dist/sanitize-vocabulary-source-codes.js.map +1 -0
  130. package/dist/sanitize-vocabulary-source-codes.spec.js +51 -0
  131. package/dist/sanitize-vocabulary-source-codes.spec.js.map +1 -0
  132. package/dist/sort-tags.js +53 -27
  133. package/dist/sort-tags.js.map +1 -1
  134. package/dist/sort-tags.spec.js +206 -27
  135. package/dist/sort-tags.spec.js.map +1 -1
  136. package/dist/sortRelatorTerms.js +135 -0
  137. package/dist/sortRelatorTerms.js.map +1 -0
  138. package/dist/sortRelatorTerms.spec.js +51 -0
  139. package/dist/sortRelatorTerms.spec.js.map +1 -0
  140. package/dist/sortSubfields.js +279 -0
  141. package/dist/sortSubfields.js.map +1 -0
  142. package/dist/sortSubfields.spec.js +51 -0
  143. package/dist/sortSubfields.spec.js.map +1 -0
  144. package/dist/stripPunctuation.js +49 -0
  145. package/dist/stripPunctuation.js.map +1 -0
  146. package/dist/stripPunctuation.spec.js +51 -0
  147. package/dist/stripPunctuation.spec.js.map +1 -0
  148. package/dist/subfield-exclusion.js +174 -57
  149. package/dist/subfield-exclusion.js.map +1 -1
  150. package/dist/subfield-exclusion.spec.js +521 -31
  151. package/dist/subfield-exclusion.spec.js.map +1 -1
  152. package/dist/subfield6Utils.js +457 -0
  153. package/dist/subfield6Utils.js.map +1 -0
  154. package/dist/subfield8Utils.js +99 -0
  155. package/dist/subfield8Utils.js.map +1 -0
  156. package/dist/typeOfDate-008.js +48 -0
  157. package/dist/typeOfDate-008.js.map +1 -0
  158. package/dist/typeOfDate-008.spec.js +47 -0
  159. package/dist/typeOfDate-008.spec.js.map +1 -0
  160. package/dist/unicode-decomposition.js +139 -30
  161. package/dist/unicode-decomposition.js.map +1 -1
  162. package/dist/unicode-decomposition.spec.js +90 -27
  163. package/dist/unicode-decomposition.spec.js.map +1 -1
  164. package/dist/update-field-540.js +119 -0
  165. package/dist/update-field-540.js.map +1 -0
  166. package/dist/update-field-540.spec.js +51 -0
  167. package/dist/update-field-540.spec.js.map +1 -0
  168. package/dist/urn.js +185 -0
  169. package/dist/urn.js.map +1 -0
  170. package/dist/urn.spec.js +238 -0
  171. package/dist/urn.spec.js.map +1 -0
  172. package/dist/utils.js +58 -0
  173. package/dist/utils.js.map +1 -0
  174. package/package.json +114 -124
  175. package/src/access-rights.js +84 -0
  176. package/src/access-rights.spec.js +126 -0
  177. package/src/double-commas.js +12 -49
  178. package/src/double-commas.spec.js +50 -82
  179. package/src/duplicates-ind1.js +34 -74
  180. package/src/duplicates-ind1.spec.js +39 -117
  181. package/src/empty-fields.js +62 -74
  182. package/src/empty-fields.spec.js +134 -207
  183. package/src/ending-punctuation-conf.js +679 -644
  184. package/src/ending-punctuation.js +260 -250
  185. package/src/ending-punctuation.spec.js +2545 -2322
  186. package/src/ending-whitespace.js +40 -0
  187. package/src/ending-whitespace.spec.js +44 -0
  188. package/src/field-521-fix.js +92 -0
  189. package/src/field-521-fix.spec.js +52 -0
  190. package/src/field-exclusion.js +197 -215
  191. package/src/field-exclusion.spec.js +883 -481
  192. package/src/field-structure.js +213 -271
  193. package/src/field-structure.spec.js +597 -474
  194. package/src/fields-present.js +19 -49
  195. package/src/fields-present.spec.js +90 -91
  196. package/src/fixed-fields.js +61 -94
  197. package/src/fixed-fields.spec.js +81 -125
  198. package/src/identical-fields.js +29 -48
  199. package/src/identical-fields.spec.js +114 -146
  200. package/src/index.js +41 -46
  201. package/src/indicator-fixes.js +211 -0
  202. package/src/indicator-fixes.spec.js +52 -0
  203. package/src/isbn-issn.js +254 -106
  204. package/src/isbn-issn.spec.js +399 -172
  205. package/src/item-language.js +158 -195
  206. package/src/item-language.spec.js +314 -306
  207. package/src/mergeField500Lisapainokset.js +153 -0
  208. package/src/mergeField500Lisapainokset.spec.js +52 -0
  209. package/src/mergeRelatorTermFields.js +143 -0
  210. package/src/mergeRelatorTermFields.spec.js +52 -0
  211. package/src/multiple-subfield-0.js +129 -0
  212. package/src/multiple-subfield-0.spec.js +52 -0
  213. package/src/non-breaking-space.js +49 -0
  214. package/src/non-breaking-space.spec.js +44 -0
  215. package/src/normalize-identifiers.js +197 -0
  216. package/src/normalize-identifiers.spec.js +52 -0
  217. package/src/normalize-utf8-diacritics.js +141 -0
  218. package/src/normalize-utf8-diacritics.spec.js +52 -0
  219. package/src/punctuation/index.js +292 -0
  220. package/src/punctuation/rules/aut.js +372 -0
  221. package/src/punctuation/rules/bib.js +420 -0
  222. package/src/punctuation/rules/index.js +7 -0
  223. package/src/punctuation.spec.js +52 -0
  224. package/src/punctuation2.js +441 -0
  225. package/src/punctuation2.spec.js +52 -0
  226. package/src/reindexSubfield6OccurenceNumbers.js +210 -0
  227. package/src/reindexSubfield6OccurenceNumbers.spec.js +52 -0
  228. package/src/removeDuplicateDataFields.js +447 -0
  229. package/src/removeDuplicateDataFields.spec.js +52 -0
  230. package/src/removeInferiorDataFields.js +259 -0
  231. package/src/removeInferiorDataFields.spec.js +52 -0
  232. package/src/resolvable-ext-references-melinda.js +89 -122
  233. package/src/resolvable-ext-references-melinda.spec.js +168 -198
  234. package/src/resolveOrphanedSubfield6s.js +115 -0
  235. package/src/resolveOrphanedSubfield6s.spec.js +52 -0
  236. package/src/sanitize-vocabulary-source-codes.js +99 -0
  237. package/src/sanitize-vocabulary-source-codes.spec.js +52 -0
  238. package/src/sort-tags.js +34 -60
  239. package/src/sort-tags.spec.js +256 -290
  240. package/src/sortRelatorTerms.js +142 -0
  241. package/src/sortRelatorTerms.spec.js +52 -0
  242. package/src/sortSubfields.js +176 -0
  243. package/src/sortSubfields.spec.js +52 -0
  244. package/src/stripPunctuation.js +42 -0
  245. package/src/stripPunctuation.spec.js +52 -0
  246. package/src/subfield-exclusion.js +157 -180
  247. package/src/subfield-exclusion.spec.js +507 -453
  248. package/src/subfield6Utils.js +485 -0
  249. package/src/subfield8Utils.js +102 -0
  250. package/src/typeOfDate-008.js +40 -0
  251. package/src/typeOfDate-008.spec.js +47 -0
  252. package/src/unicode-decomposition.js +130 -145
  253. package/src/unicode-decomposition.spec.js +89 -115
  254. package/src/update-field-540.js +99 -0
  255. package/src/update-field-540.spec.js +52 -0
  256. package/src/urn.js +164 -0
  257. package/src/urn.spec.js +231 -0
  258. package/src/utils.js +52 -0
  259. package/test-fixtures/duplicates-ind1/01/expectedResult.json +4 -0
  260. package/test-fixtures/duplicates-ind1/01/metadata.json +4 -0
  261. package/test-fixtures/duplicates-ind1/01/record.json +16 -0
  262. package/test-fixtures/duplicates-ind1/02/expectedResult.json +6 -0
  263. package/test-fixtures/duplicates-ind1/02/metadata.json +4 -0
  264. package/test-fixtures/duplicates-ind1/02/record.json +16 -0
  265. package/test-fixtures/duplicates-ind1/03/expectedResult.json +13 -0
  266. package/test-fixtures/duplicates-ind1/03/metadata.json +6 -0
  267. package/test-fixtures/duplicates-ind1/03/record.json +16 -0
  268. package/test-fixtures/ending-whitespace/01/expectedResult.json +4 -0
  269. package/test-fixtures/ending-whitespace/01/metadata.json +6 -0
  270. package/test-fixtures/ending-whitespace/01/record.json +15 -0
  271. package/test-fixtures/ending-whitespace/02/expectedResult.json +4 -0
  272. package/test-fixtures/ending-whitespace/02/metadata.json +6 -0
  273. package/test-fixtures/ending-whitespace/02/record.json +15 -0
  274. package/test-fixtures/ending-whitespace/03/expectedResult.json +17 -0
  275. package/test-fixtures/ending-whitespace/03/metadata.json +6 -0
  276. package/test-fixtures/ending-whitespace/03/record.json +15 -0
  277. package/test-fixtures/ending-whitespace/04/expectedResult.json +10 -0
  278. package/test-fixtures/ending-whitespace/04/metadata.json +6 -0
  279. package/test-fixtures/ending-whitespace/04/record.json +8 -0
  280. package/test-fixtures/fix521/01/expectedResult.json +6 -0
  281. package/test-fixtures/fix521/01/metadata.json +5 -0
  282. package/test-fixtures/fix521/01/record.json +13 -0
  283. package/test-fixtures/fix521/02/expectedResult.json +15 -0
  284. package/test-fixtures/fix521/02/metadata.json +5 -0
  285. package/test-fixtures/fix521/02/record.json +13 -0
  286. package/test-fixtures/fix521/03/expectedResult.json +5 -0
  287. package/test-fixtures/fix521/03/metadata.json +5 -0
  288. package/test-fixtures/fix521/03/record.json +13 -0
  289. package/test-fixtures/indicator-fixes/01/expectedResult.json +9 -0
  290. package/test-fixtures/indicator-fixes/01/metadata.json +5 -0
  291. package/test-fixtures/indicator-fixes/01/record.json +64 -0
  292. package/test-fixtures/indicator-fixes/02/expectedResult.json +66 -0
  293. package/test-fixtures/indicator-fixes/02/metadata.json +5 -0
  294. package/test-fixtures/indicator-fixes/02/record.json +64 -0
  295. package/test-fixtures/indicator-fixes/03/expectedResult.json +55 -0
  296. package/test-fixtures/indicator-fixes/03/metadata.json +5 -0
  297. package/test-fixtures/indicator-fixes/03/record.json +54 -0
  298. package/test-fixtures/indicator-fixes/04/expectedResult.json +66 -0
  299. package/test-fixtures/indicator-fixes/04/metadata.json +5 -0
  300. package/test-fixtures/indicator-fixes/04/record.json +65 -0
  301. package/test-fixtures/indicator-fixes/05/expectedResult.json +66 -0
  302. package/test-fixtures/indicator-fixes/05/metadata.json +5 -0
  303. package/test-fixtures/indicator-fixes/05/record.json +65 -0
  304. package/test-fixtures/indicator-fixes/06/expectedResult.json +75 -0
  305. package/test-fixtures/indicator-fixes/06/metadata.json +5 -0
  306. package/test-fixtures/indicator-fixes/06/record.json +74 -0
  307. package/test-fixtures/lisapainokset/fixer/01/expectedResult.json +37 -0
  308. package/test-fixtures/lisapainokset/fixer/01/metadata.json +6 -0
  309. package/test-fixtures/lisapainokset/fixer/01/record.json +61 -0
  310. package/test-fixtures/lisapainokset/fixer/02/expectedResult.json +44 -0
  311. package/test-fixtures/lisapainokset/fixer/02/metadata.json +6 -0
  312. package/test-fixtures/lisapainokset/fixer/02/record.json +45 -0
  313. package/test-fixtures/lisapainokset/fixer/03/expectedResult.json +21 -0
  314. package/test-fixtures/lisapainokset/fixer/03/metadata.json +6 -0
  315. package/test-fixtures/lisapainokset/fixer/03/record.json +45 -0
  316. package/test-fixtures/lisapainokset/validator/01/expectedResult.json +7 -0
  317. package/test-fixtures/lisapainokset/validator/01/metadata.json +6 -0
  318. package/test-fixtures/lisapainokset/validator/01/record.json +45 -0
  319. package/test-fixtures/lisapainokset/validator/02/expectedResult.json +6 -0
  320. package/test-fixtures/lisapainokset/validator/02/metadata.json +6 -0
  321. package/test-fixtures/lisapainokset/validator/02/record.json +61 -0
  322. package/test-fixtures/lisapainokset/validator/03/expectedResult.json +4 -0
  323. package/test-fixtures/lisapainokset/validator/03/metadata.json +6 -0
  324. package/test-fixtures/lisapainokset/validator/03/record.json +37 -0
  325. package/test-fixtures/mergeRelatorTermFields/fixer/01/expectedResult.json +14 -0
  326. package/test-fixtures/mergeRelatorTermFields/fixer/01/metadata.json +6 -0
  327. package/test-fixtures/mergeRelatorTermFields/fixer/01/record.json +16 -0
  328. package/test-fixtures/mergeRelatorTermFields/fixer/02/expectedResult.json +17 -0
  329. package/test-fixtures/mergeRelatorTermFields/fixer/02/metadata.json +6 -0
  330. package/test-fixtures/mergeRelatorTermFields/fixer/02/record.json +23 -0
  331. package/test-fixtures/mergeRelatorTermFields/validator/01/expectedResult.json +6 -0
  332. package/test-fixtures/mergeRelatorTermFields/validator/01/metadata.json +6 -0
  333. package/test-fixtures/mergeRelatorTermFields/validator/01/record.json +16 -0
  334. package/test-fixtures/mergeRelatorTermFields/validator/02/expectedResult.json +4 -0
  335. package/test-fixtures/mergeRelatorTermFields/validator/02/metadata.json +6 -0
  336. package/test-fixtures/mergeRelatorTermFields/validator/02/record.json +16 -0
  337. package/test-fixtures/non-breaking-space/01/expectedResult.json +4 -0
  338. package/test-fixtures/non-breaking-space/01/metadata.json +6 -0
  339. package/test-fixtures/non-breaking-space/01/record.json +15 -0
  340. package/test-fixtures/non-breaking-space/02/expectedResult.json +4 -0
  341. package/test-fixtures/non-breaking-space/02/metadata.json +6 -0
  342. package/test-fixtures/non-breaking-space/02/record.json +15 -0
  343. package/test-fixtures/non-breaking-space/03/expectedResult.json +17 -0
  344. package/test-fixtures/non-breaking-space/03/metadata.json +6 -0
  345. package/test-fixtures/non-breaking-space/03/record.json +15 -0
  346. package/test-fixtures/non-breaking-space/04/expectedResult.json +21 -0
  347. package/test-fixtures/non-breaking-space/04/metadata.json +6 -0
  348. package/test-fixtures/non-breaking-space/04/record.json +19 -0
  349. package/test-fixtures/normalize-identifiers/01/expectedResult.json +8 -0
  350. package/test-fixtures/normalize-identifiers/01/metadata.json +5 -0
  351. package/test-fixtures/normalize-identifiers/01/record.json +81 -0
  352. package/test-fixtures/normalize-identifiers/02/expectedResult.json +92 -0
  353. package/test-fixtures/normalize-identifiers/02/metadata.json +5 -0
  354. package/test-fixtures/normalize-identifiers/02/record.json +92 -0
  355. package/test-fixtures/normalize-identifiers/03/expectedResult.json +63 -0
  356. package/test-fixtures/normalize-identifiers/03/metadata.json +5 -0
  357. package/test-fixtures/normalize-identifiers/03/record.json +61 -0
  358. package/test-fixtures/normalize-identifiers/04/expectedResult.json +79 -0
  359. package/test-fixtures/normalize-identifiers/04/metadata.json +5 -0
  360. package/test-fixtures/normalize-identifiers/04/record.json +77 -0
  361. package/test-fixtures/normalize-utf8-diacritics/01/expectedResult.json +7 -0
  362. package/test-fixtures/normalize-utf8-diacritics/01/metadata.json +5 -0
  363. package/test-fixtures/normalize-utf8-diacritics/01/record.json +39 -0
  364. package/test-fixtures/normalize-utf8-diacritics/02/expectedResult.json +41 -0
  365. package/test-fixtures/normalize-utf8-diacritics/02/metadata.json +5 -0
  366. package/test-fixtures/normalize-utf8-diacritics/02/record.json +39 -0
  367. package/test-fixtures/normalize-utf8-diacritics/03/expectedResult.json +5 -0
  368. package/test-fixtures/normalize-utf8-diacritics/03/metadata.json +5 -0
  369. package/test-fixtures/normalize-utf8-diacritics/03/record.json +37 -0
  370. package/test-fixtures/normalize-utf8-diacritics/04/expectedResult.json +41 -0
  371. package/test-fixtures/normalize-utf8-diacritics/04/metadata.json +5 -0
  372. package/test-fixtures/normalize-utf8-diacritics/04/record.json +39 -0
  373. package/test-fixtures/normalize-utf8-diacritics/05/expectedResult.json +41 -0
  374. package/test-fixtures/normalize-utf8-diacritics/05/metadata.json +5 -0
  375. package/test-fixtures/normalize-utf8-diacritics/05/record.json +41 -0
  376. package/test-fixtures/punctuation/01/expectedResult.json +3 -0
  377. package/test-fixtures/punctuation/01/metadata.json +4 -0
  378. package/test-fixtures/punctuation/01/record.json +18 -0
  379. package/test-fixtures/punctuation/02/expectedResult.json +3 -0
  380. package/test-fixtures/punctuation/02/metadata.json +4 -0
  381. package/test-fixtures/punctuation/02/record.json +18 -0
  382. package/test-fixtures/punctuation/03/expectedResult.json +21 -0
  383. package/test-fixtures/punctuation/03/metadata.json +5 -0
  384. package/test-fixtures/punctuation/03/record.json +19 -0
  385. package/test-fixtures/punctuation/04/expectedResult.json +21 -0
  386. package/test-fixtures/punctuation/04/metadata.json +5 -0
  387. package/test-fixtures/punctuation/04/record.json +19 -0
  388. package/test-fixtures/punctuation/05/expectedResult.json +44 -0
  389. package/test-fixtures/punctuation/05/metadata.json +5 -0
  390. package/test-fixtures/punctuation/05/record.json +42 -0
  391. package/test-fixtures/punctuation2/01/expectedResult.json +12 -0
  392. package/test-fixtures/punctuation2/01/metadata.json +6 -0
  393. package/test-fixtures/punctuation2/01/record.json +37 -0
  394. package/test-fixtures/punctuation2/02/expectedResult.json +4 -0
  395. package/test-fixtures/punctuation2/02/metadata.json +6 -0
  396. package/test-fixtures/punctuation2/02/record.json +14 -0
  397. package/test-fixtures/punctuation2/04/expectedResult.json +7 -0
  398. package/test-fixtures/punctuation2/04/metadata.json +6 -0
  399. package/test-fixtures/punctuation2/04/record.json +22 -0
  400. package/test-fixtures/punctuation2/05/expectedResult.json +6 -0
  401. package/test-fixtures/punctuation2/05/metadata.json +6 -0
  402. package/test-fixtures/punctuation2/05/record.json +12 -0
  403. package/test-fixtures/punctuation2/98/expectedResult.json +45 -0
  404. package/test-fixtures/punctuation2/98/metadata.json +6 -0
  405. package/test-fixtures/punctuation2/98/record.json +43 -0
  406. package/test-fixtures/punctuation2/99/expectedResult.json +15 -0
  407. package/test-fixtures/punctuation2/99/metadata.json +6 -0
  408. package/test-fixtures/punctuation2/99/record.json +14 -0
  409. package/test-fixtures/reindex-sf6-occurence-numbers/f01/expectedResult.json +35 -0
  410. package/test-fixtures/reindex-sf6-occurence-numbers/f01/metadata.json +6 -0
  411. package/test-fixtures/reindex-sf6-occurence-numbers/f01/record.json +34 -0
  412. package/test-fixtures/reindex-sf6-occurence-numbers/f02/expectedResult.json +53 -0
  413. package/test-fixtures/reindex-sf6-occurence-numbers/f02/metadata.json +6 -0
  414. package/test-fixtures/reindex-sf6-occurence-numbers/f02/record.json +51 -0
  415. package/test-fixtures/reindex-sf6-occurence-numbers/f03/expectedResult.json +46 -0
  416. package/test-fixtures/reindex-sf6-occurence-numbers/f03/metadata.json +7 -0
  417. package/test-fixtures/reindex-sf6-occurence-numbers/f03/record.json +44 -0
  418. package/test-fixtures/reindex-sf6-occurence-numbers/v01/expectedResult.json +6 -0
  419. package/test-fixtures/reindex-sf6-occurence-numbers/v01/metadata.json +5 -0
  420. package/test-fixtures/reindex-sf6-occurence-numbers/v01/record.json +31 -0
  421. package/test-fixtures/reindex-sf6-occurence-numbers/v02/expectedResult.json +6 -0
  422. package/test-fixtures/reindex-sf6-occurence-numbers/v02/metadata.json +6 -0
  423. package/test-fixtures/reindex-sf6-occurence-numbers/v02/record.json +38 -0
  424. package/test-fixtures/reindex-sf6-occurence-numbers/v03/expectedResult.json +6 -0
  425. package/test-fixtures/reindex-sf6-occurence-numbers/v03/metadata.json +6 -0
  426. package/test-fixtures/reindex-sf6-occurence-numbers/v03/record.json +30 -0
  427. package/test-fixtures/remove-duplicate-datafields/f01/expectedResult.json +35 -0
  428. package/test-fixtures/remove-duplicate-datafields/f01/metadata.json +6 -0
  429. package/test-fixtures/remove-duplicate-datafields/f01/record.json +34 -0
  430. package/test-fixtures/remove-duplicate-datafields/f03/expectedResult.json +20 -0
  431. package/test-fixtures/remove-duplicate-datafields/f03/metadata.json +6 -0
  432. package/test-fixtures/remove-duplicate-datafields/f03/record.json +33 -0
  433. package/test-fixtures/remove-duplicate-datafields/f03b/expectedResult.json +20 -0
  434. package/test-fixtures/remove-duplicate-datafields/f03b/metadata.json +6 -0
  435. package/test-fixtures/remove-duplicate-datafields/f03b/record.json +35 -0
  436. package/test-fixtures/remove-duplicate-datafields/f03c/expectedResult.json +25 -0
  437. package/test-fixtures/remove-duplicate-datafields/f03c/metadata.json +6 -0
  438. package/test-fixtures/remove-duplicate-datafields/f03c/record.json +43 -0
  439. package/test-fixtures/remove-duplicate-datafields/f04/expectedResult.json +31 -0
  440. package/test-fixtures/remove-duplicate-datafields/f04/metadata.json +6 -0
  441. package/test-fixtures/remove-duplicate-datafields/f04/record.json +41 -0
  442. package/test-fixtures/remove-duplicate-datafields/f05/expectedResult.json +23 -0
  443. package/test-fixtures/remove-duplicate-datafields/f05/metadata.json +6 -0
  444. package/test-fixtures/remove-duplicate-datafields/f05/record.json +29 -0
  445. package/test-fixtures/remove-duplicate-datafields/f06/expectedResult.json +24 -0
  446. package/test-fixtures/remove-duplicate-datafields/f06/metadata.json +6 -0
  447. package/test-fixtures/remove-duplicate-datafields/f06/record.json +41 -0
  448. package/test-fixtures/remove-duplicate-datafields/f07/expectedResult.json +15 -0
  449. package/test-fixtures/remove-duplicate-datafields/f07/metadata.json +6 -0
  450. package/test-fixtures/remove-duplicate-datafields/f07/record.json +21 -0
  451. package/test-fixtures/remove-duplicate-datafields/f08/expectedResult.json +21 -0
  452. package/test-fixtures/remove-duplicate-datafields/f08/metadata.json +6 -0
  453. package/test-fixtures/remove-duplicate-datafields/f08/record.json +33 -0
  454. package/test-fixtures/remove-duplicate-datafields/f09/expectedResult.json +6 -0
  455. package/test-fixtures/remove-duplicate-datafields/f09/metadata.json +6 -0
  456. package/test-fixtures/remove-duplicate-datafields/f09/record.json +9 -0
  457. package/test-fixtures/remove-duplicate-datafields/f10/expectedResult.json +15 -0
  458. package/test-fixtures/remove-duplicate-datafields/f10/metadata.json +6 -0
  459. package/test-fixtures/remove-duplicate-datafields/f10/record.json +24 -0
  460. package/test-fixtures/remove-duplicate-datafields/f11/expectedResult.json +30 -0
  461. package/test-fixtures/remove-duplicate-datafields/f11/metadata.json +6 -0
  462. package/test-fixtures/remove-duplicate-datafields/f11/record.json +53 -0
  463. package/test-fixtures/remove-duplicate-datafields/v01/expectedResult.json +6 -0
  464. package/test-fixtures/remove-duplicate-datafields/v01/metadata.json +6 -0
  465. package/test-fixtures/remove-duplicate-datafields/v01/record.json +31 -0
  466. package/test-fixtures/remove-duplicate-datafields/v02/expectedResult.json +10 -0
  467. package/test-fixtures/remove-duplicate-datafields/v02/metadata.json +6 -0
  468. package/test-fixtures/remove-duplicate-datafields/v02/record.json +45 -0
  469. package/test-fixtures/remove-duplicate-datafields/v03/expectedResult.json +6 -0
  470. package/test-fixtures/remove-duplicate-datafields/v03/metadata.json +7 -0
  471. package/test-fixtures/remove-duplicate-datafields/v03/record.json +37 -0
  472. package/test-fixtures/remove-duplicate-datafields/v04/expectedResult.json +8 -0
  473. package/test-fixtures/remove-duplicate-datafields/v04/metadata.json +6 -0
  474. package/test-fixtures/remove-duplicate-datafields/v04/record.json +41 -0
  475. package/test-fixtures/remove-inferior-datafields/f01/expectedResult.json +21 -0
  476. package/test-fixtures/remove-inferior-datafields/f01/metadata.json +6 -0
  477. package/test-fixtures/remove-inferior-datafields/f01/record.json +31 -0
  478. package/test-fixtures/remove-inferior-datafields/f03/expectedResult.json +16 -0
  479. package/test-fixtures/remove-inferior-datafields/f03/metadata.json +6 -0
  480. package/test-fixtures/remove-inferior-datafields/f03/record.json +27 -0
  481. package/test-fixtures/remove-inferior-datafields/f04/expectedResult.json +31 -0
  482. package/test-fixtures/remove-inferior-datafields/f04/metadata.json +6 -0
  483. package/test-fixtures/remove-inferior-datafields/f04/record.json +38 -0
  484. package/test-fixtures/remove-inferior-datafields/f05/expectedResult.json +34 -0
  485. package/test-fixtures/remove-inferior-datafields/f05/metadata.json +6 -0
  486. package/test-fixtures/remove-inferior-datafields/f05/record.json +41 -0
  487. package/test-fixtures/remove-inferior-datafields/f06/expectedResult.json +16 -0
  488. package/test-fixtures/remove-inferior-datafields/f06/metadata.json +6 -0
  489. package/test-fixtures/remove-inferior-datafields/f06/record.json +20 -0
  490. package/test-fixtures/remove-inferior-datafields/v01/expectedResult.json +6 -0
  491. package/test-fixtures/remove-inferior-datafields/v01/metadata.json +6 -0
  492. package/test-fixtures/remove-inferior-datafields/v01/record.json +31 -0
  493. package/test-fixtures/remove-inferior-datafields/v02/expectedResult.json +6 -0
  494. package/test-fixtures/remove-inferior-datafields/v02/metadata.json +6 -0
  495. package/test-fixtures/remove-inferior-datafields/v02/record.json +21 -0
  496. package/test-fixtures/remove-orphanded-sf6s/f01/expectedResult.json +35 -0
  497. package/test-fixtures/remove-orphanded-sf6s/f01/metadata.json +6 -0
  498. package/test-fixtures/remove-orphanded-sf6s/f01/record.json +34 -0
  499. package/test-fixtures/remove-orphanded-sf6s/f02/expectedResult.json +40 -0
  500. package/test-fixtures/remove-orphanded-sf6s/f02/metadata.json +6 -0
  501. package/test-fixtures/remove-orphanded-sf6s/f02/record.json +43 -0
  502. package/test-fixtures/remove-orphanded-sf6s/v01/expectedResult.json +6 -0
  503. package/test-fixtures/remove-orphanded-sf6s/v01/metadata.json +6 -0
  504. package/test-fixtures/remove-orphanded-sf6s/v01/record.json +31 -0
  505. package/test-fixtures/remove-orphanded-sf6s/v02/expectedResult.json +6 -0
  506. package/test-fixtures/remove-orphanded-sf6s/v02/metadata.json +6 -0
  507. package/test-fixtures/remove-orphanded-sf6s/v02/record.json +31 -0
  508. package/test-fixtures/resolvable-ext-references-melinda.js +0 -27
  509. package/test-fixtures/sanitize-vocabulary-source-codes/f01/expectedResult.json +32 -0
  510. package/test-fixtures/sanitize-vocabulary-source-codes/f01/metadata.json +6 -0
  511. package/test-fixtures/sanitize-vocabulary-source-codes/f01/record.json +32 -0
  512. package/test-fixtures/sanitize-vocabulary-source-codes/f02/expectedResult.json +24 -0
  513. package/test-fixtures/sanitize-vocabulary-source-codes/f02/metadata.json +6 -0
  514. package/test-fixtures/sanitize-vocabulary-source-codes/f02/record.json +24 -0
  515. package/test-fixtures/sanitize-vocabulary-source-codes/v01/expectedResult.json +12 -0
  516. package/test-fixtures/sanitize-vocabulary-source-codes/v01/metadata.json +6 -0
  517. package/test-fixtures/sanitize-vocabulary-source-codes/v01/record.json +24 -0
  518. package/test-fixtures/sort-relator-terms/f01/expectedResult.json +23 -0
  519. package/test-fixtures/sort-relator-terms/f01/metadata.json +6 -0
  520. package/test-fixtures/sort-relator-terms/f01/record.json +22 -0
  521. package/test-fixtures/sort-relator-terms/f02/expectedResult.json +26 -0
  522. package/test-fixtures/sort-relator-terms/f02/metadata.json +6 -0
  523. package/test-fixtures/sort-relator-terms/f02/record.json +22 -0
  524. package/test-fixtures/sort-relator-terms/v01/expectedResult.json +5 -0
  525. package/test-fixtures/sort-relator-terms/v01/metadata.json +6 -0
  526. package/test-fixtures/sort-relator-terms/v01/record.json +22 -0
  527. package/test-fixtures/sort-relator-terms/v02/expectedResult.json +6 -0
  528. package/test-fixtures/sort-relator-terms/v02/metadata.json +6 -0
  529. package/test-fixtures/sort-relator-terms/v02/record.json +14 -0
  530. package/test-fixtures/sort-subfields/f01/expectedResult.json +24 -0
  531. package/test-fixtures/sort-subfields/f01/metadata.json +6 -0
  532. package/test-fixtures/sort-subfields/f01/record.json +20 -0
  533. package/test-fixtures/sort-subfields/v01/expectedResult.json +5 -0
  534. package/test-fixtures/sort-subfields/v01/metadata.json +6 -0
  535. package/test-fixtures/sort-subfields/v01/record.json +24 -0
  536. package/test-fixtures/sort-subfields/v02/expectedResult.json +6 -0
  537. package/test-fixtures/sort-subfields/v02/metadata.json +6 -0
  538. package/test-fixtures/sort-subfields/v02/record.json +8 -0
  539. package/test-fixtures/strip-punctuation/01/expectedResult.json +12 -0
  540. package/test-fixtures/strip-punctuation/01/metadata.json +6 -0
  541. package/test-fixtures/strip-punctuation/01/record.json +37 -0
  542. package/test-fixtures/strip-punctuation/02/expectedResult.json +4 -0
  543. package/test-fixtures/strip-punctuation/02/metadata.json +6 -0
  544. package/test-fixtures/strip-punctuation/02/record.json +14 -0
  545. package/test-fixtures/strip-punctuation/04/expectedResult.json +6 -0
  546. package/test-fixtures/strip-punctuation/04/metadata.json +6 -0
  547. package/test-fixtures/strip-punctuation/04/record.json +22 -0
  548. package/test-fixtures/strip-punctuation/05/expectedResult.json +6 -0
  549. package/test-fixtures/strip-punctuation/05/metadata.json +6 -0
  550. package/test-fixtures/strip-punctuation/05/record.json +12 -0
  551. package/test-fixtures/strip-punctuation/98/expectedResult.json +44 -0
  552. package/test-fixtures/strip-punctuation/98/metadata.json +6 -0
  553. package/test-fixtures/strip-punctuation/98/record.json +45 -0
  554. package/test-fixtures/strip-punctuation/99/expectedResult.json +16 -0
  555. package/test-fixtures/strip-punctuation/99/metadata.json +6 -0
  556. package/test-fixtures/strip-punctuation/99/record.json +16 -0
  557. package/test-fixtures/subfield0/f01/expectedResult.json +25 -0
  558. package/test-fixtures/subfield0/f01/metadata.json +6 -0
  559. package/test-fixtures/subfield0/f01/record.json +23 -0
  560. package/test-fixtures/subfield0/f02/expectedResult.json +35 -0
  561. package/test-fixtures/subfield0/f02/metadata.json +6 -0
  562. package/test-fixtures/subfield0/f02/record.json +41 -0
  563. package/test-fixtures/subfield0/f03/expectedResult.json +21 -0
  564. package/test-fixtures/subfield0/f03/metadata.json +7 -0
  565. package/test-fixtures/subfield0/f03/record.json +24 -0
  566. package/test-fixtures/subfield0/v01/expectedResult.json +4 -0
  567. package/test-fixtures/subfield0/v01/metadata.json +6 -0
  568. package/test-fixtures/subfield0/v01/record.json +23 -0
  569. package/test-fixtures/subfield0/v02/expectedResult.json +9 -0
  570. package/test-fixtures/subfield0/v02/metadata.json +6 -0
  571. package/test-fixtures/subfield0/v02/record.json +38 -0
  572. package/test-fixtures/typeOfDate-008/01/expectedResult.json +3 -0
  573. package/test-fixtures/typeOfDate-008/01/metadata.json +4 -0
  574. package/test-fixtures/typeOfDate-008/01/record.json +14 -0
  575. package/test-fixtures/typeOfDate-008/02/expectedResult.json +4 -0
  576. package/test-fixtures/typeOfDate-008/02/metadata.json +4 -0
  577. package/test-fixtures/typeOfDate-008/02/record.json +14 -0
  578. package/test-fixtures/typeOfDate-008/03/expectedResult.json +14 -0
  579. package/test-fixtures/typeOfDate-008/03/metadata.json +5 -0
  580. package/test-fixtures/typeOfDate-008/03/record.json +14 -0
  581. package/test-fixtures/typeOfDate-008/04/expectedResult.json +14 -0
  582. package/test-fixtures/typeOfDate-008/04/metadata.json +5 -0
  583. package/test-fixtures/typeOfDate-008/04/record.json +14 -0
  584. package/test-fixtures/typeOfDate-008/05/expectedResult.json +14 -0
  585. package/test-fixtures/typeOfDate-008/05/metadata.json +5 -0
  586. package/test-fixtures/typeOfDate-008/05/record.json +14 -0
  587. package/test-fixtures/update-field-540/f01/expectedResult.json +23 -0
  588. package/test-fixtures/update-field-540/f01/metadata.json +6 -0
  589. package/test-fixtures/update-field-540/f01/record.json +23 -0
  590. package/test-fixtures/update-field-540/v01/expectedResult.json +7 -0
  591. package/test-fixtures/update-field-540/v01/metadata.json +6 -0
  592. package/test-fixtures/update-field-540/v01/record.json +23 -0
  593. package/.travis.yml +0 -10
@@ -0,0 +1,405 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = _default;
7
+ exports.fieldToChain = fieldToChain;
8
+ exports.handleDuplicateSubfield8Chains = handleDuplicateSubfield8Chains;
9
+ exports.isChainHead = isChainHead;
10
+ exports.removeDuplicateDatafields = removeDuplicateDatafields;
11
+ exports.removeDuplicateSubfield8Chains = removeDuplicateSubfield8Chains;
12
+ exports.sameField = sameField;
13
+ var _debug = _interopRequireDefault(require("debug"));
14
+ var _utils = require("./utils");
15
+ var _subfield6Utils = require("./subfield6Utils");
16
+ var _subfield8Utils = require("./subfield8Utils");
17
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
+ const LINK_ROOT = 4;
19
+ const LINKED_AND_PROCESSED = 2;
20
+ const LINKED_NOT_PROCESSED = 1;
21
+
22
+ // Relocated from melinda-marc-record-merge-reducers (and renamed)
23
+
24
+ const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda:removeDuplicateDataFields');
25
+ function _default() {
26
+ return {
27
+ description: 'Remove duplicate data fields. Certain exceptions apply, mainly too complited chained fields',
28
+ validate,
29
+ fix
30
+ };
31
+ function fix(record) {
32
+ (0, _utils.nvdebug)('Remove duplicate data fields');
33
+ const res = {
34
+ message: [],
35
+ fix: [],
36
+ valid: true
37
+ };
38
+ removeDuplicateDatafields(record, true);
39
+ // This can not really fail...
40
+ return res;
41
+ }
42
+ function validate(record) {
43
+ // Check max, and check number of different indexes
44
+ (0, _utils.nvdebug)('Validate record: duplicate data fields cause (t)error', debug);
45
+ const duplicates = removeDuplicateDatafields(record, false);
46
+
47
+ //const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);
48
+
49
+ const res = {
50
+ message: duplicates
51
+ };
52
+
53
+ /*
54
+ if (orphanedFields.length > 0) { // eslint-disable-line functional/no-conditional-statements
55
+ res.message = [`${orphanedFields.length} orphaned occurrence number field(s) detected`]; // eslint-disable-line functional/immutable-data
56
+ }
57
+ */
58
+ res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data
59
+ return res;
60
+ }
61
+ }
62
+
63
+ /*
64
+ function numberOfLinkageSubfields(field) {
65
+ nvdebug(`N of Linkage Subs(${fieldToString(field)})`);
66
+ const subfields = field.subfields.filter(sf => sf.code === '6' || sf.code === '8');
67
+ return subfields.length;
68
+ }
69
+ */
70
+
71
+ function removeLinkNotes(record) {
72
+ record.fields.forEach(f => delete f.linkNote); // eslint-disable-line functional/immutable-data
73
+ }
74
+
75
+ function newGetAllLinkedFields(field, record, useSixes = true, useEights = true) {
76
+ removeLinkNotes(record); // should be clear, but let's play safe
77
+
78
+ /* eslint-disable */
79
+ field.linkNote = LINK_ROOT;
80
+ let currField = field;
81
+
82
+ // Loop until all linked fields have been processed:
83
+ while (currField !== undefined) {
84
+ if (useSixes) {
85
+ const related6s = (0, _subfield6Utils.get6s)(currField, record.fields);
86
+ related6s.forEach(f => linkField(f));
87
+ }
88
+ if (useEights) {
89
+ const related8s = (0, _subfield8Utils.add8s)([currField], record);
90
+ related8s.forEach(f => linkField(f));
91
+ }
92
+ if (currField.linkNote !== LINK_ROOT) {
93
+ currField.linkNote = LINKED_AND_PROCESSED;
94
+ }
95
+ currField = record.fields.find(f => f.linkNote === LINKED_NOT_PROCESSED);
96
+ }
97
+
98
+ // Collect relevant fields:
99
+ const linkedFields = record.fields.filter(f => f.linkNote);
100
+ removeLinkNotes(record);
101
+ return linkedFields;
102
+ function linkField(f) {
103
+ if (!f.linkNote) {
104
+ f.linkNote = LINKED_NOT_PROCESSED;
105
+ }
106
+ }
107
+
108
+ /* eslint-enable */
109
+ }
110
+
111
+ function recordRemoveFieldOrSubfield8(record, field, currLinkingNumber) {
112
+ const eights = field.subfields.filter(sf => sf.code === '8');
113
+ if (eights.length < 2) {
114
+ record.removeField(field);
115
+ return;
116
+ }
117
+ const subfields = field.subfields.filter(sf => (0, _subfield8Utils.getSubfield8LinkingNumber)(sf) === currLinkingNumber);
118
+ subfields.forEach(sf => record.removeSubfield(sf, field));
119
+ }
120
+ function newRecordRemoveFieldOrSubfield8(record, field, currLinkingNumber, fix) {
121
+ const eights = field.subfields.filter(sf => sf.code === '8');
122
+ if (eights.length < 2) {
123
+ field.deleted = 1; // eslint-disable-line functional/immutable-data
124
+ return;
125
+ }
126
+ const subfields = field.subfields.filter(sf => (0, _subfield8Utils.getSubfield8LinkingNumber)(sf) === currLinkingNumber);
127
+ subfields.forEach(sf => {
128
+ field.modified = 1; // eslint-disable-line functional/immutable-data
129
+ if (fix) {
130
+ // eslint-disable-line functional/no-conditional-statements
131
+ record.removeSubfield(sf, field);
132
+ }
133
+ });
134
+ }
135
+ function removeDuplicateSubfield8Chains(record, fix = true) {
136
+ // Seen $8 subsfields in various fields:
137
+ // 161 700
138
+ // 17 710
139
+ // 11 110
140
+ // 8 730
141
+ // 1 100
142
+ // Given these stats, there's no need to check for 1XX-vs-7XX removals
143
+
144
+ /* eslint-disable */
145
+ let seen = {};
146
+ let removables = []; // for validation
147
+
148
+ (0, _utils.nvdebug)("CHAIN-8");
149
+ const seenLinkingNumbers = (0, _subfield8Utils.recordGetAllSubfield8LinkingNumbers)(record);
150
+ if (seenLinkingNumbers.length === 0) {
151
+ return removables;
152
+ }
153
+ (0, _utils.nvdebug)(`seen linking numbers ($8): ${seenLinkingNumbers.join(', ')}`, debug);
154
+ seenLinkingNumbers.forEach(currLinkingNumber => {
155
+ const linkedFields = (0, _subfield8Utils.recordGetFieldsWithSubfield8LinkingNumber)(record, currLinkingNumber); //getFieldsWithSubfield8Index(base, baseIndex);
156
+ // As/If there's just one occurrence number it should be fine to use normalizeOccurrenceNumber = true
157
+ const normalizeOccurrenceNumber = true;
158
+ const linkedFieldsAsString = (0, _subfield6Utils.fieldsToNormalizedString)(linkedFields, currLinkingNumber, normalizeOccurrenceNumber, true);
159
+ (0, _utils.nvdebug)(`Results for LINKING NUMBER ${currLinkingNumber}:`, debug);
160
+ (0, _utils.nvdebug)(`${linkedFieldsAsString}`, debug);
161
+ if (linkedFieldsAsString in seen) {
162
+ if (!removables.includes(linkedFieldsAsString)) {
163
+ removables.push(linkedFieldsAsString);
164
+ }
165
+ if (fix) {
166
+ (0, _utils.nvdebug)(`$8 CHAIN FIX: REMOVE $8 GROUP: ${(0, _utils.fieldsToString)(linkedFields)}`, debug);
167
+ linkedFields.forEach(field => recordRemoveFieldOrSubfield8(record, field, currLinkingNumber));
168
+ return;
169
+ }
170
+ (0, _utils.nvdebug)(`$8 VALIDATION: DUPLICATE DETECTED ${linkedFieldsAsString}`, debug);
171
+ return;
172
+ }
173
+ (0, _utils.nvdebug)(`$8 DOUBLE REMOVAL OR VALIDATION: ADD2SEEN ${linkedFieldsAsString}`, debug);
174
+ seen[linkedFieldsAsString] = 1;
175
+ return;
176
+ });
177
+
178
+ /* eslint-enable */
179
+ return removables;
180
+ }
181
+ function handleDuplicateSubfield8Chains(record, fix) {
182
+ // Seen $8 subsfields in various fields:
183
+ // 161 700
184
+ // 17 710
185
+ // 11 110
186
+ // 8 730
187
+ // 1 100
188
+ // Given these stats, there's no need to check for 1XX-vs-7XX removals
189
+
190
+ /* eslint-disable */
191
+ let seen = {};
192
+ (0, _utils.nvdebug)("CHAIN-8");
193
+ const seenLinkingNumbers = (0, _subfield8Utils.recordGetAllSubfield8LinkingNumbers)(record);
194
+ if (seenLinkingNumbers.length === 0) {
195
+ return;
196
+ }
197
+ (0, _utils.nvdebug)(`seen linking numbers ($8): ${seenLinkingNumbers.join(', ')}`, debug);
198
+ seenLinkingNumbers.forEach(currLinkingNumber => {
199
+ const linkedFields = (0, _subfield8Utils.recordGetFieldsWithSubfield8LinkingNumber)(record, currLinkingNumber); //getFieldsWithSubfield8Index(base, baseIndex);
200
+ // As/If there's just one occurrence number it should be fine to use normalizeOccurrenceNumber = true
201
+ const normalizeOccurrenceNumber = false; //true;
202
+ const linkedFieldsAsString = (0, _subfield6Utils.fieldsToNormalizedString)(linkedFields, currLinkingNumber, normalizeOccurrenceNumber, true);
203
+ (0, _utils.nvdebug)(`Results for LINKING NUMBER ${currLinkingNumber}:`, debug);
204
+ (0, _utils.nvdebug)(`${linkedFieldsAsString}`, debug);
205
+ if (linkedFieldsAsString in seen) {
206
+ (0, _utils.nvdebug)(`$8 CHAIN FIX: REMOVE $8 GROUP: ${(0, _utils.fieldsToString)(linkedFields)}`, debug);
207
+ linkedFields.forEach(field => newRecordRemoveFieldOrSubfield8(record, field, currLinkingNumber, fix));
208
+ return;
209
+ }
210
+ (0, _utils.nvdebug)(`$8 DOUBLE REMOVAL OR VALIDATION: ADD2SEEN ${linkedFieldsAsString}`, debug);
211
+ seen[linkedFieldsAsString] = 1;
212
+ return;
213
+ });
214
+
215
+ /* eslint-enable */
216
+ }
217
+
218
+ function markIdenticalSubfield6Chains(chain, record) {
219
+ const normalizeOccurrenceNumber = true;
220
+ const normalizeTag = chain.some(field => field.tag.substring(0, 1) === '1'); // 1XX can delete 7XX as well!
221
+ const chainAsString = (0, _subfield6Utils.fieldsToNormalizedString)(chain, 0, normalizeOccurrenceNumber, normalizeTag);
222
+ (0, _utils.nvdebug)(`markIdenticalSubfield6Chains: ${chainAsString}`);
223
+ record.fields.forEach(f => compareWithChain(f));
224
+ function compareWithChain(f) {
225
+ (0, _utils.nvdebug)(`FIELD2CHAIN ${(0, _utils.fieldToString)(f)}`);
226
+ const otherChain = fieldToChain(f, record);
227
+ // Not a lone field or chain (head) or ... or is-same-chain
228
+ if (otherChain.length === 0 || sameField(chain[0], otherChain[0])) {
229
+ return;
230
+ }
231
+ const otherChainAsString = (0, _subfield6Utils.fieldsToNormalizedString)(otherChain, 0, normalizeOccurrenceNumber, normalizeTag);
232
+
233
+ // Mark other chain as deleted:
234
+ if (chainAsString === otherChainAsString) {
235
+ otherChain.forEach(f => {
236
+ (0, _utils.nvdebug)(` mark ${(0, _utils.fieldToString)(f)} as deleted ($6-chain)...`);
237
+ f.deleted = 1; // eslint-disable-line functional/immutable-data
238
+ });
239
+
240
+ return;
241
+ }
242
+ }
243
+ }
244
+ function markIdenticalLoneFieldsAsDeletable(field, record) {
245
+ if (field.deleted) {
246
+ return;
247
+ }
248
+ // targetLinkingNumber = 0, normalizedOccurenceNumber = false, normalizeTag = true)
249
+ const normalizeTag = field.tag.substring(0, 1) === '1'; // 1XX can delete 7XX as well!
250
+ const fieldAsString = (0, _subfield6Utils.fieldToNormalizedString)(field, 0, false, normalizeTag);
251
+ const identicalLoneFields = record.fields.filter(f => !sameField(f, field) && (0, _subfield6Utils.fieldToNormalizedString)(f, 0, false, normalizeTag) === fieldAsString);
252
+
253
+ // Mark fields as deleted:
254
+ identicalLoneFields.forEach(f => {
255
+ (0, _utils.nvdebug)(` mark ${(0, _utils.fieldToString)(f)} as deleted (lone field)...`);
256
+ f.deleted = 1; // eslint-disable-line functional/immutable-data
257
+ });
258
+ }
259
+
260
+ function acceptFieldsWithSubfield6(fieldsWithSubfield6) {
261
+ // There can be only one non-880 field:
262
+ const non880 = fieldsWithSubfield6.filter(f => f.tag !== '880');
263
+ if (non880.length > 1) {
264
+ return false;
265
+ }
266
+ const occurrenceNumbers = (0, _subfield6Utils.fieldsGetOccurrenceNumbers)(fieldsWithSubfield6);
267
+ // Chain can contain only single occurrence number:
268
+ if (occurrenceNumbers.length > 1) {
269
+ return false;
270
+ }
271
+ return true;
272
+ }
273
+ function isSingleTagLinkingNumber(linkingNumber, fields, tag) {
274
+ const relevantFields = fields.filter(f => (0, _subfield8Utils.fieldHasLinkingNumber)(f, linkingNumber));
275
+ if (relevantFields.some(f => f.tag !== tag)) {
276
+ return false;
277
+ }
278
+ return true;
279
+ }
280
+ function acceptFieldsWithSubfield8(fieldsWithSubfield8, requireSingleTag = false) {
281
+ const linkingNumbers = (0, _subfield8Utils.fieldsGetAllSubfield8LinkingNumbers)(fieldsWithSubfield8);
282
+ if (linkingNumbers.some(linkingNumber => anomaly8(linkingNumber))) {
283
+ return false;
284
+ }
285
+ return true;
286
+
287
+ // If linking number
288
+ function anomaly8(linkingNumber) {
289
+ (0, _utils.nvdebug)(` Looking for anomalies in linkin number ${linkingNumber}`);
290
+ const relevantFields = fieldsWithSubfield8.filter(f => (0, _subfield8Utils.fieldHasLinkingNumber)(f, linkingNumber));
291
+ if (requireSingleTag) {
292
+ return !isSingleTagLinkingNumber(linkingNumber, relevantFields, relevantFields[0].tag);
293
+ }
294
+ const f880 = relevantFields.filter(f => f.tag === '880');
295
+ if (f880.length === 0 || f880.length === relevantFields.length) {
296
+ return false;
297
+ }
298
+ return true;
299
+ }
300
+ }
301
+ function sameField(field1, field2) {
302
+ /* eslint-disable */
303
+ field1.tmpMyId = 666;
304
+ const result = field2.tmpMyId === 666 ? true : false;
305
+ delete field1.tmpMyId;
306
+ /* eslint-enable */
307
+ return result;
308
+ }
309
+ function isChainHead(field, chain) {
310
+ return sameField(field, chain[0]);
311
+ }
312
+ function fieldToChain(field, record) {
313
+ if (field.deleted || !field.subfields) {
314
+ return [];
315
+ }
316
+ const chain = newGetAllLinkedFields(field, record, true, true);
317
+ (0, _utils.nvdebug)(` Chain contains ${chain.length} field(s)`);
318
+ if (!isChainHead(field, chain)) {
319
+ // newGetAllLinkedFields() marks relevant record.fields!
320
+ return [];
321
+ }
322
+ const fieldsWithSubfield6 = chain.filter(f => (0, _subfield6Utils.fieldHasValidSubfield6)(f));
323
+ // Hack: multiple $6 fields, but either all are non-880 or all are 880: treat field as a single entry
324
+ if (fieldsWithSubfield6.length > 0) {
325
+ const non880 = fieldsWithSubfield6.filter(f => f.tag !== '880');
326
+ if (non880.length === 0 || non880.length === fieldsWithSubfield6.length) {
327
+ return [field];
328
+ }
329
+ if (non880.length !== 1) {
330
+ return [field];
331
+ }
332
+ }
333
+ if (!acceptFieldsWithSubfield6(fieldsWithSubfield6)) {
334
+ // Check tag subfield $6s are legal(ish)
335
+ return [];
336
+ }
337
+ const fieldsWithSubfield8 = chain.filter(f => (0, _subfield8Utils.fieldHasValidSubfield8)(f));
338
+ if (!acceptFieldsWithSubfield8(fieldsWithSubfield8, false)) {
339
+ return [];
340
+ }
341
+
342
+ //nvdebug(`Proceed with ${fieldsToString(chain)}`);
343
+
344
+ return chain;
345
+ }
346
+ function fieldHandleDuplicateDatafields(field, record) {
347
+ const chain = fieldToChain(field, record);
348
+ (0, _utils.nvdebug)(` TRY TO HANDLE DUPLICATES OF '${(0, _utils.fieldsToString)(chain)}'`);
349
+ if (chain.length === 0) {
350
+ return;
351
+ }
352
+ const fieldsWithSubfield6 = chain.filter(f => (0, _subfield6Utils.fieldHasValidSubfield6)(f));
353
+ const fieldsWithSubfield8 = chain.filter(f => (0, _subfield8Utils.fieldHasValidSubfield8)(f));
354
+
355
+ // Lone fields:
356
+ if (chain.length === 1) {
357
+ markIdenticalLoneFieldsAsDeletable(chain[0], record);
358
+ return;
359
+ }
360
+ if (fieldsWithSubfield6.length === 0) {
361
+ if (fieldsWithSubfield8.length === 0) {
362
+ // chain.length === 1?
363
+ (0, _utils.nvdebug)(` Trying to find duplicates of single field '${(0, _utils.fieldToString)(chain[0])}'`);
364
+ markIdenticalLoneFieldsAsDeletable(chain[0], record);
365
+ return;
366
+ }
367
+ const linkingNumbers = (0, _subfield8Utils.fieldsGetAllSubfield8LinkingNumbers)(fieldsWithSubfield8);
368
+ if (linkingNumbers.length < 2) {
369
+ markIdenticalSubfield6Chains(chain, record);
370
+ return;
371
+ }
372
+ }
373
+ if (fieldsWithSubfield6.length > 0 && acceptFieldsWithSubfield8(fieldsWithSubfield8, true)) {
374
+ // Checks that non-880 tags are all same
375
+ // Chain is removable
376
+ markIdenticalSubfield6Chains(chain, record);
377
+ return;
378
+ }
379
+ (0, _utils.nvdebug)(` NO HANDLER FOUND FOR '${(0, _utils.fieldsToString)(chain)}'`);
380
+ (0, _utils.nvdebug)(` N8s: ${fieldsWithSubfield6.length}`);
381
+ }
382
+ function removeDuplicateDatafields(record, fix = true) {
383
+ // Sometimes only $8 subfield (vs the whole field) is removed. Thus they are handled separately:
384
+ handleDuplicateSubfield8Chains(record, fix);
385
+ const dataFields = record.fields.filter(f => f.subfields !== undefined);
386
+ dataFields.forEach(f => fieldHandleDuplicateDatafields(f, record));
387
+ const deletableFields = dataFields.filter(f => f.deleted);
388
+ const modifiedFields = dataFields.filter(f => f.modified && !f.deleted);
389
+ const result = deletableFields.map(f => `DEL: ${(0, _utils.fieldToString)(f)}`);
390
+ if (modifiedFields.length) {
391
+ // eslint-disable-line functional/no-conditional-statements
392
+ modifiedFields.forEach(f => delete f.modified); // eslint-disable-line functional/immutable-data
393
+ result.push(modifiedFields.map(f => `MOD: ${(0, _utils.fieldToString)(f)}`)); // eslint-disable-line functional/immutable-data
394
+ }
395
+
396
+ if (fix) {
397
+ deletableFields.forEach(f => record.removeField(f));
398
+ return result;
399
+ }
400
+ deletableFields.forEach(f => delete f.deleted); // eslint-disable-line functional/immutable-data
401
+ deletableFields.forEach(f => delete f.modified); // eslint-disable-line functional/immutable-data
402
+
403
+ return result;
404
+ }
405
+ //# sourceMappingURL=removeDuplicateDataFields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"removeDuplicateDataFields.js","names":["_debug","_interopRequireDefault","require","_utils","_subfield6Utils","_subfield8Utils","obj","__esModule","default","LINK_ROOT","LINKED_AND_PROCESSED","LINKED_NOT_PROCESSED","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","removeDuplicateDatafields","duplicates","length","removeLinkNotes","fields","forEach","f","linkNote","newGetAllLinkedFields","field","useSixes","useEights","currField","undefined","related6s","get6s","linkField","related8s","add8s","find","linkedFields","filter","recordRemoveFieldOrSubfield8","currLinkingNumber","eights","subfields","sf","code","removeField","getSubfield8LinkingNumber","removeSubfield","newRecordRemoveFieldOrSubfield8","deleted","modified","removeDuplicateSubfield8Chains","seen","removables","seenLinkingNumbers","recordGetAllSubfield8LinkingNumbers","join","recordGetFieldsWithSubfield8LinkingNumber","normalizeOccurrenceNumber","linkedFieldsAsString","fieldsToNormalizedString","includes","push","fieldsToString","handleDuplicateSubfield8Chains","markIdenticalSubfield6Chains","chain","normalizeTag","some","tag","substring","chainAsString","compareWithChain","fieldToString","otherChain","fieldToChain","sameField","otherChainAsString","markIdenticalLoneFieldsAsDeletable","fieldAsString","fieldToNormalizedString","identicalLoneFields","acceptFieldsWithSubfield6","fieldsWithSubfield6","non880","occurrenceNumbers","fieldsGetOccurrenceNumbers","isSingleTagLinkingNumber","linkingNumber","relevantFields","fieldHasLinkingNumber","acceptFieldsWithSubfield8","fieldsWithSubfield8","requireSingleTag","linkingNumbers","fieldsGetAllSubfield8LinkingNumbers","anomaly8","f880","field1","field2","tmpMyId","result","isChainHead","fieldHasValidSubfield6","fieldHasValidSubfield8","fieldHandleDuplicateDatafields","dataFields","deletableFields","modifiedFields","map"],"sources":["../src/removeDuplicateDataFields.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldsToString, fieldToString, nvdebug} from './utils';\nimport {fieldHasValidSubfield6, fieldsGetOccurrenceNumbers, fieldsToNormalizedString, fieldToNormalizedString, get6s} from './subfield6Utils';\nimport {add8s, fieldHasLinkingNumber, fieldHasValidSubfield8, fieldsGetAllSubfield8LinkingNumbers, getSubfield8LinkingNumber, recordGetAllSubfield8LinkingNumbers, recordGetFieldsWithSubfield8LinkingNumber} from './subfield8Utils';\n\nconst LINK_ROOT = 4;\nconst LINKED_AND_PROCESSED = 2;\nconst LINKED_NOT_PROCESSED = 1;\n\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:removeDuplicateDataFields');\n\nexport default function () {\n return {\n description: 'Remove duplicate data fields. Certain exceptions apply, mainly too complited chained fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Remove duplicate data fields');\n const res = {message: [], fix: [], valid: true};\n removeDuplicateDatafields(record, true);\n // This can not really fail...\n return res;\n }\n\n function validate(record) {\n // Check max, and check number of different indexes\n nvdebug('Validate record: duplicate data fields cause (t)error', debug);\n\n const duplicates = removeDuplicateDatafields(record, false);\n\n //const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);\n\n const res = {message: duplicates};\n\n /*\n if (orphanedFields.length > 0) { // eslint-disable-line functional/no-conditional-statements\n res.message = [`${orphanedFields.length} orphaned occurrence number field(s) detected`]; // eslint-disable-line functional/immutable-data\n }\n */\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\n/*\nfunction numberOfLinkageSubfields(field) {\n nvdebug(`N of Linkage Subs(${fieldToString(field)})`);\n const subfields = field.subfields.filter(sf => sf.code === '6' || sf.code === '8');\n return subfields.length;\n}\n*/\n\nfunction removeLinkNotes(record) {\n record.fields.forEach(f => delete f.linkNote); // eslint-disable-line functional/immutable-data\n}\n\n\nfunction newGetAllLinkedFields(field, record, useSixes = true, useEights = true) {\n removeLinkNotes(record); // should be clear, but let's play safe\n\n /* eslint-disable */\n field.linkNote = LINK_ROOT;\n\n let currField = field;\n\n // Loop until all linked fields have been processed:\n while (currField !== undefined) {\n if (useSixes) {\n const related6s = get6s(currField, record.fields)\n related6s.forEach(f => linkField(f));\n }\n if (useEights) {\n const related8s = add8s([currField], record);\n related8s.forEach(f => linkField(f));\n }\n if (currField.linkNote !== LINK_ROOT) {\n currField.linkNote = LINKED_AND_PROCESSED;\n }\n currField = record.fields.find(f => f.linkNote === LINKED_NOT_PROCESSED);\n }\n\n // Collect relevant fields:\n const linkedFields = record.fields.filter(f => f.linkNote);\n\n removeLinkNotes(record);\n\n return linkedFields;\n\n function linkField(f) {\n if (!f.linkNote) {\n f.linkNote = LINKED_NOT_PROCESSED;\n }\n }\n\n\n /* eslint-enable */\n}\n\n\nfunction recordRemoveFieldOrSubfield8(record, field, currLinkingNumber) {\n const eights = field.subfields.filter(sf => sf.code === '8');\n if (eights.length < 2) {\n record.removeField(field);\n return;\n }\n const subfields = field.subfields.filter(sf => getSubfield8LinkingNumber(sf) === currLinkingNumber);\n subfields.forEach(sf => record.removeSubfield(sf, field));\n}\n\nfunction newRecordRemoveFieldOrSubfield8(record, field, currLinkingNumber, fix) {\n const eights = field.subfields.filter(sf => sf.code === '8');\n if (eights.length < 2) {\n field.deleted = 1; // eslint-disable-line functional/immutable-data\n return;\n }\n const subfields = field.subfields.filter(sf => getSubfield8LinkingNumber(sf) === currLinkingNumber);\n subfields.forEach(sf => {\n field.modified = 1; // eslint-disable-line functional/immutable-data\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n record.removeSubfield(sf, field);\n }\n });\n}\n\n\nexport function removeDuplicateSubfield8Chains(record, fix = true) {\n\n // Seen $8 subsfields in various fields:\n // 161 700\n // 17 710\n // 11 110\n // 8 730\n // 1 100\n // Given these stats, there's no need to check for 1XX-vs-7XX removals\n\n /* eslint-disable */\n let seen = {};\n\n let removables = []; // for validation\n\n nvdebug(\"CHAIN-8\");\n const seenLinkingNumbers = recordGetAllSubfield8LinkingNumbers(record);\n if (seenLinkingNumbers.length === 0) {\n return removables;\n }\n\n nvdebug(`seen linking numbers ($8): ${seenLinkingNumbers.join(', ')}`, debug);\n\n seenLinkingNumbers.forEach(currLinkingNumber => {\n const linkedFields = recordGetFieldsWithSubfield8LinkingNumber(record, currLinkingNumber) //getFieldsWithSubfield8Index(base, baseIndex);\n // As/If there's just one occurrence number it should be fine to use normalizeOccurrenceNumber = true\n const normalizeOccurrenceNumber = true;\n const linkedFieldsAsString = fieldsToNormalizedString(linkedFields, currLinkingNumber, normalizeOccurrenceNumber, true);\n nvdebug(`Results for LINKING NUMBER ${currLinkingNumber}:`, debug);\n nvdebug(`${linkedFieldsAsString}`, debug);\n\n if (linkedFieldsAsString in seen) {\n if (!removables.includes(linkedFieldsAsString)) {\n removables.push(linkedFieldsAsString);\n }\n\n if (fix) {\n nvdebug(`$8 CHAIN FIX: REMOVE $8 GROUP: ${fieldsToString(linkedFields)}`, debug);\n linkedFields.forEach(field => recordRemoveFieldOrSubfield8(record, field, currLinkingNumber));\n return;\n }\n\n nvdebug(`$8 VALIDATION: DUPLICATE DETECTED ${linkedFieldsAsString}`, debug);\n return;\n }\n nvdebug(`$8 DOUBLE REMOVAL OR VALIDATION: ADD2SEEN ${linkedFieldsAsString}`, debug);\n seen[linkedFieldsAsString] = 1;\n return;\n });\n\n /* eslint-enable */\n return removables;\n}\n\n\nexport function handleDuplicateSubfield8Chains(record, fix) {\n\n // Seen $8 subsfields in various fields:\n // 161 700\n // 17 710\n // 11 110\n // 8 730\n // 1 100\n // Given these stats, there's no need to check for 1XX-vs-7XX removals\n\n /* eslint-disable */\n let seen = {};\n\n nvdebug(\"CHAIN-8\");\n const seenLinkingNumbers = recordGetAllSubfield8LinkingNumbers(record);\n if (seenLinkingNumbers.length === 0) {\n return;\n }\n\n nvdebug(`seen linking numbers ($8): ${seenLinkingNumbers.join(', ')}`, debug);\n\n seenLinkingNumbers.forEach(currLinkingNumber => {\n const linkedFields = recordGetFieldsWithSubfield8LinkingNumber(record, currLinkingNumber) //getFieldsWithSubfield8Index(base, baseIndex);\n // As/If there's just one occurrence number it should be fine to use normalizeOccurrenceNumber = true\n const normalizeOccurrenceNumber = false; //true;\n const linkedFieldsAsString = fieldsToNormalizedString(linkedFields, currLinkingNumber, normalizeOccurrenceNumber, true);\n nvdebug(`Results for LINKING NUMBER ${currLinkingNumber}:`, debug);\n nvdebug(`${linkedFieldsAsString}`, debug);\n\n if (linkedFieldsAsString in seen) {\n nvdebug(`$8 CHAIN FIX: REMOVE $8 GROUP: ${fieldsToString(linkedFields)}`, debug);\n linkedFields.forEach(field => newRecordRemoveFieldOrSubfield8(record, field, currLinkingNumber, fix));\n return;\n }\n nvdebug(`$8 DOUBLE REMOVAL OR VALIDATION: ADD2SEEN ${linkedFieldsAsString}`, debug);\n seen[linkedFieldsAsString] = 1;\n return;\n });\n\n /* eslint-enable */\n\n}\n\nfunction markIdenticalSubfield6Chains(chain, record) {\n const normalizeOccurrenceNumber = true;\n const normalizeTag = chain.some(field => field.tag.substring(0, 1) === '1'); // 1XX can delete 7XX as well!\n const chainAsString = fieldsToNormalizedString(chain, 0, normalizeOccurrenceNumber, normalizeTag);\n\n nvdebug(`markIdenticalSubfield6Chains: ${chainAsString}`);\n record.fields.forEach(f => compareWithChain(f));\n\n\n function compareWithChain(f) {\n nvdebug(`FIELD2CHAIN ${fieldToString(f)}`);\n const otherChain = fieldToChain(f, record);\n // Not a lone field or chain (head) or ... or is-same-chain\n if (otherChain.length === 0 || sameField(chain[0], otherChain[0])) {\n return;\n }\n const otherChainAsString = fieldsToNormalizedString(otherChain, 0, normalizeOccurrenceNumber, normalizeTag);\n\n // Mark other chain as deleted:\n if (chainAsString === otherChainAsString) {\n otherChain.forEach(f => {\n nvdebug(` mark ${fieldToString(f)} as deleted ($6-chain)...`);\n f.deleted = 1; // eslint-disable-line functional/immutable-data\n });\n return;\n }\n }\n\n}\n\nfunction markIdenticalLoneFieldsAsDeletable(field, record) {\n if (field.deleted) {\n return;\n }\n // targetLinkingNumber = 0, normalizedOccurenceNumber = false, normalizeTag = true)\n const normalizeTag = field.tag.substring(0, 1) === '1'; // 1XX can delete 7XX as well!\n const fieldAsString = fieldToNormalizedString(field, 0, false, normalizeTag);\n\n const identicalLoneFields = record.fields.filter(f => !sameField(f, field) && fieldToNormalizedString(f, 0, false, normalizeTag) === fieldAsString);\n\n // Mark fields as deleted:\n identicalLoneFields.forEach(f => {\n nvdebug(` mark ${fieldToString(f)} as deleted (lone field)...`);\n f.deleted = 1; // eslint-disable-line functional/immutable-data\n });\n\n}\n\nfunction acceptFieldsWithSubfield6(fieldsWithSubfield6) {\n // There can be only one non-880 field:\n const non880 = fieldsWithSubfield6.filter(f => f.tag !== '880');\n if (non880.length > 1) {\n return false;\n }\n\n const occurrenceNumbers = fieldsGetOccurrenceNumbers(fieldsWithSubfield6);\n // Chain can contain only single occurrence number:\n if (occurrenceNumbers.length > 1) {\n return false;\n }\n\n return true;\n}\n\n\nfunction isSingleTagLinkingNumber(linkingNumber, fields, tag) {\n const relevantFields = fields.filter(f => fieldHasLinkingNumber(f, linkingNumber));\n if (relevantFields.some(f => f.tag !== tag)) {\n return false;\n }\n return true;\n}\n\nfunction acceptFieldsWithSubfield8(fieldsWithSubfield8, requireSingleTag = false) {\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fieldsWithSubfield8);\n if (linkingNumbers.some(linkingNumber => anomaly8(linkingNumber))) {\n return false;\n }\n return true;\n\n // If linking number\n function anomaly8(linkingNumber) {\n nvdebug(` Looking for anomalies in linkin number ${linkingNumber}`);\n const relevantFields = fieldsWithSubfield8.filter(f => fieldHasLinkingNumber(f, linkingNumber));\n if (requireSingleTag) {\n return !isSingleTagLinkingNumber(linkingNumber, relevantFields, relevantFields[0].tag);\n }\n\n const f880 = relevantFields.filter(f => f.tag === '880');\n if (f880.length === 0 || f880.length === relevantFields.length) {\n return false;\n }\n return true;\n }\n}\n\n\nexport function sameField(field1, field2) {\n /* eslint-disable */\n field1.tmpMyId = 666;\n const result = field2.tmpMyId === 666 ? true : false;\n delete field1.tmpMyId;\n /* eslint-enable */\n return result;\n}\n\nexport function isChainHead(field, chain) {\n return sameField(field, chain[0]);\n}\n\nexport function fieldToChain(field, record) {\n if (field.deleted || !field.subfields) {\n return [];\n }\n const chain = newGetAllLinkedFields(field, record, true, true);\n\n nvdebug(` Chain contains ${chain.length} field(s)`);\n if (!isChainHead(field, chain)) { // newGetAllLinkedFields() marks relevant record.fields!\n return [];\n }\n\n const fieldsWithSubfield6 = chain.filter(f => fieldHasValidSubfield6(f));\n // Hack: multiple $6 fields, but either all are non-880 or all are 880: treat field as a single entry\n if (fieldsWithSubfield6.length > 0) {\n const non880 = fieldsWithSubfield6.filter(f => f.tag !== '880');\n if (non880.length === 0 || non880.length === fieldsWithSubfield6.length) {\n return [field];\n }\n if (non880.length !== 1) {\n return [field];\n }\n }\n\n if (!acceptFieldsWithSubfield6(fieldsWithSubfield6)) { // Check tag subfield $6s are legal(ish)\n return [];\n }\n const fieldsWithSubfield8 = chain.filter(f => fieldHasValidSubfield8(f));\n if (!acceptFieldsWithSubfield8(fieldsWithSubfield8, false)) {\n return [];\n }\n\n //nvdebug(`Proceed with ${fieldsToString(chain)}`);\n\n\n return chain;\n}\n\n\nfunction fieldHandleDuplicateDatafields(field, record) {\n const chain = fieldToChain(field, record);\n nvdebug(` TRY TO HANDLE DUPLICATES OF '${fieldsToString(chain)}'`);\n\n if (chain.length === 0) {\n return;\n }\n\n const fieldsWithSubfield6 = chain.filter(f => fieldHasValidSubfield6(f));\n const fieldsWithSubfield8 = chain.filter(f => fieldHasValidSubfield8(f));\n\n // Lone fields:\n if (chain.length === 1) {\n markIdenticalLoneFieldsAsDeletable(chain[0], record);\n return;\n }\n if (fieldsWithSubfield6.length === 0) {\n\n if (fieldsWithSubfield8.length === 0) { // chain.length === 1?\n nvdebug(` Trying to find duplicates of single field '${fieldToString(chain[0])}'`);\n markIdenticalLoneFieldsAsDeletable(chain[0], record);\n return;\n }\n const linkingNumbers = fieldsGetAllSubfield8LinkingNumbers(fieldsWithSubfield8);\n if (linkingNumbers.length < 2) {\n markIdenticalSubfield6Chains(chain, record);\n return;\n }\n }\n\n if (fieldsWithSubfield6.length > 0 && acceptFieldsWithSubfield8(fieldsWithSubfield8, true)) { // Checks that non-880 tags are all same\n // Chain is removable\n markIdenticalSubfield6Chains(chain, record);\n return;\n }\n\n\n nvdebug(` NO HANDLER FOUND FOR '${fieldsToString(chain)}'`);\n nvdebug(` N8s: ${fieldsWithSubfield6.length}`);\n\n}\n\n\nexport function removeDuplicateDatafields(record, fix = true) {\n // Sometimes only $8 subfield (vs the whole field) is removed. Thus they are handled separately:\n handleDuplicateSubfield8Chains(record, fix);\n\n const dataFields = record.fields.filter(f => f.subfields !== undefined);\n\n dataFields.forEach(f => fieldHandleDuplicateDatafields(f, record));\n\n const deletableFields = dataFields.filter(f => f.deleted);\n const modifiedFields = dataFields.filter(f => f.modified && !f.deleted);\n\n const result = deletableFields.map(f => `DEL: ${fieldToString(f)}`);\n if (modifiedFields.length) { // eslint-disable-line functional/no-conditional-statements\n modifiedFields.forEach(f => delete f.modified); // eslint-disable-line functional/immutable-data\n result.push(modifiedFields.map(f => `MOD: ${fieldToString(f)}`)); // eslint-disable-line functional/immutable-data\n }\n\n if (fix) {\n deletableFields.forEach(f => record.removeField(f));\n return result;\n }\n\n deletableFields.forEach(f => delete f.deleted); // eslint-disable-line functional/immutable-data\n deletableFields.forEach(f => delete f.modified); // eslint-disable-line functional/immutable-data\n\n\n return result;\n}\n"],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ var _chai = require("chai");
4
+ var _marcRecord = require("@natlibfi/marc-record");
5
+ var _removeDuplicateDataFields = _interopRequireDefault(require("./removeDuplicateDataFields"));
6
+ var _fixura = require("@natlibfi/fixura");
7
+ var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
8
+ var _debug = _interopRequireDefault(require("debug"));
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ (0, _fixugen.default)({
11
+ callback,
12
+ path: [__dirname, '..', 'test-fixtures', 'remove-duplicate-datafields'],
13
+ useMetadataFile: true,
14
+ recurse: false,
15
+ fixura: {
16
+ reader: _fixura.READERS.JSON
17
+ },
18
+ mocha: {
19
+ before: () => testValidatorFactory()
20
+ }
21
+ });
22
+ const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda/removeDuplicateDataFields:test');
23
+ async function testValidatorFactory() {
24
+ const validator = await (0, _removeDuplicateDataFields.default)();
25
+ (0, _chai.expect)(validator).to.be.an('object').that.has.any.keys('description', 'validate');
26
+ (0, _chai.expect)(validator.description).to.be.a('string');
27
+ (0, _chai.expect)(validator.validate).to.be.a('function');
28
+ }
29
+ async function callback({
30
+ getFixture,
31
+ enabled = true,
32
+ fix = false
33
+ }) {
34
+ if (enabled === false) {
35
+ debug('TEST SKIPPED!');
36
+ return;
37
+ }
38
+ const validator = await (0, _removeDuplicateDataFields.default)();
39
+ const record = new _marcRecord.MarcRecord(getFixture('record.json'));
40
+ const expectedResult = getFixture('expectedResult.json');
41
+ // console.log(expectedResult); // eslint-disable-line
42
+
43
+ if (!fix) {
44
+ const result = await validator.validate(record);
45
+ (0, _chai.expect)(result).to.eql(expectedResult);
46
+ return;
47
+ }
48
+ await validator.fix(record);
49
+ (0, _chai.expect)(record).to.eql(expectedResult);
50
+ }
51
+ //# sourceMappingURL=removeDuplicateDataFields.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"removeDuplicateDataFields.spec.js","names":["_chai","require","_marcRecord","_removeDuplicateDataFields","_interopRequireDefault","_fixura","_fixugen","_debug","obj","__esModule","default","generateTests","callback","path","__dirname","useMetadataFile","recurse","fixura","reader","READERS","JSON","mocha","before","testValidatorFactory","debug","createDebugLogger","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","getFixture","enabled","fix","record","MarcRecord","expectedResult","result","eql"],"sources":["../src/removeDuplicateDataFields.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './removeDuplicateDataFields';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'remove-duplicate-datafields'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/removeDuplicateDataFields:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory();\n\n expect(validator)\n .to.be.an('object')\n .that.has.any.keys('description', 'validate');\n\n expect(validator.description).to.be.a('string');\n expect(validator.validate).to.be.a('function');\n}\n\nasync function callback({getFixture, enabled = true, fix = false}) {\n if (enabled === false) {\n debug('TEST SKIPPED!');\n return;\n }\n\n const validator = await validatorFactory();\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n // console.log(expectedResult); // eslint-disable-line\n\n if (!fix) {\n const result = await validator.validate(record);\n expect(result).to.eql(expectedResult);\n return;\n }\n\n await validator.fix(record);\n expect(record).to.eql(expectedResult);\n}\n"],"mappings":";;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,0BAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAF,sBAAA,CAAAH,OAAA;AACA,IAAAM,MAAA,GAAAH,sBAAA,CAAAH,OAAA;AAAsC,SAAAG,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEtC,IAAAG,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,6BAA6B,CAAC;EACvEC,eAAe,EAAE,IAAI;EACrBC,OAAO,EAAE,KAAK;EACdC,MAAM,EAAE;IACNC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAEA,CAAA,KAAMC,oBAAoB,CAAC;EACrC;AACF,CAAC,CAAC;AACF,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,yEAAyE,CAAC;AAE1G,eAAeF,oBAAoBA,CAAA,EAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,kCAAgB,EAAC,CAAC;EAE1C,IAAAC,YAAM,EAACF,SAAS,CAAC,CACdG,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,QAAQ,CAAC,CAClBC,IAAI,CAACC,GAAG,CAACC,GAAG,CAACC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;EAE/C,IAAAP,YAAM,EAACF,SAAS,CAACU,WAAW,CAAC,CAACP,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,QAAQ,CAAC;EAC/C,IAAAT,YAAM,EAACF,SAAS,CAACY,QAAQ,CAAC,CAACT,EAAE,CAACC,EAAE,CAACO,CAAC,CAAC,UAAU,CAAC;AAChD;AAEA,eAAezB,QAAQA,CAAC;EAAC2B,UAAU;EAAEC,OAAO,GAAG,IAAI;EAAEC,GAAG,GAAG;AAAK,CAAC,EAAE;EACjE,IAAID,OAAO,KAAK,KAAK,EAAE;IACrBhB,KAAK,CAAC,eAAe,CAAC;IACtB;EACF;EAEA,MAAME,SAAS,GAAG,MAAM,IAAAC,kCAAgB,EAAC,CAAC;EAC1C,MAAMe,MAAM,GAAG,IAAIC,sBAAU,CAACJ,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMK,cAAc,GAAGL,UAAU,CAAC,qBAAqB,CAAC;EACxD;;EAEA,IAAI,CAACE,GAAG,EAAE;IACR,MAAMI,MAAM,GAAG,MAAMnB,SAAS,CAACY,QAAQ,CAACI,MAAM,CAAC;IAC/C,IAAAd,YAAM,EAACiB,MAAM,CAAC,CAAChB,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;IACrC;EACF;EAEA,MAAMlB,SAAS,CAACe,GAAG,CAACC,MAAM,CAAC;EAC3B,IAAAd,YAAM,EAACc,MAAM,CAAC,CAACb,EAAE,CAACiB,GAAG,CAACF,cAAc,CAAC;AACvC"}