@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.js"],"names":["confSpec","leader","type","excl","tag","valuePattern","ind1","ind2","strict","subfields","contains","dependencies","subSpec","pattern","required","maxOccurrence","depSpec","RegExp","Object","config","Array","isArray","TypeError","configValid","description","validate","record","valid","recordMatchesConfig","excluded","forEach","obj","val","key","configMatchesSpec","concat","includes","Error","data","spec","subObj","subVal","subKey","conf","res","every","confObj","dependency","recordMatchesConfigElement","searchedField","foundFields","get","length","recordSubObj","keys","confField","test","value","elementsTotal","matching","code","field","console","log"],"mappings":"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","file":"field-structure.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\nimport {filter, forEach} from 'lodash';\n\n// Configuration specification\nconst confSpec = {\n\tleader: { // Description: Leader pattern\n\t\ttype: 'RegExp',\n\t\texcl: [\n\t\t\t'tag', 'valuePattern', 'subfields', 'ind1', 'ind2'\n\t\t]\n\t},\n\ttag: { // Description: Field tag pattern\n\t\ttype: 'RegExp'\n\t},\n\tvaluePattern: { // Description: Pattern to which the field's value must match against\n\t\ttype: 'RegExp',\n\t\texcl: [\n\t\t\t'leader', 'subfields', 'ind1', 'ind2'\n\t\t]\n\t},\n\tind1: { // Description: Indicator-specific configuration object\n\t\ttype: 'RegExp', // Array<Indicator>\n\t\texcl: [\n\t\t\t'leader', 'value'\n\t\t]\n\t},\n\tind2: { // Description: Indicator-specific configuration object\n\t\ttype: 'RegExp', // Array<Indicator>\n\t\texcl: [\n\t\t\t'leader', 'value'\n\t\t]\n\t},\n\tstrict: { // Description: Only the specified subfields are allowed if set to true. Defaults to false.\n\t\ttype: 'boolean',\n\t\texcl: [\n\t\t\t'leader', 'valuePattern'\n\t\t]\n\t},\n\tsubfields: { // Description: Subfields configuration\n\t\ttype: 'object', // Object<String, Subfield> (Keys are subfield codes)\n\t\tcontains: [\n\t\t\t'String', 'subfieldSpec'\n\t\t],\n\t\texcl: [\n\t\t\t'leader', 'value'\n\t\t]\n\t},\n\tdependencies: { // Description: Dependencies configuration\n\t\ttype: 'array', // Array<Dependency>\n\t\tcontains: 'dependencySpec'\n\t}\n};\n\n// Subfiled specification\nconst subSpec = {\n\tpattern: { // Description: Pattern to which the subfield's value must match against\n\t\ttype: 'RegExp'\n\t},\n\trequired: { // Description: Whether the subfield is mandatory or not. Defaults to false\n\t\ttype: 'boolean'\n\t},\n\tmaxOccurrence: { // Description: Maximum number of times this subfield can occur. Defaults to unlimited if omitted. The value 0 means that the subfield cannot exist.\n\t\ttype: 'number'\n\t}\n};\n\n// Dependency specification\nconst depSpec = {\n\ttag: { // Description: Field tag pattern\n\t\ttype: RegExp\n\t},\n\tind1: { // Description: Pattern to which the indicator must match against\n\t\ttype: RegExp,\n\t\texcl: [\n\t\t\t'value'\n\t\t]\n\t},\n\tind2: { // Description: Pattern to which the indicator must match against\n\t\ttype: RegExp,\n\t\texcl: [\n\t\t\t'value'\n\t\t]\n\t},\n\tvaluePattern: { // Description: Pattern to which the field's value must match agains\n\t\ttype: RegExp,\n\t\texcl: [\n\t\t\t'subfields', 'ind1', 'ind2'\n\t\t]\n\t},\n\tsubfields: { // Description: An object with subfield codes as keys and RegExp patterns as values. The subfield value must this pattern.\n\t\ttype: Object, // [String, RegExp]\n\t\trequired: false\n\t}\n};\n\nexport default async function (config) {\n\tif (!Array.isArray(config)) {\n\t\tthrow new TypeError('Configuration array not provided');\n\t}\n\n\tconfigValid(config);\n\n\treturn {\n\t\tdescription:\n\t\t\t'Checks whether the configured field-specific objects are valid in the record',\n\t\tvalidate: async record => ({\n\t\t\tvalid: recordMatchesConfig(record, config, false)\n\t\t})\n\t};\n\n\t/// /////////////////////////////////////////\n\t// This checks that configuration is valid\n\tfunction configValid(config) {\n\t\tlet excluded = [];\n\t\tconfig.forEach(obj => {\n\t\t\texcluded = []; // Validate fields: check that they are valid to confSpec (exists, correct data type), concat excluded elements\n\n\t\t\tforEach(obj, (val, key) => {\n\t\t\t\tconfigMatchesSpec(val, key, confSpec);\n\n\t\t\t\t// Concat all excluded elements to array\n\t\t\t\tif (confSpec[key].excl) {\n\t\t\t\t\texcluded = excluded.concat(confSpec[key].excl);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Check that no excluded elements are in use\n\t\t\tforEach(obj, (val, key) => {\n\t\t\t\tif (excluded.includes(key)) {\n\t\t\t\t\tthrow new Error('Configuration not valid - excluded element');\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t// Recursive validator\n\tfunction configMatchesSpec(data, key, spec) {\n\t\t// Field not found in configuration spec\n\t\tif (!spec[key]) {\n\t\t\tthrow new Error('Configuration not valid - unidentified value: ' + key);\n\t\t}\n\n\t\t// If configuration type does not match type in configuration spec\n\t\tif (typeof data !== spec[key].type &&\n\t\t\t(spec[key].type === 'RegExp' && !(data instanceof RegExp))) {\n\t\t\tthrow new Error('Configuration not valid - invalid data type for: ' + key);\n\t\t}\n\n\t\t// Check subfields/dependencies recursively\n\t\tif (key === 'subfields' || key === 'dependencies') {\n\t\t\tforEach(data, subObj => {\n\t\t\t\tif (typeof subObj === 'object') {\n\t\t\t\t\tforEach(subObj, (subVal, subKey) => {\n\t\t\t\t\t\tconfigMatchesSpec(subVal, subKey, (key === 'subfields') ? subSpec : depSpec);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthrow new TypeError('Configuration not valid - ' + key + ' not object');\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\t/// /////////////////////////////////////////\n\n\t/// /////////////////////////////////////////\n\t// This is used to validate record against configuration\n\tfunction recordMatchesConfig(record, conf, dependencies) {\n\t\t// Parse trough every element of config array\n\t\tconst res = conf.every(confObj => {\n\t\t\tif (confObj.dependencies) {\n\t\t\t\treturn confObj.dependencies.every(dependency => {\n\t\t\t\t\treturn recordMatchesConfigElement(record, dependency.tag, confObj, dependencies);\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn recordMatchesConfigElement(record, confObj.tag, confObj, dependencies);\n\t\t});\n\t\treturn res;\n\t}\n\n\t// Recursive validation function\n\tfunction recordMatchesConfigElement(record, searchedField, confObj, dependencies) {\n\t\tconst foundFields = record.get(searchedField);\n\t\t// If data matching configuration is not found\n\t\tif (foundFields.length === 0) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Parse trough record objects matching provided configuration object\n\t\treturn foundFields.every(recordSubObj => {\n\t\t\t// Check that every configuration field exists in record and matches configuration\n\t\t\treturn Object.keys(confObj).every(confField => {\n\t\t\t\t// If configuration field is RegExp, test that record field matches it (valuePattern, leader, tag, ind*)\n\t\t\t\tif (confObj[confField] instanceof RegExp) {\n\t\t\t\t\t// 'valuePattern' RegExp in conf spec is used to validate 'value' in marc\n\t\t\t\t\tif (confField === 'valuePattern') {\n\t\t\t\t\t\treturn confObj[confField].test(recordSubObj.value);\n\t\t\t\t\t}\n\t\t\t\t\tif (confField === 'leader') {\n\t\t\t\t\t\treturn confObj[confField].test(record.leader);\n\t\t\t\t\t}\n\t\t\t\t\treturn confObj[confField].test(recordSubObj[confField]);\n\t\t\t\t}\n\n\t\t\t\t// Only the specified subfields are allowed if set to true. Defaults to false. (this is checked at subfields)\n\t\t\t\tif (confField === 'strict') {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\t// Check that subfield stuff\n\t\t\t\tif (confField === 'subfields') {\n\t\t\t\t\tconst strict = confObj.strict || false; // Defaults to false\n\t\t\t\t\tlet\telementsTotal = 0;\n\t\t\t\t\tlet\tmatching = [];\n\t\t\t\t\tlet\tvalid = true;\n\n\t\t\t\t\tforEach(confObj.subfields, (val, key) => {\n\t\t\t\t\t\tmatching = filter(recordSubObj.subfields, {code: key});\n\t\t\t\t\t\telementsTotal += matching.length; // Calculate amount of record objects matching all confObj objects\n\n\t\t\t\t\t\tif (matching.length > val.maxOccurrence) {\n\t\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ((val.required || dependencies) && matching.length === 0) {\n\t\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (val.pattern) {\n\t\t\t\t\t\t\tforEach(matching, field => {\n\t\t\t\t\t\t\t\tif (!val.pattern.test(field.value)) {\n\t\t\t\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\t\t\t}\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\t// Check if there is less valid calculated objects than objects in subfield object => some not matching strict\n\t\t\t\t\tif (strict && elementsTotal < recordSubObj.subfields.length) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn valid;\n\t\t\t\t}\n\n\t\t\t\t// Recursive check for dependicies\n\t\t\t\tif (confField === 'dependencies') {\n\t\t\t\t\treturn recordMatchesConfig(record, confObj[confField], true);\n\t\t\t\t}\n\n\t\t\t\t// This should not be reached as configuration is validated\n\n\t\t\t\tconsole.log('!!! Configuration field not identified: ', recordSubObj[confField], ' | ', typeof recordSubObj[confField]);\n\t\t\t\treturn false;\n\t\t\t});\n\t\t});\n\t}\n\t/// /////////////////////////////////////////\n}\n"]}
1
+ {"version":3,"file":"field-structure.js","names":["confSpec","leader","type","excl","tag","valuePattern","ind1","ind2","strict","subfields","contains","dependencies","subSpec","pattern","required","maxOccurrence","depSpec","RegExp","Object","forEach","obj","fun","entries","_default","config","Array","isArray","TypeError","configValid","description","validate","record","valid","recordMatchesConfig","excluded","key","val","configMatchesSpec","push","includes","Error","data","spec","subObj","subKey","subVal","conf","res","every","confObj","dependency","recordMatchesConfigElement","searchedField","foundFields","get","length","recordSubObj","keys","confField","test","value","elementsTotal","some","matching","filter","code","maxOccurrenceFine","isRequiredFine","valuePatternFine","field","console","log"],"sources":["../src/field-structure.js"],"sourcesContent":["// Configuration specification\nconst confSpec = {\n leader: { // Description: Leader pattern\n type: 'RegExp',\n excl: ['tag', 'valuePattern', 'subfields', 'ind1', 'ind2']\n },\n tag: { // Description: Field tag pattern\n type: 'RegExp',\n excl: ['leader']\n },\n valuePattern: { // Description: Pattern to which the field's value must match against\n type: 'RegExp',\n excl: ['leader', 'subfields', 'ind1', 'ind2']\n },\n ind1: { // Description: Indicator-specific configuration object\n type: 'RegExp', // Array<Indicator>\n excl: ['leader', 'value']\n },\n ind2: { // Description: Indicator-specific configuration object\n type: 'RegExp', // Array<Indicator>\n excl: ['leader', 'value']\n },\n strict: { // Description: Only the specified subfields are allowed if set to true. Defaults to false.\n type: 'boolean',\n excl: ['leader', 'valuePattern']\n },\n subfields: { // Description: Subfields configuration\n type: 'object', // Object<String, Subfield> (Keys are subfield codes)\n contains: ['String', 'subfieldSpec'],\n excl: ['leader', 'value']\n },\n dependencies: { // Description: Dependencies configuration\n type: 'array', // Array<Dependency>\n contains: 'dependencySpec'\n }\n};\n\n// Subfiled specification\nconst subSpec = {\n pattern: { // Description: Pattern to which the subfield's value must match against\n type: 'RegExp'\n },\n required: { // Description: Whether the subfield is mandatory or not. Defaults to false\n type: 'boolean'\n },\n maxOccurrence: { // Description: Maximum number of times this subfield can occur. Defaults to unlimited if omitted. The value 0 means that the subfield cannot exist.\n type: 'number'\n }\n};\n\n// Dependency specification\nconst depSpec = {\n leader: { // Description: Leader pattern\n type: 'RegExp',\n excl: ['tag', 'valuePattern', 'subfields', 'ind1', 'ind2']\n },\n tag: { // Description: Field tag pattern\n type: RegExp,\n excl: ['leader']\n },\n ind1: { // Description: Pattern to which the indicator must match against\n type: RegExp,\n excl: ['value', 'leader']\n },\n ind2: { // Description: Pattern to which the indicator must match against\n type: RegExp,\n excl: ['value', 'leader']\n },\n valuePattern: { // Description: Pattern to which the field's value must match agains\n type: RegExp,\n excl: ['subfields', 'ind1', 'ind2', 'leader']\n },\n subfields: { // Description: An object with subfield codes as keys and RegExp patterns as values. The subfield value must this pattern.\n type: Object, // [String, RegExp]\n required: false\n }\n};\n\nfunction forEach(obj, fun) {\n Object.entries(obj).forEach(fun);\n}\n\nexport default function (config) {\n if (!Array.isArray(config)) {\n throw new TypeError('Configuration array not provided');\n }\n\n configValid(config);\n\n return {\n description:\n 'Check whether the configured fields have valid structure',\n validate: record => ({\n valid: recordMatchesConfig(record, config, false)\n })\n };\n\n // This checks that configuration is valid\n function configValid(config) {\n config.forEach(obj => {\n const excluded = []; // Validate fields: check that they are valid to confSpec (exists, correct data type), concat excluded elements\n\n forEach(obj, ([key, val]) => {\n configMatchesSpec(val, key, confSpec);\n\n // Concat all excluded elements to array\n if (confSpec[key].excl) { // eslint-disable-line functional/no-conditional-statements\n excluded.push(...confSpec[key].excl); // eslint-disable-line functional/immutable-data\n }\n });\n\n // Check that no excluded elements are in use\n forEach(obj, ([key]) => {\n if (excluded.includes(key)) {\n throw new Error('Configuration not valid - excluded element');\n }\n });\n });\n }\n\n // Recursive validator\n function configMatchesSpec(data, key, spec) {\n // Field not found in configuration spec\n if (!spec[key]) {\n throw new Error(`Configuration not valid - unidentified value: ${key}`);\n }\n\n // If configuration type does not match type in configuration spec\n if (typeof data !== spec[key].type &&\n (spec[key].type === 'RegExp' && !(data instanceof RegExp))) {\n throw new Error(`Configuration not valid - invalid data type for: ${key}`);\n }\n\n // Check subfields/dependencies recursively\n if (key === 'subfields' || key === 'dependencies') { // eslint-disable-line functional/no-conditional-statements\n forEach(data, ([, subObj]) => {\n if (typeof subObj === 'object') { // eslint-disable-line functional/no-conditional-statements\n forEach(subObj, ([subKey, subVal]) => {\n configMatchesSpec(subVal, subKey, key === 'subfields' ? subSpec : depSpec);\n });\n } else {\n throw new TypeError(`Configuration not valid - ${key} not object`);\n }\n });\n }\n }\n /// /////////////////////////////////////////\n\n /// /////////////////////////////////////////\n // This is used to validate record against configuration\n function recordMatchesConfig(record, conf, dependencies) {\n // Parse trough every element of config array\n const res = conf.every(confObj => {\n if (confObj.dependencies) {\n if (confObj.dependencies.every(dependency => recordMatchesConfigElement(record, dependency.tag, dependency, dependencies))) {\n return recordMatchesConfigElement(record, confObj.tag, confObj, dependencies);\n }\n\n return true;\n }\n\n return recordMatchesConfigElement(record, confObj.tag, confObj, dependencies);\n });\n\n return res;\n }\n\n // Recursive validation function\n function recordMatchesConfigElement(record, searchedField, confObj, dependencies) {\n const foundFields = record.get(searchedField);\n // If field has dependencies and fields matching configuration is not found\n if (foundFields.length === 0 && confObj.dependencies) {\n return false;\n }\n\n // Parse trough record objects matching provided configuration object\n // Check that every configuration field exists in record and matches configuration\n return foundFields.every(recordSubObj => Object.keys(confObj).every(confField => {\n // If configuration field is RegExp, test that record field matches it (valuePattern, leader, tag, ind*)\n if (confObj[confField] instanceof RegExp) {\n // 'valuePattern' RegExp in conf spec is used to validate 'value' in marc\n if (confField === 'valuePattern') {\n return confObj[confField].test(recordSubObj.value);\n }\n\n if (confField === 'leader') {\n return confObj[confField].test(record.leader);\n }\n\n return confObj[confField].test(recordSubObj[confField]);\n }\n\n // Only the specified subfields are allowed if set to true. Defaults to false. (this is checked at subfields)\n if (confField === 'strict') {\n return true;\n }\n\n // Check that subfield stuff\n if (confField === 'subfields') {\n const strict = confObj.strict || false; // Defaults to false\n let elementsTotal = 0; // eslint-disable-line functional/no-let\n const valid = !Object.entries(confObj.subfields).some(([key, val]) => {\n const matching = recordSubObj.subfields.filter(({code}) => code === key);\n elementsTotal += matching.length; // Calculate amount of record objects matching all confObj objects\n\n const maxOccurrenceFine = matching.length > val.maxOccurrence;\n const isRequiredFine = (val.required || dependencies) && matching.length === 0;\n const valuePatternFine = val.pattern && !matching.every(field => val.pattern.test(field.value));\n return maxOccurrenceFine || isRequiredFine || valuePatternFine;\n });\n\n // Check if there is less valid calculated objects than objects in subfield object => some not matching strict\n return !(strict && elementsTotal < recordSubObj.subfields.length) && valid;\n }\n\n // Recursive check for dependicies\n if (confField === 'dependencies') {\n return recordMatchesConfig(record, confObj[confField], true);\n }\n\n // This should not be reached as configuration is validated\n\n console.log('!!! Configuration field not identified: ', recordSubObj[confField], ' | ', typeof recordSubObj[confField]); // eslint-disable-line no-console\n return false;\n }));\n }\n}\n"],"mappings":"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"}
@@ -1,32 +1,535 @@
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 _fieldStructure=require('../src/field-structure');var _fieldStructure2=_interopRequireDefault(_fieldStructure);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);// Factory validation
28
- describe('field-structure',()=>{it('Creates a validator',_asyncToGenerator(function*(){const config=[{tag:/^035$/,ind1:/^0$/,ind2:/^1$/},{tag:/^100$/,subfields:{a:{maxOccurrence:1}}}];const validator=yield(0,_fieldStructure2.default)(config);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')}));describe('#configuration',()=>{it('Throws an error when config array not provided',_asyncToGenerator(function*(){yield expect((0,_fieldStructure2.default)()).to.be.rejectedWith(Error,'Configuration array not provided')}));it('Throws an error when config array has unidentified field',_asyncToGenerator(function*(){const config=[{leader:/^035$/,tags:/^035$/}];yield expect((0,_fieldStructure2.default)(config)).to.be.rejectedWith(Error,'Configuration not valid - unidentified value: tags')}));it('Throws an error when config array has field with incorrect data type',_asyncToGenerator(function*(){const config=[{leader:/^035$/,tag:35}];yield expect((0,_fieldStructure2.default)(config)).to.be.rejectedWith(Error,'Configuration not valid - invalid data type for: tag')}));it('Throws an error when config array has excluded element',_asyncToGenerator(function*(){const config=[{leader:/^035$/,tag:/^035$/}];yield expect((0,_fieldStructure2.default)(config)).to.be.rejectedWith(Error,'Configuration not valid - excluded element')}));it('Throws an error when config subfields not object',_asyncToGenerator(function*(){const config=[{tag:/^001$/,valuePattern:/\d+/},{tag:/^245$/,strict:true,subfields:'This should be Object'}];yield expect((0,_fieldStructure2.default)(config)).to.be.rejectedWith(Error,'Configuration not valid - subfields not object')}))});// Indicators and subfields validation
29
- describe('#validate: Indicators and subfields',()=>{const config=[{tag:/^035$/,ind1:/^0$/,ind2:/^1$/},{tag:/^100$/,subfields:{a:{maxOccurrence:1}}}];const recordValid=new _marcRecord.MarcRecord({leader:'',fields:[{tag:'001',value:'123456'},{tag:'035',ind1:'0',ind2:'1',subfields:[{code:'a',value:'foo'}]},{tag:'100',ind1:' ',ind2:' ',subfields:[{code:'a',value:'bar'},{code:'b',value:'fubar'}]}]});const recordInvalidMany=new _marcRecord.MarcRecord({leader:'',fields:[{tag:'001',value:'123456'},{tag:'035',ind1:'1',ind2:'1',subfields:[{code:'a',value:'foo'}]},{tag:'100',ind1:' ',ind2:' ',subfields:[{code:'a',value:'bar'},{code:'b',value:'fubar'},{code:'a',value:'barfoo'}]}]});it('Finds the record valid',_asyncToGenerator(function*(){const validator=yield(0,_fieldStructure2.default)(config);const result=yield validator.validate(recordValid);expect(result).to.eql({valid:true})}));it('Finds the record invalid: Too many subfields',_asyncToGenerator(function*(){const validator=yield(0,_fieldStructure2.default)(config);const result=yield validator.validate(recordInvalidMany);expect(result).to.eql({valid:false})}))});// Patterns and mandatory & strict subfields
30
- describe('#validate: Patterns and mandatory & strict subfields',()=>{const config=[{tag:/^001$/,valuePattern:/\d+/},{tag:/^245$/,strict:true,subfields:{a:{required:true,maxOccurrence:1,pattern:/\w+/},b:{maxOccurrence:1,pattern:/\w+/}}}];const recordValid=new _marcRecord.MarcRecord({leader:'',fields:[{tag:'001',value:'123456'},{tag:'100',ind1:' ',ind2:' ',subfields:[{code:'a',value:'bar'}]},{tag:'245',ind1:' ',ind2:' ',subfields:[{code:'a',value:'foo'},{code:'b',value:'bar'}]}]});const recordInvalidExtra=new _marcRecord.MarcRecord({leader:'',fields:[{tag:'001',value:'123456a'},{tag:'100',ind1:' ',ind2:' ',subfields:[{code:'a',value:'bar'}]},{tag:'245',ind1:' ',ind2:' ',subfields:[{code:'a',value:'foo'},{code:'b',value:'bar'},{code:'c',value:'fubar'}]}]});const recordInvalidTooMany=new _marcRecord.MarcRecord({leader:'',fields:[{tag:'001',value:'123456a'},{tag:'100',ind1:' ',ind2:' ',subfields:[{code:'a',value:'bar'}]},{tag:'245',ind1:' ',ind2:' ',subfields:[{code:'a',value:'foo'},{code:'b',value:'bar'},{code:'a',value:'fubar'}]}]});const recordInvalidRegExp=new _marcRecord.MarcRecord({leader:'',fields:[{tag:'001',value:'123456a'},{tag:'100',ind1:' ',ind2:' ',subfields:[{code:'a',value:'bar'}]},{tag:'245',ind1:' ',ind2:' ',subfields:[{code:'a',value:'\xE4\xE4'},{code:'b',value:'bar'}]}]});const recordInvalidMissing=new _marcRecord.MarcRecord({leader:'',fields:[{tag:'100',ind1:' ',ind2:' ',subfields:[{code:'a',value:'bar'}]},{tag:'245',ind1:' ',ind2:' ',subfields:[{code:'a',value:'\xE4\xE4'},{code:'b',value:'bar'}]}]});const recordInvalidMissingSubfield=new _marcRecord.MarcRecord({leader:'',fields:[{tag:'001',value:'123456'},{tag:'100',ind1:' ',ind2:' ',subfields:[{code:'a',value:'bar'}]},{tag:'245',ind1:' ',ind2:' ',subfields:[{code:'b',value:'bar'}]}]});it('Finds the record valid',_asyncToGenerator(function*(){const validator=yield(0,_fieldStructure2.default)(config);const result=yield validator.validate(recordValid);expect(result).to.eql({valid:true})}));it('Finds the record invalid: Extra field in strict',_asyncToGenerator(function*(){const validator=yield(0,_fieldStructure2.default)(config);const result=yield validator.validate(recordInvalidExtra);expect(result).to.eql({valid:false})}));it('Finds the record invalid: Too many occurances',_asyncToGenerator(function*(){const validator=yield(0,_fieldStructure2.default)(config);const result=yield validator.validate(recordInvalidTooMany);expect(result).to.eql({valid:false})}));it('Finds the record invalid: Invalid RegExp',_asyncToGenerator(function*(){const validator=yield(0,_fieldStructure2.default)(config);const result=yield validator.validate(recordInvalidRegExp);expect(result).to.eql({valid:false})}));it('Finds the record invalid: Missing field',_asyncToGenerator(function*(){const validator=yield(0,_fieldStructure2.default)(config);const result=yield validator.validate(recordInvalidMissing);expect(result).to.eql({valid:false})}));it('Finds the record invalid: Missing subfield',_asyncToGenerator(function*(){const validator=yield(0,_fieldStructure2.default)(config);const result=yield validator.validate(recordInvalidMissingSubfield);expect(result).to.eql({valid:false})}))});// Dependencies
31
- describe('#validate: Dependencies',()=>{const config=[{leader:/^.{6}s/,dependencies:[{tag:/^773$/,subfields:{7:/^nnas$/}}]}];const recordValid=new _marcRecord.MarcRecord({leader:'63ab75sfoo122myhgh',fields:[{tag:'001',value:'123456'},{tag:'245',ind1:' ',ind2:' ',subfields:[{code:'a',value:'foo'}]},{tag:'773',ind1:' ',ind2:' ',subfields:[{code:'7',value:'nnas'},{code:'w',value:'789101112'}]}]});const recordInvalid=new _marcRecord.MarcRecord({leader:'63ab75sfoo122myhgh',fields:[{tag:'001',value:'123456'},{tag:'245',ind1:' ',ind2:' ',subfields:[{code:'a',value:'foo'}]},{tag:'773',ind1:' ',ind2:' ',subfields:[{code:'w',value:'789101112'}]}]});it('Finds the record valid',_asyncToGenerator(function*(){const validator=yield(0,_fieldStructure2.default)(config);const result=yield validator.validate(recordValid);expect(result).to.eql({valid:true})}));it('Finds the record invalid: Subfield not there',_asyncToGenerator(function*(){const validator=yield(0,_fieldStructure2.default)(config);const result=yield validator.validate(recordInvalid);expect(result).to.eql({valid:false})}))})});
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 _fieldStructure = _interopRequireDefault(require("../src/field-structure"));
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
+
13
+ // Factory validation
14
+ describe('field-structure', () => {
15
+ it('Creates a validator', async () => {
16
+ const config = [{
17
+ tag: /^035$/u,
18
+ ind1: /^0$/u,
19
+ ind2: /^1$/u
20
+ }, {
21
+ tag: /^100$/u,
22
+ subfields: {
23
+ a: {
24
+ maxOccurrence: 1
25
+ }
26
+ }
27
+ }];
28
+ const validator = await (0, _fieldStructure.default)(config);
29
+ expect(validator).to.be.an('object').that.has.any.keys('description', 'validate');
30
+ expect(validator.description).to.be.a('string');
31
+ expect(validator.validate).to.be.a('function');
32
+ });
33
+ describe('#configuration', () => {
34
+ it('Throws an error when config array not provided', () => {
35
+ try {
36
+ (0, _fieldStructure.default)();
37
+ } catch (error) {
38
+ expect(error).to.be.an('error').with.property('message', 'Configuration array not provided');
39
+ }
40
+ });
41
+ it('Throws an error when config array has unidentified field', () => {
42
+ const config = [{
43
+ leader: /^035$/u,
44
+ tags: /^035$/u
45
+ }];
46
+ try {
47
+ (0, _fieldStructure.default)(config);
48
+ } catch (error) {
49
+ expect(error).to.be.an('error').with.property('message', 'Configuration not valid - unidentified value: tags');
50
+ }
51
+ });
52
+ it('Throws an error when config array has field with incorrect data type', () => {
53
+ const config = [{
54
+ leader: /^035$/u,
55
+ tag: 35
56
+ }];
57
+ try {
58
+ (0, _fieldStructure.default)(config);
59
+ } catch (error) {
60
+ expect(error).to.be.an('error').with.property('message', 'Configuration not valid - invalid data type for: tag');
61
+ }
62
+ });
63
+ it('Throws an error when config array has excluded element', () => {
64
+ const config = [{
65
+ leader: /^035$/u,
66
+ tag: /^035$/u
67
+ }];
68
+ try {
69
+ (0, _fieldStructure.default)(config);
70
+ } catch (error) {
71
+ expect(error).to.be.an('error').with.property('message', 'Configuration not valid - excluded element');
72
+ }
73
+ });
74
+ it('Throws an error when config subfields not object', () => {
75
+ const config = [{
76
+ tag: /^001$/u,
77
+ valuePattern: /\d+/u
78
+ }, {
79
+ tag: /^245$/u,
80
+ strict: true,
81
+ subfields: 'This should be Object'
82
+ }];
83
+ try {
84
+ (0, _fieldStructure.default)(config);
85
+ } catch (error) {
86
+ expect(error).to.be.an('error').with.property('message', 'Configuration not valid - subfields not object');
87
+ }
88
+ });
89
+ });
90
+ it('Should find the record valid because no fields match the config', async () => {
91
+ const config = [{
92
+ tag: /^FOO$/u,
93
+ valuePattern: /bar/u
94
+ }];
95
+ const record = new _marcRecord.MarcRecord({
96
+ leader: '',
97
+ fields: [{
98
+ tag: '001',
99
+ value: '123456'
100
+ }]
101
+ });
102
+ const validator = await (0, _fieldStructure.default)(config);
103
+ const result = await validator.validate(record);
104
+ expect(result).to.eql({
105
+ valid: true
106
+ });
107
+ });
108
+
109
+ // Indicators and subfields validation
110
+ describe('#validate: Indicators and subfields', () => {
111
+ const config = [{
112
+ tag: /^035$/u,
113
+ ind1: /^0$/u,
114
+ ind2: /^1$/u
115
+ }, {
116
+ tag: /^100$/u,
117
+ subfields: {
118
+ a: {
119
+ maxOccurrence: 1
120
+ }
121
+ }
122
+ }];
123
+ const recordValid = new _marcRecord.MarcRecord({
124
+ leader: '',
125
+ fields: [{
126
+ tag: '001',
127
+ value: '123456'
128
+ }, {
129
+ tag: '035',
130
+ ind1: '0',
131
+ ind2: '1',
132
+ subfields: [{
133
+ code: 'a',
134
+ value: 'foo'
135
+ }]
136
+ }, {
137
+ tag: '100',
138
+ ind1: ' ',
139
+ ind2: ' ',
140
+ subfields: [{
141
+ code: 'a',
142
+ value: 'bar'
143
+ }, {
144
+ code: 'b',
145
+ value: 'fubar'
146
+ }]
147
+ }]
148
+ });
149
+ const recordInvalidMany = new _marcRecord.MarcRecord({
150
+ leader: '',
151
+ fields: [{
152
+ tag: '001',
153
+ value: '123456'
154
+ }, {
155
+ tag: '035',
156
+ ind1: '1',
157
+ ind2: '1',
158
+ subfields: [{
159
+ code: 'a',
160
+ value: 'foo'
161
+ }]
162
+ }, {
163
+ tag: '100',
164
+ ind1: ' ',
165
+ ind2: ' ',
166
+ subfields: [{
167
+ code: 'a',
168
+ value: 'bar'
169
+ }, {
170
+ code: 'b',
171
+ value: 'fubar'
172
+ }, {
173
+ code: 'a',
174
+ value: 'barfoo'
175
+ }]
176
+ }]
177
+ });
178
+ it('Finds the record valid', async () => {
179
+ const validator = await (0, _fieldStructure.default)(config);
180
+ const result = await validator.validate(recordValid);
181
+ expect(result).to.eql({
182
+ valid: true
183
+ });
184
+ });
185
+ it('Finds the record invalid: Too many subfields', async () => {
186
+ const validator = await (0, _fieldStructure.default)(config);
187
+ const result = await validator.validate(recordInvalidMany);
188
+ expect(result).to.eql({
189
+ valid: false
190
+ });
191
+ });
192
+ });
193
+
194
+ // Patterns and mandatory & strict subfields
195
+ describe('#validate: Patterns and mandatory & strict subfields', () => {
196
+ const config = [{
197
+ tag: /^001$/u,
198
+ valuePattern: /\d+/u
199
+ }, {
200
+ tag: /^245$/u,
201
+ strict: true,
202
+ subfields: {
203
+ a: {
204
+ required: true,
205
+ maxOccurrence: 1,
206
+ pattern: /\w+/u
207
+ },
208
+ b: {
209
+ maxOccurrence: 1,
210
+ pattern: /\w+/u
211
+ }
212
+ }
213
+ }];
214
+ const recordValid = new _marcRecord.MarcRecord({
215
+ leader: '',
216
+ fields: [{
217
+ tag: '001',
218
+ value: '123456'
219
+ }, {
220
+ tag: '100',
221
+ ind1: ' ',
222
+ ind2: ' ',
223
+ subfields: [{
224
+ code: 'a',
225
+ value: 'bar'
226
+ }]
227
+ }, {
228
+ tag: '245',
229
+ ind1: ' ',
230
+ ind2: ' ',
231
+ subfields: [{
232
+ code: 'a',
233
+ value: 'foo'
234
+ }, {
235
+ code: 'b',
236
+ value: 'bar'
237
+ }]
238
+ }]
239
+ });
240
+ const recordInvalidExtra = new _marcRecord.MarcRecord({
241
+ leader: '',
242
+ fields: [{
243
+ tag: '001',
244
+ value: '123456a'
245
+ }, {
246
+ tag: '100',
247
+ ind1: ' ',
248
+ ind2: ' ',
249
+ subfields: [{
250
+ code: 'a',
251
+ value: 'bar'
252
+ }]
253
+ }, {
254
+ tag: '245',
255
+ ind1: ' ',
256
+ ind2: ' ',
257
+ subfields: [{
258
+ code: 'a',
259
+ value: 'foo'
260
+ }, {
261
+ code: 'b',
262
+ value: 'bar'
263
+ }, {
264
+ code: 'c',
265
+ value: 'fubar'
266
+ }]
267
+ }]
268
+ });
269
+ const recordInvalidTooMany = new _marcRecord.MarcRecord({
270
+ leader: '',
271
+ fields: [{
272
+ tag: '001',
273
+ value: '123456a'
274
+ }, {
275
+ tag: '100',
276
+ ind1: ' ',
277
+ ind2: ' ',
278
+ subfields: [{
279
+ code: 'a',
280
+ value: 'bar'
281
+ }]
282
+ }, {
283
+ tag: '245',
284
+ ind1: ' ',
285
+ ind2: ' ',
286
+ subfields: [{
287
+ code: 'a',
288
+ value: 'foo'
289
+ }, {
290
+ code: 'b',
291
+ value: 'bar'
292
+ }, {
293
+ code: 'a',
294
+ value: 'fubar'
295
+ }]
296
+ }]
297
+ });
298
+ const recordInvalidRegExp = new _marcRecord.MarcRecord({
299
+ leader: '',
300
+ fields: [{
301
+ tag: '001',
302
+ value: '123456a'
303
+ }, {
304
+ tag: '100',
305
+ ind1: ' ',
306
+ ind2: ' ',
307
+ subfields: [{
308
+ code: 'a',
309
+ value: 'bar'
310
+ }]
311
+ }, {
312
+ tag: '245',
313
+ ind1: ' ',
314
+ ind2: ' ',
315
+ subfields: [{
316
+ code: 'a',
317
+ value: 'ää'
318
+ }, {
319
+ code: 'b',
320
+ value: 'bar'
321
+ }]
322
+ }]
323
+ });
324
+ const recordInvalidMissing = new _marcRecord.MarcRecord({
325
+ leader: '',
326
+ fields: [{
327
+ tag: '100',
328
+ ind1: ' ',
329
+ ind2: ' ',
330
+ subfields: [{
331
+ code: 'a',
332
+ value: 'bar'
333
+ }]
334
+ }, {
335
+ tag: '245',
336
+ ind1: ' ',
337
+ ind2: ' ',
338
+ subfields: [{
339
+ code: 'a',
340
+ value: 'ää'
341
+ }, {
342
+ code: 'b',
343
+ value: 'bar'
344
+ }]
345
+ }]
346
+ });
347
+ const recordInvalidMissingSubfield = new _marcRecord.MarcRecord({
348
+ leader: '',
349
+ fields: [{
350
+ tag: '001',
351
+ value: '123456'
352
+ }, {
353
+ tag: '100',
354
+ ind1: ' ',
355
+ ind2: ' ',
356
+ subfields: [{
357
+ code: 'a',
358
+ value: 'bar'
359
+ }]
360
+ }, {
361
+ tag: '245',
362
+ ind1: ' ',
363
+ ind2: ' ',
364
+ subfields: [{
365
+ code: 'b',
366
+ value: 'bar'
367
+ }]
368
+ }]
369
+ });
370
+ it('Finds the record valid', async () => {
371
+ const validator = await (0, _fieldStructure.default)(config);
372
+ const result = await validator.validate(recordValid);
373
+ expect(result).to.eql({
374
+ valid: true
375
+ });
376
+ });
377
+ it('Finds the record invalid: Extra field in strict', async () => {
378
+ const validator = await (0, _fieldStructure.default)(config);
379
+ const result = await validator.validate(recordInvalidExtra);
380
+ expect(result).to.eql({
381
+ valid: false
382
+ });
383
+ });
384
+ it('Finds the record invalid: Too many occurances', async () => {
385
+ const validator = await (0, _fieldStructure.default)(config);
386
+ const result = await validator.validate(recordInvalidTooMany);
387
+ expect(result).to.eql({
388
+ valid: false
389
+ });
390
+ });
391
+ it('Finds the record invalid: Invalid RegExp', async () => {
392
+ const validator = await (0, _fieldStructure.default)(config);
393
+ const result = await validator.validate(recordInvalidRegExp);
394
+ expect(result).to.eql({
395
+ valid: false
396
+ });
397
+ });
398
+ it('Finds the record invalid: Missing field', async () => {
399
+ const validator = await (0, _fieldStructure.default)(config);
400
+ const result = await validator.validate(recordInvalidMissing);
401
+ expect(result).to.eql({
402
+ valid: false
403
+ });
404
+ });
405
+ it('Finds the record invalid: Missing subfield', async () => {
406
+ const validator = await (0, _fieldStructure.default)(config);
407
+ const result = await validator.validate(recordInvalidMissingSubfield);
408
+ expect(result).to.eql({
409
+ valid: false
410
+ });
411
+ });
412
+ });
413
+
414
+ // Dependencies
415
+ describe('#validate: Dependencies', () => {
416
+ const config = [{
417
+ leader: /^.{6}s/u,
418
+ dependencies: [{
419
+ tag: /^773$/u,
420
+ subfields: {
421
+ 7: /^nnas$/u
422
+ }
423
+ }]
424
+ }];
425
+ const recordValid = new _marcRecord.MarcRecord({
426
+ leader: '63ab75sfoo122myhgh',
427
+ fields: [{
428
+ tag: '001',
429
+ value: '123456'
430
+ }, {
431
+ tag: '245',
432
+ ind1: ' ',
433
+ ind2: ' ',
434
+ subfields: [{
435
+ code: 'a',
436
+ value: 'foo'
437
+ }]
438
+ }, {
439
+ tag: '773',
440
+ ind1: ' ',
441
+ ind2: ' ',
442
+ subfields: [{
443
+ code: '7',
444
+ value: 'nnas'
445
+ }, {
446
+ code: 'w',
447
+ value: '789101112'
448
+ }]
449
+ }]
450
+ });
451
+ const recordInvalid = new _marcRecord.MarcRecord({
452
+ leader: '63ab75afoo122myhgh',
453
+ fields: [{
454
+ tag: '001',
455
+ value: '123456'
456
+ }, {
457
+ tag: '245',
458
+ ind1: ' ',
459
+ ind2: ' ',
460
+ subfields: [{
461
+ code: 'a',
462
+ value: 'foo'
463
+ }]
464
+ }, {
465
+ tag: '773',
466
+ ind1: ' ',
467
+ ind2: ' ',
468
+ subfields: [{
469
+ code: '7',
470
+ value: 'nnas'
471
+ }, {
472
+ code: 'w',
473
+ value: '789101112'
474
+ }]
475
+ }]
476
+ });
477
+ it('Finds the record valid', async () => {
478
+ const validator = await (0, _fieldStructure.default)(config);
479
+ const result = await validator.validate(recordValid);
480
+ expect(result).to.eql({
481
+ valid: true
482
+ });
483
+ });
484
+ it('Finds the record invalid', async () => {
485
+ const validator = await (0, _fieldStructure.default)(config);
486
+ const result = await validator.validate(recordInvalid);
487
+ expect(result).to.eql({
488
+ valid: false
489
+ });
490
+ });
491
+ it('Find the record valid (Dependency on leader)', async () => {
492
+ const validator = await (0, _fieldStructure.default)([{
493
+ tag: /^007$/u,
494
+ dependencies: [{
495
+ leader: /^.{6}[at]/u
496
+ }]
497
+ }]);
498
+ const result = await validator.validate(new _marcRecord.MarcRecord({
499
+ leader: '00000ccm^a22003372i^4500',
500
+ fields: [{
501
+ tag: '001',
502
+ value: '123456'
503
+ }, {
504
+ tag: '245',
505
+ value: 'foobar'
506
+ }]
507
+ }));
508
+ expect(result).to.eql({
509
+ valid: true
510
+ });
511
+ });
512
+ it('Find the record invalid (Dependency on leader)', async () => {
513
+ const validator = await (0, _fieldStructure.default)([{
514
+ tag: /^007$/u,
515
+ dependencies: [{
516
+ leader: /^.{6}[at]/u
517
+ }]
518
+ }]);
519
+ const result = await validator.validate(new _marcRecord.MarcRecord({
520
+ leader: '00000cam^a22003372i^4500',
521
+ fields: [{
522
+ tag: '001',
523
+ value: '123456'
524
+ }, {
525
+ tag: '245',
526
+ value: 'foobar'
527
+ }]
528
+ }));
529
+ expect(result).to.eql({
530
+ valid: false
531
+ });
532
+ });
533
+ });
534
+ });
32
535
  //# sourceMappingURL=field-structure.spec.js.map