@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,45 @@
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 _marcRecord=require('@natlibfi/marc-record');var _duplicatesInd=require('../src/duplicates-ind1');var _duplicatesInd2=_interopRequireDefault(_duplicatesInd);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')})}}describe('duplicates-ind1',()=>{it('Creates a validator',_asyncToGenerator(function*(){const validator=yield(0,_duplicatesInd2.default)(/^245$/);(0,_chai.expect)(validator).to.be.an('object').that.has.any.keys('description','validate');(0,_chai.expect)(validator.description).to.be.a('string');(0,_chai.expect)(validator.validate).to.be.a('function')}));describe('#validate',()=>{it('Finds the record valid',_asyncToGenerator(function*(){const validator=yield(0,_duplicatesInd2.default)(/^500$/);const record=new _marcRecord.MarcRecord({fields:[{tag:'500',ind1:' ',ind2:'0',subfields:[{code:'a',value:'foo'}]},{tag:'500',ind1:' ',ind2:'0',subfields:[{code:'a',value:'foo'}]}]});const result=yield validator.validate(record);(0,_chai.expect)(result).to.eql({valid:true,messages:[]})}));it('Finds the record invalid',_asyncToGenerator(function*(){const validator=yield(0,_duplicatesInd2.default)(/^500$/);const record=new _marcRecord.MarcRecord({fields:[{tag:'500',ind1:' ',ind2:'0',subfields:[{code:'a',value:'foo'}]},{tag:'500',ind1:'1',ind2:'0',subfields:[{code:'a',value:'foo'}]}]});const result=yield validator.validate(record);(0,_chai.expect)(result).to.eql({valid:false,messages:['Multiple 500 fields which only differ in the first indicator']})}))});describe('#fix',()=>{it('Removes duplicate values',_asyncToGenerator(function*(){const validator=yield(0,_duplicatesInd2.default)(/^500$/);const record=new _marcRecord.MarcRecord({fields:[{tag:'500',ind1:' ',ind2:'0',subfields:[{code:'a',value:'foo'}]},{tag:'500',ind1:'1',ind2:'0',subfields:[{code:'a',value:'foo'}]}]});yield validator.fix(record);(0,_chai.expect)(record.fields).to.eql([{tag:'500',ind1:' ',ind2:'0',subfields:[{code:'a',value:'foo'}]}])}))})});
1
+ "use strict";
2
+
3
+ var _chai = require("chai");
4
+ var _marcRecord = require("@natlibfi/marc-record");
5
+ var _duplicatesInd = _interopRequireDefault(require("./duplicates-ind1"));
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', 'duplicates-ind1'],
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/duplicates-ind1:test');
23
+ async function testValidatorFactory() {
24
+ const validator = await (0, _duplicatesInd.default)(/^500$/u);
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
+ tagPattern,
32
+ fix = false
33
+ }) {
34
+ const validator = await (0, _duplicatesInd.default)(new RegExp(tagPattern, 'u'));
35
+ const record = new _marcRecord.MarcRecord(getFixture('record.json'));
36
+ const expectedResult = getFixture('expectedResult.json');
37
+ if (!fix) {
38
+ const result = await validator.validate(record);
39
+ return (0, _chai.expect)(result).to.eql(expectedResult);
40
+ }
41
+ const fixedRecord = await validator.fix(record);
42
+ debug(fixedRecord);
43
+ (0, _chai.expect)(record.fields).to.eql(expectedResult);
44
+ }
28
45
  //# sourceMappingURL=duplicates-ind1.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/duplicates-ind1.spec.js"],"names":["describe","it","validator","to","be","an","that","has","any","keys","description","a","validate","record","MarcRecord","fields","tag","ind1","ind2","subfields","code","value","result","eql","valid","messages","fix"],"mappings":"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","file":"duplicates-ind1.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';\n\nimport {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/duplicates-ind1';\n\ndescribe('duplicates-ind1', () => {\n\tit('Creates a validator', async () => {\n\t\tconst validator = await validatorFactory(/^245$/);\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\tdescribe('#validate', () => {\n\t\tit('Finds the record valid', async () => {\n\t\t\tconst validator = await validatorFactory(/^500$/);\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: '500',\n\t\t\t\t\t\tind1: ' ',\n\t\t\t\t\t\tind2: '0',\n\t\t\t\t\t\tsubfields: [{code: 'a', value: 'foo'}]\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '500',\n\t\t\t\t\t\tind1: ' ',\n\t\t\t\t\t\tind2: '0',\n\t\t\t\t\t\tsubfields: [{code: 'a', value: 'foo'}]\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\t\tit('Finds the record invalid', async () => {\n\t\t\tconst validator = await validatorFactory(/^500$/);\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: '500',\n\t\t\t\t\t\tind1: ' ',\n\t\t\t\t\t\tind2: '0',\n\t\t\t\t\t\tsubfields: [{code: 'a', value: 'foo'}]\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '500',\n\t\t\t\t\t\tind1: '1',\n\t\t\t\t\t\tind2: '0',\n\t\t\t\t\t\tsubfields: [{code: 'a', value: 'foo'}]\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: ['Multiple 500 fields which only differ in the first indicator']});\n\t\t});\n\t});\n\n\tdescribe('#fix', () => {\n\t\tit('Removes duplicate values', async () => {\n\t\t\tconst validator = await validatorFactory(/^500$/);\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: '500',\n\t\t\t\t\t\tind1: ' ',\n\t\t\t\t\t\tind2: '0',\n\t\t\t\t\t\tsubfields: [{code: 'a', value: 'foo'}]\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '500',\n\t\t\t\t\t\tind1: '1',\n\t\t\t\t\t\tind2: '0',\n\t\t\t\t\t\tsubfields: [{code: 'a', value: 'foo'}]\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t});\n\t\t\tawait validator.fix(record);\n\t\t\texpect(record.fields).to.eql([\n\t\t\t\t{\n\t\t\t\t\ttag: '500',\n\t\t\t\t\tind1: ' ',\n\t\t\t\t\tind2: '0',\n\t\t\t\t\tsubfields: [{code: 'a', value: 'foo'}]\n\t\t\t\t}\n\t\t\t]);\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"duplicates-ind1.spec.js","names":["_chai","require","_marcRecord","_duplicatesInd","_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","tagPattern","fix","RegExp","record","MarcRecord","expectedResult","result","eql","fixedRecord","fields"],"sources":["../src/duplicates-ind1.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from './duplicates-ind1';\n\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'duplicates-ind1'],\n useMetadataFile: true,\n recurse: false,\n fixura: {\n reader: READERS.JSON\n },\n mocha: {\n before: () => testValidatorFactory()\n }\n});\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda/duplicates-ind1:test');\n\nasync function testValidatorFactory() {\n const validator = await validatorFactory(/^500$/u);\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, tagPattern, fix = false}) {\n const validator = await validatorFactory(new RegExp(tagPattern, 'u'));\n const record = new MarcRecord(getFixture('record.json'));\n const expectedResult = getFixture('expectedResult.json');\n\n if (!fix) {\n const result = await validator.validate(record);\n return expect(result).to.eql(expectedResult);\n }\n\n const fixedRecord = await validator.fix(record);\n debug(fixedRecord);\n expect(record.fields).to.eql(expectedResult);\n}\n"],"mappings":";;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,cAAA,GAAAC,sBAAA,CAAAH,OAAA;AAEA,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,iBAAiB,CAAC;EAC3DC,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;AAEF,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,+DAA+D,CAAC;AAEhG,eAAeF,oBAAoBA,CAAA,EAAG;EACpC,MAAMG,SAAS,GAAG,MAAM,IAAAC,sBAAgB,EAAC,QAAQ,CAAC;EAElD,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,UAAU;EAAEC,GAAG,GAAG;AAAK,CAAC,EAAE;EAC7D,MAAMf,SAAS,GAAG,MAAM,IAAAC,sBAAgB,EAAC,IAAIe,MAAM,CAACF,UAAU,EAAE,GAAG,CAAC,CAAC;EACrE,MAAMG,MAAM,GAAG,IAAIC,sBAAU,CAACL,UAAU,CAAC,aAAa,CAAC,CAAC;EACxD,MAAMM,cAAc,GAAGN,UAAU,CAAC,qBAAqB,CAAC;EAExD,IAAI,CAACE,GAAG,EAAE;IACR,MAAMK,MAAM,GAAG,MAAMpB,SAAS,CAACY,QAAQ,CAACK,MAAM,CAAC;IAC/C,OAAO,IAAAf,YAAM,EAACkB,MAAM,CAAC,CAACjB,EAAE,CAACkB,GAAG,CAACF,cAAc,CAAC;EAC9C;EAEA,MAAMG,WAAW,GAAG,MAAMtB,SAAS,CAACe,GAAG,CAACE,MAAM,CAAC;EAC/CnB,KAAK,CAACwB,WAAW,CAAC;EAClB,IAAApB,YAAM,EAACe,MAAM,CAACM,MAAM,CAAC,CAACpB,EAAE,CAACkB,GAAG,CAACF,cAAc,CAAC;AAC9C"}
