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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (593) hide show
  1. package/.github/CODEOWNERS +2 -0
  2. package/.github/dependabot.yml +40 -0
  3. package/.github/workflows/melinda-node-tests.yml +61 -0
  4. package/LICENSE.txt +21 -661
  5. package/README.md +4 -5
  6. package/dist/access-rights.js +94 -0
  7. package/dist/access-rights.js.map +1 -0
  8. package/dist/access-rights.spec.js +150 -0
  9. package/dist/access-rights.spec.js.map +1 -0
  10. package/dist/double-commas.js +17 -27
  11. package/dist/double-commas.js.map +1 -1
  12. package/dist/double-commas.spec.js +72 -27
  13. package/dist/double-commas.spec.js.map +1 -1
  14. package/dist/duplicates-ind1.js +47 -27
  15. package/dist/duplicates-ind1.js.map +1 -1
  16. package/dist/duplicates-ind1.spec.js +44 -27
  17. package/dist/duplicates-ind1.spec.js.map +1 -1
  18. package/dist/empty-fields.js +79 -29
  19. package/dist/empty-fields.js.map +1 -1
  20. package/dist/empty-fields.spec.js +113 -27
  21. package/dist/empty-fields.spec.js.map +1 -1
  22. package/dist/ending-punctuation-conf.js +772 -129
  23. package/dist/ending-punctuation-conf.js.map +1 -1
  24. package/dist/ending-punctuation.js +291 -72
  25. package/dist/ending-punctuation.js.map +1 -1
  26. package/dist/ending-punctuation.spec.js +2638 -118
  27. package/dist/ending-punctuation.spec.js.map +1 -1
  28. package/dist/ending-whitespace.js +58 -0
  29. package/dist/ending-whitespace.js.map +1 -0
  30. package/dist/ending-whitespace.spec.js +42 -0
  31. package/dist/ending-whitespace.spec.js.map +1 -0
  32. package/dist/field-521-fix.js +96 -0
  33. package/dist/field-521-fix.js.map +1 -0
  34. package/dist/field-521-fix.spec.js +51 -0
  35. package/dist/field-521-fix.spec.js.map +1 -0
  36. package/dist/field-exclusion.js +214 -63
  37. package/dist/field-exclusion.js.map +1 -1
  38. package/dist/field-exclusion.spec.js +1057 -31
  39. package/dist/field-exclusion.spec.js.map +1 -1
  40. package/dist/field-structure.js +249 -78
  41. package/dist/field-structure.js.map +1 -1
  42. package/dist/field-structure.spec.js +534 -31
  43. package/dist/field-structure.spec.js.map +1 -1
  44. package/dist/fields-present.js +31 -27
  45. package/dist/fields-present.js.map +1 -1
  46. package/dist/fields-present.spec.js +120 -27
  47. package/dist/fields-present.spec.js.map +1 -1
  48. package/dist/fixed-fields.js +72 -27
  49. package/dist/fixed-fields.js.map +1 -1
  50. package/dist/fixed-fields.spec.js +139 -27
  51. package/dist/fixed-fields.spec.js.map +1 -1
  52. package/dist/identical-fields.js +42 -28
  53. package/dist/identical-fields.js.map +1 -1
  54. package/dist/identical-fields.spec.js +98 -27
  55. package/dist/identical-fields.spec.js.map +1 -1
  56. package/dist/index.js +202 -27
  57. package/dist/index.js.map +1 -1
  58. package/dist/indicator-fixes.js +191 -0
  59. package/dist/indicator-fixes.js.map +1 -0
  60. package/dist/indicator-fixes.spec.js +51 -0
  61. package/dist/indicator-fixes.spec.js.map +1 -0
  62. package/dist/isbn-issn.js +266 -27
  63. package/dist/isbn-issn.js.map +1 -1
  64. package/dist/isbn-issn.spec.js +594 -27
  65. package/dist/isbn-issn.spec.js.map +1 -1
  66. package/dist/item-language.js +171 -27
  67. package/dist/item-language.js.map +1 -1
  68. package/dist/item-language.spec.js +305 -27
  69. package/dist/item-language.spec.js.map +1 -1
  70. package/dist/mergeField500Lisapainokset.js +155 -0
  71. package/dist/mergeField500Lisapainokset.js.map +1 -0
  72. package/dist/mergeField500Lisapainokset.spec.js +51 -0
  73. package/dist/mergeField500Lisapainokset.spec.js.map +1 -0
  74. package/dist/mergeRelatorTermFields.js +140 -0
  75. package/dist/mergeRelatorTermFields.js.map +1 -0
  76. package/dist/mergeRelatorTermFields.spec.js +51 -0
  77. package/dist/mergeRelatorTermFields.spec.js.map +1 -0
  78. package/dist/multiple-subfield-0.js +120 -0
  79. package/dist/multiple-subfield-0.js.map +1 -0
  80. package/dist/multiple-subfield-0.spec.js +51 -0
  81. package/dist/multiple-subfield-0.spec.js.map +1 -0
  82. package/dist/non-breaking-space.js +61 -0
  83. package/dist/non-breaking-space.js.map +1 -0
  84. package/dist/non-breaking-space.spec.js +42 -0
  85. package/dist/non-breaking-space.spec.js.map +1 -0
  86. package/dist/normalize-identifiers.js +210 -0
  87. package/dist/normalize-identifiers.js.map +1 -0
  88. package/dist/normalize-identifiers.spec.js +51 -0
  89. package/dist/normalize-identifiers.spec.js.map +1 -0
  90. package/dist/normalize-utf8-diacritics.js +140 -0
  91. package/dist/normalize-utf8-diacritics.js.map +1 -0
  92. package/dist/normalize-utf8-diacritics.spec.js +51 -0
  93. package/dist/normalize-utf8-diacritics.spec.js.map +1 -0
  94. package/dist/punctuation/index.js +281 -0
  95. package/dist/punctuation/index.js.map +1 -0
  96. package/dist/punctuation/rules/aut.js +332 -0
  97. package/dist/punctuation/rules/aut.js.map +1 -0
  98. package/dist/punctuation/rules/bib.js +374 -0
  99. package/dist/punctuation/rules/bib.js.map +1 -0
  100. package/dist/punctuation/rules/index.js +21 -0
  101. package/dist/punctuation/rules/index.js.map +1 -0
  102. package/dist/punctuation.spec.js +51 -0
  103. package/dist/punctuation.spec.js.map +1 -0
  104. package/dist/punctuation2.js +726 -0
  105. package/dist/punctuation2.js.map +1 -0
  106. package/dist/punctuation2.spec.js +51 -0
  107. package/dist/punctuation2.spec.js.map +1 -0
  108. package/dist/reindexSubfield6OccurenceNumbers.js +199 -0
  109. package/dist/reindexSubfield6OccurenceNumbers.js.map +1 -0
  110. package/dist/reindexSubfield6OccurenceNumbers.spec.js +51 -0
  111. package/dist/reindexSubfield6OccurenceNumbers.spec.js.map +1 -0
  112. package/dist/removeDuplicateDataFields.js +405 -0
  113. package/dist/removeDuplicateDataFields.js.map +1 -0
  114. package/dist/removeDuplicateDataFields.spec.js +51 -0
  115. package/dist/removeDuplicateDataFields.spec.js.map +1 -0
  116. package/dist/removeInferiorDataFields.js +245 -0
  117. package/dist/removeInferiorDataFields.js.map +1 -0
  118. package/dist/removeInferiorDataFields.spec.js +51 -0
  119. package/dist/removeInferiorDataFields.spec.js.map +1 -0
  120. package/dist/resolvable-ext-references-melinda.js +112 -31
  121. package/dist/resolvable-ext-references-melinda.js.map +1 -1
  122. package/dist/resolvable-ext-references-melinda.spec.js +166 -27
  123. package/dist/resolvable-ext-references-melinda.spec.js.map +1 -1
  124. package/dist/resolveOrphanedSubfield6s.js +116 -0
  125. package/dist/resolveOrphanedSubfield6s.js.map +1 -0
  126. package/dist/resolveOrphanedSubfield6s.spec.js +51 -0
  127. package/dist/resolveOrphanedSubfield6s.spec.js.map +1 -0
  128. package/dist/sanitize-vocabulary-source-codes.js +93 -0
  129. package/dist/sanitize-vocabulary-source-codes.js.map +1 -0
  130. package/dist/sanitize-vocabulary-source-codes.spec.js +51 -0
  131. package/dist/sanitize-vocabulary-source-codes.spec.js.map +1 -0
  132. package/dist/sort-tags.js +53 -27
  133. package/dist/sort-tags.js.map +1 -1
  134. package/dist/sort-tags.spec.js +206 -27
  135. package/dist/sort-tags.spec.js.map +1 -1
  136. package/dist/sortRelatorTerms.js +135 -0
  137. package/dist/sortRelatorTerms.js.map +1 -0
  138. package/dist/sortRelatorTerms.spec.js +51 -0
  139. package/dist/sortRelatorTerms.spec.js.map +1 -0
  140. package/dist/sortSubfields.js +279 -0
  141. package/dist/sortSubfields.js.map +1 -0
  142. package/dist/sortSubfields.spec.js +51 -0
  143. package/dist/sortSubfields.spec.js.map +1 -0
  144. package/dist/stripPunctuation.js +49 -0
  145. package/dist/stripPunctuation.js.map +1 -0
  146. package/dist/stripPunctuation.spec.js +51 -0
  147. package/dist/stripPunctuation.spec.js.map +1 -0
  148. package/dist/subfield-exclusion.js +174 -57
  149. package/dist/subfield-exclusion.js.map +1 -1
  150. package/dist/subfield-exclusion.spec.js +521 -31
  151. package/dist/subfield-exclusion.spec.js.map +1 -1
  152. package/dist/subfield6Utils.js +457 -0
  153. package/dist/subfield6Utils.js.map +1 -0
  154. package/dist/subfield8Utils.js +99 -0
  155. package/dist/subfield8Utils.js.map +1 -0
  156. package/dist/typeOfDate-008.js +48 -0
  157. package/dist/typeOfDate-008.js.map +1 -0
  158. package/dist/typeOfDate-008.spec.js +47 -0
  159. package/dist/typeOfDate-008.spec.js.map +1 -0
  160. package/dist/unicode-decomposition.js +139 -30
  161. package/dist/unicode-decomposition.js.map +1 -1
  162. package/dist/unicode-decomposition.spec.js +90 -27
  163. package/dist/unicode-decomposition.spec.js.map +1 -1
  164. package/dist/update-field-540.js +119 -0
  165. package/dist/update-field-540.js.map +1 -0
  166. package/dist/update-field-540.spec.js +51 -0
  167. package/dist/update-field-540.spec.js.map +1 -0
  168. package/dist/urn.js +185 -0
  169. package/dist/urn.js.map +1 -0
  170. package/dist/urn.spec.js +238 -0
  171. package/dist/urn.spec.js.map +1 -0
  172. package/dist/utils.js +58 -0
  173. package/dist/utils.js.map +1 -0
  174. package/package.json +114 -124
  175. package/src/access-rights.js +84 -0
  176. package/src/access-rights.spec.js +126 -0
  177. package/src/double-commas.js +12 -49
  178. package/src/double-commas.spec.js +50 -82
  179. package/src/duplicates-ind1.js +34 -74
  180. package/src/duplicates-ind1.spec.js +39 -117
  181. package/src/empty-fields.js +62 -74
  182. package/src/empty-fields.spec.js +134 -207
  183. package/src/ending-punctuation-conf.js +679 -644
  184. package/src/ending-punctuation.js +260 -250
  185. package/src/ending-punctuation.spec.js +2545 -2322
  186. package/src/ending-whitespace.js +40 -0
  187. package/src/ending-whitespace.spec.js +44 -0
  188. package/src/field-521-fix.js +92 -0
  189. package/src/field-521-fix.spec.js +52 -0
  190. package/src/field-exclusion.js +197 -215
  191. package/src/field-exclusion.spec.js +883 -481
  192. package/src/field-structure.js +213 -271
  193. package/src/field-structure.spec.js +597 -474
  194. package/src/fields-present.js +19 -49
  195. package/src/fields-present.spec.js +90 -91
  196. package/src/fixed-fields.js +61 -94
  197. package/src/fixed-fields.spec.js +81 -125
  198. package/src/identical-fields.js +29 -48
  199. package/src/identical-fields.spec.js +114 -146
  200. package/src/index.js +41 -46
  201. package/src/indicator-fixes.js +211 -0
  202. package/src/indicator-fixes.spec.js +52 -0
  203. package/src/isbn-issn.js +254 -106
  204. package/src/isbn-issn.spec.js +399 -172
  205. package/src/item-language.js +158 -195
  206. package/src/item-language.spec.js +314 -306
  207. package/src/mergeField500Lisapainokset.js +153 -0
  208. package/src/mergeField500Lisapainokset.spec.js +52 -0
  209. package/src/mergeRelatorTermFields.js +143 -0
  210. package/src/mergeRelatorTermFields.spec.js +52 -0
  211. package/src/multiple-subfield-0.js +129 -0
  212. package/src/multiple-subfield-0.spec.js +52 -0
  213. package/src/non-breaking-space.js +49 -0
  214. package/src/non-breaking-space.spec.js +44 -0
  215. package/src/normalize-identifiers.js +197 -0
  216. package/src/normalize-identifiers.spec.js +52 -0
  217. package/src/normalize-utf8-diacritics.js +141 -0
  218. package/src/normalize-utf8-diacritics.spec.js +52 -0
  219. package/src/punctuation/index.js +292 -0
  220. package/src/punctuation/rules/aut.js +372 -0
  221. package/src/punctuation/rules/bib.js +420 -0
  222. package/src/punctuation/rules/index.js +7 -0
  223. package/src/punctuation.spec.js +52 -0
  224. package/src/punctuation2.js +441 -0
  225. package/src/punctuation2.spec.js +52 -0
  226. package/src/reindexSubfield6OccurenceNumbers.js +210 -0
  227. package/src/reindexSubfield6OccurenceNumbers.spec.js +52 -0
  228. package/src/removeDuplicateDataFields.js +447 -0
  229. package/src/removeDuplicateDataFields.spec.js +52 -0
  230. package/src/removeInferiorDataFields.js +259 -0
  231. package/src/removeInferiorDataFields.spec.js +52 -0
  232. package/src/resolvable-ext-references-melinda.js +89 -122
  233. package/src/resolvable-ext-references-melinda.spec.js +168 -198
  234. package/src/resolveOrphanedSubfield6s.js +115 -0
  235. package/src/resolveOrphanedSubfield6s.spec.js +52 -0
  236. package/src/sanitize-vocabulary-source-codes.js +99 -0
  237. package/src/sanitize-vocabulary-source-codes.spec.js +52 -0
  238. package/src/sort-tags.js +34 -60
  239. package/src/sort-tags.spec.js +256 -290
  240. package/src/sortRelatorTerms.js +142 -0
  241. package/src/sortRelatorTerms.spec.js +52 -0
  242. package/src/sortSubfields.js +176 -0
  243. package/src/sortSubfields.spec.js +52 -0
  244. package/src/stripPunctuation.js +42 -0
  245. package/src/stripPunctuation.spec.js +52 -0
  246. package/src/subfield-exclusion.js +157 -180
  247. package/src/subfield-exclusion.spec.js +507 -453
  248. package/src/subfield6Utils.js +485 -0
  249. package/src/subfield8Utils.js +102 -0
  250. package/src/typeOfDate-008.js +40 -0
  251. package/src/typeOfDate-008.spec.js +47 -0
  252. package/src/unicode-decomposition.js +130 -145
  253. package/src/unicode-decomposition.spec.js +89 -115
  254. package/src/update-field-540.js +99 -0
  255. package/src/update-field-540.spec.js +52 -0
  256. package/src/urn.js +164 -0
  257. package/src/urn.spec.js +231 -0
  258. package/src/utils.js +52 -0
  259. package/test-fixtures/duplicates-ind1/01/expectedResult.json +4 -0
  260. package/test-fixtures/duplicates-ind1/01/metadata.json +4 -0
  261. package/test-fixtures/duplicates-ind1/01/record.json +16 -0
  262. package/test-fixtures/duplicates-ind1/02/expectedResult.json +6 -0
  263. package/test-fixtures/duplicates-ind1/02/metadata.json +4 -0
  264. package/test-fixtures/duplicates-ind1/02/record.json +16 -0
  265. package/test-fixtures/duplicates-ind1/03/expectedResult.json +13 -0
  266. package/test-fixtures/duplicates-ind1/03/metadata.json +6 -0
  267. package/test-fixtures/duplicates-ind1/03/record.json +16 -0
  268. package/test-fixtures/ending-whitespace/01/expectedResult.json +4 -0
  269. package/test-fixtures/ending-whitespace/01/metadata.json +6 -0
  270. package/test-fixtures/ending-whitespace/01/record.json +15 -0
  271. package/test-fixtures/ending-whitespace/02/expectedResult.json +4 -0
  272. package/test-fixtures/ending-whitespace/02/metadata.json +6 -0
  273. package/test-fixtures/ending-whitespace/02/record.json +15 -0
  274. package/test-fixtures/ending-whitespace/03/expectedResult.json +17 -0
  275. package/test-fixtures/ending-whitespace/03/metadata.json +6 -0
  276. package/test-fixtures/ending-whitespace/03/record.json +15 -0
  277. package/test-fixtures/ending-whitespace/04/expectedResult.json +10 -0
  278. package/test-fixtures/ending-whitespace/04/metadata.json +6 -0
  279. package/test-fixtures/ending-whitespace/04/record.json +8 -0
  280. package/test-fixtures/fix521/01/expectedResult.json +6 -0
  281. package/test-fixtures/fix521/01/metadata.json +5 -0
  282. package/test-fixtures/fix521/01/record.json +13 -0
  283. package/test-fixtures/fix521/02/expectedResult.json +15 -0
  284. package/test-fixtures/fix521/02/metadata.json +5 -0
  285. package/test-fixtures/fix521/02/record.json +13 -0
  286. package/test-fixtures/fix521/03/expectedResult.json +5 -0
  287. package/test-fixtures/fix521/03/metadata.json +5 -0
  288. package/test-fixtures/fix521/03/record.json +13 -0
  289. package/test-fixtures/indicator-fixes/01/expectedResult.json +9 -0
  290. package/test-fixtures/indicator-fixes/01/metadata.json +5 -0
  291. package/test-fixtures/indicator-fixes/01/record.json +64 -0
  292. package/test-fixtures/indicator-fixes/02/expectedResult.json +66 -0
  293. package/test-fixtures/indicator-fixes/02/metadata.json +5 -0
  294. package/test-fixtures/indicator-fixes/02/record.json +64 -0
  295. package/test-fixtures/indicator-fixes/03/expectedResult.json +55 -0
  296. package/test-fixtures/indicator-fixes/03/metadata.json +5 -0
  297. package/test-fixtures/indicator-fixes/03/record.json +54 -0
  298. package/test-fixtures/indicator-fixes/04/expectedResult.json +66 -0
  299. package/test-fixtures/indicator-fixes/04/metadata.json +5 -0
  300. package/test-fixtures/indicator-fixes/04/record.json +65 -0
  301. package/test-fixtures/indicator-fixes/05/expectedResult.json +66 -0
  302. package/test-fixtures/indicator-fixes/05/metadata.json +5 -0
  303. package/test-fixtures/indicator-fixes/05/record.json +65 -0
  304. package/test-fixtures/indicator-fixes/06/expectedResult.json +75 -0
  305. package/test-fixtures/indicator-fixes/06/metadata.json +5 -0
  306. package/test-fixtures/indicator-fixes/06/record.json +74 -0
  307. package/test-fixtures/lisapainokset/fixer/01/expectedResult.json +37 -0
  308. package/test-fixtures/lisapainokset/fixer/01/metadata.json +6 -0
  309. package/test-fixtures/lisapainokset/fixer/01/record.json +61 -0
  310. package/test-fixtures/lisapainokset/fixer/02/expectedResult.json +44 -0
  311. package/test-fixtures/lisapainokset/fixer/02/metadata.json +6 -0
  312. package/test-fixtures/lisapainokset/fixer/02/record.json +45 -0
  313. package/test-fixtures/lisapainokset/fixer/03/expectedResult.json +21 -0
  314. package/test-fixtures/lisapainokset/fixer/03/metadata.json +6 -0
  315. package/test-fixtures/lisapainokset/fixer/03/record.json +45 -0
  316. package/test-fixtures/lisapainokset/validator/01/expectedResult.json +7 -0
  317. package/test-fixtures/lisapainokset/validator/01/metadata.json +6 -0
  318. package/test-fixtures/lisapainokset/validator/01/record.json +45 -0
  319. package/test-fixtures/lisapainokset/validator/02/expectedResult.json +6 -0
  320. package/test-fixtures/lisapainokset/validator/02/metadata.json +6 -0
  321. package/test-fixtures/lisapainokset/validator/02/record.json +61 -0
  322. package/test-fixtures/lisapainokset/validator/03/expectedResult.json +4 -0
  323. package/test-fixtures/lisapainokset/validator/03/metadata.json +6 -0
  324. package/test-fixtures/lisapainokset/validator/03/record.json +37 -0
  325. package/test-fixtures/mergeRelatorTermFields/fixer/01/expectedResult.json +14 -0
  326. package/test-fixtures/mergeRelatorTermFields/fixer/01/metadata.json +6 -0
  327. package/test-fixtures/mergeRelatorTermFields/fixer/01/record.json +16 -0
  328. package/test-fixtures/mergeRelatorTermFields/fixer/02/expectedResult.json +17 -0
  329. package/test-fixtures/mergeRelatorTermFields/fixer/02/metadata.json +6 -0
  330. package/test-fixtures/mergeRelatorTermFields/fixer/02/record.json +23 -0
  331. package/test-fixtures/mergeRelatorTermFields/validator/01/expectedResult.json +6 -0
  332. package/test-fixtures/mergeRelatorTermFields/validator/01/metadata.json +6 -0
  333. package/test-fixtures/mergeRelatorTermFields/validator/01/record.json +16 -0
  334. package/test-fixtures/mergeRelatorTermFields/validator/02/expectedResult.json +4 -0
  335. package/test-fixtures/mergeRelatorTermFields/validator/02/metadata.json +6 -0
  336. package/test-fixtures/mergeRelatorTermFields/validator/02/record.json +16 -0
  337. package/test-fixtures/non-breaking-space/01/expectedResult.json +4 -0
  338. package/test-fixtures/non-breaking-space/01/metadata.json +6 -0
  339. package/test-fixtures/non-breaking-space/01/record.json +15 -0
  340. package/test-fixtures/non-breaking-space/02/expectedResult.json +4 -0
  341. package/test-fixtures/non-breaking-space/02/metadata.json +6 -0
  342. package/test-fixtures/non-breaking-space/02/record.json +15 -0
  343. package/test-fixtures/non-breaking-space/03/expectedResult.json +17 -0
  344. package/test-fixtures/non-breaking-space/03/metadata.json +6 -0
  345. package/test-fixtures/non-breaking-space/03/record.json +15 -0
  346. package/test-fixtures/non-breaking-space/04/expectedResult.json +21 -0
  347. package/test-fixtures/non-breaking-space/04/metadata.json +6 -0
  348. package/test-fixtures/non-breaking-space/04/record.json +19 -0
  349. package/test-fixtures/normalize-identifiers/01/expectedResult.json +8 -0
  350. package/test-fixtures/normalize-identifiers/01/metadata.json +5 -0
  351. package/test-fixtures/normalize-identifiers/01/record.json +81 -0
  352. package/test-fixtures/normalize-identifiers/02/expectedResult.json +92 -0
  353. package/test-fixtures/normalize-identifiers/02/metadata.json +5 -0
  354. package/test-fixtures/normalize-identifiers/02/record.json +92 -0
  355. package/test-fixtures/normalize-identifiers/03/expectedResult.json +63 -0
  356. package/test-fixtures/normalize-identifiers/03/metadata.json +5 -0
  357. package/test-fixtures/normalize-identifiers/03/record.json +61 -0
  358. package/test-fixtures/normalize-identifiers/04/expectedResult.json +79 -0
  359. package/test-fixtures/normalize-identifiers/04/metadata.json +5 -0
  360. package/test-fixtures/normalize-identifiers/04/record.json +77 -0
  361. package/test-fixtures/normalize-utf8-diacritics/01/expectedResult.json +7 -0
  362. package/test-fixtures/normalize-utf8-diacritics/01/metadata.json +5 -0
  363. package/test-fixtures/normalize-utf8-diacritics/01/record.json +39 -0
  364. package/test-fixtures/normalize-utf8-diacritics/02/expectedResult.json +41 -0
  365. package/test-fixtures/normalize-utf8-diacritics/02/metadata.json +5 -0
  366. package/test-fixtures/normalize-utf8-diacritics/02/record.json +39 -0
  367. package/test-fixtures/normalize-utf8-diacritics/03/expectedResult.json +5 -0
  368. package/test-fixtures/normalize-utf8-diacritics/03/metadata.json +5 -0
  369. package/test-fixtures/normalize-utf8-diacritics/03/record.json +37 -0
  370. package/test-fixtures/normalize-utf8-diacritics/04/expectedResult.json +41 -0
  371. package/test-fixtures/normalize-utf8-diacritics/04/metadata.json +5 -0
  372. package/test-fixtures/normalize-utf8-diacritics/04/record.json +39 -0
  373. package/test-fixtures/normalize-utf8-diacritics/05/expectedResult.json +41 -0
  374. package/test-fixtures/normalize-utf8-diacritics/05/metadata.json +5 -0
  375. package/test-fixtures/normalize-utf8-diacritics/05/record.json +41 -0
  376. package/test-fixtures/punctuation/01/expectedResult.json +3 -0
  377. package/test-fixtures/punctuation/01/metadata.json +4 -0
  378. package/test-fixtures/punctuation/01/record.json +18 -0
  379. package/test-fixtures/punctuation/02/expectedResult.json +3 -0
  380. package/test-fixtures/punctuation/02/metadata.json +4 -0
  381. package/test-fixtures/punctuation/02/record.json +18 -0
  382. package/test-fixtures/punctuation/03/expectedResult.json +21 -0
  383. package/test-fixtures/punctuation/03/metadata.json +5 -0
  384. package/test-fixtures/punctuation/03/record.json +19 -0
  385. package/test-fixtures/punctuation/04/expectedResult.json +21 -0
  386. package/test-fixtures/punctuation/04/metadata.json +5 -0
  387. package/test-fixtures/punctuation/04/record.json +19 -0
  388. package/test-fixtures/punctuation/05/expectedResult.json +44 -0
  389. package/test-fixtures/punctuation/05/metadata.json +5 -0
  390. package/test-fixtures/punctuation/05/record.json +42 -0
  391. package/test-fixtures/punctuation2/01/expectedResult.json +12 -0
  392. package/test-fixtures/punctuation2/01/metadata.json +6 -0
  393. package/test-fixtures/punctuation2/01/record.json +37 -0
  394. package/test-fixtures/punctuation2/02/expectedResult.json +4 -0
  395. package/test-fixtures/punctuation2/02/metadata.json +6 -0
  396. package/test-fixtures/punctuation2/02/record.json +14 -0
  397. package/test-fixtures/punctuation2/04/expectedResult.json +7 -0
  398. package/test-fixtures/punctuation2/04/metadata.json +6 -0
  399. package/test-fixtures/punctuation2/04/record.json +22 -0
  400. package/test-fixtures/punctuation2/05/expectedResult.json +6 -0
  401. package/test-fixtures/punctuation2/05/metadata.json +6 -0
  402. package/test-fixtures/punctuation2/05/record.json +12 -0
  403. package/test-fixtures/punctuation2/98/expectedResult.json +45 -0
  404. package/test-fixtures/punctuation2/98/metadata.json +6 -0
  405. package/test-fixtures/punctuation2/98/record.json +43 -0
  406. package/test-fixtures/punctuation2/99/expectedResult.json +15 -0
  407. package/test-fixtures/punctuation2/99/metadata.json +6 -0
  408. package/test-fixtures/punctuation2/99/record.json +14 -0
  409. package/test-fixtures/reindex-sf6-occurence-numbers/f01/expectedResult.json +35 -0
  410. package/test-fixtures/reindex-sf6-occurence-numbers/f01/metadata.json +6 -0
  411. package/test-fixtures/reindex-sf6-occurence-numbers/f01/record.json +34 -0
  412. package/test-fixtures/reindex-sf6-occurence-numbers/f02/expectedResult.json +53 -0
  413. package/test-fixtures/reindex-sf6-occurence-numbers/f02/metadata.json +6 -0
  414. package/test-fixtures/reindex-sf6-occurence-numbers/f02/record.json +51 -0
  415. package/test-fixtures/reindex-sf6-occurence-numbers/f03/expectedResult.json +46 -0
  416. package/test-fixtures/reindex-sf6-occurence-numbers/f03/metadata.json +7 -0
  417. package/test-fixtures/reindex-sf6-occurence-numbers/f03/record.json +44 -0
  418. package/test-fixtures/reindex-sf6-occurence-numbers/v01/expectedResult.json +6 -0
  419. package/test-fixtures/reindex-sf6-occurence-numbers/v01/metadata.json +5 -0
  420. package/test-fixtures/reindex-sf6-occurence-numbers/v01/record.json +31 -0
  421. package/test-fixtures/reindex-sf6-occurence-numbers/v02/expectedResult.json +6 -0
  422. package/test-fixtures/reindex-sf6-occurence-numbers/v02/metadata.json +6 -0
  423. package/test-fixtures/reindex-sf6-occurence-numbers/v02/record.json +38 -0
  424. package/test-fixtures/reindex-sf6-occurence-numbers/v03/expectedResult.json +6 -0
  425. package/test-fixtures/reindex-sf6-occurence-numbers/v03/metadata.json +6 -0
  426. package/test-fixtures/reindex-sf6-occurence-numbers/v03/record.json +30 -0
  427. package/test-fixtures/remove-duplicate-datafields/f01/expectedResult.json +35 -0
  428. package/test-fixtures/remove-duplicate-datafields/f01/metadata.json +6 -0
  429. package/test-fixtures/remove-duplicate-datafields/f01/record.json +34 -0
  430. package/test-fixtures/remove-duplicate-datafields/f03/expectedResult.json +20 -0
  431. package/test-fixtures/remove-duplicate-datafields/f03/metadata.json +6 -0
  432. package/test-fixtures/remove-duplicate-datafields/f03/record.json +33 -0
  433. package/test-fixtures/remove-duplicate-datafields/f03b/expectedResult.json +20 -0
  434. package/test-fixtures/remove-duplicate-datafields/f03b/metadata.json +6 -0
  435. package/test-fixtures/remove-duplicate-datafields/f03b/record.json +35 -0
  436. package/test-fixtures/remove-duplicate-datafields/f03c/expectedResult.json +25 -0
  437. package/test-fixtures/remove-duplicate-datafields/f03c/metadata.json +6 -0
  438. package/test-fixtures/remove-duplicate-datafields/f03c/record.json +43 -0
  439. package/test-fixtures/remove-duplicate-datafields/f04/expectedResult.json +31 -0
  440. package/test-fixtures/remove-duplicate-datafields/f04/metadata.json +6 -0
  441. package/test-fixtures/remove-duplicate-datafields/f04/record.json +41 -0
  442. package/test-fixtures/remove-duplicate-datafields/f05/expectedResult.json +23 -0
  443. package/test-fixtures/remove-duplicate-datafields/f05/metadata.json +6 -0
  444. package/test-fixtures/remove-duplicate-datafields/f05/record.json +29 -0
  445. package/test-fixtures/remove-duplicate-datafields/f06/expectedResult.json +24 -0
  446. package/test-fixtures/remove-duplicate-datafields/f06/metadata.json +6 -0
  447. package/test-fixtures/remove-duplicate-datafields/f06/record.json +41 -0
  448. package/test-fixtures/remove-duplicate-datafields/f07/expectedResult.json +15 -0
  449. package/test-fixtures/remove-duplicate-datafields/f07/metadata.json +6 -0
  450. package/test-fixtures/remove-duplicate-datafields/f07/record.json +21 -0
  451. package/test-fixtures/remove-duplicate-datafields/f08/expectedResult.json +21 -0
  452. package/test-fixtures/remove-duplicate-datafields/f08/metadata.json +6 -0
  453. package/test-fixtures/remove-duplicate-datafields/f08/record.json +33 -0
  454. package/test-fixtures/remove-duplicate-datafields/f09/expectedResult.json +6 -0
  455. package/test-fixtures/remove-duplicate-datafields/f09/metadata.json +6 -0
  456. package/test-fixtures/remove-duplicate-datafields/f09/record.json +9 -0
  457. package/test-fixtures/remove-duplicate-datafields/f10/expectedResult.json +15 -0
  458. package/test-fixtures/remove-duplicate-datafields/f10/metadata.json +6 -0
  459. package/test-fixtures/remove-duplicate-datafields/f10/record.json +24 -0
  460. package/test-fixtures/remove-duplicate-datafields/f11/expectedResult.json +30 -0
  461. package/test-fixtures/remove-duplicate-datafields/f11/metadata.json +6 -0
  462. package/test-fixtures/remove-duplicate-datafields/f11/record.json +53 -0
  463. package/test-fixtures/remove-duplicate-datafields/v01/expectedResult.json +6 -0
  464. package/test-fixtures/remove-duplicate-datafields/v01/metadata.json +6 -0
  465. package/test-fixtures/remove-duplicate-datafields/v01/record.json +31 -0
  466. package/test-fixtures/remove-duplicate-datafields/v02/expectedResult.json +10 -0
  467. package/test-fixtures/remove-duplicate-datafields/v02/metadata.json +6 -0
  468. package/test-fixtures/remove-duplicate-datafields/v02/record.json +45 -0
  469. package/test-fixtures/remove-duplicate-datafields/v03/expectedResult.json +6 -0
  470. package/test-fixtures/remove-duplicate-datafields/v03/metadata.json +7 -0
  471. package/test-fixtures/remove-duplicate-datafields/v03/record.json +37 -0
  472. package/test-fixtures/remove-duplicate-datafields/v04/expectedResult.json +8 -0
  473. package/test-fixtures/remove-duplicate-datafields/v04/metadata.json +6 -0
  474. package/test-fixtures/remove-duplicate-datafields/v04/record.json +41 -0
  475. package/test-fixtures/remove-inferior-datafields/f01/expectedResult.json +21 -0
  476. package/test-fixtures/remove-inferior-datafields/f01/metadata.json +6 -0
  477. package/test-fixtures/remove-inferior-datafields/f01/record.json +31 -0
  478. package/test-fixtures/remove-inferior-datafields/f03/expectedResult.json +16 -0
  479. package/test-fixtures/remove-inferior-datafields/f03/metadata.json +6 -0
  480. package/test-fixtures/remove-inferior-datafields/f03/record.json +27 -0
  481. package/test-fixtures/remove-inferior-datafields/f04/expectedResult.json +31 -0
  482. package/test-fixtures/remove-inferior-datafields/f04/metadata.json +6 -0
  483. package/test-fixtures/remove-inferior-datafields/f04/record.json +38 -0
  484. package/test-fixtures/remove-inferior-datafields/f05/expectedResult.json +34 -0
  485. package/test-fixtures/remove-inferior-datafields/f05/metadata.json +6 -0
  486. package/test-fixtures/remove-inferior-datafields/f05/record.json +41 -0
  487. package/test-fixtures/remove-inferior-datafields/f06/expectedResult.json +16 -0
  488. package/test-fixtures/remove-inferior-datafields/f06/metadata.json +6 -0
  489. package/test-fixtures/remove-inferior-datafields/f06/record.json +20 -0
  490. package/test-fixtures/remove-inferior-datafields/v01/expectedResult.json +6 -0
  491. package/test-fixtures/remove-inferior-datafields/v01/metadata.json +6 -0
  492. package/test-fixtures/remove-inferior-datafields/v01/record.json +31 -0
  493. package/test-fixtures/remove-inferior-datafields/v02/expectedResult.json +6 -0
  494. package/test-fixtures/remove-inferior-datafields/v02/metadata.json +6 -0
  495. package/test-fixtures/remove-inferior-datafields/v02/record.json +21 -0
  496. package/test-fixtures/remove-orphanded-sf6s/f01/expectedResult.json +35 -0
  497. package/test-fixtures/remove-orphanded-sf6s/f01/metadata.json +6 -0
  498. package/test-fixtures/remove-orphanded-sf6s/f01/record.json +34 -0
  499. package/test-fixtures/remove-orphanded-sf6s/f02/expectedResult.json +40 -0
  500. package/test-fixtures/remove-orphanded-sf6s/f02/metadata.json +6 -0
  501. package/test-fixtures/remove-orphanded-sf6s/f02/record.json +43 -0
  502. package/test-fixtures/remove-orphanded-sf6s/v01/expectedResult.json +6 -0
  503. package/test-fixtures/remove-orphanded-sf6s/v01/metadata.json +6 -0
  504. package/test-fixtures/remove-orphanded-sf6s/v01/record.json +31 -0
  505. package/test-fixtures/remove-orphanded-sf6s/v02/expectedResult.json +6 -0
  506. package/test-fixtures/remove-orphanded-sf6s/v02/metadata.json +6 -0
  507. package/test-fixtures/remove-orphanded-sf6s/v02/record.json +31 -0
  508. package/test-fixtures/resolvable-ext-references-melinda.js +0 -27
  509. package/test-fixtures/sanitize-vocabulary-source-codes/f01/expectedResult.json +32 -0
  510. package/test-fixtures/sanitize-vocabulary-source-codes/f01/metadata.json +6 -0
  511. package/test-fixtures/sanitize-vocabulary-source-codes/f01/record.json +32 -0
  512. package/test-fixtures/sanitize-vocabulary-source-codes/f02/expectedResult.json +24 -0
  513. package/test-fixtures/sanitize-vocabulary-source-codes/f02/metadata.json +6 -0
  514. package/test-fixtures/sanitize-vocabulary-source-codes/f02/record.json +24 -0
  515. package/test-fixtures/sanitize-vocabulary-source-codes/v01/expectedResult.json +12 -0
  516. package/test-fixtures/sanitize-vocabulary-source-codes/v01/metadata.json +6 -0
  517. package/test-fixtures/sanitize-vocabulary-source-codes/v01/record.json +24 -0
  518. package/test-fixtures/sort-relator-terms/f01/expectedResult.json +23 -0
  519. package/test-fixtures/sort-relator-terms/f01/metadata.json +6 -0
  520. package/test-fixtures/sort-relator-terms/f01/record.json +22 -0
  521. package/test-fixtures/sort-relator-terms/f02/expectedResult.json +26 -0
  522. package/test-fixtures/sort-relator-terms/f02/metadata.json +6 -0
  523. package/test-fixtures/sort-relator-terms/f02/record.json +22 -0
  524. package/test-fixtures/sort-relator-terms/v01/expectedResult.json +5 -0
  525. package/test-fixtures/sort-relator-terms/v01/metadata.json +6 -0
  526. package/test-fixtures/sort-relator-terms/v01/record.json +22 -0
  527. package/test-fixtures/sort-relator-terms/v02/expectedResult.json +6 -0
  528. package/test-fixtures/sort-relator-terms/v02/metadata.json +6 -0
  529. package/test-fixtures/sort-relator-terms/v02/record.json +14 -0
  530. package/test-fixtures/sort-subfields/f01/expectedResult.json +24 -0
  531. package/test-fixtures/sort-subfields/f01/metadata.json +6 -0
  532. package/test-fixtures/sort-subfields/f01/record.json +20 -0
  533. package/test-fixtures/sort-subfields/v01/expectedResult.json +5 -0
  534. package/test-fixtures/sort-subfields/v01/metadata.json +6 -0
  535. package/test-fixtures/sort-subfields/v01/record.json +24 -0
  536. package/test-fixtures/sort-subfields/v02/expectedResult.json +6 -0
  537. package/test-fixtures/sort-subfields/v02/metadata.json +6 -0
  538. package/test-fixtures/sort-subfields/v02/record.json +8 -0
  539. package/test-fixtures/strip-punctuation/01/expectedResult.json +12 -0
  540. package/test-fixtures/strip-punctuation/01/metadata.json +6 -0
  541. package/test-fixtures/strip-punctuation/01/record.json +37 -0
  542. package/test-fixtures/strip-punctuation/02/expectedResult.json +4 -0
  543. package/test-fixtures/strip-punctuation/02/metadata.json +6 -0
  544. package/test-fixtures/strip-punctuation/02/record.json +14 -0
  545. package/test-fixtures/strip-punctuation/04/expectedResult.json +6 -0
  546. package/test-fixtures/strip-punctuation/04/metadata.json +6 -0
  547. package/test-fixtures/strip-punctuation/04/record.json +22 -0
  548. package/test-fixtures/strip-punctuation/05/expectedResult.json +6 -0
  549. package/test-fixtures/strip-punctuation/05/metadata.json +6 -0
  550. package/test-fixtures/strip-punctuation/05/record.json +12 -0
  551. package/test-fixtures/strip-punctuation/98/expectedResult.json +44 -0
  552. package/test-fixtures/strip-punctuation/98/metadata.json +6 -0
  553. package/test-fixtures/strip-punctuation/98/record.json +45 -0
  554. package/test-fixtures/strip-punctuation/99/expectedResult.json +16 -0
  555. package/test-fixtures/strip-punctuation/99/metadata.json +6 -0
  556. package/test-fixtures/strip-punctuation/99/record.json +16 -0
  557. package/test-fixtures/subfield0/f01/expectedResult.json +25 -0
  558. package/test-fixtures/subfield0/f01/metadata.json +6 -0
  559. package/test-fixtures/subfield0/f01/record.json +23 -0
  560. package/test-fixtures/subfield0/f02/expectedResult.json +35 -0
  561. package/test-fixtures/subfield0/f02/metadata.json +6 -0
  562. package/test-fixtures/subfield0/f02/record.json +41 -0
  563. package/test-fixtures/subfield0/f03/expectedResult.json +21 -0
  564. package/test-fixtures/subfield0/f03/metadata.json +7 -0
  565. package/test-fixtures/subfield0/f03/record.json +24 -0
  566. package/test-fixtures/subfield0/v01/expectedResult.json +4 -0
  567. package/test-fixtures/subfield0/v01/metadata.json +6 -0
  568. package/test-fixtures/subfield0/v01/record.json +23 -0
  569. package/test-fixtures/subfield0/v02/expectedResult.json +9 -0
  570. package/test-fixtures/subfield0/v02/metadata.json +6 -0
  571. package/test-fixtures/subfield0/v02/record.json +38 -0
  572. package/test-fixtures/typeOfDate-008/01/expectedResult.json +3 -0
  573. package/test-fixtures/typeOfDate-008/01/metadata.json +4 -0
  574. package/test-fixtures/typeOfDate-008/01/record.json +14 -0
  575. package/test-fixtures/typeOfDate-008/02/expectedResult.json +4 -0
  576. package/test-fixtures/typeOfDate-008/02/metadata.json +4 -0
  577. package/test-fixtures/typeOfDate-008/02/record.json +14 -0
  578. package/test-fixtures/typeOfDate-008/03/expectedResult.json +14 -0
  579. package/test-fixtures/typeOfDate-008/03/metadata.json +5 -0
  580. package/test-fixtures/typeOfDate-008/03/record.json +14 -0
  581. package/test-fixtures/typeOfDate-008/04/expectedResult.json +14 -0
  582. package/test-fixtures/typeOfDate-008/04/metadata.json +5 -0
  583. package/test-fixtures/typeOfDate-008/04/record.json +14 -0
  584. package/test-fixtures/typeOfDate-008/05/expectedResult.json +14 -0
  585. package/test-fixtures/typeOfDate-008/05/metadata.json +5 -0
  586. package/test-fixtures/typeOfDate-008/05/record.json +14 -0
  587. package/test-fixtures/update-field-540/f01/expectedResult.json +23 -0
  588. package/test-fixtures/update-field-540/f01/metadata.json +6 -0
  589. package/test-fixtures/update-field-540/f01/record.json +23 -0
  590. package/test-fixtures/update-field-540/v01/expectedResult.json +7 -0
  591. package/test-fixtures/update-field-540/v01/metadata.json +6 -0
  592. package/test-fixtures/update-field-540/v01/record.json +23 -0
  593. package/.travis.yml +0 -10
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/field-structure.spec.js"],"names":["expect","chai","use","chaiAsPromised","describe","it","config","tag","ind1","ind2","subfields","a","maxOccurrence","validator","to","be","an","that","has","any","keys","description","validate","rejectedWith","Error","leader","tags","valuePattern","strict","recordValid","MarcRecord","fields","value","code","recordInvalidMany","result","eql","valid","required","pattern","b","recordInvalidExtra","recordInvalidTooMany","recordInvalidRegExp","recordInvalidMissing","recordInvalidMissingSubfield","dependencies","recordInvalid"],"mappings":"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","file":"field-structure.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 chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/field-structure';\n\nconst {expect} = chai;\nchai.use(chaiAsPromised);\n\n// Factory validation\ndescribe('field-structure', () => {\n\tit('Creates a validator', async () => {\n\t\tconst config = [{\n\t\t\ttag: /^035$/,\n\t\t\tind1: /^0$/,\n\t\t\tind2: /^1$/\n\t\t}, {\n\t\t\ttag: /^100$/,\n\t\t\tsubfields: {\n\t\t\t\ta: {maxOccurrence: 1}\n\t\t\t}\n\t\t}];\n\n\t\tconst validator = await validatorFactory(config);\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('#configuration', () => {\n\t\tit('Throws an error when config array not provided', async () => {\n\t\t\tawait expect(validatorFactory()).to.be.rejectedWith(Error, 'Configuration array not provided');\n\t\t});\n\n\t\tit('Throws an error when config array has unidentified field', async () => {\n\t\t\tconst config = [{\n\t\t\t\tleader: /^035$/,\n\t\t\t\ttags: /^035$/\n\t\t\t}];\n\t\t\tawait expect(validatorFactory(config)).to.be.rejectedWith(Error, 'Configuration not valid - unidentified value: tags');\n\t\t});\n\n\t\tit('Throws an error when config array has field with incorrect data type', async () => {\n\t\t\tconst config = [{\n\t\t\t\tleader: /^035$/,\n\t\t\t\ttag: 35\n\t\t\t}];\n\t\t\tawait expect(validatorFactory(config)).to.be.rejectedWith(Error, 'Configuration not valid - invalid data type for: tag');\n\t\t});\n\n\t\tit('Throws an error when config array has excluded element', async () => {\n\t\t\tconst config = [{\n\t\t\t\tleader: /^035$/,\n\t\t\t\ttag: /^035$/\n\t\t\t}];\n\t\t\tawait expect(validatorFactory(config)).to.be.rejectedWith(Error, 'Configuration not valid - excluded element');\n\t\t});\n\n\t\tit('Throws an error when config subfields not object', async () => {\n\t\t\tconst config = [{\n\t\t\t\ttag: /^001$/,\n\t\t\t\tvaluePattern: /\\d+/\n\t\t\t}, {\n\t\t\t\ttag: /^245$/,\n\t\t\t\tstrict: true,\n\t\t\t\tsubfields: 'This should be Object'\n\t\t\t}];\n\t\t\tawait expect(validatorFactory(config)).to.be.rejectedWith(Error, 'Configuration not valid - subfields not object');\n\t\t});\n\t});\n\n\t// Indicators and subfields validation\n\tdescribe('#validate: Indicators and subfields', () => {\n\t\tconst config = [{\n\t\t\ttag: /^035$/,\n\t\t\tind1: /^0$/,\n\t\t\tind2: /^1$/\n\t\t}, {\n\t\t\ttag: /^100$/,\n\t\t\tsubfields: {\n\t\t\t\ta: {maxOccurrence: 1}\n\t\t\t}\n\t\t}];\n\n\t\tconst recordValid = new MarcRecord({\n\t\t\tleader: '',\n\t\t\tfields: [{\n\t\t\t\ttag: '001',\n\t\t\t\tvalue: '123456'\n\t\t\t}, {\n\t\t\t\ttag: '035',\n\t\t\t\tind1: '0',\n\t\t\t\tind2: '1',\n\t\t\t\tsubfields: [{\n\t\t\t\t\tcode: 'a',\n\t\t\t\t\tvalue: 'foo'\n\t\t\t\t}]\n\t\t\t}, {\n\t\t\t\ttag: '100',\n\t\t\t\tind1: ' ',\n\t\t\t\tind2: ' ',\n\t\t\t\tsubfields: [{\n\t\t\t\t\tcode: 'a',\n\t\t\t\t\tvalue: 'bar'\n\t\t\t\t}, {\n\t\t\t\t\tcode: 'b',\n\t\t\t\t\tvalue: 'fubar'\n\t\t\t\t}]\n\t\t\t}]\n\t\t});\n\n\t\tconst recordInvalidMany = new MarcRecord({\n\t\t\tleader: '',\n\t\t\tfields: [{\n\t\t\t\ttag: '001',\n\t\t\t\tvalue: '123456'\n\t\t\t}, {\n\t\t\t\ttag: '035',\n\t\t\t\tind1: '1',\n\t\t\t\tind2: '1',\n\t\t\t\tsubfields: [{\n\t\t\t\t\tcode: 'a',\n\t\t\t\t\tvalue: 'foo'\n\t\t\t\t}]\n\t\t\t}, {\n\t\t\t\ttag: '100',\n\t\t\t\tind1: ' ',\n\t\t\t\tind2: ' ',\n\t\t\t\tsubfields: [{\n\t\t\t\t\tcode: 'a',\n\t\t\t\t\tvalue: 'bar'\n\t\t\t\t}, {\n\t\t\t\t\tcode: 'b',\n\t\t\t\t\tvalue: 'fubar'\n\t\t\t\t}, {\n\t\t\t\t\tcode: 'a',\n\t\t\t\t\tvalue: 'barfoo'\n\t\t\t\t}]\n\t\t\t}]\n\t\t});\n\n\t\tit('Finds the record valid', async () => {\n\t\t\tconst validator = await validatorFactory(config);\n\t\t\tconst result = await validator.validate(recordValid);\n\n\t\t\texpect(result).to.eql({valid: true});\n\t\t});\n\n\t\tit('Finds the record invalid: Too many subfields', async () => {\n\t\t\tconst validator = await validatorFactory(config);\n\t\t\tconst result = await validator.validate(recordInvalidMany);\n\n\t\t\texpect(result).to.eql({valid: false});\n\t\t});\n\t});\n\n\t// Patterns and mandatory & strict subfields\n\tdescribe('#validate: Patterns and mandatory & strict subfields', () => {\n\t\tconst config = [{\n\t\t\ttag: /^001$/,\n\t\t\tvaluePattern: /\\d+/\n\t\t}, {\n\t\t\ttag: /^245$/,\n\t\t\tstrict: true,\n\t\t\tsubfields: {\n\t\t\t\ta: {required: true, maxOccurrence: 1, pattern: /\\w+/},\n\t\t\t\tb: {maxOccurrence: 1, pattern: /\\w+/}\n\t\t\t}\n\t\t}];\n\n\t\tconst recordValid = new MarcRecord({\n\t\t\tleader: '',\n\t\t\tfields: [{\n\t\t\t\ttag: '001',\n\t\t\t\tvalue: '123456'\n\t\t\t}, {\n\t\t\t\ttag: '100',\n\t\t\t\tind1: ' ',\n\t\t\t\tind2: ' ',\n\t\t\t\tsubfields: [{\n\t\t\t\t\tcode: 'a',\n\t\t\t\t\tvalue: 'bar'\n\t\t\t\t}]\n\t\t\t}, {\n\t\t\t\ttag: '245',\n\t\t\t\tind1: ' ',\n\t\t\t\tind2: ' ',\n\t\t\t\tsubfields: [{\n\t\t\t\t\tcode: 'a',\n\t\t\t\t\tvalue: 'foo'\n\t\t\t\t}, {\n\t\t\t\t\tcode: 'b',\n\t\t\t\t\tvalue: 'bar'\n\t\t\t\t}]\n\t\t\t}]\n\t\t});\n\n\t\tconst recordInvalidExtra = new MarcRecord({\n\t\t\tleader: '',\n\t\t\tfields: [{\n\t\t\t\ttag: '001',\n\t\t\t\tvalue: '123456a'\n\t\t\t}, {\n\t\t\t\ttag: '100',\n\t\t\t\tind1: ' ',\n\t\t\t\tind2: ' ',\n\t\t\t\tsubfields: [{\n\t\t\t\t\tcode: 'a',\n\t\t\t\t\tvalue: 'bar'\n\t\t\t\t}]\n\t\t\t}, {\n\t\t\t\ttag: '245',\n\t\t\t\tind1: ' ',\n\t\t\t\tind2: ' ',\n\t\t\t\tsubfields: [{\n\t\t\t\t\tcode: 'a',\n\t\t\t\t\tvalue: 'foo'\n\t\t\t\t}, {\n\t\t\t\t\tcode: 'b',\n\t\t\t\t\tvalue: 'bar'\n\t\t\t\t}, {\n\t\t\t\t\tcode: 'c',\n\t\t\t\t\tvalue: 'fubar'\n\t\t\t\t}]\n\t\t\t}]\n\t\t});\n\n\t\tconst recordInvalidTooMany = new MarcRecord({\n\t\t\tleader: '',\n\t\t\tfields: [{\n\t\t\t\ttag: '001',\n\t\t\t\tvalue: '123456a'\n\t\t\t}, {\n\t\t\t\ttag: '100',\n\t\t\t\tind1: ' ',\n\t\t\t\tind2: ' ',\n\t\t\t\tsubfields: [{\n\t\t\t\t\tcode: 'a',\n\t\t\t\t\tvalue: 'bar'\n\t\t\t\t}]\n\t\t\t}, {\n\t\t\t\ttag: '245',\n\t\t\t\tind1: ' ',\n\t\t\t\tind2: ' ',\n\t\t\t\tsubfields: [{\n\t\t\t\t\tcode: 'a',\n\t\t\t\t\tvalue: 'foo'\n\t\t\t\t}, {\n\t\t\t\t\tcode: 'b',\n\t\t\t\t\tvalue: 'bar'\n\t\t\t\t}, {\n\t\t\t\t\tcode: 'a',\n\t\t\t\t\tvalue: 'fubar'\n\t\t\t\t}]\n\t\t\t}]\n\t\t});\n\n\t\tconst recordInvalidRegExp = new MarcRecord({\n\t\t\tleader: '',\n\t\t\tfields: [{\n\t\t\t\ttag: '001',\n\t\t\t\tvalue: '123456a'\n\t\t\t}, {\n\t\t\t\ttag: '100',\n\t\t\t\tind1: ' ',\n\t\t\t\tind2: ' ',\n\t\t\t\tsubfields: [{\n\t\t\t\t\tcode: 'a',\n\t\t\t\t\tvalue: 'bar'\n\t\t\t\t}]\n\t\t\t}, {\n\t\t\t\ttag: '245',\n\t\t\t\tind1: ' ',\n\t\t\t\tind2: ' ',\n\t\t\t\tsubfields: [{\n\t\t\t\t\tcode: 'a',\n\t\t\t\t\tvalue: 'ää'\n\t\t\t\t}, {\n\t\t\t\t\tcode: 'b',\n\t\t\t\t\tvalue: 'bar'\n\t\t\t\t}]\n\t\t\t}]\n\t\t});\n\n\t\tconst recordInvalidMissing = new MarcRecord({\n\t\t\tleader: '',\n\t\t\tfields: [{\n\t\t\t\ttag: '100',\n\t\t\t\tind1: ' ',\n\t\t\t\tind2: ' ',\n\t\t\t\tsubfields: [{\n\t\t\t\t\tcode: 'a',\n\t\t\t\t\tvalue: 'bar'\n\t\t\t\t}]\n\t\t\t}, {\n\t\t\t\ttag: '245',\n\t\t\t\tind1: ' ',\n\t\t\t\tind2: ' ',\n\t\t\t\tsubfields: [{\n\t\t\t\t\tcode: 'a',\n\t\t\t\t\tvalue: 'ää'\n\t\t\t\t}, {\n\t\t\t\t\tcode: 'b',\n\t\t\t\t\tvalue: 'bar'\n\t\t\t\t}]\n\t\t\t}]\n\t\t});\n\n\t\tconst recordInvalidMissingSubfield = new MarcRecord({\n\t\t\tleader: '',\n\t\t\tfields: [{\n\t\t\t\ttag: '001',\n\t\t\t\tvalue: '123456'\n\t\t\t}, {\n\t\t\t\ttag: '100',\n\t\t\t\tind1: ' ',\n\t\t\t\tind2: ' ',\n\t\t\t\tsubfields: [{\n\t\t\t\t\tcode: 'a',\n\t\t\t\t\tvalue: 'bar'\n\t\t\t\t}]\n\t\t\t}, {\n\t\t\t\ttag: '245',\n\t\t\t\tind1: ' ',\n\t\t\t\tind2: ' ',\n\t\t\t\tsubfields: [{\n\t\t\t\t\tcode: 'b',\n\t\t\t\t\tvalue: 'bar'\n\t\t\t\t}]\n\t\t\t}]\n\t\t});\n\n\t\tit('Finds the record valid', async () => {\n\t\t\tconst validator = await validatorFactory(config);\n\t\t\tconst result = await validator.validate(recordValid);\n\n\t\t\texpect(result).to.eql({valid: true});\n\t\t});\n\n\t\tit('Finds the record invalid: Extra field in strict', async () => {\n\t\t\tconst validator = await validatorFactory(config);\n\t\t\tconst result = await validator.validate(recordInvalidExtra);\n\n\t\t\texpect(result).to.eql({valid: false});\n\t\t});\n\n\t\tit('Finds the record invalid: Too many occurances', async () => {\n\t\t\tconst validator = await validatorFactory(config);\n\t\t\tconst result = await validator.validate(recordInvalidTooMany);\n\n\t\t\texpect(result).to.eql({valid: false});\n\t\t});\n\n\t\tit('Finds the record invalid: Invalid RegExp', async () => {\n\t\t\tconst validator = await validatorFactory(config);\n\t\t\tconst result = await validator.validate(recordInvalidRegExp);\n\n\t\t\texpect(result).to.eql({valid: false});\n\t\t});\n\n\t\tit('Finds the record invalid: Missing field', async () => {\n\t\t\tconst validator = await validatorFactory(config);\n\t\t\tconst result = await validator.validate(recordInvalidMissing);\n\n\t\t\texpect(result).to.eql({valid: false});\n\t\t});\n\t\tit('Finds the record invalid: Missing subfield', async () => {\n\t\t\tconst validator = await validatorFactory(config);\n\t\t\tconst result = await validator.validate(recordInvalidMissingSubfield);\n\n\t\t\texpect(result).to.eql({valid: false});\n\t\t});\n\t});\n\n\t// Dependencies\n\tdescribe('#validate: Dependencies', () => {\n\t\tconst config = [{\n\t\t\tleader: /^.{6}s/,\n\t\t\tdependencies: [{\n\t\t\t\ttag: /^773$/,\n\t\t\t\tsubfields: {7: /^nnas$/}\n\t\t\t}]\n\t\t}];\n\n\t\tconst recordValid = new MarcRecord({\n\t\t\tleader: '63ab75sfoo122myhgh',\n\t\t\tfields: [{\n\t\t\t\ttag: '001',\n\t\t\t\tvalue: '123456'\n\t\t\t}, {\n\t\t\t\ttag: '245',\n\t\t\t\tind1: ' ',\n\t\t\t\tind2: ' ',\n\t\t\t\tsubfields: [{\n\t\t\t\t\tcode: 'a',\n\t\t\t\t\tvalue: 'foo'\n\t\t\t\t}]\n\t\t\t}, {\n\t\t\t\ttag: '773',\n\t\t\t\tind1: ' ',\n\t\t\t\tind2: ' ',\n\t\t\t\tsubfields: [{\n\t\t\t\t\tcode: '7',\n\t\t\t\t\tvalue: 'nnas'\n\t\t\t\t}, {\n\t\t\t\t\tcode: 'w',\n\t\t\t\t\tvalue: '789101112'\n\t\t\t\t}]\n\t\t\t}]\n\t\t});\n\n\t\tconst recordInvalid = new MarcRecord({\n\t\t\tleader: '63ab75sfoo122myhgh',\n\t\t\tfields: [{\n\t\t\t\ttag: '001',\n\t\t\t\tvalue: '123456'\n\t\t\t}, {\n\t\t\t\ttag: '245',\n\t\t\t\tind1: ' ',\n\t\t\t\tind2: ' ',\n\t\t\t\tsubfields: [{\n\t\t\t\t\tcode: 'a',\n\t\t\t\t\tvalue: 'foo'\n\t\t\t\t}]\n\t\t\t}, {\n\t\t\t\ttag: '773',\n\t\t\t\tind1: ' ',\n\t\t\t\tind2: ' ',\n\t\t\t\tsubfields: [{\n\t\t\t\t\tcode: 'w',\n\t\t\t\t\tvalue: '789101112'\n\t\t\t\t}]\n\t\t\t}]\n\t\t});\n\n\t\tit('Finds the record valid', async () => {\n\t\t\tconst validator = await validatorFactory(config);\n\t\t\tconst result = await validator.validate(recordValid);\n\n\t\t\texpect(result).to.eql({valid: true});\n\t\t});\n\n\t\tit('Finds the record invalid: Subfield not there', async () => {\n\t\t\tconst validator = await validatorFactory(config);\n\t\t\tconst result = await validator.validate(recordInvalid);\n\n\t\t\texpect(result).to.eql({valid: false});\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"field-structure.spec.js","names":["_chai","_interopRequireDefault","require","_chaiAsPromised","_marcRecord","_fieldStructure","obj","__esModule","default","expect","chai","use","chaiAsPromised","describe","it","config","tag","ind1","ind2","subfields","a","maxOccurrence","validator","validatorFactory","to","be","an","that","has","any","keys","description","validate","error","with","property","leader","tags","valuePattern","strict","record","MarcRecord","fields","value","result","eql","valid","recordValid","code","recordInvalidMany","required","pattern","b","recordInvalidExtra","recordInvalidTooMany","recordInvalidRegExp","recordInvalidMissing","recordInvalidMissingSubfield","dependencies","recordInvalid"],"sources":["../src/field-structure.spec.js"],"sourcesContent":["import chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/field-structure';\n\nconst {expect} = chai;\nchai.use(chaiAsPromised);\n\n// Factory validation\ndescribe('field-structure', () => {\n it('Creates a validator', async () => {\n const config = [\n {\n tag: /^035$/u,\n ind1: /^0$/u,\n ind2: /^1$/u\n }, {\n tag: /^100$/u,\n subfields: {\n a: {maxOccurrence: 1}\n }\n }\n ];\n\n const validator = await validatorFactory(config);\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('#configuration', () => {\n it('Throws an error when config array not provided', () => {\n try {\n validatorFactory();\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration array not provided');\n }\n });\n\n it('Throws an error when config array has unidentified field', () => {\n const config = [\n {\n leader: /^035$/u,\n tags: /^035$/u\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - unidentified value: tags');\n }\n });\n\n it('Throws an error when config array has field with incorrect data type', () => {\n const config = [\n {\n leader: /^035$/u,\n tag: 35\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - invalid data type for: tag');\n }\n });\n\n it('Throws an error when config array has excluded element', () => {\n const config = [\n {\n leader: /^035$/u,\n tag: /^035$/u\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - excluded element');\n }\n });\n\n it('Throws an error when config subfields not object', () => {\n const config = [\n {\n tag: /^001$/u,\n valuePattern: /\\d+/u\n }, {\n tag: /^245$/u,\n strict: true,\n subfields: 'This should be Object'\n }\n ];\n\n try {\n validatorFactory(config);\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'Configuration not valid - subfields not object');\n }\n });\n });\n\n it('Should find the record valid because no fields match the config', async () => {\n const config = [\n {\n tag: /^FOO$/u,\n valuePattern: /bar/u\n }\n ];\n\n const record = new MarcRecord({\n leader: '',\n fields: [\n {\n tag: '001',\n value: '123456'\n }\n ]\n });\n\n const validator = await validatorFactory(config);\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: true});\n });\n\n // Indicators and subfields validation\n describe('#validate: Indicators and subfields', () => {\n const config = [\n {\n tag: /^035$/u,\n ind1: /^0$/u,\n ind2: /^1$/u\n }, {\n tag: /^100$/u,\n subfields: {\n a: {maxOccurrence: 1}\n }\n }\n ];\n\n const recordValid = new MarcRecord({\n leader: '',\n fields: [\n {\n tag: '001',\n value: '123456'\n }, {\n tag: '035',\n ind1: '0',\n ind2: '1',\n subfields: [\n {\n code: 'a',\n value: 'foo'\n }\n ]\n }, {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'bar'\n }, {\n code: 'b',\n value: 'fubar'\n }\n ]\n }\n ]\n });\n\n const recordInvalidMany = new MarcRecord({\n leader: '',\n fields: [\n {\n tag: '001',\n value: '123456'\n }, {\n tag: '035',\n ind1: '1',\n ind2: '1',\n subfields: [\n {\n code: 'a',\n value: 'foo'\n }\n ]\n }, {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'bar'\n }, {\n code: 'b',\n value: 'fubar'\n }, {\n code: 'a',\n value: 'barfoo'\n }\n ]\n }\n ]\n });\n\n it('Finds the record valid', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordValid);\n\n expect(result).to.eql({valid: true});\n });\n\n it('Finds the record invalid: Too many subfields', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordInvalidMany);\n\n expect(result).to.eql({valid: false});\n });\n });\n\n // Patterns and mandatory & strict subfields\n describe('#validate: Patterns and mandatory & strict subfields', () => {\n const config = [\n {\n tag: /^001$/u,\n valuePattern: /\\d+/u\n }, {\n tag: /^245$/u,\n strict: true,\n subfields: {\n a: {required: true, maxOccurrence: 1, pattern: /\\w+/u},\n b: {maxOccurrence: 1, pattern: /\\w+/u}\n }\n }\n ];\n\n const recordValid = new MarcRecord({\n leader: '',\n fields: [\n {\n tag: '001',\n value: '123456'\n }, {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'bar'\n }\n ]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'foo'\n }, {\n code: 'b',\n value: 'bar'\n }\n ]\n }\n ]\n });\n\n const recordInvalidExtra = new MarcRecord({\n leader: '',\n fields: [\n {\n tag: '001',\n value: '123456a'\n }, {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'bar'\n }\n ]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'foo'\n }, {\n code: 'b',\n value: 'bar'\n }, {\n code: 'c',\n value: 'fubar'\n }\n ]\n }\n ]\n });\n\n const recordInvalidTooMany = new MarcRecord({\n leader: '',\n fields: [\n {\n tag: '001',\n value: '123456a'\n }, {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'bar'\n }\n ]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'foo'\n }, {\n code: 'b',\n value: 'bar'\n }, {\n code: 'a',\n value: 'fubar'\n }\n ]\n }\n ]\n });\n\n const recordInvalidRegExp = new MarcRecord({\n leader: '',\n fields: [\n {\n tag: '001',\n value: '123456a'\n }, {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'bar'\n }\n ]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'ää'\n }, {\n code: 'b',\n value: 'bar'\n }\n ]\n }\n ]\n });\n\n const recordInvalidMissing = new MarcRecord({\n leader: '',\n fields: [\n {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'bar'\n }\n ]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'ää'\n }, {\n code: 'b',\n value: 'bar'\n }\n ]\n }\n ]\n });\n\n const recordInvalidMissingSubfield = new MarcRecord({\n leader: '',\n fields: [\n {\n tag: '001',\n value: '123456'\n }, {\n tag: '100',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'bar'\n }\n ]\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'b',\n value: 'bar'\n }\n ]\n }\n ]\n });\n\n it('Finds the record valid', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordValid);\n\n expect(result).to.eql({valid: true});\n });\n\n it('Finds the record invalid: Extra field in strict', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordInvalidExtra);\n\n expect(result).to.eql({valid: false});\n });\n\n it('Finds the record invalid: Too many occurances', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordInvalidTooMany);\n\n expect(result).to.eql({valid: false});\n });\n\n it('Finds the record invalid: Invalid RegExp', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordInvalidRegExp);\n\n expect(result).to.eql({valid: false});\n });\n\n it('Finds the record invalid: Missing field', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordInvalidMissing);\n\n expect(result).to.eql({valid: false});\n });\n it('Finds the record invalid: Missing subfield', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordInvalidMissingSubfield);\n\n expect(result).to.eql({valid: false});\n });\n });\n\n // Dependencies\n describe('#validate: Dependencies', () => {\n const config = [\n {\n leader: /^.{6}s/u,\n dependencies: [\n {\n tag: /^773$/u,\n subfields: {7: /^nnas$/u}\n }\n ]\n }\n ];\n\n const recordValid = new MarcRecord({\n leader: '63ab75sfoo122myhgh',\n fields: [\n {\n tag: '001',\n value: '123456'\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'foo'\n }\n ]\n }, {\n tag: '773',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: '7',\n value: 'nnas'\n }, {\n code: 'w',\n value: '789101112'\n }\n ]\n }\n ]\n });\n\n const recordInvalid = new MarcRecord({\n leader: '63ab75afoo122myhgh',\n fields: [\n {\n tag: '001',\n value: '123456'\n }, {\n tag: '245',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: 'a',\n value: 'foo'\n }\n ]\n }, {\n tag: '773',\n ind1: ' ',\n ind2: ' ',\n subfields: [\n {\n code: '7',\n value: 'nnas'\n }, {\n code: 'w',\n value: '789101112'\n }\n ]\n }\n ]\n });\n\n it('Finds the record valid', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordValid);\n\n expect(result).to.eql({valid: true});\n });\n\n it('Finds the record invalid', async () => {\n const validator = await validatorFactory(config);\n const result = await validator.validate(recordInvalid);\n\n expect(result).to.eql({valid: false});\n });\n\n it('Find the record valid (Dependency on leader)', async () => {\n const validator = await validatorFactory([{tag: /^007$/u, dependencies: [{leader: /^.{6}[at]/u}]}]);\n const result = await validator.validate(new MarcRecord({\n leader: '00000ccm^a22003372i^4500',\n fields: [\n {tag: '001', value: '123456'},\n {tag: '245', value: 'foobar'}\n ]\n }));\n\n expect(result).to.eql({valid: true});\n });\n\n it('Find the record invalid (Dependency on leader)', async () => {\n const validator = await validatorFactory([{tag: /^007$/u, dependencies: [{leader: /^.{6}[at]/u}]}]);\n const result = await validator.validate(new MarcRecord({\n leader: '00000cam^a22003372i^4500',\n fields: [\n {tag: '001', value: '123456'},\n {tag: '245', value: 'foobar'}\n ]\n }));\n\n expect(result).to.eql({valid: false});\n });\n });\n});\n"],"mappings":";;AAAA,IAAAA,KAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,eAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,WAAA,GAAAF,OAAA;AACA,IAAAG,eAAA,GAAAJ,sBAAA,CAAAC,OAAA;AAAsD,SAAAD,uBAAAK,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAEtD,MAAM;EAACG;AAAM,CAAC,GAAGC,aAAI;AACrBA,aAAI,CAACC,GAAG,CAACC,uBAAc,CAAC;;AAExB;AACAC,QAAQ,CAAC,iBAAiB,EAAE,MAAM;EAChCC,EAAE,CAAC,qBAAqB,EAAE,YAAY;IACpC,MAAMC,MAAM,GAAG,CACb;MACEC,GAAG,EAAE,QAAQ;MACbC,IAAI,EAAE,MAAM;MACZC,IAAI,EAAE;IACR,CAAC,EAAE;MACDF,GAAG,EAAE,QAAQ;MACbG,SAAS,EAAE;QACTC,CAAC,EAAE;UAACC,aAAa,EAAE;QAAC;MACtB;IACF,CAAC,CACF;IAED,MAAMC,SAAS,GAAG,MAAM,IAAAC,uBAAgB,EAACR,MAAM,CAAC;IAEhDN,MAAM,CAACa,SAAS,CAAC,CACdE,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,QAAQ,CAAC,CAClBC,IAAI,CAACC,GAAG,CAACC,GAAG,CAACC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;IAE/CrB,MAAM,CAACa,SAAS,CAACS,WAAW,CAAC,CAACP,EAAE,CAACC,EAAE,CAACL,CAAC,CAAC,QAAQ,CAAC;IAC/CX,MAAM,CAACa,SAAS,CAACU,QAAQ,CAAC,CAACR,EAAE,CAACC,EAAE,CAACL,CAAC,CAAC,UAAU,CAAC;EAChD,CAAC,CAAC;EAEFP,QAAQ,CAAC,gBAAgB,EAAE,MAAM;IAC/BC,EAAE,CAAC,gDAAgD,EAAE,MAAM;MACzD,IAAI;QACF,IAAAS,uBAAgB,EAAC,CAAC;MACpB,CAAC,CAAC,OAAOU,KAAK,EAAE;QACdxB,MAAM,CAACwB,KAAK,CAAC,CAACT,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,OAAO,CAAC,CAACQ,IAAI,CAACC,QAAQ,CAAC,SAAS,EAAE,kCAAkC,CAAC;MAC9F;IACF,CAAC,CAAC;IAEFrB,EAAE,CAAC,0DAA0D,EAAE,MAAM;MACnE,MAAMC,MAAM,GAAG,CACb;QACEqB,MAAM,EAAE,QAAQ;QAChBC,IAAI,EAAE;MACR,CAAC,CACF;MAED,IAAI;QACF,IAAAd,uBAAgB,EAACR,MAAM,CAAC;MAC1B,CAAC,CAAC,OAAOkB,KAAK,EAAE;QACdxB,MAAM,CAACwB,KAAK,CAAC,CAACT,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,OAAO,CAAC,CAACQ,IAAI,CAACC,QAAQ,CAAC,SAAS,EAAE,oDAAoD,CAAC;MAChH;IACF,CAAC,CAAC;IAEFrB,EAAE,CAAC,sEAAsE,EAAE,MAAM;MAC/E,MAAMC,MAAM,GAAG,CACb;QACEqB,MAAM,EAAE,QAAQ;QAChBpB,GAAG,EAAE;MACP,CAAC,CACF;MAED,IAAI;QACF,IAAAO,uBAAgB,EAACR,MAAM,CAAC;MAC1B,CAAC,CAAC,OAAOkB,KAAK,EAAE;QACdxB,MAAM,CAACwB,KAAK,CAAC,CAACT,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,OAAO,CAAC,CAACQ,IAAI,CAACC,QAAQ,CAAC,SAAS,EAAE,sDAAsD,CAAC;MAClH;IACF,CAAC,CAAC;IAEFrB,EAAE,CAAC,wDAAwD,EAAE,MAAM;MACjE,MAAMC,MAAM,GAAG,CACb;QACEqB,MAAM,EAAE,QAAQ;QAChBpB,GAAG,EAAE;MACP,CAAC,CACF;MAED,IAAI;QACF,IAAAO,uBAAgB,EAACR,MAAM,CAAC;MAC1B,CAAC,CAAC,OAAOkB,KAAK,EAAE;QACdxB,MAAM,CAACwB,KAAK,CAAC,CAACT,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,OAAO,CAAC,CAACQ,IAAI,CAACC,QAAQ,CAAC,SAAS,EAAE,4CAA4C,CAAC;MACxG;IACF,CAAC,CAAC;IAEFrB,EAAE,CAAC,kDAAkD,EAAE,MAAM;MAC3D,MAAMC,MAAM,GAAG,CACb;QACEC,GAAG,EAAE,QAAQ;QACbsB,YAAY,EAAE;MAChB,CAAC,EAAE;QACDtB,GAAG,EAAE,QAAQ;QACbuB,MAAM,EAAE,IAAI;QACZpB,SAAS,EAAE;MACb,CAAC,CACF;MAED,IAAI;QACF,IAAAI,uBAAgB,EAACR,MAAM,CAAC;MAC1B,CAAC,CAAC,OAAOkB,KAAK,EAAE;QACdxB,MAAM,CAACwB,KAAK,CAAC,CAACT,EAAE,CAACC,EAAE,CAACC,EAAE,CAAC,OAAO,CAAC,CAACQ,IAAI,CAACC,QAAQ,CAAC,SAAS,EAAE,gDAAgD,CAAC;MAC5G;IACF,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFrB,EAAE,CAAC,iEAAiE,EAAE,YAAY;IAChF,MAAMC,MAAM,GAAG,CACb;MACEC,GAAG,EAAE,QAAQ;MACbsB,YAAY,EAAE;IAChB,CAAC,CACF;IAED,MAAME,MAAM,GAAG,IAAIC,sBAAU,CAAC;MAC5BL,MAAM,EAAE,EAAE;MACVM,MAAM,EAAE,CACN;QACE1B,GAAG,EAAE,KAAK;QACV2B,KAAK,EAAE;MACT,CAAC;IAEL,CAAC,CAAC;IAEF,MAAMrB,SAAS,GAAG,MAAM,IAAAC,uBAAgB,EAACR,MAAM,CAAC;IAChD,MAAM6B,MAAM,GAAG,MAAMtB,SAAS,CAACU,QAAQ,CAACQ,MAAM,CAAC;IAE/C/B,MAAM,CAACmC,MAAM,CAAC,CAACpB,EAAE,CAACqB,GAAG,CAAC;MAACC,KAAK,EAAE;IAAI,CAAC,CAAC;EACtC,CAAC,CAAC;;EAEF;EACAjC,QAAQ,CAAC,qCAAqC,EAAE,MAAM;IACpD,MAAME,MAAM,GAAG,CACb;MACEC,GAAG,EAAE,QAAQ;MACbC,IAAI,EAAE,MAAM;MACZC,IAAI,EAAE;IACR,CAAC,EAAE;MACDF,GAAG,EAAE,QAAQ;MACbG,SAAS,EAAE;QACTC,CAAC,EAAE;UAACC,aAAa,EAAE;QAAC;MACtB;IACF,CAAC,CACF;IAED,MAAM0B,WAAW,GAAG,IAAIN,sBAAU,CAAC;MACjCL,MAAM,EAAE,EAAE;MACVM,MAAM,EAAE,CACN;QACE1B,GAAG,EAAE,KAAK;QACV2B,KAAK,EAAE;MACT,CAAC,EAAE;QACD3B,GAAG,EAAE,KAAK;QACVC,IAAI,EAAE,GAAG;QACTC,IAAI,EAAE,GAAG;QACTC,SAAS,EAAE,CACT;UACE6B,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC;MAEL,CAAC,EAAE;QACD3B,GAAG,EAAE,KAAK;QACVC,IAAI,EAAE,GAAG;QACTC,IAAI,EAAE,GAAG;QACTC,SAAS,EAAE,CACT;UACE6B,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC,EAAE;UACDK,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC;MAEL,CAAC;IAEL,CAAC,CAAC;IAEF,MAAMM,iBAAiB,GAAG,IAAIR,sBAAU,CAAC;MACvCL,MAAM,EAAE,EAAE;MACVM,MAAM,EAAE,CACN;QACE1B,GAAG,EAAE,KAAK;QACV2B,KAAK,EAAE;MACT,CAAC,EAAE;QACD3B,GAAG,EAAE,KAAK;QACVC,IAAI,EAAE,GAAG;QACTC,IAAI,EAAE,GAAG;QACTC,SAAS,EAAE,CACT;UACE6B,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC;MAEL,CAAC,EAAE;QACD3B,GAAG,EAAE,KAAK;QACVC,IAAI,EAAE,GAAG;QACTC,IAAI,EAAE,GAAG;QACTC,SAAS,EAAE,CACT;UACE6B,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC,EAAE;UACDK,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC,EAAE;UACDK,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC;MAEL,CAAC;IAEL,CAAC,CAAC;IAEF7B,EAAE,CAAC,wBAAwB,EAAE,YAAY;MACvC,MAAMQ,SAAS,GAAG,MAAM,IAAAC,uBAAgB,EAACR,MAAM,CAAC;MAChD,MAAM6B,MAAM,GAAG,MAAMtB,SAAS,CAACU,QAAQ,CAACe,WAAW,CAAC;MAEpDtC,MAAM,CAACmC,MAAM,CAAC,CAACpB,EAAE,CAACqB,GAAG,CAAC;QAACC,KAAK,EAAE;MAAI,CAAC,CAAC;IACtC,CAAC,CAAC;IAEFhC,EAAE,CAAC,8CAA8C,EAAE,YAAY;MAC7D,MAAMQ,SAAS,GAAG,MAAM,IAAAC,uBAAgB,EAACR,MAAM,CAAC;MAChD,MAAM6B,MAAM,GAAG,MAAMtB,SAAS,CAACU,QAAQ,CAACiB,iBAAiB,CAAC;MAE1DxC,MAAM,CAACmC,MAAM,CAAC,CAACpB,EAAE,CAACqB,GAAG,CAAC;QAACC,KAAK,EAAE;MAAK,CAAC,CAAC;IACvC,CAAC,CAAC;EACJ,CAAC,CAAC;;EAEF;EACAjC,QAAQ,CAAC,sDAAsD,EAAE,MAAM;IACrE,MAAME,MAAM,GAAG,CACb;MACEC,GAAG,EAAE,QAAQ;MACbsB,YAAY,EAAE;IAChB,CAAC,EAAE;MACDtB,GAAG,EAAE,QAAQ;MACbuB,MAAM,EAAE,IAAI;MACZpB,SAAS,EAAE;QACTC,CAAC,EAAE;UAAC8B,QAAQ,EAAE,IAAI;UAAE7B,aAAa,EAAE,CAAC;UAAE8B,OAAO,EAAE;QAAM,CAAC;QACtDC,CAAC,EAAE;UAAC/B,aAAa,EAAE,CAAC;UAAE8B,OAAO,EAAE;QAAM;MACvC;IACF,CAAC,CACF;IAED,MAAMJ,WAAW,GAAG,IAAIN,sBAAU,CAAC;MACjCL,MAAM,EAAE,EAAE;MACVM,MAAM,EAAE,CACN;QACE1B,GAAG,EAAE,KAAK;QACV2B,KAAK,EAAE;MACT,CAAC,EAAE;QACD3B,GAAG,EAAE,KAAK;QACVC,IAAI,EAAE,GAAG;QACTC,IAAI,EAAE,GAAG;QACTC,SAAS,EAAE,CACT;UACE6B,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC;MAEL,CAAC,EAAE;QACD3B,GAAG,EAAE,KAAK;QACVC,IAAI,EAAE,GAAG;QACTC,IAAI,EAAE,GAAG;QACTC,SAAS,EAAE,CACT;UACE6B,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC,EAAE;UACDK,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC;MAEL,CAAC;IAEL,CAAC,CAAC;IAEF,MAAMU,kBAAkB,GAAG,IAAIZ,sBAAU,CAAC;MACxCL,MAAM,EAAE,EAAE;MACVM,MAAM,EAAE,CACN;QACE1B,GAAG,EAAE,KAAK;QACV2B,KAAK,EAAE;MACT,CAAC,EAAE;QACD3B,GAAG,EAAE,KAAK;QACVC,IAAI,EAAE,GAAG;QACTC,IAAI,EAAE,GAAG;QACTC,SAAS,EAAE,CACT;UACE6B,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC;MAEL,CAAC,EAAE;QACD3B,GAAG,EAAE,KAAK;QACVC,IAAI,EAAE,GAAG;QACTC,IAAI,EAAE,GAAG;QACTC,SAAS,EAAE,CACT;UACE6B,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC,EAAE;UACDK,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC,EAAE;UACDK,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC;MAEL,CAAC;IAEL,CAAC,CAAC;IAEF,MAAMW,oBAAoB,GAAG,IAAIb,sBAAU,CAAC;MAC1CL,MAAM,EAAE,EAAE;MACVM,MAAM,EAAE,CACN;QACE1B,GAAG,EAAE,KAAK;QACV2B,KAAK,EAAE;MACT,CAAC,EAAE;QACD3B,GAAG,EAAE,KAAK;QACVC,IAAI,EAAE,GAAG;QACTC,IAAI,EAAE,GAAG;QACTC,SAAS,EAAE,CACT;UACE6B,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC;MAEL,CAAC,EAAE;QACD3B,GAAG,EAAE,KAAK;QACVC,IAAI,EAAE,GAAG;QACTC,IAAI,EAAE,GAAG;QACTC,SAAS,EAAE,CACT;UACE6B,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC,EAAE;UACDK,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC,EAAE;UACDK,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC;MAEL,CAAC;IAEL,CAAC,CAAC;IAEF,MAAMY,mBAAmB,GAAG,IAAId,sBAAU,CAAC;MACzCL,MAAM,EAAE,EAAE;MACVM,MAAM,EAAE,CACN;QACE1B,GAAG,EAAE,KAAK;QACV2B,KAAK,EAAE;MACT,CAAC,EAAE;QACD3B,GAAG,EAAE,KAAK;QACVC,IAAI,EAAE,GAAG;QACTC,IAAI,EAAE,GAAG;QACTC,SAAS,EAAE,CACT;UACE6B,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC;MAEL,CAAC,EAAE;QACD3B,GAAG,EAAE,KAAK;QACVC,IAAI,EAAE,GAAG;QACTC,IAAI,EAAE,GAAG;QACTC,SAAS,EAAE,CACT;UACE6B,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC,EAAE;UACDK,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC;MAEL,CAAC;IAEL,CAAC,CAAC;IAEF,MAAMa,oBAAoB,GAAG,IAAIf,sBAAU,CAAC;MAC1CL,MAAM,EAAE,EAAE;MACVM,MAAM,EAAE,CACN;QACE1B,GAAG,EAAE,KAAK;QACVC,IAAI,EAAE,GAAG;QACTC,IAAI,EAAE,GAAG;QACTC,SAAS,EAAE,CACT;UACE6B,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC;MAEL,CAAC,EAAE;QACD3B,GAAG,EAAE,KAAK;QACVC,IAAI,EAAE,GAAG;QACTC,IAAI,EAAE,GAAG;QACTC,SAAS,EAAE,CACT;UACE6B,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC,EAAE;UACDK,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC;MAEL,CAAC;IAEL,CAAC,CAAC;IAEF,MAAMc,4BAA4B,GAAG,IAAIhB,sBAAU,CAAC;MAClDL,MAAM,EAAE,EAAE;MACVM,MAAM,EAAE,CACN;QACE1B,GAAG,EAAE,KAAK;QACV2B,KAAK,EAAE;MACT,CAAC,EAAE;QACD3B,GAAG,EAAE,KAAK;QACVC,IAAI,EAAE,GAAG;QACTC,IAAI,EAAE,GAAG;QACTC,SAAS,EAAE,CACT;UACE6B,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC;MAEL,CAAC,EAAE;QACD3B,GAAG,EAAE,KAAK;QACVC,IAAI,EAAE,GAAG;QACTC,IAAI,EAAE,GAAG;QACTC,SAAS,EAAE,CACT;UACE6B,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC;MAEL,CAAC;IAEL,CAAC,CAAC;IAEF7B,EAAE,CAAC,wBAAwB,EAAE,YAAY;MACvC,MAAMQ,SAAS,GAAG,MAAM,IAAAC,uBAAgB,EAACR,MAAM,CAAC;MAChD,MAAM6B,MAAM,GAAG,MAAMtB,SAAS,CAACU,QAAQ,CAACe,WAAW,CAAC;MAEpDtC,MAAM,CAACmC,MAAM,CAAC,CAACpB,EAAE,CAACqB,GAAG,CAAC;QAACC,KAAK,EAAE;MAAI,CAAC,CAAC;IACtC,CAAC,CAAC;IAEFhC,EAAE,CAAC,iDAAiD,EAAE,YAAY;MAChE,MAAMQ,SAAS,GAAG,MAAM,IAAAC,uBAAgB,EAACR,MAAM,CAAC;MAChD,MAAM6B,MAAM,GAAG,MAAMtB,SAAS,CAACU,QAAQ,CAACqB,kBAAkB,CAAC;MAE3D5C,MAAM,CAACmC,MAAM,CAAC,CAACpB,EAAE,CAACqB,GAAG,CAAC;QAACC,KAAK,EAAE;MAAK,CAAC,CAAC;IACvC,CAAC,CAAC;IAEFhC,EAAE,CAAC,+CAA+C,EAAE,YAAY;MAC9D,MAAMQ,SAAS,GAAG,MAAM,IAAAC,uBAAgB,EAACR,MAAM,CAAC;MAChD,MAAM6B,MAAM,GAAG,MAAMtB,SAAS,CAACU,QAAQ,CAACsB,oBAAoB,CAAC;MAE7D7C,MAAM,CAACmC,MAAM,CAAC,CAACpB,EAAE,CAACqB,GAAG,CAAC;QAACC,KAAK,EAAE;MAAK,CAAC,CAAC;IACvC,CAAC,CAAC;IAEFhC,EAAE,CAAC,0CAA0C,EAAE,YAAY;MACzD,MAAMQ,SAAS,GAAG,MAAM,IAAAC,uBAAgB,EAACR,MAAM,CAAC;MAChD,MAAM6B,MAAM,GAAG,MAAMtB,SAAS,CAACU,QAAQ,CAACuB,mBAAmB,CAAC;MAE5D9C,MAAM,CAACmC,MAAM,CAAC,CAACpB,EAAE,CAACqB,GAAG,CAAC;QAACC,KAAK,EAAE;MAAK,CAAC,CAAC;IACvC,CAAC,CAAC;IAEFhC,EAAE,CAAC,yCAAyC,EAAE,YAAY;MACxD,MAAMQ,SAAS,GAAG,MAAM,IAAAC,uBAAgB,EAACR,MAAM,CAAC;MAChD,MAAM6B,MAAM,GAAG,MAAMtB,SAAS,CAACU,QAAQ,CAACwB,oBAAoB,CAAC;MAE7D/C,MAAM,CAACmC,MAAM,CAAC,CAACpB,EAAE,CAACqB,GAAG,CAAC;QAACC,KAAK,EAAE;MAAK,CAAC,CAAC;IACvC,CAAC,CAAC;IACFhC,EAAE,CAAC,4CAA4C,EAAE,YAAY;MAC3D,MAAMQ,SAAS,GAAG,MAAM,IAAAC,uBAAgB,EAACR,MAAM,CAAC;MAChD,MAAM6B,MAAM,GAAG,MAAMtB,SAAS,CAACU,QAAQ,CAACyB,4BAA4B,CAAC;MAErEhD,MAAM,CAACmC,MAAM,CAAC,CAACpB,EAAE,CAACqB,GAAG,CAAC;QAACC,KAAK,EAAE;MAAK,CAAC,CAAC;IACvC,CAAC,CAAC;EACJ,CAAC,CAAC;;EAEF;EACAjC,QAAQ,CAAC,yBAAyB,EAAE,MAAM;IACxC,MAAME,MAAM,GAAG,CACb;MACEqB,MAAM,EAAE,SAAS;MACjBsB,YAAY,EAAE,CACZ;QACE1C,GAAG,EAAE,QAAQ;QACbG,SAAS,EAAE;UAAC,CAAC,EAAE;QAAS;MAC1B,CAAC;IAEL,CAAC,CACF;IAED,MAAM4B,WAAW,GAAG,IAAIN,sBAAU,CAAC;MACjCL,MAAM,EAAE,oBAAoB;MAC5BM,MAAM,EAAE,CACN;QACE1B,GAAG,EAAE,KAAK;QACV2B,KAAK,EAAE;MACT,CAAC,EAAE;QACD3B,GAAG,EAAE,KAAK;QACVC,IAAI,EAAE,GAAG;QACTC,IAAI,EAAE,GAAG;QACTC,SAAS,EAAE,CACT;UACE6B,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC;MAEL,CAAC,EAAE;QACD3B,GAAG,EAAE,KAAK;QACVC,IAAI,EAAE,GAAG;QACTC,IAAI,EAAE,GAAG;QACTC,SAAS,EAAE,CACT;UACE6B,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC,EAAE;UACDK,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC;MAEL,CAAC;IAEL,CAAC,CAAC;IAEF,MAAMgB,aAAa,GAAG,IAAIlB,sBAAU,CAAC;MACnCL,MAAM,EAAE,oBAAoB;MAC5BM,MAAM,EAAE,CACN;QACE1B,GAAG,EAAE,KAAK;QACV2B,KAAK,EAAE;MACT,CAAC,EAAE;QACD3B,GAAG,EAAE,KAAK;QACVC,IAAI,EAAE,GAAG;QACTC,IAAI,EAAE,GAAG;QACTC,SAAS,EAAE,CACT;UACE6B,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC;MAEL,CAAC,EAAE;QACD3B,GAAG,EAAE,KAAK;QACVC,IAAI,EAAE,GAAG;QACTC,IAAI,EAAE,GAAG;QACTC,SAAS,EAAE,CACT;UACE6B,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC,EAAE;UACDK,IAAI,EAAE,GAAG;UACTL,KAAK,EAAE;QACT,CAAC;MAEL,CAAC;IAEL,CAAC,CAAC;IAEF7B,EAAE,CAAC,wBAAwB,EAAE,YAAY;MACvC,MAAMQ,SAAS,GAAG,MAAM,IAAAC,uBAAgB,EAACR,MAAM,CAAC;MAChD,MAAM6B,MAAM,GAAG,MAAMtB,SAAS,CAACU,QAAQ,CAACe,WAAW,CAAC;MAEpDtC,MAAM,CAACmC,MAAM,CAAC,CAACpB,EAAE,CAACqB,GAAG,CAAC;QAACC,KAAK,EAAE;MAAI,CAAC,CAAC;IACtC,CAAC,CAAC;IAEFhC,EAAE,CAAC,0BAA0B,EAAE,YAAY;MACzC,MAAMQ,SAAS,GAAG,MAAM,IAAAC,uBAAgB,EAACR,MAAM,CAAC;MAChD,MAAM6B,MAAM,GAAG,MAAMtB,SAAS,CAACU,QAAQ,CAAC2B,aAAa,CAAC;MAEtDlD,MAAM,CAACmC,MAAM,CAAC,CAACpB,EAAE,CAACqB,GAAG,CAAC;QAACC,KAAK,EAAE;MAAK,CAAC,CAAC;IACvC,CAAC,CAAC;IAEFhC,EAAE,CAAC,8CAA8C,EAAE,YAAY;MAC7D,MAAMQ,SAAS,GAAG,MAAM,IAAAC,uBAAgB,EAAC,CAAC;QAACP,GAAG,EAAE,QAAQ;QAAE0C,YAAY,EAAE,CAAC;UAACtB,MAAM,EAAE;QAAY,CAAC;MAAC,CAAC,CAAC,CAAC;MACnG,MAAMQ,MAAM,GAAG,MAAMtB,SAAS,CAACU,QAAQ,CAAC,IAAIS,sBAAU,CAAC;QACrDL,MAAM,EAAE,0BAA0B;QAClCM,MAAM,EAAE,CACN;UAAC1B,GAAG,EAAE,KAAK;UAAE2B,KAAK,EAAE;QAAQ,CAAC,EAC7B;UAAC3B,GAAG,EAAE,KAAK;UAAE2B,KAAK,EAAE;QAAQ,CAAC;MAEjC,CAAC,CAAC,CAAC;MAEHlC,MAAM,CAACmC,MAAM,CAAC,CAACpB,EAAE,CAACqB,GAAG,CAAC;QAACC,KAAK,EAAE;MAAI,CAAC,CAAC;IACtC,CAAC,CAAC;IAEFhC,EAAE,CAAC,gDAAgD,EAAE,YAAY;MAC/D,MAAMQ,SAAS,GAAG,MAAM,IAAAC,uBAAgB,EAAC,CAAC;QAACP,GAAG,EAAE,QAAQ;QAAE0C,YAAY,EAAE,CAAC;UAACtB,MAAM,EAAE;QAAY,CAAC;MAAC,CAAC,CAAC,CAAC;MACnG,MAAMQ,MAAM,GAAG,MAAMtB,SAAS,CAACU,QAAQ,CAAC,IAAIS,sBAAU,CAAC;QACrDL,MAAM,EAAE,0BAA0B;QAClCM,MAAM,EAAE,CACN;UAAC1B,GAAG,EAAE,KAAK;UAAE2B,KAAK,EAAE;QAAQ,CAAC,EAC7B;UAAC3B,GAAG,EAAE,KAAK;UAAE2B,KAAK,EAAE;QAAQ,CAAC;MAEjC,CAAC,CAAC,CAAC;MAEHlC,MAAM,CAACmC,MAAM,CAAC,CAACpB,EAAE,CAACqB,GAAG,CAAC;QAACC,KAAK,EAAE;MAAK,CAAC,CAAC;IACvC,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC"}
@@ -1,28 +1,32 @@
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 require-await */'use strict';Object.defineProperty(exports,'__esModule',{value:true});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')})}}exports.default=(()=>{var _ref=_asyncToGenerator(function*(tagPatterns){let validate=(()=>{var _ref2=_asyncToGenerator(function*(record){const missingFields=tagPatterns.map(function(pattern){const result=record.fields.find(function(field){return pattern.test(field.tag)});return result?undefined:pattern});const isEmpty=missingFields.every(function(index){return index===undefined});let errorMessage=['The following tag patterns are not present in the record tag field: '];errorMessage=errorMessage.concat(missingFields).join(' ');return isEmpty?{valid:true,messages:[]}:{valid:false,messages:[errorMessage]}});return function validate(_x2){return _ref2.apply(this,arguments)}})();if(Array.isArray(tagPatterns)){return{description:'Checks whether the configured fields are present in the record',validate}}throw new Error('No tag pattern array provided')});return function(_x){return _ref.apply(this,arguments)}})();
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = _default;
7
+ function _default(tagPatterns) {
8
+ if (Array.isArray(tagPatterns)) {
9
+ return {
10
+ description: 'Checks whether the configured fields are present in the record',
11
+ validate
12
+ };
13
+ }
14
+ throw new Error('No tag pattern array provided');
15
+ function validate(record) {
16
+ const missingFields = tagPatterns.map(pattern => {
17
+ const result = record.fields.find(field => pattern.test(field.tag));
18
+ return result ? undefined : pattern;
19
+ });
20
+ const isEmpty = missingFields.every(index => index === undefined);
21
+ let errorMessage = ['The following tag patterns are not present in the record tag field: ']; // eslint-disable-line functional/no-let
22
+ errorMessage = errorMessage.concat(missingFields).join(' ');
23
+ return isEmpty ? {
24
+ valid: true,
25
+ messages: []
26
+ } : {
27
+ valid: false,
28
+ messages: [errorMessage]
29
+ };
30
+ }
31
+ }
28
32
  //# sourceMappingURL=fields-present.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/fields-present.js"],"names":["tagPatterns","record","missingFields","map","result","fields","find","pattern","test","field","tag","undefined","isEmpty","every","index","errorMessage","concat","join","valid","messages","validate","Array","isArray","description","Error"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BA,kCACA,a,ofAEe,UAAgBA,WAAhB,CAA6B,gDAU3C,UAAwBC,MAAxB,CAAgC,CAC/B,KAAMC,eAAgBF,YAAYG,GAAZ,CAAgB,iBAAW,CAChD,KAAMC,QAASH,OAAOI,MAAP,CAAcC,IAAd,CAAmB,sBAASC,SAAQC,IAAR,CAAaC,MAAMC,GAAnB,CAAT,CAAnB,CAAf,CACA,MAAON,QAASO,SAAT,CAAqBJ,OAC5B,CAHqB,CAAtB,CAIA,KAAMK,SAAUV,cAAcW,KAAd,CAAoB,sBAASC,SAAUH,SAAnB,CAApB,CAAhB,CACA,GAAII,cAAe,CAAC,sEAAD,CAAnB,CACAA,aAAeA,aAAaC,MAAb,CAAoBd,aAApB,EAAmCe,IAAnC,CAAwC,GAAxC,CAAf,CAEA,MAAOL,SAAU,CAACM,MAAO,IAAR,CAAcC,SAAU,EAAxB,CAAV,CAAwC,CAACD,MAAO,KAAR,CAAeC,SAAU,CAACJ,YAAD,CAAzB,CAC/C,CApB0C,iBAU5BK,SAV4B,8CAC3C,GAAIC,MAAMC,OAAN,CAActB,WAAd,CAAJ,CAAgC,CAC/B,MAAO,CACNuB,YACC,gEAFK,CAGNH,QAHM,CAKP,CACD,KAAM,IAAII,MAAJ,CAAU,+BAAV,CAaN,C","file":"fields-present.js","sourcesContent":["/**\n *\n * @licstart The following is the entire license notice for the JavaScript code in this file.\n *\n * MARC record validators used in Melinda\n *\n * Copyright (C) 2014-2018 University Of Helsinki (The National Library Of Finland)\n *\n * This file is part of marc-record-validators-melinda\n *\n * marc-record-validators-melinda program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * marc-record-validators-melinda is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n * @licend The above is the entire license notice\n * for the JavaScript code in this file.\n *\n */\n\n/* eslint-disable require-await */\n'use strict';\n\nexport default async function (tagPatterns) {\n\tif (Array.isArray(tagPatterns)) {\n\t\treturn {\n\t\t\tdescription:\n\t\t\t\t'Checks whether the configured fields are present in the record',\n\t\t\tvalidate\n\t\t};\n\t}\n\tthrow new Error('No tag pattern array provided');\n\n\tasync function validate(record) {\n\t\tconst missingFields = tagPatterns.map(pattern => {\n\t\t\tconst result = record.fields.find(field => pattern.test(field.tag));\n\t\t\treturn result ? undefined : pattern;\n\t\t});\n\t\tconst isEmpty = missingFields.every(index => index === undefined);\n\t\tlet errorMessage = ['The following tag patterns are not present in the record tag field: '];\n\t\terrorMessage = errorMessage.concat(missingFields).join(' ');\n\n\t\treturn isEmpty ? {valid: true, messages: []} : {valid: false, messages: [errorMessage]};\n\t}\n}\n"]}
