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

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
@@ -1,28 +1,167 @@
1
- /**
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 no-undef, max-nested-callbacks, no-unused-expressions */'use strict';var _chai=require('chai');var _chai2=_interopRequireDefault(_chai);var _chaiAsPromised=require('chai-as-promised');var _chaiAsPromised2=_interopRequireDefault(_chaiAsPromised);var _marcRecord=require('@natlibfi/marc-record');var _fetchMock=require('fetch-mock');var _fetchMock2=_interopRequireDefault(_fetchMock);var _resolvableExtReferencesMelinda=require('../src/resolvable-ext-references-melinda');var testContext=_interopRequireWildcard(_resolvableExtReferencesMelinda);var _resolvableExtReferencesMelinda2=require('../test-fixtures/resolvable-ext-references-melinda');function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key]}}newObj.default=obj;return newObj}}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')})}}/* eslint-disable-line import/named */const{expect}=_chai2.default;_chai2.default.use(_chaiAsPromised2.default);const endpoint='http://melinda.kansalliskirjasto.fi:210/fin01';const queryParam='?operation=searchRetrieve&maximumRecords=2&version=1&query=rec.id=';const prefixPattern=/^\(FOOBAR\)/;const fields={773:['w'],833:['w','p']};describe('resolvable-ext-references-melinda',()=>{afterEach(()=>{testContext.default.__ResetDependency__('fetch')});it('Creates a validator',_asyncToGenerator(function*(){const validator=yield testContext.default({endpoint,prefixPattern,fields});expect(validator).to.be.an('object').that.has.any.keys('description','validate');expect(validator.description).to.be.a('string');expect(validator.validate).to.be.a('function')}));it('Throws an error when prefixPattern not provided',_asyncToGenerator(function*(){const validator=yield testContext.default({endpoint,prefixPattern,fields});yield expect(validator.validate()).to.be.rejectedWith(Error,'Cannot read property \'fields\' of undefined')}));describe('#validate',()=>{it('Finds prefixPattern on record and removes it',_asyncToGenerator(function*(){const mock=_fetchMock2.default.sandbox();mock.get(`${endpoint}${queryParam}5000`,_resolvableExtReferencesMelinda2.fixture5000);mock.get(`${endpoint}${queryParam}9550`,_resolvableExtReferencesMelinda2.fixture9550);testContext.default.__Rewire__('fetch',mock);const validator=yield testContext.default({endpoint,prefixPattern,fields});const record=new _marcRecord.MarcRecord({fields:[{tag:'001',value:'123456'},{tag:'035',subfields:[{code:'a',value:'(FI-MELINDA)123456'}]},{tag:'773',subfields:[{code:'w',value:'(FOOBAR)5000'}]},{tag:'833',subfields:[{code:'p',value:'(FOOBAR)9550'},{code:'c',value:'(FI-MELINDA)8850'}]}]});const result=yield validator.validate(record);expect(result).to.eql({valid:true,messages:[]})}));it('Finds no matching prefixPattern on record',_asyncToGenerator(function*(){const mock=_fetchMock2.default.sandbox();mock.get(`${endpoint}5000`,_resolvableExtReferencesMelinda2.fixture5000);testContext.default.__Rewire__('fetch',mock);const validator=yield testContext.default({endpoint,prefixPattern,fields});const record=new _marcRecord.MarcRecord({fields:[{tag:'001',value:'123456'},{tag:'035',subfields:[{code:'a',value:'(FI-MELINDA)123456'}]},{tag:'773',subfields:[{code:'w',value:'(FI-MELINDA)123456'}]},{tag:'833',subfields:[{code:'p',value:'(FI-MELINDA)2620'},{code:'w',value:'(FI-MELINDA)8850'}]}]});const result=yield validator.validate(record);expect(result).to.eql({valid:true,messages:[]})}));it('Finds prefixPattern on record but values not resolvable',_asyncToGenerator(function*(){const mock=_fetchMock2.default.sandbox();mock.get(`${endpoint}${queryParam}1000`,_resolvableExtReferencesMelinda2.fixture1000);testContext.default.__Rewire__('fetch',mock);const validator=yield testContext.default({endpoint,prefixPattern,fields});const record=new _marcRecord.MarcRecord({fields:[{tag:'001',value:'123456'},{tag:'035',subfields:[{code:'a',value:'(FI-MELINDA)123456'}]},{tag:'773',subfields:[{code:'w',value:'(FOOBAR)1000'}]}]});const result=yield validator.validate(record);expect(result).to.eql({valid:false,messages:['Field 773$w with value 1000 is not resolvable']})}))})});
1
+ "use strict";
2
+
3
+ var _chai = _interopRequireDefault(require("chai"));
4
+ var _chaiAsPromised = _interopRequireDefault(require("chai-as-promised"));
5
+ var _marcRecord = require("@natlibfi/marc-record");
6
+ var _fetchMock = _interopRequireDefault(require("fetch-mock"));
7
+ var testContext = _interopRequireWildcard(require("../src/resolvable-ext-references-melinda"));
8
+ var _resolvableExtReferencesMelinda2 = require("../test-fixtures/resolvable-ext-references-melinda");
9
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
10
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
+ const {
13
+ expect
14
+ } = _chai.default;
15
+ _chai.default.use(_chaiAsPromised.default);
16
+ const endpoint = 'http://melinda.kansalliskirjasto.fi:210/fin01';
17
+ const queryParam = '?operation=searchRetrieve&maximumRecords=2&version=1&query=rec.id=';
18
+ const prefixPattern = /^\(FOOBAR\)/u;
19
+ const fields = {
20
+ 773: ['w'],
21
+ 833: ['w', 'p']
22
+ };
23
+ describe('resolvable-ext-references-melinda', () => {
24
+ afterEach(() => {
25
+ testContext.default.__ResetDependency__('fetch');
26
+ });
27
+ it('Creates a validator', async () => {
28
+ const validator = await testContext.default({
29
+ endpoint,
30
+ prefixPattern,
31
+ fields
32
+ });
33
+ expect(validator).to.be.an('object').that.has.any.keys('description', 'validate');
34
+ expect(validator.description).to.be.a('string');
35
+ expect(validator.validate).to.be.a('function');
36
+ });
37
+ it('Throws an error when prefixPattern not provided', async () => {
38
+ const validator = await testContext.default({
39
+ endpoint,
40
+ prefixPattern,
41
+ fields
42
+ });
43
+ // Cannot read property 'fields' of undefined or Cannot read properties of undefined (reading 'fields')'
44
+ await expect(validator.validate()).to.be.rejectedWith(Error, /^Cannot read propert/u);
45
+ });
46
+ describe('#validate', () => {
47
+ it('Finds prefixPattern on record and removes it', async () => {
48
+ const mock = _fetchMock.default.sandbox();
49
+ mock.get(`${endpoint}${queryParam}5000`, _resolvableExtReferencesMelinda2.fixture5000);
50
+ mock.get(`${endpoint}${queryParam}9550`, _resolvableExtReferencesMelinda2.fixture9550);
51
+ testContext.default.__Rewire__('fetch', mock);
52
+ const validator = await testContext.default({
53
+ endpoint,
54
+ prefixPattern,
55
+ fields
56
+ });
57
+ const record = new _marcRecord.MarcRecord({
58
+ fields: [{
59
+ tag: '001',
60
+ value: '123456'
61
+ }, {
62
+ tag: '035',
63
+ subfields: [{
64
+ code: 'a',
65
+ value: '(FI-MELINDA)123456'
66
+ }]
67
+ }, {
68
+ tag: '773',
69
+ subfields: [{
70
+ code: 'w',
71
+ value: '(FOOBAR)5000'
72
+ }]
73
+ }, {
74
+ tag: '833',
75
+ subfields: [{
76
+ code: 'p',
77
+ value: '(FOOBAR)9550'
78
+ }, {
79
+ code: 'c',
80
+ value: '(FI-MELINDA)8850'
81
+ }]
82
+ }]
83
+ });
84
+ const result = await validator.validate(record);
85
+ expect(result).to.eql({
86
+ valid: true,
87
+ messages: []
88
+ });
89
+ });
90
+ it('Finds no matching prefixPattern on record', async () => {
91
+ const mock = _fetchMock.default.sandbox();
92
+ mock.get(`${endpoint}5000`, _resolvableExtReferencesMelinda2.fixture5000);
93
+ testContext.default.__Rewire__('fetch', mock);
94
+ const validator = await testContext.default({
95
+ endpoint,
96
+ prefixPattern,
97
+ fields
98
+ });
99
+ const record = new _marcRecord.MarcRecord({
100
+ fields: [{
101
+ tag: '001',
102
+ value: '123456'
103
+ }, {
104
+ tag: '035',
105
+ subfields: [{
106
+ code: 'a',
107
+ value: '(FI-MELINDA)123456'
108
+ }]
109
+ }, {
110
+ tag: '773',
111
+ subfields: [{
112
+ code: 'w',
113
+ value: '(FI-MELINDA)123456'
114
+ }]
115
+ }, {
116
+ tag: '833',
117
+ subfields: [{
118
+ code: 'p',
119
+ value: '(FI-MELINDA)2620'
120
+ }, {
121
+ code: 'w',
122
+ value: '(FI-MELINDA)8850'
123
+ }]
124
+ }]
125
+ });
126
+ const result = await validator.validate(record);
127
+ expect(result).to.eql({
128
+ valid: true,
129
+ messages: []
130
+ });
131
+ });
132
+ it('Finds prefixPattern on record but values not resolvable', async () => {
133
+ const mock = _fetchMock.default.sandbox();
134
+ mock.get(`${endpoint}${queryParam}1000`, _resolvableExtReferencesMelinda2.fixture1000);
135
+ testContext.default.__Rewire__('fetch', mock);
136
+ const validator = await testContext.default({
137
+ endpoint,
138
+ prefixPattern,
139
+ fields
140
+ });
141
+ const record = new _marcRecord.MarcRecord({
142
+ fields: [{
143
+ tag: '001',
144
+ value: '123456'
145
+ }, {
146
+ tag: '035',
147
+ subfields: [{
148
+ code: 'a',
149
+ value: '(FI-MELINDA)123456'
150
+ }]
151
+ }, {
152
+ tag: '773',
153
+ subfields: [{
154
+ code: 'w',
155
+ value: '(FOOBAR)1000'
156
+ }]
157
+ }]
158
+ });
159
+ const result = await validator.validate(record);
160
+ expect(result).to.eql({
161
+ valid: false,
162
+ messages: ['Field 773$w with value 1000 is not resolvable']
163
+ });
164
+ });
165
+ });
166
+ });
28
167
  //# sourceMappingURL=resolvable-ext-references-melinda.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/resolvable-ext-references-melinda.spec.js"],"names":["testContext","expect","chai","use","chaiAsPromised","endpoint","queryParam","prefixPattern","fields","describe","afterEach","default","__ResetDependency__","it","validator","to","be","an","that","has","any","keys","description","a","validate","rejectedWith","Error","mock","fetchMock","sandbox","get","fixture5000","fixture9550","__Rewire__","record","MarcRecord","tag","value","subfields","code","result","eql","valid","messages","fixture1000"],"mappings":"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","file":"resolvable-ext-references-melinda.spec.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 no-undef, max-nested-callbacks, no-unused-expressions */\n\n'use strict';\nimport chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport fetchMock from 'fetch-mock';\nimport * as testContext from '../src/resolvable-ext-references-melinda'; /* eslint-disable-line import/named */\nimport {fixture5000, fixture9550, fixture1000} from '../test-fixtures/resolvable-ext-references-melinda';\n\nconst {expect} = chai;\nchai.use(chaiAsPromised);\n\nconst endpoint = 'http://melinda.kansalliskirjasto.fi:210/fin01';\nconst queryParam = '?operation=searchRetrieve&maximumRecords=2&version=1&query=rec.id=';\nconst prefixPattern = /^\\(FOOBAR\\)/;\nconst fields = {\n\t773: ['w'],\n\t833: ['w', 'p']\n};\n\ndescribe('resolvable-ext-references-melinda', () => {\n\tafterEach(() => {\n\t\ttestContext.default.__ResetDependency__('fetch');\n\t});\n\n\tit('Creates a validator', async () => {\n\t\tconst validator = await testContext.default({endpoint, prefixPattern, fields});\n\n\t\texpect(validator)\n\t\t\t.to.be.an('object')\n\t\t\t.that.has.any.keys('description', 'validate');\n\n\t\texpect(validator.description).to.be.a('string');\n\t\texpect(validator.validate).to.be.a('function');\n\t});\n\n\tit('Throws an error when prefixPattern not provided', async () => {\n\t\tconst validator = await testContext.default({endpoint, prefixPattern, fields});\n\t\tawait expect(validator.validate()).to.be.rejectedWith(Error, 'Cannot read property \\'fields\\' of undefined');\n\t});\n\n\tdescribe('#validate', () => {\n\t\tit('Finds prefixPattern on record and removes it', async () => {\n\t\t\tconst mock = fetchMock.sandbox();\n\t\t\tmock.get(`${endpoint}${queryParam}5000`, fixture5000);\n\t\t\tmock.get(`${endpoint}${queryParam}9550`, fixture9550);\n\n\t\t\ttestContext.default.__Rewire__('fetch', mock);\n\t\t\tconst validator = await testContext.default({endpoint, prefixPattern, fields});\n\n\t\t\tconst record = new MarcRecord({\n\t\t\t\tfields: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '001',\n\t\t\t\t\t\tvalue: '123456'\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '035',\n\t\t\t\t\t\tsubfields: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcode: 'a',\n\t\t\t\t\t\t\t\tvalue: '(FI-MELINDA)123456'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '773',\n\t\t\t\t\t\tsubfields: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcode: 'w',\n\t\t\t\t\t\t\t\tvalue: '(FOOBAR)5000'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '833',\n\t\t\t\t\t\tsubfields: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcode: 'p',\n\t\t\t\t\t\t\t\tvalue: '(FOOBAR)9550'\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcode: 'c',\n\t\t\t\t\t\t\t\tvalue: '(FI-MELINDA)8850'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t});\n\t\t\tconst result = await validator.validate(record);\n\n\t\t\texpect(result).to.eql({valid: true, messages: []});\n\t\t});\n\n\t\tit('Finds no matching prefixPattern on record', async () => {\n\t\t\tconst mock = fetchMock.sandbox();\n\n\t\t\tmock.get(`${endpoint}5000`, fixture5000);\n\n\t\t\ttestContext.default.__Rewire__('fetch', mock);\n\t\t\tconst validator = await testContext.default({endpoint, prefixPattern, fields});\n\n\t\t\tconst record = new MarcRecord({\n\t\t\t\tfields: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '001',\n\t\t\t\t\t\tvalue: '123456'\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '035',\n\t\t\t\t\t\tsubfields: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcode: 'a',\n\t\t\t\t\t\t\t\tvalue: '(FI-MELINDA)123456'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '773',\n\t\t\t\t\t\tsubfields: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcode: 'w',\n\t\t\t\t\t\t\t\tvalue: '(FI-MELINDA)123456'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '833',\n\t\t\t\t\t\tsubfields: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcode: 'p',\n\t\t\t\t\t\t\t\tvalue: '(FI-MELINDA)2620'\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcode: 'w',\n\t\t\t\t\t\t\t\tvalue: '(FI-MELINDA)8850'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t});\n\t\t\tconst result = await validator.validate(record);\n\n\t\t\texpect(result).to.eql({valid: true, messages: []});\n\t\t});\n\n\t\tit('Finds prefixPattern on record but values not resolvable', async () => {\n\t\t\tconst mock = fetchMock.sandbox();\n\t\t\tmock.get(`${endpoint}${queryParam}1000`, fixture1000);\n\n\t\t\ttestContext.default.__Rewire__('fetch', mock);\n\t\t\tconst validator = await testContext.default({endpoint, prefixPattern, fields});\n\n\t\t\tconst record = new MarcRecord({\n\t\t\t\tfields: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '001',\n\t\t\t\t\t\tvalue: '123456'\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '035',\n\t\t\t\t\t\tsubfields: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcode: 'a',\n\t\t\t\t\t\t\t\tvalue: '(FI-MELINDA)123456'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '773',\n\t\t\t\t\t\tsubfields: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcode: 'w',\n\t\t\t\t\t\t\t\tvalue: '(FOOBAR)1000'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t});\n\t\t\tconst result = await validator.validate(record);\n\n\t\t\texpect(result).to.eql({valid: false, messages: ['Field 773$w with value 1000 is not resolvable']});\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"resolvable-ext-references-melinda.spec.js","names":["_chai","_interopRequireDefault","require","_chaiAsPromised","_marcRecord","_fetchMock","testContext","_interopRequireWildcard","_resolvableExtReferencesMelinda2","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","expect","chai","use","chaiAsPromised","endpoint","queryParam","prefixPattern","fields","describe","afterEach","__ResetDependency__","it","validator","to","be","an","that","any","keys","description","a","validate","rejectedWith","Error","mock","fetchMock","sandbox","fixture5000","fixture9550","__Rewire__","record","MarcRecord","tag","value","subfields","code","result","eql","valid","messages","fixture1000"],"sources":["../src/resolvable-ext-references-melinda.spec.js"],"sourcesContent":["import chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport fetchMock from 'fetch-mock';\nimport * as testContext from '../src/resolvable-ext-references-melinda';\nimport {fixture5000, fixture9550, fixture1000} from '../test-fixtures/resolvable-ext-references-melinda';\n\nconst {expect} = chai;\nchai.use(chaiAsPromised);\n\nconst endpoint = 'http://melinda.kansalliskirjasto.fi:210/fin01';\nconst queryParam = '?operation=searchRetrieve&maximumRecords=2&version=1&query=rec.id=';\nconst prefixPattern = /^\\(FOOBAR\\)/u;\nconst fields = {\n 773: ['w'],\n 833: ['w', 'p']\n};\n\ndescribe('resolvable-ext-references-melinda', () => {\n afterEach(() => {\n testContext.default.__ResetDependency__('fetch');\n });\n\n it('Creates a validator', async () => {\n const validator = await testContext.default({endpoint, prefixPattern, fields});\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\n it('Throws an error when prefixPattern not provided', async () => {\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n // Cannot read property 'fields' of undefined or Cannot read properties of undefined (reading 'fields')'\n await expect(validator.validate()).to.be.rejectedWith(Error, /^Cannot read propert/u);\n });\n\n describe('#validate', () => {\n it('Finds prefixPattern on record and removes it', async () => {\n const mock = fetchMock.sandbox();\n mock.get(`${endpoint}${queryParam}5000`, fixture5000);\n mock.get(`${endpoint}${queryParam}9550`, fixture9550);\n\n testContext.default.__Rewire__('fetch', mock);\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '123456'\n },\n {\n tag: '035',\n subfields: [\n {\n code: 'a',\n value: '(FI-MELINDA)123456'\n }\n ]\n },\n {\n tag: '773',\n subfields: [\n {\n code: 'w',\n value: '(FOOBAR)5000'\n }\n ]\n },\n {\n tag: '833',\n subfields: [\n {\n code: 'p',\n value: '(FOOBAR)9550'\n },\n {\n code: 'c',\n value: '(FI-MELINDA)8850'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: true, messages: []});\n });\n\n it('Finds no matching prefixPattern on record', async () => {\n const mock = fetchMock.sandbox();\n\n mock.get(`${endpoint}5000`, fixture5000);\n\n testContext.default.__Rewire__('fetch', mock);\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '123456'\n },\n {\n tag: '035',\n subfields: [\n {\n code: 'a',\n value: '(FI-MELINDA)123456'\n }\n ]\n },\n {\n tag: '773',\n subfields: [\n {\n code: 'w',\n value: '(FI-MELINDA)123456'\n }\n ]\n },\n {\n tag: '833',\n subfields: [\n {\n code: 'p',\n value: '(FI-MELINDA)2620'\n },\n {\n code: 'w',\n value: '(FI-MELINDA)8850'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: true, messages: []});\n });\n\n it('Finds prefixPattern on record but values not resolvable', async () => {\n const mock = fetchMock.sandbox();\n mock.get(`${endpoint}${queryParam}1000`, fixture1000);\n\n testContext.default.__Rewire__('fetch', mock);\n const validator = await testContext.default({endpoint, prefixPattern, fields});\n\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '123456'\n },\n {\n tag: '035',\n subfields: [\n {\n code: 'a',\n value: '(FI-MELINDA)123456'\n }\n ]\n },\n {\n tag: '773',\n subfields: [\n {\n code: 'w',\n value: '(FOOBAR)1000'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: false, messages: ['Field 773$w with value 1000 is not resolvable']});\n });\n });\n});\n"],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = _default;