@@ -1,30 +1,80 @@
1
- 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _lodash=require('lodash');function _asyncToGenerator(fn){return function(){var gen=fn.apply(this,arguments);return new Promise(function(resolve,reject){function step(key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{return Promise.resolve(value).then(function(value){step('next',value)},function(err){step('throw',err)})}}return step('next')})}}/**
2
- *
3
- * @licstart The following is the entire license notice for the JavaScript code in this file.
4
- *
5
- * MARC record validators used in Melinda
6
- *
7
- * Copyright (C) 2014-2018 University Of Helsinki (The National Library Of Finland)
8
- *
9
- * This file is part of marc-record-validators-melinda
10
- *
11
- * marc-record-validators-melinda program is free software: you can redistribute it and/or modify
12
- * it under the terms of the GNU Affero General Public License as
13
- * published by the Free Software Foundation, either version 3 of the
14
- * License, or (at your option) any later version.
15
- *
16
- * marc-record-validators-melinda is distributed in the hope that it will be useful,
17
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- * GNU Affero General Public License for more details.
20
- *
21
- * You should have received a copy of the GNU Affero General Public License
22
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
23
- *
24
- * @licend The above is the entire license notice
25
- * for the JavaScript code in this file.
26
- *
27
- *//**
28
- * DEPRECATED: This validator is not needed because @natlibfi/marc-record doesn't allow fields with empty values
29
- *//* eslint-disable require-await */exports.default=_asyncToGenerator(function*(){let validate=(()=>{var _ref2=_asyncToGenerator(function*(record){const result=searchFields(record);const isValid=result.find(function(obj){return obj.valid===false});return isValid===undefined?{valid:true,messages:[]}:(0,_lodash.omit)(isValid,['field'])});return function validate(_x){return _ref2.apply(this,arguments)}})();let fix=(()=>{var _ref3=_asyncToGenerator(function*(record){const fixFields=searchFields(record);const isValid=fixFields.find(function(obj){return obj.valid===false});if('subfields'in isValid.field&&!(0,_lodash.isEmpty)(isValid.field.subfields)){record.removeSubfield((0,_lodash.find)(isValid.field.subfields,{value:''}),isValid.field)}else{record.removeField(isValid)}});return function fix(_x2){return _ref3.apply(this,arguments)}})();return{description:'Handles empty fields',validate,fix};function searchFields(record){let validationResult;record.fields.forEach(obj=>{validationResult=[emptyControlFields(obj),emptySubfieldValues(obj),emptySubfields(obj)]});return validationResult}function emptyControlFields(field){const result='value'in field&&field.value.length===0;return result===false?{valid:true}:{valid:false,messages:[`Field ${field.tag} has empty value`],field}}function emptySubfields(field){const result=field.subfields&&field.subfields.length===0;return result===false?{valid:true}:{valid:false,messages:[`Field ${field.tag} has no subfields`],field}}function emptySubfieldValues(field){if(field.subfields){const result=field.subfields.filter(subfield=>subfield.value.length===0);return result.length===0?{valid:true}:{valid:false,messages:result.map(item=>`Field ${field.tag}$${item.code} has empty value`),field}}}});
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = _default;
7
+ const ERRORS = {
8
+ EMPTY_SUBFIELDS: 2,
9
+ MISSING_SUBFIELD_VALUES: 3
10
+ };
11
+ function _default() {
12
+ return {
13
+ description: 'Handles empty fields',
14
+ validate,
15
+ fix
16
+ };
17
+ function validate(record) {
18
+ const errors = findErrors(record.fields);
19
+ if (errors.length > 0) {
20
+ return {
21
+ valid: false,
22
+ messages: errors.map(error => {
23
+ // eslint-disable-line array-callback-return
24
+ switch (error.code) {
25
+ case ERRORS.EMPTY_SUBFIELDS:
26
+ return `Field ${error.field.tag} has no subfields`;
27
+ case ERRORS.MISSING_SUBFIELD_VALUES:
28
+ return `Field ${error.field.tag} has missing subfield values: ${error.emptySubfields.map(sf => sf.code).join()}`;
29
+ default:
30
+ }
31
+ })
32
+ };
33
+ }
34
+ return {
35
+ valid: true
36
+ };
37
+ }
38
+ function fix(record) {
39
+ const errors = findErrors(record.fields);
40
+ errors.forEach(error => {
41
+ if (error.code === ERRORS.MISSING_SUBFIELD_VALUES) {
42
+ // eslint-disable-line functional/no-conditional-statements
43
+ if (error.emptySubfields.length === error.field.subfields.length) {
44
+ // eslint-disable-line functional/no-conditional-statements
45
+ record.removeField(error.field);
46
+ } else {
47
+ // eslint-disable-line functional/no-conditional-statements
48
+ error.emptySubfields.forEach(sf => {
49
+ record.removeSubfield(sf, error.field);
50
+ });
51
+ }
52
+ } else {
53
+ // eslint-disable-line functional/no-conditional-statements
54
+ record.removeField(error.field);
55
+ }
56
+ });
57
+ }
58
+ function findErrors(fields) {
59
+ return fields.reduce((errors, field) => {
60
+ if (field.subfields) {
61
+ if (field.subfields.length === 0) {
62
+ return errors.concat({
63
+ field,
64
+ code: ERRORS.EMPTY_SUBFIELDS
65
+ });
66
+ }
67
+ const subfieldsWithoutValue = field.subfields.filter(sf => !sf.value);
68
+ if (subfieldsWithoutValue.length > 0) {
69
+ return errors.concat({
70
+ field,
71
+ emptySubfields: subfieldsWithoutValue,
72
+ code: ERRORS.MISSING_SUBFIELD_VALUES
73
+ });
74
+ }
75
+ }
76
+ return errors;
77
+ }, []);
78
+ }
79
+ }
30
80
  //# sourceMappingURL=empty-fields.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/empty-fields.js"],"names":["record","result","searchFields","isValid","find","obj","valid","undefined","messages","validate","fixFields","field","subfields","removeSubfield","value","removeField","fix","description","validationResult","fields","forEach","emptyControlFields","emptySubfieldValues","emptySubfields","length","tag","filter","subfield","map","item","code"],"mappings":"sEAiCA,8B,0YAjCA;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BA;;EAIA,kC,kCAGe,WAAkB,gDAOhC,UAAwBA,MAAxB,CAAgC,CAC/B,KAAMC,QAASC,aAAaF,MAAb,CAAf,CACA,KAAMG,SAAUF,OAAOG,IAAP,CAAY,oBAAOC,KAAIC,KAAJ,GAAc,KAArB,CAAZ,CAAhB,CACA,MAAOH,WAAYI,SAAZ,CAAwB,CAACD,MAAO,IAAR,CAAcE,SAAU,EAAxB,CAAxB,CAAsD,iBAAKL,OAAL,CAAc,CAAC,OAAD,CAAd,CAC7D,CAX+B,iBAOjBM,SAPiB,uFAahC,UAAmBT,MAAnB,CAA2B,CAC1B,KAAMU,WAAYR,aAAaF,MAAb,CAAlB,CACA,KAAMG,SAAUO,UAAUN,IAAV,CAAe,oBAAOC,KAAIC,KAAJ,GAAc,KAArB,CAAf,CAAhB,CAEA,GAAI,aAAeH,SAAQQ,KAAvB,EAAgC,CAAC,oBAAQR,QAAQQ,KAAR,CAAcC,SAAtB,CAArC,CAAuE,CACtEZ,OAAOa,cAAP,CAAsB,iBAAKV,QAAQQ,KAAR,CAAcC,SAAnB,CAA8B,CAACE,MAAO,EAAR,CAA9B,CAAtB,CAAkEX,QAAQQ,KAA1E,CACA,CAFD,IAEO,CACNX,OAAOe,WAAP,CAAmBZ,OAAnB,CACA,CACD,CAtB+B,iBAajBa,IAbiB,8CAChC,MAAO,CACNC,YAAa,sBADP,CAENR,QAFM,CAGNO,GAHM,CAAP,CAsBA,QAASd,aAAT,CAAsBF,MAAtB,CAA8B,CAC7B,GAAIkB,iBAAJ,CACAlB,OAAOmB,MAAP,CAAcC,OAAd,CAAsBf,KAAO,CAC5Ba,iBAAmB,CAACG,mBAAmBhB,GAAnB,CAAD,CAA0BiB,oBAAoBjB,GAApB,CAA1B,CAAoDkB,eAAelB,GAAf,CAApD,CACnB,CAFD,EAGA,MAAOa,iBACP,CAED,QAASG,mBAAT,CAA4BV,KAA5B,CAAmC,CAClC,KAAMV,QAAS,SAAWU,MAAX,EAAoBA,MAAMG,KAAN,CAAYU,MAAZ,GAAuB,CAA1D,CACA,MAAOvB,UAAW,KAAX,CAAmB,CAACK,MAAO,IAAR,CAAnB,CAAmC,CAACA,MAAO,KAAR,CAAeE,SAAU,CAAE,SAAQG,MAAMc,GAAI,kBAApB,CAAzB,CAAiEd,KAAjE,CAC1C,CAED,QAASY,eAAT,CAAwBZ,KAAxB,CAA+B,CAC9B,KAAMV,QAASU,MAAMC,SAAN,EAAmBD,MAAMC,SAAN,CAAgBY,MAAhB,GAA2B,CAA7D,CACA,MAAOvB,UAAW,KAAX,CAAmB,CAACK,MAAO,IAAR,CAAnB,CAAmC,CAACA,MAAO,KAAR,CAAeE,SAAU,CAAE,SAAQG,MAAMc,GAAI,mBAApB,CAAzB,CAAkEd,KAAlE,CAC1C,CAED,QAASW,oBAAT,CAA6BX,KAA7B,CAAoC,CACnC,GAAIA,MAAMC,SAAV,CAAqB,CACpB,KAAMX,QAASU,MAAMC,SAAN,CAAgBc,MAAhB,CAAuBC,UAAYA,SAASb,KAAT,CAAeU,MAAf,GAA0B,CAA7D,CAAf,CACA,MAAOvB,QAAOuB,MAAP,GAAkB,CAAlB,CAAsB,CAAClB,MAAO,IAAR,CAAtB,CAAsC,CAACA,MAAO,KAAR,CAAeE,SAAUP,OAAO2B,GAAP,CAAWC,MAAS,SAAQlB,MAAMc,GAAI,IAAGI,KAAKC,IAAK,kBAAnD,CAAzB,CAAgGnB,KAAhG,CAC7C,CACD,CACD,C","file":"empty-fields.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/**\n* DEPRECATED: This validator is not needed because @natlibfi/marc-record doesn't allow fields with empty values\n*/\n\n/* eslint-disable require-await */\nimport {find, isEmpty, omit} from 'lodash';\n\nexport default async function () {\n\treturn {\n\t\tdescription: 'Handles empty fields',\n\t\tvalidate,\n\t\tfix\n\t};\n\n\tasync function validate(record) {\n\t\tconst result = searchFields(record);\n\t\tconst isValid = result.find(obj => obj.valid === false);\n\t\treturn isValid === undefined ? {valid: true, messages: []} : omit(isValid, ['field']);\n\t}\n\n\tasync function fix(record) {\n\t\tconst fixFields = searchFields(record);\n\t\tconst isValid = fixFields.find(obj => obj.valid === false);\n\n\t\tif ('subfields' in isValid.field && !isEmpty(isValid.field.subfields)) {\n\t\t\trecord.removeSubfield(find(isValid.field.subfields, {value: ''}), isValid.field);\n\t\t} else {\n\t\t\trecord.removeField(isValid);\n\t\t}\n\t}\n\tfunction searchFields(record) {\n\t\tlet validationResult;\n\t\trecord.fields.forEach(obj => {\n\t\t\tvalidationResult = [emptyControlFields(obj), emptySubfieldValues(obj), emptySubfields(obj)];\n\t\t});\n\t\treturn validationResult;\n\t}\n\n\tfunction emptyControlFields(field) {\n\t\tconst result = 'value' in field && field.value.length === 0;\n\t\treturn result === false ? {valid: true} : {valid: false, messages: [`Field ${field.tag} has empty value`], field};\n\t}\n\n\tfunction emptySubfields(field) {\n\t\tconst result = field.subfields && field.subfields.length === 0;\n\t\treturn result === false ? {valid: true} : {valid: false, messages: [`Field ${field.tag} has no subfields`], field};\n\t}\n\n\tfunction emptySubfieldValues(field) {\n\t\tif (field.subfields) {\n\t\t\tconst result = field.subfields.filter(subfield => subfield.value.length === 0);\n\t\t\treturn result.length === 0 ? {valid: true} : {valid: false, messages: result.map(item => `Field ${field.tag}$${item.code} has empty value`), field};\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"empty-fields.js","names":["ERRORS","EMPTY_SUBFIELDS","MISSING_SUBFIELD_VALUES","_default","description","validate","fix","record","errors","findErrors","fields","length","valid","messages","map","error","code","field","tag","emptySubfields","sf","join","forEach","subfields","removeField","removeSubfield","reduce","concat","subfieldsWithoutValue","filter","value"],"sources":["../src/empty-fields.js"],"sourcesContent":["const ERRORS = {\n EMPTY_SUBFIELDS: 2,\n MISSING_SUBFIELD_VALUES: 3\n};\n\nexport default function () {\n return {\n description: 'Handles empty fields',\n validate,\n fix\n };\n\n function validate(record) {\n const errors = findErrors(record.fields);\n if (errors.length > 0) {\n return {\n valid: false,\n messages: errors.map(error => { // eslint-disable-line array-callback-return\n switch (error.code) {\n case ERRORS.EMPTY_SUBFIELDS:\n return `Field ${error.field.tag} has no subfields`;\n case ERRORS.MISSING_SUBFIELD_VALUES:\n return `Field ${error.field.tag} has missing subfield values: ${error.emptySubfields.map(sf => sf.code).join()}`;\n default:\n }\n })\n };\n }\n\n return {valid: true};\n }\n\n function fix(record) {\n const errors = findErrors(record.fields);\n errors.forEach(error => {\n if (error.code === ERRORS.MISSING_SUBFIELD_VALUES) { // eslint-disable-line functional/no-conditional-statements\n if (error.emptySubfields.length === error.field.subfields.length) { // eslint-disable-line functional/no-conditional-statements\n record.removeField(error.field);\n } else { // eslint-disable-line functional/no-conditional-statements\n error.emptySubfields.forEach(sf => {\n record.removeSubfield(sf, error.field);\n });\n }\n } else { // eslint-disable-line functional/no-conditional-statements\n record.removeField(error.field);\n }\n });\n }\n\n function findErrors(fields) {\n return fields.reduce((errors, field) => {\n if (field.subfields) {\n if (field.subfields.length === 0) {\n return errors.concat({field, code: ERRORS.EMPTY_SUBFIELDS});\n }\n\n const subfieldsWithoutValue = field.subfields.filter(sf => !sf.value);\n\n if (subfieldsWithoutValue.length > 0) {\n return errors.concat({\n field,\n emptySubfields: subfieldsWithoutValue,\n code: ERRORS.MISSING_SUBFIELD_VALUES\n });\n }\n }\n\n return errors;\n }, []);\n }\n}\n"],"mappings":";;;;;;AAAA,MAAMA,MAAM,GAAG;EACbC,eAAe,EAAE,CAAC;EAClBC,uBAAuB,EAAE;AAC3B,CAAC;AAEc,SAAAC,SAAA,EAAY;EACzB,OAAO;IACLC,WAAW,EAAE,sBAAsB;IACnCC,QAAQ;IACRC;EACF,CAAC;EAED,SAASD,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAMC,MAAM,GAAGC,UAAU,CAACF,MAAM,CAACG,MAAM,CAAC;IACxC,IAAIF,MAAM,CAACG,MAAM,GAAG,CAAC,EAAE;MACrB,OAAO;QACLC,KAAK,EAAE,KAAK;QACZC,QAAQ,EAAEL,MAAM,CAACM,GAAG,CAACC,KAAK,IAAI;UAAE;UAC9B,QAAQA,KAAK,CAACC,IAAI;YAClB,KAAKhB,MAAM,CAACC,eAAe;cACzB,OAAQ,SAAQc,KAAK,CAACE,KAAK,CAACC,GAAI,mBAAkB;YACpD,KAAKlB,MAAM,CAACE,uBAAuB;cACjC,OAAQ,SAAQa,KAAK,CAACE,KAAK,CAACC,GAAI,iCAAgCH,KAAK,CAACI,cAAc,CAACL,GAAG,CAACM,EAAE,IAAIA,EAAE,CAACJ,IAAI,CAAC,CAACK,IAAI,CAAC,CAAE,EAAC;YAClH;UACA;QACF,CAAC;MACH,CAAC;IACH;IAEA,OAAO;MAACT,KAAK,EAAE;IAAI,CAAC;EACtB;EAEA,SAASN,GAAGA,CAACC,MAAM,EAAE;IACnB,MAAMC,MAAM,GAAGC,UAAU,CAACF,MAAM,CAACG,MAAM,CAAC;IACxCF,MAAM,CAACc,OAAO,CAACP,KAAK,IAAI;MACtB,IAAIA,KAAK,CAACC,IAAI,KAAKhB,MAAM,CAACE,uBAAuB,EAAE;QAAE;QACnD,IAAIa,KAAK,CAACI,cAAc,CAACR,MAAM,KAAKI,KAAK,CAACE,KAAK,CAACM,SAAS,CAACZ,MAAM,EAAE;UAAE;UAClEJ,MAAM,CAACiB,WAAW,CAACT,KAAK,CAACE,KAAK,CAAC;QACjC,CAAC,MAAM;UAAE;UACPF,KAAK,CAACI,cAAc,CAACG,OAAO,CAACF,EAAE,IAAI;YACjCb,MAAM,CAACkB,cAAc,CAACL,EAAE,EAAEL,KAAK,CAACE,KAAK,CAAC;UACxC,CAAC,CAAC;QACJ;MACF,CAAC,MAAM;QAAE;QACPV,MAAM,CAACiB,WAAW,CAACT,KAAK,CAACE,KAAK,CAAC;MACjC;IACF,CAAC,CAAC;EACJ;EAEA,SAASR,UAAUA,CAACC,MAAM,EAAE;IAC1B,OAAOA,MAAM,CAACgB,MAAM,CAAC,CAAClB,MAAM,EAAES,KAAK,KAAK;MACtC,IAAIA,KAAK,CAACM,SAAS,EAAE;QACnB,IAAIN,KAAK,CAACM,SAAS,CAACZ,MAAM,KAAK,CAAC,EAAE;UAChC,OAAOH,MAAM,CAACmB,MAAM,CAAC;YAACV,KAAK;YAAED,IAAI,EAAEhB,MAAM,CAACC;UAAe,CAAC,CAAC;QAC7D;QAEA,MAAM2B,qBAAqB,GAAGX,KAAK,CAACM,SAAS,CAACM,MAAM,CAACT,EAAE,IAAI,CAACA,EAAE,CAACU,KAAK,CAAC;QAErE,IAAIF,qBAAqB,CAACjB,MAAM,GAAG,CAAC,EAAE;UACpC,OAAOH,MAAM,CAACmB,MAAM,CAAC;YACnBV,KAAK;YACLE,cAAc,EAAES,qBAAqB;YACrCZ,IAAI,EAAEhB,MAAM,CAACE;UACf,CAAC,CAAC;QACJ;MACF;MAEA,OAAOM,MAAM;IACf,CAAC,EAAE,EAAE,CAAC;EACR;AACF"}