1
+ {"version":3,"file":"fields-present.js","names":["_default","tagPatterns","Array","isArray","description","validate","Error","record","missingFields","map","pattern","result","fields","find","field","test","tag","undefined","isEmpty","every","index","errorMessage","concat","join","valid","messages"],"sources":["../src/fields-present.js"],"sourcesContent":["export default function (tagPatterns) {\n if (Array.isArray(tagPatterns)) {\n return {\n description:\n 'Checks whether the configured fields are present in the record',\n validate\n };\n }\n\n throw new Error('No tag pattern array provided');\n\n function validate(record) {\n const missingFields = tagPatterns.map(pattern => {\n const result = record.fields.find(field => pattern.test(field.tag));\n return result ? undefined : pattern;\n });\n const isEmpty = missingFields.every(index => index === undefined);\n let errorMessage = ['The following tag patterns are not present in the record tag field: ']; // eslint-disable-line functional/no-let\n errorMessage = errorMessage.concat(missingFields).join(' ');\n\n return isEmpty ? {valid: true, messages: []} : {valid: false, messages: [errorMessage]};\n }\n}\n"],"mappings":";;;;;;AAAe,SAAAA,SAAUC,WAAW,EAAE;EACpC,IAAIC,KAAK,CAACC,OAAO,CAACF,WAAW,CAAC,EAAE;IAC9B,OAAO;MACLG,WAAW,EACT,gEAAgE;MAClEC;IACF,CAAC;EACH;EAEA,MAAM,IAAIC,KAAK,CAAC,+BAA+B,CAAC;EAEhD,SAASD,QAAQA,CAACE,MAAM,EAAE;IACxB,MAAMC,aAAa,GAAGP,WAAW,CAACQ,GAAG,CAACC,OAAO,IAAI;MAC/C,MAAMC,MAAM,GAAGJ,MAAM,CAACK,MAAM,CAACC,IAAI,CAACC,KAAK,IAAIJ,OAAO,CAACK,IAAI,CAACD,KAAK,CAACE,GAAG,CAAC,CAAC;MACnE,OAAOL,MAAM,GAAGM,SAAS,GAAGP,OAAO;IACrC,CAAC,CAAC;IACF,MAAMQ,OAAO,GAAGV,aAAa,CAACW,KAAK,CAACC,KAAK,IAAIA,KAAK,KAAKH,SAAS,CAAC;IACjE,IAAII,YAAY,GAAG,CAAC,sEAAsE,CAAC,CAAC,CAAC;IAC7FA,YAAY,GAAGA,YAAY,CAACC,MAAM,CAACd,aAAa,CAAC,CAACe,IAAI,CAAC,GAAG,CAAC;IAE3D,OAAOL,OAAO,GAAG;MAACM,KAAK,EAAE,IAAI;MAAEC,QAAQ,EAAE;IAAE,CAAC,GAAG;MAACD,KAAK,EAAE,KAAK;MAAEC,QAAQ,EAAE,CAACJ,YAAY;IAAC,CAAC;EACzF;AACF"}
@@ -1,28 +1,121 @@
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 _fieldsPresent=require('../src/fields-present');var _fieldsPresent2=_interopRequireDefault(_fieldsPresent);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')})}}const{expect}=_chai2.default;_chai2.default.use(_chaiAsPromised2.default);describe('fields-present',()=>{it('Creates a validator',_asyncToGenerator(function*(){const validator=yield(0,_fieldsPresent2.default)([/^500$/,/^400$/]);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 tagPatterns not provided',_asyncToGenerator(function*(){yield expect((0,_fieldsPresent2.default)()).to.be.rejectedWith(Error,'No tag pattern array provided')}));describe('#validate',()=>{it('Finds the record valid',_asyncToGenerator(function*(){const tagPatterns=[/^5..$/,/^FOO$/];const validator=yield(0,_fieldsPresent2.default)(tagPatterns);const record=new _marcRecord.MarcRecord({fields:[{tag:'500',ind1:' ',ind2:'0',subfields:[{code:'a',value:'foo'}]},{tag:'FOO',ind1:' ',ind2:'0',subfields:[{code:'a',value:'foo'}]}]});const result=yield validator.validate(record);expect(result).to.eql({valid:true,messages:[]})}));it('Finds the record invalid',_asyncToGenerator(function*(){const tagPatterns=[/^5..$/,/^FOO$/];const validator=yield(0,_fieldsPresent2.default)(tagPatterns);const record=new _marcRecord.MarcRecord({fields:[{tag:'001',ind1:' ',ind2:'0',subfields:[{code:'a',value:'foo'}]},{tag:'BAR',ind1:'1',ind2:'0',subfields:[{code:'a',value:'foo'}]}]});const result=yield validator.validate(record);expect(result).to.eql({valid:false,messages:['The following tag patterns are not present in the record tag field: /^5..$/ /^FOO$/']})}))})});
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 _fieldsPresent = _interopRequireDefault(require("../src/fields-present"));
7
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
+ const {
9
+ expect
10
+ } = _chai.default;
11
+ _chai.default.use(_chaiAsPromised.default);
12
+ describe('fields-present', () => {
13
+ it('Creates a validator', async () => {
14
+ const validator = await (0, _fieldsPresent.default)([/^500$/u, /^400$/u]);
15
+ expect(validator).to.be.an('object').that.has.any.keys('description', 'validate');
16
+ expect(validator.description).to.be.a('string');
17
+ expect(validator.validate).to.be.a('function');
18
+ });
19
+ it('Throws an error when tagPatterns not provided', () => {
20
+ try {
21
+ (0, _fieldsPresent.default)();
22
+ } catch (error) {
23
+ expect(error).to.be.an('error').with.property('message', 'No tag pattern array provided');
24
+ }
25
+ });
26
+ describe('#validate', () => {
27
+ it('Finds the record valid', async () => {
28
+ const tagPatterns = [/^5..$/u, /^FOO$/u];
29
+ const validator = await (0, _fieldsPresent.default)(tagPatterns);
30
+ const record = new _marcRecord.MarcRecord({
31
+ fields: [{
32
+ tag: '500',
33
+ ind1: ' ',
34
+ ind2: '0',
35
+ subfields: [{
36
+ code: 'a',
37
+ value: 'foo'
38
+ }]
39
+ }, {
40
+ tag: 'FOO',
41
+ ind1: ' ',
42
+ ind2: '0',
43
+ subfields: [{
44
+ code: 'a',
45
+ value: 'foo'
46
+ }]
47
+ }]
48
+ });
49
+ const result = await validator.validate(record);
50
+ expect(result).to.eql({
51
+ valid: true,
52
+ messages: []
53
+ });
54
+ });
55
+ it('Finds the record valid', async () => {
56
+ const tagPatterns = [/^(020|022|024)$/u]; // eslint-disable-line
57
+ const validator = await (0, _fieldsPresent.default)(tagPatterns);
58
+ const record = new _marcRecord.MarcRecord({
59
+ fields: [{
60
+ tag: '020',
61
+ ind1: ' ',
62
+ ind2: '0',
63
+ subfields: [{
64
+ code: 'a',
65
+ value: 'foo'
66
+ }]
67
+ }, {
68
+ tag: '040',
69
+ ind1: ' ',
70
+ ind2: '0',
71
+ subfields: [{
72
+ code: 'a',
73
+ value: 'foo'
74
+ }]
75
+ }]
76
+ });
77
+ const result = await validator.validate(record);
78
+ expect(result).to.eql({
79
+ valid: true,
80
+ messages: []
81
+ });
82
+ });
83
+ it('Finds the record invalid', async () => {
84
+ const tagPatterns = [/^5..$/u, /^FOO$/u];
85
+ const validator = await (0, _fieldsPresent.default)(tagPatterns);
86
+ const record = new _marcRecord.MarcRecord({
87
+ fields: [{
88
+ tag: '001',
89
+ ind1: ' ',
90
+ ind2: '0',
91
+ subfields: [{
92
+ code: 'a',
93
+ value: 'foo'
94
+ }]
95
+ }, {
96
+ tag: '500',
97
+ ind1: ' ',
98
+ ind2: '0',
99
+ subfields: [{
100
+ code: 'a',
101
+ value: 'foo'
102
+ }]
103
+ }, {
104
+ tag: 'BAR',
105
+ ind1: '1',
106
+ ind2: '0',
107
+ subfields: [{
108
+ code: 'a',
109
+ value: 'foo'
110
+ }]
111
+ }]
112
+ });
113
+ const result = await validator.validate(record);
114
+ expect(result).to.eql({
115
+ valid: false,
116
+ messages: ['The following tag patterns are not present in the record tag field: /^FOO$/u']
117
+ });
118
+ });
119
+ });
120
+ });
28
121
  //# sourceMappingURL=fields-present.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/fields-present.spec.js"],"names":["expect","chai","use","chaiAsPromised","describe","it","validator","to","be","an","that","has","any","keys","description","a","validate","rejectedWith","Error","tagPatterns","record","MarcRecord","fields","tag","ind1","ind2","subfields","code","value","result","eql","valid","messages"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BA,0EAEA,aAEA,0B,yCACA,gD,6DACA,iDACA,oD,uhBAEA,KAAM,CAACA,MAAD,EAAWC,cAAjB,CACAA,eAAKC,GAAL,CAASC,wBAAT,EAEAC,SAAS,gBAAT,CAA2B,IAAM,CAChCC,GAAG,qBAAH,mBAA0B,WAAY,CACrC,KAAMC,WAAY,KAAM,4BAAiB,CAAC,OAAD,CAAU,OAAV,CAAjB,CAAxB,CAEAN,OAAOM,SAAP,EACEC,EADF,CACKC,EADL,CACQC,EADR,CACW,QADX,EAEEC,IAFF,CAEOC,GAFP,CAEWC,GAFX,CAEeC,IAFf,CAEoB,aAFpB,CAEmC,UAFnC,EAIAb,OAAOM,UAAUQ,WAAjB,EAA8BP,EAA9B,CAAiCC,EAAjC,CAAoCO,CAApC,CAAsC,QAAtC,EACAf,OAAOM,UAAUU,QAAjB,EAA2BT,EAA3B,CAA8BC,EAA9B,CAAiCO,CAAjC,CAAmC,UAAnC,CACA,CATD,GAWAV,GAAG,+CAAH,mBAAoD,WAAY,CAC/D,KAAML,QAAO,6BAAP,EAA2BO,EAA3B,CAA8BC,EAA9B,CAAiCS,YAAjC,CAA8CC,KAA9C,CAAqD,+BAArD,CACN,CAFD,GAIAd,SAAS,WAAT,CAAsB,IAAM,CAC3BC,GAAG,wBAAH,mBAA6B,WAAY,CACxC,KAAMc,aAAc,CAAC,OAAD,CAAU,OAAV,CAApB,CACA,KAAMb,WAAY,KAAM,4BAAiBa,WAAjB,CAAxB,CACA,KAAMC,QAAS,GAAIC,uBAAJ,CAAe,CAC7BC,OAAQ,CACP,CACCC,IAAK,KADN,CAECC,KAAM,GAFP,CAGCC,KAAM,GAHP,CAICC,UAAW,CAAC,CAACC,KAAM,GAAP,CAAYC,MAAO,KAAnB,CAAD,CAJZ,CADO,CAOP,CACCL,IAAK,KADN,CAECC,KAAM,GAFP,CAGCC,KAAM,GAHP,CAICC,UAAW,CAAC,CAACC,KAAM,GAAP,CAAYC,MAAO,KAAnB,CAAD,CAJZ,CAPO,CADqB,CAAf,CAAf,CAgBA,KAAMC,QAAS,KAAMvB,WAAUU,QAAV,CAAmBI,MAAnB,CAArB,CAEApB,OAAO6B,MAAP,EAAetB,EAAf,CAAkBuB,GAAlB,CAAsB,CAACC,MAAO,IAAR,CAAcC,SAAU,EAAxB,CAAtB,CACA,CAtBD,GAuBA3B,GAAG,0BAAH,mBAA+B,WAAY,CAC1C,KAAMc,aAAc,CAAC,OAAD,CAAU,OAAV,CAApB,CACA,KAAMb,WAAY,KAAM,4BAAiBa,WAAjB,CAAxB,CACA,KAAMC,QAAS,GAAIC,uBAAJ,CAAe,CAC7BC,OAAQ,CACP,CACCC,IAAK,KADN,CAECC,KAAM,GAFP,CAGCC,KAAM,GAHP,CAICC,UAAW,CAAC,CAACC,KAAM,GAAP,CAAYC,MAAO,KAAnB,CAAD,CAJZ,CADO,CAOP,CACCL,IAAK,KADN,CAECC,KAAM,GAFP,CAGCC,KAAM,GAHP,CAICC,UAAW,CAAC,CAACC,KAAM,GAAP,CAAYC,MAAO,KAAnB,CAAD,CAJZ,CAPO,CADqB,CAAf,CAAf,CAgBA,KAAMC,QAAS,KAAMvB,WAAUU,QAAV,CAAmBI,MAAnB,CAArB,CAEApB,OAAO6B,MAAP,EAAetB,EAAf,CAAkBuB,GAAlB,CAAsB,CAACC,MAAO,KAAR,CAAeC,SAAU,CAC9C,sFAD8C,CAAzB,CAAtB,CAGA,CAxBD,EAyBA,CAjDD,CAkDA,CAlED","file":"fields-present.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 chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/fields-present';\n\nconst {expect} = chai;\nchai.use(chaiAsPromised);\n\ndescribe('fields-present', () => {\n\tit('Creates a validator', async () => {\n\t\tconst validator = await validatorFactory([/^500$/, /^400$/]);\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 tagPatterns not provided', async () => {\n\t\tawait expect(validatorFactory()).to.be.rejectedWith(Error, 'No tag pattern array provided');\n\t});\n\n\tdescribe('#validate', () => {\n\t\tit('Finds the record valid', async () => {\n\t\t\tconst tagPatterns = [/^5..$/, /^FOO$/];\n\t\t\tconst validator = await validatorFactory(tagPatterns);\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: 'FOO',\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 tagPatterns = [/^5..$/, /^FOO$/];\n\t\t\tconst validator = await validatorFactory(tagPatterns);\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\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: 'BAR',\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: [\n\t\t\t\t'The following tag patterns are not present in the record tag field: /^5..$/ /^FOO$/'\n\t\t\t]});\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"fields-present.spec.js","names":["_chai","_interopRequireDefault","require","_chaiAsPromised","_marcRecord","_fieldsPresent","obj","__esModule","default","expect","chai","use","chaiAsPromised","describe","it","validator","validatorFactory","to","be","an","that","has","any","keys","description","a","validate","error","with","property","tagPatterns","record","MarcRecord","fields","tag","ind1","ind2","subfields","code","value","result","eql","valid","messages"],"sources":["../src/fields-present.spec.js"],"sourcesContent":["import chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport validatorFactory from '../src/fields-present';\n\nconst {expect} = chai;\nchai.use(chaiAsPromised);\n\ndescribe('fields-present', () => {\n it('Creates a validator', async () => {\n const validator = await validatorFactory([/^500$/u, /^400$/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\n it('Throws an error when tagPatterns not provided', () => {\n try {\n validatorFactory();\n } catch (error) {\n expect(error).to.be.an('error').with.property('message', 'No tag pattern array provided');\n }\n });\n\n describe('#validate', () => {\n it('Finds the record valid', async () => {\n const tagPatterns = [/^5..$/u, /^FOO$/u];\n const validator = await validatorFactory(tagPatterns);\n const record = new MarcRecord({\n fields: [\n {\n tag: '500',\n ind1: ' ',\n ind2: '0',\n subfields: [{code: 'a', value: 'foo'}]\n },\n {\n tag: 'FOO',\n ind1: ' ',\n ind2: '0',\n subfields: [{code: 'a', value: 'foo'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: true, messages: []});\n });\n it('Finds the record valid', async () => {\n const tagPatterns = [/^(020|022|024)$/u]; // eslint-disable-line\n const validator = await validatorFactory(tagPatterns);\n const record = new MarcRecord({\n fields: [\n {\n tag: '020',\n ind1: ' ',\n ind2: '0',\n subfields: [{code: 'a', value: 'foo'}]\n },\n {\n tag: '040',\n ind1: ' ',\n ind2: '0',\n subfields: [{code: 'a', value: 'foo'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: true, messages: []});\n });\n it('Finds the record invalid', async () => {\n const tagPatterns = [/^5..$/u, /^FOO$/u];\n const validator = await validatorFactory(tagPatterns);\n const record = new MarcRecord({\n fields: [\n {\n tag: '001',\n ind1: ' ',\n ind2: '0',\n subfields: [{code: 'a', value: 'foo'}]\n },\n {\n tag: '500',\n ind1: ' ',\n ind2: '0',\n subfields: [{code: 'a', value: 'foo'}]\n },\n {\n tag: 'BAR',\n ind1: '1',\n ind2: '0',\n subfields: [{code: 'a', value: 'foo'}]\n }\n ]\n });\n const result = await validator.validate(record);\n\n expect(result).to.eql({valid: false, messages: ['The following tag patterns are not present in the record tag field: /^FOO$/u']});\n });\n });\n});\n"],"mappings":"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"}