7
+ exports.recordFixSubfield6OccurrenceNumbers = recordFixSubfield6OccurrenceNumbers;
8
+ var _debug = _interopRequireDefault(require("debug"));
9
+ var _utils = require("./utils");
10
+ var _subfield6Utils = require("./subfield6Utils");
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
+ // Relocated from melinda-marc-record-merge-reducers (and renamed)
13
+
14
+ const debug = (0, _debug.default)('@natlibfi/marc-record-validators-melinda:resolveOrphanedSubfield6s');
15
+ function _default() {
16
+ return {
17
+ description: 'Remove occurrence-number-orphaned $6 subfields. In field 880, occurrence number becomes 00',
18
+ validate,
19
+ fix
20
+ };
21
+ function fix(record) {
22
+ (0, _utils.nvdebug)('Fix SF6 orphaned occurrence numbers');
23
+ const res = {
24
+ message: [],
25
+ fix: [],
26
+ valid: true
27
+ };
28
+ //message.fix = []; // eslint-disable-line functional/immutable-data
29
+
30
+ // This can not really fail...
31
+ recordFixSubfield6OccurrenceNumbers(record);
32
+
33
+ //message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data
34
+ return res;
35
+ }
36
+ function validate(record) {
37
+ // Check max, and check number of different indexes
38
+ (0, _utils.nvdebug)('Validate SF6 orphaned occurrence numbers', debug);
39
+ const fieldsContainingSubfield6 = record.fields.filter(field => (0, _utils.fieldHasSubfield)(field, '6'));
40
+ const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);
41
+ const res = {
42
+ message: []
43
+ };
44
+ if (orphanedFields.length > 0) {
45
+ // eslint-disable-line functional/no-conditional-statements
46
+ res.message = [`${orphanedFields.length} orphaned occurrence number field(s) detected`]; // eslint-disable-line functional/immutable-data
47
+ }
48
+
49
+ res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data
50
+ return res;
51
+ }
52
+ }
53
+ function recordFixSubfield6OccurrenceNumbers(record) {
54
+ const fieldsContainingSubfield6 = record.fields.filter(field => (0, _utils.fieldHasSubfield)(field, '6'));
55
+ const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);
56
+ orphanedFields.forEach(field => fieldFixOrphanedSubfields(field));
57
+ function fieldFixOrphanedSubfields(field) {
58
+ // Field 880: orphaned $6 subfields: occurrence number is changed to '00':
59
+ if (field.tag === '880') {
60
+ field.subfields.forEach(sf => field880FixOrphanedSubfield(sf));
61
+ return;
62
+ }
63
+ // Non-880 fields get their orphaned $6s removed:
64
+ const remainingSubfields = field.subfields.filter(sf => !isOrphanedSubfield(sf, field.tag, fieldsContainingSubfield6));
65
+ if (remainingSubfields.length === 0) {
66
+ record.removeField(field);
67
+ return;
68
+ }
69
+ field.subfields = remainingSubfields; // eslint-disable-line functional/immutable-data
70
+ }
71
+
72
+ function field880FixOrphanedSubfield(subfield) {
73
+ if (!isOrphanedSubfield(subfield, '880', fieldsContainingSubfield6)) {
74
+ return;
75
+ }
76
+ // convert occurrence number to 00
77
+ (0, _subfield6Utils.subfield6ResetOccurrenceNumber)(subfield, '00');
78
+ }
79
+ }
80
+ function findPairForSubfield6OccurrenceNumber(subfield6, myTag, candPairFields) {
81
+ // We keep the crap!
82
+ if (!(0, _subfield6Utils.isValidSubfield6)(subfield6)) {
83
+ return undefined;
84
+ }
85
+ (0, _utils.nvdebug)(`LOOKING FOR PAIR: ${myTag} ${(0, _utils.subfieldToString)(subfield6)}`);
86
+ candPairFields.forEach(field => (0, _utils.fieldToString)(field));
87
+
88
+ // Only valid $6 value that fails to map to another field is iffy...
89
+ const referredTag = subfield6.value.substring(0, 3);
90
+ const occurrenceNumber = (0, _subfield6Utils.subfield6GetOccurrenceNumber)(subfield6);
91
+ if (occurrenceNumber === '00') {
92
+ return undefined;
93
+ }
94
+ const tagAndOccurrenceNumber = `${myTag}-${occurrenceNumber}`;
95
+ (0, _utils.nvdebug)(`Try to find occurrence number ${tagAndOccurrenceNumber} in field ${referredTag}...`);
96
+ //const relevantFields = fields.filter(field => field.tag === referredTag && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber));
97
+ const relevantFields = candPairFields.filter(field => field.tag === referredTag && (0, _subfield6Utils.fieldHasWantedTagAndOccurrenceNumber)(field, tagAndOccurrenceNumber));
98
+ if (relevantFields.length === 0) {
99
+ return undefined;
100
+ }
101
+ // This should always return just one (not sanity checking this for now):
102
+ return relevantFields[0];
103
+ }
104
+ function isOrphanedSubfield(subfield, tag, pairCandidateFields) {
105
+ if (!(0, _subfield6Utils.isValidSubfield6)(subfield) || (0, _subfield6Utils.subfield6GetOccurrenceNumber)(subfield) === '00') {
106
+ return false;
107
+ }
108
+ return !findPairForSubfield6OccurrenceNumber(subfield, tag, pairCandidateFields);
109
+ }
110
+ function isOrphanedField(field, candidatePairFields) {
111
+ return field.subfields.some(sf => isOrphanedSubfield(sf, field.tag, candidatePairFields));
112
+ }
113
+ function getOrphanedFields(relevantFields) {
114
+ return relevantFields.filter(field => isOrphanedField(field, relevantFields));
115
+ }
116
+ //# sourceMappingURL=resolveOrphanedSubfield6s.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveOrphanedSubfield6s.js","names":["_debug","_interopRequireDefault","require","_utils","_subfield6Utils","obj","__esModule","default","debug","createDebugLogger","_default","description","validate","fix","record","nvdebug","res","message","valid","recordFixSubfield6OccurrenceNumbers","fieldsContainingSubfield6","fields","filter","field","fieldHasSubfield","orphanedFields","getOrphanedFields","length","forEach","fieldFixOrphanedSubfields","tag","subfields","sf","field880FixOrphanedSubfield","remainingSubfields","isOrphanedSubfield","removeField","subfield","subfield6ResetOccurrenceNumber","findPairForSubfield6OccurrenceNumber","subfield6","myTag","candPairFields","isValidSubfield6","undefined","subfieldToString","fieldToString","referredTag","value","substring","occurrenceNumber","subfield6GetOccurrenceNumber","tagAndOccurrenceNumber","relevantFields","fieldHasWantedTagAndOccurrenceNumber","pairCandidateFields","isOrphanedField","candidatePairFields","some"],"sources":["../src/resolveOrphanedSubfield6s.js"],"sourcesContent":["import createDebugLogger from 'debug';\nimport {fieldHasSubfield, fieldToString, nvdebug, subfieldToString} from './utils';\nimport {fieldHasWantedTagAndOccurrenceNumber, isValidSubfield6, subfield6GetOccurrenceNumber, subfield6ResetOccurrenceNumber} from './subfield6Utils';\n\n// Relocated from melinda-marc-record-merge-reducers (and renamed)\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:resolveOrphanedSubfield6s');\n\nexport default function () {\n return {\n description: 'Remove occurrence-number-orphaned $6 subfields. In field 880, occurrence number becomes 00',\n validate, fix\n };\n\n function fix(record) {\n nvdebug('Fix SF6 orphaned occurrence numbers');\n const res = {message: [], fix: [], valid: true};\n //message.fix = []; // eslint-disable-line functional/immutable-data\n\n // This can not really fail...\n recordFixSubfield6OccurrenceNumbers(record);\n\n //message.valid = !(message.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n\n function validate(record) {\n // Check max, and check number of different indexes\n nvdebug('Validate SF6 orphaned occurrence numbers', debug);\n const fieldsContainingSubfield6 = record.fields.filter(field => fieldHasSubfield(field, '6'));\n\n const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);\n\n const res = {message: []};\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 res.valid = res.message.length < 1; // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\nexport function recordFixSubfield6OccurrenceNumbers(record) {\n const fieldsContainingSubfield6 = record.fields.filter(field => fieldHasSubfield(field, '6'));\n const orphanedFields = getOrphanedFields(fieldsContainingSubfield6);\n\n orphanedFields.forEach(field => fieldFixOrphanedSubfields(field));\n\n function fieldFixOrphanedSubfields(field) {\n // Field 880: orphaned $6 subfields: occurrence number is changed to '00':\n if (field.tag === '880') {\n field.subfields.forEach(sf => field880FixOrphanedSubfield(sf));\n return;\n }\n // Non-880 fields get their orphaned $6s removed:\n const remainingSubfields = field.subfields.filter(sf => !isOrphanedSubfield(sf, field.tag, fieldsContainingSubfield6));\n if (remainingSubfields.length === 0) {\n record.removeField(field);\n return;\n }\n field.subfields = remainingSubfields; // eslint-disable-line functional/immutable-data\n }\n\n function field880FixOrphanedSubfield(subfield) {\n if (!isOrphanedSubfield(subfield, '880', fieldsContainingSubfield6)) {\n return;\n }\n // convert occurrence number to 00\n subfield6ResetOccurrenceNumber(subfield, '00');\n }\n}\n\n\nfunction findPairForSubfield6OccurrenceNumber(subfield6, myTag, candPairFields) {\n // We keep the crap!\n if (!isValidSubfield6(subfield6)) {\n return undefined;\n }\n nvdebug(`LOOKING FOR PAIR: ${myTag} ${subfieldToString(subfield6)}`);\n candPairFields.forEach(field => fieldToString(field));\n\n // Only valid $6 value that fails to map to another field is iffy...\n const referredTag = subfield6.value.substring(0, 3);\n\n const occurrenceNumber = subfield6GetOccurrenceNumber(subfield6);\n if (occurrenceNumber === '00') {\n return undefined;\n }\n const tagAndOccurrenceNumber = `${myTag}-${occurrenceNumber}`;\n nvdebug(`Try to find occurrence number ${tagAndOccurrenceNumber} in field ${referredTag}...`);\n //const relevantFields = fields.filter(field => field.tag === referredTag && field.subfields.some(sf => subfield6GetOccurrenceNumber(sf) === occurrenceNumber));\n const relevantFields = candPairFields.filter(field => field.tag === referredTag && fieldHasWantedTagAndOccurrenceNumber(field, tagAndOccurrenceNumber));\n if (relevantFields.length === 0) {\n return undefined;\n }\n // This should always return just one (not sanity checking this for now):\n return relevantFields[0];\n}\n\nfunction isOrphanedSubfield(subfield, tag, pairCandidateFields) {\n if (!isValidSubfield6(subfield) || subfield6GetOccurrenceNumber(subfield) === '00') {\n return false;\n }\n return !findPairForSubfield6OccurrenceNumber(subfield, tag, pairCandidateFields);\n}\n\n\nfunction isOrphanedField(field, candidatePairFields) {\n return field.subfields.some(sf => isOrphanedSubfield(sf, field.tag, candidatePairFields));\n}\n\nfunction getOrphanedFields(relevantFields) {\n return relevantFields.filter(field => isOrphanedField(field, relevantFields));\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 _resolveOrphanedSubfield6s = _interopRequireDefault(require("./resolveOrphanedSubfield6s"));
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-orphanded-sf6s'],
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/resolveOrphanedSubfield6s:test');
23
+ async function testValidatorFactory() {
24
+ const validator = await (0, _resolveOrphanedSubfield6s.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, _resolveOrphanedSubfield6s.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=resolveOrphanedSubfield6s.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveOrphanedSubfield6s.spec.js","names":["_chai","require","_marcRecord","_resolveOrphanedSubfield6s","_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/resolveOrphanedSubfield6s.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './resolveOrphanedSubfield6s';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'remove-orphanded-sf6s'],\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/resolveOrphanedSubfield6s: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,uBAAuB,CAAC;EACjEC,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"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = _default;
7
+ var _utils = require("./utils");
8
+ //import createDebugLogger from 'debug';
9
+
10
+ //const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes);
11
+ // Author(s): Nicholas Volk, Joni Ollila
12
+ function _default() {
13
+ return {
14
+ description: 'Validator for sanitizing vocabulary source codes in subfield $2 (MRA-532)',
15
+ validate,
16
+ fix
17
+ };
18
+ function fix(record) {
19
+ const fixedFields = getFieldsWithCrappySubfieldCode(record, true);
20
+ const remainingBadFields = getFieldsWithCrappySubfieldCode(record, false);
21
+ const remainingBadFieldsAsStrings = remainingBadFields.map(f => (0, _utils.fieldToString)(f));
22
+
23
+ // We are content
24
+ const fixedFieldsAsStrings = fixedFields.map(f => (0, _utils.fieldToString)(f));
25
+ return {
26
+ message: remainingBadFieldsAsStrings,
27
+ fix: fixedFieldsAsStrings,
28
+ valid: true
29
+ };
30
+ }
31
+ function validate(record) {
32
+ const badFields = getFieldsWithCrappySubfieldCode(record, false);
33
+ if (badFields.length === 0) {
34
+ return {
35
+ 'message': [],
36
+ 'valid': true
37
+ };
38
+ }
39
+ const messages = badFields.map(f => (0, _utils.fieldToString)(f));
40
+ return {
41
+ 'message': messages,
42
+ 'valid': false
43
+ };
44
+ }
45
+ }
46
+
47
+ // 'mts' is here as per specs. However, I think it should be 'mts/fin' or 'mts/swe'
48
+ const legalSubfieldCode = ['allars', 'mts', 'mts/fin', 'mts/swe', 'slm/fin', 'slm/swe', 'ysa', 'yso/fin', 'yso/swe'];
49
+ function stringFixVocabularySourceCode(value) {
50
+ // Try to remove spaces, change '//' to '/' and remove final '.' and '/':
51
+ const tmp = value.replace(/ /ug, '').replace(/\/+/ug, '/').replace(/^(?:slm|yso)\/$/u, 'local').replace(/[./]$/gu, '').replace(/^yso-(?:aika|paikat)\//u, 'yso/'); // IMP-HELMET crap. Also, they still have a '.' at the end of $a...
52
+
53
+ if (legalSubfieldCode.includes(tmp)) {
54
+ return tmp;
55
+ }
56
+ return value;
57
+ }
58
+ function isCrappySubfield2(subfield, fix) {
59
+ if (subfield.code !== '2' || legalSubfieldCode.includes(subfield.value)) {
60
+ return false;
61
+ }
62
+
63
+ // If fixer modifies string, it's crap:
64
+ const fixedVersion = stringFixVocabularySourceCode(subfield.value);
65
+ if (fixedVersion !== subfield.value) {
66
+ if (fix) {
67
+ subfield.value = fixedVersion; // eslint-disable-line functional/immutable-data
68
+ return true;
69
+ }
70
+ return true;
71
+ }
72
+ // As we can't fix this here, apply this yso-rule only when validating!
73
+ if (!fix && subfield.value.indexOf('yso/') === 0) {
74
+ return !['yso/eng', 'yso/fin', 'yso/swe'].includes(subfield.value);
75
+ }
76
+ if (!fix && subfield.value.indexOf('slm/') === 0) {
77
+ return !['slm/fin', 'slm/swe'].includes(subfield.value);
78
+ }
79
+ if (!fix && subfield.value.indexOf('mts/') === 0) {
80
+ return !['mts/fin', 'mts/swe'].includes(subfield.value);
81
+ }
82
+ return false;
83
+ }
84
+ function fieldHasCrappySubfield2(field, fix) {
85
+ if (!field.tag.match(/^(?:6..|257|370|38.)$/u)) {
86
+ return false;
87
+ }
88
+ return field.subfields.some(sf => isCrappySubfield2(sf, fix));
89
+ }
90
+ function getFieldsWithCrappySubfieldCode(record, fix) {
91
+ return record.get(/^6..$/u).filter(f => fieldHasCrappySubfield2(f, fix));
92
+ }
93
+ //# sourceMappingURL=sanitize-vocabulary-source-codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize-vocabulary-source-codes.js","names":["_utils","require","_default","description","validate","fix","record","fixedFields","getFieldsWithCrappySubfieldCode","remainingBadFields","remainingBadFieldsAsStrings","map","f","fieldToString","fixedFieldsAsStrings","message","valid","badFields","length","messages","legalSubfieldCode","stringFixVocabularySourceCode","value","tmp","replace","includes","isCrappySubfield2","subfield","code","fixedVersion","indexOf","fieldHasCrappySubfield2","field","tag","match","subfields","some","sf","get","filter"],"sources":["../src/sanitize-vocabulary-source-codes.js"],"sourcesContent":["//import createDebugLogger from 'debug';\nimport {fieldToString} from './utils';\n\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/sanitize-vocabulary-source-codes);\n\n\n// Author(s): Nicholas Volk, Joni Ollila\nexport default function () {\n\n return {\n description: 'Validator for sanitizing vocabulary source codes in subfield $2 (MRA-532)',\n validate, fix\n };\n\n function fix(record) {\n const fixedFields = getFieldsWithCrappySubfieldCode(record, true);\n const remainingBadFields = getFieldsWithCrappySubfieldCode(record, false);\n const remainingBadFieldsAsStrings = remainingBadFields.map(f => fieldToString(f));\n\n // We are content\n const fixedFieldsAsStrings = fixedFields.map(f => fieldToString(f));\n\n return {message: remainingBadFieldsAsStrings, fix: fixedFieldsAsStrings, valid: true};\n }\n\n function validate(record) {\n const badFields = getFieldsWithCrappySubfieldCode(record, false);\n\n if (badFields.length === 0) {\n return {'message': [], 'valid': true};\n }\n\n const messages = badFields.map(f => fieldToString(f));\n\n return {'message': messages, 'valid': false};\n }\n}\n\n// 'mts' is here as per specs. However, I think it should be 'mts/fin' or 'mts/swe'\nconst legalSubfieldCode = ['allars', 'mts', 'mts/fin', 'mts/swe', 'slm/fin', 'slm/swe', 'ysa', 'yso/fin', 'yso/swe'];\n\nfunction stringFixVocabularySourceCode(value) {\n // Try to remove spaces, change '//' to '/' and remove final '.' and '/':\n const tmp = value.replace(/ /ug, '')\n .replace(/\\/+/ug, '/')\n .replace(/^(?:slm|yso)\\/$/u, 'local')\n .replace(/[./]$/gu, '')\n .replace(/^yso-(?:aika|paikat)\\//u, 'yso/'); // IMP-HELMET crap. Also, they still have a '.' at the end of $a...\n\n if (legalSubfieldCode.includes(tmp)) {\n return tmp;\n }\n\n return value;\n}\n\nfunction isCrappySubfield2(subfield, fix) {\n if (subfield.code !== '2' || legalSubfieldCode.includes(subfield.value)) {\n return false;\n }\n\n // If fixer modifies string, it's crap:\n const fixedVersion = stringFixVocabularySourceCode(subfield.value);\n\n if (fixedVersion !== subfield.value) {\n if (fix) {\n subfield.value = fixedVersion; // eslint-disable-line functional/immutable-data\n return true;\n }\n\n return true;\n }\n // As we can't fix this here, apply this yso-rule only when validating!\n if (!fix && subfield.value.indexOf('yso/') === 0) {\n return !['yso/eng', 'yso/fin', 'yso/swe'].includes(subfield.value);\n }\n\n if (!fix && subfield.value.indexOf('slm/') === 0) {\n return !['slm/fin', 'slm/swe'].includes(subfield.value);\n }\n\n if (!fix && subfield.value.indexOf('mts/') === 0) {\n return !['mts/fin', 'mts/swe'].includes(subfield.value);\n }\n\n return false;\n}\n\nfunction fieldHasCrappySubfield2(field, fix) {\n if (!field.tag.match(/^(?:6..|257|370|38.)$/u)) {\n return false;\n }\n\n return field.subfields.some(sf => isCrappySubfield2(sf, fix));\n}\n\nfunction getFieldsWithCrappySubfieldCode(record, fix) {\n return record.get(/^6..$/u).filter(f => fieldHasCrappySubfield2(f, fix));\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 _sanitizeVocabularySourceCodes = _interopRequireDefault(require("./sanitize-vocabulary-source-codes"));
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', 'sanitize-vocabulary-source-codes'],
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/sanitize-vocabulary-source-codes:test');
23
+ async function testValidatorFactory() {
24
+ const validator = await (0, _sanitizeVocabularySourceCodes.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, _sanitizeVocabularySourceCodes.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=sanitize-vocabulary-source-codes.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize-vocabulary-source-codes.spec.js","names":["_chai","require","_marcRecord","_sanitizeVocabularySourceCodes","_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/sanitize-vocabulary-source-codes.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './sanitize-vocabulary-source-codes';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'sanitize-vocabulary-source-codes'],\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/sanitize-vocabulary-source-codes: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,8BAAA,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,kCAAkC,CAAC;EAC5EC,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,gFAAgF,CAAC;AAEjH,eAAeF,oBAAoBA,CAAA,EAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,sCAAgB,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,sCAAgB,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"}