@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,245 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = _default;
7
+ exports.removeIndividualInferiorDatafields = removeIndividualInferiorDatafields;
8
+ exports.removeInferiorChains = removeInferiorChains;
9
+ exports.removeInferiorDatafields = removeInferiorDatafields;
10
+ var _debug = _interopRequireDefault(require("debug"));
11
+ var _removeDuplicateDataFields = require("./removeDuplicateDataFields");
12
+ var _subfield6Utils = require("./subfield6Utils");
13
+ var _utils = require("./utils");
14
+ var _subfield8Utils = require("./subfield8Utils");
15
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
+ // Relocated from melinda-marc-record-merge-reducers (and renamed)
17
+
18
+ // NB! This validator handles only full fields, and does not support subfield $8 removal.
19
+ // Also, having multiple $8 subfields in same fields is not supported.
20
+ // If this functionality is needed, see removeDuplicateDatafields.js for examples of subfield-only stuff.
21
+ const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda:removeSubsetDataFields');
22
+ function _default() {
23
+ return {
24
+ description: 'Remove subset data fields. Certain exceptions apply, mainly too complited chained fields',
25
+ validate,
26
+ fix
27
+ };
28
+ function fix(record) {
29
+ (0, _utils.nvdebug)('Fix record: remove subset data fields', debug);
30
+ const res = {
31
+ message: [],
32
+ fix: [],
33
+ valid: true
34
+ };
35
+ removeInferiorDatafields(record, true);
36
+ // This can not really fail...
37
+ return res;
38
+ }
39
+ function validate(record) {
40
+ // Check max, and check number of different indexes
41
+ (0, _utils.nvdebug)('Validate record: remove subset data fields', debug);
42
+ const duplicates = removeInferiorDatafields(record, false);
43
+ const res = {
44
+ message: duplicates
45
+ };
46
+ res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data
47
+ return res;
48
+ }
49
+ }
50
+ function deriveInferiorChains(fields, record) {
51
+ /* eslint-disable */
52
+ let deletableStringsObject = {};
53
+ (0, _utils.nvdebug)(`WP1: GOT ${fields.length} field(s) for potential deletable chain derivation`);
54
+ fields.forEach(field => fieldDeriveChainDeletables(field));
55
+ function fieldDeriveChainDeletables(field) {
56
+ const chain = (0, _removeDuplicateDataFields.fieldToChain)(field, record);
57
+ if (chain.length === 0) {
58
+ return;
59
+ }
60
+ const chainAsString = (0, _subfield6Utils.fieldsToNormalizedString)(chain, 0, true, true);
61
+
62
+ //nvdebug(`666: ${chainAsString}`);
63
+
64
+ // Fix MRA-476 (part 1): one $6 value can be worse than the other
65
+ let tmp = chainAsString;
66
+ while (tmp.match(/ ‡6 [0-9X][0-9][0-9]-(?:XX|[0-9]+)\/[^ ]+/u)) {
67
+ tmp = tmp.replace(/( ‡6 [0-9X][0-9][0-9]-(?:XX|[0-9]+))\/[^ ]+/u, '$1');
68
+ //nvdebug(`FFS: ${tmp}`);
69
+ deletableStringsObject[tmp] = field;
70
+ }
71
+
72
+ // Remove keepless versions:
73
+ tmp = chainAsString;
74
+ while (tmp.match(/ ‡9 [A-Z]+<KEEP>/)) {
75
+ tmp = tmp.replace(/ ‡9 [A-Z]+<KEEP>/, '');
76
+ deletableStringsObject[tmp] = field;
77
+ //nvdebug(`FFS: ${tmp}`);
78
+ }
79
+ }
80
+
81
+ /* eslint-enable */
82
+ return deletableStringsObject;
83
+ }
84
+ function isRelevantChain6(field, record) {
85
+ //Can't be a chain:
86
+ if (!(0, _subfield6Utils.fieldHasValidSubfield6)(field) && !(0, _subfield8Utils.fieldHasValidSubfield8)(field)) {
87
+ return false;
88
+ }
89
+ // Too short to be a chain:
90
+ const chain = (0, _removeDuplicateDataFields.fieldToChain)(field, record);
91
+ if (chain.length < 2) {
92
+ return false;
93
+ }
94
+ // No field can contains no more than one subfield $6
95
+ if (chain.some(f => f.subfields.filter(sf => sf.code === '6').length > 1)) {
96
+ return false;
97
+ }
98
+
99
+ // Chainwise non-initial fields are not relevant as chains is handled through the initial/head field
100
+ /* eslint-disable */
101
+ field.tmpInferiorId = 666;
102
+ const result = chain[0].tmpInferiorId === 666 ? true : false;
103
+ delete field.tmpInferiorId;
104
+ /* eslint-enable */
105
+ return result;
106
+ }
107
+ function removeInferiorChains(record, fix = true) {
108
+ const fields = record.fields.filter(f => isRelevantChain6(f, record));
109
+ //nvdebug(`WP2.0: GOT ${fields.length} chain(s)`);
110
+
111
+ const deletableChainsAsKeys = deriveInferiorChains(fields, record);
112
+ const nChains = Object.keys(deletableChainsAsKeys).length;
113
+ //nvdebug(`WP2: GOT ${nChains} chain(s)`);
114
+ if (nChains === 0) {
115
+ return [];
116
+ }
117
+ (0, _utils.nvdebug)(`removeInferiorChains() has ${fields.length} fields-in-chain(s), and a list of ${nChains} deletable(s)`);
118
+
119
+ /* eslint-disable */
120
+
121
+ let deletedStringsArray = [];
122
+ fields.forEach(f => innerRemoveInferiorChain(f));
123
+ function chainContains1XX(chain) {
124
+ return chain.some(f => f.tag.substring(0, 1) === '1');
125
+ }
126
+ function sevenToOne(field, chain) {
127
+ if (!['700', '710', '711', '730'].includes(field.tag)) {
128
+ return;
129
+ }
130
+ // Retag field 7XX as 1XX and fix corresponding occurrence numbers as well:
131
+ const pairs = (0, _subfield6Utils.fieldGetOccurrenceNumberPairs)(field, chain);
132
+ field.tag = `1${field.tag.substring(1)}`; // eslint-disable-line functional/immutable-data
133
+ // There should always be one pair, but I'm not sanity-checking this
134
+ pairs.forEach(pairedField => (0, _subfield6Utils.fieldSevenToOneOccurrenceNumber)(pairedField));
135
+ }
136
+ function innerRemoveInferiorChain(field) {
137
+ const chain = (0, _removeDuplicateDataFields.fieldToChain)(field, record);
138
+ if (chain.length === 0 || !(0, _removeDuplicateDataFields.sameField)(field, chain[0])) {
139
+ return;
140
+ }
141
+
142
+ // Better to keep inferior 1XX (vs better 7XX) than to delete 1XX!
143
+ if (chain.some(f => f.tag.substring(0, 1) === '1')) {
144
+ return;
145
+ }
146
+ const chainAsString = (0, _subfield6Utils.fieldsToNormalizedString)(chain, 0, true, true);
147
+ if (chainAsString in deletableChainsAsKeys) {
148
+ const triggeringField = deletableChainsAsKeys[chainAsString];
149
+ const triggeringChain = (0, _removeDuplicateDataFields.fieldToChain)(triggeringField, record);
150
+
151
+ // 1XX may be converted to XXX. However, it should not be removed.
152
+ // Better to keep inferior 1XX (vs better 7XX) than to delete 1XX!
153
+ if (chainContains1XX(chain)) {
154
+ if (chainContains1XX(triggeringChain)) {
155
+ // This should *never* happen, but keep this as a sanity check
156
+ return;
157
+ }
158
+ triggeringChain.forEach(f => sevenToOne(f, triggeringChain));
159
+ }
160
+ (0, _utils.nvdebug)(`iRIS6C: ${chainAsString}`);
161
+ const deletedString = (0, _utils.fieldsToString)(chain);
162
+ const message = `DEL: '${deletedString}' REASON: '${(0, _utils.fieldsToString)(triggeringChain)}'`;
163
+ deletedStringsArray.push(message);
164
+ if (fix) {
165
+ (0, _utils.nvdebug)(`INFERIOR $6 CHAIN REMOVAL: ${message}}`, debug);
166
+ chain.forEach(currField => record.removeField(currField));
167
+ }
168
+ }
169
+ }
170
+
171
+ /* eslint-enable */
172
+ return deletedStringsArray;
173
+ }
174
+ function deriveIndividualDeletables(record) {
175
+ /* eslint-disable */
176
+ let deletableStringsArray = [];
177
+ record.fields.forEach(field => fieldDeriveIndividualDeletables(field));
178
+ function fieldDeriveIndividualDeletables(field) {
179
+ const fieldAsString = (0, _utils.fieldToString)(field);
180
+
181
+ // Proof-of-concept rule:
182
+ let tmp = fieldAsString;
183
+ if (field.tag.match(/^[1678]00$/u)) {
184
+ while (tmp.match(/, ‡e [^‡]+\.$/)) {
185
+ tmp = tmp.replace(/, ‡e [^‡]+\.$/, '.');
186
+ deletableStringsArray.push(tmp);
187
+ }
188
+ }
189
+ // MET-381: remove occurence number TAG-00, if TAG-NN existists
190
+ if (field.tag === '880') {
191
+ tmp = fieldAsString;
192
+ if (tmp.match(/ ‡6 [0-9][0-9][0-9]-([?:1-9][0-9]|0[1-9])/)) {
193
+ tmp = tmp.replace(/( ‡6 [0-9][0-9][0-9])-[0-9]+/, '$1-00');
194
+ (0, _utils.nvdebug)(`MET-381: ADD TO DELETABLES: ${tmp}`);
195
+ deletableStringsArray.push(tmp);
196
+ if (tmp.match(/ ‡6 [0-9][0-9][0-9]-00\/[^ ]+ /)) {
197
+ tmp = tmp.replace(/( ‡6 [0-9][0-9][0-9]-00)[^ ]+/, '$1');
198
+ (0, _utils.nvdebug)(`MET-381: ADD TO DELETABLES: ${tmp}`);
199
+ deletableStringsArray.push(tmp);
200
+ }
201
+ }
202
+ }
203
+
204
+ // Remove keepless versions:
205
+ tmp = fieldAsString;
206
+ while (tmp.match(/ ‡9 [A-Z]+<KEEP>/)) {
207
+ tmp = tmp.replace(/ ‡9 [A-Z]+<KEEP>/, '');
208
+ deletableStringsArray.push(tmp);
209
+ }
210
+ }
211
+ /* eslint-enable */
212
+ return deletableStringsArray; // we should do uniq!
213
+ }
214
+
215
+ function removeIndividualInferiorDatafields(record, fix = true) {
216
+ // No $6 nor $8 in field
217
+ const deletableFieldsAsStrings = deriveIndividualDeletables(record);
218
+ const hits = record.fields.filter(field => isDeletableField(field));
219
+ const deletedFieldsAsStrings = hits.map(f => (0, _utils.fieldToString)(f));
220
+ if (fix) {
221
+ // eslint-disable-line functional/no-conditional-statements
222
+ hits.forEach(field => {
223
+ (0, _utils.nvdebug)(`Remove inferior field: ${(0, _utils.fieldToString)(field)}`);
224
+ record.removeField(field);
225
+ });
226
+ }
227
+ return deletedFieldsAsStrings;
228
+ function isDeletableField(field) {
229
+ const fieldAsString = (0, _utils.fieldToString)(field);
230
+ return deletableFieldsAsStrings.includes(fieldAsString);
231
+ }
232
+ }
233
+ function removeInferiorDatafields(record, fix = true) {
234
+ const removables = removeIndividualInferiorDatafields(record, fix); // Lone fields
235
+ //const removables8 = removeDuplicateSubfield8Chains(record, fix); // Lone subfield $8 chains
236
+ const removables6 = removeInferiorChains(record, fix); // Lone subfield $6 chains
237
+ // HOW TO HANDLE $6+$8 combos?
238
+
239
+ (0, _utils.nvdebug)(`REMOVABLES:\n ${removables.join('\n ')}`);
240
+ (0, _utils.nvdebug)(`REMOVABLES 6:\n ${removables6.join('\n ')}`);
241
+ const removablesAll = removables.concat(removables6); //.concat(removables8);
242
+
243
+ return removablesAll;
244
+ }
245
+ //# sourceMappingURL=removeInferiorDataFields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"removeInferiorDataFields.js","names":["_debug","_interopRequireDefault","require","_removeDuplicateDataFields","_subfield6Utils","_utils","_subfield8Utils","obj","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","removeInferiorDatafields","duplicates","length","deriveInferiorChains","fields","deletableStringsObject","forEach","field","fieldDeriveChainDeletables","chain","fieldToChain","chainAsString","fieldsToNormalizedString","tmp","match","replace","isRelevantChain6","fieldHasValidSubfield6","fieldHasValidSubfield8","some","f","subfields","filter","sf","code","tmpInferiorId","result","removeInferiorChains","deletableChainsAsKeys","nChains","Object","keys","deletedStringsArray","innerRemoveInferiorChain","chainContains1XX","tag","substring","sevenToOne","includes","pairs","fieldGetOccurrenceNumberPairs","pairedField","fieldSevenToOneOccurrenceNumber","sameField","triggeringField","triggeringChain","deletedString","fieldsToString","push","currField","removeField","deriveIndividualDeletables","deletableStringsArray","fieldDeriveIndividualDeletables","fieldAsString","fieldToString","removeIndividualInferiorDatafields","deletableFieldsAsStrings","hits","isDeletableField","deletedFieldsAsStrings","map","removables","removables6","join","removablesAll","concat"],"sources":["../src/removeInferiorDataFields.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldToChain, sameField} from './removeDuplicateDataFields';\nimport {fieldGetOccurrenceNumberPairs, fieldHasValidSubfield6, fieldSevenToOneOccurrenceNumber, fieldsToNormalizedString} from './subfield6Utils';\nimport {fieldsToString, fieldToString, nvdebug} from './utils';\nimport {fieldHasValidSubfield8} from './subfield8Utils';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\n// NB! This validator handles only full fields, and does not support subfield $8 removal.\n// Also, having multiple $8 subfields in same fields is not supported.\n// If this functionality is needed, see removeDuplicateDatafields.js for examples of subfield-only stuff.\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:removeSubsetDataFields');\n\nexport default function () {\n return {\n description: 'Remove subset data fields. Certain exceptions apply, mainly too complited chained fields',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix record: remove subset data fields', debug);\n const res = {message: [], fix: [], valid: true};\n removeInferiorDatafields(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: remove subset data fields', debug);\n\n const duplicates = removeInferiorDatafields(record, false);\n\n const res = {message: duplicates};\n\n res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\nfunction deriveInferiorChains(fields, record) {\n /* eslint-disable */\n let deletableStringsObject = {};\n\n nvdebug(`WP1: GOT ${fields.length} field(s) for potential deletable chain derivation`);\n fields.forEach(field => fieldDeriveChainDeletables(field));\n\n function fieldDeriveChainDeletables(field) {\n const chain = fieldToChain(field, record);\n if (chain.length === 0) {\n return;\n }\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n\n //nvdebug(`666: ${chainAsString}`);\n\n // Fix MRA-476 (part 1): one $6 value can be worse than the other\n let tmp = chainAsString;\n while (tmp.match(/ ‡6 [0-9X][0-9][0-9]-(?:XX|[0-9]+)\\/[^ ]+/u)) {\n tmp = tmp.replace(/( ‡6 [0-9X][0-9][0-9]-(?:XX|[0-9]+))\\/[^ ]+/u, '$1');\n //nvdebug(`FFS: ${tmp}`);\n deletableStringsObject[tmp] = field;\n }\n\n // Remove keepless versions:\n tmp = chainAsString;\n while (tmp.match(/ ‡9 [A-Z]+<KEEP>/)) {\n tmp = tmp.replace(/ ‡9 [A-Z]+<KEEP>/, '');\n deletableStringsObject[tmp] = field;\n //nvdebug(`FFS: ${tmp}`);\n }\n }\n\n\n /* eslint-enable */\n return deletableStringsObject;\n}\n\nfunction isRelevantChain6(field, record) {\n //Can't be a chain:\n if (!fieldHasValidSubfield6(field) && !fieldHasValidSubfield8(field)) {\n return false;\n }\n // Too short to be a chain:\n const chain = fieldToChain(field, record);\n if (chain.length < 2) {\n return false;\n }\n // No field can contains no more than one subfield $6\n if (chain.some(f => f.subfields.filter(sf => sf.code === '6').length > 1)) {\n return false;\n }\n\n // Chainwise non-initial fields are not relevant as chains is handled through the initial/head field\n /* eslint-disable */\n field.tmpInferiorId = 666;\n const result = chain[0].tmpInferiorId === 666 ? true : false;\n delete field.tmpInferiorId;\n /* eslint-enable */\n return result;\n}\n\nexport function removeInferiorChains(record, fix = true) {\n const fields = record.fields.filter(f => isRelevantChain6(f, record));\n //nvdebug(`WP2.0: GOT ${fields.length} chain(s)`);\n\n const deletableChainsAsKeys = deriveInferiorChains(fields, record);\n const nChains = Object.keys(deletableChainsAsKeys).length;\n //nvdebug(`WP2: GOT ${nChains} chain(s)`);\n if (nChains === 0) {\n return [];\n }\n\n nvdebug(`removeInferiorChains() has ${fields.length} fields-in-chain(s), and a list of ${nChains} deletable(s)`);\n\n\n /* eslint-disable */\n\n let deletedStringsArray = [];\n fields.forEach(f => innerRemoveInferiorChain(f));\n\n function chainContains1XX(chain) {\n return chain.some(f => f.tag.substring(0, 1) === '1');\n }\n\n function sevenToOne(field, chain) {\n if (!['700', '710', '711', '730'].includes(field.tag)) {\n return;\n }\n // Retag field 7XX as 1XX and fix corresponding occurrence numbers as well:\n const pairs = fieldGetOccurrenceNumberPairs(field, chain);\n field.tag = `1${field.tag.substring(1)}`; // eslint-disable-line functional/immutable-data\n // There should always be one pair, but I'm not sanity-checking this\n pairs.forEach(pairedField => fieldSevenToOneOccurrenceNumber(pairedField));\n }\n\n function innerRemoveInferiorChain(field) {\n const chain = fieldToChain(field, record);\n if (chain.length === 0 || !sameField(field, chain[0])) {\n return;\n }\n\n // Better to keep inferior 1XX (vs better 7XX) than to delete 1XX!\n if(chain.some(f => f.tag.substring(0, 1) === '1')) {\n return;\n }\n\n const chainAsString = fieldsToNormalizedString(chain, 0, true, true);\n if (chainAsString in deletableChainsAsKeys) {\n const triggeringField = deletableChainsAsKeys[chainAsString];\n const triggeringChain = fieldToChain(triggeringField, record);\n\n // 1XX may be converted to XXX. However, it should not be removed.\n // Better to keep inferior 1XX (vs better 7XX) than to delete 1XX!\n if(chainContains1XX(chain)) {\n if (chainContains1XX(triggeringChain)) {\n // This should *never* happen, but keep this as a sanity check\n return;\n }\n triggeringChain.forEach(f => sevenToOne(f, triggeringChain));\n }\n nvdebug(`iRIS6C: ${chainAsString}`);\n const deletedString = fieldsToString(chain);\n const message = `DEL: '${deletedString}' REASON: '${fieldsToString(triggeringChain)}'`;\n deletedStringsArray.push(message);\n if (fix) {\n nvdebug(`INFERIOR $6 CHAIN REMOVAL: ${message}}`, debug);\n chain.forEach(currField => record.removeField(currField));\n }\n }\n }\n\n /* eslint-enable */\n return deletedStringsArray;\n}\n\nfunction deriveIndividualDeletables(record) {\n /* eslint-disable */\n let deletableStringsArray = [];\n\n record.fields.forEach(field => fieldDeriveIndividualDeletables(field));\n\n function fieldDeriveIndividualDeletables(field) {\n const fieldAsString = fieldToString(field);\n\n // Proof-of-concept rule:\n let tmp = fieldAsString;\n if (field.tag.match(/^[1678]00$/u)) {\n while (tmp.match(/, ‡e [^‡]+\\.$/)) {\n tmp = tmp.replace(/, ‡e [^‡]+\\.$/, '.');\n deletableStringsArray.push(tmp);\n }\n }\n // MET-381: remove occurence number TAG-00, if TAG-NN existists\n if (field.tag === '880') {\n tmp = fieldAsString;\n if (tmp.match(/ ‡6 [0-9][0-9][0-9]-([?:1-9][0-9]|0[1-9])/)) {\n tmp = tmp.replace(/( ‡6 [0-9][0-9][0-9])-[0-9]+/, '$1-00');\n nvdebug(`MET-381: ADD TO DELETABLES: ${tmp}`);\n deletableStringsArray.push(tmp);\n if (tmp.match(/ ‡6 [0-9][0-9][0-9]-00\\/[^ ]+ /)) {\n tmp = tmp.replace(/( ‡6 [0-9][0-9][0-9]-00)[^ ]+/, '$1');\n nvdebug(`MET-381: ADD TO DELETABLES: ${tmp}`);\n deletableStringsArray.push(tmp);\n }\n }\n }\n\n\n\n // Remove keepless versions:\n tmp = fieldAsString;\n while (tmp.match(/ ‡9 [A-Z]+<KEEP>/)) {\n tmp = tmp.replace(/ ‡9 [A-Z]+<KEEP>/, '');\n deletableStringsArray.push(tmp);\n }\n }\n /* eslint-enable */\n return deletableStringsArray; // we should do uniq!\n\n}\n\n\nexport function removeIndividualInferiorDatafields(record, fix = true) { // No $6 nor $8 in field\n const deletableFieldsAsStrings = deriveIndividualDeletables(record);\n const hits = record.fields.filter(field => isDeletableField(field));\n\n const deletedFieldsAsStrings = hits.map(f => fieldToString(f));\n\n if (fix) { // eslint-disable-line functional/no-conditional-statements\n hits.forEach(field => {\n nvdebug(`Remove inferior field: ${fieldToString(field)}`);\n record.removeField(field);\n });\n }\n\n return deletedFieldsAsStrings;\n\n function isDeletableField(field) {\n const fieldAsString = fieldToString(field);\n return deletableFieldsAsStrings.includes(fieldAsString);\n }\n}\n\n\nexport function removeInferiorDatafields(record, fix = true) {\n const removables = removeIndividualInferiorDatafields(record, fix); // Lone fields\n //const removables8 = removeDuplicateSubfield8Chains(record, fix); // Lone subfield $8 chains\n const removables6 = removeInferiorChains(record, fix); // Lone subfield $6 chains\n // HOW TO HANDLE $6+$8 combos?\n\n nvdebug(`REMOVABLES:\\n ${removables.join('\\n ')}`);\n nvdebug(`REMOVABLES 6:\\n ${removables6.join('\\n ')}`);\n\n const removablesAll = removables.concat(removables6); //.concat(removables8);\n\n return removablesAll;\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 _removeInferiorDataFields = _interopRequireDefault(require("./removeInferiorDataFields"));
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-inferior-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/removeInferiorDataFields:test');
23
+ async function testValidatorFactory() {
24
+ const validator = await (0, _removeInferiorDataFields.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, _removeInferiorDataFields.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=removeInferiorDataFields.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"removeInferiorDataFields.spec.js","names":["_chai","require","_marcRecord","_removeInferiorDataFields","_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/removeInferiorDataFields.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './removeInferiorDataFields';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'remove-inferior-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/removeInferiorDataFields: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,yBAAA,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,4BAA4B,CAAC;EACtEC,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,wEAAwE,CAAC;AAEzG,eAAeF,oBAAoBA,CAAA,EAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,iCAAgB,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,iCAAgB,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"}
@@ -1,32 +1,113 @@
1
- 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _xml2js=require('xml2js');var _nodeFetch=require('node-fetch');var _nodeFetch2=_interopRequireDefault(_nodeFetch);var _lodash=require('lodash');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function _asyncToGenerator(fn){return function(){var gen=fn.apply(this,arguments);return new Promise(function(resolve,reject){function step(key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{return Promise.resolve(value).then(function(value){step('next',value)},function(err){step('throw',err)})}}return step('next')})}}/**
2
- *
3
- * @licstart The following is the entire license notice for the JavaScript code in this file.
4
- *
5
- * MARC record validators used in Melinda
6
- *
7
- * Copyright (C) 2014-2018 University Of Helsinki (The National Library Of Finland)
8
- *
9
- * This file is part of marc-record-validators-melinda
10
- *
11
- * marc-record-validators-melinda program 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
- * marc-record-validators-melinda 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
- *//* eslint-disable require-await */exports.default=(()=>{var _ref=_asyncToGenerator(function*({endpoint,prefixPattern,fields}){let validate=(()=>{var _ref2=_asyncToGenerator(function*(record){const validateResult=yield validateRecord(record);return validateResult});return function validate(_x2){return _ref2.apply(this,arguments)}})();let validateMatchingTags=(()=>{var _ref3=_asyncToGenerator(function*(tags){const resolved=yield Promise.all(tags.map(function(obj){return getData(obj.value).then(function(valid){return Object.assign({valid},obj)})}));if(resolved.every(function(value){return value.valid===true})){return{valid:true,messages:[]}}return{valid:false,messages:resolved.map(function(obj){return`Field ${obj.tag}$${obj.code} with value ${obj.value} is not resolvable`})}});return function validateMatchingTags(_x3){return _ref3.apply(this,arguments)}})();let getData=(()=>{var _ref4=_asyncToGenerator(function*(recID){const queryParam='?operation=searchRetrieve&maximumRecords=2&version=1&query=rec.id=';const response=yield(0,_nodeFetch2.default)(`${endpoint}${queryParam}${recID}`);const xml=yield response.text();return new Promise(function(resolve){(0,_xml2js.parseString)(xml,function(err,result){const record=(0,_lodash.last)(result['zs:searchRetrieveResponse']['zs:records']);const position=parseInt((0,_lodash.last)(record['zs:record'])['zs:recordPosition'][0],10);resolve(position===1&&!err)})})});return function getData(_x4){return _ref4.apply(this,arguments)}})();if(typeof endpoint==='string'&&prefixPattern instanceof RegExp&&typeof fields==='object'){return{description:'Checks if Melinda entity references are resolvable',validate}}throw new Error('Error in validation parameters');function validateRecord(record){const removedPrefixes=[];// Filter matching field keys from record.fields
28
- const subfields=record.fields.reduce((prev,current)=>{Object.keys(fields).forEach(key=>{if(key===current.tag){prev.push(current)}});return prev},[]);// Filter matching objects from subfields
29
- const matchingTags=[...subfields].reduce((prev,current)=>{Object.keys(fields).forEach(key=>{if(key===current.tag){current.subfields.filter(item=>{if(Object.values(fields[key]).filter(value=>value===item.code)[0]){prev.push({tag:current.tag,code:item.code,value:item.value})}return prev})}});return prev},[]);// Matching prefixPattern is removed from object value field.
30
- matchingTags.forEach(obj=>{if(prefixPattern.test(obj.value)){obj.value=obj.value.replace(prefixPattern,'');removedPrefixes.push(obj)}});return resolveValidation(removedPrefixes)}function resolveValidation(removedPrefixes){// If matching prefixPatterns found make an API call
31
- if(removedPrefixes.length>0){return validateMatchingTags(removedPrefixes).then(result=>{return result})}return{valid:true,messages:[]}}});return function(_x){return _ref.apply(this,arguments)}})();
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = _default;
7
+ var _xml2js = require("xml2js");
8
+ var _nodeFetch = _interopRequireDefault(require("node-fetch"));
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ function _default({
11
+ endpoint,
12
+ prefixPattern,
13
+ fields
14
+ }) {
15
+ if (typeof endpoint === 'string' && prefixPattern instanceof RegExp && typeof fields === 'object') {
16
+ return {
17
+ description: 'Checks if Melinda entity references are resolvable',
18
+ validate
19
+ };
20
+ }
21
+ throw new Error('Error in validation parameters');
22
+ async function validate(record) {
23
+ const validateResult = await validateRecord(record);
24
+ return validateResult;
25
+ }
26
+ function validateRecord(record) {
27
+ const removedPrefixes = [];
28
+
29
+ // Filter matching field keys from record.fields
30
+ const subfields = record.fields.reduce((prev, current) => {
31
+ Object.keys(fields).forEach(key => {
32
+ if (key === current.tag) {
33
+ // eslint-disable-line functional/no-conditional-statements
34
+ prev.push(current); // eslint-disable-line functional/immutable-data
35
+ }
36
+ });
37
+
38
+ return prev;
39
+ }, []);
40
+
41
+ // Filter matching objects from subfields
42
+ const matchingTags = [...subfields].reduce((prev, current) => {
43
+ Object.keys(fields).forEach(key => {
44
+ if (key === current.tag) {
45
+ // eslint-disable-line functional/no-conditional-statements
46
+ current.subfields.filter(item => {
47
+ if (Object.values(fields[key]).filter(value => value === item.code)[0]) {
48
+ // eslint-disable-line functional/no-conditional-statements
49
+ prev.push({
50
+ tag: current.tag,
51
+ code: item.code,
52
+ value: item.value
53
+ }); // eslint-disable-line functional/immutable-data
54
+ }
55
+
56
+ return prev;
57
+ });
58
+ }
59
+ });
60
+ return prev;
61
+ }, []);
62
+
63
+ // Matching prefixPattern is removed from object value field.
64
+ matchingTags.forEach(obj => {
65
+ if (prefixPattern.test(obj.value)) {
66
+ // eslint-disable-line functional/no-conditional-statements
67
+ obj.value = obj.value.replace(prefixPattern, ''); // eslint-disable-line functional/immutable-data
68
+ removedPrefixes.push(obj); // eslint-disable-line functional/immutable-data
69
+ }
70
+ });
71
+
72
+ return resolveValidation(removedPrefixes);
73
+ }
74
+ function resolveValidation(removedPrefixes) {
75
+ // If matching prefixPatterns found make an API call
76
+ if (removedPrefixes.length > 0) {
77
+ return validateMatchingTags(removedPrefixes).then(result => result);
78
+ }
79
+ return {
80
+ valid: true,
81
+ messages: []
82
+ };
83
+ }
84
+ async function validateMatchingTags(tags) {
85
+ const resolved = await Promise.all(tags.map(obj => getData(obj.value).then(valid => ({
86
+ valid,
87
+ ...obj
88
+ }))));
89
+ if (resolved.every(value => value.valid === true)) {
90
+ return {
91
+ valid: true,
92
+ messages: []
93
+ };
94
+ }
95
+ return {
96
+ valid: false,
97
+ messages: resolved.map(obj => `Field ${obj.tag}$${obj.code} with value ${obj.value} is not resolvable`)
98
+ };
99
+ }
100
+ async function getData(recID) {
101
+ const queryParam = '?operation=searchRetrieve&maximumRecords=2&version=1&query=rec.id=';
102
+ const response = await (0, _nodeFetch.default)(`${endpoint}${queryParam}${recID}`);
103
+ const xml = await response.text();
104
+ return new Promise(resolve => {
105
+ (0, _xml2js.parseString)(xml, (err, result) => {
106
+ const record = result['zs:searchRetrieveResponse']['zs:records'].slice(-1)?.[0];
107
+ const position = parseInt(record?.['zs:record'].slice(-1)?.[0]['zs:recordPosition'][0], 10);
108
+ resolve(position === 1 && !err);
109
+ });
110
+ });
111
+ }
112
+ }
32
113
  //# sourceMappingURL=resolvable-ext-references-melinda.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/resolvable-ext-references-melinda.js"],"names":["endpoint","prefixPattern","fields","record","validateResult","validateRecord","validate","tags","resolved","Promise","all","map","getData","obj","value","then","Object","assign","valid","every","messages","tag","code","validateMatchingTags","recID","queryParam","response","xml","text","err","result","position","parseInt","resolve","RegExp","description","Error","removedPrefixes","subfields","reduce","prev","current","keys","forEach","key","push","matchingTags","filter","item","values","test","replace","resolveValidation","length"],"mappings":"sEA6BA,8BACA,qC,mDACA,8B,4dA/BA;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BA,kC,iDAKe,UAAgB,CAACA,QAAD,CAAWC,aAAX,CAA0BC,MAA1B,CAAhB,CAAmD,gDASjE,UAAwBC,MAAxB,CAAgC,CAC/B,KAAMC,gBAAiB,KAAMC,gBAAeF,MAAf,CAA7B,CACA,MAAOC,eACP,CAZgE,iBASlDE,SATkD,yGA8DjE,UAAoCC,IAApC,CAA0C,CACzC,KAAMC,UAAW,KAAMC,SAAQC,GAAR,CAAYH,KAAKI,GAAL,CAAS,aAAO,CAClD,MAAOC,SAAQC,IAAIC,KAAZ,EAAmBC,IAAnB,CAAwB,eAAS,CACvC,MAAOC,QAAOC,MAAP,CAAc,CAACC,KAAD,CAAd,CAAuBL,GAAvB,CACP,CAFM,CAGP,CAJkC,CAAZ,CAAvB,CAMA,GAAIL,SAASW,KAAT,CAAe,sBAASL,OAAMI,KAAN,GAAgB,IAAzB,CAAf,CAAJ,CAAmD,CAClD,MAAO,CAACA,MAAO,IAAR,CAAcE,SAAU,EAAxB,CACP,CAED,MAAO,CAACF,MAAO,KAAR,CAAeE,SAAUZ,SAASG,GAAT,CAAa,oBAAQ,SAAQE,IAAIQ,GAAI,IAAGR,IAAIS,IAAK,eAAcT,IAAIC,KAAM,oBAA5D,CAAb,CAAzB,CACP,CA1EgE,iBA8DlDS,qBA9DkD,4FA4EjE,UAAuBC,KAAvB,CAA8B,CAC7B,KAAMC,YAAa,oEAAnB,CAEA,KAAMC,UAAW,KAAM,wBAAO,GAAE1B,QAAS,GAAEyB,UAAW,GAAED,KAAM,EAAvC,CAAvB,CAEA,KAAMG,KAAM,KAAMD,UAASE,IAAT,EAAlB,CAEA,MAAO,IAAInB,QAAJ,CAAY,iBAAW,CAC7B,wBAAYkB,GAAZ,CAAiB,SAACE,GAAD,CAAMC,MAAN,CAAiB,CACjC,KAAM3B,QAAS,iBAAK2B,OAAO,2BAAP,EAAoC,YAApC,CAAL,CAAf,CACA,KAAMC,UAAWC,SAAS,iBAAK7B,OAAO,WAAP,CAAL,EAA0B,mBAA1B,EAA+C,CAA/C,CAAT,CAA4D,EAA5D,CAAjB,CACA8B,QAAQF,WAAa,CAAb,EAAkB,CAACF,GAA3B,CACA,CAJD,CAKA,CANM,CAOP,CA1FgE,iBA4ElDjB,QA5EkD,8CACjE,GAAI,MAAOZ,SAAP,GAAoB,QAApB,EAAgCC,wBAAyBiC,OAAzD,EAAmE,MAAOhC,OAAP,GAAkB,QAAzF,CAAmG,CAClG,MAAO,CACNiC,YAAa,oDADP,CAEN7B,QAFM,CAIP,CACD,KAAM,IAAI8B,MAAJ,CAAU,gCAAV,CAAN,CAOA,QAAS/B,eAAT,CAAwBF,MAAxB,CAAgC,CAC/B,KAAMkC,iBAAkB,EAAxB,CAEA;AACA,KAAMC,WAAYnC,OAAOD,MAAP,CAAcqC,MAAd,CAAqB,CAACC,IAAD,CAAOC,OAAP,GAAmB,CACzDzB,OAAO0B,IAAP,CAAYxC,MAAZ,EAAoByC,OAApB,CAA4BC,KAAO,CAClC,GAAIA,MAAQH,QAAQpB,GAApB,CAAyB,CACxBmB,KAAKK,IAAL,CAAUJ,OAAV,CACA,CACD,CAJD,EAKA,MAAOD,KACP,CAPiB,CAOf,EAPe,CAAlB,CASA;AACA,KAAMM,cAAe,CAAC,GAAGR,SAAJ,EAAeC,MAAf,CAAsB,CAACC,IAAD,CAAOC,OAAP,GAAmB,CAC7DzB,OAAO0B,IAAP,CAAYxC,MAAZ,EAAoByC,OAApB,CAA4BC,KAAO,CAClC,GAAIA,MAAQH,QAAQpB,GAApB,CAAyB,CACxBoB,QAAQH,SAAR,CAAkBS,MAAlB,CAAyBC,MAAQ,CAChC,GAAIhC,OAAOiC,MAAP,CAAc/C,OAAO0C,GAAP,CAAd,EAA2BG,MAA3B,CAAkCjC,OAASA,QAAUkC,KAAK1B,IAA1D,EAAgE,CAAhE,CAAJ,CAAwE,CACvEkB,KAAKK,IAAL,CAAU,CAACxB,IAAKoB,QAAQpB,GAAd,CAAmBC,KAAM0B,KAAK1B,IAA9B,CAAoCR,MAAOkC,KAAKlC,KAAhD,CAAV,CACA,CACD,MAAO0B,KACP,CALD,CAMA,CACD,CATD,EAUA,MAAOA,KACP,CAZoB,CAYlB,EAZkB,CAArB,CAcA;AACAM,aAAaH,OAAb,CAAqB9B,KAAO,CAC3B,GAAIZ,cAAciD,IAAd,CAAmBrC,IAAIC,KAAvB,CAAJ,CAAmC,CAClCD,IAAIC,KAAJ,CAAYD,IAAIC,KAAJ,CAAUqC,OAAV,CAAkBlD,aAAlB,CAAiC,EAAjC,CAAZ,CACAoC,gBAAgBQ,IAAhB,CAAqBhC,GAArB,CACA,CACD,CALD,EAMA,MAAOuC,mBAAkBf,eAAlB,CACP,CAED,QAASe,kBAAT,CAA2Bf,eAA3B,CAA4C,CAC3C;AACA,GAAIA,gBAAgBgB,MAAhB,CAAyB,CAA7B,CAAgC,CAC/B,MAAO9B,sBAAqBc,eAArB,EAAsCtB,IAAtC,CAA2Ce,QAAU,CAC3D,MAAOA,OACP,CAFM,CAGP,CACD,MAAO,CAACZ,MAAO,IAAR,CAAcE,SAAU,EAAxB,CACP,CA+BD,C","file":"resolvable-ext-references-melinda.js","sourcesContent":["/**\n *\n * @licstart The following is the entire license notice for the JavaScript code in this file.\n *\n * MARC record validators used in Melinda\n *\n * Copyright (C) 2014-2018 University Of Helsinki (The National Library Of Finland)\n *\n * This file is part of marc-record-validators-melinda\n *\n * marc-record-validators-melinda program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * marc-record-validators-melinda is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n * @licend The above is the entire license notice\n * for the JavaScript code in this file.\n *\n */\n\n/* eslint-disable require-await */\nimport {parseString} from 'xml2js';\nimport fetch from 'node-fetch';\nimport {last} from 'lodash';\n\nexport default async function ({endpoint, prefixPattern, fields}) {\n\tif (typeof endpoint === 'string' && prefixPattern instanceof RegExp && typeof fields === 'object') {\n\t\treturn {\n\t\t\tdescription: 'Checks if Melinda entity references are resolvable',\n\t\t\tvalidate\n\t\t};\n\t}\n\tthrow new Error('Error in validation parameters');\n\n\tasync function validate(record) {\n\t\tconst validateResult = await validateRecord(record);\n\t\treturn validateResult;\n\t}\n\n\tfunction validateRecord(record) {\n\t\tconst removedPrefixes = [];\n\n\t\t// Filter matching field keys from record.fields\n\t\tconst subfields = record.fields.reduce((prev, current) => {\n\t\t\tObject.keys(fields).forEach(key => {\n\t\t\t\tif (key === current.tag) {\n\t\t\t\t\tprev.push(current);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn prev;\n\t\t}, []);\n\n\t\t// Filter matching objects from subfields\n\t\tconst matchingTags = [...subfields].reduce((prev, current) => {\n\t\t\tObject.keys(fields).forEach(key => {\n\t\t\t\tif (key === current.tag) {\n\t\t\t\t\tcurrent.subfields.filter(item => {\n\t\t\t\t\t\tif (Object.values(fields[key]).filter(value => value === item.code)[0]) {\n\t\t\t\t\t\t\tprev.push({tag: current.tag, code: item.code, value: item.value});\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn prev;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn prev;\n\t\t}, []);\n\n\t\t// Matching prefixPattern is removed from object value field.\n\t\tmatchingTags.forEach(obj => {\n\t\t\tif (prefixPattern.test(obj.value)) {\n\t\t\t\tobj.value = obj.value.replace(prefixPattern, '');\n\t\t\t\tremovedPrefixes.push(obj);\n\t\t\t}\n\t\t});\n\t\treturn resolveValidation(removedPrefixes);\n\t}\n\n\tfunction resolveValidation(removedPrefixes) {\n\t\t// If matching prefixPatterns found make an API call\n\t\tif (removedPrefixes.length > 0) {\n\t\t\treturn validateMatchingTags(removedPrefixes).then(result => {\n\t\t\t\treturn result;\n\t\t\t});\n\t\t}\n\t\treturn {valid: true, messages: []};\n\t}\n\n\tasync function validateMatchingTags(tags) {\n\t\tconst resolved = await Promise.all(tags.map(obj => {\n\t\t\treturn getData(obj.value).then(valid => {\n\t\t\t\treturn Object.assign({valid}, obj);\n\t\t\t});\n\t\t}));\n\n\t\tif (resolved.every(value => value.valid === true)) {\n\t\t\treturn {valid: true, messages: []};\n\t\t}\n\n\t\treturn {valid: false, messages: resolved.map(obj => `Field ${obj.tag}$${obj.code} with value ${obj.value} is not resolvable`)};\n\t}\n\n\tasync function getData(recID) {\n\t\tconst queryParam = '?operation=searchRetrieve&maximumRecords=2&version=1&query=rec.id=';\n\n\t\tconst response = await fetch(`${endpoint}${queryParam}${recID}`);\n\n\t\tconst xml = await response.text();\n\n\t\treturn new Promise(resolve => {\n\t\t\tparseString(xml, (err, result) => {\n\t\t\t\tconst record = last(result['zs:searchRetrieveResponse']['zs:records']);\n\t\t\t\tconst position = parseInt(last(record['zs:record'])['zs:recordPosition'][0], 10);\n\t\t\t\tresolve(position === 1 && !err);\n\t\t\t});\n\t\t});\n\t}\n}\n"]}
1
+ {"version":3,"file":"resolvable-ext-references-melinda.js","names":["_xml2js","require","_nodeFetch","_interopRequireDefault","obj","__esModule","default","_default","endpoint","prefixPattern","fields","RegExp","description","validate","Error","record","validateResult","validateRecord","removedPrefixes","subfields","reduce","prev","current","Object","keys","forEach","key","tag","push","matchingTags","filter","item","values","value","code","test","replace","resolveValidation","length","validateMatchingTags","then","result","valid","messages","tags","resolved","Promise","all","map","getData","every","recID","queryParam","response","fetch","xml","text","resolve","parseString","err","slice","position","parseInt"],"sources":["../src/resolvable-ext-references-melinda.js"],"sourcesContent":["import {parseString} from 'xml2js';\nimport fetch from 'node-fetch';\n\nexport default function ({endpoint, prefixPattern, fields}) {\n if (typeof endpoint === 'string' && prefixPattern instanceof RegExp && typeof fields === 'object') {\n return {\n description: 'Checks if Melinda entity references are resolvable',\n validate\n };\n }\n\n throw new Error('Error in validation parameters');\n\n async function validate(record) {\n const validateResult = await validateRecord(record);\n return validateResult;\n }\n\n function validateRecord(record) {\n const removedPrefixes = [];\n\n // Filter matching field keys from record.fields\n const subfields = record.fields.reduce((prev, current) => {\n Object.keys(fields).forEach(key => {\n if (key === current.tag) { // eslint-disable-line functional/no-conditional-statements\n prev.push(current); // eslint-disable-line functional/immutable-data\n }\n });\n return prev;\n }, []);\n\n // Filter matching objects from subfields\n const matchingTags = [...subfields].reduce((prev, current) => {\n Object.keys(fields).forEach(key => {\n if (key === current.tag) { // eslint-disable-line functional/no-conditional-statements\n current.subfields.filter(item => {\n if (Object.values(fields[key]).filter(value => value === item.code)[0]) { // eslint-disable-line functional/no-conditional-statements\n prev.push({tag: current.tag, code: item.code, value: item.value}); // eslint-disable-line functional/immutable-data\n }\n\n return prev;\n });\n }\n });\n return prev;\n }, []);\n\n // Matching prefixPattern is removed from object value field.\n matchingTags.forEach(obj => {\n if (prefixPattern.test(obj.value)) { // eslint-disable-line functional/no-conditional-statements\n obj.value = obj.value.replace(prefixPattern, ''); // eslint-disable-line functional/immutable-data\n removedPrefixes.push(obj); // eslint-disable-line functional/immutable-data\n }\n });\n return resolveValidation(removedPrefixes);\n }\n\n function resolveValidation(removedPrefixes) {\n // If matching prefixPatterns found make an API call\n if (removedPrefixes.length > 0) {\n return validateMatchingTags(removedPrefixes).then(result => result);\n }\n\n return {valid: true, messages: []};\n }\n\n async function validateMatchingTags(tags) {\n const resolved = await Promise.all(tags.map(obj => getData(obj.value).then(valid => ({valid, ...obj}))));\n\n if (resolved.every(value => value.valid === true)) {\n return {valid: true, messages: []};\n }\n\n return {valid: false, messages: resolved.map(obj => `Field ${obj.tag}$${obj.code} with value ${obj.value} is not resolvable`)};\n }\n\n async function getData(recID) {\n const queryParam = '?operation=searchRetrieve&maximumRecords=2&version=1&query=rec.id=';\n\n const response = await fetch(`${endpoint}${queryParam}${recID}`);\n\n const xml = await response.text();\n\n return new Promise(resolve => {\n parseString(xml, (err, result) => {\n const record = result['zs:searchRetrieveResponse']['zs:records'].slice(-1)?.[0];\n const position = parseInt(record?.['zs:record'].slice(-1)?.[0]['zs:recordPosition'][0], 10);\n resolve(position === 1 && !err);\n });\n });\n }\n}\n"],"mappings":"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"}