@@ -1,28 +1,73 @@
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 require-await */'use strict';Object.defineProperty(exports,'__esModule',{value:true});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')})}}exports.default=(()=>{var _ref=_asyncToGenerator(function*(configuration){let validate=(()=>{var _ref2=_asyncToGenerator(function*(record){const messages=configuration.reduce(function(messages,item){let results;if(item.leader){results=validateField(record.leader,item)}else{results=record.get(item.tag).map(function(f){return validateField(f.value,item,f.tag)})}if(results&&results.length>0){return messages.concat(...results).reduce(function(acc,item){return acc.includes(item)?acc:acc.concat(item)},[])}return messages},[]);return{valid:messages.length===0,messages};function validateField(value,spec,tag){const messagePrefix=tag?`Field ${tag}`:'Leader';if(typeof spec.length==='number'){if(value.length!==spec.length){return[`${messagePrefix} has invalid length`]}}if(spec.rules){return spec.rules.reduce((messages,rule,ruleIndex)=>{const indexes=getIndexes(rule.position);const positions=value.split('').reduce((positions,char,index)=>{if(indexes.includes(index)&&(!rule.dependencies||rule.dependencies.every(checkDependency))){if(!rule.pattern.test(char)){return positions.concat(index)}}return positions;function checkDependency(dependency){const indexes=getIndexes(dependency.position);return value.split('').every((char,index)=>{return!indexes.includes(index)||dependency.pattern.test(char)})}},[]);if(positions.length>0){return messages.concat(`${messagePrefix} has invalid values at positions: ${positions.join()} (Rule index ${ruleIndex})`)}return messages;function getIndexes(arg){if(Array.isArray(arg)){const indexes=[...new Array(arg[1]+1).keys()];return indexes.slice(arg[0],arg[1]+1)}return[arg]}},[])}}});return function validate(_x2){return _ref2.apply(this,arguments)}})();if(Array.isArray(configuration)){return{description:'Validates fixed fields',validate}}throw new Error('No configuration provided')});return function(_x){return _ref.apply(this,arguments)}})();
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = _default;
7
+ function _default(configuration) {
8
+ if (Array.isArray(configuration)) {
9
+ return {
10
+ description: 'Validates fixed fields',
11
+ validate
12
+ };
13
+ }
14
+ throw new Error('No configuration provided');
15
+ function validate(record) {
16
+ const messages = configuration.reduce((messages, item) => {
17
+ let results; // eslint-disable-line functional/no-let
18
+
19
+ if (item.leader) {
20
+ // eslint-disable-line functional/no-conditional-statements
21
+ results = validateField(record.leader, item);
22
+ } else {
23
+ // eslint-disable-line functional/no-conditional-statements
24
+ results = record.get(item.tag).map(f => validateField(f.value, item, f.tag));
25
+ }
26
+ if (results && results.length > 0) {
27
+ return messages.concat(...results).reduce((acc, item) => acc.includes(item) ? acc : acc.concat(item), []);
28
+ }
29
+ return messages;
30
+ }, []);
31
+ return {
32
+ valid: messages.length === 0,
33
+ messages
34
+ };
35
+ function validateField(value, spec, tag) {
36
+ const messagePrefix = tag ? `Field ${tag}` : 'Leader';
37
+ if (typeof spec.length === 'number') {
38
+ if (value.length !== spec.length) {
39
+ return [`${messagePrefix} has invalid length`];
40
+ }
41
+ }
42
+ if (spec.rules) {
43
+ return spec.rules.reduce((messages, rule, ruleIndex) => {
44
+ const indexes = getIndexes(rule.position);
45
+ const positions = value.split('').reduce((positions, char, index) => {
46
+ if (indexes.includes(index) && (!rule.dependencies || rule.dependencies.every(checkDependency))) {
47
+ if (!rule.pattern.test(char)) {
48
+ return positions.concat(index);
49
+ }
50
+ }
51
+ return positions;
52
+ function checkDependency(dependency) {
53
+ const indexes = getIndexes(dependency.position);
54
+ return value.split('').every((char, index) => !indexes.includes(index) || dependency.pattern.test(char));
55
+ }
56
+ }, []);
57
+ if (positions.length > 0) {
58
+ return messages.concat(`${messagePrefix} has invalid values at positions: ${positions.join()} (Rule index ${ruleIndex})`);
59
+ }
60
+ return messages;
61
+ function getIndexes(arg) {
62
+ if (Array.isArray(arg)) {
63
+ const indexes = [...new Array(arg[1] + 1).keys()];
64
+ return indexes.slice(arg[0], arg[1] + 1);
65
+ }
66
+ return [arg];
67
+ }
68
+ }, []);
69
+ }
70
+ }
71
+ }
72
+ }
28
73
  //# sourceMappingURL=fixed-fields.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/fixed-fields.js"],"names":["configuration","record","messages","reduce","item","results","leader","validateField","get","tag","map","f","value","length","concat","acc","includes","valid","spec","messagePrefix","rules","rule","ruleIndex","indexes","getIndexes","position","positions","split","char","index","dependencies","every","checkDependency","pattern","test","dependency","join","arg","Array","isArray","keys","slice","validate","description","Error"],"mappings":"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","file":"fixed-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/* eslint-disable require-await */\n'use strict';\n\nexport default async function (configuration) {\n\tif (Array.isArray(configuration)) {\n\t\treturn {\n\t\t\tdescription:\n\t\t\t'Validates fixed fields',\n\t\t\tvalidate\n\t\t};\n\t}\n\tthrow new Error('No configuration provided');\n\n\tasync function validate(record) {\n\t\tconst messages = configuration.reduce((messages, item) => {\n\t\t\tlet results;\n\n\t\t\tif (item.leader) {\n\t\t\t\tresults = validateField(record.leader, item);\n\t\t\t} else {\n\t\t\t\tresults = record.get(item.tag)\n\t\t\t\t\t.map(f => validateField(f.value, item, f.tag));\n\t\t\t}\n\n\t\t\tif (results && results.length > 0) {\n\t\t\t\treturn messages.concat(...results).reduce((acc, item) => {\n\t\t\t\t\treturn acc.includes(item) ? acc : acc.concat(item);\n\t\t\t\t}, []);\n\t\t\t}\n\n\t\t\treturn messages;\n\t\t}, []);\n\n\t\treturn {valid: messages.length === 0, messages};\n\n\t\tfunction validateField(value, spec, tag) {\n\t\t\tconst messagePrefix = tag ? `Field ${tag}` : 'Leader';\n\n\t\t\tif (typeof spec.length === 'number') {\n\t\t\t\tif (value.length !== spec.length) {\n\t\t\t\t\treturn [`${messagePrefix} has invalid length`];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (spec.rules) {\n\t\t\t\treturn spec.rules.reduce((messages, rule, ruleIndex) => {\n\t\t\t\t\tconst indexes = getIndexes(rule.position);\n\t\t\t\t\tconst positions = value.split('').reduce((positions, char, index) => {\n\t\t\t\t\t\tif (indexes.includes(index) && (!rule.dependencies || rule.dependencies.every(checkDependency))) {\n\t\t\t\t\t\t\tif (!rule.pattern.test(char)) {\n\t\t\t\t\t\t\t\treturn positions.concat(index);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn positions;\n\n\t\t\t\t\t\tfunction checkDependency(dependency) {\n\t\t\t\t\t\t\tconst indexes = getIndexes(dependency.position);\n\t\t\t\t\t\t\treturn value.split('').every((char, index) => {\n\t\t\t\t\t\t\t\treturn !indexes.includes(index) || dependency.pattern.test(char);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}, []);\n\n\t\t\t\t\tif (positions.length > 0) {\n\t\t\t\t\t\treturn messages.concat(`${messagePrefix} has invalid values at positions: ${positions.join()} (Rule index ${ruleIndex})`);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn messages;\n\n\t\t\t\t\tfunction getIndexes(arg) {\n\t\t\t\t\t\tif (Array.isArray(arg)) {\n\t\t\t\t\t\t\tconst indexes = [...new Array(arg[1] + 1).keys()];\n\t\t\t\t\t\t\treturn indexes.slice(arg[0], arg[1] + 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn [arg];\n\t\t\t\t\t}\n\t\t\t\t}, []);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"fixed-fields.js","names":["_default","configuration","Array","isArray","description","validate","Error","record","messages","reduce","item","results","leader","validateField","get","tag","map","f","value","length","concat","acc","includes","valid","spec","messagePrefix","rules","rule","ruleIndex","indexes","getIndexes","position","positions","split","char","index","dependencies","every","checkDependency","pattern","test","dependency","join","arg","keys","slice"],"sources":["../src/fixed-fields.js"],"sourcesContent":["export default function (configuration) {\n if (Array.isArray(configuration)) {\n return {\n description:\n 'Validates fixed fields',\n validate\n };\n }\n\n throw new Error('No configuration provided');\n\n function validate(record) {\n const messages = configuration.reduce((messages, item) => {\n let results; // eslint-disable-line functional/no-let\n\n if (item.leader) { // eslint-disable-line functional/no-conditional-statements\n results = validateField(record.leader, item);\n } else { // eslint-disable-line functional/no-conditional-statements\n results = record.get(item.tag)\n .map(f => validateField(f.value, item, f.tag));\n }\n\n if (results && results.length > 0) {\n return messages.concat(...results).reduce((acc, item) => acc.includes(item) ? acc : acc.concat(item), []);\n }\n\n return messages;\n }, []);\n\n return {valid: messages.length === 0, messages};\n\n function validateField(value, spec, tag) {\n const messagePrefix = tag ? `Field ${tag}` : 'Leader';\n\n if (typeof spec.length === 'number') {\n if (value.length !== spec.length) {\n return [`${messagePrefix} has invalid length`];\n }\n }\n\n if (spec.rules) {\n return spec.rules.reduce((messages, rule, ruleIndex) => {\n const indexes = getIndexes(rule.position);\n const positions = value.split('').reduce((positions, char, index) => {\n if (indexes.includes(index) && (!rule.dependencies || rule.dependencies.every(checkDependency))) {\n if (!rule.pattern.test(char)) {\n return positions.concat(index);\n }\n }\n\n return positions;\n\n function checkDependency(dependency) {\n const indexes = getIndexes(dependency.position);\n return value.split('').every((char, index) => !indexes.includes(index) || dependency.pattern.test(char));\n }\n }, []);\n\n if (positions.length > 0) {\n return messages.concat(`${messagePrefix} has invalid values at positions: ${positions.join()} (Rule index ${ruleIndex})`);\n }\n\n return messages;\n\n function getIndexes(arg) {\n if (Array.isArray(arg)) {\n const indexes = [...new Array(arg[1] + 1).keys()];\n return indexes.slice(arg[0], arg[1] + 1);\n }\n\n return [arg];\n }\n }, []);\n }\n }\n }\n}\n"],"mappings":"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"}