@@ -1,28 +1,114 @@
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 _marcRecord=require('@natlibfi/marc-record');var _emptyFields=require('../src/empty-fields');var _emptyFields2=_interopRequireDefault(_emptyFields);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')})}}describe.skip('empty-fields **DEPRECATED**',()=>{it('Creates a validator',_asyncToGenerator(function*(){const validator=yield(0,_emptyFields2.default)();(0,_chai.expect)(validator).to.be.an('object').that.has.any.keys('description','validate');(0,_chai.expect)(validator.description).to.be.a('string');(0,_chai.expect)(validator.validate).to.be.a('function')}));describe('#validate',()=>{it('Finds the record valid',_asyncToGenerator(function*(){const validator=yield(0,_emptyFields2.default)();const record=new _marcRecord.MarcRecord({fields:[{tag:'001',value:'1234567',subfields:[{code:'a',value:'foo'}]}]});const result=yield validator.validate(record);(0,_chai.expect)(result).to.eql({valid:true,messages:[]})}));it('Finds an empty tag value',_asyncToGenerator(function*(){const validator=yield(0,_emptyFields2.default)();const record=new _marcRecord.MarcRecord({fields:[{tag:'008',value:'',subfields:[{code:'a',value:'foo'}]}]});const result=yield validator.validate(record);(0,_chai.expect)(result).to.eql({valid:false,messages:['Field 008 has empty value']})}));it('Finds an empty subfield value',_asyncToGenerator(function*(){const validator=yield(0,_emptyFields2.default)();const record=new _marcRecord.MarcRecord({fields:[{tag:'245',subfields:[{code:'a',value:''}]}]});const result=yield validator.validate(record);(0,_chai.expect)(result).to.eql({valid:false,messages:['Field 245$a has empty value']})}));it('Finds an empty subfield array',_asyncToGenerator(function*(){const validator=yield(0,_emptyFields2.default)();const record=new _marcRecord.MarcRecord({fields:[{tag:'500',subfields:[]}]});const result=yield validator.validate(record);(0,_chai.expect)(result).to.eql({valid:false,messages:['Field 500 has no subfields']})}))});describe('#fix',()=>{it('Removes tag with empty value',_asyncToGenerator(function*(){const validator=yield(0,_emptyFields2.default)();const record=new _marcRecord.MarcRecord({fields:[{tag:'001',value:'1234567'},{tag:'008',value:''}]});yield validator.fix(record);(0,_chai.expect)(record.fields).to.eql([{tag:'001',value:'1234567'}])}));it('Removes an empty value inside subfields array',_asyncToGenerator(function*(){const validator=yield(0,_emptyFields2.default)();const record=new _marcRecord.MarcRecord({fields:[{tag:'245',subfields:[{code:'a',value:'foo'},{code:'b',value:''}]}]});yield validator.fix(record);(0,_chai.expect)(record.fields).to.eql([{tag:'245',ind1:' ',ind2:' ',subfields:[{code:'a',value:'foo'}]}])}));it('Removes an empty subfields array',_asyncToGenerator(function*(){const validator=yield(0,_emptyFields2.default)();const record=new _marcRecord.MarcRecord({fields:[{tag:'001',value:'1234567'},{tag:'500',subfields:[]}]});yield validator.fix(record);(0,_chai.expect)(record.fields).to.eql([{tag:'001',value:'1234567'}])}))})});
1
+ "use strict";
2
+
3
+ var _chai = require("chai");
4
+ var _marcRecord = require("@natlibfi/marc-record");
5
+ var _emptyFields = _interopRequireDefault(require("../src/empty-fields"));
6
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
7
+ before(() => {
8
+ _marcRecord.MarcRecord.setValidationOptions({
9
+ subfields: false,
10
+ subfieldValues: false
11
+ });
12
+ });
13
+ after(() => {
14
+ _marcRecord.MarcRecord.setValidationOptions({});
15
+ });
16
+ describe('empty-fields', () => {
17
+ it('Creates a validator', async () => {
18
+ const validator = await (0, _emptyFields.default)();
19
+ (0, _chai.expect)(validator).to.be.an('object').that.has.any.keys('description', 'validate');
20
+ (0, _chai.expect)(validator.description).to.be.a('string');
21
+ (0, _chai.expect)(validator.validate).to.be.a('function');
22
+ });
23
+ describe('#validate', () => {
24
+ it('Finds the record valid', async () => {
25
+ const validator = await (0, _emptyFields.default)();
26
+ const record = new _marcRecord.MarcRecord({
27
+ fields: [{
28
+ tag: '001',
29
+ value: '1234567',
30
+ subfields: [{
31
+ code: 'a',
32
+ value: 'foo'
33
+ }]
34
+ }]
35
+ });
36
+ const result = await validator.validate(record);
37
+ (0, _chai.expect)(result).to.to.have.property('valid', true);
38
+ });
39
+ it('Finds a missing subfield value', async () => {
40
+ const validator = await (0, _emptyFields.default)();
41
+ const record = new _marcRecord.MarcRecord({
42
+ fields: [{
43
+ tag: '245',
44
+ subfields: [{
45
+ code: 'a'
46
+ }]
47
+ }]
48
+ });
49
+ const result = await validator.validate(record);
50
+ (0, _chai.expect)(result).to.eql({
51
+ valid: false,
52
+ messages: ['Field 245 has missing subfield values: a']
53
+ });
54
+ });
55
+ it('Finds an empty subfield array', async () => {
56
+ const validator = await (0, _emptyFields.default)();
57
+ const record = new _marcRecord.MarcRecord({
58
+ fields: [{
59
+ tag: '500',
60
+ subfields: []
61
+ }]
62
+ });
63
+ const result = await validator.validate(record);
64
+ (0, _chai.expect)(result).to.eql({
65
+ valid: false,
66
+ messages: ['Field 500 has no subfields']
67
+ });
68
+ });
69
+ });
70
+ describe('#fix', () => {
71
+ it('Removes a subfield with missing value', async () => {
72
+ const validator = await (0, _emptyFields.default)();
73
+ const record = new _marcRecord.MarcRecord({
74
+ fields: [{
75
+ tag: '245',
76
+ subfields: [{
77
+ code: 'a',
78
+ value: 'foo'
79
+ }, {
80
+ code: 'b'
81
+ }]
82
+ }]
83
+ });
84
+ await validator.fix(record);
85
+ (0, _chai.expect)(record.fields).to.eql([{
86
+ tag: '245',
87
+ ind1: ' ',
88
+ ind2: ' ',
89
+ subfields: [{
90
+ code: 'a',
91
+ value: 'foo'
92
+ }]
93
+ }]);
94
+ });
95
+ it('Removes a field with no subfields', async () => {
96
+ const validator = await (0, _emptyFields.default)();
97
+ const record = new _marcRecord.MarcRecord({
98
+ fields: [{
99
+ tag: '001',
100
+ value: '1234567'
101
+ }, {
102
+ tag: '500',
103
+ subfields: []
104
+ }]
105
+ });
106
+ await validator.fix(record);
107
+ (0, _chai.expect)(record.fields).to.eql([{
108
+ tag: '001',
109
+ value: '1234567'
110
+ }]);
111
+ });
112
+ });
113
+ });
28
114
  //# sourceMappingURL=empty-fields.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/empty-fields.spec.js"],"names":["describe","skip","it","validator","to","be","an","that","has","any","keys","description","a","validate","record","MarcRecord","fields","tag","value","subfields","code","result","eql","valid","messages","fix","ind1","ind2"],"mappings":"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","file":"empty-fields.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 {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/empty-fields';\n\ndescribe.skip('empty-fields **DEPRECATED**', () => {\n\tit('Creates a validator', async () => {\n\t\tconst validator = await validatorFactory();\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\tdescribe('#validate', () => {\n\t\tit('Finds the record valid', async () => {\n\t\t\tconst validator = await validatorFactory();\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: '1234567',\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: 'foo'\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\t\t\texpect(result).to.eql({valid: true, messages: []});\n\t\t});\n\n\t\tit('Finds an empty tag value', async () => {\n\t\t\tconst validator = await validatorFactory();\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: '008',\n\t\t\t\t\t\tvalue: '',\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: 'foo'\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 008 has empty value']});\n\t\t});\n\n\t\tit('Finds an empty subfield value', async () => {\n\t\t\tconst validator = await validatorFactory();\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: '245',\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: ''\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 245$a has empty value']});\n\t\t});\n\n\t\tit('Finds an empty subfield array', async () => {\n\t\t\tconst validator = await validatorFactory();\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: '500',\n\t\t\t\t\t\tsubfields: [\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 500 has no subfields']});\n\t\t});\n\t});\n\n\tdescribe('#fix', () => {\n\t\tit('Removes tag with empty value', async () => {\n\t\t\tconst validator = await validatorFactory();\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: '1234567'\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '008',\n\t\t\t\t\t\tvalue: ''\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t});\n\t\t\tawait validator.fix(record);\n\n\t\t\texpect(record.fields).to.eql([\n\t\t\t\t{\n\t\t\t\t\ttag: '001',\n\t\t\t\t\tvalue: '1234567'\n\t\t\t\t}\n\t\t\t]);\n\t\t});\n\n\t\tit('Removes an empty value inside subfields array', async () => {\n\t\t\tconst validator = await validatorFactory();\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: '245',\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: 'foo'\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: 'b',\n\t\t\t\t\t\t\t\tvalue: ''\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\tawait validator.fix(record);\n\n\t\t\texpect(record.fields).to.eql(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '245',\n\t\t\t\t\t\tind1: ' ',\n\t\t\t\t\t\tind2: ' ',\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: 'foo'\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});\n\n\t\tit('Removes an empty subfields array', async () => {\n\t\t\tconst validator = await validatorFactory();\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: '1234567'\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttag: '500',\n\t\t\t\t\t\tsubfields: [\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\tawait validator.fix(record);\n\n\t\t\texpect(record.fields).to.eql([\n\t\t\t\t{\n\t\t\t\t\ttag: '001',\n\t\t\t\t\tvalue: '1234567'\n\t\t\t\t}\n\t\t\t]);\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"empty-fields.spec.js","names":["_chai","require","_marcRecord","_emptyFields","_interopRequireDefault","obj","__esModule","default","before","MarcRecord","setValidationOptions","subfields","subfieldValues","after","describe","it","validator","validatorFactory","expect","to","be","an","that","has","any","keys","description","a","validate","record","fields","tag","value","code","result","have","property","eql","valid","messages","fix","ind1","ind2"],"sources":["../src/empty-fields.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/empty-fields';\n\nbefore(() => {\n MarcRecord.setValidationOptions({subfields: false, subfieldValues: false});\n});\n\nafter(() => {\n MarcRecord.setValidationOptions({});\n});\n\ndescribe('empty-fields', () => {\n it('Creates a validator', async () => {\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\n describe('#validate', () => {\n it('Finds the record valid', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '1234567',\n subfields: [\n {\n code: 'a',\n value: 'foo'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n expect(result).to.to.have.property('valid', true);\n });\n\n it('Finds a missing subfield value', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '245',\n subfields: [\n {\n code: 'a'\n }\n ]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: false, messages: ['Field 245 has missing subfield values: a']});\n });\n\n it('Finds an empty subfield array', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '500',\n subfields: []\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: false, messages: ['Field 500 has no subfields']});\n });\n });\n\n describe('#fix', () => {\n it('Removes a subfield with missing value', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '245',\n subfields: [\n {\n code: 'a',\n value: 'foo'\n },\n {\n code: 'b'\n }\n ]\n }\n ]\n });\n await validator.fix(record);\n\n expect(record.fields).to.eql([\n {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'foo'\n }\n ]\n }\n ]);\n });\n\n it('Removes a field with no subfields', async () => {\n const validator = await validatorFactory();\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n value: '1234567'\n },\n {\n tag: '500',\n subfields: []\n }\n ]\n });\n await validator.fix(record);\n\n expect(record.fields).to.eql([\n {\n tag: '001',\n value: '1234567'\n }\n ]);\n });\n });\n});\n"],"mappings":"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"}